방문 페이지에서 헤더 메시지 구성
방문 페이지에서 인사말 텍스트의 일부인 헤더 메시지를 구성합니다. 예: 3월 21일 월요일까지 당직입니다.
시작하기 전에
필요한 역할: admin
이 태스크 정보
기본 방문 페이지의 표시 텍스트를 사용자 지정할 수 있지만, 방문 페이지의 사본을 생성해야만 텍스트의 시각적 스타일을 변경할 수 있습니다.
주:
의 SOW 배너에 있는 경보 알림은 전체 메시지를 표시하도록 자동으로 확장됩니다. 이 기능은 기본 시스템에서 기본적으로 사용됩니다. 전체 메시지를 자동으로 확장하여 표시하지 않으려면 auto_expand_now_alert_message 시스템 UX 페이지 속성을 false로 업데이트할 수 있습니다.
프로시저
- 다음으로 이동 모두 > 서비스 운영 작업 공간 관리자 센터 > 개요.
- 개요 탭의 초기 설정 섹션에서 방문 페이지 구성 옵션을 선택합니다.
-
방문 페이지 양식에서 인사말 옆에 있는 구성을 선택합니다.
내부적으로 SOWServiceDeskAgentShiftSNC를 호출하는 SOWServiceDeskAgentShift에 대해 스크립트 포함 양식이 표시됩니다.
-
SOWServiceDeskAgentShiftSNC의 스크립트 값을 복사합니다.
- 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
- 스크립트 포함 목록에서 SOWServiceDeskAgentShiftSNC를 엽니다.
- 스크립트 필드 값을 복사합니다.
-
SOWServiceDeskAgentShift 스크립트를 편집합니다.
- 다음으로 이동 모두 > 시스템 정의 > 스크립트 포함.
- 스크립트 포함 목록에서 SOWServiceDeskAgentShift를 엽니다.
-
SOWServiceDeskAgentShiftSNC에서 복사한 스크립트 필드 값을 붙여넣습니다.
initialize: function() { this.PLUGINS = { ON_CALL: "com.snc.on_call_rotation", SHIFT_PLANNING: "com.sn_shift_planning" }; this.DAYS_AHEAD = gs.getProperty('com.snc.on_call_rotation.upcoming_rota_days', 30); this.DATE_FORMAT = gs.getDateFormat(); this.TIME_FORMAT = gs.getTimeFormat(); this.WFO_SCHEMA_IDENTIFIER = 'readInTimezone'; this.WFO_ONCALL_TYPE_IDENTIFIER = 'oncallAPIReadInTimezone'; this.WEEK_DAY_FORMAT = 'EEEE'; this.FORMAT = { SERVICE_DESK_HEADER: 'SERVICE_DESK_HEADER' }; this.DATE_TIME_FORMAT_FULL = "full"; }, getUpcomingShift: function(userId, outputFormat, wfoShift) { var upcomingShifts, gd = new GlideDate(); var from = gd.getDisplayValueInternal(); gd.addDaysLocalTime(this.DAYS_AHEAD); var to = gd.getDisplayValueInternal(); var mayBeWFOUser = userId == gs.getUserID() ? gs.hasRole("sn_shift_planning.agent") : true; if (GlidePluginManager.isActive(this.PLUGINS.SHIFT_PLANNING) && mayBeWFOUser && wfoShift) upcomingShifts = this.getWFOShifts(from, to, userId); var isWFOResponseValid = Array.isArray(upcomingShifts) && upcomingShifts.length > 0; if (!isWFOResponseValid && GlidePluginManager.isActive(this.PLUGINS.ON_CALL)) upcomingShifts = this.getOnCallShifts(from, to, userId); return this.getFormattedShift(upcomingShifts, outputFormat); }, getWFOShifts: function(from, to, userId) { var smUtil = new sn_shift_planning.ScheduleManagerUtil(); var defaultEventCategories = [ smUtil.WORK_CATEGORY_SYS_ID, smUtil.ON_CALL_CATEGORY_SYS_ID ]; var params = { "assignmentGroups": "", "individualAgents": userId, "startDate": from, "endDate": to, "published": true, "eventCategories": defaultEventCategories, "filter": { "sn_shift_planning_agent_schedule": { "event": ["8d03fd9b0f310010717cc562ff767e4a", "936319993bd02010e81a4ee1f3efc419"] } } }; var upcomingShifts = []; try { var agentScheduleRESTAPIUtils = new sn_shift_planning.AgentScheduleRESTAPIUtils(); var spans = agentScheduleRESTAPIUtils.retrieveAgentSchedulesFromParams(params); if (spans && spans.shiftData && spans.shiftData.user && spans.shiftData.user.data && spans.shiftData.user.data.length > 0 && spans.shiftData.user.data[0].schedules) { var schedules = spans.shiftData.user.data[0].schedules, arrayUtil = new global.ArrayUtil(); for (var schedule in schedules) upcomingShifts = arrayUtil.union(upcomingShifts, schedules[schedule]); } } catch (e) { gs.error("SOWServiceDeskAgentShiftSNC: Error fetching WFO shifts"); } return upcomingShifts; }, getOnCallShifts: function(from, to, userId) { var onCallCommon = new global.OnCallCommon(); var onCallGroups = onCallCommon.getMyGroups(); var spans = new global.OCRotationV2(null, global.OCRotationV2.DEFAULT_FORMAT_OPTION).setStartDate(from).setEndDate(to).setUserIds(userId).setGroupIds(onCallGroups).getSpans(); var upcomingShifts = []; for (var i = 0; i < spans.length; i++) if ((spans[i].type == "roster" || spans[i].type == "override") && spans[i].user_id == userId) upcomingShifts.push(spans[i]); return upcomingShifts; }, getFormattedShift: function(upcomingShifts, outputFormat) { if (gs.nil(upcomingShifts)) return; switch (outputFormat) { case this.FORMAT.SERVICE_DESK_HEADER: return this.getServiceDeskFormattedShift(upcomingShifts); default: return upcomingShifts; } }, getServiceDeskFormattedShift: function(upcomingShifts) { var response = { shiftText: "", nearestShift: {} }; var startAttr = "start", endAttr = "end", isOnCall = true; var dateFormat = 'EEEE, MMM dd', timeFormat = 'hh:mm a'; var isWFOSchema = Array.isArray(upcomingShifts) && upcomingShifts.length > 0 && this.WFO_SCHEMA_IDENTIFIER in upcomingShifts[0]; if (isWFOSchema) startAttr = "scheduledStartTime", endAttr = "scheduledEndTime"; response.nearestShift = this.getNearestShift(upcomingShifts, startAttr, endAttr); if (response.nearestShift) { if (isWFOSchema) { if (response.nearestShift.schedule && !(this.WFO_ONCALL_TYPE_IDENTIFIER in response.nearestShift.schedule)) isOnCall = false; } if (isOnCall) { if (response.nearestShift.isCurrent) { if (response.nearestShift.roster_name) response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]); else response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); } else { if (response.nearestShift.roster_name) response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]); else response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); } } else { if (response.nearestShift.isCurrent) { response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); } else response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); } } return response; }, getNearestShift: function(upcomingShifts, startAttr, endAttr) { if (gs.nil(upcomingShifts) || gs.nil(startAttr) || gs.nil(endAttr)) return; var nearestShift; upcomingShifts.sort(function(shift_1, shift_2) { var gdt1 = new GlideDateTime(); gdt1.setDisplayValueInternal(shift_1[startAttr]); var gdt2 = new GlideDateTime(); gdt2.setDisplayValueInternal(shift_2[startAttr]); return GlideDateTime.subtract(gdt2, gdt1).getNumericValue(); }); var currentDateTime = new GlideDateTime(), startDateTime = new GlideDateTime(), endDateTime = new GlideDateTime(); for (var i = 0; i < upcomingShifts.length; i++) { startDateTime.setDisplayValueInternal(upcomingShifts[i][startAttr] + ""); endDateTime.setDisplayValueInternal(upcomingShifts[i][endAttr] + ""); if (currentDateTime.onOrBefore(endDateTime)) { nearestShift = upcomingShifts[i]; if (currentDateTime.onOrAfter(startDateTime)) nearestShift.isCurrent = true; else nearestShift.isCurrent = false; break; } } return nearestShift; }, getFormattedDateSpan: function(date, dateFormat, timeFormat) { var formattedDate = this.getFormattedDate(date, dateFormat); var dateAmPmTime = this.getFormattedTime(date, timeFormat); return formattedDate + " " + dateAmPmTime; }, getFormattedDate: function(inputDate, format) { var date = new GlideDateTime(); date.setDisplayValueInternal(inputDate); format = !format ? this.DATE_FORMAT : format; var gd = date.getLocalDate(); return gd.getByFormat(format); }, getFormattedTime: function(inputDate, format) { var date = new GlideDateTime(); date.setDisplayValueInternal(inputDate); format = !format ? this.TIME_FORMAT : format; var gt = date.getLocalTime(); return gt.getByFormat(format); }, getFormattedDateTime: function(date) { var dateTime = new GlideDateTime(); dateTime.setDisplayValueInternal(date); return dateTime.getDisplayValueLang(this.DATE_TIME_FORMAT_FULL); }, endsToday: function(inputDate) { var inputGdt = new GlideDateTime(); inputGdt.setDisplayValueInternal(inputDate); return new GlideDateTime().getLocalDate().getValue() == inputGdt.getLocalDate().getValue(); }, endingTomorrow: function(inputDate) { var inputGdt = new GlideDateTime(); inputGdt.setDisplayValueInternal(inputDate); var tomorrowDateTime = new GlideDateTime(); tomorrowDateTime.addDaysLocalTime(1); return tomorrowDateTime.getLocalDate().getValue() == inputGdt.getLocalDate().getValue(); }, -
설명한 대로 스크립트의 다음 부분을 편집합니다.
if (isOnCall) { if (response.nearestShift.isCurrent) { if (response.nearestShift.roster_name) response.shiftText = gs.getMessage("You are on-call until {0} as {1}", [this.getFormattedDateTime(response.nearestShift[endAttr]), response.nearestShift.roster_name]); else response.shiftText = gs.getMessage("You are on-call until {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); } else { if (response.nearestShift.roster_name) response.shiftText = gs.getMessage("Your next on-call shift starts on {0} as {1}", [this.getFormattedDateTime(response.nearestShift[startAttr]), response.nearestShift.roster_name]); else response.shiftText = gs.getMessage("Your next on-call shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); } } else { if (response.nearestShift.isCurrent) { response.shiftText = gs.getMessage("Your shift ends on {0}", [this.getFormattedDateTime(response.nearestShift[endAttr])]); } else response.shiftText = gs.getMessage("Your next shift starts on {0}", [this.getFormattedDateTime(response.nearestShift[startAttr])]); }
- 업데이트를 선택합니다.