{"version":3,"file":"app-f5000ef1.xxxxxxxx.bundle.js","mappings":"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","sources":["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"],"sourcesContent":["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 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 private 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, Container } 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) {\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, expiryDate };\r\n } catch (e) {\r\n return e;\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(claim)) {\r\n return claim.every((value) => this.claims.includes(value));\r\n }\r\n\r\n return this?.claims.includes(claim) ?? false;\r\n }\r\n\r\n async hasAsync(claim: string | string[]): Promise {\r\n if (!this.claims || !this.claims.length) {\r\n const { expiryDate, claims } = await this.getClaims();\r\n this.claims = claims;\r\n localStorage.setItem('iadviserClaimsExpiry', expiryDate?.toString() ?? '');\r\n localStorage.setItem('iAdviserUserClaims', JSON.stringify(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 = claims;\r\n localStorage.setItem('iadviserClaimsExpiry', expiryDate?.toString() ?? '');\r\n localStorage.setItem('iAdviserUserClaims', JSON.stringify(claims));\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"],"names":["actions","filters","addAction","name","callback","priority","this","newHook","sort","a","b","addFilter","hasAction","undefined","hasFilter","getActions","getFilters","removeAction","filter","val","length","removeAllActions","removeFilter","removeAllFilters","doAction","forEach","hook","args","error","console","applyFilter","value","result","Promise","http","downloadBlobFromUrl","fileName","url","isValidParams","urlToBlob","blobUrl","blob","downloadFile","includes","document","createElement","download","href","window","URL","createObjectURL","body","appendChild","click","remove","endpoint","uri","fetch","headers","method","ok","message","autoinject","BlobService","store","claims","subscription","state","subscribe","userClaims","getClaims","response","json","expiry","get","expiryDate","Date","getTime","has","claim","Array","isArray","every","hasAsync","localStorage","setItem","toString","JSON","stringify","dateNow","parseInt","getItem","isNaN","some","Store","ClaimsService","blobService","router","modal","isProcessing","getDocument","params","distributionType","beginProcessing","postDocumentGeneration","documentUrl","processDocumentUrl","endProcessing","processingError","processingBrowserPopupsDisabled","openPreview","fetchAndPrintDocument","downloadAndEmailDocument","ClientId","clientName","title","split","trim","routeFragment","generate","fileBlob","documentUrlFromBlob","iframeContainer","getElementById","iframe","getOrCreateIframe","src","onload","focus","contentWindow","print","childElementCount","iframeId","id","clientId","replace","model","show","content","mode","withOptions","type","queue","queueGuid","status","pollDocumentStatus","statusResult","GenerationStatusString","getDocumentUrl","processError","lastException","Error","ExceptionMessage","errorMessage","toLowerCase","attempts","delayInMs","completed","counter","timer","getDocumentCreationStatus","isCompletedState","msec","resolve","setTimeout","ClientStatementService"],"sourceRoot":""}