<script custom-tag="" type="application/ld+json">{"@context":"https://schema.org","@type":"TechArticle","headline":"Fields are missing on OOB LE form","image":"http://support.servicenow.com/29f1d2661baf6010cafa53d8624bcb43.iix","author":{"name":"ServiceNow Support","url":"http://support.servicenow.com/now"},"keywords":"ServiceNow, NowSupport public Knowledge Base articles, Known Error,KB2952697,","wordcount":"34198","publisher":"ServiceNow","url":"https://support.servicenow.com/kb/kb?id=kb_article_view&sysparm_article=KB2952697","datePublished":"2026-04-13","dateCreated":"2026-04-13","dateModified":"2026-04-13","description":"<h2>Fields are missing on OOB LE form</h2><br/><div style=\"overflow-x:auto\"><h2>Description</h2><div><p>sn_hr_core_case_creation page, rich_description does not hold/contain html for rich description ","articleBody":"<h2>Fields are missing on OOB LE form</h2><br/><div style=\"overflow-x:auto\"><h2>Description</h2><div><p>sn_hr_core_case_creation page, rich_description does not hold/contain html for rich description formatting (eg. <br/ >)</p></div><h2>Steps to Reproduce</h2><div> <p></p><p>1. Create a database from hr-db-dump<br />2. Go to the list of journeys. Open the HR case for one of them<br />3. Notice that the Journey context isn't on the page. <br /><br />Expected: journey context should be on the page.</p></div><h2>Workaround</h2><div><p>Please apply the following fix on the ui page-3433fb86eb533200a9e7e26ac106fef2</p>\r\n<pre class=\"language-markup\"><code><?xml version="1.0" encoding="UTF-8"?><record_update table="sys_ui_page">\r\n <sys_ui_page action="INSERT_OR_UPDATE">\r\n <category/>\r\n <client_script><![CDATA[// Close the search_input select2 dropdown mask when clicking outside the iframe\r\nwindow.addEventListener('blur', function() {\r\n var searchInput = $j("#search_input");\r\n if (searchInput)\r\n searchInput.select2('close');\r\n});\r\n\r\n$j(document).ready(function() {\r\n angular.module('caseCreation', [\r\n 'sn.ngform',\r\n 'sn.list',\r\n 'sn.common.ui',\r\n 'sn.common'\r\n ]).config(function($httpProvider, $ariaProvider) {\r\n function removeInfoMessage(response) {\r\n if (!response.data || !response.data.result || !response.data.session || !response.data.session.notifications || !response.config || !response.config.url || response.config.url != "/api/sn_hr_core/case_creation/search")\r\n return response;\r\n\r\n // Don't show info messages on search\r\n var notifications = response.data.session.notifications;\r\n if (notifications && notifications.length)\r\n for (var i = notifications.length - 1; i > -1; i--)\r\n if (notifications[i].type == "info")\r\n notifications.splice(i, 1);\r\n\r\n return response;\r\n }\r\n\r\n // $httpProvider interceptors run in reverse for response\r\n $httpProvider.interceptors.push(function(snCustomEvent) {\r\n return {\r\n 'response': function(response) {\r\n return removeInfoMessage(response);\r\n }\r\n };\r\n });\r\n\r\n // Do not add role=button to ng-click\r\n $ariaProvider.config({\r\n bindRoleForClick: false\r\n });\r\n\r\n }).controller('NgCaseCreation', function($scope, $http, $timeout, $compile) {\r\n\r\n $scope.$applyAsync(function() {\r\n $j('#case_creation_container').find('.select2-choice').attr('aria-hidden', "true");\r\n });\r\n\r\n // TODO This token becomes invalid if user session expires\r\n // Manually set header to prevent authentication popup\r\n $http.defaults.headers.common["X-UserToken"] = g_ck;\r\n\r\n // TinyMCE configuration for HTML fields\r\n $scope.mceConfig = null;\r\n $scope.mceFields = [];\r\n\r\n var gaMCEConfig = new GlideAjax('HRServiceCreatorUtilAjax');\r\n gaMCEConfig.addParam('sysparm_name', 'getTinyMCEConfig');\r\n gaMCEConfig.getXML(function(res) {\r\n var mceConfig = res.responseXML.documentElement.getAttribute("answer");\r\n mceConfig = mceConfig.evalJSON(mceConfig);\r\n $scope.mceConfig = mceConfig;\r\n for (var i = 0; i < $scope.mceFields.length; i++)\r\n setupTinymceField($scope.mceFields[i], $scope.mceConfig);\r\n $scope.mceFields = [];\r\n });\r\n\r\n $scope.setupMCE = function(fieldId, fieldValue) {\r\n if ($scope.mceConfig) {\r\n $timeout(function() {\r\n var existingEditor = tinymce.get(fieldId);\r\n if (existingEditor)\r\n existingEditor.remove();\r\n setupTinymceField(fieldId, $scope.mceConfig);\r\n // Set editor content from field value after initialization\r\n if (fieldValue) {\r\n var newEditor = tinymce.get(fieldId);\r\n if (newEditor)\r\n newEditor.setContent(fieldValue);\r\n }\r\n });\r\n } else {\r\n if ($scope.mceFields.indexOf(fieldId) === -1)\r\n $scope.mceFields.push(fieldId);\r\n }\r\n };\r\n\r\n $scope.classes = {\r\n label: 'col-xs-12 col-md-3 col-lg-4 control-label ev-field-label',\r\n wideLabel: 'col-xs-12 col-md-1_5 col-lg-2 control-label ev-field-label',\r\n field: 'col-xs-10 col-sm-9 col-md-6 col-lg-5 form-field input_controls',\r\n wideField: 'col-xs-10 col-md-9 col-lg-8 form-field input_controls',\r\n addons: 'col-xs-2 col-sm-3 col-lg-2 form-field-addons',\r\n wideAddons: 'col-xs-2 col-md-1_5 col-lg-2 form-field-addons'\r\n };\r\n\r\n // TODO Prevent page timing service errors\r\n if (!window.NOW)\r\n window.NOW = {};\r\n window.NOW.PageTimingService = {\r\n send: function() {}\r\n };\r\n window.NOW.clientTiming = {\r\n pageInitTime: new Date()\r\n };\r\n if (!window.NOW.hasOwnProperty('ac_wait_time'))\r\n window.NOW.ac_wait_time = ac_wait_time || 250;\r\n\r\n $scope.profile = {};\r\n // Clear select2 on load in case of back button and browser cache\r\n if ($j("#search_input").val())\r\n $timeout(function() {\r\n $j("#search_input").select2("data", {});\r\n $j("#search_input").select2("data", null);\r\n });\r\n var userInit = JSON.parse(userObject);\r\n if (userInit && userInit.sys_id) {\r\n $timeout(function() {\r\n $j("#search_input").select2("data", userInit);\r\n });\r\n }\r\n\r\n var gwtMessageObj = new GwtMessage();\r\n\r\n $scope.coes = JSON.parse(coes);\r\n $scope.links = JSON.parse(links);\r\n $scope.serviceCategories = [];\r\n $scope.table = "";\r\n $scope.taskFields = JSON.parse(taskFields);\r\n $scope.collectionKey = collectionKey;\r\n $scope.collectionId = collectionId;\r\n $scope.universalReq = universalReq;\r\n $scope.missingService = true;\r\n $scope.showError = false;\r\n $scope.clearForm = true; //disables create case button\r\n $scope.isChildOfUR = false;\r\n $scope.clearSearchSelectionMsg = gwtMessageObj.getMessage('Clear {}'); // i18n message to clear selection for aria-label\r\n $scope.HTML_ENTITIES = {\r\n 'cent': '¢',\r\n 'pound': '£',\r\n 'yen': '¥',\r\n 'euro': '€',\r\n 'copy': '©',\r\n 'reg': '®',\r\n 'lt': '<',\r\n 'gt': '>',\r\n 'quot': '"',\r\n 'amp': '&',\r\n 'apos': '\\''\r\n };\r\n\r\n if (universalReq) {\r\n $scope.isChildOfUR = true;\r\n }\r\n\r\n // Add skip verification message to the form\r\n if (document.getElementById("skip_verification_container"))\r\n angular.element(document.getElementById("skip_verification_container")).append($compile(translatedMessage)($scope));\r\n\r\n // Confirm before leaving\r\n window.onbeforeunload = function() {\r\n if ($scope.creatingCase || !$j("#search_input").val() || $scope.allowNavigation) {\r\n $scope.allowNavigation = false;\r\n return;\r\n }\r\n\r\n $scope.allowNavigation = false;\r\n var message = '${gs.getMessage("Changes you made may not be saved.")}';\r\n if (window.event)\r\n window.event.returnValue = message;\r\n return message;\r\n };\r\n\r\n $scope.sanitize = function(text) {\r\n return $j("<div>").text(text).html();\r\n };\r\n\r\n $scope.unescapeHTML = function(body, htmlEntities) {\r\n return body.replace(/&([^;]+);/g, function(entity, entityCode) {\r\n var match;\r\n if (entityCode in htmlEntities) {\r\n return htmlEntities[entityCode];\r\n } else if (match = entityCode.match(/^#x([\\da-fA-F]+)$/)) {\r\n return String.fromCharCode(parseInt(match[1], 16));\r\n } else if (match = entityCode.match(/^#(\\d+)$/)) {\r\n return String.fromCharCode(~~match[1]);\r\n } else {\r\n return entity;\r\n }\r\n });\r\n },\r\n\r\n $scope.mailTo = function(emailAddress) {\r\n if (emailAddress) {\r\n $scope.allowNavigation = true;\r\n window.top.location = "mailto:" + emailAddress;\r\n }\r\n };\r\n\r\n $scope.addTooltips = function(selector) {\r\n $timeout(function() {\r\n $j(selector).each(function() {\r\n if (this.nodeName == "A" || this.offsetWidth < this.scrollWidth)\r\n $j(this).tooltip({\r\n container: 'body'\r\n }).hideFix();\r\n else\r\n $j(this).removeAttr("title");\r\n });\r\n });\r\n };\r\n\r\n $scope.showRefPopup = function(event, field) {\r\n if ($scope.displayOrderButton)\r\n $scope.displayOrderButton.popover('hide');\r\n\r\n var table, sys_id;\r\n if (field.internal_type == "glide_list") {\r\n if (field.highlightedOptions && field.highlightedOptions.length == 1) {\r\n table = field.reference;\r\n sys_id = field.highlightedOptions[0];\r\n }\r\n } else {\r\n // TODO these could be joined with ||'s\r\n if (field.ev_table && field.ev_sys_id) {\r\n table = field.ev_table;\r\n sys_id = field.ev_sys_id;\r\n } else {\r\n table = field.reference || field.table;\r\n sys_id = field.sys_id || field.value;\r\n }\r\n }\r\n\r\n if (!table || !sys_id)\r\n return;\r\n\r\n // Mimic GlidePopup.js popReferenceDiv without using data attributes\r\n event.preventDefault();\r\n // If we don't have a popover, don't propagate click to window or events are destroyed too early\r\n if (!$j(event.target).data("bs.popover"))\r\n event.stopPropagation();\r\n var options = {\r\n trapFocus: true,\r\n width: 0\r\n };\r\n var contentURL = new GlideURL("popup.do");\r\n contentURL.addParam("sysparm_sys_id", sys_id);\r\n contentURL.addParam("sysparm_table_name", table);\r\n contentURL.addParam("sysparm_field_name", "sys_id");\r\n contentURL.addParam("sysparm_view", "case_creation");\r\n contentURL.addParam("sysparm_popup_direct", "true");\r\n contentURL.addParam("sysparm_show_open_button", "true");\r\n contentURL.addParam("sysparm_glide_popup", "true");\r\n nowapi.g_popup_manager.showPopup(event, contentURL.getURL(), options);\r\n };\r\n\r\n $scope.getFieldId = function(field) {\r\n return "ev_field_" + field.column_name.replace(".", "_") + (field.disabled ? "_disabled" : "");\r\n };\r\n\r\n $scope.showFloorPlan = function(field) {\r\n if (fvwPluginActive) {\r\n var url = [\r\n '$ng_fvw.do?sysparm_stack=no',\r\n '&sysparm_campusSysId=' + field.campus_sys_id,\r\n '&sysparm_drawingId=' + field.external_building_id,\r\n '&sysparm_levelId=' + field.external_level_id,\r\n '&sysparm_spaceId=' + field.external_space_id\r\n ].join('');\r\n g_navigation.openPopup(url, 'facilities_map');\r\n }\r\n };\r\n\r\n $scope.openLink = function(link) {\r\n if (!link || !link.url)\r\n return;\r\n open(link.url);\r\n };\r\n\r\n var fieldCache = {};\r\n var getField = function(fieldName) {\r\n if (fieldName in fieldCache)\r\n return fieldCache[fieldName];\r\n\r\n for(var key in $scope.taskFields) {\r\n for(var i = 0; i < $scope.taskFields[key].length; i++) {\r\n if ($scope.taskFields[key][i].column_name == fieldName) {\r\n fieldCache[fieldName] = $scope.taskFields[key][i];\r\n return $scope.taskFields[key][i];\r\n }\r\n }\r\n }\r\n\r\n return {};\r\n };\r\n\r\n $scope.refOnChange = function(updatedField) {\r\n if ($scope.displayOrderButton)\r\n $scope.displayOrderButton.popover('hide');\r\n\r\n // Get ev_table and ev_sys_id to show profile in reference icon for Subject person and Opened for fields\r\n if (["subject_person", "opened_for"].indexOf(updatedField.column_name) > -1) {\r\n if (updatedField.ev_preset)\r\n updatedField.ev_preset = false;\r\n else {\r\n updatedField.ev_table = '';\r\n updatedField.ev_sys_id = '';\r\n updatedField.ev_tooltip = '';\r\n // Set priority if VIP User\r\n if (updatedField.value)\r\n $scope.checkVipUser();\r\n $http.post("/api/sn_hr_core/case_creation/get_employee_reference", {\r\n user: updatedField.value,\r\n column_label: updatedField.label\r\n }).then(function(response) {\r\n var employeeReference = response.data.result;\r\n for (var key in employeeReference)\r\n updatedField[key] = employeeReference[key];\r\n });\r\n }\r\n }\r\n\r\n if (updatedField.column_name === 'stage') {\r\n var displayOrderFieldObj = getField('display_order');\r\n displayOrderFieldObj.hidden = !updatedField.value;\r\n\r\n if (displayOrderFieldObj.hidden)\r\n return;\r\n\r\n $http.post('/api/sn_hr_core/hr_rest_api/get_display_order_info', {\r\n tabulate: true,\r\n activity_set_sys_id: updatedField.value,\r\n parent_sys_id: leParentSysId || '',\r\n short_description: '${gs.getMessage("Current case")}'\r\n }).then(function (response) {\r\n if (!response || !response.data || !response.data.result)\r\n return;\r\n\r\n var resObj = response.data.result;\r\n displayOrderFieldObj.display = resObj.expected_order || 100;\r\n $scope.showDisplayOrderButton = (resObj.activityRows && resObj.activityRows.length > 0);\r\n\r\n if ($scope.showDisplayOrderButton)\r\n $scope.initDisplayOrderPopover(resObj);\r\n });\r\n }\r\n\r\n // Update services based on subject person\r\n if (updatedField.column_name == "subject_person")\r\n $scope.updateServices(updatedField.value);\r\n\r\n $scope.updateLists();\r\n };\r\n\r\n // initialize display order popover\r\n $scope.initDisplayOrderPopover = function (res) {\r\n if ($scope.displayOrderButton)\r\n $scope.displayOrderButton.popover('destroy');\r\n\r\n $scope.popoverOptions = {\r\n animation: false, // will not refresh if true\r\n container: 'body',\r\n html: true,\r\n content: createTbodyContent(res),\r\n template: getPopoverCustomTemplate('display-order-popover'),\r\n title: res.heading\r\n };\r\n\r\n // ensure scroll compatibility\r\n if (document.querySelector('.section_header_content_no_scroll'))\r\n $scope.popoverOptions.container = '.section_header_content_no_scroll';\r\n\r\n setTimeout(function () {\r\n $scope.displayOrderButton = $j('#displayOrderButton');\r\n $scope.displayOrderButton.popover($scope.popoverOptions);\r\n $j('html')\r\n .on('click', function (event) {\r\n event.stopPropagation();\r\n if ($scope.displayOrderButton && event.target !== $scope.displayOrderButton[0])\r\n $scope.displayOrderButton.popover('hide');\r\n });\r\n\r\n $j(window)\r\n .on('resize', function (event) {\r\n $scope.displayOrderButton.popover('hide');\r\n });\r\n\r\n $j('.select2-container')\r\n .click(function (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n if ($scope.displayOrderButton)\r\n $scope.displayOrderButton.popover('hide');\r\n });\r\n });\r\n\r\n function getPopoverCustomTemplate(className) {\r\n return '<div class="popover glide-popup ' + className + '" role="tooltip">'\r\n + '<div class="arrow"></div>'\r\n + '<div class="popover-header popover-header-bar">'\r\n + '<h1 id="glide_popup_popover_title" class="popover-title display-order-title"></h1>'\r\n + '</div>'\r\n + '<div class="popover-content"></div></div>';\r\n }\r\n\r\n function createTbodyContent(res) {\r\n var displayOrder = 0;\r\n var displayOrderInc = 0;\r\n var trCount = 0;\r\n var popoverTable = document.createElement('table');\r\n popoverTable.id = "popoverTable";\r\n popoverTable.classList.add('table','list_table');\r\n\r\n $j(popoverTable)\r\n .on('click', function (event) {\r\n // disable popover from disappearing on click (stops it from reaching up to 'window' click)\r\n event.stopPropagation();\r\n });\r\n\r\n if (res) {\r\n createTableCells(res);\r\n return popoverTable;\r\n }\r\n\r\n function createTableCells (resultObj) {\r\n if (resultObj.headers) {\r\n var thead = document.createElement('thead');\r\n var theadTh = document.createElement('tr');\r\n resultObj.headers.forEach(function (header) {\r\n theadTh.appendChild(createCell(header, 'th'));\r\n });\r\n thead.appendChild(theadTh);\r\n popoverTable.appendChild(thead);\r\n }\r\n\r\n if (resultObj.activityRows) {\r\n $scope.popoverTableTbody = document.createElement('tbody');\r\n resultObj.activityRows.forEach(createTdCells);\r\n popoverTable.appendChild($scope.popoverTableTbody);\r\n }\r\n\r\n function createTdCells (columnData) {\r\n var tbodyTr = document.createElement('tr');\r\n\r\n if (trCount % 2 === 0)\r\n tbodyTr.classList.add('list_even');\r\n\r\n if (columnData[3] && columnData[3] === 'newAdhoc') {\r\n columnData[1] = formatNumber(resultObj.expected_order);\r\n tbodyTr.classList.add('current-task');\r\n }\r\n\r\n if (columnData[3] !== undefined)\r\n tbodyTr.classList.add('current-task');\r\n\r\n columnData.forEach(function (content, index) {\r\n if (index < 3) // exclude adhoc flags\r\n tbodyTr.appendChild(createCell(content, 'td'));\r\n });\r\n\r\n $scope.popoverTableTbody.appendChild(tbodyTr);\r\n trCount++;\r\n }\r\n\r\n function createCell (text, dom) {\r\n var cell = document.createElement(dom);\r\n cell.textContent = text;\r\n return cell;\r\n }\r\n }\r\n }\r\n };\r\n\r\n // updates the position in the display order popover table\r\n $scope.updateDisplayOrderPosition = function(updatedField) {\r\n if (updatedField.display === '')\r\n return;\r\n\r\n var skip = false;\r\n var currentTaskTr = $scope.popoverTableTbody.querySelector('.current-task');\r\n var currentTaskValue = Number(updatedField.value || 0);\r\n var adhocStatus = currentTaskTr.querySelector('td:last-child').textContent;\r\n\r\n if (currentTaskTr)\r\n currentTaskTr.remove();\r\n\r\n currentTaskTr = createCurrentTaskTr();\r\n\r\n var contentTableTbodyTr = $scope.popoverTableTbody.querySelectorAll('tr');\r\n\r\n if (currentTaskValue >= getDisplayOrder(contentTableTbodyTr[contentTableTbodyTr.length - 1]))\r\n $scope.popoverTableTbody.appendChild(currentTaskTr);\r\n else\r\n contentTableTbodyTr.forEach(checkListAndInsertCurrentTask);\r\n\r\n $scope.popoverTableTbody.querySelectorAll('tr').forEach(updateZebraStyle);\r\n\r\n function checkListAndInsertCurrentTask (tr, index, arr) {\r\n if (!skip && currentTaskValue < getDisplayOrder(tr)) {\r\n $scope.popoverTableTbody.insertBefore(currentTaskTr, tr);\r\n skip = true;\r\n }\r\n }\r\n\r\n // ph- prefix notes 'placeholder'\r\n function createCurrentTaskTr () {\r\n var phTr = document.createElement('tr');\r\n phTr.classList.add('current-task');\r\n phTr.innerHTML = '<td>${gs.getMessage("Current case")}</td><td>' + updatedField.display + '</td><td>' + adhocStatus + '</td>';\r\n return phTr;\r\n }\r\n\r\n function getDisplayOrder (elem) {\r\n return Number(formatClean(elem.querySelector('td:nth-child(2n)').textContent) || 0);\r\n }\r\n\r\n function updateZebraStyle (tr, index) {\r\n // it would be easier to use css, but should use default heisenberg class name\r\n tr.classList.remove('list_even');\r\n if (index % 2 === 0)\r\n tr.classList.add('list_even');\r\n }\r\n };\r\n\r\n $scope.checkVipUser = function() {\r\n // Create map of field column names to field\r\n var fieldMap = {};\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n fieldMap[field.column_name] = field;\r\n }\r\n\r\n if (fieldMap.hasOwnProperty("priority")) {\r\n var userArray = [];\r\n if (fieldMap.hasOwnProperty("opened_for") && fieldMap["opened_for"].value)\r\n userArray.push(fieldMap["opened_for"].value);\r\n if (fieldMap.hasOwnProperty("subject_person") && fieldMap["subject_person"].value)\r\n userArray.push(fieldMap["subject_person"].value);\r\n if (userArray.length)\r\n $http.post("/api/sn_hr_core/case_creation/contains_vip_user", {\r\n userArr: userArray\r\n }).then(function(response) {\r\n if (response.data.result) {\r\n fieldMap["priority"].value = vipPriority;\r\n $timeout(function() {\r\n $j("#ev_case #" + $scope.getFieldId(fieldMap["priority"])).trigger('change');\r\n });\r\n }\r\n });\r\n }\r\n };\r\n\r\n $scope.updateServices = function(userId) {\r\n $http.post("/api/sn_hr_core/case_creation/services_for_user", {\r\n user: userId\r\n }).then(function(response) {\r\n $timeout(function() {\r\n $scope.serviceCategories = response.data.result;\r\n var currentService = $j("#service_input").val();\r\n if (!currentService)\r\n return;\r\n var found = false;\r\n for (var i = 0; i < $scope.serviceCategories.length; i++) {\r\n var children = $scope.serviceCategories[i].children;\r\n for (var j = 0; j < children.length; j++) {\r\n if (children[j].sys_id == currentService) {\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (found)\r\n break;\r\n }\r\n if (!found)\r\n $j("#service_input").select2("data", null);\r\n });\r\n });\r\n };\r\n\r\n // TODO Update this logic when related lists are configurable\r\n $scope.updateLists = function() {\r\n var fieldMap = {}; // mapping from column_name to value\r\n var fieldMapObj = {}; // mapping from column_name to field obj\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n fieldMap[field.column_name] = field.value;\r\n fieldMapObj[field.column_name] = field;\r\n }\r\n\r\n for (var j = 0; j < $scope.relatedLists.length; j++) {\r\n var queryField = $scope.relatedLists[j].queryField;\r\n var fieldNotOnForm = queryField && !fieldMap.hasOwnProperty(queryField);\r\n\r\n // Hide related lists for fields not on form, or for subject_person if same as opened_for\r\n if (fieldNotOnForm || (queryField == "subject_person" && fieldMap.hasOwnProperty("opened_for") && (fieldMap["opened_for"] == fieldMap["subject_person"] || !fieldMap["subject_person"])))\r\n $scope.relatedLists[j].hide = true;\r\n else {\r\n $scope.relatedLists[j].hide = false;\r\n // Make this related list "active" if none are active\r\n for (var m = 0; m < $scope.relatedLists.length; m++) {\r\n if ($scope.relatedLists[m].active && !$scope.relatedLists[m].hide)\r\n break;\r\n else if (m == $scope.relatedLists.length - 1)\r\n $scope.relatedLists[j].active = true;\r\n }\r\n }\r\n\r\n // Select another related list if hiding the selected related list\r\n if ($scope.relatedLists[j].hide && $scope.relatedLists[j].active) {\r\n $scope.relatedLists[j].active = false;\r\n for (var k = 0; k < $scope.relatedLists.length; k++) {\r\n var rList = $scope.relatedLists[k];\r\n if (!rList.hide) {\r\n rList.active = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n // Don't update hidden related lists\r\n if ($scope.relatedLists[j].hide)\r\n continue;\r\n\r\n // Update related list if the query has changed\r\n var query;\r\n if (fieldMap[queryField])\r\n query = "opened_for=" + fieldMap[queryField] + "^ORsubject_person=" + fieldMap[queryField];\r\n else\r\n query = "sys_id=null";\r\n if ($scope.relatedLists[j].parameters.sysparm_fixed_query != query) {\r\n $scope.relatedLists[j].parameters.sysparm_fixed_query = query;\r\n // update label with user's name\r\n var gwtMessageObj = new GwtMessage();\r\n var message = gwtMessageObj.getMessage("Cases for {0}", fieldMap[queryField] ? fieldMapObj[queryField].displayValue : "Opened for");\r\n $scope.relatedLists[j].properties.displayLabel = $scope.sanitize(message);\r\n var elementId = $scope.relatedLists[j].properties.listId;\r\n if (elementId)\r\n $scope.updateList(elementId);\r\n }\r\n }\r\n\r\n // run script to fix select2 for WCAG spec - need to add wait for rendering time\r\n $timeout($scope.addAriaLabelToSelect2ClearIcon, 300);\r\n };\r\n\r\n $scope.updateList = function(elementId) {\r\n $timeout(function() {\r\n var curEle = angular.element(document.getElementById(elementId));\r\n if (curEle && curEle.scope() && curEle.scope().updateList)\r\n curEle.scope().updateList();\r\n });\r\n };\r\n\r\n $scope.skipVerification = function() {\r\n if ($scope.creatingCase)\r\n return;\r\n\r\n // Set opened_for and subject_person to not mandatory\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n if ((field.column_name == "opened_for" || field.column_name == "subject_person") && field.mandatory)\r\n field.mandatory = false;\r\n }\r\n $scope.skippedVerification = true;\r\n $scope.clearForm = false; // Enable Create Case button\r\n $scope.updateServices();\r\n $scope.showOrHideCaseDetails();\r\n };\r\n\r\n $scope.createCase = function() {\r\n $scope.creatingCase = true;\r\n\r\n // Create an object of fields to set when creating a task\r\n var fields = {};\r\n var missingMandatoryFields = [];\r\n\t\t\tvar errorFields = [];\r\n\r\n if (conversation)\r\n fields['contact_type'] = {\r\n value: 'chat'\r\n };\r\n if ($scope.collectionKey)\r\n fields[$scope.collectionKey] = {\r\n value: $scope.collectionId\r\n };\r\n\r\n // Sync TinyMCE content to field values before submission\r\n if (typeof tinymce !== 'undefined')\r\n tinymce.triggerSave();\r\n for (var fl in $scope.taskFields)\r\n for (var j = 0; j < $scope.taskFields[fl].length; j++) {\r\n var htmlField = $scope.taskFields[fl][j];\r\n if (htmlField.internal_type === 'html' || htmlField.internal_type === 'translated_html') {\r\n var editor = tinymce.get($scope.getFieldId(htmlField));\r\n if (editor)\r\n htmlField.value = editor.getContent();\r\n }\r\n }\r\n\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n var fieldObj = {};\r\n // TODO Test with setting string/number (fields where ng-model is field.display) from template and changing display to see what sets\r\n fieldObj.value = field.value || field.display;\r\n\r\n //check mandatory field value\r\n if (field.mandatory && (field.value.toString() == '')) {\r\n missingMandatoryFields.push(field.label);\r\n errorFields.push(field);\r\n }\r\n fieldObj.setAsDisplayValue = field.setAsDisplayValue || false;\r\n\r\n if (field.column_name == "opened_for" && !field.value && $scope.skippedVerification)\r\n continue;\r\n\r\n fields[field.column_name] = fieldObj;\r\n }\r\n // TODO Could HR Service be an input field with hardcoding? or bleh\r\n fields["hr_service"] = {\r\n value: $j("#service_input").val()\r\n };\r\n\r\n if ($scope.universalReq) {\r\n fields["universal_request"] = {\r\n value: $scope.universalReq\r\n };\r\n fields["state"] = {\r\n value: '10'\r\n };\r\n }\r\n // Get the table name of the service, if available\r\n var tableName;\r\n var serviceData = $j("#service_input").select2('data');\r\n if (serviceData)\r\n tableName = serviceData.coe;\r\n tableName = tableName || $j("#coe_input").val() || taskCreateTable;\r\n\r\n //show error message for missing mandatory fields\r\n if ($scope.missingService || (missingMandatoryFields.length > 0)) {\r\n if ($scope.missingService)\r\n missingMandatoryFields.push(gwtMessageObj.getMessage("HR service"));\r\n $scope.toggleErrorMessage(true, missingMandatoryFields);\r\n $scope.focusErrorField(errorFields);\r\n $scope.creatingCase = false;\r\n } else {\r\n $http.post("/api/sn_hr_core/case_creation/create_task", {\r\n table: tableName,\r\n fields: fields\r\n }).then(function(response) {\r\n if (response.data.result.hasOwnProperty('table') && response.data.result.hasOwnProperty('sys_id')) {\r\n // TODO Should conversation event fire if provided user has changed since page load?\r\n // TODO Firing event triggers page redirect in addition to g_navigation.openRecord, switch to else and update connect action for url stack?\r\n if (conversation)\r\n CustomEventManager.fireTop("connect:set_document", {\r\n conversation: conversation,\r\n table: response.data.result.table,\r\n document: response.data.result.sys_id\r\n });\r\n g_navigation.openRecord(response.data.result.table, response.data.result.sys_id);\r\n\r\n } else if (response.data.result.can_read === false)\r\n $timeout(function() {\r\n g_navigation.reloadWindow();\r\n }, 4000);\r\n else\r\n $scope.creatingCase = false;\r\n });\r\n }\r\n };\r\n\r\n $scope.focusErrorField = function(errorFields) {\r\n if ($scope.missingService)\r\n $j("#service_input").select2('focus');\r\n for (var i=0; i<errorFields.length; i++) {\r\n if (errorFields[i].internal_type == 'reference') \r\n $j("#ev_field_" + errorFields[i].column_name).select2('focus');\r\n else\r\n $j("#ev_field_" + errorFields[i].column_name).focus();\r\n }\r\n };\r\n\r\n $scope.toggleErrorMessage = function(showMessage, missingFields) {\r\n if (showMessage && missingFields.length > 0) {\r\n var missingFieldsString = missingFields.join(', ');\r\n $scope.errorMessage = gwtMessageObj.getMessage("The following mandatory fields are not filled in: {0}", missingFieldsString);\r\n } else\r\n $scope.errorMessage = '';\r\n\r\n $scope.showError = showMessage;\r\n };\r\n\r\n /* Method for fixing Select2 clear button\r\n * @PARAM - evt (object): select2 'change' event object\r\n */\r\n $scope.addAriaLabelToSelect2ClearIcon = function (evt) {\t\t\r\n // if method is being called via select2\r\n if (evt)\r\n fixSelect2AriaLabelForWcag(evt.target);\r\n // if method is being called via $scope.updateLists (for ev_ fields)\r\n else {\r\n if (document.getElementById('ev_field_opened_for'))\r\n fixSelect2AriaLabelForWcag(document.getElementById('ev_field_opened_for'));\r\n if (document.getElementById('ev_field_subject_person'))\r\n fixSelect2AriaLabelForWcag(document.getElementById('ev_field_subject_person'));\r\n }\r\n\r\n // main private method to remove node from parent <a> to ensure proper navigation via VoiceOver (ctl + option + arrow keys)\r\n function fixSelect2AriaLabelForWcag (el) {\r\n if (!el)\r\n return;\r\n\r\n // get the title to use as aria-label. "search for employee" does not have label, so need to fetch h2 textContent\r\n var labelForCloseIcon = el.parentNode.parentNode.querySelector('span[title]') || document.querySelector('.ev-section-header');\r\n // this is the element node where the clear button will be added to\r\n var elemSibling = el.previousSibling;\r\n // this is the parent node for clear button\r\n var elemSiblingAnchor = el.previousSibling.querySelector('a');\r\n // close button\r\n var select2CloseIcon = elemSibling.querySelector('.select2-search-choice-close');\r\n // add the aria-label to close button\r\n select2CloseIcon.setAttribute('aria-label', $scope.clearSearchSelectionMsg.replace('{}', labelForCloseIcon.textContent));\r\n // need to manually add event listener to clear select2 when clicked\r\n select2CloseIcon.addEventListener('click', function () {\r\n $j(el).select2('val', '').trigger('change');\r\n $scope.showOrHideCaseDetails();\r\n });\r\n }\r\n\r\n // Call at the end in case the fixSelect2AriaLabelForWcag method is not called.\r\n $scope.showOrHideCaseDetails();\r\n };\r\n\r\n $scope.showOrHideCaseDetails = function() {\r\n //show or hide Case Details section\r\n if($scope.skippedVerification || $scope.profile.sys_id)\r\n document.getElementById('section-ev_case').style.display = "block";\r\n else \r\n document.getElementById('section-ev_case').style.display = "none";\r\n };\r\n\r\n // Select2 setup\r\n $j("#search_input").select2({\r\n //override the defaults\r\n formatNoMatches: function() {\r\n return "${gs.getMessage('No matches found')}";\r\n },\r\n formatSearching: function() {\r\n return "${gs.getMessage('Searching..')}";\r\n },\r\n formatAjaxError: function() {\r\n return "${gs.getMessage('The results could not be loaded')}";\r\n },\r\n formatLoadMore: function() {\r\n return "${gs.getMessage('Loading more results...')}";\r\n },\r\n formatInputTooShort: function(args) {\r\n var SELECT2_MINIMUM_CHAR_INPUT = minimumInputLength;\r\n var remainingChars = SELECT2_MINIMUM_CHAR_INPUT;\r\n if (args.length)\r\n remainingChars -= args.length;\r\n var gwtMessageObj = new GwtMessage();\r\n var message = gwtMessageObj.getMessage('Please enter {0} or more characters', remainingChars);\r\n return message;\r\n },\r\n allowClear: true,\r\n ajax: {\r\n quietMillis: ac_wait_time,\r\n // Specify a data property passed to transport function via 'params'\r\n data: function(searchTerm, page) {\r\n // TODO scrolling fast can result in same page being requested multiple times\r\n if (page > 1) // TODO IS this needed to handle multiple searches going out before returning?\r\n $scope.table = "";\r\n return {\r\n q: searchTerm,\r\n page: page - 1,\r\n table: (page > 1) ? $scope.table : ""\r\n };\r\n },\r\n // Specify how to call server\r\n transport: function(params) {\r\n return $http.post("/api/sn_hr_core/case_creation/search", params.data).then(function(response) {\r\n params.success.apply(this, [response]);\r\n });\r\n },\r\n // Specify how data returned should be processed.\r\n results: function(response, page) {\r\n var responseResult = response.data.result.list;\r\n var total = response.data.result.total;\r\n $scope.table = response.data.result.table;\r\n var results = [];\r\n\r\n // Show counts in between result sets if paginating\r\n if (total > pageSize) {\r\n var start = (page - 1) * pageSize + 1;\r\n var end = Math.min((page * pageSize), total);\r\n results.push({\r\n disabled: true,\r\n start: start,\r\n end: end,\r\n total: total,\r\n hiddenResultCount: end - start + 1 - responseResult.length\r\n });\r\n }\r\n\r\n // Add items to search results\r\n for (var i = 0; i < responseResult.length; i++) {\r\n var result = {};\r\n var item = responseResult[i];\r\n\r\n if (item.hasOwnProperty('users')) {\r\n results.push({\r\n display: $scope.sanitize(item.display),\r\n disabled: true\r\n });\r\n for (var j = 0; j < item.users.length; j++)\r\n results.push(item.users[j]);\r\n } else\r\n results.push(item);\r\n }\r\n\r\n return {\r\n results: results,\r\n more: ((page * pageSize) < total)\r\n };\r\n }\r\n },\r\n // Specify how selected option looks\r\n formatSelection: function(item) {\r\n var subjectPersonFieldOnForm = false;\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n if (field.internal_type == "reference" && ['opened_for', 'subject_person'].indexOf(field.column_name) > -1) {\r\n if (field.column_name == 'subject_person')\r\n subjectPersonFieldOnForm = true;\r\n field.value = item.sys_id;\r\n field.displayValue = item.display;\r\n field.ev_table = item.ev_table;\r\n field.ev_sys_id = item.ev_sys_id;\r\n field.ev_tooltip = item.tooltip;\r\n field.ev_preset = true;\r\n $scope.refOnChange(field);\r\n }\r\n }\r\n\r\n // Set priority for VIP user\r\n $scope.checkVipUser();\r\n\r\n // Manually get services if subject_person isn't on the form\r\n if (!subjectPersonFieldOnForm)\r\n $scope.updateServices();\r\n $scope.updateLists();\r\n\r\n // Get links for selected user\r\n if (item.ev_sys_id && item.ev_table)\r\n $http.post("/api/sn_hr_core/case_creation/links_for_user", {\r\n links: $scope.links,\r\n tableName: item.ev_table,\r\n profile: item.ev_sys_id\r\n }).then(function(response) {\r\n // TODO Verify profile is still same user as links were requested for\r\n if ($scope.profile.sys_id) {\r\n $scope.profile.links = response.data.result;\r\n $scope.addTooltips(".deep-link");\r\n }\r\n });\r\n\r\n // Set profile to selected user\r\n $timeout(function() {\r\n $scope.profile = angular.copy(item);\r\n });\r\n\r\n var optionDisplay = "<div class='search-display ev-option row'><div class='col-xs-6 text-ellipsis' title='" + $scope.sanitize(item.display) + " " + $scope.sanitize('(${gs.getMessage("Inactive")})') + "'>" + $scope.sanitize(item.display);\r\n\r\n if (item.hasOwnProperty("active") && item.active !== "true")\r\n optionDisplay += '<span class="ev-option-span ev-option-display-prefix text-ellipsis"> ' + $scope.sanitize('(${gs.getMessage("Inactive")})') + '</span>';\r\n\r\n optionDisplay += "</div>";\r\n\r\n if (item.hasOwnProperty("additional_display_fields")) {\r\n var additionalDisplay = $scope.sanitize(item.additional_display_fields.filter(function(ele) {\r\n return !!ele;\r\n }).join(" - "));\r\n optionDisplay += "<div class='col-xs-6 ev-option-additional-display-fields text-ellipsis' style='text-align:right; padding-right:3.4rem;' title='" + additionalDisplay + "'>" + additionalDisplay + "</div>";\r\n }\r\n optionDisplay += "</div>";\r\n\r\n $scope.addTooltips(".search-display div.text-ellipsis");\r\n\r\n $scope.clearForm = false; //enable create case button\r\n return optionDisplay;\r\n },\r\n // Specify how each option looks in dropdown menu\r\n formatResult: function(item) {\r\n if (item.hasOwnProperty("sys_id") && item.hasOwnProperty("display") && item.display) {\r\n var optionDisplay = "<div class='ev-option row'><div class='col-xs-6 text-ellipsis'>" + $scope.sanitize(item.display);\r\n\r\n if (item.hasOwnProperty("active") && item.active !== "true")\r\n optionDisplay += '<span class="ev-option-span ev-option-display-prefix text-ellipsis"> ' + $scope.sanitize('(${gs.getMessage("Inactive")})') + '</span>';\r\n\r\n if (item.hasOwnProperty("display_suffix") && item.display_suffix)\r\n optionDisplay += "<span class='ev-option-span ev-option-display-prefix text-ellipsis'> - " + $scope.sanitize(item.display_suffix.join(", ")) + "</span>";\r\n\r\n optionDisplay += "</div>";\r\n\r\n // TODO Two empty columns leave an empty 1px div\r\n // TODO Better handle missing values, eg. when to hide vs reserve space\r\n if (item.hasOwnProperty("additional_display_fields"))\r\n for (var j = 0; j < item.additional_display_fields.length; j++)\r\n optionDisplay += "<div class='col-xs-6 ev-option-additional-display-fields text-ellipsis'" + ((j % 2) ? 'style="clear:both;"' : " style='text-align:right;'") + ">" +"&nbsp;"+ $scope.sanitize(item.additional_display_fields[j]) +"&nbsp;"+"</div>";\r\n\r\n return optionDisplay;\r\n }\r\n\r\n if (item.hasOwnProperty("disabled") && item.disabled) {\r\n if (item.hasOwnProperty("display"))\r\n return $scope.sanitize(item.display);\r\n else {\r\n var gwt = new GwtMessage();\r\n var pageHeader = "<div style='text-align:center;'>";\r\n if (item.hiddenResultCount > 1)\r\n pageHeader += $scope.sanitize(gwt.getMessage("{0} to {1} of {2} ({3} results removed by security constraints)", item.start, item.end, item.total, item.hiddenResultCount));\r\n else if (item.hiddenResultCount == 1)\r\n pageHeader += $scope.sanitize(gwt.getMessage("{0} to {1} of {2} ({3} result removed by security constraints)", item.start, item.end, item.total, item.hiddenResultCount));\r\n else\r\n pageHeader += $scope.sanitize(gwt.getMessage("{0} to {1} of {2}", item.start, item.end, item.total));\r\n pageHeader += "</div>";\r\n return pageHeader;\r\n }\r\n }\r\n },\r\n id: function(item) {\r\n return item.sys_id;\r\n },\r\n maximumInputLength: 100,\r\n minimumInputLength: minimumInputLength,\r\n placeholder: getMessage("Search for employee or case number")\r\n }).on("select2-clearing", function() {\r\n $timeout(function() {\r\n lockPopup();\r\n $scope.profile = {};\r\n $scope.serviceCategories = [];\r\n $scope.clearForm = true; //disable create case button\r\n $scope.toggleErrorMessage(false, null); //and hide the error message\r\n $scope.showOrHideCaseDetails();\r\n });\r\n }).on('change', $scope.addAriaLabelToSelect2ClearIcon);\r\n\r\n var gwtMsg = new GwtMessage();\r\n var ariaLabel = gwtMsg.getMessage('Please enter {0} or more characters', minimumInputLength);\r\n $j('#select2-results-1').parent().attr('aria-label', ariaLabel);\r\n\r\n // Service input select2\r\n var localPageSize = 50;\r\n $j("#service_input").select2({\r\n //override the defaults\r\n formatNoMatches: function() {\r\n return "${gs.getMessage('No matches found')}";\r\n },\r\n formatSearching: function() {\r\n return "${gs.getMessage('Searching..')}";\r\n },\r\n formatAjaxError: function() {\r\n return "${gs.getMessage('The results could not be loaded')}";\r\n },\r\n formatLoadMore: function() {\r\n return "${gs.getMessage('Loading more results...')}";\r\n },\r\n formatInputTooShort: function(args) {\r\n var SELECT2_MINIMUM_CHAR_INPUT = 3;\r\n var remainingChars = SELECT2_MINIMUM_CHAR_INPUT;\r\n if (args.length)\r\n remainingChars -= args.length;\r\n var gwtMessageObj = new GwtMessage();\r\n var message = gwtMessageObj.getMessage('Please enter {0} or more characters', remainingChars);\r\n return message;\r\n },\r\n // Use AJAX functions for local pagination\r\n allowClear: true,\r\n ajax: {\r\n quietMillis: ac_wait_time,\r\n data: function(searchTerm, page, context) {\r\n return {\r\n term: searchTerm,\r\n page: page - 1,\r\n context: context\r\n };\r\n },\r\n transport: function(response) {\r\n var q = response.data;\r\n var context = q.context;\r\n var newContext = '';\r\n var results = [];\r\n var total = -1;\r\n var start = q.page * localPageSize;\r\n var end = (q.page + 1) * localPageSize;\r\n var coe = $j("#coe_input").val();\r\n\r\n for (var i = 0; i < $scope.serviceCategories.length; i++) {\r\n if (coe && $scope.serviceCategories[i].coe != coe)\r\n continue;\r\n var children = $scope.serviceCategories[i].children.filter(function(opt) {\r\n var matched = !q.term || opt.display.toLowerCase().indexOf(q.term.toLowerCase()) >= 0 || (opt.parent && opt.parent.toLowerCase().indexOf(q.term.toLowerCase()) >= 0);\r\n if (matched) {\r\n total++;\r\n\r\n // Check if option is within page bounds, or if part of last topic category that was within bounds (to prevent duplicate opt groups in pagination)\r\n if (total >= start && total < end || (total >= end && newContext == $scope.serviceCategories[i].sys_id)) {\r\n newContext = $scope.serviceCategories[i].sys_id;\r\n // Skip service as it was was added in a previous page\r\n if ($scope.serviceCategories[i].sys_id === context)\r\n return false;\r\n return matched;\r\n }\r\n }\r\n return false;\r\n });\r\n\r\n if (children.length > 0) {\r\n results.push({\r\n display: $scope.serviceCategories[i].display,\r\n children: children\r\n });\r\n }\r\n }\r\n\r\n response.success.apply(this, [{\r\n results: results,\r\n more: total > end,\r\n context: newContext\r\n }]);\r\n\r\n return true;\r\n },\r\n // Specify how data returned should be processed.\r\n results: function(response, page) {\r\n return response;\r\n }\r\n },\r\n formatSelection: function(item) {\r\n $scope.missingService = !item || !item.sys_id;\r\n\r\n var fieldMap = {};\r\n var choiceFields = [];\r\n for (var fieldList in $scope.taskFields)\r\n for (var j = 0; j < $scope.taskFields[fieldList].length; j++) {\r\n var field = $scope.taskFields[fieldList][j];\r\n fieldMap[field.column_name] = field;\r\n if (field.hasOwnProperty("choiceList"))\r\n choiceFields.push(field.column_name);\r\n }\r\n\r\n // List of users to check for VIP status\r\n var userArray = [];\r\n if (fieldMap.hasOwnProperty("opened_for") && fieldMap["opened_for"].value)\r\n userArray.push(fieldMap["opened_for"].value);\r\n if (fieldMap.hasOwnProperty("subject_person") && fieldMap["subject_person"].value)\r\n userArray.push(fieldMap["subject_person"].value);\r\n\r\n // Set COE based on service\r\n if (item.coe) {\r\n for (var k = 0; k < $scope.coes.length; k++) {\r\n if ($scope.coes[k].table == item.coe) {\r\n $j("#coe_input").select2("data", {\r\n display: $scope.coes[k].display,\r\n table: item.coe\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n $scope.fetchingFields = true;\r\n // Changes from selected service, eg. template fields and updated choice options\r\n $http.post("/api/sn_hr_core/case_creation/service_selected", {\r\n template: item.template,\r\n service: item.sys_id,\r\n table: taskCreateTable,\r\n choiceFields: choiceFields,\r\n userArr: userArray,\r\n leParentSysId: leParentSysId || ''\r\n }).then(function(response) {\r\n var fields = response.data.result.fields; // Choice fields\r\n var templateData = response.data.result.templateData;\r\n var taskFields = response.data.result.taskFields;\r\n var choiceFieldSelectors = [];\r\n\r\n // Sync TinyMCE content before copying previous values\r\n if (typeof tinymce !== 'undefined')\r\n tinymce.triggerSave();\r\n for (var syncList in $scope.taskFields)\r\n for (var si = 0; si < $scope.taskFields[syncList].length; si++) {\r\n var syncField = $scope.taskFields[syncList][si];\r\n if (syncField.internal_type === 'html' || syncField.internal_type === 'translated_html') {\r\n var syncEditor = tinymce.get($scope.getFieldId(syncField));\r\n if (syncEditor)\r\n syncField.value = syncEditor.getContent();\r\n }\r\n }\r\n\r\n // Prepare map of previous fields and current fields\r\n var previousFields = {};\r\n for (var previousFieldsList in $scope.taskFields)\r\n for (var j = 0; j < $scope.taskFields[previousFieldsList].length; j++)\r\n previousFields[$scope.taskFields[previousFieldsList][j].column_name] = $scope.taskFields[previousFieldsList][j];\r\n\r\n var nextFields = {};\r\n for (var nextFieldsList in taskFields)\r\n for (var k = 0; k < taskFields[nextFieldsList].length; k++)\r\n nextFields[taskFields[nextFieldsList][k].column_name] = taskFields[nextFieldsList][k];\r\n\r\n // Copy previous values to next values when shared\r\n for (var fieldKey in nextFields)\r\n if (previousFields.hasOwnProperty(fieldKey) &&\r\n previousFields[fieldKey].internal_type == nextFields[fieldKey].internal_type &&\r\n previousFields[fieldKey].reference == nextFields[fieldKey].reference) {\r\n\r\n var prevField = previousFields[fieldKey];\r\n if (["glide_date_time", "glide_date"].indexOf(prevField.internal_type) > -1)\r\n $j("#" + $scope.getFieldId(prevField)).trigger("change"); // Workaround for fields set by datepicker not triggering a model update\r\n else if ("glide_list" == prevField.internal_type)\r\n nextFields[fieldKey].selectedOptions = prevField.selectedOptions;\r\n else if (["currency,price"].indexOf(prevField.internal_type > 1)) {\r\n nextFields[fieldKey].currencyCode = previousFields[fieldKey].currencyCode;\r\n nextFields[fieldKey].currencyValue = previousFields[fieldKey].currencyValue;\r\n }\r\n nextFields[fieldKey].value = previousFields[fieldKey].value;\r\n nextFields[fieldKey].display = previousFields[fieldKey].display;\r\n nextFields[fieldKey].displayValue = previousFields[fieldKey].displayValue;\r\n\r\n if(previousFields[fieldKey].hasOwnProperty('setAsDisplayValue'))\r\n nextFields[fieldKey].setAsDisplayValue = previousFields[fieldKey].setAsDisplayValue;\r\n \r\n // Copy employee fields for subject_person and opened_for\r\n if (["subject_person", "opened_for"].indexOf(fieldKey) > -1) {\r\n nextFields[fieldKey].ev_table = previousFields[fieldKey].ev_table;\r\n nextFields[fieldKey].ev_sys_id = previousFields[fieldKey].ev_sys_id;\r\n nextFields[fieldKey].ev_tooltip = previousFields[fieldKey].ev_tooltip;\r\n }\r\n }\r\n\r\n fieldCache = {};\r\n\r\n $scope.taskFields = taskFields;\r\n\r\n var stageValue = '';\r\n for (var fieldList in $scope.taskFields)\r\n for (var i = 0; i < $scope.taskFields[fieldList].length; i++) {\r\n var field = $scope.taskFields[fieldList][i];\r\n if (universalReq && field.column_name == 'work_notes')\r\n field.mandatory = true;\r\n // Update choice options\r\n if (fields.hasOwnProperty(field.column_name) && field.hasOwnProperty("choiceList"))\r\n field.choiceList = fields[field.column_name].choiceList;\r\n // Set fields from template\r\n if (templateData.hasOwnProperty(field.column_name)) {\r\n if (["reference", "glide_list"].indexOf(field.internal_type) > -1)\r\n $scope.taskFields[fieldList][i] = templateData[field.column_name];\r\n else {\r\n // TODO Handle different types of fields\r\n field.value = templateData[field.column_name].value;\r\n field.display = templateData[field.column_name].display;\r\n field.displayValue = templateData[field.column_name].displayValue;\r\n }\r\n }\r\n\r\n // TODO Can this be added to "Update choice options" above?\r\n // Trigger change for choice fields\r\n if (field.hasOwnProperty("choiceList"))\r\n choiceFieldSelectors.push("#ev_case #" + $scope.getFieldId(field));\r\n\r\n if (field.column_name === 'stage') {\r\n stageValue = field.value;\r\n if (allActivitySetsFinished === 'true')\r\n field.hidden = true;\r\n }\r\n\r\n if (field.column_name === 'display_order' && stageValue === '')\r\n field.hidden = true;\t\t\t\t\t\t\t\t\r\n }\r\n\r\n if (choiceFieldSelectors.length)\r\n $timeout(function() {\r\n $j(choiceFieldSelectors.join(", ")).trigger('change');\r\n });\r\n\r\n // Update services if previousFields contains subject_person, but nextFields doesn't\r\n if (previousFields.hasOwnProperty("subject_person") && !nextFields.hasOwnProperty("subject_person"))\r\n $scope.updateServices();\r\n\r\n // Set opened_for to mandatory false if skipped verification\r\n if ($scope.skippedVerification && nextFields.hasOwnProperty("opened_for") && nextFields["opened_for"].mandatory)\r\n nextFields["opened_for"].mandatory = false;\r\n\r\n if(($scope.skippedVerification && nextFields.hasOwnProperty("subject_person") && nextFields["subject_person"].mandatory))\r\n nextFields["subject_person"].mandatory = false;\r\n\r\n $scope.fetchingFields = false;\r\n $scope.updateLists();\r\n\r\n $timeout(function () {\r\n $scope.displayOrderButton = $j('#displayOrderButton');\r\n $scope.displayOrderButton.popover($scope.popoverOptions);\r\n });\r\n });\r\n\r\n return $scope.sanitize(item.display);\r\n },\r\n formatResult: function(item) {\r\n return $scope.sanitize(item.display);\r\n },\r\n id: function(item) {\r\n return item.sys_id;\r\n },\r\n placeholder: getMessage("Select a service")\r\n }).on("select2-loaded", function() {\r\n // Adding group role to sublist\r\n $j("#select2-drop .select2-results .select2-result-with-children").each(function() {\r\n $j(this).attr("role", "group");\r\n $j(this).attr("aria-labelledby", $j(this).children().first().attr("id"));\r\n });\r\n // Add presentation role on sublists to avoid accessibility violation. \r\n $j("#select2-drop .select2-results .select2-result-sub").each(function() {\r\n // Add presentation role to the group label element.\r\n $j(this).prev().attr("role", "presentation");\r\n $j(this).attr("role", "presentation");\r\n });\r\n\t\t\t// Adding aria-controls \r\n $j("#select2-drop .select2-search .select2-input").attr("aria-controls", $j("#select2-drop .select2-results").attr("id"));\r\n }).on("select2-clearing", function() {\r\n $timeout(function() {\r\n $scope.missingService = true;\r\n });\r\n }).on('change', $scope.addAriaLabelToSelect2ClearIcon);\r\n\r\n // COE input select2\r\n $j("#coe_input").select2({\r\n //override the defaults\r\n formatNoMatches: function() {\r\n return "${gs.getMessage('No matches found')}";\r\n },\r\n formatSearching: function() {\r\n return "${gs.getMessage('Searching..')}";\r\n },\r\n formatAjaxError: function() {\r\n return "${gs.getMessage('The results could not be loaded')}";\r\n },\r\n formatLoadMore: function() {\r\n return "${gs.getMessage('Loading more results...')}";\r\n },\r\n formatInputTooShort: function(args) {\r\n var SELECT2_MINIMUM_CHAR_INPUT = 3;\r\n var remainingChars = SELECT2_MINIMUM_CHAR_INPUT;\r\n if (args.length)\r\n remainingChars -= args.length;\r\n var gwtMessageObj = new GwtMessage();\r\n var message = gwtMessageObj.getMessage('Please enter {0} or more characters', remainingChars);\r\n return message;\r\n },\r\n allowClear: true,\r\n ajax: {\r\n quietMillis: ac_wait_time,\r\n data: function(searchTerm, page) {\r\n return {\r\n term: searchTerm,\r\n page: page - 1\r\n };\r\n },\r\n transport: function(response) {\r\n var q = response.data;\r\n var total = -1;\r\n var start = q.page * localPageSize;\r\n var end = (q.page + 1) * localPageSize;\r\n\r\n var results = $scope.coes.filter(function(opt) {\r\n var matched = !q.term || $scope.unescapeHTML(opt.display, $scope.HTML_ENTITIES).toLowerCase().indexOf(q.term.toLowerCase()) >= 0;\r\n if (!matched)\r\n return false;\r\n total++;\r\n if (total >= start && total < end) // Option within page bounds\r\n return matched;\r\n return false;\r\n });\r\n\r\n response.success.apply(this, [{\r\n results: results,\r\n more: total > end\r\n }]);\r\n\r\n return true;\r\n },\r\n results: function(response, page) {\r\n return response;\r\n }\r\n },\r\n formatSelection: function(item) {\r\n // Clear the current service_input if it is not in this coe\r\n var service = $j("#service_input").select2("data");\r\n if (service && service.coe && service.coe != item.table)\r\n $j("#service_input").select2("data", null);\r\n\r\n return $scope.unescapeHTML($scope.sanitize(item.display), $scope.HTML_ENTITIES);\r\n },\r\n formatResult: function(item) {\r\n return $scope.unescapeHTML($scope.sanitize(item.display), $scope.HTML_ENTITIES);\r\n },\r\n id: function(item) {\r\n return item.table;\r\n },\r\n placeholder: getMessage("Filter services by COE")\r\n }).on("select2-loaded", function() {\r\n\t\t\t// Adding aria-controls \r\n $j("#select2-drop .select2-search .select2-input").attr("aria-controls", $j("#select2-drop .select2-results").attr("id"));\r\n }).on('change', $scope.addAriaLabelToSelect2ClearIcon);\r\n\r\n\t\t// Field input select2\r\n\t\t$j(document).on("select2-loaded", function() {\r\n\t\t\t// Adding aria-controls \r\n $j("#select2-drop .select2-search .select2-input").attr("aria-controls", $j("#select2-drop .select2-results").attr("id"));\r\n\t\t});\r\n\r\n\r\n $scope.showList = function(list) {\r\n for (var i = 0; i < $scope.relatedLists.length; i++)\r\n $scope.relatedLists[i].active = false;\r\n list.active = true;\r\n };\r\n\r\n $scope.isListActive = function(list) {\r\n return list.active == true;\r\n };\r\n\r\n $scope.activeListExists = function() {\r\n for (var i = 0; i < $scope.relatedLists.length; i++)\r\n if ($scope.relatedLists[i].active && !$scope.relatedLists[i].hide)\r\n return true;\r\n return false;\r\n };\r\n\r\n // TODO Load related lists from server configuration\r\n $scope.relatedLists = [{\r\n table: 'sn_hr_core_case',\r\n queryField: "opened_for",\r\n view: 'case_creation',\r\n properties: {\r\n listId: "cases_for_opened_for_user",\r\n overrideLabel: 'false',\r\n displayLabel: $scope.sanitize('${gs.getMessage("Cases for Opened for")}'),\r\n sort: {\r\n column: {\r\n number: 'number'\r\n }\r\n },\r\n related: {},\r\n listControl: {\r\n omitFilter: 'false',\r\n },\r\n rowsPerPageRange: '5,10,20',\r\n maxRows: 20,\r\n isRelated: 'true',\r\n isRefList: 'false'\r\n },\r\n parameters: {\r\n sysparm_fixed_query: (userInit && userInit.sys_id) ? "opened_for=" + userInit.sys_id + "^ORsubject_person=" + userInit.sys_id : 'sys_id=null',\r\n sysparm_view: 'case_creation',\r\n sysparm_limit: 20,\r\n sysparm_offset: 0,\r\n sysparm_query: ''\r\n },\r\n include: {\r\n footer: 'true'\r\n }\r\n },\r\n {\r\n table: 'sn_hr_core_case',\r\n queryField: "subject_person",\r\n view: 'case_creation',\r\n properties: {\r\n listId: "cases_opened_for_subject_person",\r\n overrideLabel: 'false',\r\n displayLabel: $scope.sanitize('${gs.getMessage("Cases for Subject person")}'),\r\n sort: {\r\n column: {\r\n number: 'number'\r\n }\r\n },\r\n related: {},\r\n listControl: {\r\n omitFilter: 'false',\r\n },\r\n rowsPerPageRange: '5,10,20',\r\n maxRows: 20,\r\n isRelated: 'true',\r\n isRefList: 'false'\r\n },\r\n parameters: {\r\n sysparm_fixed_query: (userInit && userInit.sys_id) ? "opened_for=" + userInit.sys_id + "^ORsubject_person=" + userInit.sys_id : 'sys_id=null',\r\n sysparm_view: 'case_creation',\r\n sysparm_limit: 20,\r\n sysparm_offset: 0,\r\n sysparm_query: ''\r\n },\r\n include: {\r\n footer: 'true'\r\n }\r\n }\r\n ];\r\n if ($scope.relatedLists.length)\r\n $scope.relatedLists[0].active = true;\r\n\r\n }).directive('evField', ['$timeout', function($timeout) {\r\n return {\r\n restrict: 'E',\r\n scope: {\r\n field: '=',\r\n disabled: '=',\r\n wide: '='\r\n },\r\n controller: ['$scope', function($scope) {\r\n // Determine render type\r\n if ($scope.field.hasOwnProperty("choiceList")) {\r\n $scope.renderType = "choice";\r\n $timeout(function() {\r\n $j("#" + $scope.getFieldId($scope.field)).select2();\r\n });\r\n } else if ($scope.field.internal_type == "price")\r\n $scope.renderType = "currency";\r\n else if (["integer", "decimal", "float"].indexOf($scope.field.internal_type) > -1)\r\n $scope.renderType = "number";\r\n else if ($scope.field.internal_type == "html" || $scope.field.internal_type == "translated_html")\r\n $scope.renderType = "html";\r\n else\r\n $scope.renderType = $scope.field.internal_type;\r\n\r\n $scope.field.disabled = $scope.disabled;\r\n\r\n // Currency initialization\r\n if ($scope.renderType == "currency") {\r\n $timeout(function() {\r\n $j("#" + $scope.getFieldId($scope.field) + "_select").select2({\r\n minimumResultsForSearch: 10\r\n });\r\n });\r\n }\r\n $scope.valueHandler = function() {\r\n if ($scope.field.currencyCode && $scope.field.currencyValue)\r\n $scope.field.value = $scope.field.currencyCode + ";" + $scope.field.currencyValue;\r\n else\r\n $scope.field.value = "";\r\n };\r\n\r\n // Number formatter method\r\n $scope.formatNumber = function() {\r\n $scope.field.messages = [];\r\n if (typeof formatNumber !== "function")\r\n return;\r\n\r\n if ($scope.renderType == "currency") {\r\n $scope.field.currencyValue = formatNumber($scope.field.currencyValue);\r\n $scope.valueHandler();\r\n } else {\r\n if ($scope.field.display !== "") {\r\n $scope.field.display = formatNumber($scope.field.display);\r\n $scope.field.value = formatClean($scope.field.display);\r\n } else {\r\n $scope.field.display = $scope.field.value = "";\r\n $scope.field.value = "";\r\n }\r\n\r\n if ($scope.field.column_name === "display_order")\r\n $scope.$parent.updateDisplayOrderPosition($scope.field);\r\n }\r\n };\r\n\r\n // Methods to show date pickers for glide_date_time and glide_date\r\n $scope.showDateTimePicker = function() {\r\n new GwtDateTimePicker($scope.getFieldId($scope.field), g_user_date_time_format, true);\r\n };\r\n $scope.showDatePicker = function() {\r\n new GwtDateTimePicker($scope.getFieldId($scope.field), g_user_date_format, false);\r\n };\r\n $scope.updateMandatoryMark = function() {\r\n $j("#" + $scope.getFieldId($scope.field)).trigger("change");\r\n $scope.field.value = $scope.field.display;\r\n $scope.field.setAsDisplayValue = true;\r\n };\r\n\r\n // Default options for reference and glide_list\r\n $scope.options = {};\r\n if (!$scope.disabled && ["reference", "glide_list"].indexOf($scope.field.internal_type) > -1)\r\n $scope.options.placeholder = $j("<div>").text('${gs.getMessage("Select a record")}').html();\r\n\r\n // Initialization and methods for glide_list\r\n if (["glide_list"].indexOf($scope.field.internal_type) > -1)\r\n $scope.showLock = $scope.disabled;\r\n $scope.toggleLock = function() {\r\n $scope.showLock = !$scope.showLock;\r\n };\r\n $scope.selectOption = function() {\r\n // Only add selected option if it was not already added\r\n var alreadyAdded = false;\r\n for (var i = 0; i < $scope.field.selectedOptions.length; i++)\r\n if ($scope.field.selectedOptions[i].value == $scope.field.value) {\r\n alreadyAdded = true;\r\n break;\r\n }\r\n\r\n if (!alreadyAdded)\r\n $scope.field.selectedOptions.push({\r\n value: $scope.field.value,\r\n label: $scope.sanitize($scope.field.displayValue)\r\n });\r\n\r\n $scope.updateGlideListValue();\r\n $scope.field.displayValue = "";\r\n };\r\n $scope.removeSelectedOptions = function() {\r\n var optionsToRemove = angular.copy($scope.field.highlightedOptions);\r\n\r\n // Loop through field.selectedOptions backwards to avoid skipping an option\r\n for (var i = $scope.field.selectedOptions.length - 1; optionsToRemove && i > -1; i--)\r\n if (optionsToRemove.indexOf($scope.field.selectedOptions[i].value) > -1)\r\n $scope.field.selectedOptions.splice(i, 1);\r\n\r\n $scope.field.highlightedOptions = [];\r\n $scope.updateGlideListValue();\r\n };\r\n $scope.updateGlideListValue = function() {\r\n var valArr = [];\r\n\r\n for (var j = 0; j < $scope.field.selectedOptions.length; j++)\r\n valArr.push($scope.field.selectedOptions[j].value);\r\n\r\n $scope.field.value = valArr.join(",");\r\n };\r\n $scope.displayGlideList = function() {\r\n var displayArr = [];\r\n for (var i = 0; i < $scope.field.selectedOptions.length; i++)\r\n displayArr.push($scope.field.selectedOptions[i].label);\r\n return $scope.sanitize(displayArr.join(", "));\r\n };\r\n $scope.disableRefIconGlideList = function() {\r\n return !$scope.field.highlightedOptions || $scope.field.highlightedOptions.length != 1;\r\n };\r\n $scope.$parent.addTooltips([\r\n "#" + $scope.$parent.getFieldId($scope.field) + "_addons a",\r\n "#" + $scope.$parent.getFieldId($scope.field) + "_glide_list a.btn"\r\n ].join(", "));\r\n\r\n // Set value to display for default render type fields (in case template sets field.value)\r\n if (["reference", "boolean", "choice", "glide_date_time", "glide_date", "glide_duration", "glide_list", "currency", "email", "number", "html"].indexOf($scope.renderType) == -1)\r\n $scope.$watch('field.display', function(v) {\r\n $scope.field.value = $scope.field.display;\r\n });\r\n }],\r\n link: function(scope, element) {\r\n scope.classes = scope.$parent.classes;\r\n scope.showRefPopup = scope.$parent.showRefPopup;\r\n scope.showFloorPlan = scope.$parent.showFloorPlan;\r\n scope.getFieldId = scope.$parent.getFieldId;\r\n scope.refOnChange = scope.$parent.refOnChange;\r\n scope.sanitize = scope.$parent.sanitize;\r\n scope.mailTo = scope.$parent.mailTo;\r\n\r\n if (scope.renderType === 'html') {\r\n var fieldId = scope.getFieldId(scope.field);\r\n scope.$parent.setupMCE(fieldId, scope.field.value);\r\n\r\n scope.$on('$destroy', function() {\r\n var editor = tinymce.get(fieldId);\r\n if (editor)\r\n editor.remove();\r\n });\r\n }\r\n },\r\n template: [\r\n '<div class="ev-field form-group" ng-switch="renderType" ng-class="field.mandatory ? ( (field.value || renderType == \\'boolean\\') ? \\'is-filled\\' : \\'is-required\\') : \\'\\'">',\r\n // Field label\r\n '<label for="{<!-- -->{getFieldId(field)}}" id="{<!-- -->{getFieldId(field)}}_label" ng-class="wide ? classes.wideLabel : classes.label">',\r\n '<span class="required-marker" mandatory="true" ></span>',\r\n '<span title="{<!-- -->{field.hint}}">{<!-- -->{field.label}}</span>',\r\n '</label>',\r\n // Reference field\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="reference">',\r\n '<sn-reference-picker id="{<!-- -->{getFieldId(field)}}" ref-value="{<!-- -->{field.value}}" class="ev-field-reference" field="field" ed="field" sn-disabled="disabled" sn-options="options" sn-on-change="refOnChange(field)" ref-table="field.refTable" ref-id="field.refId" minimum-input-length="{<!-- -->{field.minimumInputLength}}"></sn-reference-picker>',\r\n '</div>',\r\n // Boolean field\r\n '<div class="ev-field-input-div input-group-checkbox" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="boolean">',\r\n '<input id="{<!-- -->{getFieldId(field)}}" name="{<!-- -->{getFieldId(field)}}" class="checkbox" ng-class="{disabled: disabled}" ng-disabled="disabled" type="checkbox" ng-checked="field.value === \\'true\\'" ng-model="field.value" ng-true-value="\\'true\\'" ng-false-value="\\'false\\'"/>',\r\n '<label for="{<!-- -->{getFieldId(field)}}" class="checkbox-label ev-field-checkbox-label"></label>',\r\n '</div>',\r\n // Choice field\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="choice">',\r\n '<select id="{<!-- -->{getFieldId(field)}}" class="ev-field-choicelist select2" ng-model="field.value" ng-options="choice.value as choice.label for choice in field.choiceList" ng-disabled="disabled" ></select>',\r\n '</div>',\r\n // Datetime field\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="glide_date_time">',\r\n '<span class="input-group inline-form ev-input-group" ng-style="disabled ? \\'\\' : {width:\\'calc(100% - 32px)\\'}">',\r\n '<input type="text" class="form-control ev-field-date-time" id="{<!-- -->{getFieldId(field)}}" ng-model="field.display" ng-disabled="disabled" ng-blur="updateMandatoryMark()"/>',\r\n '<span class="input-group-btn">',\r\n '<a ng-click="showDateTimePicker()" class="btn btn-default icon icon-calendar" ng-hide="disabled" ng-disabled="disabled" title="${gs.getMessage("Select date and time")}" href=""></a>',\r\n '</span>',\r\n '</span>',\r\n '</div>',\r\n // Date field\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="glide_date">',\r\n '<span class="input-group inline-form ev-input-group" ng-style="disabled ? \\'\\' : {width:\\'calc(100% - 32px)\\'}">',\r\n '<input type="text" class="form-control ev-field-date" id="{<!-- -->{getFieldId(field)}}" ng-model="field.display" ng-disabled="disabled" ng-blur="updateMandatoryMark()"/>',\r\n '<span class="input-group-btn">',\r\n '<a ng-click="showDatePicker()" class="btn btn-default icon icon-calendar" ng-hide="disabled" ng-disabled="disabled" title="${gs.getMessage("Select date")}" href=""></a>',\r\n '</span>',\r\n '</span>',\r\n '</div>',\r\n // Duration field\r\n '<div class="ev-field-input-div ev-field-duration-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="glide_duration">',\r\n '<sn-form-element style="margin:0;" field="field" id="{<!-- -->{getFieldId(field)}}" ></sn-form-element>',\r\n '</div>',\r\n // Glide list field // TODO Refactor styling and layout\r\n '<div class="ev-field-input-div" id="{<!-- -->{getFieldId(field)}}_glide_list" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="glide_list">',\r\n '<span ng-show="!showLock">',\r\n '<div class="col-xs-11 no-padding glidelist-box" style="width: calc(100% - 33px);">',\r\n '<select multiple="true" aria-labelledby="{<!-- -->{getFieldId(field)}}_label" size="6" name="glideList_{<!-- -->{getFieldId(field)}}" ng-model="field.highlightedOptions" class="form-control">',\r\n '<option ng-repeat="option in field.selectedOptions" ng-value="option.value">{<!-- -->{option.label}}</option>',\r\n '</select>',\r\n '</div>',\r\n '<div class="col-xs-1 no-padding glidelist-icons" style="max-width:32px;">',\r\n '<div class="button-column">',\r\n '<button ng-click="removeSelectedOptions()" class="btn btn-default icon-cross" ng-disabled="disabled" aria-label="${gs.getMessage("Remove selected item")}" title="${gs.getMessage("Remove selected item")}"></button>',\r\n '<button ng-click="showRefPopup($event, field)" class="btn btn-default btn-ref icon-info" ng-disabled="disableRefIconGlideList()" aria-label="${gs.getMessage("Open reference record in current window")}" title="{<!-- -->{field.tooltip + \\' - \\' + field.displayValue}}" aria-haspopup="true"></button>',\r\n '<button ng-click="toggleLock()" class="btn btn-default icon-unlocked" ng-disabled="disabled" aria-label="${gs.getMessage("Lock")}" title="${gs.getMessage("Lock")}"></button>',\r\n '</div>',\r\n '</div>',\r\n '<div class="glide-listref">',\r\n '<sn-reference-picker id="glide_list_select_{<!-- -->{getFieldId(field)}}" sn-options="options" ed="field" field="field" sn-on-change="selectOption()" ref-table="field.refTable" ref-id="field.refId" minimum-input-length="{<!-- -->{field.minimumInputLength}}"></sn-reference-picker>',\r\n '</div>',\r\n '</span>',\r\n '<span ng-show="showLock">',\r\n '<div ng-style="disabled ? { \\'padding-top\\': \\'7px\\'} : \\'\\'">',\r\n '<button class="btn btn-default btn-ref icon-locked" data-auto-close="false" data-placement="auto" ng-click="toggleLock()" type="button" ng-disabled="disabled" aria-label="${gs.getMessage("Edit")}" title="${gs.getMessage("Edit")}" ng-hide="disabled"></button>',\r\n '<span style="margin-left:5px;">{<!-- -->{displayGlideList()}}</span>',\r\n '</div>',\r\n '</span>',\r\n '</div>',\r\n // Currency, Price\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="currency">',\r\n '<span class="input-group">',\r\n '<span class="input-group-addon input-group-select input-group-select_left">',\r\n '<select id="{<!-- -->{getFieldId(field)}}_select" class="ev-field-currency select2" ng-model="field.currencyCode" ng-options="choice.code as choice.symbol for choice in field.currencyCodes" ng-disabled="disabled" ng-change="valueHandler()" ></select>',\r\n '</span>',\r\n '<input id="{<!-- -->{getFieldId(field)}}_input" class="form-control decimal" ng-model="field.currencyValue" ng-change="valueHandler()" ng-disabled="disabled" ng-blur="formatNumber()"/>',\r\n '</span>',\r\n '</div>',\r\n // Email\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="email">',\r\n '<span class="input-group inline-form ev-input-group" style="width:calc(100% - 32px)">',\r\n '<input type="text" class="form-control ev-field-email" id="{<!-- -->{getFieldId(field)}}" ng-model="field.value" ng-disabled="disabled"/>',\r\n '<span class="input-group-btn">',\r\n '<a id="email_btn" class="btn btn-default btn-ref icon icon-mail" title="${gs.getMessage("Send an email to this address")}" aria-label="${gs.getMessage("Send an email to this address")}" ng-click="mailTo(field.value)" href=""></a>',\r\n '</span>',\r\n '</span>',\r\n '</div>',\r\n // Integer, Decimal, Float\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="number">',\r\n '<input id="{<!-- -->{getFieldId(field)}}" class="form-control decimal ev-field-input" maxlength="{<!-- -->{field.max_length}}" ng-class="{disabled: disabled}" ng-disabled="disabled" ng-model="field.display" ng-blur="formatNumber()"/>',\r\n '</div>',\r\n // HTML (TinyMCE rich text)\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-when="html">',\r\n '<textarea id="{<!-- -->{getFieldId(field)}}" class="form-control mceEditor" ng-model="field.value" ng-disabled="disabled"></textarea>',\r\n '</div>',\r\n // Default\r\n '<div class="ev-field-input-div" ng-class="wide ? classes.wideField : classes.field" ng-switch-default>',\r\n '<input type="text" id="{<!-- -->{getFieldId(field)}}" class="form-control ev-field-input" maxlength="{<!-- -->{field.max_length}}" ng-class="{disabled: disabled}" ng-disabled="disabled" ng-model="field.display" ng-if="!field.max_length || field.max_length < 256"/>',\r\n '<textarea id="{<!-- -->{getFieldId(field)}}" class="form-control ev-field-textarea" ng-if="field.max_length && field.max_length >= 256" maxlength="{<!-- -->{field.max_length}}" ng-class="{disabled: disabled}" ng-model="field.display" ng-disabled="disabled"></textarea>',\r\n '</div>',\r\n // Addons\r\n '<div id="{<!-- -->{getFieldId(field)}}_addons" ng-class="wide ? classes.wideAddons : classes.addons">',\r\n '<button ng-if="renderType == \\'reference\\'" ng-click="showRefPopup($event, field)" class="btn btn-default btn-ref icon-info" ng-show="field.value" aria-label="{<!-- -->{ field.tooltip + \\' - \\' + field.displayValue || field.ev_tooltip + \\' - \\' + field.displayValue }}" data-original-title="{<!-- -->{ field.tooltip + \\' - \\' + field.displayValue || field.ev_tooltip + \\' - \\' + field.displayValue }}" aria-haspopup="true"></button>',\r\n '<a ng-if="renderType == \\'reference\\'" ng-show="field.value && field.external_space_id" ng-click="showFloorPlan(field)" class="btn btn-default icon-location" aria-label="${gs.getMessage("Map pin")}" title="${gs.getMessage("Open floor plan in new window")}" href=""></a>',\r\n '<button id="displayOrderButton" ng-if="field.column_name == \\'display_order\\' && $parent.showDisplayOrderButton" ng-show="field.display !== \\'\\'" class="btn btn-default btn-ref icon-info" aria-label="${gs.getMessage(\\'Preview all activities\\')}" data-original-title="${gs.getMessage(\\'Preview all activities\\')}" aria-haspopup="true"></button>',\r\n '</div>',\r\n '</div>'\r\n ].join('')\r\n };\r\n }]);\r\n\r\n angular.bootstrap(document.getElementById('case_creation_container'), [\r\n 'caseCreation',\r\n 'sn.ngform',\r\n 'sn.list',\r\n 'sn.common.ui',\r\n 'sn.common'\r\n ]);\r\n});]]></client_script>\r\n <description/>\r\n <direct>false</direct>\r\n <endpoint>sn_hr_core_case_creation.do</endpoint>\r\n <html><![CDATA[<?xml version="1.0" encoding="utf-8" ?>\r\n<j:jelly trim="false" xmlns:j="jelly:core" xmlns:g="glide" xmlns:j2="null" xmlns:g2="null">\r\n\t<g2:requires name="scripts/angular_includes_1.5.11.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/js_includes_common.js" includes="true"/>\r\n\r\n\t<!-- TODO Remove unnecessary includes -->\r\n\t<g2:requires name="scripts/sn/common/util/js_includes_util.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/messaging/js_includes_messaging.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/controls/js_includes_controls.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/glide/js_includes_glide.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/i18n/js_includes_i18n.js" includes="true"/>\r\n\t<g2:requires name="scripts/sn/common/ui/js_includes_ui.js" includes="true"/>\r\n\t<g2:requires name="scripts/js_includes_ng_form_elements.js" includes="true"/>\r\n\t<g2:requires name="scripts/js_includes_ng_list.js" includes="true"/>\r\n\t<g2:requires name="scripts/js_includes_list_v3.js" includes="true"/>\r\n\t<!-- Prevents errors for reference popover of an fm_space -->\r\n\t<g2:requires name="scripts/classes/doctype/js_includes_listv2_doctype.js" includes="true"/>\r\n\t<g2:requires name="scripts/tinymce_default/tinymce.full.js" params="sysparm_substitute=false"/>\r\n\r\n\t<!-- Included styles -->\r\n\t<g2:requires name="/styles/css_includes_ng_polaris.css"/>\r\n\t<g2:requires name="/styles/thirdparty/datetimepicker.css"/>\r\n\t<g2:requires name="/styles/list_v3.css"/>\r\n\t<g2:requires name="/styles/polaris/filter.css"/>\r\n\t<g2:requires name="/styles/sn_avatar.css"/>\r\n\t<g2:requires name="/styles/dist/common/sn_common.css"/>\r\n\r\n\t<g:evaluate jelly="true">\r\n\t\tvar fvwPluginActive = GlidePluginManager.isActive('com.snc.facilities_service_automation.fvw');\r\n\t\tvar evConfig = new sn_hr_core.hr_CaseCreation();\r\n\t\tvar pageSize = evConfig.pageSize || 10;\r\n\t\tvar minimumInputLength = evConfig.minimumInputLength || 4;\r\n\t\tvar links = evConfig.links || [];\r\n\t\tvar linksString = JSON.stringify(links);\r\n\t\tvar leParentSysId = jelly.sysparm_parent_le_case;\r\n\t\tvar allActivitySetsFinished = false;\r\n\r\n\t\tvar coes = evConfig.getActiveCoes();\r\n\t\tvar coesString = JSON.stringify(coes);\r\n\t\tvar universalReq = jelly.sysparm_universalReq || '';\r\n\t\t\r\n\t\tvar taskCreateTable = evConfig.taskCreateTable;\r\n\t\tvar taskCreateRecord = new GlideRecord(evConfig.taskCreateTable);\r\n\t\ttaskCreateRecord.initialize();\r\n\t\tevConfig.setInitialCaseFields(taskCreateRecord);\r\n\t\tvar taskFields = {};\r\n\t\tfor (var key in evConfig.taskFields)\r\n\t\t\ttaskFields[key] = evConfig.getFieldObjects(taskCreateRecord, evConfig.taskFields[key], true);\r\n\t\t\r\n\t\tif (leParentSysId)\r\n\t\t\tallActivitySetsFinished = new sn_hr_le.hr_LERefQualSNC().getEligibleStages(leParentSysId).length === 0;\r\n\r\n\t\t// Remove fields user cannot write to\r\n\t\tfor (var keyList in taskFields)\r\n\t\t\tfor (var i = taskFields[keyList].length - 1; i > -1; i--) {\r\n\t\t\t\tif (!taskCreateRecord.getElement(taskFields[keyList][i].column_name).canCreate())\r\n\t\t\t\t\ttaskFields[keyList].splice(i, 1);\r\n\r\n\t\t\t\tif (universalReq ${AND} taskFields[keyList][i].column_name == "work_notes")\r\n\t\t\t\t \ttaskFields[keyList][i].mandatory = true;\r\n\t\t\t}\r\n\t\t\r\n\t\t// If an admin has configured the case creation page to have specific location for stage and display order - use it\r\n\t\tvar getPositionOfStageAndDisplayOrder = function(taskFields) {\r\n\t\t\tvar result = {'stage' : '', 'display_order' : ''};\r\n\t\t\tfor (var position in taskFields)\r\n\t\t\t\tfor (var i = taskFields[position].length - 1; i > -1; i--) {\r\n\t\t\t\t\tif (taskFields[position][i].column_name === 'stage')\r\n\t\t\t\t\t\tresult.stage = position;\r\n\t\t\t\t\tif (taskFields[position][i].column_name === 'display_order')\r\n\t\t\t\t\t\tresult.display_order = position;\r\n\t\t\t\t}\r\n\t\t\treturn result;\r\n\t\t};\r\n\r\n\t\tif (leParentSysId ${AND} !allActivitySetsFinished) {\r\n\t\t\tvar stageField = evConfig.getFieldObject(taskCreateRecord, evConfig.getUserField("stage", true));\r\n\t\t\tvar displayOrder;\r\n\t\t\tvar grCase = new GlideRecord("sn_hr_core_case");\r\n\t\t\tif (grCase.get(leParentSysId) ${AND} grCase.getElement('hr_service.le_type.sort_activities_by').toString() == 'display_order') {\r\n\t\t\t\tdisplayOrder = evConfig.getFieldObject(taskCreateRecord, evConfig.getUserField("display_order", true));\r\n\t\t\t\tdisplayOrder.hidden = true;\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tvar position = getPositionOfStageAndDisplayOrder(taskFields);\r\n\t\t\r\n\t\t\tif (stageField ${AND} !position.stage) \r\n\t\t\t\ttaskFields[position.stage || 'left_fields'].push(stageField);\r\n\t\t\tif (displayOrder ${AND} !position.display_order)\r\n\t\t\t\ttaskFields[position.display_order || 'left_fields'].push(displayOrder);\r\n\t\t\r\n\t\t\tvar stage = taskFields[position.stage || 'left_fields'].filter(function(item) {\r\n\t\t\t\treturn item.column_name === 'stage';\r\n\t\t\t});\r\n\r\n\t\t\t// Since advanced qualifier that is being defined on stage field is using current and as we are not passing current, we have to pass it as a parameter\r\n\t\t\tif (stage.length == 1) \r\n\t\t\t\tstage[0].qualifier = new sn_hr_le.hr_LERefQual().stageActivitySetRefQual(leParentSysId);\r\n\t\t} else {\r\n\t\t\t// If case form is configured to show 'stage' and 'display_order' - remove them as they are only applicable if the parent is LE case type\r\n\t\t\tfor (var keyList in taskFields)\r\n\t\t\t\tfor (var i = taskFields[keyList].length - 1; i > -1; i--) {\r\n\t\t\t\t\tif (taskFields[keyList][i].column_name === 'stage' || taskFields[keyList][i].column_name === 'display_order')\r\n\t\t\t\t\t\ttaskFields[keyList].splice(i, 1);\r\n\t\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\tvar taskFieldString = JSON.stringify(taskFields);\r\n\t\t// TODO Add boolean for if hr_service field is even on taskCreateTable\r\n\r\n\t\tvar user = jelly.sysparm_user;\r\n\t\tvar profile = jelly.sysparm_profile;\r\n\t\tvar userObject = '';\r\n\t\tif (user) {\r\n\t\t\tvar userGr = new GlideRecordSecure("sys_user");\r\n\t\t\tif (userGr.get("sys_id", user))\r\n\t\t\t\tuserObject = evConfig.getUserObject(userGr);\r\n\t\t} else if (profile) {\r\n\t\t\tvar profileGr = new GlideRecordSecure("sn_hr_core_profile");\r\n\t\t\tprofileGr.addNotNullQuery("user");\r\n\t\t\tprofileGr.addQuery("sys_id", profile);\r\n\t\t\tprofileGr.query();\r\n\t\t\tif (profileGr.next())\r\n\t\t\t\tuserObject = evConfig.getUserObject(profileGr);\r\n\t\t}\r\n\t\tuserObject = JSON.stringify(userObject);\r\n\r\n\t\tvar conversation = jelly.sysparm_conversation || '';\r\n\t\tvar collectionKey = jelly.sysparm_collection_key || '';\r\n\t\tvar collectionId = jelly.sysparm_collectionID || '';\r\n\t\t\r\n\t\tvar coeLabel;\r\n\t\tvar coeHint;\r\n\t\tvar topicCategoryGr = new GlideRecord("sn_hr_core_topic_category")\r\n\t\tif (topicCategoryGr.isValid() ${AND} topicCategoryGr.isValidField("coe")) {\r\n\t\t\tvar coeElement = topicCategoryGr.getElement("coe");\r\n\t\t\tcoeLabel = coeElement.getLabel();\r\n\t\t\tcoeHint = coeElement.getED().getHint();\r\n\t\t}\r\n\t\tcoeLabel = coeLabel || gs.getMessage("COE");\r\n\t\tcoeHint = coeHint || gs.getMessage("Center of Excellence associated with HR case you are creating");\r\n\r\n\t\tvar serviceLabel;\r\n\t\tvar serviceHint;\r\n\t\tif (taskCreateRecord.isValid() ${AND} taskCreateRecord.isValidField("hr_service")) {\r\n\t\t\tvar serviceElement = taskCreateRecord.getElement("hr_service");\r\n\t\t\tserviceLabel = serviceElement.getLabel();\r\n\t\t\tserviceHint = serviceElement.getED().getHint();\r\n\t\t}\r\n\t\tserviceLabel = serviceLabel || gs.getMessage("HR service");\r\n\t\tserviceHint = serviceHint || gs.getMessage("Determines type of case being created");\r\n\t\t\r\n\t\tvar button = '<a href="" class="btn btn-link no-padding" ng-click="skipVerification()">' + gs.getMessage('Skip verification') + '</a>';\r\n\t\tvar translatedMessage = '<span>' + gs.getMessage('{0} for external individuals or anonymous employees', button) + '</span>';\r\n\t</g:evaluate>\r\n\r\n\t<script>\r\n\t\t// set title for case creation page\r\n\t\tdocument.title = '${gs.getMessage("Case Creation")}';\r\n\t\tvar fvwPluginActive = ${fvwPluginActive};\r\n\t\tvar pageSize = ${pageSize};\r\n\t\tvar minimumInputLength = ${minimumInputLength};\r\n\t\tvar ac_wait_time = parseInt(${gs.getProperty('glide.xmlhttp.ac_wait_time', 250)});\r\n\t\tvar g_ck = '$[gs.getSession().getSessionToken()]';\r\n\t\tvar coes = '${JS:coesString}';\r\n\t\tvar taskCreateTable = '${taskCreateTable}';\r\n\t\tvar taskFields = '${JS:taskFieldString}';\r\n\t\tvar userObject = '${JS:userObject}';\r\n\t\t\r\n\t\tvar links = '${linksString}';\r\n\t\tvar conversation = '${conversation}';\r\n\t\tvar collectionKey = '${collectionKey}';\r\n\t\tvar collectionId = '${collectionId}';\r\n\t\tvar leParentSysId = '${leParentSysId}';\r\n\t\tvar allActivitySetsFinished = '${allActivitySetsFinished}'\r\n\t\tvar universalReq = '${universalReq}';\r\n\t\tvar vipPriority = String(${gs.getProperty('sn_hr_core.hr_vip_default_priority', hr.DEFAULT_HIGH_PRIORITY) || '2'});\r\n\t\tvar translatedMessage = '${JS:translatedMessage}';\r\n\r\n\t\t// Prevent going back a page reusing the parameters\r\n\t\tvar url = new GlideURL(window.location.href);\r\n\t\turl.deleteParam('sysparm_conversation');\r\n\t\turl.deleteParam('sysparm_collection_key');\r\n\t\turl.deleteParam('sysparm_collectionID');\r\n\t\turl.deleteParam('sysparm_parent_le_case');\r\n\t\turl.deleteParam('sysparm_user');\r\n\t\turl.deleteParam('sysparm_profile');\r\n\t\turl.deleteParam('sysparm_universalReq');\r\n\t\tif (window.history $[AND] window.history.replaceState)\r\n\t\t\twindow.history.replaceState(null, document.title, url.getURL());\r\n\t</script>\r\n\t<style>\r\n\t\t/* Prevent collapse icon shifting around when page scrolls*/\r\n\t\tbody {\r\n\t\tmax-height:100%;\r\n\t\t}\r\n\r\n\t\t.outputmsg_div {\r\n\t\tdisplay: none !important;\r\n\t\t}\r\n\t\t\r\n\t\t.select2-container .select2-choice .select2-arrow {\r\n\t\tposition:absolute;\r\n\t\tright:4px;\r\n\t\t}\r\n\t\t\r\n\t\thtml[dir="rtl"] .select2-container .select2-choice .select2-arrow {\r\n\t\tposition:absolute;\r\n\t\tright:auto;\r\n\t\tleft: 4px;\r\n\t\t}\r\n\t\t\r\n\t\t.maincontent {\r\n\t\tmargin:-5px;\r\n\t\t}\r\n\r\n\t\t.notification-container {\r\n\t\tposition:absolute;\r\n\t\tz-index:999;\r\n\t\tmargin-right:30px;\r\n\t\twidth:calc(100% - 30px);\r\n\t\tmargin-left:8px;\r\n\t\t}\r\n\r\n\t\t#skip_verification_container {\r\n\t\tmargin-top:10px;\r\n\t\t}\r\n\t\t\r\n\t\t#skip_verification_container a {\r\n\t\tvertical-align:baseline;\r\n\t\tfont-family: SourceSansProSemibold, "Helvetica Neue", Arial;\r\n\t\t}\r\n\t\t\r\n\t\t.navbar-header .mobile-header-left{\r\n\t\tfloat: left;\r\n\t\t}\r\n\t\t\r\n\t\thtml[dir="rtl"] .navbar-header .mobile-header-left{\r\n\t\tfloat: right !important;\r\n\t\t}\r\n\t\t\r\n\t\thtml[dir="rtl"] .btn.btn-default.icon-chevron-left.navbar-btn{\r\n\t\tfloat: right !important;\r\n\t\t}\r\n\r\n\t\t.ev-container {\r\n\t\toverflow-y: scroll;\r\n\t\tpadding:10px 20px;\r\n\t\theight:100% !important;\r\n\t\t}\r\n\r\n\t\t.ev-container .form-group .form-field-addons {\r\n\t\tpadding-inline-start: 5px;\r\n\t\t}\r\n\r\n\t\t.ev-section:not(:first-of-type) {\r\n\t\tmargin-top:10px;\r\n\t\tpadding-top:7px;\r\n\t\tborder-top:1px solid RGB(var(--now-color_chrome--divider-0,170,170,170));\r\n\t\t}\r\n\r\n\t\t.ev-section.sole-section {\r\n\t\tmargin-top:0;\r\n\t\tpadding-top:0;\r\n\t\tborder-top:none;\r\n\t\t}\r\n\r\n\t\t.ev-section {\r\n\t\tpadding:0;\r\n\t\tmargin:0;\r\n\t\t}\r\n\r\n\t\t.timingDiv {\r\n\t\tdisplay:none;\r\n\t\tmargin-right:1.5rem;\r\n\t\t}\r\n\t\t\r\n\t\t.pointerhand {\r\n\t\tz-index:99;\r\n\t\t}\r\n\r\n\t\t.ev-section.state-closed button.icon-chevron-right {\r\n\t\t-webkit-transform: rotate(0deg);\r\n\t\t-ms-transform: rotate(0deg);\r\n\t\ttransform: rotate(0deg);\r\n\t\t}\r\n\r\n\t\t.ev-section button.icon-chevron-right {\r\n\t\theight: 32px;\r\n\t\twidth: 32px;\r\n\t\tpadding-bottom: 2px;\r\n\t\t-webkit-transition: -webkit-transform 0.3s;\r\n\t\t-ms-transition: -ms-transform 0.3s;\r\n\t\ttransition: transform 0.3s;\r\n\t\t-webkit-transform: rotate(90deg);\r\n\t\t-ms-transform: rotate(90deg);\r\n\t\ttransform: rotate(90deg);\r\n\t\tfont-size: 18px;\r\n\t\t}\r\n\r\n\t\ta.icon-location {\r\n\t\twidth:32px;\r\n\t\t}\r\n\t\t\r\n\t\t.tabs2_tab_header{\r\n\t\tbackground-color : transparent !important;\r\n\t\tmargin : 0 !important;\r\n\t\tpadding-block-start : unset !important;\r\n\t\t}\r\n\r\n\t\ta.deep-link {\r\n\t\theight:32px;\r\n\t\tmin-width:32px;\r\n\t\tmax-width:120px;\r\n\t\t}\r\n\r\n\t\t.ev-section-header {\r\n\t\tfont-size:20px;\r\n\t\tpadding-left:0px;\r\n\t\tmargin-bottom:15px;\r\n\t\t}\r\n\r\n\t\t.ev-section-collapse {\r\n\t\tfloat:right;\r\n\t\tpadding:0;\r\n\t\t}\r\n\r\n\t\t@media (max-width: 1199px) and (min-width: 800px) {\r\n\t\t.col-md-1_5 {\r\n\t\twidth:12.5% !important;\r\n\t\tmin-height:1px;\r\n\t\tfloat:left;\r\n\t\t}\r\n\t\t.col-md-10_5 {\r\n\t\twidth:calc(87.5% + 5px);\r\n\t\tfloat:left;\r\n\t\t}\r\n\t\t}\r\n\r\n\t\t.ev-field {\r\n\t\tpadding:0;\r\n\t\tmin-height:32px;\r\n\t\t}\r\n\r\n\t\t.ev-field-label {\r\n\t\tpadding:7px 2px 0 15px;\r\n\t\t}\r\n\r\n\t\t@media (min-width: 800px) {\r\n\t\t.ev-field-label {\r\n\t\ttext-align:right;\r\n\t\tpadding-left:0;\r\n\t\t}\r\n\t\t}\r\n\r\n\t\t.ev-input-group {\r\n\t\twidth:100%;\r\n\t\t}\r\n\r\n\t\t.ev-field-reference {\r\n\t\twidth:100%;\r\n\t\theight:32px;\r\n\t\tmargin:0;\r\n\t\tmin-width:1px !important;\r\n\t\t}\r\n\r\n\t\t.btn-primary[disabled], .btn-primary.disabled {\r\n\t\topacity: 0.57;\r\n\t\t}\r\n\r\n\t\t.btn-ref {\r\n\t\tcursor:pointer !important;\r\n\t\t}\r\n\r\n\t\t.ev-fields .select2-reference .select2-choice {\r\n\t\t}\r\n\t\t\r\n\t\t.input-group.inline-form.ev-input-group {\r\n\t\twhite-space:nowrap;\r\n\t\tdisplay:block;\r\n\t\t}\r\n\r\n\t\t.input-group-btn {\r\n\t\tdisplay:inline-block;\r\n\t\t}\r\n\r\n\t\t.button-column {\r\n\t\tmargin-left:1px;\r\n\t\t}\r\n\r\n\t\t.button-column BUTTON.btn:not(:last-child) {\r\n\t\tmargin-bottom:3px;\r\n\t\t}\r\n\r\n\t\t.ev-fields .select2-reference .select2-chosen {\r\n\t\tmargin-right:0 !important;\r\n\t\t}\r\n\t\t\r\n\t\thtml[dir="rtl"] .select2-chosen{\r\n\t\tmargin-right: 0px !important;\r\n\t\tmargin-left: 0px !important;\r\n\t\tpadding-right: 8px !important;\r\n\t\tpadding-left: 26px !important;\r\n\t\ttext-align: right !important;\r\n\t\t}\r\n\r\n\t\t.select2-search-choice-close {\r\n\t\tz-index:999;\r\n\t\tmargin-right:1.5rem;\r\n\t\t}\r\n\t\t\r\n\t\thtml[dir="rtl"] .select2-search-choice-close{\r\n\t\tright: auto;\r\n\t\tleft: 20px;\r\n\t\tmargin-right: 0px;\r\n\t\tmargin-left: 15px;\r\n\t\t}\r\n\r\n\t\t.ev-option-display-side {\r\n\t\tfloat:right;\r\n\t\t}\r\n\r\n\t\t.text-ellipsis {\r\n\t\ttext-overflow:ellipsis;\r\n\t\twhite-space:nowrap;\r\n\t\toverflow:hidden;\r\n\t\t}\r\n\r\n\t\t.ev-field-input {\r\n\t\twidth:100%;\r\n\t\tpadding:6px 9px;\r\n\t\tborder-radius:3px;\r\n\t\tborder:1px solid;\r\n\t\t}\r\n\r\n\t\t.ev-field-input.disabled,\r\n\t\t.select2-container.select2-container-disabled .select2-choice,\r\n\t\t.select2-container.select2-container-disabled .select2-choice .select2-arrow,\r\n\t\t.select2-container.select2-container-disabled .select2-choice abbr {\r\n\t\tcursor:not-allowed;\r\n\t\t}\r\n\r\n\t\t.select2-container.select2-container-disabled .select2-choice {\r\n\t\tborder: 1px solid;\r\n\t\t}\r\n\t\t\r\n\t\t.select2-container{\r\n\t\tdisplay: inline-grid; \r\n\t\t}\r\n\r\n\t\t.ev-field-checkbox-label {\r\n\t\tmargin:5px 0 0 0 !important;\r\n\t\t}\r\n\r\n\t\t.ev-field-choicelist {\r\n\t\twidth:100%;\r\n\t\t}\r\n\r\n\t\t.ev-field-duration-div .duration-input-group-container:first-child {\r\n\t\tmargin-bottom:4px;\r\n\t\t}\r\n\r\n\t\t.ev-field-duration-div .duration-input-group-container:not(:first-child) .duration-input-group {\r\n\t\twidth:33.3333%;\r\n\t\tfloat:left;\r\n\t\t}\r\n\r\n\t\t.ev-field-duration-div .duration-input-group-container:not(:first-child) .duration-input-group:not(:first-child) {\r\n\t\twidth:calc(33.3333% + 1px);\r\n\t\tmargin-left:-1px;\r\n\t\t}\r\n\r\n\t\t.ev-field-duration-div .duration-input-group-container:not(:first-child) .duration-input-group:not(:first-child) input {\r\n\t\tborder-radius:0;\r\n\t\t}\r\n\r\n\t\t.ev-field-duration-div .duration-input-group-container:not(:first-child) .duration-input-group:not(:last-child) span {\r\n\t\tborder-radius:0;\r\n\t\t}\r\n\r\n\t\t.ev-field-currency {\r\n\t\twidth:100%;\r\n\t\t}\r\n\r\n\t\t.ev-field-currency .select2-choice {\r\n\t\tborder-right:0 !important;\r\n\t\tborder-top-right-radius:0;\r\n\t\tborder-bottom-right-radius:0;\r\n\t\t}\r\n\r\n\t\t.ev-field-textarea {\r\n\t\twidth: 100%;\r\n\t\tword-wrap: break-word;\r\n\t\tresize: none;\r\n\t\theight: 64px;\r\n\t\tborder-radius:3px;\r\n\t\tresize:vertical;\r\n\t\t}\r\n\r\n\t\thtml[dir="rtl"] .ev-option-additional-display-fields{\r\n\t\t\ttext-align: left !important;\r\n\t\t\tpadding-right: 15px !important;\r\n\t\t\tpadding-left: 34px !important;\r\n\t\t}\r\n\t\t\r\n\t\tbody.-polaris .table tr th.col-control:first-child, body.-polaris .table tr th.list_decoration_cell:first-child, body.-polaris .table tr td.col-control:first-child, body.-polaris .table tr td.list_decoration_cell:first-child {\r\n\t\tpadding-inline-start : unset !important;\r\n\t\t}\r\n\t\t\r\n\t\t.glidelist-box SELECT {\r\n\t\theight:137px;\r\n\t\t}\r\n\r\n\t\t.glidelist-icons .button-column .btn {\r\n\t\twidth:32px;\r\n\t\theight:32px;\r\n\t\t}\r\n\r\n\t\t.glide-listref .select2-container {\r\n\t\tmargin-top:4px;\r\n\t\t}\r\n\r\n\t\t.no-padding {\r\n\t\tpadding:0 !important;\r\n\t\t}\r\n\r\n\t\t.tab_header {\r\n\t\toutline: 0;\r\n\t\t}\r\n\r\n\t\t.tabs2_tab {\r\n\t\tborder-right: 1px solid !important;\r\n\t\t}\r\n\r\n\t\t.sn-list-container {\r\n\t\tborder: 1px solid RGB(var(--now-color_chrome--divider-0,170,170,170)) !important;\r\n\t\t}\r\n\r\n\t\t.navbar {\r\n\t\tmargin:0 !important;\r\n\t\t}\r\n\r\n\t\t.navbar-right button:not(:first-child) {\r\n\t\tmargin-left:8px;\r\n\t\t}\r\n\r\n\t\t.ui-action-btn {\r\n\t\tmargin: -17px 0 0 0 !important;\r\n\t\t}\r\n\r\n\t\t.list-footer-rows {\r\n\t\tdisplay: none !important;\r\n\t\t}\r\n\r\n\t\t.view-tabs.nav-segmented.pull-left {\r\n\t\tpadding:0;\r\n\t\t}\r\n\r\n\t\t.footer-container .list-bottom {\r\n\t\tposition:relative;\r\n\t\t}\r\n\t\t\r\n\t\t.notification {\r\n\t\t\tmargin-bottom: 0px;\r\n\t\t}\r\n\t\t\r\n\t\t.error-message {\r\n\t\t\tpadding-top: 10px;\r\n\t\t\tpadding-bottom: 10px;\r\n\t\t\tpadding-left: 15px;\r\n\t\t\tpadding-right: 15px;\r\n\t\t}\r\n\t\t\r\n\t\t.state-closed .section-content {\r\n\t\t\topacity:0 !important;\r\n\t\t\tdisplay:none !important;\r\n\t\t}\r\n\t\t\r\n\t\t.form-control.select2-offscreen {\r\n\t\tvisibility: hidden!important;\r\n\t\t}\r\n\t\t\r\n\t\t.ev-field-reference.select2-offscreen {\r\n\t\tvisibility: hidden!important;\r\n\t\t}\r\n\t\t\r\n\t\t .select2-focusser.select2-offscreen {\r\n\t\t\twidth:100% !important;\r\n\t\t\theight:100% !important;\r\n\t\t}\r\n\t\t\r\n\t\t#related_lists.section-content {\r\n\t\t\toverflow:visible;\r\n\t\t}\r\n\r\n\t\t.display-order-popover {\r\n\t\t\tmax-width: 100%;\r\n\t\t\twidth: 50%;\r\n\t\t}\r\n\t\t\r\n\t\t.display-order-popover table {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\t\t\r\n\t\t.current-task td:first-child::before {\r\n\t\t\tcontent: '';\r\n\t\t\tdisplay: inline-block;\r\n\t\t\theight: 1.3em;\r\n\t\t\twidth: 5px;\r\n\t\t\tmargin-right: 3px;\r\n\t\t\tvertical-align: middle;\r\n\t\t}\r\n\t\t\r\n\t\t#ev_information, #ev_case {\r\n\t\t\tbackground-color: RGB(var(--now-color_background--secondary,var(--now-color--neutral-1,246,247,247)));\r\n\t\t}\r\n\t\t\r\n\t\t#tabs2 {\r\n\t\t\tbackground-color: RGB(var(--now-color_background--secondary,var(--now-color--neutral-1,246,247,247))) !important;\r\n\t\t}\r\n\t\t\r\n\t\t#email_btn {\r\n\t\t\tz-index: 3;\r\n\t\t}\r\n\r\n\t\tHTML[data-doctype=true] .section_header_content_no_scroll {\r\n\t\t\tpadding-left: 15px;\r\n\t\t\tpadding-right: 15px;\r\n\t\t\tpadding-bottom: 10px;\r\n\t\t}\r\n\r\n\t\tH1.form_header {\r\n\t\t\tcolor: inherit;\r\n\t\t}\r\n\r\n\t\t/* Override CSS START */\r\n\t\tdiv.select2-search::after, .select2-no-results, .select2-drop, .select2-search-choice-close {\r\n\t\t\tcolor: RGB(var(--now-color_text--primary,var(--now-color--neutral-18,22,27,28)));\r\n\t\t}\r\n\r\n\t\t.sn-breadcrumb {\r\n\t\t\twidth: 100%;\r\n\t\t}\r\n\r\n\t\t.ng-filter-widget {\r\n\t\t\tfloat: left;\r\n\t\t}\r\n\r\n\t\ttd.col-control {\r\n\t\t\tbackground: transparent !important;\r\n\t\t}\r\n\t\t.breadcrumb-container {\r\n\t\t\tcolor: RGB(var(--now-color_text--primary,var(--now-color--neutral-18,22,27,28)));\r\n\t\t}\r\n\r\n\t\t.sn-breadcrumb, span.sn-breadcrumb-link, button.sn-breadcrumb-link {\r\n\t\t\tcolor: RGB(var(--now-color_text--primary,var(--now-color--neutral-18,22,27,28)));\r\n\t\t}\r\n\t\t.sn-breadcrumb a {\r\n\t\t\tcolor: RGB(var(--now-text-link--primary--color,var(--now-color--link-2,1,119,142)));\r\n\t\t}\r\n\t\tbutton.sn-breadcrumb-link {\r\n\t\t\tbackground-color: inherit;\r\n\t\t}\r\n\t\t.input-group-transparent .input-group-addon-transparent.icon-filter {\r\n\t\t\tposition: revert;\r\n\t\t}\r\n\t\t/* Override CSS END */\r\n\t\t\r\n\t\t/* High Contrast Mode Support for Select2 Focus Visibility - WCAG 2.1 Compliant */\r\n\t\t@media (-ms-high-contrast: active) {\r\n\t\t\t.select2-container-active .select2-choice, \r\n\t\t\t.select2-focusser:focus { \r\n\t\t\t\toutline: 2px solid ButtonText !important; \r\n\t\t\t\toutline-offset: 2px !important;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t@media (prefers-contrast: high) {\r\n\t\t\t.select2-container-active .select2-choice, \r\n\t\t\t.select2-focusser:focus { \r\n\t\t\t\toutline: 2px solid RGB(var(--now-color--focus-1, 0, 115, 230)) !important; \r\n\t\t\t\toutline-offset: 2px !important;\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t/* Ensure focus visibility for keyboard navigation - WCAG 2.4.7 */\r\n\t\t.select2-container-active .select2-choice:focus-visible,\r\n\t\t.select2-focusser:focus-visible {\r\n\t\t\toutline: 2px solid RGB(var(--now-color--focus-1, 0, 115, 230)) !important;\r\n\t\t\toutline-offset: 2px !important;\r\n\t\t}\r\n\t\t\r\n\t\t/* Fix Select2 Dropdown Text Contrast - WCAG AA Compliant */\r\n\t\t.select2-drop .select2-results .select2-highlighted {\r\n\t\t\tborder: 3px solid RGB(var(--now-color--focus-1, 0, 115, 230)) !important;\r\n\t\t}\r\n\r\n\t\t/* TinyMCE editor styling in ev-field */\r\n\t\t.ev-field-input-div .mce-tinymce {\r\n\t\t\tmin-height: 150px;\r\n\t\t\twidth: 100% !important;\r\n\t\t}\r\n\t\t.ev-field-input-div .mce-edit-area iframe {\r\n\t\t\tmin-height: 100px;\r\n\t\t}\r\n\r\n\t</style>\r\n\r\n\t<div id="case_creation_container" class="maincontent ng-cloak" ng-controller="NgCaseCreation" role="main">\r\n\t\t<!-- Messages -->\r\n\t\t<now-message key="List Calculations" value="${JS,HTML:gs.getMessage('List Calculations')}"></now-message>\r\n\t\t<now-message key="Sort in descending order" value="${JS,HTML:gs.getMessage('Sort in descending order')}"></now-message>\r\n\t\t<now-message key="Sort in ascending order" value="${JS,HTML:gs.getMessage('Sort in ascending order')}"></now-message>\r\n\t\t<now-message key="Hide column search row" value="${JS,HTML:gs.getMessage('Hide column search row')}"></now-message>\r\n\t\t<now-message key="Show column search row" value="${JS,HTML:gs.getMessage('Show column search row')}"></now-message>\r\n\t\t<now-message key="Preview {0}" value="${JS,HTML:gs.getMessage('Preview {0}')}"></now-message>\r\n\r\n\t\t<!-- Navbar -->\r\n\t\t<div class="section_header_div_no_scroll form_title" style="height:46px;">\r\n\t\t\t<nav class="navbar navbar-default" role="navigation" style="max-height:100%;" aria-label="${gs.getMessage('Case Creation')}">\r\n\t\t\t\t<div class="container-fluid">\r\n\t\t\t\t\t<div class="navbar-header mobile-header-left">\r\n\t\t\t\t\t\t<div class="navbar-header navbar-heading-wrap">\r\n\t\t\t\t\t\t\t<button title="${gs.getMessage('Back')}" aria-label="${gs.getMessage('Back')}" class="btn btn-default icon-chevron-left navbar-btn" style="padding:6px 9px; margin-left:4px; float:left; margin-right:5px;" onclick="window.history.go(-1);"></button>\r\n\t\t\t\t\t\t\t<div class="form_header" style="margin-top:5px;">\r\n\t\t\t\t\t\t\t\t<h1 class="form_header">${gs.getMessage("Case Creation")}</h1>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="navbar-right" style="float:right;">\r\n\t\t\t\t\t\t<button class="btn btn-primary" ng-click="createCase()" ng-disabled="clearForm || creatingCase || fetchingFields" aria-label="${gs.getMessage('Create Case')}" role="button">${gs.getMessage('Create Case')}</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</nav>\r\n\t\t</div>\r\n\t\t<!-- Error Message -->\r\n\t\t<div role="alert" class="error-message">\r\n\t\t\t<div class="notification notification-danger" ng-if="showError" aria-label="{<!-- -->{errorMessage}}" aria-live="polite">\r\n\t\t\t\t<span class="notification-icon icon-cross-circle">\r\n\t\t\t\t\t<span class="sr-only">${gs.getMessage('Error Message')}</span>\r\n\t\t\t\t</span>\r\n\t\t\t\t\t{<!-- -->{errorMessage}}\r\n\t\t\t\t<button class="btn btn-icon close icon-cross" ng-click="toggleErrorMessage(false, null)" aria-label="${gs.getMessage('Close Messages')}" role="button"></button>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t\t<!-- Form -->\r\n\t\t<div class="ev-container section_header_content_no_scroll touch_scroll" role="form">\r\n\t\t\t<!-- Employee Search Section -->\r\n\t\t\t<div class="row ev-section" ng-show="!skippedVerification">\r\n\t\t\t\t<h2 class="col-xs-12 ev-section-header">\r\n\t\t\t\t\t${gs.getMessage("Search for Employee")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<div class="col-xs-12 no-padding form-group">\r\n\t\t\t\t\t<div class="hidden-xs hidden-sm col-md-1_5 col-lg-2 control-label ev-field-label" />\r\n\t\t\t\t\t<div class="col-xs-10 col-md-9 col-lg-8 form-field input_controls">\r\n\t\t\t\t\t\t<input id="search_input" class="select2 form-control ev-field-input-select ev-field-reference" aria-hidden="true"/>\r\n\t\t\t\t\t\t<j:if test="${evConfig.allowSkippingVerification}">\t\r\n\t\t\t\t\t\t<div id="skip_verification_container" />\r\n\t\t\t\t\t\t</j:if>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col-xs-2 col-md-1_5 col-lg-2 form-field-addons" ng-if="profile" ng-show="profile $[AND] profile.hasOwnProperty('sys_id')">\r\n\t\t\t\t\t\t<button id="profile_{<!-- -->{profile.sys_id}}" \r\n\t\t\t\t\t\t\t\tname="profile_{<!-- -->{profile.sys_id}}"\r\n\t\t\t\t\t\t\t\ttitle="{<!-- -->{profile.tooltip}} - {<!-- -->{profile.display}}"\r\n\t\t\t\t\t\t\t\taria-haspopup="true"\r\n\t\t\t\t\t\t\t\tclass="btn btn-default btn-ref icon-info"\r\n\t\t\t\t\t\t\t\tng-click="showRefPopup($event, profile);"\r\n\t\t\t\t\t\t\t\taria-label="${gs.getMessage('Open searched record in current window - ')} {<!-- -->{profile.display}}">\r\n\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t<a class="btn btn-default text-ellipsis deep-link" \r\n\t\t\t\t\t\t ng-show="profile.links $[AND] profile.links.length" \r\n\t\t\t\t\t\t ng-repeat="link in profile.links"\r\n\t\t\t\t\t\t title="{<!-- -->{sanitize(link.url)}}" \r\n\t\t\t\t\t\t ng-click="openLink(link)" \r\n\t\t\t\t\t\t href="">\r\n\t\t\t\t\t\t\t{<!-- -->{sanitize(link.btnName)}}\r\n\t\t\t\t\t\t</a>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<!-- Employee Information Fields Section -->\r\n\t\t\t<div class="row ev-section ng-cloak" id="section-ev_information" ng-if="!skippedVerification $[AND] profile.sys_id $[AND] (profile.task || profile.left_fields.length || profile.right_fields.length)">\r\n\t\t\t\t<h2 class="col-xs-11 no-padding ev-section-header">\r\n\t\t\t\t\t${gs.getMessage("Employee Information")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<div class="col-xs-1 ev-section-collapse">\r\n\t\t\t\t\t<span style="float:right;">\r\n\t\t\t\t\t\t<g:call function="collapsing_image.xml" id="ev_information"\r\n\t\t\t\t\t\t\t\tfirst_section_id="ev_information"\r\n\t\t\t\t\t\t\t\timage_alt="${gs.getMessage('Collapse')}"\r\n\t\t\t\t\t\t\t\tsection_title="${gs.getMessage('Employee Information')}"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="col-xs-12 form-horizontal no-padding section-content" id="ev_information">\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t\t<ev-field ng-if="profile.task" field="profile.task" disabled="true" ></ev-field>\r\n\t\t\t\t\t\t<ev-field field="field" disabled="true" ng-repeat="field in profile.left_fields"/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t<ev-field field="field" disabled="true" ng-repeat="field in profile.right_fields"/>\r\n\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<!-- Task Creation Section -->\r\n\t\t\t<div class="row ev-section ng-cloak" id="section-ev_case" ng-class="{'sole-section': skippedVerification}" style="display:none">\r\n\t\t\t\t<h2 class="col-xs-11 no-padding ev-section-header">\r\n\t\t\t\t\t${gs.getMessage("Case Details")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<div class="col-xs-1 ev-section-collapse">\r\n\t\t\t\t\t<span style="float:right;" ng-show="!skippedVerification">\r\n\t\t\t\t\t\t<g:call function="collapsing_image.xml" id="ev_case"\r\n\t\t\t\t\t\t\t\tfirst_section_id="ev_case"\r\n\t\t\t\t\t\t\t\timage_alt="${gs.getMessage('Collapse')}"\r\n\t\t\t\t\t\t\t\tsection_title="${gs.getMessage('Case Details')}"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="col-xs-12 form-horizontal no-padding section-content" id="ev_case">\r\n\t\t\t\t\t<div ng-if="isChildOfUR" class="fieldmsg-container col-xs-12 form-horizontal form-group" aria-live="polite">\r\n\t\t\t\t\t\t<div class="fieldmsg notification notification-info">${gs.getMessage('Enter additional details about the issue or request in Work notes of the HR Case to help the HR agent provide quick resolution.')}\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t\t<div class="ev-field form-group">\r\n\t\t\t\t\t\t\t<label ng-class="classes.label" for="coe_input" id="coe_input_label">\r\n\t\t\t\t\t\t\t\t<span title="${coeHint}">${coeLabel}</span>\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t<div class="ev-field-input-div" ng-class="classes.field">\r\n\t\t\t\t\t\t\t\t<input id="coe_input" class="select2 form-control ev-field ev-field-reference"/>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t\t<div class="ev-field form-group" ng-class="missingService ? 'is-required' : 'is-filled'">\r\n\t\t\t\t\t\t\t<label ng-class="classes.label" for="service_input" id="service_input_label">\r\n\t\t\t\t\t\t\t\t<span class="required-marker" mandatory="true" aria-label="${gs.getMessage('Mandatory - must be populated before submit')}" title="${gs.getMessage('Mandatory - must be populated before submit')}"></span>\r\n\t\t\t\t\t\t\t\t<span title="${serviceHint}">${serviceLabel}</span>\r\n\t\t\t\t\t\t\t</label>\r\n\t\t\t\t\t\t\t<div class="ev-field-input-div" ng-class="classes.field">\r\n\t\t\t\t\t\t\t\t<input id="service_input" class="select2 form-control ev-field ev-field-reference" aria-required="{<!-- -->{missingService}}"/>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t\t<ev-field field="field" ng-repeat="field in taskFields.left_fields" ng-if="!field.hidden"/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="vsplit col-xs-12 col-sm-6 ev-fields">\r\n\t\t\t\t\t\t<ev-field field="field" ng-repeat="field in taskFields.right_fields" ng-if="!field.hidden"/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col-xs-12 ev-fields">\r\n\t\t\t\t\t\t<ev-field field="field" wide="true" ng-repeat="field in taskFields.bottom_fields" ng-if="!field.hidden"/>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="col-xs-12" style="margin-top:15px; padding-left:4px;">\r\n\t\t\t\t\t\t<button class="btn btn-primary" ng-click="createCase()" ng-disabled="clearForm || creatingCase || fetchingFields" aria-label="${gs.getMessage('Create Case')}" role="button">${gs.getMessage('Create Case')}</button>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t\t<!-- Related List Section -->\r\n\t\t\t<div class="row ev-section ng-cloak" id="section-related_lists" ng-show="profile.sys_id $[AND] relatedLists.length $[AND] activeListExists()" ng-if="profile">\r\n\t\t\t\t<h2 class="col-xs-11 no-padding ev-section-header">\r\n\t\t\t\t\t${gs.getMessage("Related Case Information")}\r\n\t\t\t\t</h2>\r\n\t\t\t\t<div class="col-xs-1 ev-section-collapse">\r\n\t\t\t\t\t<span style="float:right;">\r\n\t\t\t\t\t\t<g:call function="collapsing_image.xml" id="related_lists"\r\n\t\t\t\t\t\t\t\tfirst_section_id="related_lists"\r\n\t\t\t\t\t\t\t\timage_alt="${gs.getMessage('Collapse')}"\r\n\t\t\t\t\t\t\t\tsection_title="${gs.getMessage('Related Case Information')}"\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t</span>\r\n\t\t\t\t</div>\r\n\t\t\t\t<div class="col-xs-12 no-padding section-content" id="related_lists">\r\n\t\t\t\t\t<div id="tabs2" class="tabs2_strip tabs2_tab_header" role="tablist" aria-label="${gs.getMessage('Related Case Information')}">\r\n\t\t\t\t\t\t<span class="tab_header" ng-repeat="list in relatedLists" ng-click="showList(list)" ng-hide="list.hide" role="tab">\r\n\t\t\t\t\t\t\t<span class="tabs2_tab" ng-class="{'tabs2_active': list.active}">\r\n\t\t\t\t\t\t\t\t<span class="tab_caption_text">\r\n\t\t\t\t\t\t\t\t\t{<!-- -->{list.properties.displayLabel}}\r\n\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t</span>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t\t<div class="tab-pane" ng-repeat="list in relatedLists">\r\n\t\t\t\t\t\t<div role="tabpanel" class="tab-pane" aria-label="{<!-- -->{list.properties.displayLabel}}" ng-show="isListActive(list)">\r\n\t\t\t\t\t\t\t<sn-list table="list.table"\r\n\t\t\t\t\t\t\t\t view="list.view"\r\n\t\t\t\t\t\t\t\t parameters="list.parameters"\r\n\t\t\t\t\t\t\t\t properties="list.properties"\r\n\t\t\t\t\t\t\t\t include="list.include"\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</div>\r\n</j:jelly>]]></html>\r\n <name>case_creation</name>\r\n <processing_script/>\r\n <sys_class_name>sys_ui_page</sys_class_name>\r\n <sys_created_by>admin</sys_created_by>\r\n <sys_created_on>2017-06-13 18:18:01</sys_created_on>\r\n <sys_id>3433fb86eb533200a9e7e26ac106fef2</sys_id>\r\n <sys_mod_count>511</sys_mod_count>\r\n <sys_name>case_creation</sys_name>\r\n <sys_package display_value="Human Resources: Core" source="sn_hr_core">d4ac3fff5b311200a4656ede91f91af2</sys_package>\r\n <sys_policy>read</sys_policy>\r\n <sys_scope display_value="Human Resources: Core">d4ac3fff5b311200a4656ede91f91af2</sys_scope>\r\n <sys_update_name>sys_ui_page_3433fb86eb533200a9e7e26ac106fef2</sys_update_name>\r\n <sys_updated_by>admin</sys_updated_by>\r\n <sys_updated_on>2026-04-12 11:13:00</sys_updated_on>\r\n </sys_ui_page>\r\n <sys_es_latest_script action="INSERT_OR_UPDATE">\r\n <id>3433fb86eb533200a9e7e26ac106fef2</id>\r\n <sys_created_by>admin</sys_created_by>\r\n <sys_created_on>2024-12-30 07:55:27</sys_created_on>\r\n <sys_id>221c6bdd9ff6521078035b091b0a1c87</sys_id>\r\n <sys_mod_count>0</sys_mod_count>\r\n <sys_updated_by>admin</sys_updated_by>\r\n <sys_updated_on>2024-12-30 07:55:27</sys_updated_on>\r\n <table>sys_ui_page</table>\r\n <use_es_latest>false</use_es_latest>\r\n </sys_es_latest_script>\r\n</record_update></code></pre>\r\n<p> </p>\r\n<p> </p></div><div><br /><strong>Related Problem: PRB2007826</strong></div></div>"}</script>