{"version":3,"file":"app.js","mappings":"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","sources":["webpack://BliwaLibrary/webpack/bootstrap","webpack://BliwaLibrary/webpack/runtime/define property getters","webpack://BliwaLibrary/webpack/runtime/hasOwnProperty shorthand","webpack://BliwaLibrary/webpack/runtime/make namespace object","webpack://BliwaLibrary/./Assets/Scripts/JsUtils/JsUtils.ts","webpack://BliwaLibrary/./Assets/Scripts/Constants/StatusEnum.ts","webpack://BliwaLibrary/./Assets/Scripts/Blazor/BlazorCustomHandler.ts","webpack://BliwaLibrary/./Assets/Scripts/Index.ts","webpack://BliwaLibrary/./Assets/Scripts/CookieTractor/CookieTractorCustomEvents.ts"],"sourcesContent":["// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","class JsUtils {\r\n\r\n /**\r\n * returnerar false om elementId inte hittas, annars true;\r\n * använd default är smooth scroll, skicka in false för att få auto/instant scroll.\r\n * @param elementId\r\n * @param smoothScroll\r\n * @returns\r\n */\r\n public static ScrollPageToElement(elementId:string, smoothScroll:boolean = true):boolean {\r\n const element = document.getElementById(elementId);\r\n \r\n element?.scrollIntoView({\r\n behavior: smoothScroll ? 'smooth' : 'auto'\r\n /* behavior: 'smooth'*/\r\n });\r\n \r\n return element != null\r\n }\r\n /**\r\n * returnerar false om elementet body inte hittas (kan typ inte hända), annars true;\r\n * använd default är smooth scroll, skicka in false för att få auto/instant scroll.\r\n * denna scrollar into view.\r\n * @param smoothScroll\r\n * @returns \r\n */\r\n public static ScrollPageToFirstInvalidElement(smoothScroll: boolean = true): boolean {\r\n const validationMessageElement = document.querySelector(\".validation-message\") as any;\r\n const firstInvalidNode = validationMessageElement.parentNode.getElementsByTagName(\"input\")[0]\r\n ?? validationMessageElement.parentNode.getElementsByTagName(\"textarea\")[0];\r\n\r\n if (validationMessageElement) {\r\n firstInvalidNode.focus({ preventScroll: true });\r\n validationMessageElement.parentNode.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'auto', block: 'center' });\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * För andra sidor som behöver kunna scrolla upp till toppen av sidan\r\n * denna scrollar till starten av innehållet på sidan till länken hoppa till innehåll.\r\n * @param smoothScroll \r\n * @returns\r\n */\r\n public static ScrollContentToTop(smoothScroll: boolean = true): boolean { \r\n const element = document.querySelector(\".scroll-to-top\") as any;\r\n \r\n if (element) {\r\n element.focus({ preventScroll: true })\r\n element.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'auto', block: 'start' }); \r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * För skadeflödet!\r\n * Setter timer på focus på nästa sida så att den hinner rederas \r\n * \r\n * @param smoothScroll\r\n * @returns\r\n */\r\n public static ScrollPageToTop(smoothScroll: boolean = true): boolean {\r\n const myTimeout = setTimeout(JsUtils.ScrollPageToFirstInput, 100, smoothScroll)\r\n return true;\r\n }\r\n\r\n /**\r\n * För skadeflödet som har steps-navigation-top\r\n * returnerar false om step-navigation-top inte hittas, annars true; \r\n * använd default är smooth scroll, skicka in false för att få auto/instant scroll.\r\n * denna scrollar into view.\r\n * @param smoothScroll \r\n * @returns\r\n */\r\n private static ScrollPageToFirstInput(smoothScroll: boolean = true) {\r\n const top = document.querySelector(\".scroll-to-top\") as any;\r\n const elements = document.querySelector(\".steps-output\") as any;\r\n const element = elements.querySelector(\".is-active\") as any; \r\n let nodeInput = element.getElementsByTagName(\"input\")[0];\r\n const nodeTextArea = element.getElementsByTagName(\"textarea\")[0];\r\n const nodeSelect = element.getElementsByTagName(\"select\")[0];\r\n\r\n if (nodeInput.hidden) {\r\n if (nodeTextArea) {\r\n nodeInput = nodeTextArea;\r\n }\r\n if (nodeSelect) {\r\n nodeInput = nodeSelect;\r\n }\r\n }\r\n \r\n if (nodeInput) {\r\n nodeInput.focus({ preventScroll: true });\r\n top.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'auto', block: 'start' });\r\n }\r\n else if (top) {\r\n top.focus({ preventScroll: true });\r\n top.scrollIntoView({ behavior: smoothScroll ? 'smooth' : 'auto', block: 'start' }); \r\n }\r\n else {\r\n window.scrollTo(0, 0);\r\n }\r\n }\r\n\r\n /** iphone hanterar inte behaviours som \"smooth\" på ett bra sätt,\r\n * funkar kanske på nyare devices/IOS men dåligt på äldre (2024-02..)*/\r\n public static ScrollWindowToTop() {\r\n window.scrollTo(0, 0); \r\n }\r\n\r\n /** iphone hanterar inte behaviours som \"smooth\" på ett bra sätt,\r\n * funkar kanske på nyare devices/IOS men dåligt på äldre (2024-02..)*/\r\n public static ScrollToTopOfForm() {\r\n const elements = document.querySelector(\".optimizelyForms\") as any;\r\n let nodeForm = elements.getElementsByTagName(\"form\")[0];\r\n nodeForm.focus({ preventScroll: true });\r\n elements.scrollIntoView({ behavior: 'auto', block: 'start' });\r\n }\r\n\r\n /** Efter att man skickat in epi formulär behöver man scrolla till toppen av sidan för att se\r\n * meddelande om att inskickningen gått bra. Scrollen behöver deayas för att inte hända före\r\n * koden som hanterar formuläret.\r\n */\r\n public static ScrollEpiFormToTop() {\r\n const myTimeout = setTimeout(JsUtils.ScrollToTopOfForm, 1000)\r\n }\r\n\r\n\r\n public static ScrollElementLeft(containerElementId: string, scrollElementId: string, amountOfElementsToScroll: number) {\r\n const containerElement = document.getElementById(containerElementId);\r\n const scrollElement = document.getElementById(scrollElementId);\r\n\r\n const computedStyle = window.getComputedStyle(scrollElement!);\r\n const scrollElementWidth = parseFloat(computedStyle.width) + parseFloat(computedStyle.marginLeft) + parseFloat(computedStyle.marginRight);\r\n\r\n const currentScrollAmount = containerElement?.scrollLeft ?? 0;\r\n const scrollTo = currentScrollAmount - (scrollElementWidth * amountOfElementsToScroll);\r\n\r\n containerElement?.scrollTo({\r\n top: 0,\r\n left: scrollTo,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n public static ScrollElementRight(containerElementId: string, scrollElementId: string, amountOfElementsToScroll: number) {\r\n const containerElement = document.getElementById(containerElementId);\r\n const scrollElement = document.getElementById(scrollElementId);\r\n\r\n const computedStyle = window.getComputedStyle(scrollElement!);\r\n const scrollElementWidth = parseFloat(computedStyle.width) + parseFloat(computedStyle.marginLeft) + parseFloat(computedStyle.marginRight);\r\n\r\n const currentScrollAmount = containerElement?.scrollLeft ?? 0;\r\n const scrollTo = currentScrollAmount + (scrollElementWidth * amountOfElementsToScroll);\r\n\r\n containerElement?.scrollTo({\r\n top: 0,\r\n left: scrollTo,\r\n behavior: 'smooth',\r\n });\r\n }\r\n\r\n public static IsElementScrollable(elementId: string) {\r\n const element = document.getElementById(elementId);\r\n\r\n const currentScrollLeft = element?.scrollLeft ?? 0;\r\n const maxScrollLeft = (element?.scrollWidth ?? 0) - (element?.clientWidth ?? 0);\r\n\r\n const scrollFaultMargin = 10;\r\n const isScrollableLeft = currentScrollLeft > (0 + scrollFaultMargin);\r\n const isScrollableRight = currentScrollLeft < (maxScrollLeft - scrollFaultMargin);\r\n\r\n return { isScrollableLeft, isScrollableRight };\r\n }\r\n}\r\n\r\n\r\nexport const {\r\n ScrollPageToElement,\r\n ScrollPageToFirstInvalidElement,\r\n ScrollContentToTop,\r\n ScrollPageToTop,\r\n ScrollEpiFormToTop,\r\n ScrollWindowToTop,\r\n ScrollElementLeft,\r\n ScrollElementRight,\r\n IsElementScrollable\r\n} = JsUtils;","export enum Status {\r\n Success,\r\n Failed,\r\n Exception\r\n}","/*\r\nEgen hantering av vissa delar gällande Blazors SignalR-anslutning klient <-> Server.\r\n- Start av anslutning till servern.\r\n- Hantering för Tappad och återupprättad anslutning.\r\n*/\r\n\r\nimport { Status } from '../Constants/StatusEnum';\r\n\r\nexport class BlazorCustomHandler {\r\n\r\n private hasConnection: boolean = false;\r\n private firsTime: boolean = true;\r\n private reconnectTimeout: any = null;\r\n private currentReconnectAttempt: number = 1;\r\n private modal: HTMLElement | null = null;\r\n private CUSTOM_RETRY_INTERVAL_MILLISECONDS: number = 800;\r\n private reconnectRetryModalHTML: string = '
Försöker återansluta till servern.
Avbryt
';\r\n private reconnectFailedModalHTML: string = '
Anslutningen till servern försvann. Försök återupprätta kopplingen eller ladda om sidan.Data i formulär försvinner när du laddar om sidan.Ladda om sidan
Försök återansluta
';\r\n\r\n private readonly DISPLAY_NONE: string = 'none';\r\n private readonly DISPLAY_BLOCK: string = 'block';\r\n private readonly EVENT_NAME_CLICK: string = 'click';\r\n private readonly CancelRetryBlazorReconnectBtnId = 'CancelRetryBlazorReconnectBtn';\r\n private readonly TryBlazorReconnectBtnId = 'TryBlazorReconnectBtn';\r\n private readonly LOG_CONNECTION_UP_MESSAGE = 'Blazor connection is up';\r\n private readonly LOG_CONNECTION_DOWN_MESSAGE = 'Blazor connection is down, trying to reconnect...';\r\n private readonly MAX_RECONNECT_RETRIES: number = 8;\r\n private readonly DEFAULT_RETRY_INTERVAL_MILLISECONDS = 1200;\r\n private readonly DISPLAY_RECONNECT_MODAL_AFTER_AMOUNT_OF_RETRIES: number = 5;\r\n\r\n constructor() {\r\n this.Initialize();\r\n }\r\n\r\n //Initiera anslutningen\r\n private Initialize(): void {\r\n this.StartBlazor();\r\n }\r\n\r\n //Starta SignalR-anslutningen till servern\r\n private StartBlazor(): void {\r\n\r\n (window as any).Blazor.start({\r\n configureSignalR: (builder: any) => {\r\n let c = builder.build();\r\n c.keepAliveIntervalInMilliseconds = 15000; //skicka en keep alive ping var 15e sekund. Lika på klient och server\r\n builder.build = () => {\r\n return c;\r\n };\r\n },\r\n reconnectionOptions: {\r\n maxRetries: this.MAX_RECONNECT_RETRIES,\r\n retryIntervalMilliseconds: this.DEFAULT_RETRY_INTERVAL_MILLISECONDS,\r\n },\r\n reconnectionHandler: {\r\n onConnectionDown: (options: any, error?: Error) => this.ConnectionDown(options, error),\r\n onConnectionUp: () => this.ConnectionUp()\r\n }\r\n }).then(() => {\r\n this.hasConnection = true;\r\n }).catch(function (e: any) {\r\n console.error(e);\r\n });\r\n }\r\n\r\n //Om klienten har tappat SignalR-anslutningen till servern körs den här metoden automatiskt från Blazor\r\n private ConnectionDown(options: any, error?: Error) {\r\n this.hasConnection = false;\r\n console.log(this.LOG_CONNECTION_DOWN_MESSAGE);\r\n this.BuildModal(options.dialogId);\r\n this.StartBlazorReconnect();\r\n }\r\n\r\n //Om klienten har återfått SignalR-anslutningen.\r\n private ConnectionUp() {\r\n this.ClearTimeout();\r\n this.hasConnection = true;\r\n this.firsTime = true;\r\n console.log(this.LOG_CONNECTION_UP_MESSAGE);\r\n this.Unset();\r\n }\r\n\r\n private ClearTimeout(): void {\r\n if (this.reconnectTimeout !== null) {\r\n clearTimeout(this.reconnectTimeout);\r\n this.reconnectTimeout = null;\r\n }\r\n }\r\n\r\n private Unset(): void {\r\n if (this.modal !== null) { \r\n window.document.body.removeChild(this.modal);\r\n this.modal = null;\r\n }\r\n }\r\n\r\n private SetFailedModal(): void {\r\n this.UpdateReconnectModal(this.reconnectFailedModalHTML);\r\n this.AddManualReconnectListeners();\r\n }\r\n\r\n private SetRetryModal(): void {\r\n this.UpdateReconnectModal(this.reconnectRetryModalHTML);\r\n this.AddManualCancelListeners();\r\n }\r\n\r\n //Starta försök med att återfå anslutningen till servern.\r\n private StartBlazorReconnect() {\r\n if (this.hasConnection === false) {\r\n this.Reset();\r\n this.SetRetryModal();\r\n this.TryReconnect();\r\n }\r\n }\r\n\r\n //Avbryter pågående anslutningsförsök och visar modalinformation om att försöka igen eller ladda om sidan\r\n private CancelBlazorReconnect() {\r\n this.SetFailedModal();\r\n this.Reset();\r\n }\r\n\r\n private BuildModal(elementId: string): void {\r\n if (this.hasConnection === false) {\r\n this.modal = this.GetReconnectModal(elementId);\r\n window.document.body.appendChild(this.modal);\r\n this.AddManualCancelListeners();\r\n }\r\n }\r\n\r\n //Hämtar anslutning-modal baserat på ID.\r\n private GetReconnectModal(elementId: string): HTMLElement {\r\n let modal = document.getElementById(elementId);\r\n \r\n if (modal === null) {\r\n let reconnectModal = (document.createElement('div'));\r\n reconnectModal.id = elementId;\r\n reconnectModal.innerHTML = this.reconnectRetryModalHTML;\r\n \r\n modal = reconnectModal;\r\n }\r\n\r\n return modal;\r\n }\r\n\r\n //Uppdaterar anslutning-modal med aktuell HTML.\r\n private UpdateReconnectModal(html: string): void {\r\n \r\n if (this.modal !== null) {\r\n this.modal!.innerHTML = html;\r\n }\r\n }\r\n\r\n //Försöker återfå anslutningen till servern\r\n private async TryReconnect() {\r\n if (this.hasConnection === false) {\r\n\r\n this.reconnectTimeout = setTimeout(() => {\r\n\r\n if (this.hasConnection === false) {\r\n if (this.currentReconnectAttempt >= this.DISPLAY_RECONNECT_MODAL_AFTER_AMOUNT_OF_RETRIES) {\r\n this.CUSTOM_RETRY_INTERVAL_MILLISECONDS = this.DEFAULT_RETRY_INTERVAL_MILLISECONDS;\r\n this.modal!.style.display = \"block\";\r\n }\r\n\r\n this.Reconnect().then((result: Status) => {\r\n if (this.hasConnection === false) {\r\n if (result === Status.Failed && this.currentReconnectAttempt < this.MAX_RECONNECT_RETRIES) {\r\n this.TryReconnect();\r\n }\r\n else {\r\n this.SetFailedModal();\r\n }\r\n }\r\n else if (result === Status.Success && this.hasConnection === true) {\r\n this.TriggerApplicationEventListenersOnSucceededReconnect();\r\n }\r\n }).catch(function (e: any) {\r\n console.error(e);\r\n });\r\n\r\n this.currentReconnectAttempt++;\r\n }\r\n\r\n }, this.CUSTOM_RETRY_INTERVAL_MILLISECONDS);\r\n }\r\n }\r\n\r\n private async Reconnect(): Promise {\r\n try {\r\n if (this.hasConnection === false) {\r\n // Beskrivning från Microsoft i vad som kan returneras vid reconnect.\r\n // - true to mean success\r\n // - false to mean we reached the server, but it rejected the connection (e.g., unknown circuit ID)\r\n // - exception to mean we didn't reach the server (this can be sync or async)\r\n const result = await (window as any).Blazor.reconnect();\r\n\r\n if (!result) {\r\n return Status.Failed;\r\n }\r\n }\r\n this.hasConnection = true;\r\n return Status.Success;\r\n\r\n } catch (exception: any) {\r\n return Status.Failed;\r\n }\r\n }\r\n\r\n //Nollställer modalens meddelande för nya anslutningsförsök\r\n private Reset(): void {\r\n if (this.hasConnection === false) {\r\n if (this.modal !== null) {\r\n this.currentReconnectAttempt = 1;\r\n this.modal.style.display = this.firsTime ? this.DISPLAY_NONE : this.DISPLAY_BLOCK;\r\n }\r\n\r\n this.ClearTimeout();\r\n this.firsTime = false;\r\n }\r\n }\r\n\r\n //Lägger på en click-event-lyssnare om man vill försöka själv igen eller avbryta pågående återanslutningsförsök\r\n private AddManualReconnectListeners(): void {\r\n if (this.hasConnection === false) {\r\n //Försök att ansluta på nytt\r\n var tryReconnectBtn = document.getElementById(this.TryBlazorReconnectBtnId) as HTMLButtonElement;\r\n tryReconnectBtn.addEventListener(this.EVENT_NAME_CLICK, this.StartBlazorReconnect.bind(this));\r\n }\r\n }\r\n\r\n private AddManualCancelListeners(): void {\r\n if (this.hasConnection === false) {\r\n //Avbryt pågående anslutnignsförsök\r\n var cancelReconnectBtn = document.getElementById(this.CancelRetryBlazorReconnectBtnId) as HTMLButtonElement;\r\n cancelReconnectBtn.addEventListener(this.EVENT_NAME_CLICK, this.CancelBlazorReconnect.bind(this));\r\n }\r\n }\r\n\r\n //Trigga de applikations-event som behöver känna till att vi återfått uppkopplingen för upprätthållen funktion\r\n private TriggerApplicationEventListenersOnSucceededReconnect(): void {\r\n window.dispatchEvent(new Event(\"visibilitychange\")); //Lyssnare som vi i Blazor-komponenter kan prenumerera på och agera utifrår. Sker via uppsatt event-service på applikationsnivå \r\n }\r\n\r\n public IsConnectionUp(): boolean {\r\n return this.hasConnection;\r\n }\r\n}","require('../Styles/Index.less'); // To make less compile in webpack.\r\n\r\nimport { ScrollPageToFirstInvalidElement, ScrollPageToTop, ScrollWindowToTop, ScrollEpiFormToTop, ScrollElementLeft, ScrollElementRight, IsElementScrollable } from './JsUtils/JsUtils';\r\n\r\n//(window as any).ScrollPageToTop = ScrollPageToTop;\r\n(window as any).bliwa = {\r\n scrollPageToTop: ScrollPageToTop,\r\n scrollPageToFirstInvalidElement: ScrollPageToFirstInvalidElement,\r\n scrollWindowToTop: ScrollWindowToTop,\r\n scrollEpiFormToTop: ScrollEpiFormToTop,\r\n scrollElementLeft: ScrollElementLeft,\r\n scrollElementRight: ScrollElementRight,\r\n isElementScrollable: IsElementScrollable,\r\n};\r\n\r\n\r\nimport { CookieTractorCustomEvents } from './CookieTractor/CookieTractorCustomEvents';\r\nimport { BlazorCustomHandler } from './Blazor/BlazorCustomHandler';\r\nexport { BlazorCustomHandler };\r\n\r\n//Sätter eventlyssnare mot Cookie Tractors events för att köra Create Update av egen site-cookie med klinetens medgivande.\r\n//Detta behövs så Cookie Tractor har felaktig encoding på deras JSON-sträng i deras egen cookie.\r\nnew CookieTractorCustomEvents();","\r\nexport class CookieTractorCustomEvents {\r\n\r\n private readonly BLIWA_COOKIENAME: string = \"_bliwa_cc_consent\";\r\n private readonly COOKIETRACTOR_COOKIENAME: string = \"_cc_cookieConsent\";\r\n private initialDocumentConsents: number = 0;\r\n\r\n private hasConsentOnDocumentLoad: boolean = false;\r\n constructor() {\r\n this.Init();\r\n }\r\n\r\n private Init() {\r\n this.hasConsentOnDocumentLoad = this.HasConsent();\r\n var clientId = (window as any).cookieTractor.consent.key as string;\r\n this.initialDocumentConsents = ((window as any).cookieTractor.consent.current as string[]).length;\r\n\r\n if (clientId === null || clientId === undefined || clientId.trim().length === 0) {\r\n //Om vi saknar klientID (Saknar medgivande för klienten.), Raderar vår custom-kaka som speglar klientens consent genom Cookie Tractor\r\n this.SetCookie(this.BLIWA_COOKIENAME, '', 0);\r\n\r\n //Raderar även Cookie Tractors consent cookie om så är fallet.\r\n (window as any).cookieTractor.cookie.remove();\r\n }\r\n\r\n this.AddCustomEventListeners();\r\n }\r\n\r\n private AddCustomEventListeners(): void {\r\n window.addEventListener('CookieConsentGiven', (event) => {\r\n this.CreateOrUpdateCustomConsentCookie();\r\n }, false);\r\n\r\n window.addEventListener('CookieConsentRevoked', (event) => {\r\n this.CreateOrUpdateCustomConsentCookie();\r\n }, false);\r\n }\r\n\r\n private CreateOrUpdateCustomConsentCookie(): void {\r\n\r\n var reloadDocument = false;\r\n\r\n var clientId = (window as any).cookieTractor.consent.key as string;\r\n var clientConsents = (window as any).cookieTractor.consent.current as string[];\r\n\r\n var clientContentObject = {\r\n ClientId: clientId,\r\n ClientConsents: clientConsents\r\n };\r\n\r\n var hasBliwaCookie = this.HasCookieByName(this.BLIWA_COOKIENAME);\r\n var hasCookieTractorCookie = this.HasCookieByName(this.COOKIETRACTOR_COOKIENAME);\r\n var hasUpdatedConsent = this.initialDocumentConsents !== clientConsents.length;\r\n\r\n var jsonClientContsent = encodeURIComponent(JSON.stringify(clientContentObject));\r\n\r\n this.SetCookie(this.BLIWA_COOKIENAME, jsonClientContsent, 365);\r\n\r\n //Tar bort custom-kakan om vi saknar samtycke men har custom-kakan kvar\r\n if (this.hasConsentOnDocumentLoad === false && hasBliwaCookie) {\r\n this.SetCookie(this.BLIWA_COOKIENAME, '', 0);\r\n }\r\n\r\n //Laddar om dokumentet om vi har samtycke men saknar custom-kakan, eller att vi har samtycke men saknar bliwa-kakan\r\n if ((this.hasConsentOnDocumentLoad === true && hasBliwaCookie === false) ||\r\n (hasCookieTractorCookie && hasBliwaCookie === false) ||\r\n hasUpdatedConsent) {\r\n reloadDocument = true;\r\n }\r\n\r\n if (reloadDocument) {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n private SetCookie(cookieName: string, consent: string, days: number) : void {\r\n var now = new Date();\r\n var time = now.getTime();\r\n time += 3600 * 1000 * (24 * days);\r\n now.setTime(time);\r\n document.cookie =\r\n cookieName + '=' + consent +\r\n '; expires=' + now.toUTCString() +\r\n '; domain=.bliwa.se' +\r\n '; secure=true' +\r\n '; samesite=none' +\r\n '; path=/';\r\n }\r\n\r\n private HasConsent(): boolean {\r\n var clientConsents = (window as any).cookieTractor.consent.current as string[];\r\n\r\n if (clientConsents.length > 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n private HasCookieByName(name: string): boolean {\r\n\r\n var exist: boolean = false;\r\n\r\n if (document.cookie.length > 0) {\r\n document.cookie.split(';').forEach((cookie: string) => {\r\n let cookieData = cookie.split('=');\r\n let cookieName = cookieData[0].trim();\r\n\r\n if (cookieName === name) {\r\n exist = true;\r\n }\r\n });\r\n }\r\n\r\n return exist;\r\n }\r\n}"],"names":["__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","d","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","r","Symbol","toStringTag","value","JsUtils","elementId","smoothScroll","element","document","getElementById","scrollIntoView","behavior","validationMessageElement","querySelector","firstInvalidNode","parentNode","getElementsByTagName","focus","preventScroll","block","setTimeout","ScrollPageToFirstInput","top","nodeInput","nodeTextArea","nodeSelect","hidden","window","scrollTo","elements","ScrollToTopOfForm","containerElementId","scrollElementId","amountOfElementsToScroll","containerElement","scrollElement","computedStyle","getComputedStyle","scrollElementWidth","parseFloat","width","marginLeft","marginRight","scrollLeft","left","currentScrollLeft","isScrollableLeft","isScrollableRight","scrollWidth","clientWidth","ScrollPageToElement","ScrollPageToFirstInvalidElement","ScrollContentToTop","ScrollPageToTop","ScrollEpiFormToTop","ScrollWindowToTop","ScrollElementLeft","ScrollElementRight","IsElementScrollable","Status","BlazorCustomHandler","hasConnection","firsTime","reconnectTimeout","currentReconnectAttempt","modal","CUSTOM_RETRY_INTERVAL_MILLISECONDS","reconnectRetryModalHTML","reconnectFailedModalHTML","DISPLAY_NONE","DISPLAY_BLOCK","EVENT_NAME_CLICK","CancelRetryBlazorReconnectBtnId","TryBlazorReconnectBtnId","LOG_CONNECTION_UP_MESSAGE","LOG_CONNECTION_DOWN_MESSAGE","MAX_RECONNECT_RETRIES","DEFAULT_RETRY_INTERVAL_MILLISECONDS","DISPLAY_RECONNECT_MODAL_AFTER_AMOUNT_OF_RETRIES","constructor","this","Initialize","StartBlazor","Blazor","start","configureSignalR","builder","c","build","keepAliveIntervalInMilliseconds","reconnectionOptions","maxRetries","retryIntervalMilliseconds","reconnectionHandler","onConnectionDown","options","error","ConnectionDown","onConnectionUp","ConnectionUp","then","catch","e","console","log","BuildModal","dialogId","StartBlazorReconnect","ClearTimeout","Unset","clearTimeout","body","removeChild","SetFailedModal","UpdateReconnectModal","AddManualReconnectListeners","SetRetryModal","AddManualCancelListeners","Reset","TryReconnect","CancelBlazorReconnect","GetReconnectModal","appendChild","reconnectModal","createElement","id","innerHTML","html","style","display","Reconnect","result","Failed","Success","TriggerApplicationEventListenersOnSucceededReconnect","reconnect","exception","addEventListener","bind","dispatchEvent","Event","IsConnectionUp","require","bliwa","scrollPageToTop","scrollPageToFirstInvalidElement","scrollWindowToTop","scrollEpiFormToTop","scrollElementLeft","scrollElementRight","isElementScrollable","BLIWA_COOKIENAME","COOKIETRACTOR_COOKIENAME","initialDocumentConsents","hasConsentOnDocumentLoad","Init","HasConsent","clientId","cookieTractor","consent","current","length","trim","SetCookie","cookie","remove","AddCustomEventListeners","event","CreateOrUpdateCustomConsentCookie","reloadDocument","clientConsents","clientContentObject","ClientId","ClientConsents","hasBliwaCookie","HasCookieByName","hasCookieTractorCookie","hasUpdatedConsent","jsonClientContsent","encodeURIComponent","JSON","stringify","location","reload","cookieName","days","now","Date","time","getTime","setTime","toUTCString","name","exist","split","forEach"],"sourceRoot":""}