{"version":3,"file":"815.acc48e23a66f47eed419.js","mappings":"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","sources":["webpack://customer-portal-web-app/./src/pages.js","webpack://customer-portal-web-app/./src/common/globals.ts","webpack://customer-portal-web-app/./src/common/staticFileReferences.ts","webpack://customer-portal-web-app/./src/common/storage.ts","webpack://customer-portal-web-app/./src/common/webHostClient/authentication/authenticationClient.ts","webpack://customer-portal-web-app/./src/common/webHostClient/baseClient.ts","webpack://customer-portal-web-app/./src/common/webHostClient/configuration/configurationClient.ts","webpack://customer-portal-web-app/./src/links.ts","webpack://customer-portal-web-app/./src/pages/basePage.ts"],"sourcesContent":["module.exports = {\r\n home: { title: \"Home\", description: \"AtkinsRéalis Utility Solutions Home\", directoryParts: [], htmlName: \"index.html\", pageType: \"branded\" },\r\n aboutUs: { title: \"About us\", description: \"About AtkinsRéalis Utility Solutions\", directoryParts: [], htmlName: \"about-us.html\", pageType: \"branded\" },\r\n products: { title: \"Products\", description: \"Products\", directoryParts: [], htmlName: \"products.html\", pageType: \"branded\" },\r\n whatWeOffer: { title: \"What we offer\", description: \"Services that Atkins Utility Solutions offer to our clients\", directoryParts: [], htmlName: \"what-we-offer.html\", pageType: \"branded\" },\r\n pricing: { title: \"Pricing\", description: \"AtkinsRéalis Utility Solutions pricing information\", directoryParts: [], htmlName: \"pricing.html\", pageType: \"branded\" },\r\n caseStudies: { title: \"Case studies\", description: \"AtkinsRéalis Utility Solutions case studies\", directoryParts: [], htmlName: \"case-studies.html\", pageType: \"branded\" },\r\n contactAndHelp: { title: \"Contact and help\", description: \"Contact AtkinsRéalis Utility Solutions or get help\", directoryParts: [], htmlName: \"contact-and-help.html\", pageType: \"branded\" },\r\n myOrders: { title: \"My orders\", description: \"Current user's orders\", directoryParts: [\"account\"], htmlName: \"my-orders.html\", pageType: \"branded\" },\r\n myDocuments: { title: \"My documents\", description: \"Current user's documents\", directoryParts: [\"account\"], htmlName: \"my-documents.html\", pageType: \"branded\" },\r\n myDocumentDetails: { title: \"My document details\", description: \"Current user's document details\", directoryParts: [\"account\"], htmlName: \"my-document-details.html\", pageType: \"branded\" },\r\n myNotifications: { title: \"My notifications\", description: \"Current user's notifications\", directoryParts: [\"account\"], htmlName: \"my-notifications.html\", pageType: \"branded\" },\r\n myAccount: { title: \"My account\", description: \"Current user's account details\", directoryParts: [\"account\"], htmlName: \"my-account.html\", pageType: \"branded\" },\r\n selectArea: { title: \"Select area\", description: \"Select an area of interest for a new utility search\", directoryParts: [\"order\"], htmlName: \"select-area.html\", pageType: \"order\" },\r\n selectOptions: { title: \"Select options\", description: \"Select options requested for the order\", directoryParts: [\"order\"], htmlName: \"select-options.html\", pageType: \"order\" },\r\n register: { title: \"Register\", description: \"Register a Utility Solutions account.\", directoryParts: [], htmlName: \"register.html\", pageType: \"branded\" },\r\n logIn: { title: \"Log in\", description: \"Please sign in to access your account.\", directoryParts: [], htmlName: \"log-in.html\", pageType: \"branded\" },\r\n forgottenPassword: { title: \"Forgotten password\", description: \"Please enter your email and we will send a link to this address which will allow you to reset your password.\", directoryParts: [], htmlName: \"forgotten-password.html\", pageType: \"branded\" },\r\n error: { title: \"Error\", description: \"Error page\", directoryParts: [], htmlName: \"error.html\", pageType: \"branded\" },\r\n orderDetails: { title: \"Order details\", description: \"Order details\", directoryParts: [\"account\"], htmlName: \"order-details.html\", pageType: \"branded\" },\r\n emailVerify: { title: \"Create a new password\", description: \"Please enter a new password for your account. Note it will need to satisfy our password criteria to help ensure your account is more secure.\", directoryParts: [], htmlName: \"email-verify.html\", pageType: \"branded\"},\r\n viewEstimate: { title: \"View Estimate\", description: \"View estimate pricing for the order\", directoryParts: [\"order\"], htmlName: \"view-estimate.html\", pageType: \"order\" },\r\n checkout: { title: \"Checkout\", description: \"Checkout order\", directoryParts: [\"order\"], htmlName: \"checkout.html\", pageType: \"order\" },\r\n confirmation: { title: \"Order confirmation\", description: \"Your order has been successfully placed.\", directoryParts: [\"order\"], htmlName: \"confirmation.html\", pageType: \"branded\" },\r\n paymentComplete: { title: \"Payment complete\", description: \"Payment complete\", directoryParts: [\"order\", \"paypal\"], htmlName: \"payment-complete.html\", pageType: \"base\" },\r\n paymentCancelled: { title: \"Payment cancelled\", description: \"Payment cancelled\", directoryParts: [\"order\", \"paypal\"], htmlName: \"payment-cancelled.html\", pageType: \"base\" },\r\n addProducts: { title: \"Add products to order\", description: \"Add products to your existing order.\", directoryParts: [\"order\"], htmlName: \"add-products.html\", pageType: \"branded\" },\r\n utilitySearchReportLandingPage: {title: \"Utility Search Report landing page\", description: \"Utility Search Report landing page\", directoryParts: [\"landingpages\"], htmlName: \"utility-search-report-landing-page.html\", pageType: \"branded\" },\r\n utilitySearchMapLandingPage: {title: \"Utility Search Map landing page\", description: \"Utility Search Map landing page\", directoryParts: [\"landingpages\"], htmlName: \"utility-search-map-landing-page.html\", pageType: \"branded\" },\r\n};\r\n\r\n","import GeneralConfigurationResponse from \"./webHostClient/configuration/generalConfigurationResponse\";\r\n\r\n/**\r\n * Global parameters object\r\n */\r\nclass Globals \r\n{\r\n public config: GeneralConfigurationResponse = null;\r\n}\r\n\r\n\r\n\r\n// Singleton instance\r\nconst instance = new Globals();\r\nexport default instance;","/**\r\n * References to files that are not referenced from anywhere in the project but need to be included in the webpack bundle.\r\n */\r\nimport '../emailResources/atkins-logo.png';\r\nimport '../emailResources/footer.png';\r\nimport '../emailResources/logo.png';\r\nimport '../emailResources/us-email-footer.png';\r\nimport '../emailResources/us-email-header.png';","const authenticationTokenKey = \"authenticationToken\";\r\nconst startOrderLocationQueryTextKey = \"startOrderLocationQueryText\";\r\nconst inProgressOrderTokenKey = \"inProgressOrderToken\";\r\nconst startOrderMapBoundsKey = \"startOrderMapBounds\";\r\nconst startOrderSiteGeometryKey = \"startOrderSiteGeometry\";\r\nconst cookiePreferencesSavedKey = \"cookiePreferencesSaved\";\r\nconst allowAnalyticsCookiesKey = \"allowAnalyticsCookies\";\r\nconst payPalOrderIdKey = \"payPalOrderId\";\r\nconst userId = \"userId\";\r\n\r\n/**\r\n * Persistent storage\r\n */\r\nclass Storage {\r\n\r\n public setUserId(contactId: string): void {\r\n window.localStorage.setItem(userId, contactId);\r\n }\r\n\r\n public getAuthenticationToken(): string {\r\n let authenticationTokenValue: string = window.sessionStorage.getItem(authenticationTokenKey);\r\n if (!authenticationTokenValue) {\r\n authenticationTokenValue = window.localStorage.getItem(authenticationTokenKey);\r\n }\r\n return authenticationTokenValue;\r\n }\r\n\r\n public setAuthenticationToken(authenticationTokenValue: string, persist: boolean): void {\r\n if (persist) {\r\n // Remember the authentication token for future sessions.\r\n window.sessionStorage.removeItem(authenticationTokenKey);\r\n window.localStorage.setItem(authenticationTokenKey, authenticationTokenValue);\r\n }\r\n\r\n else {\r\n // Only store the token for this session\r\n window.sessionStorage.setItem(authenticationTokenKey, authenticationTokenValue);\r\n window.localStorage.removeItem(authenticationTokenKey);\r\n }\r\n }\r\n\r\n public clearAuthenticationToken(): void {\r\n window.sessionStorage.removeItem(authenticationTokenKey);\r\n window.localStorage.removeItem(authenticationTokenKey);\r\n }\r\n\r\n\r\n public getStartOrderLocationQueryText(): string {\r\n return window.sessionStorage.getItem(startOrderLocationQueryTextKey);\r\n }\r\n\r\n public setStartOrderLocationQueryText(startOrderLocationQueryTextValue): void {\r\n return window.sessionStorage.setItem(startOrderLocationQueryTextKey, startOrderLocationQueryTextValue);\r\n }\r\n\r\n public clearStartOrderLocationQueryText(): void {\r\n return window.sessionStorage.removeItem(startOrderLocationQueryTextKey);\r\n }\r\n\r\n public getStartOrderMapBounds(): string {\r\n return window.sessionStorage.getItem(startOrderMapBoundsKey);\r\n }\r\n\r\n public setStartOrderMapBounds(startOrderMapBoundsValue): void {\r\n return window.sessionStorage.setItem(startOrderMapBoundsKey, startOrderMapBoundsValue);\r\n }\r\n\r\n public clearStartOrderMapBounds(): void {\r\n return window.sessionStorage.removeItem(startOrderMapBoundsKey);\r\n }\r\n\r\n public getStartOrderSiteGeometry(): string {\r\n return window.sessionStorage.getItem(startOrderSiteGeometryKey);\r\n }\r\n\r\n public setStartOrderSiteGeometry(startOrderSiteGeometryValue): void {\r\n return window.sessionStorage.setItem(startOrderSiteGeometryKey, startOrderSiteGeometryValue);\r\n }\r\n\r\n public clearStartOrderSiteGeometry(): void {\r\n return window.sessionStorage.removeItem(startOrderSiteGeometryKey);\r\n }\r\n\r\n public getInProgressOrderToken(): string {\r\n return window.sessionStorage.getItem(inProgressOrderTokenKey);\r\n }\r\n\r\n public setInProgressOrderToken(inProgressOrderTokenValue: string): void {\r\n window.sessionStorage.setItem(inProgressOrderTokenKey, inProgressOrderTokenValue);\r\n }\r\n\r\n public clearInProgressOrderToken(): void {\r\n return window.sessionStorage.removeItem(inProgressOrderTokenKey);\r\n }\r\n\r\n public getPayPalOrderId(): string {\r\n return window.sessionStorage.getItem(payPalOrderIdKey);\r\n }\r\n\r\n public setPayPalOrderId(payPalOrderIdValue: string): void {\r\n window.sessionStorage.setItem(payPalOrderIdKey, payPalOrderIdValue);\r\n }\r\n\r\n public clearPayPalOrderId(): void {\r\n return window.sessionStorage.removeItem(payPalOrderIdKey);\r\n }\r\n\r\n public getAllowAnalyticsCookies(): boolean {\r\n\r\n const cookieValue = window.localStorage.getItem(allowAnalyticsCookiesKey);\r\n\r\n if (\"0\" === cookieValue)\r\n {\r\n return false;\r\n }\r\n else if (\"1\" == cookieValue)\r\n {\r\n return true;\r\n }\r\n else\r\n {\r\n return null;\r\n }\r\n }\r\n\r\n public setAllowAnalyticsCookies(newValue: boolean): void {\r\n window.localStorage.setItem(allowAnalyticsCookiesKey, newValue ? \"1\" : \"0\");\r\n }\r\n\r\n public clearAllowAnalyticsCookies(): void {\r\n return window.localStorage.removeItem(allowAnalyticsCookiesKey);\r\n }\r\n\r\n public getCookiePreferencesSaved(): boolean {\r\n return \"1\" === window.localStorage.getItem(cookiePreferencesSavedKey);\r\n }\r\n\r\n public setCookiePreferencesSaved(newValue: boolean): void {\r\n window.localStorage.setItem(cookiePreferencesSavedKey, newValue ? \"1\" : \"0\");\r\n }\r\n\r\n public clearCookiePreferencesSaved(): void {\r\n return window.localStorage.removeItem(cookiePreferencesSavedKey);\r\n }\r\n}\r\n\r\n// Create and export singleton instance.\r\nconst storage = new Storage();\r\nexport default storage;","import BaseClient from \"../baseClient\";\r\nimport EmailVerifyRequestBody from \"./emailVerifyRequestBody\";\r\nimport ForgottenPasswordRequestBody from \"./forgottenPasswordRequestBody\";\r\nimport GetTokenInfoRequest from \"./getTokenInfoRequest\";\r\nimport GetTokenInfoResponse from \"./getTokenInfoResponse\";\r\nimport LogInRequestBody from \"./logInRequestBody\";\r\nimport LogInResponseBody from \"./logInResponseBody\";\r\nimport PasswordComplexityRequestBody from \"./passwordComplexityRequestBody\";\r\nimport PasswordComplexityResponseBody from \"./passwordComplexityResponseBody\";\r\nimport RegistrationRequest from \"./registrationRequest\";\r\nimport RegistrationResponse from \"./registrationResponse\";\r\nimport UpdatePasswordRequest from \"./updatePasswordRequest\";\r\n\r\n/**\r\n * Authentication client.\r\n */\r\nexport default class AuthenticationClient extends BaseClient {\r\n\r\n public async logInAsync(request: LogInRequestBody) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync('authentication_log_in');\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'authentication', \r\n action: 'log-in', \r\n method: 'post', \r\n body: request, \r\n });\r\n return response as LogInResponseBody;\r\n }\r\n\r\n public async registerNewUserAsync(request: RegistrationRequest) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync('authentication_register');\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'authentication',\r\n action: 'register-new-user',\r\n method: 'post',\r\n body: request,\r\n });\r\n\r\n return response as RegistrationResponse;\r\n }\r\n\r\n public async forgottenPasswordAsync(request: ForgottenPasswordRequestBody) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync('authentication_forgotten_password');\r\n\r\n await this.makeRequestAsync({\r\n controller: 'authentication',\r\n action: 'forgotten-password',\r\n method: 'post',\r\n body: request,\r\n });\r\n }\r\n\r\n public async getPasswordComplexityAsync(request: PasswordComplexityRequestBody) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync('authentication_password_complexity');\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'authentication',\r\n action: 'get-password-complexity',\r\n method: 'post',\r\n body: request});\r\n \r\n return response as PasswordComplexityResponseBody;\r\n }\r\n\r\n public async verifyEmailAsync(request: EmailVerifyRequestBody) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync('authentication_verify_email');\r\n\r\n await this.makeRequestAsync({\r\n controller: 'authentication',\r\n action: 'verify-email',\r\n method: 'post',\r\n body: request});\r\n }\r\n\r\n /**\r\n * Gets the current logged in user information and validates the current in progress order token.\r\n * @param request The request content.\r\n * @returns A promise that will return the response content.\r\n */\r\n public async getTokenInfo(request: GetTokenInfoRequest) : Promise {\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'authentication', \r\n action: 'get-token-info', \r\n method: 'post',\r\n body: request\r\n });\r\n return response as GetTokenInfoResponse;\r\n }\r\n\r\n\r\n /**\r\n * Updates the password for the currently logged on user.\r\n * @param request The request content.\r\n * @returns A promise that will return the response content.\r\n */\r\n public async updatePasswordAsync(request: UpdatePasswordRequest) : Promise {\r\n\r\n request.recaptchaToken = await this.recaptchaChallengeAsync(\"update_password\");\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'authentication', \r\n action: 'update-password', \r\n method: 'post',\r\n body: request\r\n });\r\n }\r\n\r\n \r\n\r\n\r\n\r\n\r\n}\r\n","import WebHostRequest from \"./webHostRequest\";\r\nimport WebHostClientError from \"./webHostClientError\";\r\n\r\nimport { RecaptchaAction } from \"../recaptchaActions\";\r\nimport { ReCaptcha } from \"../recaptcha\";\r\nimport storage from \"../storage\";\r\nimport ErrorInfo from \"./errorInfo\";\r\nimport globals from '../globals';\r\n\r\n\r\nexport default abstract class BaseClient \r\n{\r\n\r\n protected async makeRequestAsync(requestInfo: WebHostRequest): Promise {\r\n\r\n const requestInit: RequestInit = {\r\n method: requestInfo.method,\r\n headers: {\r\n 'Accept': 'application/json',\r\n }\r\n };\r\n\r\n const authenticationToken: string = storage.getAuthenticationToken();\r\n if (authenticationToken)\r\n {\r\n requestInit.headers[\"Authorization\"] = \"Bearer \" + authenticationToken;\r\n }\r\n\r\n if (null != requestInfo.body)\r\n {\r\n requestInit.headers['Content-Type'] = 'application/json';\r\n requestInit.body = JSON.stringify(requestInfo.body);\r\n }\r\n\r\n let requestUrl = `/api/${requestInfo.controller}/${requestInfo.action}`;\r\n\r\n if (null != requestInfo.queryParams)\r\n {\r\n const query = requestInfo.queryParams\r\n .map(p => `${encodeURIComponent(p.name)}=${encodeURIComponent(p.value)}`)\r\n .join(\"&\");\r\n\r\n requestUrl = `${requestUrl}?${query}`;\r\n }\r\n\r\n const response = await fetch(requestUrl, requestInit);\r\n \r\n // Read response content\r\n let contentObj: any = null;\r\n let contentMessage: string = null;\r\n\r\n const responseContentType = response.headers.get('Content-Type');\r\n if (responseContentType && 'application/json' == responseContentType.split(\";\")[0].trim())\r\n {\r\n contentObj = await response.json(); \r\n }\r\n else \r\n {\r\n contentMessage = await response.text();\r\n }\r\n\r\n // Was the request successful?\r\n const success = 200 <= response.status && response.status <= 299;\r\n if (!success)\r\n {\r\n const error: WebHostClientError = {\r\n status : response.status, \r\n statusText: response.statusText, \r\n content: contentObj as ErrorInfo,\r\n contentMessage: contentMessage,\r\n }; \r\n throw error;\r\n }\r\n\r\n return contentObj;\r\n }\r\n\r\n /**\r\n * Performs the ReCAPTCHA challenge and returns the response token.\r\n * @param action The ReCAPTCHA action name.\r\n * @returns The ReCAPTCHA token to send to the server for validation.\r\n */ \r\n protected async recaptchaChallengeAsync(action: RecaptchaAction) : Promise\r\n {\r\n // Get global recaptcha object\r\n const grecaptcha = window['grecaptcha'] as ReCaptcha;\r\n if (null == grecaptcha)\r\n {\r\n throw \"Recaptcha is not loaded\";\r\n }\r\n\r\n // Get token\r\n const token: string = await new Promise((resolve, reject) => {\r\n grecaptcha.ready(() => {\r\n grecaptcha.execute(globals.config.reCaptchaSiteKey, { action: action })\r\n .then(token => resolve(token))\r\n });\r\n });\r\n\r\n return token;\r\n }\r\n\r\n}\r\n","import BaseClient from \"../baseClient\";\r\nimport GeneralConfigurationResponse from \"./generalConfigurationResponse\";\r\nimport OsApiConfigurationResponse from \"./osApiConfigurationResponse\";\r\n\r\nexport default class ConfigurationClient extends BaseClient {\r\n\r\n public async getOsApiConfigurationAsync() : Promise {\r\n \r\n const recaptchaToken = await this.recaptchaChallengeAsync('configuration_os_api')\r\n\r\n const response = await this.makeRequestAsync({\r\n controller: 'configuration', \r\n action: 'os-api', \r\n method: 'get', \r\n queryParams: [\r\n { name: 'recaptchaToken', value : recaptchaToken }\r\n ], \r\n });\r\n return response as OsApiConfigurationResponse;\r\n }\r\n\r\n\r\n /**\r\n * Gets the general configuration from the server.\r\n * @returns The configuration response object.\r\n */\r\n public async getGeneralConfigurationAsync() : Promise {\r\n const response = await this.makeRequestAsync({controller: 'configuration', action: 'general', method: 'get'});\r\n return response as GeneralConfigurationResponse;\r\n }\r\n\r\n}\r\n","import * as pages from './pages';\r\n\r\n// Common source for all hyperlinks within the web app\r\nclass Links {\r\n public readonly homeHref = Links.pageToPath(pages.home);\r\n\r\n public readonly errorHref = Links.pageToPath(pages.error);\r\n\r\n public readonly logInHref = Links.pageToPath(pages.logIn);\r\n public readonly forgottenPasswordHref = Links.pageToPath(pages.forgottenPassword);\r\n\r\n // Footer\r\n public readonly accessibilityPolicyHref = 'https://www.atkinsglobal.com/accessibility-policy';\r\n public readonly privacyNoticeHref = 'https://www.atkinsglobal.com/privacy-policy';\r\n public readonly modernSlaveryTraffickingStatementHref = 'https://www.atkinsglobal.com/statutory-and-regulatory-disclosures#accordion-item-link-modern-slavery-and-human-trafficking-statement';\r\n public readonly statutoryRegulatoryDisclosuresHref = 'https://www.atkinsglobal.com/statutory-and-regulatory-disclosures';\r\n public readonly integrityHref = 'https://www.snclavalin.com/en/about/integrity';\r\n public readonly reportingLineHref = 'https://www.snclavalin.com/en/site-services/reporting-line';\r\n public readonly disclaimerHref = 'https://www.atkinsglobal.com/disclaimer';\r\n\r\n public readonly aboutUsHref = Links.pageToPath(pages.aboutUs);\r\n public readonly aboutUsBestPracticeHref = `${this.aboutUsHref}#bestpractice`;\r\n public readonly aboutUsMeetTheTeamHref = `${this.aboutUsHref}#meettheteam`;\r\n public readonly aboutUsOurservicesHref = `${this.aboutUsHref}#ourservices`;\r\n\r\n public readonly whatWeOfferHref = Links.pageToPath(pages.whatWeOffer);\r\n public readonly productsHref = Links.pageToPath(pages.products);\r\n\r\n // Products Page - Products panels\r\n public readonly productsUsrHref = `${this.productsHref}#usr-panel`;\r\n public readonly productsUsmHref = `${this.productsHref}#usm-panel`;\r\n public readonly productsUssHref = `${this.productsHref}#uss-panel`;\r\n\r\n // What we offer - Discovery phase\r\n public readonly whatWeOfferDiscoveryHref = `${this.whatWeOfferHref}#discovery`;\r\n public readonly whatWeOfferUtilitySearchReportHref = `${this.whatWeOfferHref}#utilitysearchreport`;\r\n public readonly whatWeOfferUtilitySearchMapHref = `${this.whatWeOfferHref}#utilitysearchmap`;\r\n public readonly whatWeOfferUtilitySearchSummaryHref = `${this.whatWeOfferHref}#utilitysearchsummary`;\r\n public readonly whatWeOfferWayleavesReportHref = `${this.whatWeOfferHref}#wayleavesreport`;\r\n\r\n // What we offer - Feasibility phase\r\n public readonly whatWeOfferFeasibilityHref = `${this.whatWeOfferHref}#feasibility`;\r\n public readonly whatWeOfferDiversionaryWorksBudgetHref = `${this.whatWeOfferHref}#diversionaryworksbudget`;\r\n public readonly whatWeOfferConstraintsAnalysisHref = `${this.whatWeOfferHref}#constraintsanalysis`;\r\n public readonly whatWeOfferCapacityAnalysisHref = `${this.whatWeOfferHref}#capacityanalysis`;\r\n public readonly whatWeOfferNewConnectionsBudgetHref = `${this.whatWeOfferHref}#newconnectionsbudget`;\r\n\r\n // What we offer - Procurement phase\r\n public readonly whatWeOfferProcurementHref = `${this.whatWeOfferHref}#procurement`;\r\n public readonly whatWeOfferDiversionaryWorksDetailedHref = `${this.whatWeOfferHref}#diversionaryworksdetailed`;\r\n public readonly whatWeOfferNewConnectionsFirmHref = `${this.whatWeOfferHref}#newconnectionsfirm`;\r\n\r\n // What we offer - Coordination phase\r\n public readonly whatWeOfferCoordinationHref = `${this.whatWeOfferHref}#coordination`;\r\n public readonly whatWeOfferDiversionaryWorksCoordinationHref = `${this.whatWeOfferHref}#diversionaryworkscoordination`;\r\n public readonly whatWeOfferDisconnectionsHref = `${this.whatWeOfferHref}#disconnections`;\r\n public readonly whatWeOfferNewconnectionsCoordinationHref = `${this.whatWeOfferHref}#newconnectionscoordination`;\r\n\r\n public readonly pricingHref = Links.pageToPath(pages.pricing);\r\n\r\n // Hashes\r\n public readonly utilitySearchReportHash = `#utility-search-report`;\r\n public readonly utilitySearchMapHash = `#utility-search-map`;\r\n public readonly utilitySearchSummaryHash = `#utility-search-summary`;\r\n\r\n // Pricing - Utility Search Report\r\n public readonly pricingUtilitySearchReportHref = `${this.pricingHref}${this.utilitySearchReportHash}`;\r\n\r\n // Pricing - Utility Search Map\r\n public readonly pricingUtilitySearchMapHref = `${this.pricingHref}${this.utilitySearchMapHash}`;\r\n\r\n // Pricing - Utility Search Summary\r\n public readonly pricingUtilitySearchSummaryHref = `${this.pricingHref}${this.utilitySearchSummaryHash}`;\r\n\r\n public readonly caseStudiesHref = Links.pageToPath(pages.caseStudies);\r\n\r\n // Order process - select area\r\n public readonly selectAreaHref = Links.pageToPath(pages.selectArea);\r\n\r\n public readonly selectOptionsHref = Links.pageToPath(pages.selectOptions);\r\n\r\n public readonly registerHref = Links.pageToPath(pages.register);\r\n\r\n public readonly contactAndHelpHref = Links.pageToPath(pages.contactAndHelp);\r\n public readonly contactAndHelpEnquiryHref = `${this.contactAndHelpHref}#ums-customer-enquiry`;\r\n\r\n public readonly orderDetailsHref = Links.pageToPath(pages.orderDetails);\r\n\r\n // Order process - view estimate\r\n public readonly viewEstimateHref = Links.pageToPath(pages.viewEstimate);\r\n\r\n // Order process - checkout on account\r\n public readonly checkoutHref = Links.pageToPath(pages.checkout);\r\n\r\n // Order process - confirmation (for checkout as guest).\r\n public readonly confirmationHref = Links.pageToPath(pages.confirmation);\r\n\r\n // Add products page (formally known as retrospective USM).\r\n public readonly addProductsHref = Links.pageToPath(pages.addProducts);\r\n\r\n public readonly myOrdersHref = Links.pageToPath(pages.myOrders);\r\n\r\n public readonly orderIdQueryStringKey: string = \"orderId\";\r\n public readonly returnUrlQueryStringKey: string = \"returnUrl\";\r\n public readonly filterQueryStringKey: string = \"f\"\r\n public readonly filterQueryStringValueAll: string = \"a\"\r\n public readonly filterQueryStringValueInProgress: string = \"p\"\r\n public readonly filterQueryStringValueIssued: string = \"i\"\r\n public readonly filterQueryStringValueExpired: string = \"e\"\r\n public readonly filterQueryStringValueCancelled: string = \"c\"\r\n public readonly filterQueryStringValueQuote: string = \"q\"\r\n\r\n public readonly hasPlacedOrderRegisteredForInvoicing: string = \"rfi\";\r\n public readonly hasCompletedInlineRegistrationQueryStringKey: string = \"reg\";\r\n public readonly queryStringTrueValue: string = \"t\";\r\n \r\n public readonly documentIdQueryStringKey: string = \"documentId\";\r\n\r\n public readonly myDocumentsHref = Links.pageToPath(pages.myDocuments);\r\n public readonly myDocumentsDetailsHref = Links.pageToPath(pages.myDocumentDetails);\r\n public readonly myNotificationsHref = Links.pageToPath(pages.myNotifications);\r\n public readonly myAccountHref = Links.pageToPath(pages.myAccount);\r\n\r\n public readonly primaryMenuItems: ReadonlyArray = [\r\n Links.pageToNavItem(pages.aboutUs),\r\n Links.pageToNavItem(pages.whatWeOffer),\r\n Links.pageToNavItem(pages.pricing),\r\n Links.pageToNavItem(pages.caseStudies),\r\n ];\r\n\r\n public readonly secondaryMenuItems: ReadonlyArray = [\r\n Links.pageToNavItem(pages.myOrders),\r\n Links.pageToNavItem(pages.myDocuments),\r\n Links.pageToNavItem(pages.myNotifications),\r\n Links.pageToNavItem(pages.myAccount)\r\n ];\r\n\r\n getMobileNavItems(\r\n userIsAuthenticated: boolean,\r\n logoutCallback: () => void)\r\n : Array {\r\n\r\n // Primary links\r\n let navs: Array = this.primaryMenuItems.map((n, i) => {\r\n let followWithSeparator = false;\r\n if (i === (this.primaryMenuItems.length - 1)) {\r\n followWithSeparator = userIsAuthenticated;\r\n }\r\n return { nav: n, followWithSeparator };\r\n });\r\n\r\n // Secondary link\r\n if (userIsAuthenticated) {\r\n navs = navs.concat(this.secondaryMenuItems.map(n => { return { nav: n, followWithSeparator: false }; }));\r\n }\r\n\r\n // Authentication links\r\n if (userIsAuthenticated) {\r\n // Add logout link\r\n navs.push({ nav: { title: 'Logout', pathOrCallback: logoutCallback, isActive: true }, followWithSeparator: false });\r\n\r\n } else {\r\n // Add login and register buttons\r\n navs.push({ nav: Links.pageToNavItem(pages.logIn), followWithSeparator: false });\r\n navs.push({ nav: Links.pageToNavItem(pages.register), followWithSeparator: false });\r\n }\r\n\r\n return navs;\r\n }\r\n\r\n private static pageToPath(page): string {\r\n return [\"\"].concat(page.directoryParts).concat(page.htmlName).join(\"/\");\r\n }\r\n\r\n private static pageToNavItem(page): NavItem {\r\n const path = Links.pageToPath(page);\r\n return {\r\n title: page.title,\r\n pathOrCallback: path,\r\n isActive: window.location.pathname === path\r\n }\r\n }\r\n}\r\n\r\n\r\n// Exports\r\n\r\n// Singleton instance\r\nexport const links = new Links();\r\n\r\n// Interfaces\r\nexport interface NavItem { title: string; pathOrCallback: string | (() => void); isActive: boolean };\r\nexport interface MobileNavItem { nav: NavItem; followWithSeparator: boolean };","import * as ko from 'knockout';\r\n\r\nimport { links } from '../links';\r\nimport AuthenticatedUser from '../authenticatedUser';\r\nimport AuthenticationClient from '../common/webHostClient/authentication/authenticationClient';\r\nimport ConfigurationClient from '../common/webHostClient/configuration/configurationClient';\r\nimport GetTokenInfoRequest from '../common/webHostClient/authentication/getTokenInfoRequest';\r\nimport GetTokenInfoResponse from '../common/webHostClient/authentication/getTokenInfoResponse';\r\nimport storage from '../common/storage';\r\nimport globals from '../common/globals';\r\nimport '../common/staticFileReferences';\r\n\r\n/**\r\n * Base page view model\r\n */\r\nexport default abstract class BasePage {\r\n\r\n public readonly currentUser: ko.Observable = ko.observable();\r\n public readonly links = links;\r\n public readonly canCheckOutAsGuest: ko.Observable = ko.observable(false);\r\n protected requiresAuthentication: boolean = false;\r\n\r\n public async initialiseAsync(): Promise {\r\n\r\n // Get site key\r\n const configurationClient = new ConfigurationClient();\r\n globals.config = await configurationClient.getGeneralConfigurationAsync();\r\n\r\n if (!await this.preflightAsync())\r\n {\r\n console.log(\"Page preflight checks failed, navigating to home page.\");\r\n window.location.assign(this.links.homeHref);\r\n return;\r\n }\r\n\r\n await this.loadHeadAsync();\r\n await this.loadAuthenticationAsync();\r\n\r\n if (this.requiresAuthentication && this.currentUser() == null)\r\n {\r\n console.log(\"Page requires user to login.\");\r\n let returnUrl = encodeURIComponent(document.location.href);\r\n window.location.assign(`${this.links.logInHref}?${this.links.returnUrlQueryStringKey}=${returnUrl}`);\r\n return;\r\n }\r\n\r\n await this.loadContentAsync();\r\n\r\n this.defineCustomBindings();\r\n\r\n ko.applyBindings(this);\r\n\r\n await this.onLoadCompleteAsync();\r\n }\r\n\r\n protected async onLoadCompleteAsync(): Promise {\r\n return;\r\n }\r\n\r\n protected async loadContentAsync(): Promise\r\n {\r\n return;\r\n }\r\n\r\n public signOut() {\r\n this.clearAllInProgressOrderData();\r\n storage.clearAuthenticationToken();\r\n window.location.assign(this.links.homeHref);\r\n }\r\n\r\n protected async preflightAsync(): Promise {\r\n return true;\r\n }\r\n\r\n protected getQueryStringParameter(name) {\r\n return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search) || [null, ''])[1].replace(/\\+/g, '%20')) || null;\r\n }\r\n\r\n /**\r\n * Clears all in progress order data from persistent storage.\r\n */\r\n protected clearAllInProgressOrderData() {\r\n storage.clearInProgressOrderToken();\r\n storage.clearPayPalOrderId();\r\n storage.clearStartOrderLocationQueryText();\r\n storage.clearStartOrderMapBounds();\r\n storage.clearStartOrderSiteGeometry();\r\n }\r\n\r\n\r\n /**\r\n * Gets a value indicating whether the location has the same origin as the current location.\r\n * @param url The location to check\r\n * @returns true if the origins match; otherwise false.\r\n */\r\n protected hasSameOrigin(url: string): boolean\r\n {\r\n const otherLocation = new URL(url);\r\n const currentLocation = new URL(window.location.href);\r\n\r\n const isSameOrigin: boolean = currentLocation.host === otherLocation.host \r\n && currentLocation.port === otherLocation.port \r\n && currentLocation.protocol === otherLocation.protocol;\r\n\r\n return isSameOrigin;\r\n }\r\n\r\n\r\n private async loadHeadAsync() {\r\n\r\n const headElement = document.getElementsByTagName(\"head\")[0];\r\n\r\n // Google Tag Manager\r\n const gtmScriptElement: HTMLScriptElement = document.createElement(\"script\");\r\n gtmScriptElement.innerHTML = \"(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\"\r\n + \"new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\"\r\n + \"j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\"\r\n + \"'https://www.googletagmanager.com/gtm.js?id='+i+dl+ '>m_auth=\" + globals.config.gtmAuth + \">m_preview=\" + globals.config.gtmPreview + \">m_cookies_win=x';f.parentNode.insertBefore(j,f);\"\r\n + \"})(window,document,'script','dataLayer','GTM-T7Q28RD');\"\r\n headElement.appendChild(gtmScriptElement);\r\n\r\n // Google reCAPTCHA\r\n const recaptchaScriptElement: HTMLScriptElement = document.createElement(\"script\");\r\n recaptchaScriptElement.src = `${globals.config.reCaptchaClientScriptUrl}?render=${globals.config.reCaptchaSiteKey}`;\r\n \r\n await new Promise((resolve, reject) => {\r\n recaptchaScriptElement.addEventListener('load', () => resolve(null));\r\n recaptchaScriptElement.onerror = (error) => reject(error);\r\n headElement.appendChild(recaptchaScriptElement);\r\n });\r\n \r\n }\r\n\r\n /**\r\n * Loads authentication items for the page.\r\n */\r\n private async loadAuthenticationAsync() {\r\n\r\n const authenticationClient: AuthenticationClient = new AuthenticationClient();\r\n\r\n const tokenInfoRequest: GetTokenInfoRequest = {\r\n orderToken: storage.getInProgressOrderToken(),\r\n };\r\n\r\n const tokenInfoResponse : GetTokenInfoResponse = await authenticationClient.getTokenInfo(tokenInfoRequest);\r\n\r\n // Is the user authenticated?\r\n if (tokenInfoResponse.currentUserEmail && tokenInfoResponse.currentUserName)\r\n {\r\n this.currentUser({\r\n name: tokenInfoResponse.currentUserName, \r\n email: tokenInfoResponse.currentUserEmail,\r\n });\r\n }\r\n else\r\n {\r\n storage.clearAuthenticationToken();\r\n this.currentUser(null);\r\n }\r\n\r\n // Is there an order in progress?\r\n if (tokenInfoResponse.orderToken)\r\n {\r\n // Yes, hang on to the refreshed token\r\n storage.setInProgressOrderToken(tokenInfoResponse.orderToken);\r\n this.canCheckOutAsGuest(tokenInfoResponse.canCheckOutAsGuest);\r\n }\r\n else\r\n {\r\n // No, clear any stale token.\r\n storage.clearInProgressOrderToken();\r\n this.canCheckOutAsGuest(false);\r\n }\r\n }\r\n\r\n private defineCustomBindings() {\r\n\r\n // Because the elements are created by knockout the element doesn't exisits to bind popover to until knockout has finished rendering,\r\n // Using a databinding to bind popover instead.\r\n ko.bindingHandlers.bindPopover = {\r\n init: (element, _valueAccessor, _allBindings, _viewModel, _bindingContext) => {\r\n $(element).popover();\r\n }\r\n };\r\n \r\n }\r\n}"],"names":["module","exports","home","title","description","directoryParts","htmlName","pageType","aboutUs","products","whatWeOffer","pricing","caseStudies","contactAndHelp","myOrders","myDocuments","myDocumentDetails","myNotifications","myAccount","selectArea","selectOptions","register","logIn","forgottenPassword","error","orderDetails","emailVerify","viewEstimate","checkout","confirmation","paymentComplete","paymentCancelled","addProducts","utilitySearchReportLandingPage","utilitySearchMapLandingPage","instance","config","authenticationTokenKey","startOrderLocationQueryTextKey","inProgressOrderTokenKey","startOrderMapBoundsKey","startOrderSiteGeometryKey","cookiePreferencesSavedKey","allowAnalyticsCookiesKey","payPalOrderIdKey","storage","contactId","window","localStorage","setItem","authenticationTokenValue","sessionStorage","getItem","persist","removeItem","startOrderLocationQueryTextValue","startOrderMapBoundsValue","startOrderSiteGeometryValue","inProgressOrderTokenValue","payPalOrderIdValue","cookieValue","newValue","AuthenticationClient","request","this","recaptchaChallengeAsync","recaptchaToken","makeRequestAsync","controller","action","method","body","response","BaseClient","requestInfo","requestInit","headers","authenticationToken","getAuthenticationToken","JSON","stringify","requestUrl","queryParams","query","map","p","encodeURIComponent","name","value","join","fetch","contentObj","contentMessage","responseContentType","get","split","trim","json","text","status","statusText","content","grecaptcha","Promise","resolve","reject","ready","execute","reCaptchaSiteKey","then","token","ConfigurationClient","Links","homeHref","pageToPath","pages","errorHref","logInHref","forgottenPasswordHref","accessibilityPolicyHref","privacyNoticeHref","modernSlaveryTraffickingStatementHref","statutoryRegulatoryDisclosuresHref","integrityHref","reportingLineHref","disclaimerHref","aboutUsHref","aboutUsBestPracticeHref","aboutUsMeetTheTeamHref","aboutUsOurservicesHref","whatWeOfferHref","productsHref","productsUsrHref","productsUsmHref","productsUssHref","whatWeOfferDiscoveryHref","whatWeOfferUtilitySearchReportHref","whatWeOfferUtilitySearchMapHref","whatWeOfferUtilitySearchSummaryHref","whatWeOfferWayleavesReportHref","whatWeOfferFeasibilityHref","whatWeOfferDiversionaryWorksBudgetHref","whatWeOfferConstraintsAnalysisHref","whatWeOfferCapacityAnalysisHref","whatWeOfferNewConnectionsBudgetHref","whatWeOfferProcurementHref","whatWeOfferDiversionaryWorksDetailedHref","whatWeOfferNewConnectionsFirmHref","whatWeOfferCoordinationHref","whatWeOfferDiversionaryWorksCoordinationHref","whatWeOfferDisconnectionsHref","whatWeOfferNewconnectionsCoordinationHref","pricingHref","utilitySearchReportHash","utilitySearchMapHash","utilitySearchSummaryHash","pricingUtilitySearchReportHref","pricingUtilitySearchMapHref","pricingUtilitySearchSummaryHref","caseStudiesHref","selectAreaHref","selectOptionsHref","registerHref","contactAndHelpHref","contactAndHelpEnquiryHref","orderDetailsHref","viewEstimateHref","checkoutHref","confirmationHref","addProductsHref","myOrdersHref","orderIdQueryStringKey","returnUrlQueryStringKey","filterQueryStringKey","filterQueryStringValueAll","filterQueryStringValueInProgress","filterQueryStringValueIssued","filterQueryStringValueExpired","filterQueryStringValueCancelled","filterQueryStringValueQuote","hasPlacedOrderRegisteredForInvoicing","hasCompletedInlineRegistrationQueryStringKey","queryStringTrueValue","documentIdQueryStringKey","myDocumentsHref","myDocumentsDetailsHref","myNotificationsHref","myAccountHref","primaryMenuItems","pageToNavItem","secondaryMenuItems","userIsAuthenticated","logoutCallback","navs","n","i","followWithSeparator","length","nav","concat","push","pathOrCallback","isActive","page","path","location","pathname","links","BasePage","currentUser","ko","observable","canCheckOutAsGuest","requiresAuthentication","configurationClient","getGeneralConfigurationAsync","preflightAsync","console","log","assign","loadHeadAsync","loadAuthenticationAsync","returnUrl","document","href","loadContentAsync","defineCustomBindings","applyBindings","onLoadCompleteAsync","clearAllInProgressOrderData","clearAuthenticationToken","decodeURIComponent","RegExp","exec","search","replace","clearInProgressOrderToken","clearPayPalOrderId","clearStartOrderLocationQueryText","clearStartOrderMapBounds","clearStartOrderSiteGeometry","url","otherLocation","URL","currentLocation","host","port","protocol","headElement","getElementsByTagName","gtmScriptElement","createElement","innerHTML","gtmAuth","gtmPreview","appendChild","recaptchaScriptElement","src","reCaptchaClientScriptUrl","addEventListener","onerror","authenticationClient","tokenInfoRequest","orderToken","getInProgressOrderToken","getTokenInfo","tokenInfoResponse","currentUserEmail","currentUserName","email","setInProgressOrderToken","bindingHandlers","bindPopover","init","element","_valueAccessor","_allBindings","_viewModel","_bindingContext","$","popover"],"sourceRoot":""}