{"version":3,"sources":["hicomWidgets.ts"],"names":["HicomPopover","GetKendoTemplateHtml","templateId","data","kendo","template","$","html","GetPartialViewContent","url","let","retVal","ajax","success","status","cache","async","_init","_dropdownTriggersList","slice","call","document","querySelectorAll","map","trigger","addEventListener","element","forEach","e","target","getAttribute","bootstrap","Dropdown","getInstance","hide","contentType","$dropDownContentElement","parentElement","querySelector","templateContent","JSON","parse","decodeURIComponent","partialViewContent","popperConfig","defaultBsPopperConfig","modifiers","name","options","HicomTelephone","elementId","window","intlTelInputGlobals","getElementById","UpdateValues","ele","intl","countryCodeElement","dataset","countryCodeElementId","nationalElement","nationalElementId","isValidNumber","value","getNumber","getSelectedCountryData","dialCode","intlTelInputUtils","numberFormat","NATIONAL","UpdateValuesForForm","formId","id","HicomTextarea","UpdateWordCountLabel","String","trim","innerHTML","HicomTextUtils","GetWordCount","UpdateCharacterCountLabel","length","AutoResizeHeight","style","height","scrollHeight","HicomTreeView","SetValidationMessage","message","append","HicomMultiSelect","SetTagMode","maxSelectedItemsDisplayedInSingleTagMode","selectedValues","currentTagMode","tagMode","newTagMode","setOptions","SelectAllItems","multiSelect","dataValueField","currentValues","values","dataSource","view","dataItem","el","indexOf","push","input","val","close","closest","DeselectAllItems","HicomDropDownTree","maxSelectedItemsDisplayedInMultipleTagMode","dropdowntree","setTimeout","newDDT","thisId","newDropDownTreeInput","thisHiddenId","hiddenInputAnchor","thisSelectedValues","grep","insertBefore","parent","destroy","remove","insertAfter","kendoDropDownTree","SetHiddenValues","idValues","ddt","join","this","MultiSelectHousekeeping","selectedItems","find","firstChip","text","show","HicomFileUploadedDisplay","OnRemove","rowId","fileName","deleteUrl","kendoDialog","closable","title","content","actions","action","fetch","method","then","ok","kendoAlert","open","catch","console","error","primary","center","OnDeferredRemove","deferredDeletedIdsName","deferredDeletedNamesName","fileId","deferredFileEncryptedId","placeholder","isDirtyTotalTracker","css","OnDeferredUndo","HicomHelper","HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY","SetLastSelectedTabID","controller","tabContainerId","tabId","tabConfig","sessionStorage","tabIndex","findIndex","x","tabConfigData","splice","stringify","GetLastSelectedTabID","ClearLastSelectedTabID","filter","FocusOnFormControl","focusFn","parentTabContainer","parents","tabName","tab","Tab","GetFocusFunctionById","hicomRole","kendoElement","focus","preventScroll","UpdateDateTimeOffsetValuesForForm","offset","type","HicomPassword","TogglePasswordReveal","$element","passwordElementId","$passwordElement","attr","toggleClass","HicomDateTime","SetDateToNow","dateControlId","currentDate","moment","Date","format","SetDateTimeToNow","currentDateTime","SetTimeToNow","currentTime","HicomTabs","InitialiseLoadOnDemand","hicomPage","loadHtml","HicomTooltip","LoadTooltips","tooltipTriggerEl","Tooltip","ToggleToolTipText","originalTitle","newTitle","lastTitle","tooltip","HicomDateRangePickerType","HicomDateRangePicker","HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME","HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME","UNIT_DELIMITER","fromCharCode","KENDO_FORMAT_ISO_DATE_ONLY_FORMAT","DATE_RANGE_PICKER_DISPLAY_SEPARATOR","SetLocalisedDateRange","datePickerElementName","kendoCultureShortDatePattern","$dateRangePicker","isoDate","dates","Array","from","split","formattedDates","d","toString","parseDate","SetISODateRange","dateRangePicker","startDateElementName","endDateElementName","startDate","toDate","endDate","_type","_datePickerElementName","_$datePicker","_kendoCultureShortDatePattern","constructor","DataCapture","defaultDateRange","initStartDate","initEndDate","subtract","startOf","endOf","isInitiallyBlank","daterangepicker","autoUpdateInput","alwaysShowCalendars","locale","cancelLabel","toUpperCase","ranges","Today","Yesterday","Last 7 Days","Last 30 Days","This Month","Last Month","start","end","label","on","picker","hdnStartDate","hdnEndDate","HicomDirtyForms","setDirtyStatus","setStartDate","setEndDate","ev","GridFilter","PageStateAccordion","pageState","attrSaveState","attributes","getNamedItem","toLowerCase","event","debug","key","_savePageState","accordionState","_retrievePageState","state","Collapse","tabState","setPageStateItem","getPageStateItem","PageStateTabs","lastSelectedTab"],"mappings":"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","file":"hicomWidgets.js","sourcesContent":["/// \r\n/// \r\n\r\n/** Concrete implementation of Hicom popover\r\n*/\r\nclass HicomPopover implements IHicomPopover {\r\n\r\n /** Get Kendo template and populate it with the supplied data - MOVE TO UTILS ONCE ONE DEFINED\r\n * @@param {string} templateId - Id of the script tag of type 'text/x-kendo-template' containing the Kendo template definition\r\n * @@param {any} data - Data to be supplied to the template\r\n * @@returns {string} - HTML\r\n */\r\n static GetKendoTemplateHtml(templateId = '', data = {}) {\r\n let $template = kendo.template($(`#${templateId}`).html());\r\n return $template(data);\r\n }\r\n\r\n /** Get Partial View content from the supplied URL - MOVE TO UTILS ONCE ONE DEFINED\r\n * @@param {string} url - GET URL of the partital view action\r\n * @@returns {string} - HTML\r\n */\r\n static GetPartialViewContent(url = '') {\r\n let retVal = '';\r\n\r\n $.ajax({\r\n url: url,\r\n success: function (data, status) {\r\n retVal = data;\r\n },\r\n cache: false,\r\n async: false\r\n });\r\n\r\n return retVal;\r\n }\r\n\r\n /** Generate Hicom popovers where target class data attributes defined\r\n */\r\n static _init() {\r\n let _dropdownTriggersList = [].slice.call(document.querySelectorAll('.hicom-popover-target[data-bs-toggle=\"dropdown\"]'));\r\n let _dropdownsList = _dropdownTriggersList.map(trigger => {\r\n\r\n /** When the bootstrap dropdown trigger is clicked, BEFORE the dropdown is displayed ask all other dropdown 'popovers' to hide themselves\r\n *\r\n */\r\n trigger.addEventListener('show.bs.dropdown', element => {\r\n // Close all 'popover' dropdowns except 'this'\r\n _dropdownTriggersList.forEach(e => {\r\n if (element.target.getAttribute('id') != e.getAttribute('id')) {\r\n // @ts-ignore\r\n bootstrap.Dropdown.getInstance(e).hide();\r\n }\r\n });\r\n });\r\n\r\n /** When the bootstrap dropdown trigger is clicked, AFTER the dropdown is display refresh the actual content (if dynamically generated)\r\n * \r\n */\r\n trigger.addEventListener('shown.bs.dropdown', element => {\r\n let contentType = element.target.getAttribute('data-content-type');\r\n let $dropDownContentElement = $(element.target.parentElement.querySelector('.dropdown-content'));\r\n\r\n switch (contentType) {\r\n case 'Template':\r\n let templateContent = HicomPopover.GetKendoTemplateHtml(element.target.getAttribute('data-template-id'), JSON.parse(decodeURIComponent(element.target.getAttribute('data-template-json'))));\r\n $dropDownContentElement.html(templateContent);\r\n break;\r\n\r\n case 'PartialView':\r\n let partialViewContent = HicomPopover.GetPartialViewContent(element.target.getAttribute('data-partial-url'));\r\n $dropDownContentElement.html(partialViewContent);\r\n break;\r\n\r\n case 'Static':\r\n default:\r\n return;\r\n break;\r\n }\r\n });\r\n\r\n /** When the dropdown header 'X' is clicked, trigger the hide() as per the user clicking on the trigger icon again\r\n * \r\n */\r\n trigger.parentElement.querySelector('button.hicom-popover-close').addEventListener('click', element => {\r\n // @ts-ignore\r\n bootstrap.Dropdown.getInstance(trigger).hide();\r\n });\r\n\r\n // @ts-ignore\r\n return new bootstrap.Dropdown(trigger, {\r\n popperConfig: function (defaultBsPopperConfig) {\r\n // Commented this out as introducing some css that positions the related arrow better\r\n //defaultBsPopperConfig.placement = 'bottom-start';\r\n\r\n defaultBsPopperConfig.modifiers[2] = {\r\n \"name\": \"arrow\",\r\n \"options\": {\r\n \"element\": \".arrow\"\r\n }\r\n };\r\n\r\n return defaultBsPopperConfig;\r\n }\r\n });\r\n });\r\n }\r\n}\r\n\r\n/** Concrete implementation of Hicom Telephone fields\r\n*/\r\nclass HicomTelephone implements IHicomTelephone {\r\n\r\n /** Get IntlTelInput reference of the Hicom telephone field\r\n * @@param {string} elementId - Element id\r\n * @@returns {object} - IntlTelInput reference\r\n */\r\n static getInstance(elementId) {\r\n // @ts-ignore\r\n return window.intlTelInputGlobals.getInstance(document.getElementById(elementId));\r\n }\r\n\r\n /** Update the Hicom telephone field 'country code' and 'national' automatically generated fields\r\n * @@param {string} elementId - Element id\r\n */\r\n static UpdateValues(elementId) {\r\n const ele = document.getElementById(elementId);\r\n // @ts-ignore\r\n const intl = window.intlTelInputGlobals.getInstance(ele);\r\n const countryCodeElement = document.getElementById(ele.dataset.countryCodeElementId);\r\n const nationalElement = document.getElementById(ele.dataset.nationalElementId);\r\n\r\n if (intl.isValidNumber()) {\r\n // @ts-ignore\r\n ele.value = intl.getNumber(); // Hidden mechanism can do thus automatically - but that wont work with Ajax\r\n // @ts-ignore\r\n countryCodeElement.value = intl.getSelectedCountryData().dialCode;\r\n // @ts-ignore\r\n nationalElement.value = intl.getNumber(intlTelInputUtils.numberFormat.NATIONAL);\r\n }\r\n }\r\n\r\n /** Update the Hicom telephone field 'country code' and 'national' automatically generated fields for the entire form\r\n * @@param {string} formId - form id\r\n */\r\n static UpdateValuesForForm(formId) {\r\n const form = document.getElementById(formId);\r\n\r\n var telephoneElements = form.querySelectorAll('input[data-hicom-role=hicom-telephone]');\r\n\r\n telephoneElements.forEach(ele => {\r\n HicomTelephone.UpdateValues(ele.id);\r\n });\r\n\r\n }\r\n\r\n}\r\n\r\n/** Concrete implementation of Hicom Textarea fields\r\n*/\r\nclass HicomTextarea implements IHicomTextarea {\r\n\r\n /** Update the Hicom word count progress field\r\n * IMPORTANT: This should match the fluent validator in 'HicomValidatorExtensions.cs' - 'MaxWordsValidator'\r\n */\r\n static UpdateWordCountLabel(elementId) {\r\n\r\n let ele = document.getElementById(elementId);\r\n let target = document.getElementById(`wordcount-${elementId}`);\r\n\r\n // Trim, strip HTML and punctuation, reduce multiple spaces to a single space and split by space to get the count of words\r\n const value = String(ele.value.trim());\r\n\r\n if (target) {\r\n // @ts-ignore\r\n target.innerHTML = value !== '' ? HicomTextUtils.GetWordCount(value) : 0;\r\n }\r\n\r\n }\r\n\r\n /** Update the Hicom character count progress field\r\n * IMPORTANT: This should match the fluent validator in 'HicomValidatorExtensions.cs' - 'MaximumLength' validator - so that case it's string.length without trimming\r\n */\r\n static UpdateCharacterCountLabel(elementId) {\r\n\r\n let ele = document.getElementById(elementId);\r\n let target = document.getElementById(`charactercount-${elementId}`);\r\n\r\n const value = String(ele.value);\r\n\r\n if (target) {\r\n // @ts-ignore\r\n target.innerHTML = value.length;\r\n }\r\n\r\n }\r\n\r\n /**\r\n * Resize the height of the textarea automatically based on the content\r\n * @param element\r\n */\r\n static AutoResizeHeight(element) {\r\n element.style.height = 'auto'; // Reset height to allow for shrinking\r\n element.style.height = element.scrollHeight + 'px'; // Set height based on scrollHeight\r\n }\r\n}\r\n\r\nclass HicomTreeView implements IHicomTreeView {\r\n\r\n static SetValidationMessage(id: string, data, message: string): void {\r\n\r\n if (data == null) {\r\n $('#' + id).append('
' + message + '
');\r\n }\r\n }\r\n}\r\n/**\r\n * Concrete implementation of Hicom MultiSelect controls \r\n */\r\nclass HicomMultiSelect implements IHicomMultiSelect {\r\n\r\n /** \r\n * Sets the TagMode of a given HicomMultiSelect from Multiple to Single if the number of selected items exceeds the maxSelectedItemsDisplayedInSingleTagMode\r\n * @param {kendo.ui.MultiSelect} e - The Hicom MultiSelect control\r\n * @param {number} maxSelectedItemsDisplayedInSingleTagMode - The maximum number of selected items before tag mode changes from Multiple to Single\r\n */\r\n static SetTagMode(e: kendo.ui.MultiSelect, maxSelectedItemsDisplayedInSingleTagMode: number) {\r\n\r\n\r\n var selectedValues = e.value();\r\n var currentTagMode = e.options.tagMode;\r\n var newTagMode = selectedValues.length <= maxSelectedItemsDisplayedInSingleTagMode ? \"multiple\" : \"single\";\r\n\r\n if (newTagMode != currentTagMode) {\r\n e.value([]);\r\n e.setOptions({ tagMode: newTagMode });\r\n e.value(selectedValues);\r\n }\r\n }\r\n\r\n /**\r\n * Selects all items in a given HicomMultiSelect control\r\n * - find the values - either in the filtered view or the raw data - splice these into the already selected values\r\n * - clear the textbox value, close the MultiSelect, and trigger its change event and mark as dirty\r\n * @param { kendo.ui.MultiSelect } multiSelect\r\n */\r\n static SelectAllItems(multiSelect: kendo.ui.MultiSelect, dataValueField: string = \"Value\") {\r\n let currentValues = multiSelect.value();\r\n\r\n let values = $.map(multiSelect.dataSource.view(), function (dataItem) {\r\n return dataItem[dataValueField];\r\n });\r\n\r\n if (!values || values.length == 0) {\r\n values = $.map(multiSelect.dataSource.data(), function (dataItem) {\r\n return dataItem[dataValueField];\r\n });\r\n }\r\n\r\n currentValues.forEach(function (el) {\r\n if (values.indexOf(el) === -1) {\r\n values.push(el);\r\n }\r\n })\r\n\r\n multiSelect.input.val(\"\");\r\n multiSelect.value(values);\r\n multiSelect.close();\r\n multiSelect.trigger(\"change\");\r\n\r\n $(multiSelect.element).closest('form.dirtylisten').trigger('dirty.dirtyforms');\r\n }\r\n\r\n /**\r\n * Deselects all items in a given HicomMultiSelect control, \r\n * - clear the textbox value, close the MultiSelect, and trigger its change event and mark as dirty\r\n * @param { kendo.ui.MultiSelect } multiSelect\r\n */\r\n static DeselectAllItems(multiSelect: kendo.ui.MultiSelect) {\r\n multiSelect.input.val(\"\");\r\n multiSelect.value([]);\r\n multiSelect.close();\r\n multiSelect.trigger(\"change\");\r\n\r\n $(multiSelect.element).closest('form.dirtylisten').trigger('dirty.dirtyforms');\r\n }\r\n}\r\n\r\n/* Concrete implementation of Hicom MultiSelect controls */\r\nclass HicomDropDownTree implements IHicomDropDownTree {\r\n /** Sets the TagMode of a given HicomMultiSelect from Multiple to Single if the number of selected items exceeds the maxSelectedItemsDisplayedInSingleTagMode\r\n * @@param {string} id - The id of the dropdown tree\r\n * @@param {number} maxSelectedItemsDisplayedInMultipleTagMode - The maximum number of selected items before tag mode changes from Multiple to Single\r\n */\r\n\r\n static SetTagMode(id: string, maxSelectedItemsDisplayedInMultipleTagMode: number) {\r\n\r\n var dropdowntree = $(id).data(\"kendoDropDownTree\");;\r\n // @ts-ignore\r\n let selectedValues = [...dropdowntree.value()];\r\n let currentTagMode = dropdowntree.options.tagMode;\r\n\r\n let newTagMode = currentTagMode;\r\n\r\n newTagMode = selectedValues.length <= maxSelectedItemsDisplayedInMultipleTagMode ? \"multiple\" : \"single\";\r\n\r\n // If we need to switch mode then do so...\r\n if (newTagMode != currentTagMode) {\r\n\r\n setTimeout(function () {\r\n\r\n let thisId = $(id)[0].id;\r\n let newDropDownTreeInput = $(\"\");\r\n let thisHiddenId = $(id)[0].id + \"HIDDEN\";\r\n let hiddenInputAnchor = $(\"\");\r\n\r\n if (dropdowntree.element.data(\"kendoDropDownTree\")) {\r\n var options;\r\n options = dropdowntree.options;\r\n options.tagMode = dropdowntree.value().length <= maxSelectedItemsDisplayedInMultipleTagMode ? \"multiple\" : \"single\";\r\n\r\n let thisSelectedValues = $.grep(dropdowntree.value(), function (value) { return value != '0'; })\r\n\r\n // @ts-ignore\r\n options.value = thisSelectedValues; //;\r\n dropdowntree.value(thisSelectedValues);\r\n\r\n // We need to replace our input field with a new one and use this hidden field as a placeholder\r\n hiddenInputAnchor.insertBefore($('#' + thisId).parent());\r\n\r\n dropdowntree.destroy();\r\n $(id).parent().remove();\r\n newDropDownTreeInput.insertAfter($(\"#\" + thisHiddenId));\r\n // Delete placeholder\r\n $('#' + thisHiddenId).remove();\r\n\r\n // Initialise new DropDownTree with the old config\r\n $(\"#\" + thisId).kendoDropDownTree(options);\r\n let newDDT = $(\"#\" + thisId).data(\"kendoDropDownTree\");\r\n\r\n if (options.value.length == dropdowntree.value().length) {\r\n newDDT.trigger('change');\r\n }\r\n }\r\n\r\n }, 50);\r\n\r\n }\r\n }\r\n /** Sets the value of theassociated hidden field \r\n * @@param {string} id - id of the DropDownTree\r\n * @@param {string} idValues - id of the DropDownTree hidden values field\r\n * @@param {number} maxSelectedItemsDisplayedInMultipleTagMode - The maximum number of selected items before tag mode changes from Multiple to Single\r\n */\r\n static SetHiddenValues(id: string, idValues: string, maxSelectedItemsDisplayedInMultipleTagMode: number) {\r\n\r\n var ddt = $(id).data('kendoDropDownTree');\r\n\r\n let thisSelectedValues = $.grep(ddt.value(), function (value) { return value != '0'; })\r\n $(idValues).val(thisSelectedValues.join(','));\r\n\r\n if (ddt.value().length > 0) {\r\n this.SetTagMode(id, maxSelectedItemsDisplayedInMultipleTagMode);\r\n }\r\n\r\n }\r\n\r\n /** Implemented the following function to manipulate how transitioning into into 1 chip appears \r\n * @@param {string} id - id of the DropDownTree\r\n * @@param {number} maxSelectedItemsDisplayedInMultipleTagMode - The maximum number of selected items before tag mode changes from Multiple to Single\r\n */\r\n static MultiSelectHousekeeping(id: string, maxSelectedItemsDisplayedInMultipleTagMode: number) {\r\n\r\n let selectedItems = $(id).parent().find('.k-chip-list .k-chip');\r\n let numberSelectedItems = selectedItems.length;\r\n\r\n if (numberSelectedItems > maxSelectedItemsDisplayedInMultipleTagMode) {\r\n selectedItems.hide();\r\n let firstChip = $(id).parent().find('.k-chip-list .k-chip:lt(1)');\r\n firstChip.find('.k-chip-label').text('Processing...');\r\n firstChip.find('.k-chip-remove-action').remove();\r\n firstChip.show();\r\n }\r\n else {\r\n selectedItems.show();\r\n }\r\n\r\n }\r\n\r\n\r\n}\r\n\r\n/** Concrete implementation of Hicom file uploaded display\r\n*/\r\nclass HicomFileUploadedDisplay implements IHicomFileUploadedDisplay {\r\n\r\n /** 'Remove' link click on list currently uploaded files\r\n * @@param {HTMLAnchorElement} element - Anchor link for 'remove'\r\n */\r\n static OnRemove(e: HTMLAnchorElement): void {\r\n const rowId = e.dataset.rowId;\r\n const fileName = e.dataset.fileName;\r\n const url = e.dataset.deleteUrl;\r\n\r\n $(\"\").kendoDialog({\r\n closable: false,\r\n title: 'Confirm File Removal',\r\n content: `Are you sure you want to remove the file called '${fileName}'? (this operation cannot be undone)`,\r\n actions: [{\r\n text: \"Yes\",\r\n action: function (e) {\r\n fetch(url, {\r\n method: 'DELETE'\r\n })\r\n .then(data => {\r\n if (data.ok) {\r\n // Removed deleted row\r\n $(`#${rowId}`).remove();\r\n } else {\r\n $('').kendoAlert({\r\n // @ts-ignore\r\n title: \"File Removal Error\",\r\n content: `Uploaded file could not be removed (${data.status})`\r\n }).data('kendoAlert').open();\r\n }\r\n })\r\n .catch((error) => {\r\n console.error('Error:', error);\r\n });\r\n }\r\n }, {\r\n text: \"No\",\r\n primary: true\r\n }]\r\n }).data(\"kendoDialog\").open().center();\r\n }\r\n\r\n /** 'Remove' link click on list currently uploaded files - deferred mode - makes form dirty\r\n * @@param {HTMLAnchorElement} element - Anchor link for 'remove'\r\n */\r\n static OnDeferredRemove(e: HTMLAnchorElement): void {\r\n const rowId = e.dataset.rowId;\r\n const fileName = e.dataset.fileName;\r\n const deferredDeletedIdsName = e.dataset.deferredDeletedIdsName;\r\n const deferredDeletedNamesName = e.dataset.deferredDeletedNamesName;\r\n const fileId = e.dataset.deferredFileEncryptedId;\r\n const placeholder = $(`#__${deferredDeletedIdsName}`);\r\n const isDirtyTotalTracker = $(`#__${deferredDeletedIdsName}_Total`);\r\n\r\n $(\"\").kendoDialog({\r\n closable: false,\r\n title: 'Confirm File Removal',\r\n content: `Are you sure you want to remove the file called '${fileName}'?`,\r\n actions: [{\r\n text: \"Yes\",\r\n action: function (e) {\r\n // Append file id to deleted list\r\n placeholder.append(``);\r\n\r\n // Update dirty forms tracked total so dirty forms can work as normal\r\n isDirtyTotalTracker.val(placeholder.find('input[type=hidden]').length);\r\n isDirtyTotalTracker.trigger('change');\r\n\r\n // Strike through deleted row and display 'Undo' button\r\n $(`#${rowId}`).find('.hicom-file-upload-display').css('text-decoration', 'line-through');\r\n $(`#${rowId}`).find('.hicom-file-upload-button').hide();\r\n $(`#${rowId}`).find('.hicom-file-delete-undo-button').show();\r\n }\r\n }, {\r\n text: \"No\",\r\n primary: true\r\n }]\r\n }).data(\"kendoDialog\").open().center();\r\n }\r\n\r\n /** 'Reinstate' deletion of previously uploaded files - deferred mode - makes form dirty\r\n * @@param {HTMLAnchorElement} element - Anchor link for 'undo'\r\n */\r\n static OnDeferredUndo(e: HTMLAnchorElement): void {\r\n const rowId = e.dataset.rowId;\r\n const fileName = e.dataset.fileName;\r\n const deferredDeletedIdsName = e.dataset.deferredDeletedIdsName;\r\n const deferredDeletedNamesName = e.dataset.deferredDeletedNamesName;\r\n const fileId = e.dataset.deferredFileEncryptedId;\r\n const placeholder = $(`#__${deferredDeletedIdsName}`);\r\n const isDirtyTotalTracker = $(`#__${deferredDeletedIdsName}_Total`);\r\n\r\n $(\"\").kendoDialog({\r\n closable: false,\r\n title: 'Confirm File Delete Undo',\r\n content: `Are you sure you want to undo the deletion the file called '${fileName}'?`,\r\n actions: [{\r\n text: \"Yes\",\r\n action: function (e) {\r\n // Remove file id from deleted list\r\n placeholder.find(`input[type=hidden][name=\"${deferredDeletedNamesName}\"][value=${fileId}]`).remove();\r\n\r\n // Update dirty forms tracked total so dirty forms can work as normal\r\n isDirtyTotalTracker.val(placeholder.find('input[type=hidden]').length);\r\n isDirtyTotalTracker.trigger('change');\r\n\r\n // Unstrike through and show remove button\r\n $(`#${rowId}`).find('.hicom-file-upload-display').css('text-decoration', '');\r\n $(`#${rowId}`).find('.hicom-file-upload-button').show();\r\n $(`#${rowId}`).find('.hicom-file-delete-undo-button').hide();\r\n }\r\n }, {\r\n text: \"No\",\r\n primary: true\r\n }]\r\n }).data(\"kendoDialog\").open().center();\r\n }\r\n}\r\n\r\nabstract class HicomHelper implements IHicomHelper {\r\n private static HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY = 'hicom-helper-last-selected-tab-session-storage-key';\r\n\r\n /** Stores the last selected tab ID, per controller/action/tab container, in session storage\r\n * @@param {string} controller - The current MVC controller\r\n * @@param {string} action - The current MVC action\r\n * @@param {string} tabContainerId - The ID of the main tab container in the HTML\r\n * @@param {string} tabId - The ID of the tab in the HTML\r\n */\r\n public static SetLastSelectedTabID(controller: string, action: string, tabContainerId: string, tabId: string) {\r\n let tabConfig = JSON.parse(sessionStorage[this.HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY] || '[]');\r\n let tabIndex = tabConfig.findIndex(x => x.controller === controller && x.action === action && x.tabContainerId === tabContainerId);\r\n\r\n if (tabIndex > -1) {\r\n // Item already exists, delete it\r\n tabConfig.splice(tabIndex, 1);\r\n }\r\n\r\n let tabConfigData = {\r\n controller: controller,\r\n action: action,\r\n tabContainerId: tabContainerId,\r\n tabId: tabId\r\n };\r\n\r\n tabConfig.push(tabConfigData);\r\n sessionStorage[this.HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY] = JSON.stringify(tabConfig);\r\n }\r\n\r\n /** Gets the last selected tab ID, per controller/action/tab container, from session storage. Returns null if no tab is found\r\n * @@param {string} controller - The current MVC controller\r\n * @@param {string} action - The current MVC action\r\n * @@param {string} tabContainerId - The ID of the main tab container in the HTML\r\n */\r\n public static GetLastSelectedTabID(controller: string, action: string, tabContainerId: string): string {\r\n let tabConfig = JSON.parse(sessionStorage[this.HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY] || '[]');\r\n let tabIndex = tabConfig.findIndex(x => x.controller === controller && x.action === action && x.tabContainerId === tabContainerId);\r\n\r\n if (tabIndex > -1) {\r\n return tabConfig[tabIndex].tabId;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /** Clears all last selected tab IDs for a specified controller/action, from session storage\r\n * @@param {string} controller - The current MVC controller\r\n * @@param {string} action - The current MVC action\r\n */\r\n public static ClearLastSelectedTabID(controller: string, action: string): void {\r\n let tabConfig = JSON.parse(sessionStorage[this.HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY] || '[]');\r\n tabConfig = tabConfig.filter(x => !(x.controller === controller && x.action === action));\r\n sessionStorage[this.HICOM_HELPER_LAST_SELECTED_TAB_SESSION_STORAGE_KEY] = JSON.stringify(tabConfig);\r\n }\r\n\r\n /** Sets focus on the specified element. Opens the element's containing tab, if there is one\r\n * @@param {string} id - The ID of the element on which to focus\r\n */\r\n public static FocusOnFormControl(id) {\r\n let element: HTMLElement = document.getElementById(id);\r\n if (!element) {\r\n return;\r\n }\r\n\r\n // Is the control inside a Bootstrap tab?\r\n let parentTabContainer: HTMLElement = $(element).parents('[role=\"tabpanel\"]')[0];\r\n if (parentTabContainer) {\r\n // Yes - we have the container, which should be linked by an attribute to the name of the tab:\r\n let tabName: string = parentTabContainer.getAttribute(\"aria-labelledby\");\r\n if (tabName) {\r\n // All good - open the tab:\r\n // @ts-ignore\r\n var tab = new bootstrap.Tab(document.getElementById(tabName));\r\n tab && tab.show();\r\n }\r\n }\r\n\r\n // Now attempt to apply focus to the relevant form control:\r\n var focusFn = this.GetFocusFunctionById(id);\r\n if (focusFn) {\r\n setTimeout(function () { focusFn(); }, 100);\r\n }\r\n }\r\n\r\n private static GetFocusFunctionById(id): Function {\r\n var element: HTMLElement = document.getElementById(id);\r\n if (!element) { return null; }\r\n\r\n let hicomRole = String(element.dataset?.hicomRole);\r\n\r\n if (hicomRole) {\r\n let kendoElement = null;\r\n switch (hicomRole) {\r\n case \"hicom-dropdown-list\":\r\n kendoElement = $(\"#\" + id).data(\"kendoDropDownList\");\r\n break;\r\n case \"hicom-dropdown-tree\":\r\n kendoElement = $(\"#\" + id).data(\"kendoDropDownTree\");\r\n break;\r\n case \"hicom-multiselect\":\r\n kendoElement = $(\"#\" + id).data(\"kendoMultiSelect\");\r\n break;\r\n }\r\n\r\n if (kendoElement) {\r\n return function () { kendoElement.focus(); }\r\n }\r\n }\r\n\r\n return function () { element.focus({ preventScroll: false }); }\r\n }\r\n\r\n /** Update the value of date time fields to send a timezone where necessary\r\n * @@param {string} formId - form id\r\n */\r\n static UpdateDateTimeOffsetValuesForForm(formId) {\r\n const form = document.getElementById(formId);\r\n\r\n var dateTimeOffsetElements = form.querySelectorAll('input[data-hicom-role=hicom-datetimeoffset]');\r\n\r\n dateTimeOffsetElements.forEach(el => {\r\n const element = el as HTMLInputElement;\r\n\r\n if (element) {\r\n let offset: string = element.dataset[\"timezoneOffset\"];\r\n if (offset) {\r\n // Append the timezone to the input's value. This follows the ISO 8601 standard\r\n element.type = \"text\"; // Change it to a text input, as a datetime-local won't accept a timezone\r\n element.value += offset;\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\nclass HicomPassword implements IHicomPassword {\r\n\r\n /** Toggle the Hicom Password reveal input type + icon classes\r\n */\r\n static TogglePasswordReveal($element: object, passwordElementId: string) {\r\n let $passwordElement = $(`#${passwordElementId}`);\r\n $passwordElement.attr('type', $passwordElement.attr('type') === 'password' ? 'text' : 'password');\r\n // @ts-ignore\r\n $element.toggleClass('icon-show');\r\n // @ts-ignore\r\n $element.toggleClass('icon-hide');\r\n }\r\n}\r\n\r\nclass HicomDateTime {\r\n\r\n static SetDateToNow(dateControlId) {\r\n // @ts-ignore\r\n let currentDate = moment(new Date()).format(\"yyyy-MM-DD\");\r\n let $control = $(`#${dateControlId.id}`);\r\n $control.val(currentDate).trigger('change').trigger('keyup');\r\n }\r\n\r\n static SetDateTimeToNow(dateControlId) {\r\n // @ts-ignore\r\n let currentDateTime = moment(new Date()).format(\"yyyy-MM-DDTHH:mm\");\r\n let $control = $(`#${dateControlId.id}`);\r\n $control.val(currentDateTime).trigger('change').trigger('keyup');\r\n }\r\n\r\n\r\n static SetTimeToNow(dateControlId) {\r\n // @ts-ignore\r\n let currentTime = moment(new Date()).format(\"HH:mm\");\r\n let $control = $(`#${dateControlId.id}`);\r\n $control.val(currentTime).trigger('change').trigger('keyup');\r\n }\r\n}\r\nclass HicomTabs {\r\n\r\n /** Initialise the tabs for load on demand\r\n */\r\n static InitialiseLoadOnDemand(hicomPage: HicomPage) {\r\n const allTabs = document.querySelectorAll('button[data-bs-toggle=\"tab\"]')\r\n allTabs.forEach(el => {\r\n el.addEventListener('shown.bs.tab', e => {\r\n // @ts-ignore\r\n let tab = document.querySelector(e.target.getAttribute('data-bs-target'));\r\n if (tab.getAttribute('data-url') && tab.getAttribute('data-url-loaded') != 'true') {\r\n // @ts-ignore\r\n hicomPage.loadHtml(tab.getAttribute('data-url'), e.target.getAttribute('data-bs-target'));\r\n }\r\n });\r\n });\r\n }\r\n}\r\n\r\nclass HicomTooltip implements IHicomTooltip {\r\n\r\n /** Load all tool tips\r\n */\r\n static LoadTooltips() {\r\n var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'));\r\n var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\r\n // @ts-ignore\r\n return new bootstrap.Tooltip(tooltipTriggerEl);\r\n });\r\n }\r\n\r\n /** Toggle the Hicom Toggle text content - destroy Bootstrap tooltip and recreate as content is to change\r\n */\r\n static ToggleToolTipText($element: object, originalTitle: string, newTitle: string) {\r\n // @ts-ignore\r\n var lastTitle = $element.attr('data-bs-original-title');\r\n // @ts-ignore\r\n $element.attr('data-bs-original-title', lastTitle === originalTitle ? newTitle : originalTitle);\r\n // @ts-ignore\r\n $element.tooltip('dispose').tooltip().tooltip('show');\r\n }\r\n}\r\n\r\n/**\r\n * Type of Hicom date range picker - defaults to data capure (e.g. used of CRUD form)\r\n */\r\nenum HicomDateRangePickerType {\r\n DataCapture,\r\n GridFilter\r\n}\r\n\r\n/**\r\n* Hicom functions to wrap date range picker (see 'https://www.daterangepicker.com/') - requires moment.js (see 'https://momentjs.com/')\r\n*/\r\nclass HicomDateRangePicker implements IHicomDateRangePicker {\r\n\r\n // Hicom date picker INPUT tag - data attribute holds the element to POST with the selected START DATE is ISO FORMAT\r\n public static HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME = 'start-date-field';\r\n\r\n // Hicom date picker INPUT tag - data attribute holds the element to POST with the selected END DATE is ISO FORMAT\r\n public static HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME = 'end-date-field';\r\n\r\n // Server-side will supply start and end date separated by the ASCII unit delimiter\r\n public static UNIT_DELIMITER = String.fromCharCode(31);\r\n\r\n // Server-side requires start and end date as an ISO date - Kendo expects proper case\r\n public static KENDO_FORMAT_ISO_DATE_ONLY_FORMAT = 'yyyy-MM-dd';\r\n\r\n // Date separator (manual in case we change it)\r\n public static DATE_RANGE_PICKER_DISPLAY_SEPARATOR = ' - ';\r\n\r\n /**\r\n * Split the start and end dates by ASCII delimiter - then convert from ISO format to whatever the current Kendo UI culture 'd' pattern is set to (see 'HicomGrid' for similar use of Kendo/'d' format specifier)\r\n * @param $dateRangePicker - jQuery reference to the date picker INPUT element\r\n * @oaram kendoCultureShortDatePattern - Kendo short date pattern (e.g. 'd' as per Hicom Grid)\r\n */\r\n static SetLocalisedDateRange(datePickerElementName: string, kendoCultureShortDatePattern: string) {\r\n let $dateRangePicker = $(`input[name=\"${datePickerElementName}\"]`);\r\n let isoDate = String($dateRangePicker.val());\r\n\r\n if (isoDate != '') {\r\n let dates = Array.from(isoDate.split(HicomDateRangePicker.UNIT_DELIMITER));\r\n let formattedDates = [];\r\n if (dates.length > 0) {\r\n dates.forEach(d => {\r\n // @ts-ignore\r\n formattedDates.push(kendo.toString(kendo.parseDate(d, HicomDateRangePicker.KENDO_FORMAT_ISO_DATE_ONLY_FORMAT), kendoCultureShortDatePattern));\r\n });\r\n $dateRangePicker.val(formattedDates.join(HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR));\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Update the actual start and end date INPUT elements with the current values selected in the date picker into the ISO date format\r\n * @param datePickerElementName - Name of the date picker INPUT element\r\n */\r\n static SetISODateRange(datePickerElementName: string) {\r\n let $dateRangePicker = $(`input[name=\"${datePickerElementName}\"]`);\r\n let dateRangePicker = $dateRangePicker.data('daterangepicker');\r\n let startDateElementName = $dateRangePicker.data(HicomDateRangePicker.HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME);\r\n let endDateElementName = $dateRangePicker.data(HicomDateRangePicker.HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME);\r\n\r\n if (dateRangePicker.startDate != null) {\r\n $(`input[name=\"${startDateElementName}\"]`).val(kendo.toString(dateRangePicker.startDate.toDate(), HicomDateRangePicker.KENDO_FORMAT_ISO_DATE_ONLY_FORMAT));\r\n } else {\r\n $(`input[name=\"${startDateElementName}\"]`).val('');\r\n }\r\n\r\n if (dateRangePicker.endDate != null) {\r\n $(`input[name=\"${endDateElementName}\"]`).val(kendo.toString(dateRangePicker.endDate.toDate(), HicomDateRangePicker.KENDO_FORMAT_ISO_DATE_ONLY_FORMAT));\r\n } else {\r\n $(`input[name=\"${endDateElementName}\"]`).val('');\r\n }\r\n }\r\n\r\n _type: HicomDateRangePickerType;\r\n _datePickerElementName: string;\r\n _$datePicker: JQuery;\r\n _kendoCultureShortDatePattern: string;\r\n\r\n /**\r\n * Construct date picker - change handler updates the shadow ISO start and end date elements\r\n * @param datePickerElementName\r\n * @param kendoCultureShortDatePattern\r\n */\r\n constructor(datePickerElementName: string,\r\n kendoCultureShortDatePattern: string,\r\n type: HicomDateRangePickerType = HicomDateRangePickerType.DataCapture,\r\n defaultDateRange: string = 'Today') {\r\n this._datePickerElementName = datePickerElementName;\r\n this._kendoCultureShortDatePattern = kendoCultureShortDatePattern;\r\n this._$datePicker = $(`input[name=\"${this._datePickerElementName}\"]`);\r\n\r\n let initStartDate = null;\r\n let initEndDate = null;\r\n switch (defaultDateRange) {\r\n case 'Today':\r\n // @ts-ignore\r\n initStartDate = moment(); initEndDate = moment();\r\n break;\r\n case 'Yesterday':\r\n // @ts-ignore\r\n initStartDate = moment().subtract(1, 'days'); initEndDate = moment().subtract(1, 'days');\r\n break;\r\n case 'Last 7 Days':\r\n // @ts-ignore\r\n initStartDate = moment().subtract(6, 'days'); initEndDate = moment();\r\n break;\r\n case 'Last 30 Days':\r\n // @ts-ignore\r\n initStartDate = moment().subtract(29, 'days'); initEndDate = moment();\r\n break;\r\n case 'This Month':\r\n // @ts-ignore\r\n initStartDate = moment().startOf('month'); initEndDate = moment().endOf('month');\r\n break;\r\n case 'Last Month':\r\n // @ts-ignore\r\n initStartDate = moment().subtract(1, 'month').startOf('month'); initEndDate = moment().subtract(1, 'month').endOf('month');\r\n break;\r\n\r\n }\r\n\r\n switch (type) {\r\n // For data capture we effectively need to keep the 2 ISO date fields in sync with any operations\r\n case HicomDateRangePickerType.DataCapture:\r\n // IMPORTANT: Transpose the loaded ISO-formatted date ranges into the current Kendo locale\r\n HicomDateRangePicker.SetLocalisedDateRange(datePickerElementName, kendoCultureShortDatePattern);\r\n\r\n let isInitiallyBlank = String(this._$datePicker.val()) == '';\r\n\r\n if (!isInitiallyBlank) {\r\n // @ts-ignore\r\n initStartDate = moment(this._$datePicker.val().split(HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR)[0].trim(), 'DD/MM/YYYY');\r\n // @ts-ignore\r\n initEndDate = moment(this._$datePicker.val().split(HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR)[1].trim(), 'DD/MM/YYYY');\r\n }\r\n\r\n // @ts-ignore\r\n this._$datePicker.daterangepicker({\r\n // @ts-ignore\r\n startDate: initStartDate,\r\n // @ts-ignore\r\n endDate: initEndDate,\r\n autoUpdateInput: false,\r\n alwaysShowCalendars: true,\r\n locale: {\r\n cancelLabel: 'Clear',\r\n format: this._kendoCultureShortDatePattern.toUpperCase()\r\n },\r\n ranges: {\r\n // @ts-ignore\r\n 'Today': [moment(), moment()],\r\n // @ts-ignore\r\n 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],\r\n // @ts-ignore\r\n 'Last 7 Days': [moment().subtract(6, 'days'), moment()],\r\n // @ts-ignore\r\n 'Last 30 Days': [moment().subtract(29, 'days'), moment()],\r\n // @ts-ignore\r\n 'This Month': [moment().startOf('month'), moment().endOf('month')],\r\n // @ts-ignore\r\n 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]\r\n }\r\n }, function (start, end, label) {\r\n // Update picker display\r\n this.element.val(`${this.startDate.format(this.locale.format)}${HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR}${this.endDate.format(this.locale.format)}`);\r\n this.element.trigger('change');\r\n\r\n // Update ISO start and end dates\r\n HicomDateRangePicker.SetISODateRange(this.element.attr('name'));\r\n }).on('cancel.daterangepicker', function (e, picker) {\r\n // Clear picker display\r\n picker.element.val(``);\r\n picker.element.trigger('change');\r\n\r\n // Update ISO start and end dates manually as we've only cleared the display (we can't NULL the internal date(s))\r\n\r\n let hdnStartDate = $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME)}\"]`);\r\n let hdnEndDate = $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME)}\"]`);\r\n\r\n hdnStartDate.val('');\r\n hdnEndDate.val('');\r\n\r\n HicomDirtyForms.setDirtyStatus(hdnStartDate, hdnStartDate.val());\r\n HicomDirtyForms.setDirtyStatus(hdnEndDate, hdnEndDate.val());\r\n\r\n // set the start and end dates to your desired values\r\n // @ts-ignore\r\n picker.setStartDate(initStartDate);\r\n // @ts-ignore\r\n picker.setEndDate(initEndDate);\r\n\r\n }).on('apply.daterangepicker', function (ev, picker) {\r\n $(this).val(picker.startDate.format(picker.locale.format) + HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR + picker.endDate.format(picker.locale.format));\r\n\r\n let hdnStartDate = $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME)}\"]`);\r\n let hdnEndDate = $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME)}\"]`);\r\n\r\n hdnStartDate.val(picker.startDate.format('YYYY-MM-DD'));\r\n hdnEndDate.val(picker.endDate.format('YYYY-MM-DD'));\r\n\r\n\r\n HicomDirtyForms.setDirtyStatus(hdnStartDate, hdnStartDate.val());\r\n HicomDirtyForms.setDirtyStatus(hdnEndDate, hdnEndDate.val());\r\n\r\n });\r\n\r\n // Initial ISO dates\r\n HicomDateRangePicker.SetISODateRange(this._datePickerElementName);\r\n\r\n // Blank ISO elements (as internal change handler will default to today and as with the clear option we can't NULL the internal dates)\r\n if (isInitiallyBlank) {\r\n let startDateElementName = this._$datePicker.data(HicomDateRangePicker.HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME);\r\n let endDateElementName = this._$datePicker.data(HicomDateRangePicker.HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME);\r\n\r\n $(`input[name=\"${startDateElementName}\"]`).val('');\r\n $(`input[name=\"${endDateElementName}\"]`).val('');\r\n }\r\n\r\n break;\r\n\r\n // For a grid filter we just need to worry about ourselves\r\n case HicomDateRangePickerType.GridFilter:\r\n // @ts-ignore\r\n this._$datePicker.daterangepicker({\r\n // @ts-ignore\r\n startDate: initStartDate,\r\n // @ts-ignore\r\n endDate: initStartDate,\r\n autoUpdateInput: false,\r\n alwaysShowCalendars: true,\r\n locale: {\r\n cancelLabel: 'Clear',\r\n format: this._kendoCultureShortDatePattern.toUpperCase()\r\n },\r\n ranges: {\r\n // @ts-ignore\r\n 'Today': [moment(), moment()],\r\n // @ts-ignore\r\n 'Yesterday': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],\r\n // @ts-ignore\r\n 'Last 7 Days': [moment().subtract(6, 'days'), moment()],\r\n // @ts-ignore\r\n 'Last 30 Days': [moment().subtract(29, 'days'), moment()],\r\n // @ts-ignore\r\n 'This Month': [moment().startOf('month'), moment().endOf('month')],\r\n // @ts-ignore\r\n 'Last Month': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')]\r\n }\r\n }, function (start, end, label) {\r\n // Update picker display\r\n this.element.val(`${this.startDate.format(this.locale.format)}${HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR}${this.endDate.format(this.locale.format)}`);\r\n }).on('cancel.daterangepicker', function (e, picker) {\r\n // Clear picker display\r\n picker.element.val(``);\r\n\r\n // set the start and end dates to your desired values\r\n // @ts-ignore\r\n picker.setStartDate(initStartDate);\r\n // @ts-ignore\r\n picker.setEndDate(initEndDate);\r\n\r\n }).on('apply.daterangepicker', function (ev, picker) {\r\n $(this).val(picker.startDate.format(picker.locale.format) + HicomDateRangePicker.DATE_RANGE_PICKER_DISPLAY_SEPARATOR + picker.endDate.format(picker.locale.format));\r\n\r\n $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_START_DATE_DATE_ATTR_NAME)}\"]`).val(picker.startDate.format('YYYY-MM-DD'));\r\n $(`input[name=\"${picker.element.data(HicomDateRangePicker.HICOM_DATE_PICKER_END_DATE_DATE_ATTR_NAME)}\"]`).val(picker.endDate.format('YYYY-MM-DD'));\r\n\r\n });\r\n break;\r\n }\r\n }\r\n}\r\n\r\n\r\n//#region IPageStateComponent implementations to work with PageState\r\n\r\n/**\r\n * IPageStateComponent implementation for Accordion.\r\n * \r\n * Provides the mechanism for Accordion to use and persist state on a HicomPage\r\n */\r\nclass PageStateAccordion implements IPageStateComponent {\r\n pageState: PageState;\r\n\r\n constructor(pageState: PageState) {\r\n // @ts-ignore\r\n this.pageState = pageState;\r\n this._init();\r\n }\r\n\r\n /** \r\n * Initialisation of PageStateAccordion. This will execute when the page loaded and \"ready\".\r\n */\r\n _init() {\r\n const allAccordions = document.querySelectorAll('.collapse')\r\n allAccordions.forEach(el => {\r\n\r\n /**\r\n * Detect if the data-save-state attribute is present. If it is then if the value is false, then we simply exit this iteration.\r\n * Behaviour will be, if false, expander will be collapsed on page refresh, as the state is not saved to session 'tab' storage.\r\n * Default behaviour is true, meaning the state will be saved and the expander will be based on the stored state.\r\n */\r\n let component: HTMLElement = el;\r\n let attrSaveState = component.attributes.getNamedItem(\"data-save-state\");\r\n\r\n if (attrSaveState && attrSaveState.value?.toLowerCase() === \"false\") {\r\n return;\r\n }\r\n\r\n /**\r\n * Functionality to construct state for changes to every instance and call _savePageState to update page state with the new state data.\r\n */\r\n el.addEventListener('shown.bs.collapse', event => {\r\n console.debug('PageStateAccordion: shown.bs.collapse');\r\n\r\n let key = el.id;\r\n // @ts-ignore\r\n let state = true;\r\n this._savePageState(key, state);\r\n });\r\n el.addEventListener('hidden.bs.collapse', event => {\r\n console.debug('PageStateAccordion: hidden.bs.collapse');\r\n\r\n let key = el.id;\r\n // @ts-ignore\r\n let state = false;\r\n this._savePageState(key, state);\r\n });\r\n\r\n /**\r\n * Functionality to call _retrievePageState for every instance and apply state to the UI.\r\n */\r\n console.debug('PageStateAccordion: loading state');\r\n let accordionState = this._retrievePageState(el.id)\r\n\r\n if (accordionState && accordionState.state === true) {\r\n if (el.getAttribute('data-url-loaded') != 'true') {\r\n // @ts-ignore\r\n (new bootstrap.Collapse(el)).show();\r\n }\r\n }\r\n });\r\n }\r\n\r\n _savePageState(key: string, state: any): void {\r\n const tabState = {\r\n key: key,\r\n state: state\r\n };\r\n\r\n console.debug('ACCORDION: _savePageState');\r\n this.pageState.setPageStateItem(key, tabState);\r\n }\r\n\r\n _retrievePageState(key: string): any {\r\n return this.pageState.getPageStateItem(key);\r\n }\r\n}\r\n\r\n\r\n/**\r\n * IPageStateComponent implementation for Tabs.\r\n * \r\n * Provides the mechanism for Tabs to use and persist state on a HicomPage\r\n */\r\nclass PageStateTabs implements IPageStateComponent {\r\n pageState: PageState;\r\n\r\n constructor(pageState: PageState) {\r\n // @ts-ignore\r\n this.pageState = pageState;\r\n this._init();\r\n }\r\n\r\n /** \r\n * Initialisation of PageStateTabs. This will execute when the page loaded and \"ready\".\r\n */\r\n _init() {\r\n /**\r\n * Functionality to construct state for changes to every instance and call _savePageState to update page state with the new state data.\r\n */\r\n const allTabs = document.querySelectorAll('button[data-bs-toggle=\"tab\"]')\r\n allTabs.forEach(el => {\r\n el.addEventListener('shown.bs.tab', event => {\r\n console.debug('PageStateTabs: shown.bs.tab');\r\n\r\n let key = el.closest('[role=\"tablist\"]')?.id;\r\n // @ts-ignore\r\n let state = event.target.id;\r\n this._savePageState(key, state);\r\n });\r\n })\r\n\r\n /**\r\n * Functionality to call _retrievePageState for every instance and apply state to the UI.\r\n */\r\n const allTabLists = document.querySelectorAll('[role=\"tablist\"]:not([data-bypass-selected-tab-retention=\"true\"])');\r\n allTabLists.forEach(el => {\r\n console.debug('PageStateTabs: loading state');\r\n let tabState = this._retrievePageState(el.id);\r\n\r\n if (tabState) {\r\n let lastSelectedTab = document.querySelector(`#${tabState.state}`);\r\n if (lastSelectedTab && lastSelectedTab.getAttribute('data-url-loaded') != 'true') {\r\n // @ts-ignore\r\n (new bootstrap.Tab(lastSelectedTab)).show();\r\n }\r\n }\r\n })\r\n }\r\n\r\n _savePageState(key: string, state: any): void {\r\n const tabState = {\r\n key: key,\r\n state: state\r\n };\r\n\r\n console.debug('TAB: _savePageState');\r\n this.pageState.setPageStateItem(key, tabState);\r\n }\r\n\r\n _retrievePageState(key: string): any {\r\n return this.pageState.getPageStateItem(key);\r\n }\r\n}\r\n//#endregion\r\n\r\n"]}