{"version":3,"file":"app-9e164259.xxxxxxxx.bundle.js","mappings":"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","sources":["webpack://iadviser/./src/resources/plugins/aurelia-table/au-table-pagination.html","webpack://iadviser/./src/resources/plugins/aurelia-table/au-table-pagination.ts","webpack://iadviser/./src/resources/plugins/aurelia-table/au-table-select.ts","webpack://iadviser/./src/resources/plugins/aurelia-table/au-table-sort.ts","webpack://iadviser/./src/resources/plugins/aurelia-table/au-table.ts","webpack://iadviser/./src/resources/plugins/aurelia-table/index.ts","webpack://iadviser/./src/resources/plugins/feature-flags/feature-flags-service.ts","webpack://iadviser/./src/resources/plugins/feature-flags/index.ts","webpack://iadviser/./src/resources/plugins/keyboard-sequence/keyboard-sequence.ts","webpack://iadviser/./src/resources/postrender-step.ts","webpack://iadviser/./src/resources/prepareTaskModel.ts","webpack://iadviser/./src/resources/prerender-step.ts","webpack://iadviser/./src/resources/scroll-into-view.ts","webpack://iadviser/./src/resources/services/aurelia-hooks.ts","webpack://iadviser/./src/resources/services/blob-service.ts","webpack://iadviser/./src/resources/services/claims-service.ts","webpack://iadviser/./src/resources/services/client-statement-service.ts","webpack://iadviser/./src/resources/services/ia-toast-service.ts","webpack://iadviser/./src/resources/services/log-service.ts","webpack://iadviser/./src/resources/services/sso-renewal.ts","webpack://iadviser/./src/resources/services/token-service.ts","webpack://iadviser/./src/resources/startup/console-appender.ts","webpack://iadviser/./src/resources/startup/i18tn-validation.ts","webpack://iadviser/./src/resources/tab-scroll.ts","webpack://iadviser/./src/resources/timer.ts","webpack://iadviser/./src/resources/utilities/admin-display-text.ts","webpack://iadviser/./src/resources/utilities/instance-of-interface.ts","webpack://iadviser/./src/resources/utilities/api-error-handler.ts","webpack://iadviser/./src/resources/utilities/flatten-errors.ts","webpack://iadviser/./src/resources/utilities/apply-theme.ts","webpack://iadviser/./src/resources/utilities/au-table-custom-filter.ts","webpack://iadviser/./src/resources/utilities/date-helper.ts","webpack://iadviser/./src/resources/utilities/funder-insurer-mismatch.ts","webpack://iadviser/./src/resources/utilities/http-helper.ts","webpack://iadviser/./src/resources/utilities/insecure-guid.ts","webpack://iadviser/./src/resources/utilities/json-date-to-display-date.ts","webpack://iadviser/./src/resources/utilities/logger.ts","webpack://iadviser/./src/resources/utilities/print-pdf.ts","webpack://iadviser/./src/resources/utilities/storage-helper.ts","webpack://iadviser/./src/resources/utilities/toastr-helper.ts","webpack://iadviser/./src/resources/utils.ts"],"sourcesContent":["// Module\nvar code = \"\\r\\n\";\n// Exports\nexport default code;","import { autoinject, bindable, bindingMode, DOM } from 'aurelia-framework';\r\n\r\n@autoinject()\r\nexport class AutPaginationCustomElement {\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) currentPage;\r\n @bindable pageSize;\r\n @bindable totalItems;\r\n @bindable hideSinglePage = true;\r\n @bindable paginationSize;\r\n @bindable boundaryLinks = false;\r\n @bindable firstText = 'First';\r\n @bindable lastText = 'Last';\r\n @bindable directionLinks = true;\r\n @bindable previousText = '<';\r\n @bindable nextText = '>';\r\n @bindable disable = false;\r\n\r\n totalPages = 1;\r\n displayPages = [];\r\n\r\n static inject = [Element];\r\n constructor(private element: Element) {\r\n this.element = element;\r\n }\r\n\r\n bind() {\r\n if (this.currentPage === undefined || this.currentPage === null || this.currentPage < 1) {\r\n this.currentPage = 1;\r\n }\r\n\r\n if (this.pageSize === undefined || this.pageSize === null || this.pageSize < 1) {\r\n this.pageSize = 5;\r\n }\r\n }\r\n\r\n totalItemsChanged() {\r\n this.calculatePages();\r\n }\r\n\r\n pageSizeChanged() {\r\n this.calculatePages();\r\n }\r\n\r\n currentPageChanged() {\r\n this.calculatePages();\r\n this.dispatchPageChangedEvent();\r\n }\r\n\r\n dispatchPageChangedEvent() {\r\n const event = DOM.createCustomEvent('page-changed', {\r\n bubbles: true,\r\n detail: {\r\n currentPage: this.currentPage,\r\n },\r\n });\r\n this.element.dispatchEvent(event);\r\n }\r\n\r\n calculatePages() {\r\n this.totalPages = this.totalItems <= this.pageSize ? 1 : Math.ceil(this.totalItems / this.pageSize);\r\n\r\n if (isNaN(this.paginationSize) || this.paginationSize <= 0) {\r\n this.displayAllPages();\r\n } else {\r\n this.limitVisiblePages();\r\n }\r\n }\r\n\r\n displayAllPages() {\r\n const displayPages = [];\r\n\r\n for (let i = 1; i <= this.totalPages; i++) {\r\n displayPages.push({\r\n title: i.toString(),\r\n value: i,\r\n });\r\n }\r\n this.displayPages = displayPages;\r\n }\r\n\r\n limitVisiblePages() {\r\n const displayPages = [];\r\n\r\n const totalTiers = Math.ceil(this.totalPages / this.paginationSize);\r\n\r\n const activeTier = Math.ceil(this.currentPage / this.paginationSize);\r\n\r\n const start = (activeTier - 1) * this.paginationSize + 1;\r\n const end = start + this.paginationSize;\r\n\r\n if (activeTier > 1) {\r\n displayPages.push({\r\n title: '...',\r\n value: start - 1,\r\n });\r\n }\r\n\r\n for (let i = start; i < end; i++) {\r\n if (i > this.totalPages) {\r\n break;\r\n }\r\n\r\n displayPages.push({\r\n title: i.toString(),\r\n value: i,\r\n });\r\n }\r\n\r\n if (activeTier < totalTiers) {\r\n displayPages.push({ title: '...', value: end });\r\n }\r\n\r\n this.displayPages = displayPages;\r\n }\r\n\r\n selectPage(page) {\r\n if (page < 1 || page > this.totalPages || page === this.currentPage) {\r\n return;\r\n }\r\n\r\n this.currentPage = page;\r\n }\r\n\r\n nextPage() {\r\n if (this.currentPage < this.totalPages && !this.disable) {\r\n this.currentPage++;\r\n }\r\n }\r\n\r\n previousPage() {\r\n if (this.currentPage > 1 && !this.disable) {\r\n this.currentPage--;\r\n }\r\n }\r\n\r\n firstPage() {\r\n this.currentPage = 1;\r\n }\r\n\r\n lastPage() {\r\n this.currentPage = this.totalPages;\r\n }\r\n}\r\n","import { bindable, bindingMode, BindingEngine, DOM, autoinject } from 'aurelia-framework';\r\nimport {AureliaTableCustomAttribute} from './au-table';\r\n\r\n@autoinject()\r\nexport class AutSelectCustomAttribute {\r\n\r\n @bindable({defaultBindingMode: bindingMode.twoWay})row;\r\n @bindable mode = 'single';\r\n @bindable selectedClass = 'aut-row-selected';\r\n @bindable custom = false;\r\n\r\n selectedSubscription;\r\n rowSelectedListener;\r\n\r\n constructor(private auTable: AureliaTableCustomAttribute, private element: Element, private bindingEngine: BindingEngine) {\r\n this.rowSelectedListener = event => {\r\n this.handleRowSelected(event);\r\n };\r\n }\r\n\r\n attached() {\r\n if (!this.custom) {\r\n (this.element as HTMLElement).style.cursor = 'pointer';\r\n this\r\n .element\r\n .addEventListener('click', this.rowSelectedListener);\r\n }\r\n\r\n this.selectedSubscription = this\r\n .bindingEngine\r\n .propertyObserver(this.row, '$isSelected')\r\n .subscribe(() => this.isSelectedChanged());\r\n\r\n this.setClass();\r\n }\r\n\r\n detached() {\r\n if (!this.custom) {\r\n this\r\n .element\r\n .removeEventListener('click', this.rowSelectedListener);\r\n }\r\n\r\n this\r\n .selectedSubscription\r\n .dispose();\r\n }\r\n\r\n setClass() {\r\n if (this.row.$isSelected) {\r\n this\r\n .element\r\n .classList\r\n .add(this.selectedClass);\r\n } else {\r\n this\r\n .element\r\n .classList\r\n .remove(this.selectedClass);\r\n }\r\n }\r\n\r\n handleRowSelected(event) {\r\n const source = event.target || event.srcElement;\r\n if (source.tagName.toLowerCase() !== 'td') {\r\n return;\r\n }\r\n this.row.$isSelected = this.row.$isSelected\r\n ? false\r\n : true;\r\n }\r\n\r\n dispatchSelectedEvent() {\r\n const selectedEvent = DOM.createCustomEvent('select', {\r\n detail: {\r\n row: this.row\r\n },\r\n bubbles: true\r\n });\r\n this\r\n .element\r\n .dispatchEvent(selectedEvent);\r\n }\r\n\r\n isSelectedChanged() {\r\n this.setClass();\r\n\r\n if (this.row.$isSelected) {\r\n if (this.mode === 'single') {\r\n this.deselectAll();\r\n }\r\n\r\n this.dispatchSelectedEvent();\r\n }\r\n }\r\n\r\n deselectAll() {\r\n this\r\n .auTable\r\n .data\r\n .forEach(item => {\r\n if (item !== this.row) {\r\n item.$isSelected = false;\r\n }\r\n });\r\n }\r\n}\r\n","import { inject, bindable, autoinject } from \"aurelia-framework\";\r\nimport { AureliaTableCustomAttribute } from \"./au-table\";\r\n\r\n@autoinject\r\nexport class AutSortCustomAttribute {\r\n @bindable key;\r\n @bindable custom;\r\n @bindable default;\r\n @bindable callback = () => \"\";\r\n\r\n order = 0;\r\n orderClasses = [\"aut-desc\", \"aut-sortable\", \"aut-asc\"];\r\n\r\n ignoreEvent = false;\r\n\r\n private rowSelectedListener;\r\n private sortChangedListener;\r\n\r\n constructor(private auTable: AureliaTableCustomAttribute, private element: Element) {\r\n this.rowSelectedListener = () => {\r\n this.handleHeaderClicked();\r\n };\r\n\r\n this.sortChangedListener = () => {\r\n this.handleSortChanged();\r\n };\r\n }\r\n\r\n handleSortChanged() {\r\n if (!this.ignoreEvent) {\r\n this.order = 0;\r\n this.setClass();\r\n this.callback();\r\n } else {\r\n this.ignoreEvent = false;\r\n }\r\n }\r\n\r\n attached() {\r\n if (this.key === null && this.custom === null) {\r\n throw new Error(\"Must provide a key or a custom sort function.\");\r\n }\r\n\r\n (this.element as HTMLElement).style.cursor = \"pointer\";\r\n this.element.classList.add(\"aut-sort\");\r\n\r\n this.element.addEventListener(\"click\", this.rowSelectedListener);\r\n this.auTable.addSortChangedListener(this.sortChangedListener);\r\n\r\n this.handleDefault();\r\n this.setClass();\r\n }\r\n\r\n detached() {\r\n this.element.removeEventListener(\"click\", this.rowSelectedListener);\r\n this.auTable.removeSortChangedListener(this.sortChangedListener);\r\n }\r\n\r\n handleDefault() {\r\n if (this.default) {\r\n this.order = this.default === \"desc\" ? -1 : 1;\r\n this.doSort();\r\n }\r\n }\r\n\r\n doSort() {\r\n if (this.auTable.dataSource === \"server\") {\r\n return;\r\n }\r\n this.ignoreEvent = true;\r\n this.auTable.sortChanged(this.key, this.custom, this.order);\r\n }\r\n\r\n setClass() {\r\n this.orderClasses.forEach((next) => this.element.classList.remove(next));\r\n this.element.classList.add(this.orderClasses[this.order + 1]);\r\n }\r\n\r\n handleHeaderClicked() {\r\n this.order = this.order === 0 || this.order === -1 ? this.order + 1 : -1;\r\n this.setClass();\r\n this.doSort();\r\n }\r\n}\r\n","import {\r\n autoinject,\r\n bindable,\r\n bindingMode,\r\n BindingEngine,\r\n} from \"aurelia-framework\";\r\n\r\n@autoinject()\r\nexport class AureliaTableCustomAttribute {\r\n @bindable dataSource = \"local\"; // local, ajax and server;\r\n\r\n @bindable data;\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) displayData;\r\n\r\n @bindable filters;\r\n\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) currentPage;\r\n @bindable pageSize;\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) totalItems;\r\n\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) api;\r\n\r\n isAttached = false;\r\n\r\n sortKey;\r\n sortOrder;\r\n sortChangedListeners = [];\r\n\r\n @bindable({ defaultBindingMode: bindingMode.twoWay }) beforePagination = [];\r\n\r\n private customSort;\r\n\r\n dataObserver;\r\n filterObservers = [];\r\n\r\n constructor(private bindingEngine: BindingEngine, private element: Element) {\r\n\r\n }\r\n\r\n bind() {\r\n if (Array.isArray(this.data)) {\r\n this.dataObserver = this.bindingEngine\r\n .collectionObserver(this.data)\r\n .subscribe(() => this.applyPlugins());\r\n }\r\n\r\n this.filtersChanged();\r\n\r\n this.api = {\r\n revealItem: (item) => this.revealItem(item),\r\n };\r\n }\r\n\r\n attached() {\r\n this.isAttached = true;\r\n this.applyPlugins();\r\n }\r\n\r\n detached() {\r\n if (this.dataObserver) {\r\n this.dataObserver.dispose();\r\n }\r\n\r\n for (const observer of this.filterObservers) {\r\n observer.dispose();\r\n }\r\n }\r\n\r\n filtersChanged() {\r\n if (Array.isArray(this.filters)) {\r\n for (const observer of this.filterObservers) {\r\n observer.dispose();\r\n }\r\n\r\n for (const filter of this.filters) {\r\n const observer = this.bindingEngine\r\n .propertyObserver(filter, \"value\")\r\n .subscribe(() => this.filterChanged());\r\n this.filterObservers.push(observer);\r\n }\r\n }\r\n }\r\n\r\n filterChanged() {\r\n if (this.dataSource === \"server\") {\r\n return;\r\n }\r\n\r\n if (this.hasPagination()) {\r\n this.currentPage = 1;\r\n }\r\n this.applyPlugins();\r\n }\r\n\r\n currentPageChanged() {\r\n this.applyPlugins();\r\n }\r\n\r\n pageSizeChanged() {\r\n this.applyPlugins();\r\n }\r\n\r\n /**\r\n * Copies the data into the display data\r\n */\r\n getDataCopy() {\r\n return [].concat(this.data);\r\n }\r\n\r\n getPageData(localData) {\r\n if (this.hasPagination()) {\r\n this.beforePagination = [].concat(localData);\r\n return this.doPaginate(localData);\r\n }\r\n\r\n return localData;\r\n }\r\n\r\n /**\r\n * Applies all the plugins to the display data\r\n */\r\n applyPlugins() {\r\n if (!this.isAttached || !this.data || this.dataSource === \"server\") {\r\n return;\r\n }\r\n\r\n let localData = this.getDataCopy();\r\n\r\n if (this.hasFilter()) {\r\n localData = this.doFilter(localData);\r\n }\r\n\r\n if ((this.sortKey || this.customSort) && this.sortOrder !== 0) {\r\n this.doSort(localData);\r\n }\r\n\r\n this.totalItems = localData.length;\r\n\r\n this.displayData = this.getPageData(localData);\r\n }\r\n\r\n doFilter(toFilter) {\r\n const filteredData = [];\r\n\r\n for (const item of toFilter) {\r\n let passed = true;\r\n\r\n for (const filter of this.filters) {\r\n if (!this.passFilter(item, filter)) {\r\n passed = false;\r\n break;\r\n }\r\n }\r\n\r\n if (passed) {\r\n filteredData.push(item);\r\n }\r\n }\r\n\r\n return filteredData;\r\n }\r\n\r\n passFilter(item, filter) {\r\n if (typeof filter.custom === \"function\" && !filter.custom(filter.value, item) ) {\r\n return false;\r\n }\r\n\r\n // User provided value is invalid or empty\r\n if (\r\n filter.value === null ||\r\n filter.value === undefined ||\r\n filter.value === \"\" ||\r\n filter.value?.toString()?.trim() === '' ||\r\n !Array.isArray(filter.keys)\r\n ) {\r\n return true;\r\n }\r\n\r\n for (const key of filter.keys) {\r\n let value = this.getPropertyValue(item, key);\r\n\r\n if (value === null || value === undefined) {\r\n return false;\r\n }\r\n\r\n // If we have types, we are dealing with with select dropdowns\r\n if ( filter?.types ) {\r\n if (filter.value === 'true' || filter.value === 'false') {\r\n if (value.toString() === filter.value) {\r\n return true;\r\n } else {\r\n return false;\r\n }\r\n }\r\n\r\n if (value == filter.value) {\r\n return true;\r\n }\r\n } else {\r\n value = value.toString().toLowerCase();\r\n\r\n if (value.indexOf(filter.value.toString().toLowerCase()) > -1) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n doSort(toSort) {\r\n toSort.sort((a, b) => {\r\n if (typeof this.customSort === \"function\") {\r\n return this.customSort(a, b, this.sortOrder);\r\n }\r\n\r\n let val1;\r\n let val2;\r\n\r\n if (typeof this.sortKey === \"function\") {\r\n val1 = this.sortKey(a, this.sortOrder);\r\n val2 = this.sortKey(b, this.sortOrder);\r\n } else {\r\n val1 = this.getPropertyValue(a, this.sortKey);\r\n val2 = this.getPropertyValue(b, this.sortKey);\r\n }\r\n\r\n if (val1 === null) {\r\n val1 = \"\";\r\n }\r\n if (val2 === null) {\r\n val2 = \"\";\r\n }\r\n\r\n if (this.isNumeric(val1) && this.isNumeric(val2)) {\r\n return (val1 - val2) * this.sortOrder;\r\n }\r\n\r\n const str1 = val1?.toString() ?? '';\r\n const str2 = val2?.toString() ?? '';\r\n\r\n return str1.localeCompare(str2) * this.sortOrder;\r\n });\r\n }\r\n\r\n /**\r\n * Retrieves the value in the object specified by the key path\r\n * @param object the object\r\n * @param keyPath the path\r\n * @returns {*} the value\r\n */\r\n getPropertyValue(object, keyPath) {\r\n keyPath = keyPath.replace(/\\[(\\w+)\\]/g, \".$1\"); // convert indexes to properties\r\n keyPath = keyPath.replace(/^\\./, \"\"); // strip a leading dot\r\n const a = keyPath.split(\".\");\r\n for (let i = 0, n = a.length; i < n; ++i) {\r\n const k = a[i];\r\n if (k in object) {\r\n object = object[k];\r\n } else {\r\n return;\r\n }\r\n }\r\n return object;\r\n }\r\n\r\n isNumeric(toCheck) {\r\n return !isNaN(parseFloat(toCheck)) && isFinite(toCheck);\r\n }\r\n\r\n doPaginate(toPaginate) {\r\n if (toPaginate.length <= this.pageSize) {\r\n return toPaginate;\r\n }\r\n\r\n const start = (this.currentPage - 1) * this.pageSize;\r\n\r\n const end = start + this.pageSize;\r\n\r\n return toPaginate.slice(start, end);\r\n }\r\n\r\n hasFilter() {\r\n return Array.isArray(this.filters) && this.filters.length > 0;\r\n }\r\n\r\n hasPagination() {\r\n return this.currentPage > 0;\r\n }\r\n\r\n dataChanged() {\r\n if (this.dataObserver) {\r\n this.dataObserver.dispose();\r\n }\r\n\r\n this.dataObserver = this.bindingEngine\r\n .collectionObserver(this.data)\r\n .subscribe(() => this.applyPlugins());\r\n\r\n this.applyPlugins();\r\n }\r\n\r\n sortChanged(key, custom, order) {\r\n this.sortKey = key;\r\n this.customSort = custom;\r\n this.sortOrder = order;\r\n this.applyPlugins();\r\n this.emitSortChanged();\r\n }\r\n\r\n addSortChangedListener(callback) {\r\n this.sortChangedListeners.push(callback);\r\n }\r\n\r\n removeSortChangedListener(callback) {\r\n this.removeListener(callback, this.sortChangedListeners);\r\n }\r\n\r\n emitSortChanged() {\r\n for (const listener of this.sortChangedListeners) {\r\n listener();\r\n }\r\n }\r\n\r\n removeListener(callback, listeners) {\r\n const index = listeners.indexOf(callback);\r\n\r\n if (index > -1) {\r\n listeners.splice(index, 1);\r\n }\r\n }\r\n\r\n revealItem(item) {\r\n if (!this.hasPagination()) {\r\n return true;\r\n }\r\n\r\n const index = this.beforePagination.indexOf(item);\r\n\r\n if (index === -1) {\r\n return false;\r\n }\r\n\r\n this.currentPage = Math.ceil((index + 1) / this.pageSize);\r\n\r\n return true;\r\n }\r\n}\r\n","import { FrameworkConfiguration, PLATFORM } from 'aurelia-framework';\r\n\r\nexport function configure(config: FrameworkConfiguration) {\r\n config.globalResources([\r\n PLATFORM.moduleName('resources/plugins/aurelia-table/au-table'),\r\n PLATFORM.moduleName('resources/plugins/aurelia-table/au-table-pagination'),\r\n PLATFORM.moduleName('resources/plugins/aurelia-table/au-table-select'),\r\n PLATFORM.moduleName('resources/plugins/aurelia-table/au-table-sort'),\r\n ]);\r\n}\r\n","import { autoinject } from 'aurelia-framework';\r\nimport { FeatureFlag } from 'feature-flags';\r\nimport { IFeatureFlagService } from './i-feature-flag';\r\n\r\n@autoinject\r\nexport class FeatureFlagService implements IFeatureFlagService {\r\n constructor() {\r\n this.ensureFlagsInitialized();\r\n }\r\n\r\n private ensureFlagsInitialized(): void {\r\n if (typeof window.featureFlags === 'undefined') {\r\n window.featureFlags = {};\r\n }\r\n }\r\n\r\n public enabled(flag: FeatureFlag): boolean {\r\n return !!window.featureFlags[flag];\r\n }\r\n\r\n public add(flag: FeatureFlag): void {\r\n window.featureFlags[flag] = true;\r\n this.persistFlags();\r\n }\r\n\r\n public remove(flag: FeatureFlag): void {\r\n window.featureFlags[flag] = false;\r\n this.persistFlags();\r\n }\r\n\r\n private persistFlags(): void {\r\n localStorage.setItem('featureFlags', JSON.stringify(window.featureFlags));\r\n }\r\n\r\n public load(defaults: Partial> = {}): void {\r\n const savedFlags = JSON.parse(localStorage.getItem('featureFlags') || '{}');\r\n\r\n const initialFlags = { ...defaults };\r\n\r\n for (const flagKey in FeatureFlag) {\r\n const flag = FeatureFlag[flagKey];\r\n if (!(flag in defaults)) {\r\n initialFlags[flag] = savedFlags[flag];\r\n }\r\n }\r\n\r\n window.featureFlags = initialFlags;\r\n\r\n this.persistFlags();\r\n }\r\n}\r\n","import { Container, FrameworkConfiguration } from 'aurelia-framework';\r\nimport { FeatureFlag as FeatureFlags } from 'feature-flags';\r\nimport { FeatureFlagService } from './feature-flags-service';\r\nimport { IFeatureFlagService } from './i-feature-flag';\r\n\r\ninterface FeatureFlagsPluginConfiguration {\r\n defaultFlags?: Partial>;\r\n}\r\n\r\nlet configuredContainer: Container | null = null;\r\n\r\nexport function configure(config: FrameworkConfiguration, options: FeatureFlagsPluginConfiguration = {}) {\r\n const featureFlagService = config.container.get(FeatureFlagService);\r\n configuredContainer = config.container;\r\n\r\n // Register handlers for feature flags\r\n for (const flagKey in FeatureFlags) {\r\n if (Object.prototype.hasOwnProperty.call(FeatureFlags, flagKey)) {\r\n const flagIdentifier = FeatureFlags[flagKey];\r\n\r\n config.container.registerHandler(flagIdentifier, () => {\r\n return featureFlagService.enabled(flagIdentifier);\r\n });\r\n }\r\n }\r\n\r\n // Load default feature flags if provided\r\n if (options.defaultFlags) {\r\n featureFlagService.load(options.defaultFlags);\r\n }\r\n}\r\n\r\nexport function featureFlag(flagIdentifier: FeatureFlags) {\r\n return function featureFlagPropertyDecorator(target: unknown, key: string | symbol): void {\r\n if (typeof key === 'undefined') {\r\n throw new TypeError('@featureFlag requires a property key.');\r\n }\r\n\r\n defineFlagBackedProperty(target as Record, key, flagIdentifier);\r\n };\r\n}\r\n\r\nfunction defineFlagBackedProperty(target: Record, key: string | symbol, flagIdentifier: FeatureFlags): void {\r\n const getter = function () {\r\n return resolveFeatureFlagService().enabled(flagIdentifier);\r\n };\r\n\r\n if (!Reflect.deleteProperty(target, key)) {\r\n // ensure property cleared even if configurable false\r\n delete target[key];\r\n }\r\n\r\n Object.defineProperty(target, key, {\r\n get: getter,\r\n enumerable: true,\r\n configurable: true,\r\n });\r\n}\r\n\r\nfunction resolveFeatureFlagService(): IFeatureFlagService {\r\n const container = Container.instance ?? configuredContainer;\r\n\r\n if (!container) {\r\n throw new Error('No Aurelia container is available. Ensure the feature flag plugin is configured before use.');\r\n }\r\n\r\n return container.get(FeatureFlagService);\r\n}\r\n","type SequenceCallback = () => void;\r\n\r\nexport class KeyboardSequenceDetector {\r\n private sequences: Map = new Map();\r\n private listenerAttached = false;\r\n\r\n constructor() {\r\n // The constructor no longer automatically calls listenForKeySequence to allow for lazy loading\r\n }\r\n\r\n public registerSequence(label: string, keySequence: string[], callback: SequenceCallback): void {\r\n if (!this.listenerAttached) {\r\n this.listenForKeySequence();\r\n this.listenerAttached = true;\r\n }\r\n this.sequences.set(label, { sequence: keySequence, callback: callback, currentIndex: 0 });\r\n }\r\n\r\n public removeSequence(label: string): void {\r\n if (this.sequences.delete(label) && this.sequences.size === 0 && this.listenerAttached) {\r\n document.removeEventListener('keydown', this.handleKeydownBound);\r\n this.listenerAttached = false;\r\n }\r\n }\r\n\r\n private listenForKeySequence(): void {\r\n this.handleKeydownBound = this.handleKeydown.bind(this); // Store the bound function for removal\r\n document.addEventListener('keydown', this.handleKeydownBound);\r\n }\r\n\r\n private handleKeydownBound: (this: this, ev: KeyboardEvent) => any; // Define the type for the bound function\r\n\r\n private handleKeydown(event: KeyboardEvent): void {\r\n this.sequences.forEach((value, key) => {\r\n if (event.key === value.sequence[value.currentIndex]) {\r\n value.currentIndex++;\r\n\r\n if (value.currentIndex === value.sequence.length) {\r\n value.callback();\r\n value.currentIndex = 0; // Reset index to allow the sequence to be entered again.\r\n }\r\n } else {\r\n if (value.sequence.includes(event.key)) {\r\n value.currentIndex = 0; // Reset index if the sequence is broken.\r\n }\r\n }\r\n });\r\n }\r\n}\r\n\r\n// Usage\r\n// const detector = new KeyboardSequenceDetector();\r\n\r\n// // Register the Konami Code with a label\r\n// detector.registerSequence('konami', ['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'ArrowLeft', 'ArrowRight', 'b', 'a'], () => {\r\n// console.log('Konami Code entered!');\r\n// // Trigger any action here\r\n// });\r\n\r\n// Remove the Konami Code sequence by its label\r\n// detector.removeSequence('konami');\r\n","/* istanbul ignore file */\r\n\r\nimport { autoinject } from 'aurelia-dependency-injection';\r\nimport { Next, NavigationInstruction } from 'aurelia-router';\r\nimport { TaskQueue } from 'aurelia-framework';\r\nimport { PLATFORM } from 'aurelia-pal';\r\n\r\n@autoinject()\r\nexport class PostRenderStep {\r\n constructor(private taskQueue: TaskQueue) {}\r\n\r\n async run(navigationInstruction: NavigationInstruction, next: Next) {\r\n this.taskQueue.queueMicroTask(() => {\r\n PLATFORM.global.scrollTo(0, 0);\r\n });\r\n\r\n return next();\r\n }\r\n}\r\n","/* istanbul ignore file */\r\n\r\nimport { TaskNotificationTypes } from './enums';\r\nimport moment from 'moment';\r\n\r\nexport function prepareTasks(taskNotificationTypeId, tasks){\r\n switch (taskNotificationTypeId) {\r\n case TaskNotificationTypes.ALL:\r\n\r\n break;\r\n case TaskNotificationTypes.OVERDUE:\r\n tasks.forEach(x => {\r\n x.overdue=true;\r\n if(x.dueDate.split('T')[0] === moment().subtract('1', 'day').format('YYYY-MM-DD')){\r\n x.yesterday = true;\r\n x.dueDateLabel = 'Yesterday'\r\n }\r\n });\r\n break;\r\n case TaskNotificationTypes.DUE_TODAY:\r\n tasks.forEach(x => {\r\n x.duetoday=true;\r\n x.dueDateLabel = 'Today'\r\n });\r\n break;\r\n case TaskNotificationTypes.UPCOMING:\r\n tasks.forEach(x => {\r\n x.upcoming=true;\r\n\r\n if(x.dueDate.split('T')[0] === moment().add('1', 'day').format('YYYY-MM-DD')){\r\n x.tomorrow = true;\r\n x.dueDateLabel = 'Tomorrow'\r\n }\r\n });\r\n break;\r\n case TaskNotificationTypes.COMPLETE:\r\n tasks.forEach(x => {\r\n x.isCompletedTask=true;\r\n });\r\n // const result = (await response.json()).map(x => {\r\n // return {\r\n // isCompletedTask: true,\r\n // ...x, }\r\n // } );\r\n break;\r\n }\r\n\r\n return tasks;\r\n}\r\n","/* istanbul ignore file */\r\n\r\nexport class PreRenderStep {\r\n run(navigationInstruction, next) {\r\n const currentRoute = navigationInstruction.config;\r\n\r\n const currentRouteName = currentRoute.name;\r\n\r\n document.body.className = '';\r\n document.body.classList.add(`route--${currentRouteName}`);\r\n\r\n return next();\r\n }\r\n}\r\n","/* istanbul ignore file */\r\n\r\nexport function scrollIntoView(tableClassName, rowClassName = 'table-row-selected_') {\r\n setTimeout(() => {\r\n const tables = Array.from(document.querySelectorAll('table:not(.aurelia-hide)'));\r\n const table = tables.find((x) => x.className.includes(tableClassName)) as HTMLElement;\r\n if (table) {\r\n const tableRows = Array.from(table.querySelectorAll('tbody>tr'));\r\n const selectedTr = tableRows.find((x) => x.className.includes(rowClassName)) as HTMLElement;\r\n selectedTr?.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }, 0);\r\n}\r\n\r\nexport function scrollQCEErrorIntoView() {\r\n setTimeout(() => {\r\n const errors = document.querySelectorAll('qce .auFormInputError');\r\n if (errors.length) {\r\n errors[0].scrollIntoView({behavior: \"smooth\", block: \"center\", });\r\n }\r\n }, 0);\r\n}\r\n","import { ActionCallback, FilterCallback, Hook } from 'interfaces/i-aurelia-hooks';\r\n\r\nexport class AureliaHooks {\r\n private actions: Record = {};\r\n private filters: Record = {};\r\n\r\n addAction(name: string, callback: ActionCallback, priority = 10): void {\r\n this.actions[name] = this.actions[name] ?? [];\r\n const newHook = { priority, callback };\r\n this.actions[name] = [...this.actions[name], newHook].sort((a, b) => a.priority - b.priority);\r\n }\r\n\r\n addFilter(name: string, callback: FilterCallback, priority = 10): void {\r\n this.filters[name] = this.filters[name] ?? [];\r\n const newHook = { priority, callback };\r\n this.filters[name] = [...this.filters[name], newHook].sort((a, b) => a.priority - b.priority);\r\n }\r\n\r\n hasAction(name: string): boolean {\r\n return this.actions[name] !== undefined;\r\n }\r\n\r\n hasFilter(name: string): boolean {\r\n return this.filters[name] !== undefined;\r\n }\r\n\r\n getActions(name: string): Hook[] {\r\n return this.actions[name] ?? [];\r\n }\r\n\r\n getFilters(name: string): Hook[] {\r\n return this.filters[name] ?? [];\r\n }\r\n\r\n removeAction(name: string, callback: ActionCallback): void {\r\n if (this.actions[name]) {\r\n this.actions[name] = this.actions[name].filter((val) => val.callback !== callback);\r\n\r\n if (this.actions[name].length === 0) {\r\n delete this.actions[name];\r\n }\r\n }\r\n }\r\n\r\n removeAllActions(name: string): void {\r\n if (this.actions[name]) {\r\n delete this.actions[name];\r\n }\r\n }\r\n\r\n removeFilter(name: string, callback: FilterCallback): void {\r\n if (this.filters[name]) {\r\n this.filters[name] = this.filters[name].filter((val) => val.callback !== callback);\r\n\r\n if (this.filters[name].length === 0) {\r\n delete this.filters[name];\r\n }\r\n }\r\n }\r\n\r\n removeAllFilters(name: string): void {\r\n if (this.filters[name]) {\r\n delete this.filters[name];\r\n }\r\n }\r\n\r\n doAction(name: string, ...args: unknown[]): void {\r\n if (this.actions[name] && this.actions[name].length) {\r\n this.actions[name].forEach((hook) => {\r\n try {\r\n (hook.callback as ActionCallback)(...args);\r\n } catch (error) {\r\n console.error(`Error in action \"${name}\":`, error);\r\n }\r\n });\r\n }\r\n }\r\n\r\n async applyFilter(name: string, value: T, ...args: unknown[]): Promise {\r\n if (this.filters[name] && this.filters[name].length) {\r\n for (const hook of this.filters[name]) {\r\n try {\r\n const result = (hook.callback as FilterCallback)(value, ...args);\r\n\r\n // Check if the result is a promise or not\r\n if (result instanceof Promise) {\r\n value = await result;\r\n } else {\r\n value = result as T;\r\n }\r\n } catch (error) {\r\n console.error(`Error in filter \"${name}\":`, error);\r\n throw error; // Re-throw the error to propagate it\r\n }\r\n }\r\n }\r\n\r\n return value;\r\n }\r\n}\r\n","import { autoinject } from 'aurelia-framework';\r\nimport { HttpClient, json } from 'aurelia-fetch-client';\r\nimport { environment } from 'environment';\r\n\r\n@autoinject()\r\nexport class BlobService {\r\n constructor(private http: HttpClient) {}\r\n\r\n async downloadBlobFromUrl(fileName: string, url: string): Promise {\r\n if (this.isValidParams(fileName, url)) {\r\n const blob = await this.urlToBlob({ fileName, blobUrl: url });\r\n if (blob) {\r\n this.downloadFile(blob, fileName);\r\n }\r\n } else {\r\n console.error('Invalid params passed to BlobService');\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves the bytes behind a blob url without saving them. Goes through the octet-stream\r\n * endpoint rather than fetching the blob url directly, so it does not depend on a CORS rule being\r\n * configured on every storage account in every environment.\r\n */\r\n async getBlobFromUrl(fileName: string, url: string): Promise {\r\n if (!this.isValidParams(fileName, url)) {\r\n throw new Error('Invalid params passed to BlobService');\r\n }\r\n\r\n const blob = await this.urlToBlob({ fileName, blobUrl: url });\r\n\r\n if (!blob) {\r\n throw new Error(`${fileName} could not be retrieved from storage.`);\r\n }\r\n\r\n return blob;\r\n }\r\n\r\n private isValidParams(fileName: string, url: string): boolean {\r\n return typeof url === 'string' && url.includes('http') && typeof fileName === 'string' && fileName.length > 0;\r\n }\r\n\r\n downloadFile(blob: Blob, fileName: string): void {\r\n const a = document.createElement('a');\r\n a.download = fileName;\r\n a.href = window.URL.createObjectURL(blob);\r\n document.body.appendChild(a);\r\n a.click();\r\n a.remove();\r\n }\r\n\r\n private async urlToBlob(body): Promise {\r\n const endpoint = environment.utils.urlToOctetStrem;\r\n const uri = endpoint.uri();\r\n\r\n try {\r\n const result = await this.http.fetch(uri, {\r\n body: json(body),\r\n headers: endpoint.headers,\r\n method: endpoint.method,\r\n });\r\n\r\n if (result.ok) {\r\n return result.blob();\r\n }\r\n } catch (error) {\r\n console.error(error.message);\r\n }\r\n\r\n return undefined;\r\n }\r\n}\r\n","import { autoinject } from 'aurelia-framework';\r\nimport { HttpClient } from 'aurelia-fetch-client';\r\nimport { Store } from 'aurelia-store';\r\nimport { State } from 'store/state';\r\nimport { Subscription } from 'rxjs';\r\n\r\nimport { environment } from 'environment';\r\n\r\n@autoinject()\r\nexport class ClaimsService {\r\n subscription: Subscription;\r\n claims: string[] = [];\r\n\r\n constructor(public store: Store, public http: HttpClient) {\r\n this.subscription = this.store.state.subscribe((state: State) => {\r\n if (state && Array.isArray(state.userClaims)) {\r\n this.claims = state.userClaims;\r\n }\r\n });\r\n }\r\n\r\n async getClaims() {\r\n try {\r\n const response = await this.http.fetch(`${environment.apiHost}/api/users/current/claims`);\r\n\r\n const { claims } = await response.json();\r\n const expiry = response.headers.get('X-Expiry');\r\n const expiryDate = new Date(expiry).getTime();\r\n\r\n return { claims: Array.isArray(claims) ? claims : [], expiryDate };\r\n } catch (e) {\r\n return { claims: [], expiryDate: null };\r\n }\r\n }\r\n\r\n /**\r\n * Returns true or false if the user has one or more claims\r\n *\r\n * @param claim string || string[]\r\n */\r\n has(claim: string | string[]): boolean {\r\n if (!Array.isArray(this.claims)) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(claim)) {\r\n return claim.every((value) => this.claims.includes(value));\r\n }\r\n\r\n return this.claims.includes(claim);\r\n }\r\n\r\n /**\r\n * Drops the cached claims for whoever was previously signed in on this tab. this.claims is a\r\n * singleton field that otherwise survives a new login (no full page reload happens between an\r\n * SSO account switch and the next hasAsync call), so without this the next user's permission\r\n * checks would silently answer with the previous user's claims until the cache's own expiry\r\n * passed. Call after every new token is issued, before anything reads claims for the new session.\r\n */\r\n reset() {\r\n this.claims = [];\r\n localStorage.removeItem('iadviserClaimsExpiry');\r\n localStorage.removeItem('iAdviserUserClaims');\r\n }\r\n\r\n async hasAsync(claim: string | string[]): Promise {\r\n if (!Array.isArray(this.claims) || !this.claims.length) {\r\n const { expiryDate, claims } = await this.getClaims();\r\n this.claims = Array.isArray(claims) ? claims : [];\r\n localStorage.setItem('iadviserClaimsExpiry', expiryDate?.toString() ?? '');\r\n localStorage.setItem('iAdviserUserClaims', JSON.stringify(this.claims));\r\n }\r\n\r\n const dateNow = new Date().getTime();\r\n const expiry = parseInt(localStorage.getItem('iadviserClaimsExpiry') ?? '');\r\n\r\n if (isNaN(expiry) || dateNow > expiry) {\r\n const { expiryDate, claims } = await this.getClaims();\r\n this.claims = Array.isArray(claims) ? claims : [];\r\n localStorage.setItem('iadviserClaimsExpiry', expiryDate?.toString() ?? '');\r\n localStorage.setItem('iAdviserUserClaims', JSON.stringify(this.claims));\r\n }\r\n\r\n if (!Array.isArray(this.claims)) {\r\n return false;\r\n }\r\n\r\n if (Array.isArray(claim)) {\r\n return claim.some((value) => this.claims.includes(value));\r\n }\r\n\r\n return this.claims.includes(claim);\r\n }\r\n}\r\n","import { HttpClient, json } from 'aurelia-fetch-client';\r\nimport { autoinject } from 'aurelia-framework';\r\nimport { environment } from 'environment';\r\nimport { RequestMethod } from 'resources/endpoints/endpoints';\r\nimport { PLATFORM } from 'aurelia-pal';\r\nimport { log } from './log-service';\r\nimport { BlobService } from 'resources/services/blob-service';\r\nimport { DistributionType } from 'components/document-pack/constants';\r\nimport { AppRouter } from 'aurelia-router';\r\nimport { ModalService } from 'components/modal/modal-service';\r\nimport { IaMailtoModal } from 'components/ia-mailto-modal/ia-mailto-modal';\r\nexport interface StatusResult {\r\n entityId: number;\r\n reportId: number;\r\n reportSystemKey: string;\r\n generationStatus: number;\r\n docCreationProgress: number;\r\n reportCategory: number;\r\n statusMessage: string;\r\n lastException: {\r\n message: string;\r\n };\r\n isCompletedState: boolean;\r\n GenerationStatusString: string;\r\n reportCreationProgress: string;\r\n index: number;\r\n id: string;\r\n}\r\n\r\n@autoinject()\r\nexport class ClientStatementService {\r\n public processingBrowserPopupsDisabled: boolean;\r\n public processingError: string;\r\n private isProcessing = false;\r\n\r\n constructor(\r\n private http: HttpClient,\r\n private blobService: BlobService,\r\n private router: AppRouter,\r\n private modal: ModalService,\r\n ) {}\r\n\r\n async getDocument(params, distributionType: DistributionType) {\r\n if (!this.isProcessing) {\r\n this.beginProcessing();\r\n try {\r\n const documentUrl = await this.postDocumentGeneration(params);\r\n\r\n if (typeof documentUrl !== 'undefined') {\r\n this.processDocumentUrl(documentUrl, distributionType, params);\r\n } else {\r\n log.error('The requested document failed to generate, please try again.');\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n this.endProcessing();\r\n }\r\n }\r\n\r\n beginProcessing() {\r\n this.isProcessing = true;\r\n this.processingError = '';\r\n this.processingBrowserPopupsDisabled = false;\r\n }\r\n\r\n endProcessing() {\r\n this.isProcessing = false;\r\n }\r\n\r\n async processDocumentUrl(documentUrl: string, distributionType: DistributionType, params: any) {\r\n switch (distributionType) {\r\n case DistributionType.Preview:\r\n await this.openPreview(documentUrl);\r\n break;\r\n case DistributionType.Print:\r\n await this.fetchAndPrintDocument(documentUrl);\r\n break;\r\n case DistributionType.Download:\r\n case DistributionType.DownloadEmail:\r\n await this.downloadAndEmailDocument(documentUrl, distributionType, params.ClientId);\r\n break;\r\n }\r\n }\r\n\r\n async openPreview(documentUrl: string) {\r\n const clientName = document.title.split('|')[0].trim();\r\n\r\n const routeFragment = this.router.generate('pdfPreview', {\r\n title: `Statement | ${clientName}`,\r\n url: documentUrl,\r\n });\r\n\r\n const newWindow = PLATFORM.global.open(routeFragment, '_blank');\r\n if (newWindow === null) {\r\n this.processingBrowserPopupsDisabled = true;\r\n }\r\n }\r\n\r\n async fetchAndPrintDocument(documentUrl: string) {\r\n const response = await fetch(documentUrl);\r\n const fileBlob = await response.blob();\r\n const documentUrlFromBlob = URL.createObjectURL(fileBlob);\r\n const iframeContainer = document.getElementById('iframe-container') as HTMLIFrameElement;\r\n const iframe = this.getOrCreateIframe(iframeContainer, 'iframe-print-preview');\r\n\r\n iframe.src = documentUrlFromBlob;\r\n iframe.onload = async () => {\r\n iframe.focus();\r\n iframe.contentWindow.print();\r\n };\r\n\r\n if (iframeContainer.childElementCount === 0) {\r\n iframeContainer.appendChild(iframe);\r\n }\r\n }\r\n\r\n getOrCreateIframe(iframeContainer: HTMLIFrameElement, iframeId: string): HTMLIFrameElement {\r\n if (iframeContainer.childElementCount === 0) {\r\n const iframe = document.createElement('iframe');\r\n iframe.id = iframeId;\r\n return iframe;\r\n }\r\n\r\n return document.getElementById(iframeId) as HTMLIFrameElement;\r\n }\r\n\r\n async downloadAndEmailDocument(documentUrl: string, distributionType: DistributionType, clientId: number) {\r\n const clientName = document.title.split('|')[0].replace(' - ', '_').replace(' ', '_').trim();\r\n\r\n this.blobService.downloadBlobFromUrl(`Client_Statement_${clientName}.pdf`, documentUrl);\r\n\r\n if (distributionType === DistributionType.DownloadEmail) {\r\n const model = { clientId };\r\n this.modal.show().content(IaMailtoModal, { mode: 'client-statement', model }).withOptions({ type: 'wide-lg' });\r\n }\r\n }\r\n\r\n async postDocumentGeneration(params) {\r\n try {\r\n const queue = await this.http.fetch(`${environment.apiHost}/reportapi/reports/generate/queue`, {\r\n method: RequestMethod.post,\r\n body: json(params),\r\n });\r\n\r\n const queueGuid = await queue.json();\r\n\r\n if (queue.status === 200) {\r\n const statusResult = await this.pollDocumentStatus(queueGuid, 50, 2000);\r\n let documentUrl;\r\n\r\n if (statusResult.GenerationStatusString === 'Ready') {\r\n documentUrl = await this.getDocumentUrl(queueGuid);\r\n }\r\n\r\n if (statusResult.GenerationStatusString === 'Error') {\r\n this.processError(statusResult.lastException.message);\r\n }\r\n\r\n return documentUrl;\r\n } else {\r\n throw new Error(queueGuid.ExceptionMessage);\r\n }\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n }\r\n\r\n processError(errorMessage: string) {\r\n this.processingError = errorMessage;\r\n\r\n if (errorMessage.toLowerCase() === 'no data') {\r\n this.processingError = 'No data returned for client statement.';\r\n }\r\n }\r\n\r\n async pollDocumentStatus(queueGuid, attempts, delayInMs) {\r\n let completed = false;\r\n let statusResult: StatusResult;\r\n let counter = 0;\r\n\r\n while (!completed && counter < attempts) {\r\n await this.timer(delayInMs); // delay status check\r\n statusResult = await this.getDocumentCreationStatus(queueGuid);\r\n completed = statusResult.isCompletedState;\r\n counter++;\r\n }\r\n\r\n return statusResult;\r\n }\r\n\r\n async getDocumentCreationStatus(queueGuid) {\r\n try {\r\n const result = await this.http.fetch(`${environment.apiHost}/reportapi/reports/generate/${queueGuid}/status`, {\r\n method: RequestMethod.get,\r\n });\r\n return await result.json();\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n }\r\n\r\n async getDocumentUrl(queueGuid) {\r\n try {\r\n const result = await this.http.fetch(`${environment.apiHost}/reportapi/reports/generate/${queueGuid}/url/pdf`, {\r\n method: RequestMethod.get,\r\n });\r\n return await result.json();\r\n } catch (error) {\r\n log.error(error);\r\n }\r\n }\r\n\r\n async timer(msec): Promise {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, msec);\r\n });\r\n }\r\n}\r\n","import { autoinject } from 'aurelia-dependency-injection';\r\nimport izitoast, { IziToastSettings, IziToastProgress } from 'izitoast';\r\nimport '!style-loader!css-loader!izitoast/dist/css/iziToast.css';\r\nimport '!style-loader!css-loader!styles/ia-toast.css';\r\nimport { computedFrom } from 'aurelia-binding';\r\nimport { TaskQueue } from 'aurelia-framework';\r\n\r\n/**\r\n * `iaAnyware` toast messenger service for global/component user messages\r\n *\r\n * Message types include success, error, warning, info, progress and question\r\n *\r\n * @see {@link IaToast} interface for available functionality (methods and options)\r\n * @see {@link router-layouts/client-nav/components.ClientDetails ClientDetails} component for an example usage\r\n */\r\n@autoinject()\r\nexport class IaToastService implements IaToast {\r\n private defaultOptions: IaToastOptions = {\r\n class: 'ia-toast',\r\n position: 'bottomRight',\r\n theme: 'light',\r\n layout: 1,\r\n title: '',\r\n titleColor: '#FFFFFF',\r\n messageColor: '#FFFFFF',\r\n iconColor: '#FFFFFF',\r\n backgroundColor: '#09A47A',\r\n close: true,\r\n closeOnEscape: false,\r\n closeOnClick: false,\r\n timeout: 3000,\r\n overlay: false,\r\n overlayClose: false,\r\n overlayColor: 'rgba(255,255,255,0.24)',\r\n transitionIn: 'fadeInUp',\r\n transitionOut: 'fadeOutDown',\r\n animateInside: false,\r\n progressBar: true,\r\n image: '',\r\n imageWidth: 50,\r\n maxWidth: null,\r\n displayMode: 0,\r\n drag: false,\r\n };\r\n\r\n private loader: IaToastMessage;\r\n private loaderOpen = false;\r\n\r\n constructor(private taskQueue: TaskQueue) {\r\n if (!izitoast)\r\n throw new Error('IziToast: Sorry but it seems the IziToast plugin is not available for the IaToastService!');\r\n izitoast.settings(this.defaultOptions);\r\n if (this.loader && this.loader.overrideOptions) return;\r\n this.bootstrapLoader();\r\n }\r\n\r\n setDefaultOptions(options: IaToastOptions): void {\r\n this.defaultOptions = { ...this.defaultOptions, ...options };\r\n izitoast.settings(this.defaultOptions);\r\n }\r\n\r\n getDefaultOptions(): IaToastOptions {\r\n return this.defaultOptions;\r\n }\r\n\r\n destroyAllToasts(): void {\r\n izitoast.destroy();\r\n }\r\n\r\n @computedFrom('loaderOpen')\r\n get isLoaderOpen() {\r\n return this.loaderOpen;\r\n }\r\n\r\n show(toast: IaToastMessage, toastMessageIsRequired = true): boolean | void {\r\n return izitoast.show(this.mergeToastSettings(toast, toastMessageIsRequired));\r\n }\r\n\r\n hide(toastRef: string | HTMLDivElement, toast?: IaToastMessage, closedBy?: string): void {\r\n let toastElement: HTMLDivElement;\r\n\r\n if (typeof toastRef === 'string' || toastRef instanceof String) {\r\n toastElement = document.querySelector(toastRef.toString());\r\n } else {\r\n toastElement = toastRef;\r\n }\r\n\r\n if (!toastElement) return;\r\n izitoast.hide(this.mergeToastSettings(toast, false), toastElement, closedBy);\r\n }\r\n\r\n public info(toast: IaToastMessage): void {\r\n toast.overrideOptions.timeout = false;\r\n toast.overrideOptions.layout = 2;\r\n\r\n izitoast.info(this.mergeToastSettings(toast));\r\n }\r\n\r\n progress(toastRef: HTMLDivElement, toast?: IaToastMessage, callback?: () => void): IaToastProgress {\r\n return izitoast.progress(this.mergeToastSettings(toast, false), toastRef, callback);\r\n }\r\n\r\n success(toast: IaToastMessage): void {\r\n toast.overrideOptions.layout = 2;\r\n\r\n izitoast.success(this.mergeToastSettings(toast));\r\n }\r\n\r\n warning(toast: IaToastMessage): void {\r\n toast.overrideOptions.timeout = false;\r\n toast.overrideOptions.layout = 2;\r\n\r\n izitoast.warning(this.mergeToastSettings(toast));\r\n }\r\n\r\n error(toast: IaToastMessage): void {\r\n toast.overrideOptions.timeout = false;\r\n toast.overrideOptions.layout = 2;\r\n\r\n izitoast.error(this.mergeToastSettings(toast));\r\n\r\n this.restoreDefaultSettings(toast);\r\n }\r\n\r\n question(toast: IaToastMessage): void {\r\n izitoast.question(this.mergeToastSettings(toast));\r\n }\r\n\r\n getLoaderPath(loader: Loader) {\r\n return require(`img/loaders/${loader}`);\r\n }\r\n\r\n showLoader(loader?: Loader, loaderText = '') {\r\n this.taskQueue.queueMicroTask(() => {\r\n if (this.loaderOpen) return;\r\n\r\n if (loader) {\r\n this.loader.overrideOptions.image = this.getLoaderPath(loader);\r\n }\r\n this.loader.overrideOptions.$loaderText = loaderText;\r\n\r\n this.show(this.loader, false);\r\n this.loaderOpen = true;\r\n });\r\n }\r\n\r\n hideLoader(showStatusIcon = false, statusSuccess = true, statusIconTimeout = 1000) {\r\n this.taskQueue.queueMicroTask(() => {\r\n if (!this.loaderOpen) return;\r\n\r\n this.hide(`.${this.loader.overrideOptions.class}`);\r\n this.loaderOpen = false;\r\n\r\n if (showStatusIcon) {\r\n this.showStatusIcon(statusSuccess, statusIconTimeout);\r\n }\r\n });\r\n }\r\n\r\n private showStatusIcon(statusSuccess: boolean, statusIconTimeout: number) {\r\n const existingImage = this.loader.overrideOptions.image;\r\n const existingTransIn = this.loader.overrideOptions.transitionIn;\r\n const existingTimeout = this.loader.overrideOptions.timeout;\r\n const existingOnClosed = this.loader.overrideOptions.onClosed;\r\n\r\n this.loader.overrideOptions.timeout = statusIconTimeout;\r\n this.loader.overrideOptions.transitionIn = statusSuccess ? 'bounceInUp' : 'bounceInDown';\r\n\r\n this.loader.overrideOptions.onClosed = () => {\r\n this.hide(`.${this.loader.overrideOptions.class}`);\r\n this.loader.overrideOptions.image = existingImage;\r\n this.loader.overrideOptions.transitionIn = existingTransIn;\r\n this.loader.overrideOptions.timeout = existingTimeout;\r\n this.loader.overrideOptions.onClosed = existingOnClosed;\r\n };\r\n\r\n this.showLoader(statusSuccess ? Loader.GreenTick : Loader.RedCross);\r\n }\r\n\r\n private bootstrapLoader(loader = Loader.TailSpin) {\r\n this.loader = new IaToastMessage();\r\n\r\n this.loader.overrideOptions = {\r\n id: 'iaToastLoader',\r\n overlay: true,\r\n overlayClose: false,\r\n overlayColor: 'rgba(255,255,255,0.84)',\r\n close: false,\r\n class: 'ia-loader-toast',\r\n timeout: false,\r\n closeOnClick: false,\r\n closeOnEscape: false,\r\n position: 'center',\r\n transitionIn: 'fadeIn',\r\n transitionOut: 'fadeOut',\r\n animateInside: false,\r\n drag: false,\r\n backgroundColor: 'transparent',\r\n progressBar: false,\r\n image: this.getLoaderPath(loader),\r\n imageWidth: 50,\r\n maxWidth: 50,\r\n displayMode: 1,\r\n $loaderText: '',\r\n $loaderTextClass: 'ia-loader-text',\r\n };\r\n\r\n this.loader.overrideOptions.onOpening = () => {\r\n this.addLoaderText();\r\n this.loaderOpen = true;\r\n };\r\n\r\n this.loader.overrideOptions.onClosing = () => {\r\n this.removeLoaderText();\r\n this.loaderOpen = false;\r\n };\r\n }\r\n\r\n private addLoaderText() {\r\n if (!this.loader.overrideOptions.$loaderText) return;\r\n\r\n const loaderText = document.createElement('h3');\r\n loaderText.classList.add(this.loader.overrideOptions.$loaderTextClass);\r\n\r\n loaderText.appendChild(document.createTextNode(this.loader.overrideOptions.$loaderText));\r\n document.querySelector(`.${this.loader.overrideOptions.class}`)?.parentNode?.appendChild(loaderText);\r\n }\r\n\r\n private removeLoaderText() {\r\n if (!this.loader.overrideOptions.$loaderText) return;\r\n\r\n document.querySelector(`.${this.loader.overrideOptions.$loaderTextClass}`)?.remove();\r\n this.loader.overrideOptions.$loaderText = '';\r\n }\r\n\r\n private restoreDefaultSettings(toast: IaToastMessage) {\r\n toast.overrideOptions = { ...this.defaultOptions };\r\n }\r\n\r\n private mergeToastSettings(toast: IaToastMessage, toastMessageIsRequired = true): IziToastSettings {\r\n if (toastMessageIsRequired && (!toast || !toast.message || !toast.message.length)) {\r\n throw new Error('IA Toast: Toast message cannot be empty if \"toastMessageIsRequired\" is true!');\r\n }\r\n return toast ? { ...toast.overrideOptions, ...{ message: toast.message || '', title: toast.title || '' } } : {};\r\n }\r\n}\r\n\r\n/**\r\n * From `T` pick all properties except the set of properties `K`\r\n */\r\nexport type Omit = Pick>;\r\n/**\r\n * Various toast options available to change the toast behaviour\r\n */\r\nexport type IaToastOptions = Omit;\r\n/**\r\n * Toast progress bar interface\r\n */\r\nexport type IaToastProgress = IziToastProgress;\r\n\r\n/**\r\n * Method parameters object for different types of toast messages\r\n */\r\nexport class IaToastMessage {\r\n constructor(\r\n /**\r\n * Toast message body - required except for `progress` and `hide`\r\n */\r\n public message?: string,\r\n /**\r\n * Toast message title (optional)\r\n */\r\n public title?: string,\r\n /**\r\n * Toast message override options (optional)\r\n */\r\n public overrideOptions: IaToastOptions & { $loaderText?: string; $loaderTextClass?: string } = {},\r\n ) {}\r\n}\r\n\r\n/**\r\n * iaAnyware toast messenger interface for various message types\r\n */\r\nexport interface IaToast {\r\n /**\r\n * Sets the default options object for all toast messages\r\n *\r\n * Merges the provided options with existing standard defaults\r\n *\r\n * @param options default option values\r\n */\r\n setDefaultOptions(options: IaToastOptions): void;\r\n /**\r\n * Gets the current default options object for all toast messages\r\n */\r\n getDefaultOptions(): IaToastOptions;\r\n /**\r\n * Destroys all toast messages\r\n */\r\n destroyAllToasts(): void;\r\n /**\r\n * Opens a generic toast message; returns false if toast cannot be opened\r\n */\r\n show(toast: IaToastMessage): void | boolean;\r\n /**\r\n * Closes the specific toast message identified by `toastRef`\r\n *\r\n * Toast parameter `IaToastMessage` is optional and defaults to `{}`\r\n *\r\n * Set new `hide` options by passing `IaToastMessage.overrideOptions`\r\n *\r\n * @param toastRef Toast html element or string selector to close\r\n * @param toast toast message params (optional); default = `{}`\r\n * @param closedBy Custom closed by meta information (optional)\r\n */\r\n hide(toastRef: HTMLDivElement | string, toast?: IaToastMessage, closedBy?: string): void;\r\n /**\r\n * Toast control progress bar time identified by `toastRef`\r\n *\r\n * Toast parameter `IaToastMessage` is optional and defaults to `{}`\r\n *\r\n * Set `progress` options by passing `IaToastMessage.overrideOptions`\r\n *\r\n * @param toastRef Toast html element\r\n * @param toast toast message params (optional); default = `{}`\r\n * @param callback handler triggered for `IaToast.progress(...)`\r\n */\r\n progress(toastRef: HTMLDivElement, toast?: IaToastMessage, callback?: () => void): IaToastProgress;\r\n /**\r\n * Shows an information toast message\r\n */\r\n info(toast: IaToastMessage): void;\r\n /**\r\n * Shows a success toast message\r\n */\r\n success(toast: IaToastMessage): void;\r\n /**\r\n * Shows a warning toast message\r\n */\r\n warning(toast: IaToastMessage): void;\r\n /**\r\n * Shows an error toast message\r\n *\r\n * Message remains open until user dismisses it\r\n */\r\n error(toast: IaToastMessage): void;\r\n /**\r\n * Shows a question toast message\r\n */\r\n question(toast: IaToastMessage): void;\r\n}\r\n\r\n/**\r\n * All available loading indicators\r\n */\r\nexport enum Loader {\r\n Audio = 'audio.svg',\r\n BallTriangle = 'ball-triangle.svg',\r\n Bars = 'bars.svg',\r\n Circles = 'circles.svg',\r\n Grid = 'grid.svg',\r\n Hearts = 'hearts.svg',\r\n Oval = 'oval.svg',\r\n Puff = 'puff.svg',\r\n Rings = 'rings.svg',\r\n SpinningCircles = 'spinning-circles.svg',\r\n TailSpin = 'tail-spin.svg',\r\n ThreeDots = 'three-dots.svg',\r\n GreenTick = 'green-tick.svg',\r\n RedCross = 'red-cross.svg',\r\n}\r\n","import { LogManager } from 'aurelia-framework';\r\n\r\nexport const log = LogManager.getLogger('iAdviser');\r\n","import { PublicClientApplication, AccountInfo } from '@azure/msal-browser';\r\nimport { environment } from 'environment';\r\nimport { parseJwt } from 'resources/parse-jwt';\r\nimport { TokenService } from './token-service';\r\n\r\n// Scopes must match the interactive sign-in (login.ts) so MSAL can serve the renewal from its cache\r\n// instead of forcing an interactive prompt.\r\nconst SSO_SCOPES = ['openid', 'profile', 'email'];\r\n\r\n/**\r\n * Build an initialised MSAL client. Cached in localStorage so the account survives reloads and is visible\r\n * to the silent-renewal path (the Aurora token also lives in localStorage for SSO sessions) - a fresh\r\n * instance each call still sees that shared cache, and re-reading the config each time keeps login and\r\n * renewal on whatever Entra app the runtime app-config currently points at. Returns null when Microsoft\r\n * sign-in isn't configured.\r\n */\r\nexport async function getMsalClient(): Promise {\r\n // runtime app-config first (clone stage/live each use their own Entra app), then the build-time value -\r\n // login and silent renewal must resolve the same client id or renewal targets the wrong Entra app\r\n const clientId = environment.msalClientId || process.env.MSAL_CLIENT_ID;\r\n const tenantId = environment.msalTenantId || process.env.MSAL_TENANT_ID || 'common';\r\n\r\n if (!clientId) {\r\n return null;\r\n }\r\n\r\n const client = new PublicClientApplication({\r\n auth: {\r\n clientId,\r\n authority: `https://login.microsoftonline.com/${tenantId}`,\r\n redirectUri: window.location.origin,\r\n },\r\n cache: {\r\n cacheLocation: 'localStorage',\r\n storeAuthStateInCookie: false,\r\n },\r\n });\r\n\r\n await client.initialize();\r\n return client;\r\n}\r\n\r\n// Collapse concurrent renewals (eg the 20-min timer firing while a 401 is already renewing) into one call,\r\n// so the single-use Aurora refresh token isn't spent twice and the second caller get a spurious logout.\r\nlet inFlight: Promise | null = null;\r\n\r\n/**\r\n * Renew the current session in place, with no user interaction.\r\n *\r\n * SSO sessions renew *primarily* by acquiring a fresh Microsoft id_token silently and re-running the\r\n * /auth/callback exchange - that re-validates against Entra and re-reads SecurityUsers. Only if that can't\r\n * run do they fall back to the Aurora refresh token. Password sessions renew with the refresh token.\r\n *\r\n * @returns true if the session was renewed, false if no renewal path succeeded (the caller should log out).\r\n */\r\nexport function renewSession(tokenService: TokenService): Promise {\r\n if (!inFlight) {\r\n inFlight = doRenewSession(tokenService).finally(() => {\r\n inFlight = null;\r\n });\r\n }\r\n\r\n return inFlight;\r\n}\r\n\r\nasync function doRenewSession(tokenService: TokenService): Promise {\r\n if (tokenService.isSsoSession()) {\r\n try {\r\n await renewViaSso(tokenService);\r\n return true;\r\n } catch (error) {\r\n // silent renewal couldn't run (no cached account, Entra interaction required, not configured) -\r\n // fall through to the refresh-token fallback before giving up\r\n console.warn('Silent SSO renewal failed, falling back to refresh token', error);\r\n }\r\n }\r\n\r\n if (tokenService.getRefreshToken()) {\r\n try {\r\n await tokenService.refreshAuthToken();\r\n return true;\r\n } catch (error) {\r\n console.warn('Refresh-token renewal failed', error);\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nasync function renewViaSso(tokenService: TokenService): Promise {\r\n const client = await getMsalClient();\r\n if (!client) {\r\n throw new Error('Microsoft sign-in is not configured');\r\n }\r\n\r\n const account = getCachedAccount(client, tokenService);\r\n if (!account) {\r\n throw new Error('No cached Microsoft account for silent renewal');\r\n }\r\n\r\n // throws InteractionRequiredAuthError when the Entra session can't be renewed silently - caught upstream\r\n const result = await client.acquireTokenSilent({ account, scopes: SSO_SCOPES });\r\n\r\n // app_client_type/app_client_instance are already on the current Aurora token - reuse them so the\r\n // renewed token stays scoped to the same tenant/database\r\n const claims = parseJwt(tokenService.getAuthToken());\r\n\r\n const response = await fetch(`${environment.authHost}/auth/callback`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n id_token: result.idToken,\r\n app_client_type: claims.appct,\r\n app_client_instance: claims.appci,\r\n // keep the refreshed token's fallback refresh token bound to the same client id (see login.ts)\r\n client_id: environment.client,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`SSO renewal exchange failed with status ${response.status}`);\r\n }\r\n\r\n const data = await response.json();\r\n tokenService.saveToken(data, tokenService.getLocation('access_token'));\r\n}\r\n\r\nfunction getCachedAccount(client: PublicClientApplication, tokenService: TokenService): AccountInfo | null {\r\n const homeAccountId = tokenService.getMsalHomeAccountId();\r\n if (homeAccountId) {\r\n const byId = client.getAccount({ homeAccountId });\r\n if (byId) {\r\n return byId;\r\n }\r\n }\r\n\r\n const accounts = client.getAllAccounts();\r\n return accounts.length ? accounts[0] : null;\r\n}\r\n","import { environment } from 'environment';\r\nimport { inject } from 'aurelia-framework';\r\nimport { User } from '../models/user';\r\nimport { getDeviceTokenForUser, addDeviceTokenForUser } from 'resources/device-token-manager';\r\nimport { AuthTokenEndpoint, ITokenResponse } from 'endpoints/auth/token-endpoint';\r\n\r\ninterface StoredTokenResponse {\r\n access_token: string;\r\n refresh_token?: string | null;\r\n '.expires': string;\r\n}\r\n\r\n@inject(AuthTokenEndpoint)\r\nexport class TokenService {\r\n constructor(private endpoint: AuthTokenEndpoint) {}\r\n\r\n private decodeStoredToken(value: string): string | null {\r\n if (!value.startsWith('b64:')) {\r\n return value;\r\n }\r\n\r\n try {\r\n return atob(value.substring(4));\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n private getStoredToken(key: string): string | null {\r\n const storedValue = this.getLocation(key).getItem(key);\r\n\r\n return storedValue ? this.decodeStoredToken(storedValue) : null;\r\n }\r\n\r\n private setStoredToken(storage: Storage, key: string, value: string): void {\r\n storage.setItem(key, value);\r\n }\r\n\r\n async createAuthToken(user: User): Promise {\r\n const params: Record = {\r\n grant_type: user.webFormLinkCode ? 'web_form' : 'password',\r\n password_hashed: 'false',\r\n username: user.username,\r\n password: user.password,\r\n app_client_type: user.appClientType || '',\r\n app_client_instance: user.appClientInstance || '',\r\n web_form_link_code: user.webFormLinkCode,\r\n client_id: environment.client\r\n };\r\n\r\n const headers: Record = {};\r\n\r\n const deviceToken = getDeviceTokenForUser(user.username || '');\r\n if (deviceToken) {\r\n headers['X-Device-Token'] = deviceToken;\r\n }\r\n\r\n const { data, response } = await this.endpoint.fetch(null, params, headers);\r\n\r\n this.saveToken(data, user.webFormLinkCode ? sessionStorage : localStorage);\r\n\r\n if (response.headers.has('X-Password-Requires-Changing')) {\r\n const passwordRequiresChanging = response.headers.get('X-Password-Requires-Changing');\r\n if (passwordRequiresChanging !== null) {\r\n localStorage.setItem('userRequiresPasswordChange', passwordRequiresChanging);\r\n }\r\n }\r\n\r\n if (response.headers.has('X-Device-Id')) {\r\n const deviceId = response.headers.get('X-Device-Id');\r\n if (deviceId !== null) {\r\n localStorage.setItem('deviceId', deviceId);\r\n }\r\n }\r\n\r\n if (response.headers.has('X-Device-Token')) {\r\n const returnedDeviceToken = response.headers.get('X-Device-Token');\r\n if (returnedDeviceToken !== null) {\r\n addDeviceTokenForUser(user.username, returnedDeviceToken);\r\n }\r\n }\r\n\r\n if (response.headers.has('X-2FA-Setup-Reqd')) {\r\n const twoFactorSetupRequired = response.headers.get('X-2FA-Setup-Reqd');\r\n if (twoFactorSetupRequired !== null) {\r\n localStorage.setItem('twoFactorSetupRequired', twoFactorSetupRequired);\r\n }\r\n } else {\r\n /* istanbul ignore next */\r\n localStorage.removeItem('twoFactorSetupRequired');\r\n }\r\n\r\n if (response.headers.has('X-2FA-Code-Reqd')) {\r\n const twoFactorCodeRequired = response.headers.get('X-2FA-Code-Reqd');\r\n if (twoFactorCodeRequired !== null) {\r\n localStorage.setItem('twoFactorCodeRequired', twoFactorCodeRequired);\r\n }\r\n } else {\r\n /* istanbul ignore next */\r\n localStorage.removeItem('twoFactorCodeRequired');\r\n }\r\n\r\n if (response.headers.has('X-Password-Expiry-Days')) {\r\n const daysUntilPasswordExpiry = response.headers.get('X-Password-Expiry-Days');\r\n if (daysUntilPasswordExpiry !== null) {\r\n localStorage.setItem('daysUntilPasswordExpiry', daysUntilPasswordExpiry);\r\n }\r\n }\r\n\r\n if (response.headers.has('X-Licence-Acceptance-Reqd')) {\r\n const acceptLicenceAgreement = response.headers.get('X-Licence-Acceptance-Reqd');\r\n if (acceptLicenceAgreement !== null) {\r\n localStorage.setItem('acceptLicenceAgreement', acceptLicenceAgreement);\r\n }\r\n }\r\n\r\n return data;\r\n }\r\n\r\n /* istanbul ignore next */\r\n getAuthToken() {\r\n return this.getStoredToken('access_token');\r\n }\r\n\r\n /* istanbul ignore next */\r\n getRefreshToken() {\r\n return this.getStoredToken('refresh_token');\r\n }\r\n\r\n /* istanbul ignore next */\r\n getDeviceId() {\r\n return localStorage.getItem('deviceId');\r\n }\r\n\r\n /* istanbul ignore next */\r\n getDeviceTokens() {\r\n return localStorage.getItem('device_tokens');\r\n }\r\n\r\n /* istanbul ignore next */\r\n async refreshAuthToken() {\r\n const storage = this.getLocation('refresh_token');\r\n\r\n const params: Record = {};\r\n params['grant_type'] = 'refresh_token';\r\n params['client_id'] = environment.client;\r\n params['refresh_token'] = this.getStoredToken('refresh_token') || '';\r\n\r\n const result = (await this.endpoint.fetch(null, params)).data;\r\n\r\n this.saveToken(result, storage);\r\n\r\n return result;\r\n }\r\n\r\n saveToken(token: StoredTokenResponse, storage: Storage) {\r\n this.setStoredToken(storage, 'access_token', token.access_token);\r\n\r\n // the SSO grant issues no refresh token - Entra owns that session. setItem would store the\r\n // literal string \"null\", which reads as truthy everywhere getRefreshToken() is checked and\r\n // sends grant_type=refresh_token&refresh_token=null on the next renewal, logging the user out.\r\n if (token.refresh_token) {\r\n this.setStoredToken(storage, 'refresh_token', token.refresh_token);\r\n } else {\r\n storage.removeItem('refresh_token');\r\n }\r\n\r\n storage.setItem('access_token_expiry', token['.expires']);\r\n }\r\n\r\n removeToken() {\r\n const storage = this.getLocation('access_token');\r\n\r\n storage.removeItem('access_token');\r\n storage.removeItem('refresh_token');\r\n storage.removeItem('access_token_expiry');\r\n storage.removeItem('auth_method');\r\n storage.removeItem('msal_home_account_id');\r\n }\r\n\r\n /**\r\n * Mark the active session as SSO so renewal knows to run the MSAL silent flow first. Stores the MSAL\r\n * home account id (when MSAL gave us one) so silent renewal can target the exact account.\r\n */\r\n setSsoSession(homeAccountId: string | undefined, storage: Storage) {\r\n storage.setItem('auth_method', 'sso');\r\n if (homeAccountId) {\r\n storage.setItem('msal_home_account_id', homeAccountId);\r\n }\r\n }\r\n\r\n /* istanbul ignore next */\r\n isSsoSession(): boolean {\r\n return this.getStoredToken('auth_method') === 'sso';\r\n }\r\n\r\n /* istanbul ignore next */\r\n getMsalHomeAccountId(): string | null {\r\n return this.getStoredToken('msal_home_account_id');\r\n }\r\n\r\n getLocation(key: string): Storage {\r\n let storage = localStorage;\r\n\r\n if(sessionStorage.getItem(key)) {\r\n storage = sessionStorage;\r\n }\r\n\r\n return storage;\r\n }\r\n\r\n}\r\n","/*\r\n * An implementation of the Appender interface.\r\n */\r\nexport class ConsoleAppender {\r\n /**\r\n * Appends a debug log.\r\n *\r\n * @param logger The source logger.\r\n * @param rest The data to log.\r\n */\r\n debug(logger: { id: string }, ...rest: any[]): void {\r\n console.debug(`DEBUG [${logger.id}]`, ...rest);\r\n }\r\n\r\n /**\r\n * Appends an info log.\r\n *\r\n * @param logger The source logger.\r\n * @param rest The data to log.\r\n */\r\n info(logger: { id: string }, ...rest: any[]): void {\r\n console.info(`INFO [${logger.id}]`, ...rest);\r\n }\r\n\r\n /**\r\n * Appends a warning log.\r\n *\r\n * @param logger The source logger.\r\n * @param rest The data to log.\r\n */\r\n warn(logger: { id: string }, ...rest: any[]): void {\r\n console.warn(`WARN [${logger.id}]`, ...rest);\r\n }\r\n\r\n /**\r\n * Appends an error log.\r\n *\r\n * @param logger The source logger.\r\n * @param rest The data to log.\r\n */\r\n error(logger: { id: string }, ...rest: any[]): void {\r\n console.error(`ERROR [${logger.id}]`, ...rest);\r\n }\r\n}\r\n","import { Aurelia } from 'aurelia-framework';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { ValidationMessageProvider } from 'aurelia-validation';\r\n\r\nexport function i18tnValidation(aurelia: Aurelia) {\r\n const originalGetMessage = ValidationMessageProvider.prototype.getMessage;\r\n const originalGetDisplayName = ValidationMessageProvider.prototype.getDisplayName;\r\n ValidationMessageProvider.prototype.getMessage = function (key) {\r\n const i18n = aurelia.container.get(I18N);\r\n const translation = i18n.tr(`errorMessages.${key}`);\r\n const message = this.parser.parse(translation);\r\n\r\n if (message.value === translation) {\r\n return originalGetMessage.call(this, key);\r\n }\r\n return message;\r\n };\r\n\r\n ValidationMessageProvider.prototype.getDisplayName = function (propertyName, displayName) {\r\n const i18n = aurelia.container.get(I18N);\r\n\r\n if (displayName !== null && displayName !== undefined) {\r\n const translation = i18n.tr(displayName as string);\r\n\r\n if (translation === displayName) {\r\n return originalGetDisplayName.call(this, propertyName, displayName);\r\n }\r\n\r\n return translation;\r\n }\r\n const translation = i18n.tr(propertyName as string);\r\n\r\n if (translation === propertyName) {\r\n return originalGetDisplayName.call(this, propertyName, displayName);\r\n }\r\n\r\n return translation;\r\n };\r\n}\r\n","/* istanbul ignore file */\r\n\r\nexport function initScrollTabs(context) {\r\n context.tabPosition = 50;\r\n context.isRightChevronDisabled = false;\r\n\r\n if (context.tabUI) {\r\n // move tabs over\r\n const allTabs = context.tabUI.querySelectorAll(context.tabClass);\r\n\r\n if (allTabs.length) {\r\n allTabs.forEach((element) => {\r\n element.setAttribute('style', `position: relative; left: 50px;`);\r\n });\r\n\r\n context.tabUI.onwheel = (event) => {\r\n event.preventDefault();\r\n event.deltaY < 0 ? context.scrollTabs('left') : context.scrollTabs('right');\r\n };\r\n\r\n // Disabled right chevron when last tab becomes visible\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n if (entries[0].isIntersecting === true) {\r\n context.isRightChevronDisabled = true;\r\n }\r\n },\r\n { threshold: [1] },\r\n );\r\n\r\n allTabs[allTabs.length - 1].classList.add('lastTab');\r\n observer.observe(document.querySelector('.lastTab'));\r\n }\r\n }\r\n}\r\n\r\nexport function scrollTabs(context, direction) {\r\n if (context.tabUI) {\r\n const allTabs = context.tabUI.querySelectorAll(context.tabClass);\r\n\r\n if (allTabs.length) {\r\n if (direction === 'left') {\r\n if (context.isLeftChevronDisabled) return;\r\n\r\n if (context.isRightChevronDisabled) {\r\n context.isRightChevronDisabled = false;\r\n }\r\n\r\n context.tabPosition = context.tabPosition + 200;\r\n allTabs.forEach((element) => {\r\n element.setAttribute('style', `position: relative; left: ${context.tabPosition}px;`);\r\n });\r\n }\r\n\r\n if (direction === 'right') {\r\n if (context.isRightChevronDisabled) return;\r\n\r\n context.tabPosition = context.tabPosition - 200;\r\n allTabs.forEach((element) => {\r\n element.setAttribute('style', `position: relative; left: ${context.tabPosition}px;`);\r\n });\r\n }\r\n }\r\n }\r\n}\r\n","export async function timer(msec): Promise {\r\n return new Promise((resolve) => {\r\n setTimeout(() => {\r\n resolve();\r\n }, msec);\r\n });\r\n}\r\n","export function formatAdminDisplayText(value) {\r\n if (typeof value !== 'string') {\r\n return value;\r\n }\r\n\r\n return value\r\n .replace(/\\badvisers\\b/gi, 'Brokers')\r\n .replace(/\\badviser\\b/gi, 'Broker');\r\n}","/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ErrorItem, PlaceHolderValue, ServerErrorDescription, ExceptionMessage } from 'store/interfaces';\r\n\r\nexport function isArrayOfStrings(object: any): object is string[] {\r\n return Array.isArray(object) && object.every((item) => typeof item === 'string');\r\n}\r\n\r\nexport function isErrorItem(object: any): object is ErrorItem {\r\n return 'errorKey' in object && 'placeHolderVals' in object && isPlaceHolderValueArray(object.placeHolderVals);\r\n}\r\n\r\nexport function isErrorItemArray(object: any): object is ErrorItem[] {\r\n return Array.isArray(object) && object.every((item) => isErrorItem(item));\r\n}\r\n\r\nexport function isExceptionMessage(object: any): object is ExceptionMessage {\r\n return object && typeof object === 'object' && ('ExceptionMessage' in object || 'exceptionMessage' in object);\r\n}\r\n\r\nexport function isPlaceHolderValue(object: any): object is PlaceHolderValue {\r\n return 'varName' in object && 'val' in object;\r\n}\r\n\r\nexport function isPlaceHolderValueArray(object: any): object is PlaceHolderValue[] {\r\n return Array.isArray(object) && object.every((item) => isPlaceHolderValue(item));\r\n}\r\n\r\nexport function isServerErrorDescription(object: any): object is ServerErrorDescription {\r\n return 'guid' in object && 'property' in object && 'errors' in object && isErrorItemArray(object.errors);\r\n}\r\n\r\nexport function isServerErrorDescriptionArray(object: any): object is ServerErrorDescription[] {\r\n return Array.isArray(object) && object.every((item) => isServerErrorDescription(item));\r\n}\r\n","import { log } from './../services/log-service';\r\nimport { Container } from 'aurelia-framework';\r\nimport { I18N } from 'aurelia-i18n';\r\nimport { InsuredLocation } from 'resources/models/client';\r\nimport isObjectLike from 'lodash/isObjectLike';\r\nimport { flattenErrors } from 'resources/utilities/flatten-errors';\r\nimport {\r\n isServerErrorDescriptionArray,\r\n isExceptionMessage,\r\n isArrayOfStrings,\r\n} from 'resources/utilities/instance-of-interface';\r\nimport { IaToastService, IaToastMessage } from 'resources/services/ia-toast-service';\r\nimport { ServerError } from 'resources/interceptors/server-validation';\r\nimport { PlaceHolderValue, ExceptionMessage } from 'store/interfaces';\r\nimport { EntityMode, EntityActionType, EntityType } from 'routes/app-adviser/client/quotes/interfaces';\r\nimport moment from 'moment';\r\nimport { momentToLocalDateTimeString } from 'resources/moment-helpers';\r\n\r\nexport interface EntityWizardErrorMetaData {\r\n methodName: string;\r\n clientId: number;\r\n entityActionType: EntityActionType;\r\n entityType: EntityType;\r\n entityId: number;\r\n additionalPageId?: number;\r\n quoteOrVersionSituationId?: number;\r\n situationRiskId?: number;\r\n riskArray?: any[];\r\n mode?: EntityMode;\r\n location?: InsuredLocation;\r\n}\r\n\r\nexport async function entityWizardErrorHandler({ ...metaData }: EntityWizardErrorMetaData) {\r\n let errorMetaData = '';\r\n const i18n: I18N = Container.instance.get(I18N);\r\n const errorMessageTitle = i18n.tr('entityWizardApiError');\r\n\r\n for (let [key, value] of Object.entries(metaData)) {\r\n if (value) {\r\n if (isObjectLike(value)) {\r\n value = JSON.stringify(value);\r\n }\r\n errorMetaData += `\r\n ${key}: ${value}`;\r\n }\r\n }\r\n log.error(`${errorMessageTitle} => Failed for => ${errorMetaData}`);\r\n}\r\n\r\nexport async function httpErrorResponseHandler(response: Response) {\r\n if (response.ok) return;\r\n\r\n const toastr: IaToastService = Container.instance.get(IaToastService);\r\n const i18n: I18N = Container.instance.get(I18N);\r\n\r\n // Bad Request\r\n if (response.status === 400) {\r\n const responseClone = response.clone();\r\n const responseBody = await responseClone.json();\r\n\r\n const apiError = new ServerError(responseBody as any);\r\n\r\n if (!apiError || !apiError.serverErrors || !responseBody?.length) return;\r\n\r\n if (!apiError?.serverErrors && responseBody?.length) {\r\n apiError.serverErrors = responseBody as any;\r\n }\r\n\r\n const errors: string[] = [];\r\n\r\n if (isServerErrorDescriptionArray(apiError.serverErrors)) {\r\n const errorKeys = flattenErrors(apiError.serverErrors, true) as Map;\r\n const error = [];\r\n for (const [key, value] of errorKeys) {\r\n const options = {};\r\n if (value && value.length) {\r\n value.forEach((placeholder) => {\r\n Object.defineProperty(options, placeholder.varName, {\r\n value: placeholder.val,\r\n enumerable: true,\r\n writable: true,\r\n configurable: true,\r\n });\r\n });\r\n errors.push(i18n.tr(key as string, options));\r\n } else {\r\n errors.push(i18n.tr(key as string));\r\n }\r\n }\r\n } else if (isExceptionMessage(apiError.serverErrors)) {\r\n const errorObj = apiError.serverErrors as ExceptionMessage;\r\n const errMsg = errorObj.ExceptionMessage || errorObj.exceptionMessage;\r\n errors.push(errMsg);\r\n } else if (isObjectLike(apiError.serverErrors)) {\r\n let errList = '';\r\n\r\n for (const [key, value] of Object.entries(apiError.serverErrors)) {\r\n errList;\r\n if (!value) continue;\r\n\r\n if (isArrayOfStrings(value)) {\r\n value.forEach((v) => {\r\n errList += v;\r\n });\r\n } else if (isObjectLike(value)) {\r\n errList += JSON.stringify(value);\r\n } else {\r\n errList += value;\r\n }\r\n }\r\n errors.push(errList);\r\n }\r\n\r\n const toast = new IaToastMessage(formatErrorsForToast(errors), i18n.tr('server400ErrorTitle'));\r\n toastr.error(toast);\r\n }\r\n // Internal Server Error\r\n else if (response.status === 500) {\r\n const toast = new IaToastMessage(\r\n i18n.tr('server500ErrorMessage') + momentToLocalDateTimeString(moment()) + '
' + response.url,\r\n i18n.tr('server500ErrorTitle'),\r\n );\r\n toastr.error(toast);\r\n }\r\n}\r\n\r\nfunction formatErrorsForToast(errors: unknown[]): string {\r\n return errors\r\n .map((error) => cleanErrorMessage(error))\r\n .filter((message) => message.length)\r\n .join('
');\r\n}\r\n\r\nfunction cleanErrorMessage(error: unknown): string {\r\n if (typeof error !== 'string') {\r\n if (error == null) return '';\r\n return String(error);\r\n }\r\n\r\n return error\r\n .replace(/^\"(.*)\"$/, '$1')\r\n .replace(/\\\\r\\\\n/g, '
')\r\n .replace(/\\\\r/g, '
')\r\n .replace(/\\\\n/g, '
')\r\n .replace(/\\r\\n/g, '
')\r\n .replace(/\\r/g, '
')\r\n .replace(/\\n/g, '
')\r\n .trim();\r\n}\r\n","import { ServerErrorDescription, PlaceHolderValue } from 'store/interfaces';\r\n\r\n/**\r\n * Flatten the `errors` provided into an array to cater for aurelia localization.\r\n *\r\n * If `mapErrorKeyToPlaceHolderVals` is `true`, @returns a `Map`.\r\n * The `Map` dictionary object's `key` is the actual `errorKey` and `value` is `placeHolderVals[]`.\r\n *\r\n * If `mapErrorKeyToPlaceHolderVals` is `false` (default), @returns `string [ prependNamespace:MY_ERROR_KEY_1, ... ]`.\r\n *\r\n * Pass `prependNamespace = ''` to return error keys without a namespace.\r\n */\r\nexport function flattenErrors(\r\n errors: ServerErrorDescription[],\r\n mapErrorKeyToPlaceHolderVals = false,\r\n prependNamespace = 'errors',\r\n): string[] | Map {\r\n if (!errors || !errors.length) return;\r\n\r\n const namespace = prependNamespace ? `${prependNamespace}:` : '';\r\n let flattenedErrors: string[] | Map;\r\n\r\n if (mapErrorKeyToPlaceHolderVals) {\r\n flattenedErrors = new Map();\r\n } else {\r\n flattenedErrors = [];\r\n }\r\n\r\n errors.forEach((error) => {\r\n if (!error.errors || !error.errors.length) return;\r\n\r\n error.errors.forEach((errorActual) => {\r\n const errorKey = `${namespace}${errorActual.errorKey}`;\r\n\r\n if (mapErrorKeyToPlaceHolderVals) {\r\n flattenedErrors = flattenedErrors as Map;\r\n\r\n if (flattenedErrors.has(errorKey)) {\r\n const allPlaceHolderVals = flattenedErrors.get(errorKey).concat(errorActual.placeHolderVals);\r\n flattenedErrors.set(errorKey, allPlaceHolderVals);\r\n } else {\r\n flattenedErrors.set(errorKey, errorActual.placeHolderVals);\r\n }\r\n } else {\r\n (flattenedErrors as string[]).push(errorKey);\r\n }\r\n });\r\n });\r\n\r\n return flattenedErrors;\r\n}\r\n","import { AppTheme } from 'resources/enums';\r\n\r\n/* istanbul ignore next */\r\nexport function applyTheme(theme) {\r\n if (theme === AppTheme.LIGHT) {\r\n document.documentElement.style.setProperty('--color-secondary', '#818EA3');\r\n document.documentElement.style.setProperty('--color-secondary--dark', '#677284');\r\n document.documentElement.style.setProperty('--color-body-background', '#F9FBFC');\r\n document.documentElement.style.setProperty('--color-top-nav-background', '#E9EFF3');\r\n document.documentElement.style.setProperty('--color-card-heading-background', '#FBFDFD');\r\n }\r\n\r\n if (theme === AppTheme.BLUE) {\r\n document.documentElement.style.setProperty('--color-secondary', '#677284');\r\n document.documentElement.style.setProperty('--color-secondary--dark', '#4D5562');\r\n document.documentElement.style.setProperty('--color-body-background', '#E0E7EE');\r\n document.documentElement.style.setProperty('--color-top-nav-background', '#F0F8FF');\r\n document.documentElement.style.setProperty('--color-card-heading-background', '#EDF1F5');\r\n }\r\n\r\n localStorage.setItem('theme', theme);\r\n}\r\n","import { momentToString } from 'resources/moment-helpers';\r\n\r\nexport function customFilter(filterValue, row) {\r\n // Show row when no filterValue applied - i.e. table load\r\n if (filterValue === '') {\r\n return true;\r\n }\r\n\r\n // Get the row value\r\n let rowValue = row[this.key];\r\n\r\n // Return false if rowValue is undefined or null\r\n if (rowValue == null) {\r\n return false;\r\n }\r\n\r\n // Convert to string if it's not already\r\n rowValue = rowValue.toString();\r\n\r\n // Format rowValue as date\r\n if (rowValue.includes('T') && rowValue.includes('-')) {\r\n rowValue = momentToString(rowValue);\r\n }\r\n\r\n // filter rows that include the filterValue\r\n return rowValue.includes(filterValue);\r\n}\r\n","export const DateHelper = {\r\n dateSorter(a: Record, b: Record, sortOrder: 1 | -1, key: string) {\r\n const date1 = new Date(a[key]);\r\n const date2 = new Date(b[key]);\r\n\r\n if (date1.getTime() === date2.getTime()) {\r\n return 0;\r\n }\r\n\r\n return date1 > date2 ? (1 * sortOrder) : (-1 * sortOrder);\r\n }\r\n};\r\n","interface UnderwriterLike {\r\n abn?: string;\r\n code?: string;\r\n name?: string;\r\n chosenRedPlanetUnderwriterAbn?: string;\r\n chosenRedPlanetUnderwriterCode?: string;\r\n chosenRedPlanetUnderwriterName?: string;\r\n}\r\n\r\ninterface FunderInsurerMismatchParams {\r\n enabled?: boolean;\r\n primaryInsurer?: any;\r\n insurers?: any[];\r\n underwriterSource?: UnderwriterLike | null;\r\n}\r\n\r\nconst leadFlagKeys = ['leadInsurerFlag', 'leadFlag', 'isLeadInsurer', 'isLead'];\r\n\r\nexport function shouldShowFunderInsurerMismatch({\r\n enabled,\r\n primaryInsurer,\r\n insurers,\r\n underwriterSource,\r\n}: FunderInsurerMismatchParams): boolean {\r\n if (!enabled) {\r\n return false;\r\n }\r\n\r\n const insurer = primaryInsurer ?? getPrimaryInsurer(insurers);\r\n if (!insurer) {\r\n return false;\r\n }\r\n\r\n const insurerAbns = getInsurerAbns(insurer);\r\n if (!insurerAbns.length) {\r\n return false;\r\n }\r\n\r\n if (!underwriterSource) {\r\n return false;\r\n }\r\n\r\n const underwriterAbn = getUnderwriterAbn(underwriterSource);\r\n if (!underwriterAbn) {\r\n return true;\r\n }\r\n\r\n return !insurerAbns.includes(underwriterAbn);\r\n}\r\n\r\nfunction getPrimaryInsurer(insurers?: any[]): any {\r\n if (!Array.isArray(insurers)) {\r\n return undefined;\r\n }\r\n\r\n // Check for recommendedFlag OR recommendFlag (different endpoints use different field names)\r\n const recommended = insurers.find((insurer) =>\r\n asBoolean(insurer?.recommendedFlag) || asBoolean(insurer?.recommendFlag)\r\n );\r\n if (recommended) {\r\n return recommended;\r\n }\r\n\r\n return insurers.find((insurer) => leadFlagKeys.some((key) => asBoolean(insurer?.[key])));\r\n}\r\n\r\nfunction asBoolean(value: unknown): boolean {\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n if (typeof value === 'number') {\r\n return value === 1;\r\n }\r\n if (typeof value === 'string') {\r\n const trimmed = value.trim().toLowerCase();\r\n return trimmed === 'true' || trimmed === '1';\r\n }\r\n return false;\r\n}\r\n\r\nexport function getInsurerAbns(insurer: any): string[] {\r\n if (!insurer) {\r\n return [];\r\n }\r\n\r\n const abns = new Set();\r\n\r\n const append = (value?: string) => {\r\n const abn = normaliseAbn(value);\r\n if (abn) {\r\n abns.add(abn);\r\n }\r\n };\r\n\r\n if (Array.isArray(insurer?.insurerAbns)) {\r\n insurer.insurerAbns.forEach(append);\r\n }\r\n\r\n append(insurer?.insurerOfficeAbn);\r\n append(insurer?.insurerAbn);\r\n append(insurer?.abn);\r\n\r\n return Array.from(abns);\r\n}\r\n\r\nfunction getUnderwriterAbn(source?: UnderwriterLike | null): string | undefined {\r\n if (!source) {\r\n return undefined;\r\n }\r\n\r\n return normaliseAbn(firstString(source.abn, source.chosenRedPlanetUnderwriterAbn));\r\n}\r\n\r\nfunction firstString(...values: Array): string | undefined {\r\n for (const value of values) {\r\n if (typeof value === 'string' && value.trim().length > 0) {\r\n return value;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport function normaliseAbn(value?: string): string | undefined {\r\n if (!value) {\r\n return undefined;\r\n }\r\n const cleaned = value.replace(/\\D/g, '');\r\n return cleaned.length ? cleaned : undefined;\r\n}\r\n","import { Endpoint } from 'resources/endpoints/endpoints';\r\n\r\nexport const HttpHelper = {\r\n requestFromEndpoint(endpoint: Endpoint, ...uriParams: string[]) {\r\n const init: RequestInit = { headers: {}, ...endpoint } as RequestInit;\r\n\r\n return {\r\n uri: endpoint.uri(uriParams),\r\n init,\r\n };\r\n },\r\n\r\n addFormFields(request: RequestInit, fields: Record) {\r\n let { body = '' } = request;\r\n\r\n if (body !== '') {\r\n body += '&';\r\n }\r\n\r\n for (const [key, value] of Object.entries(fields)) {\r\n body = `${body}${key}=${encodeURIComponent(value as string)}&`;\r\n }\r\n\r\n request.body = (body as string).substring(0, (body as string).length - 1);\r\n },\r\n\r\n awaiter(promise) {\r\n return promise\r\n .then((data) => {\r\n return [null, data];\r\n })\r\n .catch((err) => [err]);\r\n },\r\n};\r\n","/* eslint-disable @typescript-eslint/no-use-before-define */\r\n// Adapted from https://github.com/dandean/guid\r\n// Original Source MIT License\r\n// Copyright 2009, 2010 Dan Dean. All rights reserved.\r\n// Permission is hereby granted, free of charge, to any person obtaining a copy\r\n// of this software and associated documentation files (the 'Software'), to\r\n// deal in the Software without restriction, including without limitation the\r\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\r\n// sell copies of the Software, and to permit persons to whom the Software is\r\n// furnished to do so, subject to the following conditions:\r\n\r\n// The above copyright notice and this permission notice shall be included in\r\n// all copies or substantial portions of the Software.\r\n\r\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\r\n// IN THE SOFTWARE.\r\n/* eslint:disable */\r\n\r\nconst validator = new RegExp('^[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}$', 'i');\r\n\r\nexport const EMPTY_GUID = '00000000-0000-0000-0000-000000000000';\r\n\r\nfunction gen(count: number): string {\r\n let out = '';\r\n for (let i = 0; i < count; i++) {\r\n out += (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);\r\n }\r\n return out;\r\n}\r\n\r\nfunction genAlphanumeric(count: number): string {\r\n const chars = 'abcdefghijklmnopqrstuvwxyz0123456789';\r\n let out = '';\r\n for (let i = 0; i < count; i++) {\r\n out += chars.charAt(Math.floor(Math.random() * chars.length));\r\n }\r\n return out;\r\n}\r\n\r\nfunction genLetter(): string {\r\n const letters = 'abcdefghijklmnopqrstuvwxyz';\r\n return letters.charAt(Math.floor(Math.random() * letters.length));\r\n}\r\n\r\nexport function generateGuid(): Guid {\r\n return new Guid([gen(2), gen(1), gen(1), gen(1), gen(3)].join('-'));\r\n}\r\n\r\nexport function generateGuidString(): string {\r\n return [gen(2), gen(1), gen(1), gen(1), gen(3)].join('-');\r\n}\r\n\r\nexport function generateHtmlIdGuid(): string {\r\n return genLetter() + genAlphanumeric(11);\r\n}\r\n\r\nexport class GuidGenerator {\r\n public generateGuid = generateGuid;\r\n public generateGuidString = generateGuidString;\r\n}\r\n\r\nexport class Guid {\r\n public static EMPTY = '00000000-0000-0000-0000-000000000000';\r\n public value: string = Guid.EMPTY;\r\n\r\n constructor(guid: string | Guid) {\r\n if (!guid) {\r\n throw new TypeError('Invalid argument; `value` has no value.');\r\n }\r\n\r\n this.value = Guid.EMPTY;\r\n\r\n if (guid && guid instanceof Guid) {\r\n this.value = guid.toString();\r\n } else if (guid && Object.prototype.toString.call(guid) === '[object String]' && Guid.isGuid(guid)) {\r\n this.value = guid as string;\r\n }\r\n }\r\n\r\n public equals(other: any) {\r\n // Comparing string `value` against provided `guid` will auto-call\r\n // toString on `guid` for comparison\r\n return Guid.isGuid(other) && this.value == other;\r\n }\r\n\r\n public isEmpty() {\r\n return this.value === Guid.EMPTY;\r\n }\r\n\r\n public toString() {\r\n return this.value;\r\n }\r\n\r\n public toJSON() {\r\n return this.value;\r\n }\r\n\r\n public static isGuid(value: any): boolean {\r\n // Return false for null, undefined, or empty values\r\n if (!value) {\r\n return false;\r\n }\r\n\r\n // Get the string representation of the value\r\n const stringValue = value instanceof Guid ? value.value : String(value);\r\n\r\n // Test against the validator regex\r\n return validator.test(stringValue);\r\n }\r\n}\r\n","export function jsonDateToDisplayDate(value: string) {\r\n if (value) {\r\n const [year, month, day] = value\r\n .slice(0, 10)\r\n .split('-')\r\n .map((p) => parseInt(p));\r\n const date = new Date(year, month - 1, day);\r\n\r\n return date.toLocaleDateString(undefined, {\r\n month: '2-digit',\r\n day: '2-digit',\r\n year: 'numeric',\r\n });\r\n }\r\n return '';\r\n}\r\n\r\nexport function jsonDateToDisplayDateTime(value: string) {\r\n if (value) {\r\n const [year, month, day] = value\r\n .slice(0, 10)\r\n .split('-')\r\n .map((p) => parseInt(p));\r\n const [hour, minute, second] = value\r\n .slice(11)\r\n .split(':')\r\n .map((p) => parseInt(p));\r\n\r\n const date = new Date(year, month - 1, day, hour, minute, second);\r\n\r\n const localDate = date.toLocaleDateString(undefined, {\r\n month: '2-digit',\r\n day: '2-digit',\r\n year: 'numeric',\r\n });\r\n\r\n const localTime = date.toLocaleTimeString();\r\n\r\n return `${localDate} ${localTime}`;\r\n }\r\n return '';\r\n}\r\n","let currentModule = 'DOCUMENT MANAGEMENT';\r\n\r\n/**\r\n * Sets the module for the console logger text\r\n * @param moduleName\r\n * @default 'DOCUMENT MANAGEMENT'\r\n */\r\nexport const setModule = (moduleName: string) => (currentModule = (moduleName || currentModule).toUpperCase());\r\n\r\n/**\r\n * Gets the current module text\r\n */\r\nexport const getModule = () => currentModule;\r\n\r\n/**\r\n * Adds message text after the module name for the console logger\r\n * @param message\r\n */\r\nexport const appendMessageToModule = (message: string) => `%c[${currentModule}] => ${message}`;\r\n\r\n/**\r\n * Gets the default base styles for the console logger\r\n * @param styles override default base styles\r\n */\r\nexport const getBaseStyles = (styles?: string) =>\r\n styles ?? 'font-weight: bold; display: inline-block; padding: 0.5em 0;';\r\n\r\n/**\r\n * Logs a custom styled `warning` message with optional params to console\r\n * @param message warning message to be displayed\r\n * @param optionalParams same optional params passed to `console.log`\r\n */\r\nexport const warn = (message: string, ...optionalParams: any[]) =>\r\n console.log(appendMessageToModule(message), `color: #ff7900; ${getBaseStyles()}`, ...optionalParams);\r\n\r\n/**\r\n * Logs a custom styled `info` message with optional params to console\r\n * @param message info message to be displayed\r\n * @param optionalParams same optional params passed to `console.info`\r\n */\r\nexport const info = (message: string, ...optionalParams: any[]) =>\r\n console.info(appendMessageToModule(message), `color: #89cff0; ${getBaseStyles()}`, ...optionalParams);\r\n\r\n/**\r\n * Logs a custom styled `error` message with optional params to console\r\n * @param message error message to be displayed\r\n * @param optionalParams same optional params passed to `console.error`\r\n */\r\nexport const error = (message: string, ...optionalParams: any[]) =>\r\n console.error(appendMessageToModule(message), `color: #ff2400; ${getBaseStyles()}`, ...optionalParams);\r\n","// A PDF can only be printed from an iframe the browser actually lays out. Hiding the iframe - or\r\n// its container - with display:none (which is what Aurelia's show.bind does via .aurelia-hide)\r\n// leaves contentWindow.print() with nothing to render, and the print dialog never opens, so the\r\n// frame is taken out of flow at zero size instead of being hidden.\r\nconst printFrameStyle = 'position:absolute;width:0;height:0;border:0;';\r\nconst printFrameAttribute = 'data-print-frame';\r\nconst pdfType = 'application/pdf';\r\n\r\nfunction releasePreviousFrame(host: HTMLElement) {\r\n const previous = host.querySelector(`iframe[${printFrameAttribute}]`) as HTMLIFrameElement;\r\n\r\n if (previous) {\r\n const previousUrl = previous.src;\r\n previous.remove();\r\n\r\n if (previousUrl) {\r\n URL.revokeObjectURL(previousUrl);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Renders a PDF blob into an off-screen iframe and opens the browser print dialog for it.\r\n * Resolves once the dialog has been asked for, and rejects if the document could not be loaded.\r\n */\r\nexport function printPdfBlob(blob: Blob, container?: HTMLElement): Promise {\r\n const host = container || document.body;\r\n // The bytes arrive through the octet-stream proxy, so the blob is typed application/octet-stream.\r\n // A frame pointed at that downloads it (as an extensionless file named after the object url)\r\n // instead of rendering it, and a download never fires onload, so the print never settles.\r\n const pdf = blob.type === pdfType ? blob : new Blob([blob], { type: pdfType });\r\n const objectUrl = URL.createObjectURL(pdf);\r\n\r\n return new Promise((resolve, reject) => {\r\n // Only ever one print frame per host: the object url and the frame have to outlive print()\r\n // because the preview renders from them asynchronously, so they are released on the next print\r\n // rather than straight away.\r\n releasePreviousFrame(host);\r\n\r\n const iframe = document.createElement('iframe');\r\n iframe.setAttribute(printFrameAttribute, 'true');\r\n iframe.setAttribute('style', printFrameStyle);\r\n iframe.setAttribute('aria-hidden', 'true');\r\n iframe.title = 'Print preview';\r\n\r\n iframe.onload = () => {\r\n try {\r\n iframe.contentWindow.focus();\r\n iframe.contentWindow.print();\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n };\r\n\r\n iframe.onerror = () => reject(new Error('The document could not be loaded for printing.'));\r\n\r\n iframe.src = objectUrl;\r\n host.appendChild(iframe);\r\n });\r\n}\r\n","import lzstring from 'lz-string';\r\nimport { PLATFORM } from 'aurelia-pal';\r\n\r\nexport class StorageService {\r\n lzstring = lzstring;\r\n\r\n saveToSessionStorage(key: string, data: any) {\r\n if (PLATFORM.global.sessionStorage) {\r\n PLATFORM.global.sessionStorage.setItem(key, this.lzstring.compressToUTF16(JSON.stringify(data)));\r\n }\r\n }\r\n\r\n getFromSessionStorage(key: string) {\r\n if (PLATFORM.global.sessionStorage) {\r\n const data = this.lzstring.decompressFromUTF16(PLATFORM.global.sessionStorage.getItem(key));\r\n\r\n if (data) {\r\n return JSON.parse(data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n saveToLocalStorage(key: string, data: any) {\r\n if (PLATFORM.global.localStorage) {\r\n PLATFORM.global.localStorage.setItem(key, this.lzstring.compressToUTF16(JSON.stringify(data)));\r\n }\r\n }\r\n\r\n getFromLocalStorage(key: string) {\r\n if (PLATFORM.global.localStorage) {\r\n const data = this.lzstring.decompressFromUTF16(PLATFORM.global.localStorage.getItem(key));\r\n\r\n if (data) {\r\n return JSON.parse(data);\r\n }\r\n\r\n return data;\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n\r\nexport const Storage = new StorageService();\r\n","import { Container } from 'aurelia-framework';\r\nimport { IaToastService, IaToastMessage } from 'resources/services/ia-toast-service';\r\n\r\nexport function successToast(message: string | IaToastMessage) {\r\n const toastService: IaToastService = Container.instance.get(IaToastService);\r\n const toastMessage = typeof message === 'string' ? new IaToastMessage(message) : message;\r\n toastService.success(toastMessage);\r\n}\r\n\r\nexport function errorToast(message: string | IaToastMessage, title?: string) {\r\n const toastService: IaToastService = Container.instance.get(IaToastService);\r\n const toastMessage = typeof message === 'string' ? new IaToastMessage(message, title) : message;\r\n toastService.error(toastMessage);\r\n}\r\n\r\nexport function infoToast(message: string | IaToastMessage, title?: string) {\r\n const toastService: IaToastService = Container.instance.get(IaToastService);\r\n const toastMessage = typeof message === 'string' ? new IaToastMessage(message, title) : message;\r\n toastService.info(toastMessage);\r\n}\r\n","import { getBuildEnvironment } from \"./parse-jwt\";\r\n\r\nexport function isProd() {\r\n return getBuildEnvironment().toLocaleLowerCase() === 'live';\r\n}\r\n\r\nexport function isTemplate() {\r\n return getBuildEnvironment().toLocaleLowerCase() === 'template';\r\n}"],"names":["element","hideSinglePage","boundaryLinks","firstText","lastText","directionLinks","previousText","nextText","disable","totalPages","displayPages","this","bind","undefined","currentPage","pageSize","totalItemsChanged","calculatePages","pageSizeChanged","currentPageChanged","dispatchPageChangedEvent","event","DOM","bubbles","detail","dispatchEvent","totalItems","Math","ceil","isNaN","paginationSize","displayAllPages","limitVisiblePages","i","push","title","toString","value","totalTiers","activeTier","start","end","selectPage","page","nextPage","previousPage","firstPage","lastPage","inject","Element","bindable","defaultBindingMode","bindingMode","autoinject","AutPaginationCustomElement","auTable","bindingEngine","mode","selectedClass","custom","rowSelectedListener","handleRowSelected","attached","style","cursor","addEventListener","selectedSubscription","propertyObserver","row","subscribe","isSelectedChanged","setClass","detached","removeEventListener","dispose","$isSelected","classList","add","remove","target","srcElement","tagName","toLowerCase","dispatchSelectedEvent","selectedEvent","deselectAll","data","forEach","item","AureliaTableCustomAttribute","BindingEngine","AutSelectCustomAttribute","callback","order","orderClasses","ignoreEvent","handleHeaderClicked","sortChangedListener","handleSortChanged","key","Error","addSortChangedListener","handleDefault","removeSortChangedListener","default","doSort","dataSource","sortChanged","next","AutSortCustomAttribute","isAttached","sortChangedListeners","beforePagination","filterObservers","Array","isArray","dataObserver","collectionObserver","applyPlugins","filtersChanged","api","revealItem","filters","observer","filter","filterChanged","hasPagination","getDataCopy","concat","getPageData","localData","doPaginate","hasFilter","doFilter","sortKey","customSort","sortOrder","length","displayData","toFilter","filteredData","passed","passFilter","trim","keys","getPropertyValue","types","indexOf","toSort","sort","a","b","val1","val2","isNumeric","str1","str2","localeCompare","object","keyPath","replace","split","n","k","toCheck","parseFloat","isFinite","toPaginate","slice","dataChanged","emitSortChanged","removeListener","listener","listeners","index","splice","configure","config","globalResources","ensureFlagsInitialized","window","featureFlags","enabled","flag","persistFlags","localStorage","setItem","JSON","stringify","load","defaults","savedFlags","parse","getItem","initialFlags","flagKey","FeatureFlagService","configuredContainer","options","featureFlagService","container","get","Object","prototype","hasOwnProperty","call","registerHandler","defaultFlags","featureFlag","flagIdentifier","TypeError","Reflect","deleteProperty","defineProperty","Container","resolveFeatureFlagService","enumerable","configurable","defineFlagBackedProperty","sequences","Map","listenerAttached","registerSequence","label","keySequence","listenForKeySequence","set","sequence","currentIndex","removeSequence","delete","size","document","handleKeydownBound","handleKeydown","includes","taskQueue","run","navigationInstruction","queueMicroTask","TaskQueue","PostRenderStep","prepareTasks","taskNotificationTypeId","tasks","x","overdue","dueDate","subtract","format","yesterday","dueDateLabel","duetoday","upcoming","tomorrow","isCompletedTask","currentRouteName","name","body","className","scrollIntoView","tableClassName","rowClassName","setTimeout","table","from","querySelectorAll","find","selectedTr","behavior","block","scrollQCEErrorIntoView","errors","actions","addAction","priority","newHook","addFilter","hasAction","getActions","getFilters","removeAction","val","removeAllActions","removeFilter","removeAllFilters","doAction","hook","args","error","console","applyFilter","Promise","result","http","downloadBlobFromUrl","fileName","url","isValidParams","urlToBlob","blobUrl","blob","downloadFile","getBlobFromUrl","createElement","download","href","URL","createObjectURL","appendChild","click","endpoint","uri","fetch","headers","method","ok","message","BlobService","store","claims","subscription","state","userClaims","getClaims","response","json","expiry","expiryDate","Date","getTime","has","claim","every","reset","removeItem","hasAsync","dateNow","parseInt","some","Store","ClaimsService","blobService","router","modal","isProcessing","getDocument","params","distributionType","beginProcessing","postDocumentGeneration","documentUrl","processDocumentUrl","endProcessing","processingError","processingBrowserPopupsDisabled","openPreview","fetchAndPrintDocument","downloadAndEmailDocument","ClientId","clientName","routeFragment","generate","fileBlob","documentUrlFromBlob","iframeContainer","getElementById","iframe","getOrCreateIframe","src","onload","focus","contentWindow","print","childElementCount","iframeId","id","clientId","model","show","content","withOptions","type","queue","queueGuid","status","pollDocumentStatus","statusResult","GenerationStatusString","getDocumentUrl","processError","lastException","ExceptionMessage","errorMessage","attempts","delayInMs","completed","counter","timer","getDocumentCreationStatus","isCompletedState","msec","resolve","ClientStatementService","Loader","defaultOptions","class","position","theme","layout","titleColor","messageColor","iconColor","backgroundColor","close","closeOnEscape","closeOnClick","timeout","overlay","overlayClose","overlayColor","transitionIn","transitionOut","animateInside","progressBar","image","imageWidth","maxWidth","displayMode","drag","loaderOpen","loader","overrideOptions","bootstrapLoader","setDefaultOptions","getDefaultOptions","destroyAllToasts","toast","toastMessageIsRequired","mergeToastSettings","hide","toastRef","closedBy","toastElement","String","querySelector","info","progress","success","warning","restoreDefaultSettings","question","getLoaderPath","showLoader","loaderText","$loaderText","hideLoader","showStatusIcon","statusSuccess","statusIconTimeout","existingImage","existingTransIn","existingTimeout","existingOnClosed","onClosed","GreenTick","RedCross","TailSpin","IaToastMessage","$loaderTextClass","onOpening","addLoaderText","onClosing","removeLoaderText","createTextNode","parentNode","IaToastService","log","LogManager","SSO_SCOPES","getMsalClient","tenantId","client","auth","authority","redirectUri","location","origin","cache","cacheLocation","storeAuthStateInCookie","initialize","inFlight","renewSession","tokenService","isSsoSession","renewViaSso","warn","getRefreshToken","refreshAuthToken","doRenewSession","finally","account","homeAccountId","getMsalHomeAccountId","byId","getAccount","accounts","getAllAccounts","getCachedAccount","acquireTokenSilent","scopes","getAuthToken","id_token","idToken","app_client_type","appct","app_client_instance","appci","client_id","saveToken","getLocation","decodeStoredToken","startsWith","atob","substring","getStoredToken","storedValue","setStoredToken","storage","createAuthToken","user","grant_type","webFormLinkCode","password_hashed","username","password","appClientType","appClientInstance","web_form_link_code","deviceToken","sessionStorage","passwordRequiresChanging","deviceId","returnedDeviceToken","twoFactorSetupRequired","twoFactorCodeRequired","daysUntilPasswordExpiry","acceptLicenceAgreement","getDeviceId","getDeviceTokens","token","access_token","refresh_token","removeToken","setSsoSession","TokenService","debug","logger","rest","i18tnValidation","aurelia","originalGetMessage","ValidationMessageProvider","originalGetDisplayName","translation","I18N","tr","parser","propertyName","displayName","i18n","initScrollTabs","context","tabPosition","isRightChevronDisabled","tabUI","allTabs","tabClass","setAttribute","onwheel","preventDefault","deltaY","scrollTabs","IntersectionObserver","entries","isIntersecting","threshold","observe","direction","isLeftChevronDisabled","formatAdminDisplayText","isArrayOfStrings","isServerErrorDescription","isPlaceHolderValue","isPlaceHolderValueArray","placeHolderVals","isErrorItem","isErrorItemArray","entityWizardErrorHandler","metaData","errorMetaData","errorMessageTitle","httpErrorResponseHandler","toastr","clone","responseBody","apiError","serverErrors","errorKeys","mapErrorKeyToPlaceHolderVals","prependNamespace","flattenedErrors","namespace","errorActual","errorKey","allPlaceHolderVals","flattenErrors","placeholder","varName","writable","isExceptionMessage","errorObj","errMsg","exceptionMessage","v","map","cleanErrorMessage","join","formatErrorsForToast","applyTheme","documentElement","setProperty","customFilter","filterValue","rowValue","DateHelper","dateSorter","date1","date2","leadFlagKeys","shouldShowFunderInsurerMismatch","primaryInsurer","insurers","underwriterSource","insurer","recommended","asBoolean","recommendedFlag","recommendFlag","getPrimaryInsurer","insurerAbns","getInsurerAbns","underwriterAbn","source","normaliseAbn","values","firstString","abn","chosenRedPlanetUnderwriterAbn","getUnderwriterAbn","trimmed","abns","Set","append","insurerOfficeAbn","insurerAbn","cleaned","HttpHelper","requestFromEndpoint","init","uriParams","addFormFields","request","fields","encodeURIComponent","awaiter","promise","then","catch","err","validator","RegExp","gen","count","out","random","generateGuid","Guid","generateGuidString","generateHtmlIdGuid","letters","charAt","floor","chars","genAlphanumeric","guid","EMPTY","isGuid","equals","other","isEmpty","toJSON","stringValue","test","jsonDateToDisplayDate","p","year","month","day","toLocaleDateString","jsonDateToDisplayDateTime","hour","minute","second","date","localDate","localTime","toLocaleTimeString","currentModule","setModule","moduleName","toUpperCase","appendMessageToModule","getBaseStyles","styles","optionalParams","printFrameStyle","printFrameAttribute","pdfType","printPdfBlob","host","pdf","Blob","objectUrl","reject","previous","previousUrl","revokeObjectURL","releasePreviousFrame","onerror","lzstring","saveToSessionStorage","compressToUTF16","getFromSessionStorage","decompressFromUTF16","saveToLocalStorage","getFromLocalStorage","Storage","StorageService","successToast","toastService","toastMessage","errorToast","infoToast","isProd","toLocaleLowerCase","isTemplate"],"sourceRoot":""}