{"version":3,"mappings":"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","names":["ConfigDefinition","__publicField","Config","LoggerDefinition","message","optionalParams","Logger","TelemetryService","instrumentationKey","ApplicationInsights","name","url","customProperties","measurements","exception","telemetryService","LoginMode","ADB2CErrorCodes","QueryParameterNames","LogoutActions","LoginActions","AuthenticationResultStatus","AuthorizeService","clientB2CSettings","loginCallback","logOutCallback","passwordChangeCallback","user","silentUser","silentError","state","usePopup","popUpUser","popUpError","signInRequest","redirectError","oidcClient","userManager","error","response","processSignInResponseError","stateKeys","states","key","stateString","_a","signOutRequest","redirectSignOutError","processSignOutResponseError","callback","subscriptionId","subscriptionIndex","element","index","store","keys","mode","retryAvailable","status","redirectUrl","returnTo","authority","redirect_uri","settings","WebStorageStateStore","UserManager","OidcClient","event","oldProfile","newProfile","oidcUser","authPrefix","passwordChange","ApplicationPaths","authService","StorageTypes","poll","originalPromise","config","pollCondition","pollingTimes","pollConditionResult","interval","resolve","reject","BaseServiceDefinition","apiBaseUrl","basePath","baseUrl","Axios","accessToken","memberProfileStore","useMemberProfileStore","data","params","ms","filename","options","pollingInterval","blob","blobURL","tempLink","fileName","blobUrl","MemberProfilesService","updatedEconomics","updatePreferences","contactDetails","address","certificateDocument","memberProfilesService","StorageService","defaultPrefix","test","storageType","json","prefix","finalKey","rawValue","value","finalValue","storageService","authStoreId","useAuthStore","defineStore","reactive","authServiceSubscription","loadingPromise","actions","initialize","redirectData","removeProxyUserFromSessionStorage","returnUrl","domainHint","checkAuthentication","toRefs","dateOnlyLength","dateFormats","formatDateWithFormat","dateFormat","format","sv","formatDate","formatDateWithTime","separator","formatShortDay","formatYear","formatLongMonthAndYear","formatMonthAndYearPeriod","from","to","fromDate","toDate","sameYear","formatDayAndMonth","formatMonthAndYear","yearAndMonth","date","getDaysBetweenDates","d1","d2","getMinutesBetweenDates","startDate","endDate","getDateOnlyWithLocalTimezone","findLast","array","predicate","l","groupBy","list","keyGetter","map","item","collection","isSameArray","a","b","j","CommonArrayStore","payload","id","field","newItem","ProfileType","ProfileArrayStore","_b","effectiveUserId","proxy","profileType","routes","route","doesProfileMeetRoleRequirements","rolesToCheck","requirement","roles","requiredRole","condition","PROXY_USER_STORAGE_KEY","proxyProfileStorageUtil","userId","memberProfileStoreId","common","authStore","currentlyLoadingPromise","newSession","resolveGetMemberFunc","memberProfile","economics","updateContactDetails","hasEffectiveAccessToRouteByEpiserverRouteName","routeName","computed","role","service","ProblemType","EventLogin","EventLogout","EventChangePassword","EventBus","mitt","props","__props","imageUrl","VideoModalId","MaterialSymbolNames","logoUrl","logoRouteName","_imports_0","RouteNames","t","useI18n","size","symbolName","filled","profile","isUsingProxy","desktopOnly","overrideMobile","initials","fullInitials","x","hideOnClickOutside","emit","__emit","TooltipSettings","__expose","hide","show","content","hideOnClick","showOnCreate","trigger","theme","placement","maxWidth","duration","timeout","refs","ref","popover","timeoutId","create","tippy","destroy","watch","isShown","onMounted","nextTick","onBeforeUnmount","active","attrs","useAttrs","linkText","target","icon","iconPlacementEnd","disabled","componentType","isStyledAsButton","isExternalLink","isRouterLink","linkAttributes","router","useRouter","disableTooltip","isDisabled","customTooltipText","hasAccess","destRoute","isMatchByName","isMatchByPath","tooltipText","existingRoute","toName","toPath","toPathTrailingSlash","linkContent","title","titleIcon","titleClass","label","labelClass","info","infoLabel","infoClass","PageType","formatProxyProfileDetails","details","d","toRoutesAvailableInMenu","filteredRoutes","filteredChildRoutes","FeatureFlagName","CommonStore","FeatureManagementService","featureManagementService","featureManagementStoreId","useFeatureManagementStore","featureFlagName","featureFlag","DetailsRouteNames","featureManagementStore","currentProxy","logout","StyleBreakpoints","DeviceTypes","getDeviceType","UAParser","isDesktopDevice","isMobileDevice","UnityModalType","text","grey","absolute","textIfSlow","addedText","large","closeableByOutsideClickAndEscKey","closeButton","backButton","truncateTitle","smallTitle","showBottomWarning","preventCloseDefault","showOnInitialize","showFooter","showBodyBottomBoxShadow","resizeObserver","updateHasScrollbar","isDesktop","dispathWindowEventForModal","onBackClick","onCloseClick","openNotClose","eventType","fullscreenStoreId","useFullscreenStore","PageFeatureType","PagesService","pageId","includeChildren","includeContent","type","pagesService","pageStatusStoreId","usePageStatusStore","overrideOfflines","getters","statusContainer","startupStoreId","useStartupStore","disposeAllStoresExcept","storeIdsToExclude","pinia","getActivePinia","exceptIdsSet","disposeNonEssentialStores","storeUtil","UnityAlertType","background","border","image","round","forwardIcon","bounce","back","loader","smallBorderRadius","noBorderRadius","color","modifierClasses","classes","close","closeTimer","setTimedCloseEvent","milliseconds","onUnmounted","slots","useSlots","clickable","externalUrl","bold","alignLeft","smallerPadding","alignItemsCenter","onItemClick","i18nBasePath","tBasePath","isError","loading","hideHelpText","changeProfileSuccess","myProfile","effectiveProfile","hasProxies","availableProfiles","proxyProfiles","useProxyProfile","useMyProfile","isDetailsString","useProfile","loadProfile","after","args","distinctProxyDetails","allDetails","detailsMap","detail","distinct","onShowInfo","onBackFromInfo","windowWidth","showProfileDropdown","isAuthenticated","menuIconOnDesktop","showProfileOnDropdownMobile","toggleProfileMenu","SidebarNavItem","init","SidebarNavModel","sidebarId","positionStatic","expanded","disableScrollbar","pinned","themes","authRequirementsCommonPublic","authRequirementsContentPrivate","defaultDocumentTitle","HomeRouteDefinition","__vitePreload","AuthenticationRouteDefinition","LoginRouteDefinition","PasswordChangeRouteDefinition","NotFoundRouteDefinition","NotFoundPage","useRoute","isActiveRoute","isActive","child","hasActiveChildRecursive","expandSubMenu","closestExpandable","SidebarNav","document","menuElement","events","clickedElement","listItem","openChildren","menus","menu","observer","submenu","isOpen","menuItems","menuHeight","parentChildMenu","sidebarNav","SidebarNavScript","xSmall","small","hasBorder","dataPerView","autoPlay","hidePagination","paginationControl","dataControls","Carousel","greyContactPlaceholderImage","whiteContactPlaceholderImage","roundImage","placeholderImage","phone","email","imageUrlWithPlaceholderFallback","_sfc_render","_ctx","_cache","_openBlock","_createElementBlock","_hoisted_1","inspectors","authenticatedByIDP","isMdSidebarOpen","isAuthenticatedByIDP","pinnedSidebar","isTabletSidebar","sidebarNavOverview","SidebarNavItemModel","sidebarNavItems","toSidebarNavItemRecursive","parentUrlName","mapIcon","r","sidebarNavItemsWithoutExternalUrls","childItem","sidebarExternalUrls","userProfile","customClass","pageStatusStore","pageFeatureType","closedAlertIds","pageMessages","alerts","getAlertType","visibleAlerts","y","messageType","onCloseAlert","useResize","windowHeight","updateWithDebounce","func","delay","impersonatedUserName","proxyProfileUserName","switchToOwnAccount","startupStore","fullscreenStore","contactLink","PageFeatureOfflinePage","defineAsyncComponent","AccessDeniedPage","routerViewComponentOverride","isPageOffline","isPageOverrideOffline","impersonatedSessionExpiredError","initialized","showRouterView","commonError","isXlScreen","isImpersonated","isHiddenOnFullscreen","Unity","updateScreenSize","login","changePassword","toggleSidebarMenu","renewCookieConsent","cookieConsent","restorePageOverrideOffline","addPageFeatureTypeToRouteRecursive","Role","authRequirementsMemberProxyPublic","authRequirementsMemberProxyDefault","authRequirementRead","authRequirementReadWrite","getPath","path","ProxiesHomeRouteDefinition","ProxiesProxyRouteDefinition","ProxiesRegisterProxyUserRouteDefinition","ProxiesRegisterProxyUserCallbackRouteDefinition","authRequirementsDocumentsDefault","SupportHomeRouteDefinition","OldSupportHomeRouteDefinition","supportRoutes","DocumentsHomeRouteDefinition","AccountsRouteNames","authRequirementsDetailsDefault","authRequirementsEconomicsDefault","economicsBasePath","getEconomicsPath","DetailsHomeRouteDefinition","OldDetailsRouteDefinition","OldConfirmDetailsRouteDefinition","EconomicsHomeRouteDefinition","profileRoutes","economicProfileRoutes","ProductionBaseService","ProductionCustomEventService","productionCustomEventService","authRequirementsProductionDefault","ProductionLayoutRouteDefinition","RouterView","authRequirementsMyMapDefault","MyMapHomeRouteDefintion","RequiredCustomerType","authRequirementsSodraElDefault","SodraElHomeRouteDefinition","CertificationRouteNames","BasePath","CertificationPaths","authRequirementsDefault","CertificationLayoutRouteDefinition","PriceConditionsRouteNames","PriceConditionsLayoutRouteDefinition","grandIdCallbackGuard","fallbackRoute","authRequirementsReadWrite","AccountsRouteDefinition","RouteTitlePaths","authRequirementsPriceCalculationDefault","priceCalculationPath","PriceCalculationHomeRouteDefinition","OldPriceCalculationHomeRouteDefinition","priceCalculationRoutes","EconomicDevelopmentRouteNames","EconomicDevelopmentLayoutRouteDefinition","CapitalTradeRouteNames","CapitalTradeHomeRouteDefinition","svGlobal","svProxy","svTimberManagerV2","svTimberManagerV3","svMyMap","svMap","svDocuments","svDetails","svSupport","svProduction","svSodraEl","svCertification","svPriceConditions","svAccounts","svPriceCalculation","svEconomicDevelopment","svCapitalTrade","defaultLocale","NumberFormats","i18n","createI18n","usePageStore","pageService","UrlUtil","segments","results","replaceValue","customElementLoadingEventName","customElementLoadingEventCompleteName","componentModel","breadcrumbs","appendedComponentId","customElementLoading","components","component","offline","addComponentScript","onUpdated","removeCustomElementEventListeners","getAppJsFilename","result","appJsFilename","scriptSrc","hostKey","pathKey","getPathFromBreadcrumbs","scriptElement","configurationIdKey","componentWrapper","addCustomElementEventListeners","onCustomElementReady","onCustomElementLoading","onCustomElementLoadingComplete","updateYouTubeLinks","href","youtubeId","teaser","isExternalUrl","clickedTeaser","teasers","accordionItem","accordion","banner","textAndImage","showMessage","ContentType","section","NewsService","newsId","newsService","useNewsStore","placeHolderImgUrl","te","newsStore","news","newsArchiveLink","isLoading","newsItems","items","getNthMostRecentNews","loadNews","maxCount","sortNewsItemsByDate","item1","item2","resolveInformationType","informationType","defaultTranslation","exactTranslation","resolveBackgroundImage","profileLastModifiedEmailPhone","isNewSession","isTimeToUpdateContactDetails","lastmodifiedDate","UTCDateMini","add","pageStore","page","updateLinks","loadPage","isMemberDetailsPage","subRoute","handleClicks","altKey","ctrlKey","metaKey","shiftKey","button","defaultPrevented","linkTarget","OpportunityQuoteProjectIdForNew","authRequirementsTimberManagerDefault","timberManagerPath","TimberManagerHomeRouteDefintion","TimberManagerOpportunityRouteDefinition","TimberManagerDeliveryRouteDefinition","timberManagerHomeRouteDefintion","timberManagerOpportunityRouteDefinition","timberManagerDeliveryRouteDefinition","OpportunityIdForNew","startupGuard","anyRouteMatch","addedTimberManagerRoute","addTimberManagerRoutes","dynamicRoutes","addRoutes","timberManagerV3HomeRouteDefintion","timberManagerV3OpportunityRouteDefinition","timberManagerV3DeliveryRouteDefinition","timberManagerV2HomeRouteDefintion","timberManagerV2OpportunityRouteDefinition","timberManagerV2DeliveryRouteDefinition","userRoutes","shouldOnlyUseEpiserverRoute","currentRoutes","wildcardRoutePostfix","wildcardRoutePostfixIndex","userRoute","generateRoute","currentRoute","matchingRoutes","matchingRoute","routePath","parentRoutes","menuBreadcrumbs","parentRoutesClone","menuRoutePath","getRouteConfig","ContentPage","meta","isFeatureEnabled","isEnabled","ValidationError","ValidationError2","validate","requirements","Permissions","authorizationGuard","authRequirements","validationResult","startTrackPage","stopTrackPage","pageStatusGuard","baseDocumentTitle","createRouter","createWebHistory","proxyRoutes","documentsRoutes","myMapRoutes","detailsRoutes","productionRoutes","sodraElRoutes","certificationRoutes","priceConditionsRoutes","accountsRoutes","economicDevelopmentRoutes","capitalTradeRoutes","startupResult","documentTitle","breadcrumb","veeValidate","defineRule","required","max","regex","integer","min_value","max_value","socialSecurityNumberRegex","sum","values","i","v","checkValue","phoneNumberRegex","phoneNumberCountryCodeRegex","highchartsVue","app","HighchartsVue","NoDataModule","Highcharts","accessibility","highchartsMore","solidGauge","vueDatepicker","VueDatePicker","createApp","App","err","instance","createPinia","VueVirtualScroller","jQuery"],"ignoreList":[],"sources":["../../src/utils/Config.ts","../../src/utils/Logger.ts","../../src/common/services/TelemetryService.ts","../../src/common/services/AuthService.ts","../../src/services/AuthService.ts","../../src/common/enums/StorageTypes.ts","../../src/utils/Polling.ts","../../src/services/BaseService.ts","../../src/services/MemberProfilesService.ts","../../src/common/services/StorageService.ts","../../src/services/StorageService.ts","../../src/stores/authStore.ts","../../src/utils/Dates.ts","../../src/utils/ArrayUtil.ts","../../src/stores/common/CommonArrayStore.ts","../../src/stores/profile/ProfileArrayStore.ts","../../src/router/roleRequirement.ts","../../src/stores/memberProfileStore.ts","../../src/models/ProblemType.ts","../../src/utils/EventBus.ts","../../src/components/common/MBanner.vue","../../src/models/ElementReference.ts","../../src/models/MaterialSymbolNames.ts","../../src/components/common/header/MCompactHeader.vue","../../../../../../../../img/sodra-logo.svg","../../src/router/routeNames.ts","../../src/components/common/icons/MSodraHeaderLogo.vue","../../src/components/common/icons/MMaterialSymbol.vue","../../src/components/header/PageHeaderProfile.vue","../../src/components/common/list/MDropdownNavList.vue","../../src/models/TooltipSettings.ts","../../src/components/TooltipComponent.vue","../../src/components/TooltipConditional.vue","../../src/components/common/links/MLink.vue","../../src/components/common/RouterLinkGuarded.vue","../../src/components/common/list/MDropdownNavListItem.vue","../../src/components/header/changeProfile/ProxyProfileInfoItem.vue","../../src/models/content/PageType.ts","../../src/utils/memberProfile/memberProfileUtils.ts","../../src/models/featureManagement/FeatureFlag.ts","../../src/stores/common/CommonStore.ts","../../src/services/FeatureManagementService.ts","../../src/stores/featureManagementStore.ts","../../src/features/details/router/routeNames.ts","../../src/components/header/HeaderDropdownNavList.vue","../../src/models/StyleBreakpoints.ts","../../src/utils/UserAgentParser.ts","../../src/models/modal/UnityModalType.ts","../../src/components/LoaderComponent.vue","../../src/components/common/modal/MModal.vue","../../src/stores/fullscreenStore.ts","../../src/models/infrastructure/PageFeatureType.ts","../../src/services/PagesService.ts","../../src/stores/pageStatusStore.ts","../../src/stores/startupStore.ts","../../src/utils/StoreUtil.ts","../../src/models/alert/UnityAlertType.ts","../../src/components/common/buttons/MButton.vue","../../src/components/common/MAlert.vue","../../src/components/common/list/MCompactListItem.vue","../../src/components/common/MTextWithLink.vue","../../src/features/proxy/router/routeNames.ts","../../src/components/common/MLine.vue","../../src/components/header/changeProfile/ChangeProfileModal.vue","../../src/components/header/changeProfile/ChangeProfileInfoModal.vue","../../src/components/header/changeProfile/ChangeProfileModalContainer.vue","../../src/components/header/PageHeader.vue","../../src/models/sidebar/SideBarNavItem.ts","../../src/models/sidebar/SideBarNav.ts","../../src/features/support/router/routeNames.ts","../../src/components/common/sidebar/MSidebar.vue","../../src/components/common/chip/MChip.vue","../../src/components/common/sidebar/MSidebarContent.vue","../../src/components/common/sidebar/MSidebarSubMenu.vue","../../src/router/authRequirements.ts","../../src/views/NotFoundPage.vue","../../src/router/routes.ts","../../src/components/common/sidebar/MSideBarNavItem.vue","../../src/models/sidebar/SideBarNavScript.ts","../../src/components/common/sidebar/MSideBarNav.vue","../../src/components/common/buttons/MRoundButton.vue","../../src/components/common/carousel/MCarousel.vue","../../src/assets/img/contact-placeholder-image_grey.svg","../../src/assets/img/contact-placeholder-image_white.svg","../../src/components/common/MContactCard.vue","../../src/components/common/carousel/MCarouselSlide.vue","../../src/components/common/carousel/MInspectorCarousel.vue","../../src/components/sidebar/PageSidebar.vue","../../src/components/FullscreenLoader.vue","../../src/components/common/PageStatusMessages.vue","../../src/composables/Resize.ts","../../src/components/header/ImpersonatedUser.vue","../../src/App.vue","../../src/utils/RouteDefinitionUtil.ts","../../src/models/memberProfile/Role.ts","../../src/features/proxy/router/index.ts","../../src/features/support/router/index.ts","../../src/features/documents/router/routeNames.ts","../../src/features/documents/router/index.ts","../../src/features/accounts/router/routeNames.ts","../../src/features/details/router/index.ts","../../src/features/production/router/routeNames.ts","../../src/features/production/services/ProductionBaseService.ts","../../src/features/production/services/ProductionCustomEventService.ts","../../src/features/production/router/index.ts","../../src/features/myMap/router/routeNames.ts","../../src/features/myMap/router/index.ts","../../src/features/sodraEl/router/types.ts","../../src/features/sodraEl/router/routeNames.ts","../../src/features/sodraEl/router/index.ts","../../src/features/certification/router/routeNames.ts","../../src/features/certification/router/paths.ts","../../src/features/certification/router/index.ts","../../src/features/priceConditions/router/routeNames.ts","../../src/features/priceConditions/router/index.ts","../../src/features/accounts/router/guards/grandidCallbackGuard.ts","../../src/features/accounts/router/index.ts","../../src/features/priceCalculation/router/routeNames.ts","../../src/features/priceCalculation/router/routeTitlePaths.ts","../../src/features/priceCalculation/router/index.ts","../../src/features/economicDevelopment/router/routeNames.ts","../../src/features/economicDevelopment/router/index.ts","../../src/features/capitalTrade/router/routeNames.ts","../../src/features/capitalTrade/router/routeTitlePaths.ts","../../src/features/capitalTrade/router/index.ts","../../src/i18n/index.ts","../../src/stores/pageStore.ts","../../src/utils/UrlUtil.ts","../../src/common/utils/CustomElementLoading.ts","../../src/components/content/ComponentContent.vue","../../src/components/content/TextContent.vue","../../src/components/content/TeaserContent.vue","../../src/components/content/TeasersContent.vue","../../src/components/content/AccordionItemContent.vue","../../src/components/content/AccordionContent.vue","../../src/components/content/BannerContent.vue","../../src/components/content/ImageContent.vue","../../src/components/content/TextAndImageContent.vue","../../src/components/content/MessageContent.vue","../../src/models/content/ContentType.ts","../../src/components/content/SectionContent.vue","../../src/services/NewsService.ts","../../src/stores/newsStore.ts","../../src/assets/placeholder-image.jpg","../../src/components/content/NewsContent.vue","../../src/components/content/ContentWrapper.vue","../../src/components/modal/UpdateMemberDetailsModal.vue","../../src/views/ContentPage.vue","../../src/features/timberManagerV2/router/routeNames.ts","../../src/features/timberManagerV2/router/routeTitlePaths.ts","../../src/features/timberManagerV2/router/index.ts","../../src/features/timberManagerV3/router/routeNames.ts","../../src/features/timberManagerV3/router/routeTitlePaths.ts","../../src/features/timberManagerV3/router/index.ts","../../src/router/guards/startupGuard.ts","../../src/models/permissions/Permissions.ts","../../src/router/guards/authGuard.ts","../../src/router/guards/trackingGuard.ts","../../src/router/guards/pageStatusGuard.ts","../../src/router/index.ts","../../src/plugins/vee-validate.ts","../../src/plugins/highcharts-vue.ts","../../src/plugins/vue-datepicker.ts","../../src/main.ts","../../src/jquery.js"],"sourcesContent":["import type { Settings } from '@/models/Settings';\r\n\r\nclass ConfigDefinition {\r\n  public Settings: Settings = {\r\n    LogLevel: 'debug',\r\n    ClientB2C: {\r\n      ClientUri: '',\r\n      ClientId: '',\r\n      Authority: '',\r\n      Scope: '',\r\n      PasswordChangeAuthority: '',\r\n      RequireAuthenticationAfter: 86400, // 24h\r\n    },\r\n    AIInstrumentationKey: '',\r\n    BaseCmsPathRegex: '',\r\n    ContactLink: '',\r\n    MembershipApplicationLink: '',\r\n    NewsArchiveLink: '',\r\n    PanelistaId: '',\r\n    Certification: {\r\n      ReadMoreUrl: '',\r\n      ContractingServiceAgreementUrl: '',\r\n      TimberSalesAgreementAppendixUrl: '',\r\n      ObjectInstructionChecklistUrl: '',\r\n    },\r\n    Details: {\r\n      NationellaMarktackedataUrl: '',\r\n    },\r\n    Proxy: {\r\n      PersonalDataPolicyLink: '',\r\n    },\r\n    TimberManager: {\r\n      MemberTimberPriceListUrl: '',\r\n      CertificationReadMoreUrl: '',\r\n      MemberCertificationUrl: '',\r\n      NatureCarePremiumUrl: '',\r\n      SodraTimberDeliveryUrl: '',\r\n      DeliveryGuideUrl: '',\r\n      LandingAtRoadUrl: '',\r\n      ReportRoadClassUrl: '',\r\n      EUDRInfoUrl: '',\r\n      EUDRSodraReadMoreUrl: '',\r\n    },\r\n    SodraEl: {\r\n      CustomerServiceEmail: '',\r\n      SodraElUrl: '',\r\n    },\r\n    MyMap: {\r\n      ManageForestManagementPlanUrl: '',\r\n      RedlistCategoryReadMoreUrl: '',\r\n      ProtectedByLawReadMoreUrl: '',\r\n      ProtectedByLawReadMoreSecondUrl: '',\r\n      PrioritisedBirdSpeciesReadMoreUrl: '',\r\n      ActionPlanReadMoreUrl: '',\r\n      CompartmentHeightReadMoreUrl: '',\r\n      CompartmentBasalAreaReadMoreUrl: '',\r\n      CompartmentCalculateVolumeReadMoreUrl: '',\r\n      CompartmentMeasureVolumeReadMoreUrl: '',\r\n      CompartmentMeasurementToolsReadMoreUrl: '',\r\n      CompartmentAgeReadMoreUrl: '',\r\n      CompartmentSiteIndexReadMoreUrl: '',\r\n    },\r\n    Map: {\r\n      SteepHillUrl: '',\r\n      TreeHeightUrl: '',\r\n    },\r\n    Accounts: {\r\n      SodraModelUrl: '',\r\n      FixedInterestAccountTermsUrl: '',\r\n      SodraWithdrawInfoDocumentUrl: '',\r\n    },\r\n    EconomicDevelopment: {\r\n      PanelistaId: '',\r\n    },\r\n    PriceCalculation: {\r\n      ExpectedDividendInfoUrl: '',\r\n      AgreementInfoUrl: '',\r\n    },\r\n    MapboxAccessToken: '',\r\n    MapboxLink: '',\r\n  };\r\n\r\n  public get isDevelopment(): boolean {\r\n    return import.meta.env.DEV;\r\n  }\r\n\r\n  public initialize(): void {\r\n    this.Settings = (window as any).SodraMemberPortalSettings;\r\n    if (this.isDevelopment) {\r\n      this.Settings.ClientB2C.ClientUri =\r\n        this.Settings.ClientB2C.ClientUri || window.location.origin;\r\n    }\r\n  }\r\n}\r\n\r\nexport const Config = new ConfigDefinition();\r\n","import { Config } from './Config';\r\n\r\nclass LoggerDefinition {\r\n  private isDebugEnabled = true;\r\n  private isWarnEnabled = true;\r\n  private isInformationEnabled = true;\r\n  private isErrorEnabled = true;\r\n\r\n  public initialize(): void {\r\n    const logLevel = Config.Settings.LogLevel;\r\n\r\n    switch (logLevel) {\r\n      case 'error':\r\n        this.isDebugEnabled = false;\r\n        this.isInformationEnabled = false;\r\n        this.isWarnEnabled = false;\r\n        break;\r\n      case 'warn':\r\n        this.isDebugEnabled = false;\r\n        this.isInformationEnabled = false;\r\n        break;\r\n      case 'info':\r\n        this.isDebugEnabled = false;\r\n        break;\r\n      case 'none':\r\n        this.isDebugEnabled = false;\r\n        this.isInformationEnabled = false;\r\n        this.isWarnEnabled = false;\r\n        this.isErrorEnabled = false;\r\n        break;\r\n      case 'debug':\r\n      default:\r\n        break;\r\n    }\r\n  }\r\n\r\n  /* eslint-disable no-console */\r\n  public info(message?: any, ...optionalParams: any[]) {\r\n    if (this.isInformationEnabled && console && console.info) {\r\n      console.info(message, ...optionalParams);\r\n    }\r\n  }\r\n\r\n  public warn(message?: any, ...optionalParams: any[]) {\r\n    if (this.isWarnEnabled && console && console.warn) {\r\n      console.warn(message, ...optionalParams);\r\n    }\r\n  }\r\n\r\n  public debug(message?: any, ...optionalParams: any[]) {\r\n    if (this.isDebugEnabled && console && console.log) {\r\n      console.log(message, ...optionalParams);\r\n    }\r\n  }\r\n\r\n  public error(message?: any, ...optionalParams: any[]) {\r\n    if (this.isErrorEnabled && console && console.error) {\r\n      console.error(message, ...optionalParams);\r\n    }\r\n  }\r\n  /* eslint-enable no-console */\r\n}\r\n\r\nexport const Logger = new LoggerDefinition();\r\n","import { ApplicationInsights } from '@microsoft/applicationinsights-web';\r\nimport { Logger } from '@/utils/Logger';\r\n\r\nclass TelemetryService {\r\n  private appInsights?: ApplicationInsights;\r\n\r\n  public initialize(instrumentationKey: string) {\r\n    this.appInsights = new ApplicationInsights({\r\n      config: {\r\n        instrumentationKey,\r\n        enableUnhandledPromiseRejectionTracking: true,\r\n      },\r\n    });\r\n\r\n    Logger.debug('Load App Insights');\r\n    this.appInsights.loadAppInsights();\r\n  }\r\n\r\n  public startTrackPage(name: string): void {\r\n    Logger.debug('Start Track Page', name);\r\n\r\n    if (this.appInsights) {\r\n      this.appInsights.startTrackPage(name);\r\n    }\r\n  }\r\n\r\n  public stopTrackPage(\r\n    name: string,\r\n    url?: string,\r\n    customProperties?: { [key: string]: any },\r\n    measurements?: { [key: string]: number },\r\n  ): void {\r\n    Logger.debug('Stop Track Page', name, url);\r\n\r\n    if (this.appInsights) {\r\n      this.appInsights.stopTrackPage(name, url, customProperties, measurements);\r\n    }\r\n  }\r\n\r\n  public trackException(exception: Error): void {\r\n    Logger.debug('Track Exception', exception);\r\n\r\n    if (this.appInsights) {\r\n      this.appInsights.trackException({\r\n        exception,\r\n      });\r\n    }\r\n  }\r\n\r\n  public trackTrace(message: string): void {\r\n    Logger.debug('Track Trace', message);\r\n\r\n    if (this.appInsights) {\r\n      this.appInsights.trackTrace({\r\n        message,\r\n      });\r\n    }\r\n  }\r\n}\r\n\r\nconst telemetryService: TelemetryService = new TelemetryService();\r\n\r\nexport default telemetryService;\r\n","import {\r\n  WebStorageStateStore,\r\n  OidcClient,\r\n  UserManager,\r\n  type UserProfile,\r\n  type User,\r\n  type UserManagerSettings,\r\n  type OidcClientSettings,\r\n  type CreateSigninRequestArgs,\r\n  type CreateSignoutRequestArgs,\r\n} from 'oidc-client-ts';\r\nimport type { B2CSettings } from '../models/B2CSettings';\r\n\r\nimport telemetryService from '@/common/services/TelemetryService';\r\n\r\nconst LoginMode = {\r\n  Silent: 'silent',\r\n  PopUp: 'popup',\r\n  Redirect: 'redirect',\r\n};\r\n\r\nconst ADB2CErrorCodes = {\r\n  UserNotFound: 'AADB2C99002',\r\n};\r\n\r\nexport const QueryParameterNames = {\r\n  ReturnUrl: 'returnUrl',\r\n  Message: 'message',\r\n};\r\n\r\nexport const LogoutActions = {\r\n  LogoutCallback: 'logout-callback',\r\n  Logout: 'logout',\r\n  LoggedOut: 'logged-out',\r\n};\r\n\r\nexport const LoginActions = {\r\n  Login: 'login',\r\n  LoginCallback: 'login-callback',\r\n  LoginFailed: 'login-failed',\r\n  Profile: 'profile',\r\n  Register: 'register',\r\n};\r\n\r\nexport const AuthenticationResultStatus = {\r\n  Redirect: 'redirect',\r\n  Success: 'success',\r\n  Fail: 'fail',\r\n  UserNotFound: 'user_not_found',\r\n};\r\n\r\nexport interface ReturnStatus {\r\n  status: string;\r\n  message?: string;\r\n  state?: { returnUrl: string };\r\n  redirectUrl?: string;\r\n  retryAvailable?: boolean;\r\n}\r\n\r\nexport class AuthorizeService {\r\n  private callbacks: Array<{\r\n    callback: () => Promise<void>;\r\n    subscription: number;\r\n  }> = [];\r\n  private nextSubscriptionId = 0;\r\n  private user: User | null | undefined = null;\r\n  private userManager: UserManager | undefined;\r\n  private oidcClient: OidcClient | undefined;\r\n  private authConfig: any;\r\n\r\n  constructor() {\r\n    this.onStorageEvent = this.onStorageEvent.bind(this);\r\n  }\r\n\r\n  public setConfig(\r\n    clientB2CSettings: B2CSettings,\r\n    loginCallback: string,\r\n    logOutCallback: string,\r\n    passwordChangeCallback: string,\r\n  ): void {\r\n    this.authConfig = {\r\n      client_id: clientB2CSettings.ClientId,\r\n      authority: clientB2CSettings.Authority,\r\n      passwordchange_authority: clientB2CSettings.PasswordChangeAuthority,\r\n      redirect_uri: `${clientB2CSettings.ClientUri}${loginCallback}`,\r\n      post_logout_redirect_uri: `${clientB2CSettings.ClientUri}${logOutCallback}`,\r\n      password_change_redirect_uri: `${clientB2CSettings.ClientUri}${passwordChangeCallback}`,\r\n      response_type: 'code',\r\n      scope: clientB2CSettings.Scope,\r\n      extraQueryParams: { portal: true, idps: 'web' },\r\n      ui_locales: 'sv',\r\n      requireAuthenticationAfter: clientB2CSettings.RequireAuthenticationAfter,\r\n    };\r\n\r\n    this.userManager = undefined;\r\n    this.oidcClient = undefined;\r\n  }\r\n\r\n  /**\r\n   * Check if authenticated and has a not expired.\r\n   */\r\n  public async isAuthenticated(): Promise<boolean> {\r\n    const user = await this.getUser();\r\n    return !!user && !user.expired;\r\n  }\r\n\r\n  /**\r\n   * Get user.\r\n   */\r\n  public async getUser(): Promise<User | null | undefined> {\r\n    if (this.user) {\r\n      return this.user;\r\n    }\r\n\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (this.userManager) {\r\n      const user = await this.userManager.getUser();\r\n      this.user = user;\r\n      return user;\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get user profile.\r\n   */\r\n  public async getUserProfile(): Promise<UserProfile | null | undefined> {\r\n    if (this.user && this.user.profile) {\r\n      return this.user.profile;\r\n    }\r\n\r\n    const user = await this.getUser();\r\n\r\n    return user && user.profile;\r\n  }\r\n\r\n  /**\r\n   * Get access token. Will be null/undefined if expired.\r\n   * Will not fallback to userManager.\r\n   */\r\n  public getAccessTokenSync(): string | null | undefined {\r\n    return this.user && !this.user.expired ? this.user.access_token : undefined;\r\n  }\r\n\r\n  /**\r\n   * Get user. Will be null/undefined if expired.\r\n   * Will not fallback to userManager.\r\n   */\r\n  public getUserSync(): User | null | undefined {\r\n    return this.user && !this.user.expired ? this.user : undefined;\r\n  }\r\n\r\n  /**\r\n   * Get access token. Will be null/undefined if expired.\r\n   * Will fallback to userManager if cached user is not valid.\r\n   */\r\n  public async getAccessToken(): Promise<string | null | undefined> {\r\n    if (this.user && !this.user.expired) {\r\n      return this.user.access_token;\r\n    }\r\n\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (this.userManager) {\r\n      const user = await this.userManager.getUser();\r\n      return user && !user.expired ? user.access_token : undefined;\r\n    } else {\r\n      return undefined;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * We check to see if we can authenticate the user silently This happens\r\n   * when the user has an refresh token and the time since authentication is not longer than the configured maximum.\r\n   */\r\n  public async canAttemptSilentSignin(): Promise<boolean> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (!this.userManager) {\r\n      return false;\r\n    }\r\n\r\n    const user = await this.getUserProfile();\r\n\r\n    return user &&\r\n      user.auth_time &&\r\n      user.auth_time >\r\n        Date.now() / 1000 - this.authConfig.requireAuthenticationAfter\r\n      ? true\r\n      : false;\r\n  }\r\n\r\n  /**\r\n   * 1) We try to see if we can authenticate the user silently. This happens\r\n   *    when the user has an refresh token and the time since authentication is not longer than the configured maximum.\r\n   */\r\n  public async signinSilent(): Promise<ReturnStatus> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (!this.userManager) {\r\n      return this.error('SignIn error: UserManager not initialized.');\r\n    }\r\n\r\n    try {\r\n      const silentUser = await this.userManager.signinSilent(\r\n        this.createArguments(LoginMode.Silent),\r\n      );\r\n      await this.updateState(silentUser);\r\n      return this.success(undefined);\r\n    } catch (silentError: any) {\r\n      return this.error(silentError);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * 1) We try to authenticate the user using a PopUp Window. This might fail if there is a\r\n   *    Pop-Up blocker or the user has disabled PopUps.\r\n   * 2) If the two methods above fail, we redirect the browser to the IdP to perform a traditional\r\n   *    redirect flow.\r\n   *\r\n   * @param state\r\n   * @param usePopup Attempt popup auth or not.\r\n   */\r\n  public async signIn(\r\n    state: { returnUrl: string; domainHint?: string },\r\n    usePopup?: boolean,\r\n  ): Promise<ReturnStatus> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (!this.userManager) {\r\n      return this.error('SignIn error: UserManager not initialized.');\r\n    }\r\n\r\n    if (!this.oidcClient) {\r\n      return this.error('SignIn error: OidcClient not initialized.');\r\n    }\r\n\r\n    try {\r\n      if (!usePopup) {\r\n        throw new Error('usePopup is false.');\r\n      }\r\n\r\n      const popUpUser = await this.userManager.signinPopup(\r\n        this.createArguments(LoginMode.PopUp),\r\n      );\r\n      await this.updateState(popUpUser);\r\n      return this.success(state);\r\n    } catch (popUpError: any) {\r\n      if (popUpError.message === 'Popup window closed') {\r\n        // The user explicitly cancelled the login action by closing an opened popup.\r\n        return this.error('The user closed the window.');\r\n      } else if (usePopup) {\r\n        // eslint-disable-next-line no-console\r\n        console.log('Popup authentication error: ', popUpError);\r\n      }\r\n\r\n      // usePopup might be false or PopUps might be blocked by the user, fallback to redirect\r\n      try {\r\n        const signInRequest = await this.oidcClient.createSigninRequest(\r\n          this.createArguments(LoginMode.Redirect, state),\r\n        );\r\n\r\n        return this.redirect(\r\n          signInRequest.url +\r\n            (state.domainHint ? '&domain_hint=' + state.domainHint : ''),\r\n          state.returnUrl,\r\n        );\r\n      } catch (redirectError: any) {\r\n        return this.error(redirectError);\r\n      }\r\n    }\r\n  }\r\n\r\n  public async changePassword(state: {\r\n    returnUrl: string;\r\n  }): Promise<ReturnStatus> {\r\n    // Uses local UserManager to not interfere with global auth UserManager\r\n    const oidcClient = this.createOidcClient(\r\n      this.authConfig.passwordchange_authority,\r\n      this.authConfig.password_change_redirect_uri,\r\n    );\r\n    if (!oidcClient) {\r\n      return this.error('Password change error: OidcClient not initialized.');\r\n    }\r\n\r\n    try {\r\n      const signInRequest = await oidcClient.createSigninRequest(\r\n        this.createArguments(LoginMode.Redirect, state),\r\n      );\r\n      return this.redirect(signInRequest.url);\r\n    } catch (redirectError: any) {\r\n      return this.error(redirectError);\r\n    }\r\n  }\r\n\r\n  public async completePasswordChange(\r\n    url: string | undefined,\r\n  ): Promise<ReturnStatus> {\r\n    // Uses local UserManager to not interfere with global auth UserManager\r\n    const userManager = this.createUserManager(\r\n      this.authConfig.passwordchange_authority,\r\n      this.authConfig.password_change_redirect_uri,\r\n    );\r\n    if (!userManager) {\r\n      return this.error(\r\n        'Callback authentication error: UserManager not initialized.',\r\n      );\r\n    }\r\n\r\n    try {\r\n      const user = await userManager.signinRedirectCallback(url);\r\n      return this.success((user.state as any).userState);\r\n    } catch (error: any) {\r\n      return this.error(error);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * We are receiving a callback from the IdP. This code can be running in 2 situations:\r\n   * 1) As a PopUp window started by a pop-up login on signIn (above). The code in the main\r\n   *    browser window will close the pop-up window after returning from signInPopUp\r\n   * 2) On the main browser window when the IdP redirects back to the app. We will process\r\n   *    the response and redirect to the return url or display an error message.\r\n   * @param url\r\n   */\r\n  public async completeSignIn(url: string): Promise<ReturnStatus> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n\r\n    if (!this.userManager) {\r\n      return this.error(\r\n        'Callback authentication error: UserManager not initialized.',\r\n      );\r\n    }\r\n\r\n    try {\r\n      const response = await this.getSignInResponse(url);\r\n\r\n      switch ((response?.state.data as any).mode) {\r\n        case LoginMode.PopUp:\r\n          await this.userManager.signinPopupCallback(url);\r\n          return this.success(undefined);\r\n        case LoginMode.Redirect: {\r\n          const user = await this.userManager.signinRedirectCallback(url);\r\n          await this.updateState(user);\r\n          return this.success((user.state as any).userState);\r\n        }\r\n        default:\r\n          throw new Error(\r\n            `Invalid login mode '${(response?.state.data as any).mode}'.`,\r\n          );\r\n      }\r\n    } catch (processSignInResponseError: any) {\r\n      if (processSignInResponseError.error === 'login_required') {\r\n        // This error is thrown by the underlying oidc client when it tries to log in\r\n        // the user silently as in case 1 defined above and the IdP requires the user\r\n        // to enter credentials. We let the user manager handle the response to notify\r\n        // the main window.\r\n        throw new Error(processSignInResponseError);\r\n      } else {\r\n        if (this.isUserNotFoundError(processSignInResponseError)) {\r\n          return this.error(\r\n            'The user does not exist.',\r\n            false,\r\n            AuthenticationResultStatus.UserNotFound,\r\n          );\r\n        }\r\n\r\n        // When message is not the message for password reset completed.\r\n        if (\r\n          processSignInResponseError.message !==\r\n          'authority mismatch on settings vs. signin state'\r\n        ) {\r\n          telemetryService.trackException(processSignInResponseError);\r\n        }\r\n\r\n        if (\r\n          processSignInResponseError.message ===\r\n          'No matching state found in storage'\r\n        ) {\r\n          try {\r\n            const stateKeys =\r\n              await this.userManager.settings.stateStore.getAllKeys();\r\n            const states: string[] = [];\r\n            for (const key of stateKeys) {\r\n              if (key.startsWith('user')) {\r\n                continue;\r\n              }\r\n              const stateString =\r\n                await this.userManager.settings.stateStore.get(key);\r\n\r\n              const state = JSON.parse(stateString!);\r\n              states.push(\r\n                `Key: ${key}. Created: ${state.created}. Mode: ${state.data.mode}.`,\r\n              );\r\n            }\r\n\r\n            telemetryService.trackTrace(\r\n              'Auth States in storage: ' + states.join(', '),\r\n            );\r\n\r\n            // eslint-disable-next-line no-empty\r\n          } catch {}\r\n\r\n          await this.userManager?.clearStaleState();\r\n          return this.error(\r\n            'There was an error processing the sign-in response.',\r\n            true,\r\n          );\r\n        }\r\n\r\n        return this.error(\r\n          'There was an error processing the sign-in response.',\r\n        );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Redirect the browser to the IdP to perform a traditional post logout redirect flow.\r\n   */\r\n  public async signOut(\r\n    state: { returnUrl: string } | undefined,\r\n  ): Promise<ReturnStatus> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    try {\r\n      if (this.oidcClient) {\r\n        const signOutRequest = await this.oidcClient.createSignoutRequest(\r\n          this.createArguments(LoginMode.Redirect, state),\r\n        );\r\n        return this.redirect(signOutRequest.url);\r\n      } else {\r\n        return this.error('Signout error: UserManager not initialized.');\r\n      }\r\n    } catch (redirectSignOutError: any) {\r\n      return this.error(redirectSignOutError);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * On the main browser window when the IdP redirects back to the app. We will process\r\n   * the response and redirect to the logged-out url or display an error message.\r\n   */\r\n  public async completeSignOut(url?: string): Promise<ReturnStatus> {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n\r\n    try {\r\n      const response = await this.userManager!.signoutRedirectCallback(url);\r\n\r\n      if (response.error) {\r\n        return this.error(`${response.error}: ${response.error_description}`);\r\n      }\r\n\r\n      await this.updateState(null);\r\n      await this.clearAllStorage();\r\n      return this.success(\r\n        response.state ? { returnUrl: response.state } : undefined,\r\n      );\r\n    } catch (processSignOutResponseError: any) {\r\n      return this.error(\r\n        `${processSignOutResponseError.error}: ${processSignOutResponseError.error_description}`,\r\n      );\r\n    }\r\n  }\r\n\r\n  public subscribe(callback: () => Promise<void>): number {\r\n    this.callbacks.push({ callback, subscription: this.nextSubscriptionId++ });\r\n    return this.nextSubscriptionId - 1;\r\n  }\r\n\r\n  public unsubscribe(subscriptionId: number): void {\r\n    const subscriptionIndex = this.callbacks\r\n      .map((element, index) =>\r\n        element.subscription === subscriptionId\r\n          ? { found: true, index }\r\n          : { found: false },\r\n      )\r\n      .filter((element) => element.found === true);\r\n    if (subscriptionIndex.length !== 1 || !subscriptionIndex[0].index) {\r\n      throw new Error(\r\n        `Found an invalid number of subscriptions ${subscriptionIndex.length}`,\r\n      );\r\n    }\r\n\r\n    this.callbacks = this.callbacks.splice(subscriptionIndex[0].index, 1);\r\n  }\r\n\r\n  private async clearAllStorage() {\r\n    await this.oidcClientAndUserManagerInitalized();\r\n    if (this.userManager) {\r\n      const store = this.userManager.settings.stateStore;\r\n      const keys = await store.getAllKeys();\r\n\r\n      await Promise.all(\r\n        keys.map(async (key: string) => {\r\n          await store.remove(key);\r\n        }),\r\n      );\r\n    }\r\n  }\r\n\r\n  private async updateState(user: User | null | undefined) {\r\n    this.user = user;\r\n    await this.notifySubscribers();\r\n  }\r\n\r\n  private async notifySubscribers() {\r\n    for (const callback of this.callbacks) {\r\n      await callback.callback();\r\n    }\r\n  }\r\n\r\n  private async getSignInResponse(url: string) {\r\n    return await this.oidcClient?.readSigninResponseState(url);\r\n  }\r\n\r\n  private createArguments(\r\n    mode: string,\r\n    state?: { returnUrl: string },\r\n  ): CreateSigninRequestArgs | CreateSignoutRequestArgs {\r\n    if (mode !== LoginMode.Silent) {\r\n      return { state: { mode, userState: state } };\r\n    } else {\r\n      return {\r\n        state: { mode, userState: state },\r\n        redirect_uri: this.userManager\r\n          ? this.userManager.settings.redirect_uri\r\n          : undefined,\r\n      };\r\n    }\r\n  }\r\n\r\n  private error(\r\n    message: string,\r\n    retryAvailable?: boolean,\r\n    status?: string,\r\n  ): ReturnStatus {\r\n    return {\r\n      status: status || AuthenticationResultStatus.Fail,\r\n      message,\r\n      retryAvailable,\r\n    };\r\n  }\r\n\r\n  private success(state: { returnUrl: string } | undefined): ReturnStatus {\r\n    return { status: AuthenticationResultStatus.Success, state };\r\n  }\r\n\r\n  private redirect(redirectUrl: string, returnTo = ''): ReturnStatus {\r\n    return {\r\n      status: AuthenticationResultStatus.Redirect,\r\n      redirectUrl,\r\n      state: { returnUrl: returnTo },\r\n    };\r\n  }\r\n\r\n  private createUserManager(\r\n    authority: string,\r\n    redirect_uri: string,\r\n  ): UserManager {\r\n    if (!authority || !redirect_uri) {\r\n      throw new Error(`Error: Invalid authority or redirect uri`);\r\n    }\r\n\r\n    const settings: UserManagerSettings = {\r\n      client_id: this.authConfig.client_id,\r\n      authority: authority,\r\n      redirect_uri: redirect_uri,\r\n      post_logout_redirect_uri: this.authConfig.post_logout_redirect_uri,\r\n      response_type: this.authConfig.response_type,\r\n      scope: this.authConfig.scope,\r\n      loadUserInfo: false,\r\n      automaticSilentRenew: true,\r\n      includeIdTokenInSilentRenew: true,\r\n      userStore: new WebStorageStateStore({}),\r\n      extraQueryParams: this.authConfig.extraQueryParams,\r\n      ui_locales: this.authConfig.ui_locales,\r\n      monitorSession: false,\r\n      response_mode: 'fragment',\r\n    };\r\n\r\n    return new UserManager(settings);\r\n  }\r\n\r\n  private createOidcClient(\r\n    authority: string,\r\n    redirect_uri: string,\r\n  ): OidcClient {\r\n    if (!authority || !redirect_uri) {\r\n      throw new Error(`Error: Invalid authority or redirect uri`);\r\n    }\r\n\r\n    const settings: OidcClientSettings = {\r\n      client_id: this.authConfig.client_id,\r\n      authority: authority,\r\n      redirect_uri: redirect_uri,\r\n      post_logout_redirect_uri: this.authConfig.post_logout_redirect_uri,\r\n      response_type: this.authConfig.response_type,\r\n      scope: this.authConfig.scope,\r\n      loadUserInfo: false,\r\n      extraQueryParams: this.authConfig.extraQueryParams,\r\n      ui_locales: this.authConfig.ui_locales,\r\n      response_mode: 'fragment',\r\n    };\r\n\r\n    return new OidcClient(settings);\r\n  }\r\n\r\n  private async oidcClientAndUserManagerInitalized() {\r\n    if (this.userManager !== undefined && this.oidcClient !== undefined) {\r\n      return;\r\n    }\r\n\r\n    this.userManager = this.createUserManager(\r\n      this.authConfig.authority,\r\n      this.authConfig.redirect_uri,\r\n    );\r\n\r\n    this.oidcClient = this.createOidcClient(\r\n      this.authConfig.authority,\r\n      this.authConfig.redirect_uri,\r\n    );\r\n\r\n    this.userManager.events.addUserSignedOut(async () => {\r\n      if (this.userManager) {\r\n        await this.userManager.removeUser();\r\n      }\r\n      await this.updateState(undefined);\r\n    });\r\n\r\n    // Update the \"cached\" user when a updated user is loaded.\r\n    // Will trigger after a silent renew.\r\n    this.userManager.events.addUserLoaded((user: User) => {\r\n      this.updateState(user);\r\n    });\r\n\r\n    // Listen for silent renew error. This will happen if the refresh token has expired.\r\n    // Attempt to sign in using popup and if that fails, use redirect.\r\n    this.userManager.events.addSilentRenewError(async () => {\r\n      const response = await this.signIn(\r\n        { returnUrl: window.location.href },\r\n        true,\r\n      );\r\n\r\n      if (\r\n        response.status === AuthenticationResultStatus.Redirect &&\r\n        response.redirectUrl\r\n      ) {\r\n        window.location.replace(response.redirectUrl);\r\n      } else if (response.status === AuthenticationResultStatus.Fail) {\r\n        window.location.replace(window.location.origin);\r\n      }\r\n    });\r\n  }\r\n\r\n  private isUserNotFoundError(error: any): boolean {\r\n    return (\r\n      error.error_description &&\r\n      error.error_description.indexOf(ADB2CErrorCodes.UserNotFound) > -1\r\n    );\r\n  }\r\n\r\n  public enableStorageEventListener() {\r\n    window.addEventListener('storage', this.onStorageEvent);\r\n  }\r\n\r\n  public disableStorageEventListener() {\r\n    window.removeEventListener('storage', this.onStorageEvent);\r\n  }\r\n\r\n  private onStorageEvent(event: StorageEvent) {\r\n    const OIDCUserStorageKeyPrefix = 'oidc.user';\r\n\r\n    if (\r\n      event.key?.startsWith(OIDCUserStorageKeyPrefix) &&\r\n      this.OIDCSessionChanged(event)\r\n    ) {\r\n      window.location.href = '/';\r\n    }\r\n  }\r\n\r\n  private OIDCSessionChanged(event: StorageEvent) {\r\n    return (\r\n      (event.newValue == null && event.oldValue != null) ||\r\n      this.isNewOIDCUser(event)\r\n    );\r\n  }\r\n\r\n  private isNewOIDCUser(event: StorageEvent): boolean {\r\n    const oldProfile = this.tryParseProfile(event.oldValue);\r\n    const newProfile = this.tryParseProfile(event.newValue);\r\n\r\n    return Boolean(\r\n      newProfile?.sub !== oldProfile?.sub ||\r\n        (newProfile?.customer_no &&\r\n          newProfile.customer_no !== oldProfile?.customer_no),\r\n    );\r\n  }\r\n\r\n  private tryParseProfile(oidcUser: string | null): UserProfile | null {\r\n    try {\r\n      return JSON.parse(oidcUser!).profile;\r\n    } catch (error) {\r\n      return null;\r\n    }\r\n  }\r\n}\r\n","import {\r\n  AuthorizeService,\r\n  LoginActions,\r\n  LogoutActions,\r\n} from '@common/services/AuthService';\r\n\r\nconst authPrefix = '/authentication';\r\nconst passwordChange = '/password-change';\r\n\r\nexport const ApplicationPaths = {\r\n  DefaultLoginRedirectPath: '/',\r\n  ApiAuthorizationauthPrefix: authPrefix,\r\n  Login: `${authPrefix}/${LoginActions.Login}`,\r\n  LoginFailed: `${authPrefix}/${LoginActions.LoginFailed}`,\r\n  LoginCallback: `${authPrefix}/${LoginActions.LoginCallback}`,\r\n  Register: `${authPrefix}/${LoginActions.Register}`,\r\n  Profile: `${authPrefix}/${LoginActions.Profile}`,\r\n  LogOut: `${authPrefix}/${LogoutActions.Logout}`,\r\n  LoggedOut: `${authPrefix}/${LogoutActions.LoggedOut}`,\r\n  LogOutCallback: `${authPrefix}/${LogoutActions.LogoutCallback}`,\r\n  PasswordChangeCallback: passwordChange,\r\n};\r\n\r\nconst authService = new AuthorizeService();\r\n\r\nexport default authService;\r\n","export const StorageTypes = Object.freeze({\r\n  LOCAL: 0,\r\n  SESSION: 1,\r\n});\r\n","export function poll<T>(\r\n  originalPromise: () => Promise<T>,\r\n  config: {\r\n    intervalInMs: number;\r\n    maxTimes?: number;\r\n  },\r\n  pollCondition?: (response: T) => {\r\n    continuePolling: boolean;\r\n    newIntervalInMs?: number;\r\n  },\r\n  pollingTimes: number = 0,\r\n): Promise<T> {\r\n  return originalPromise()\r\n    .then((response) => {\r\n      const pollConditionResult = pollCondition\r\n        ? pollCondition(response)\r\n        : undefined;\r\n      if (\r\n        pollConditionResult === undefined ||\r\n        pollConditionResult.continuePolling\r\n      ) {\r\n        if (\r\n          config.maxTimes !== undefined &&\r\n          pollingTimes !== undefined &&\r\n          pollingTimes >= config.maxTimes\r\n        ) {\r\n          return Promise.reject('Max polling timeout');\r\n        }\r\n\r\n        const interval =\r\n          pollConditionResult?.newIntervalInMs ?? config.intervalInMs;\r\n\r\n        return new Promise<T>((resolve, reject) => {\r\n          setTimeout(\r\n            () =>\r\n              poll(\r\n                originalPromise,\r\n                config,\r\n                pollCondition,\r\n                pollingTimes ? pollingTimes + 1 : 1,\r\n              )\r\n                .then(resolve)\r\n                .catch(reject),\r\n            interval,\r\n          );\r\n        });\r\n      } else {\r\n        return response;\r\n      }\r\n    })\r\n    .catch((error) => {\r\n      return Promise.reject(error);\r\n    });\r\n}\r\n","import Axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios';\r\nimport authService from './AuthService';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport type { AxiosRequestConfigExtended } from '@/models/axios/types';\r\nimport { poll } from '@/utils/Polling';\r\n\r\nexport abstract class BaseServiceDefinition {\r\n  private PollingIntervalHeader = 'x-polling-interval';\r\n\r\n  private get apiBaseUrl(): string {\r\n    return import.meta.env.VITE_API_BASE_URL;\r\n  }\r\n\r\n  private axiosInstance: AxiosInstance;\r\n\r\n  constructor(\r\n    apiBaseUrl: string | undefined = undefined,\r\n    basePath: string | undefined = undefined,\r\n  ) {\r\n    const baseUrl = apiBaseUrl ?? this.apiBaseUrl;\r\n\r\n    this.axiosInstance = Axios.create({\r\n      headers: {\r\n        Pragma: 'no-cache',\r\n        'Cache-Control': 'no-cache',\r\n      },\r\n      withCredentials: true,\r\n      baseURL: baseUrl + (basePath ?? ''),\r\n    });\r\n\r\n    this.axiosInstance.interceptors.request.use(async (config) => {\r\n      if (!config.headers) {\r\n        return config;\r\n      }\r\n\r\n      const accessToken = await authService.getAccessToken();\r\n      if (accessToken) {\r\n        config.headers['Authorization'] = 'Bearer ' + accessToken;\r\n      }\r\n\r\n      const memberProfileStore = useMemberProfileStore();\r\n      if (\r\n        !(config as AxiosRequestConfigExtended).excludeProxyUserHeader &&\r\n        memberProfileStore.shouldUseProxy()\r\n      ) {\r\n        config.headers['X-User-Id'] = memberProfileStore.getProxyUserId();\r\n      }\r\n\r\n      return config;\r\n    });\r\n  }\r\n\r\n  protected get(\r\n    url: string,\r\n    config?: AxiosRequestConfigExtended,\r\n  ): Promise<any> {\r\n    return this.axiosInstance.get(url, {\r\n      paramsSerializer: {\r\n        indexes: null,\r\n      },\r\n      ...config,\r\n    });\r\n  }\r\n\r\n  protected post(\r\n    url: string,\r\n    data?: any,\r\n    config?: AxiosRequestConfigExtended,\r\n  ): Promise<any> {\r\n    return this.axiosInstance.post(url, data, { ...config });\r\n  }\r\n\r\n  protected patch(url: string, data?: any): Promise<any> {\r\n    return this.axiosInstance.patch(url, data);\r\n  }\r\n\r\n  protected put(\r\n    url: string,\r\n    data: any,\r\n    config?: AxiosRequestConfigExtended,\r\n  ): Promise<any> {\r\n    return this.axiosInstance.put(url, data, { ...config });\r\n  }\r\n\r\n  protected delete(url: string, params?: any): Promise<any> {\r\n    return this.axiosInstance.delete(url, {\r\n      params,\r\n      paramsSerializer: {\r\n        indexes: null,\r\n      },\r\n    });\r\n  }\r\n\r\n  protected sleep(ms: number): Promise<void> {\r\n    return new Promise((resolve) => setTimeout(resolve, ms));\r\n  }\r\n\r\n  protected downloadFile(\r\n    url: string,\r\n    filename: string,\r\n    options?: {\r\n      polling?: boolean;\r\n      verifyPdf?: boolean;\r\n    },\r\n  ): Promise<void> {\r\n    const config: AxiosRequestConfig = {\r\n      responseType: 'blob',\r\n    };\r\n    const getPromise = options?.polling\r\n      ? poll(\r\n          () => this.axiosInstance.get(url, config),\r\n          { intervalInMs: 5000 }, // just a default, will be overriden by newIntervalInMs below\r\n          (response) => {\r\n            if (response.status === 202) {\r\n              const pollingInterval = Number(\r\n                response.headers[this.PollingIntervalHeader],\r\n              );\r\n\r\n              if (isNaN(pollingInterval)) {\r\n                throw `Unreadable polling interval header: ${response.headers[this.PollingIntervalHeader]}`;\r\n              }\r\n\r\n              return {\r\n                continuePolling: true,\r\n                newIntervalInMs: pollingInterval * 1000,\r\n              };\r\n            } else {\r\n              return { continuePolling: false };\r\n            }\r\n          },\r\n        )\r\n      : this.axiosInstance.get(url, config);\r\n\r\n    return getPromise.then((response) => {\r\n      if (options?.verifyPdf && response.data.type !== 'application/pdf') {\r\n        return Promise.reject('MIME Type Mismatch');\r\n      }\r\n\r\n      const blob = new Blob([response.data], { type: 'application/pdf' });\r\n\r\n      const blobURL =\r\n        window.URL && window.URL.createObjectURL\r\n          ? window.URL.createObjectURL(blob)\r\n          : window.webkitURL.createObjectURL(blob);\r\n\r\n      const tempLink = document.createElement('a');\r\n      tempLink.style.display = 'none';\r\n      tempLink.href = blobURL;\r\n      tempLink.setAttribute('download', filename);\r\n\r\n      // Safari thinks _blank anchor are pop ups. We only want to set _blank\r\n      // target if the browser does not support the HTML5 download attribute.\r\n      // This allows you to download files in desktop safari if pop up blocking\r\n      // is enabled.\r\n      if (typeof tempLink.download === 'undefined') {\r\n        tempLink.setAttribute('target', '_blank');\r\n      }\r\n\r\n      document.body.appendChild(tempLink);\r\n      tempLink.click();\r\n\r\n      // Fixes \"webkit blob resource error 1\"\r\n      window.setTimeout(() => {\r\n        document.body.removeChild(tempLink);\r\n        window.URL.revokeObjectURL(blobURL);\r\n      }, 200);\r\n    });\r\n  }\r\n\r\n  protected async getBlobImage(url: string): Promise<Blob> {\r\n    return (await this.axiosInstance.get(url, { responseType: 'blob' })).data;\r\n  }\r\n\r\n  protected openBlob(blob: Blob, fileName: string): void {\r\n    const blobUrl =\r\n      window.URL && window.URL.createObjectURL\r\n        ? window.URL.createObjectURL(blob)\r\n        : window.webkitURL.createObjectURL(blob);\r\n\r\n    const tempLink = document.createElement('a');\r\n    tempLink.style.display = 'none';\r\n    tempLink.href = blobUrl;\r\n    tempLink.setAttribute('download', fileName);\r\n\r\n    if (typeof tempLink.download === 'undefined') {\r\n      tempLink.setAttribute('target', '_blank');\r\n    }\r\n\r\n    document.body.appendChild(tempLink);\r\n    tempLink.click();\r\n\r\n    window.setTimeout(() => {\r\n      document.body.removeChild(tempLink);\r\n      window.URL.revokeObjectURL(blobUrl);\r\n    }, 200);\r\n  }\r\n}\r\n","import { BaseServiceDefinition } from './BaseService';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport type { MarketingProductsPreferences } from '@/models/memberProfile/MarketingProductsPreferences';\r\nimport type { UpdateContactDetails } from '@/models/memberProfile/UpdateContactDetails';\r\nimport type { EconomicChoices } from '@/models/memberProfile/EconomicChoices';\r\nimport type { Address } from '@/models/memberProfile/Address';\r\nimport type { AxiosRequestConfigExtended } from '@/models/axios/types';\r\n\r\nclass MemberProfilesService extends BaseServiceDefinition {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  public async getMeMemberProfile(): Promise<MemberProfile> {\r\n    try {\r\n      const response = await this.get('/api/v2/memberProfiles/me', {\r\n        excludeProxyUserHeader: true,\r\n      } as AxiosRequestConfigExtended);\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async getMemberProfile(): Promise<MemberProfile> {\r\n    try {\r\n      const response = await this.get('/api/v2/memberProfiles/current');\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async updateMemberEconomics(\r\n    updatedEconomics: EconomicChoices,\r\n  ): Promise<MemberProfile> {\r\n    try {\r\n      const response = await this.put(\r\n        '/api/v1/memberProfiles/current/economics',\r\n        updatedEconomics,\r\n      );\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async updateMemberProfilePreferences(\r\n    updatePreferences: MarketingProductsPreferences,\r\n  ): Promise<MemberProfile> {\r\n    try {\r\n      const response = await this.put(\r\n        '/api/v1/memberProfiles/current/preferences',\r\n        updatePreferences,\r\n      );\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async updateMemberProfileContactDetails(\r\n    contactDetails: UpdateContactDetails,\r\n  ): Promise<MemberProfile> {\r\n    try {\r\n      const response = await this.put(\r\n        '/api/v1/memberProfiles/current/contactDetails',\r\n        contactDetails,\r\n      );\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async updateMemberProfileContactAddress(\r\n    address: Address,\r\n  ): Promise<void> {\r\n    try {\r\n      const response = await this.put(\r\n        '/api/v1/memberProfiles/current/address',\r\n        address,\r\n      );\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n\r\n  public async downloadCertificateDocument(): Promise<void> {\r\n    const certificateDocument = await this.post(\r\n      `/api/v1/memberProfiles/certificate`,\r\n      null,\r\n      {\r\n        responseType: 'blob',\r\n      },\r\n    );\r\n\r\n    const fileName = certificateDocument.headers['x-filename'];\r\n    const blob = new Blob([certificateDocument.data], {\r\n      type: certificateDocument.headers['content-type'],\r\n    });\r\n\r\n    this.openBlob(blob, fileName);\r\n  }\r\n}\r\n\r\nconst memberProfilesService: MemberProfilesService =\r\n  new MemberProfilesService();\r\n\r\nexport default memberProfilesService;\r\n","import { StorageTypes } from '../enums/StorageTypes';\r\n\r\nexport default class StorageService {\r\n  private defaultPrefix: string;\r\n\r\n  private isLocalStorageAvailable = true;\r\n  private isSessionStorageAvailable = true;\r\n\r\n  constructor(defaultPrefix: string) {\r\n    this.defaultPrefix = defaultPrefix;\r\n    const test = 'test';\r\n    try {\r\n      window.localStorage.setItem(test, test);\r\n      window.localStorage.removeItem(test);\r\n    } catch (e) {\r\n      this.isLocalStorageAvailable = false;\r\n    }\r\n\r\n    try {\r\n      window.sessionStorage.setItem(test, test);\r\n      window.sessionStorage.removeItem(test);\r\n    } catch (e) {\r\n      this.isSessionStorageAvailable = false;\r\n    }\r\n  }\r\n\r\n  public get<Type>(\r\n    storageType: number,\r\n    key: string,\r\n    json: boolean,\r\n    prefix?: string,\r\n  ): Type | null | undefined | string {\r\n    if (\r\n      (storageType === StorageTypes.LOCAL && !this.isLocalStorageAvailable) ||\r\n      (storageType === StorageTypes.SESSION && !this.isSessionStorageAvailable)\r\n    ) {\r\n      return undefined;\r\n    }\r\n\r\n    const finalPrefix = prefix ? prefix : this.defaultPrefix;\r\n    const finalKey = finalPrefix + key;\r\n\r\n    const rawValue =\r\n      storageType === StorageTypes.LOCAL\r\n        ? window.localStorage.getItem(finalKey)\r\n        : window.sessionStorage.getItem(finalKey);\r\n\r\n    if (rawValue === undefined || rawValue === null) {\r\n      return null;\r\n    }\r\n\r\n    if (!json) {\r\n      return rawValue;\r\n    }\r\n\r\n    try {\r\n      return JSON.parse(rawValue) as Type;\r\n    } catch {\r\n      storageType === StorageTypes.LOCAL\r\n        ? window.localStorage.removeItem(finalKey)\r\n        : window.sessionStorage.removeItem(finalKey);\r\n      return null;\r\n    }\r\n  }\r\n\r\n  public set<Type>(\r\n    storageType: number,\r\n    key: string,\r\n    value: Type | null | undefined | string,\r\n    json: boolean,\r\n    prefix?: string,\r\n  ): void {\r\n    if (\r\n      (storageType === StorageTypes.LOCAL && !this.isLocalStorageAvailable) ||\r\n      (storageType === StorageTypes.SESSION && !this.isSessionStorageAvailable)\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const finalPrefix = prefix ? prefix : this.defaultPrefix;\r\n    const finalKey = finalPrefix + key;\r\n\r\n    const finalValue = json ? JSON.stringify(value) : (value as string);\r\n\r\n    storageType === StorageTypes.LOCAL\r\n      ? window.localStorage.setItem(finalKey, finalValue)\r\n      : window.sessionStorage.setItem(finalKey, finalValue);\r\n  }\r\n\r\n  public remove(storageType: number, key: string, prefix?: string): void {\r\n    if (\r\n      (storageType === StorageTypes.LOCAL && !this.isLocalStorageAvailable) ||\r\n      (storageType === StorageTypes.SESSION && !this.isSessionStorageAvailable)\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    const finalPrefix = prefix ? prefix : this.defaultPrefix;\r\n    const finalKey = finalPrefix + key;\r\n\r\n    storageType === StorageTypes.LOCAL\r\n      ? window.localStorage.removeItem(finalKey)\r\n      : window.sessionStorage.removeItem(finalKey);\r\n  }\r\n\r\n  public clear(storageType: number): void {\r\n    if (\r\n      (storageType === StorageTypes.LOCAL && !this.isLocalStorageAvailable) ||\r\n      (storageType === StorageTypes.SESSION && !this.isSessionStorageAvailable)\r\n    ) {\r\n      return;\r\n    }\r\n\r\n    storageType === StorageTypes.LOCAL\r\n      ? window.localStorage.clear()\r\n      : window.sessionStorage.clear();\r\n  }\r\n}\r\n","import StorageService from '@common/services/StorageService';\r\n\r\nconst storageService = new StorageService('memberportal_');\r\n\r\nexport default storageService;\r\n","import {\r\n  AuthenticationResultStatus,\r\n  QueryParameterNames,\r\n  type ReturnStatus,\r\n} from '@/common/services/AuthService';\r\nimport type { LoginRedirection } from '@/models/LoginRedirection';\r\nimport authService from '@/services/AuthService';\r\nimport { Config } from '@/utils/Config';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { UserProfile } from 'oidc-client-ts';\r\nimport { defineStore } from 'pinia';\r\nimport { reactive, toRefs } from 'vue';\r\nimport { removeProxyUserFromSessionStorage } from './memberProfileStore';\r\n\r\ninterface State {\r\n  isInitialized: boolean;\r\n  isAuthenticated: boolean;\r\n  profile: UserProfile | null | undefined;\r\n}\r\n\r\nexport const authStoreId = 'auth';\r\n\r\nexport const useAuthStore = defineStore(authStoreId, () => {\r\n  const state: State = reactive({\r\n    isInitialized: false,\r\n    isAuthenticated: false,\r\n    profile: undefined,\r\n  });\r\n\r\n  let authServiceSubscription: number | null = null;\r\n  let loadingPromise: Promise<any> | null = null;\r\n\r\n  const actions = {\r\n    async dispatchInitialize(): Promise<any> {\r\n      if (loadingPromise !== null) {\r\n        return loadingPromise;\r\n      }\r\n\r\n      if (!state.isInitialized) {\r\n        loadingPromise = initialize().finally(() => {\r\n          loadingPromise = null;\r\n        });\r\n        return loadingPromise;\r\n      }\r\n    },\r\n    dispatchDeinitialize() {\r\n      if (authServiceSubscription !== null) {\r\n        Logger.debug('Deinitializing auth');\r\n        authService.unsubscribe(authServiceSubscription);\r\n        authServiceSubscription = null;\r\n      }\r\n\r\n      authService.disableStorageEventListener();\r\n      state.isInitialized = false;\r\n    },\r\n    async dispatchLogin(redirectData?: LoginRedirection): Promise<any> {\r\n      removeProxyUserFromSessionStorage();\r\n      let returnUrl = window.location.origin;\r\n\r\n      const domainHint = redirectData?.domainHint;\r\n\r\n      if (redirectData?.returnTo) {\r\n        returnUrl += redirectData.returnTo.fullPath;\r\n      } else if (domainHint && window.location.search.length > 0) {\r\n        const returnTo = new URLSearchParams(window.location.search).get(\r\n          QueryParameterNames.ReturnUrl,\r\n        );\r\n\r\n        returnUrl = returnTo?.includes(Config.Settings.ClientB2C.ClientUri)\r\n          ? returnTo\r\n          : Config.Settings.ClientB2C.ClientUri;\r\n      }\r\n\r\n      Logger.debug('Starting sign in, return url', returnUrl);\r\n      return authService\r\n        .signIn({ returnUrl, domainHint })\r\n        .then((response: ReturnStatus) => {\r\n          if (\r\n            response.status === AuthenticationResultStatus.Redirect &&\r\n            response.redirectUrl\r\n          ) {\r\n            window.location.replace(\r\n              domainHint\r\n                ? response.redirectUrl\r\n                : Config.Settings.ClientB2C.ClientUri +\r\n                    `?${QueryParameterNames.ReturnUrl}=` +\r\n                    returnUrl,\r\n            );\r\n          } else if (response.status === AuthenticationResultStatus.Fail) {\r\n            Logger.warn('Login failed', response);\r\n            window.location.replace(window.location.origin);\r\n          } else if (response.status === AuthenticationResultStatus.Success) {\r\n            Promise.resolve(response);\r\n          }\r\n        });\r\n    },\r\n    async dispatchLogout() {\r\n      Logger.debug('Starting sign out, return url', window.location.origin);\r\n      authService\r\n        .signOut({ returnUrl: window.location.origin })\r\n        .then((response: ReturnStatus) => {\r\n          if (\r\n            response.status === AuthenticationResultStatus.Redirect &&\r\n            response.redirectUrl\r\n          ) {\r\n            window.location.replace(response.redirectUrl);\r\n          } else if (response.status === AuthenticationResultStatus.Success) {\r\n            window.location.replace(window.location.origin);\r\n          } else {\r\n            Logger.warn('Logout failed', response);\r\n          }\r\n        });\r\n    },\r\n    async dispatchChangePassword() {\r\n      Logger.debug(\r\n        'Starting change password, return url',\r\n        window.location.href,\r\n      );\r\n      authService\r\n        .changePassword({ returnUrl: window.location.href })\r\n        .then((response: ReturnStatus) => {\r\n          if (\r\n            response.status === AuthenticationResultStatus.Redirect &&\r\n            response.redirectUrl\r\n          ) {\r\n            window.location.replace(response.redirectUrl);\r\n          } else {\r\n            Logger.warn('Password change failed', response);\r\n          }\r\n        });\r\n    },\r\n  };\r\n\r\n  async function initialize(): Promise<any> {\r\n    Logger.debug('Initializing auth');\r\n    authServiceSubscription = authService.subscribe(() =>\r\n      checkAuthentication(),\r\n    );\r\n\r\n    await checkAuthentication();\r\n\r\n    if (\r\n      !state.isAuthenticated &&\r\n      (await authService.canAttemptSilentSignin())\r\n    ) {\r\n      try {\r\n        await authService.signinSilent();\r\n      } catch {\r\n        // Fail silently. To the user this is the same as not being authenticated.\r\n      }\r\n    }\r\n\r\n    authService.enableStorageEventListener();\r\n    state.isInitialized = true;\r\n  }\r\n\r\n  async function checkAuthentication() {\r\n    state.isAuthenticated = await authService.isAuthenticated();\r\n    state.profile = await authService.getUserProfile();\r\n  }\r\n\r\n  return {\r\n    ...toRefs(state),\r\n    ...actions,\r\n  };\r\n});\r\n","import { format } from 'date-fns';\r\nimport { sv } from 'date-fns/locale';\r\n\r\nconst dateOnlyLength = 'YYYY-MM-DD'.length;\r\n\r\nexport const dateFormats = {\r\n  dateFormat: 'yyyy-LL-dd',\r\n  dateWithTimeFormat: 'yyyy-LL-dd{0}HH:mm',\r\n  timeFormat: 'HH:mm',\r\n  shortDayFormat: 'd',\r\n  shortDayAndMonthFormat: 'd/L',\r\n  shortDayAndShortMonthFormat: 'd MMM',\r\n  shortDayAndLongMonthFormat: 'd MMMM',\r\n  shortMonthYearFormat: 'MMM yyyy',\r\n  shortMonthFormat: 'MMM',\r\n  longMonthYearFormat: 'MMMM yyyy',\r\n  longMonthFormat: 'MMMM',\r\n  yearFormat: 'yyyy',\r\n  shortYearFormat: '-yy',\r\n  yearAndMonthFormat: 'yyyy-LL',\r\n  yearAndWeekFormat: \"'v.'w yyyy\",\r\n  shortYearAndWeekFormat: \"'v.'w -yy\",\r\n};\r\n\r\nexport function formatDateWithFormat(\r\n  value: Date | string | undefined | null,\r\n  dateFormat: string,\r\n): string {\r\n  return value ? format(new Date(value), dateFormat, { locale: sv }) : '';\r\n}\r\n\r\nexport function formatDate(value: Date | string | undefined | null): string {\r\n  return formatDateWithFormat(value, dateFormats.dateFormat);\r\n}\r\n\r\nexport function formatYearMonth(\r\n  value: Date | string | undefined | null,\r\n): string {\r\n  return formatDateWithFormat(value, dateFormats.yearAndMonthFormat);\r\n}\r\n\r\nexport function formatDateWithTime(\r\n  value: Date | string | undefined | null,\r\n  separator?: string,\r\n): string {\r\n  return formatDateWithFormat(\r\n    value,\r\n    dateFormats.dateWithTimeFormat.replace('{0}', separator ?? ' '),\r\n  );\r\n}\r\n\r\nexport function formatTime(value: Date | string | undefined | null): string {\r\n  return formatDateWithFormat(value, dateFormats.timeFormat);\r\n}\r\n\r\nexport function formatShortDay(value: string): string {\r\n  return formatDateWithFormat(value, dateFormats.shortDayFormat);\r\n}\r\n\r\nexport function formatYear(value: string | undefined): string {\r\n  return formatDateWithFormat(value, dateFormats.yearFormat);\r\n}\r\n\r\nexport function formatLongMonthAndYear(value: string | undefined): string {\r\n  return formatDateWithFormat(value, dateFormats.longMonthYearFormat);\r\n}\r\n\r\nexport function formatMonthAndYearPeriod(\r\n  from: { month: number; year: number },\r\n  to: { month: number; year: number },\r\n): string {\r\n  const fromDate = new Date(from.year, from.month - 1, 1);\r\n  const toDate = new Date(to.year, to.month - 1, 1);\r\n  const sameYear = fromDate.getFullYear() === toDate.getFullYear();\r\n  return `${formatDateWithFormat(\r\n    fromDate,\r\n    sameYear ? dateFormats.shortMonthFormat : dateFormats.shortMonthYearFormat,\r\n  ).replace('.', '')}-${formatDateWithFormat(\r\n    toDate,\r\n    dateFormats.shortMonthYearFormat,\r\n  ).replace('.', '')}`;\r\n}\r\n\r\nexport function formatMonth(\r\n  month: number,\r\n  options?: {\r\n    shortMonth: boolean;\r\n  },\r\n): string | undefined {\r\n  if (month > 12 || month < 1) {\r\n    return undefined;\r\n  }\r\n\r\n  const date = new Date();\r\n  date.setMonth(month - 1);\r\n\r\n  return formatDateWithFormat(\r\n    date,\r\n    options?.shortMonth\r\n      ? dateFormats.shortMonthFormat\r\n      : dateFormats.longMonthFormat,\r\n  );\r\n}\r\n\r\nexport function formatDayAndMonth(\r\n  value: Date | string,\r\n  options?: { shortMonth?: boolean },\r\n): string {\r\n  return formatDateWithFormat(\r\n    value,\r\n    options?.shortMonth\r\n      ? dateFormats.shortDayAndShortMonthFormat\r\n      : dateFormats.shortDayAndLongMonthFormat,\r\n  ).replace('.', '');\r\n}\r\n\r\nexport function formatMonthAndYear(\r\n  yearAndMonth: {\r\n    year: number;\r\n    month: number;\r\n  },\r\n  options?: {\r\n    shortYear?: boolean;\r\n    shortMonth?: boolean;\r\n  },\r\n): string | undefined {\r\n  if (yearAndMonth.month > 12 || yearAndMonth.month < 1) {\r\n    return undefined;\r\n  }\r\n  const date = new Date(yearAndMonth.year, yearAndMonth.month - 1, 1);\r\n  return `${formatDateWithFormat(\r\n    date,\r\n    options?.shortMonth\r\n      ? dateFormats.shortMonthFormat\r\n      : dateFormats.longMonthFormat,\r\n  ).replace(\r\n    '.',\r\n    '',\r\n  )} ${formatDateWithFormat(date, options?.shortYear ? dateFormats.shortYearFormat : dateFormats.yearFormat)}`;\r\n}\r\n\r\nexport function getMonthsBetweenDates(d1: Date, d2: Date): number {\r\n  let months = 0;\r\n  months = (d2.getFullYear() - d1.getFullYear()) * 12;\r\n  months -= d1.getMonth();\r\n  months += d2.getMonth();\r\n  return months <= 0 ? 0 : months;\r\n}\r\n\r\nexport function getDaysBetweenDates(d1: Date, d2: Date): number {\r\n  return Math.floor(getMinutesBetweenDates(d1, d2) / 60 / 24);\r\n}\r\n\r\nexport function getMinutesBetweenDates(startDate: Date, endDate: Date): number {\r\n  const diff = endDate.getTime() - startDate.getTime();\r\n  return diff / 60000;\r\n}\r\n\r\n/**\r\n * (Deprecated: Use formatMonthAndYear instead)\r\n * Gets the short month name string for the given number, optionally with a year appended to the end of the string.\r\n * @param number The month number\r\n * @param year The year, optional.\r\n * @returns If a year is given, returns the short month name plus the year, e.g. \"Jan 2021\". Otherwise return the short month name, e.g. \"Jan\".\r\n */\r\nexport function getDateShortName(\r\n  number: number,\r\n  year: number | null = null,\r\n): string | null {\r\n  const monthString = getMonthShortNameByNumber(number);\r\n\r\n  if (!monthString) {\r\n    return null;\r\n  }\r\n\r\n  if (year) {\r\n    return monthString + ' ' + year;\r\n  } else {\r\n    return monthString;\r\n  }\r\n}\r\n\r\n/**\r\n * (Deprecated: Use formatMonthAndYear instead)\r\n * Returns a short month name for the given month number, where 1 represents January and 12 represents December.\r\n * @param number The month number\r\n * @returns The short month name of the given month number,\r\n */\r\nfunction getMonthShortNameByNumber(number: number): string | null {\r\n  switch (number) {\r\n    case 1:\r\n      return 'Jan';\r\n    case 2:\r\n      return 'Feb';\r\n    case 3:\r\n      return 'Mar';\r\n    case 4:\r\n      return 'Apr';\r\n    case 5:\r\n      return 'Maj';\r\n    case 6:\r\n      return 'Jun';\r\n    case 7:\r\n      return 'Jul';\r\n    case 8:\r\n      return 'Aug';\r\n    case 9:\r\n      return 'Sep';\r\n    case 10:\r\n      return 'Okt';\r\n    case 11:\r\n      return 'Nov';\r\n    case 12:\r\n      return 'Dec';\r\n  }\r\n  return null;\r\n}\r\n\r\nexport function getDateOnlyWithLocalTimezone(value: string): Date | undefined {\r\n  if (value.length !== dateOnlyLength) {\r\n    return undefined;\r\n  }\r\n  return new Date(`${value}T00:00:00`);\r\n}\r\n","export function findLast<T>(\r\n  array: Array<T>,\r\n  predicate: (value: T, index: number, obj: T[]) => boolean,\r\n): T | undefined {\r\n  let l = array.length;\r\n  while (l--) {\r\n    if (predicate(array[l], l, array)) {\r\n      return array[l];\r\n    }\r\n  }\r\n\r\n  return undefined;\r\n}\r\n\r\nexport function groupBy<K, V>(\r\n  list: Array<V>,\r\n  keyGetter: (input: V) => K,\r\n): Map<K, Array<V>> {\r\n  const map = new Map();\r\n  list.forEach((item) => {\r\n    const key = keyGetter(item);\r\n    const collection = map.get(key);\r\n    if (!collection) {\r\n      map.set(key, [item]);\r\n    } else {\r\n      collection.push(item);\r\n    }\r\n  });\r\n  return map;\r\n}\r\n\r\nexport function pushUniqueValue<V>(\r\n  list: Array<V>,\r\n  value: V,\r\n  predicate: (compareValue: V, value: V) => boolean,\r\n): boolean {\r\n  if (!list.some((compareValue) => predicate(compareValue, value))) {\r\n    list.push(value);\r\n    return true;\r\n  }\r\n\r\n  return false;\r\n}\r\n\r\nexport function isSameArray(a: any[], b: any[]): boolean {\r\n  return a.length === b.length && a.every((j) => b.includes(j));\r\n}\r\n","import type { ItemWithLoadingStatus } from './ItemWithLoadingStatus';\r\nimport { getMinutesBetweenDates } from '@/utils/Dates';\r\nimport type { LoadingStatus } from './LoadingStatus';\r\nimport { isSameArray } from '@/utils/ArrayUtil';\r\n\r\nexport interface Item<T, TKey, TError = any>\r\n  extends ItemWithLoadingStatus<T, TError> {\r\n  id: TKey;\r\n}\r\n\r\nexport class CommonArrayStore<T, TKey, TError = any> {\r\n  public items: Array<Item<T, TKey, TError>> = [];\r\n\r\n  private settings: { freshMinutes: number; complexIdFields?: string[] } = {\r\n    freshMinutes: 1,\r\n  };\r\n\r\n  constructor(settings: { freshMinutes: number; complexIdFields?: string[] }) {\r\n    this.settings = settings;\r\n  }\r\n\r\n  // -----------------\r\n  // ### Mutations ###\r\n  // -----------------\r\n\r\n  public setLoading(payload: {\r\n    id: TKey;\r\n    loadingPromise: Promise<any>;\r\n    clearData?: boolean;\r\n  }): void {\r\n    const item = this.getOrAddItem(payload.id);\r\n\r\n    item.loading.isLoading = true;\r\n    item.loading.isError = false;\r\n    item.loading.error = undefined;\r\n    item.loading.loadingPromise = payload.loadingPromise;\r\n\r\n    if (payload.clearData === true) {\r\n      item.data = null;\r\n    }\r\n  }\r\n\r\n  public setLoadingComplete(payload: { id: TKey; data: T }): void {\r\n    const item = this.getOrAddItem(payload.id);\r\n\r\n    item.loading.isLoading = false;\r\n    item.loading.isError = false;\r\n    item.loading.error = undefined;\r\n    item.loading.loadDate = new Date();\r\n\r\n    item.data = payload.data;\r\n  }\r\n\r\n  public setStaleData(payload: { id: TKey }): void {\r\n    const item = this.getOrAddItem(payload.id);\r\n\r\n    item.loading.isLoading = false;\r\n    item.loading.isError = false;\r\n    item.loading.error = undefined;\r\n    item.loading.loadDate = null;\r\n  }\r\n\r\n  public setAllStaleData(): void {\r\n    this.items.forEach((item) => {\r\n      item.loading.isLoading = false;\r\n      item.loading.isError = false;\r\n      item.loading.error = undefined;\r\n      item.loading.loadDate = null;\r\n    });\r\n  }\r\n\r\n  public setLoadingError(payload: {\r\n    id: TKey;\r\n    error?: TError;\r\n    clearData?: boolean;\r\n  }): void {\r\n    const item = this.getOrAddItem(payload.id);\r\n\r\n    item.loading.isLoading = false;\r\n    item.loading.isError = true;\r\n    item.loading.error = payload.error;\r\n    item.loading.loadDate = new Date();\r\n\r\n    if (payload.clearData === true) {\r\n      item.data = null;\r\n    }\r\n  }\r\n\r\n  public setData(payload: { id: TKey; data: T }): void {\r\n    const item = this.getOrAddItem(payload.id);\r\n\r\n    item.data = payload.data;\r\n  }\r\n\r\n  // ------------------------\r\n  // ### Helper functions ###\r\n  // ------------------------\r\n  public getLoadingStatus(id: TKey): LoadingStatus<T, TError> | null {\r\n    return this.getItem(id)?.loading ?? null;\r\n  }\r\n\r\n  public getDataFor(id: TKey): T | null {\r\n    const item = this.getItem(id);\r\n\r\n    return item?.data ?? null;\r\n  }\r\n\r\n  public clearAllData(): void {\r\n    this.items.splice(0, this.items.length);\r\n  }\r\n\r\n  public clear(id: TKey): void {\r\n    const item = this.getItem(id);\r\n\r\n    if (item === undefined) {\r\n      return;\r\n    }\r\n\r\n    const index = this.items.indexOf(item);\r\n    if (index >= 0) {\r\n      this.items.splice(index, 1);\r\n    }\r\n  }\r\n\r\n  public hasFreshDataFor(id: TKey): boolean {\r\n    const item = this.getItem(id);\r\n\r\n    return item ? this.checkIsDataFresh(item) : false;\r\n  }\r\n\r\n  public currentlyLoadingPromise(id: TKey): Promise<T> | null {\r\n    const item = this.getOrAddItem(id);\r\n\r\n    if (!item.loading.isLoading) {\r\n      return null;\r\n    }\r\n\r\n    return item.loading.loadingPromise;\r\n  }\r\n\r\n  protected getItem(id: TKey): Item<T, TKey> | undefined {\r\n    let item: Item<T, TKey> | undefined;\r\n    if (\r\n      this.settings.complexIdFields &&\r\n      this.settings.complexIdFields.length > 0\r\n    ) {\r\n      item = this.items.find((i) =>\r\n        this.settings.complexIdFields?.every((field) => {\r\n          const a = (i.id as any)[field];\r\n          const b = (id as any)[field];\r\n\r\n          if (Array.isArray(a) && Array.isArray(b)) {\r\n            return isSameArray(a, b);\r\n          }\r\n\r\n          return a === b;\r\n        }),\r\n      );\r\n    } else {\r\n      item = this.items.find((i) => i.id === id);\r\n    }\r\n\r\n    return item;\r\n  }\r\n\r\n  private getOrAddItem(id: TKey): Item<T, TKey> {\r\n    const item: Item<T, TKey> | undefined = this.getItem(id);\r\n\r\n    if (item) {\r\n      return item;\r\n    }\r\n\r\n    const newItem: Item<T, TKey> = {\r\n      id,\r\n      data: null,\r\n      loading: {\r\n        isLoading: false,\r\n        isError: false,\r\n        error: null,\r\n        loadingPromise: null,\r\n        loadDate: null,\r\n      },\r\n    };\r\n\r\n    this.items.push(newItem);\r\n\r\n    return newItem;\r\n  }\r\n\r\n  private checkIsDataFresh(item: Item<T, TKey>): boolean {\r\n    return (\r\n      item.data !== null &&\r\n      item.loading.loadDate !== null &&\r\n      getMinutesBetweenDates(item.loading.loadDate, new Date()) <=\r\n        this.settings.freshMinutes\r\n    );\r\n  }\r\n}\r\n","import type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport { CommonArrayStore } from '../common/CommonArrayStore';\r\nimport type { LoadingStatus } from '../common/LoadingStatus';\r\nimport type { Route } from '@/models/memberProfile/Route';\r\nimport type { ProfileProxy } from '@/models/memberProfile/ProfileProxy';\r\n\r\nexport enum ProfileType {\r\n  Mine = 'my-profile',\r\n  Proxy = 'proxy-profile',\r\n}\r\n\r\ntype RouteName = string;\r\ntype HasAccess = boolean;\r\n\r\nexport class ProfileArrayStore extends CommonArrayStore<\r\n  MemberProfile,\r\n  ProfileType\r\n> {\r\n  private routeAccess: Record<ProfileType, Map<RouteName, HasAccess>> = {\r\n    [ProfileType.Mine]: new Map<RouteName, HasAccess>(),\r\n    [ProfileType.Proxy]: new Map<RouteName, HasAccess>(),\r\n  };\r\n\r\n  constructor(settings: { freshMinutes: number }) {\r\n    super(settings);\r\n  }\r\n\r\n  public get profile() {\r\n    return this.getDataFor(ProfileType.Mine);\r\n  }\r\n\r\n  public get loading() {\r\n    return this.getItem(ProfileType.Mine)?.loading ?? this.defaultLoadingStatus;\r\n  }\r\n\r\n  public get effectiveProfile() {\r\n    return (\r\n      this.getDataFor(ProfileType.Proxy) ?? this.getDataFor(ProfileType.Mine)\r\n    );\r\n  }\r\n\r\n  public get effectiveLoading() {\r\n    return (\r\n      this.getItem(ProfileType.Proxy)?.loading ??\r\n      this.getItem(ProfileType.Mine)?.loading ??\r\n      this.defaultLoadingStatus\r\n    );\r\n  }\r\n\r\n  public get isUsingProxy(): boolean {\r\n    return !!this.getDataFor(ProfileType.Proxy);\r\n  }\r\n\r\n  public get currentProxy(): ProfileProxy | undefined {\r\n    const effectiveUserId = this.effectiveProfile?.memberId;\r\n    return this.isUsingProxy\r\n      ? this.profile?.proxies.find(\r\n          (proxy) => proxy.giverContactId === effectiveUserId,\r\n        )\r\n      : undefined;\r\n  }\r\n\r\n  public get effectiveRoles(): string[] {\r\n    return this.isUsingProxy\r\n      ? (this.currentProxy?.roles ?? [])\r\n      : (this.profile?.roles ?? []);\r\n  }\r\n\r\n  public setEffectiveLoadingComplete(payload: { data: MemberProfile }) {\r\n    const id = this.isUsingProxy ? ProfileType.Proxy : ProfileType.Mine;\r\n\r\n    this.setLoadingComplete({ id, ...payload });\r\n  }\r\n\r\n  public setLoadingComplete(payload: {\r\n    id: ProfileType;\r\n    data: MemberProfile;\r\n  }): void {\r\n    this.setRouteAccessRecursive(payload.id, payload.data.routes);\r\n    super.setLoadingComplete(payload);\r\n  }\r\n\r\n  /** Holds access information per Episerver route, where route name matches the page id in Episerver. */\r\n  public get effectiveRouteAccess(): Map<RouteName, HasAccess> {\r\n    return this.isUsingProxy\r\n      ? this.routeAccess[ProfileType.Proxy]\r\n      : this.routeAccess[ProfileType.Mine];\r\n  }\r\n\r\n  public clear(id: ProfileType): void {\r\n    this.routeAccess[id].clear();\r\n    super.clear(id);\r\n  }\r\n\r\n  private setRouteAccessRecursive(\r\n    profileType: ProfileType,\r\n    routes: Route[],\r\n  ): void {\r\n    routes.forEach((route) => {\r\n      this.routeAccess[profileType].set(route.id.toString(), route.hasAccess);\r\n\r\n      if (route.routes?.length) {\r\n        this.setRouteAccessRecursive(profileType, route.routes);\r\n      }\r\n    });\r\n  }\r\n\r\n  private get defaultLoadingStatus(): LoadingStatus<MemberProfile> {\r\n    return {\r\n      isLoading: false,\r\n      isError: false,\r\n      error: null,\r\n      loadingPromise: null,\r\n      loadDate: null,\r\n    };\r\n  }\r\n}\r\n","import type { Role } from '@/models/memberProfile/Role';\r\n\r\n/**\r\n * A combination of role requirements.\r\n *\r\n * Types:\r\n *\r\n * - `single`: A single role is required.\r\n * - `and`: All of the roles are required.\r\n * - `or`: At least one of the roles is required.\r\n * - `andOr`: All of the `andRoles` are required, or at least one of the `orRoles` is required.\r\n * - `nestedOr`: Complex role requirements. Either condition must be met.\r\n */\r\nexport type RoleRequirement =\r\n  | RoleRequirementSingle\r\n  | RoleRequirementAnd\r\n  | RoleRequirementOr\r\n  | RoleRequirementAndOr\r\n  | RoleRequirementNestedOr;\r\n\r\ntype RoleRequirementSingle = { type: 'single'; role: Role };\r\ntype RoleRequirementAnd = { type: 'and'; roles: Set<Role> };\r\ntype RoleRequirementOr = { type: 'or'; roles: Set<Role> };\r\ntype RoleRequirementAndOr = {\r\n  type: 'andOr';\r\n  andRoles: Set<Role>;\r\n  orRoles: Set<Role>;\r\n};\r\ntype RoleRequirementNestedOr = {\r\n  type: 'nestedOr';\r\n  conditions: RoleRequirement[];\r\n};\r\n\r\nexport function doesProfileMeetRoleRequirements(\r\n  rolesToCheck: Role[] | string[],\r\n  requirement: RoleRequirement | undefined,\r\n): boolean {\r\n  if (!requirement) {\r\n    return true;\r\n  }\r\n\r\n  const roles = new Set(rolesToCheck);\r\n  switch (requirement.type) {\r\n    case 'single':\r\n      return roles.has(requirement.role);\r\n    case 'and':\r\n      return [...requirement.roles].every((requiredRole) =>\r\n        roles.has(requiredRole),\r\n      );\r\n    case 'or':\r\n      return [...requirement.roles].some((requiredRole) =>\r\n        roles.has(requiredRole),\r\n      );\r\n    case 'andOr':\r\n      return (\r\n        [...requirement.andRoles].every((requiredRole) =>\r\n          roles.has(requiredRole),\r\n        ) ||\r\n        [...requirement.orRoles].some((requiredRole) => roles.has(requiredRole))\r\n      );\r\n    case 'nestedOr':\r\n      return requirement.conditions.some((condition) =>\r\n        doesProfileMeetRoleRequirements(rolesToCheck, condition),\r\n      );\r\n    default:\r\n      return true;\r\n  }\r\n}\r\n","import { StorageTypes } from '@/common/enums/StorageTypes';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport memberProfilesService from '@/services/MemberProfilesService';\r\nimport storageService from '@/services/StorageService';\r\nimport { Logger } from '@/utils/Logger';\r\nimport { defineStore } from 'pinia';\r\nimport { computed, reactive } from 'vue';\r\nimport { useAuthStore } from './authStore';\r\nimport type { MarketingProductsPreferences } from '@/models/memberProfile/MarketingProductsPreferences';\r\nimport type { UpdateContactDetails } from '@/models/memberProfile/UpdateContactDetails';\r\nimport type { Address } from '@/models/memberProfile/Address';\r\nimport type { EconomicChoices } from '@/models/memberProfile/EconomicChoices';\r\nimport { ProfileArrayStore, ProfileType } from './profile/ProfileArrayStore';\r\nimport type { ProfileProxy } from '@/models/memberProfile/ProfileProxy';\r\nimport type {\r\n  RouteLocationNormalizedLoaded,\r\n  RouteRecordNormalized,\r\n} from 'vue-router';\r\nimport { doesProfileMeetRoleRequirements } from '@/router/roleRequirement';\r\nimport type { Role } from '@/models/memberProfile/Role';\r\n\r\nconst PROXY_USER_STORAGE_KEY = 'proxy_user_id';\r\nconst proxyProfileStorageUtil = {\r\n  setProxyUser: (userId: string) => {\r\n    storageService.set(\r\n      StorageTypes.SESSION,\r\n      PROXY_USER_STORAGE_KEY,\r\n      userId,\r\n      false,\r\n    );\r\n  },\r\n  removeProxyUser: () => {\r\n    storageService.remove(StorageTypes.SESSION, PROXY_USER_STORAGE_KEY);\r\n  },\r\n  getProxyUserId: (): string | null | undefined => {\r\n    return storageService.get(\r\n      StorageTypes.SESSION,\r\n      PROXY_USER_STORAGE_KEY,\r\n      false,\r\n    );\r\n  },\r\n  shouldUseProxy: (): boolean => !!proxyProfileStorageUtil.getProxyUserId(),\r\n};\r\n\r\nexport const removeProxyUserFromSessionStorage =\r\n  proxyProfileStorageUtil.removeProxyUser;\r\n\r\nexport interface TriggerChangeProfileModalOptions {\r\n  hideHelpText: boolean;\r\n  changeProfileSuccess: boolean;\r\n}\r\n\r\nexport const memberProfileStoreId = 'memberProfile';\r\nexport const useMemberProfileStore = defineStore(memberProfileStoreId, () => {\r\n  const common = reactive(new ProfileArrayStore({ freshMinutes: 5 }));\r\n\r\n  const authStore = useAuthStore();\r\n\r\n  const actions = {\r\n    async dispatchLoad(data: {\r\n      force: boolean;\r\n      profileType: ProfileType;\r\n    }): Promise<any> {\r\n      // If recently loaded, return\r\n      if (data && !data.force && common.hasFreshDataFor(data.profileType)) {\r\n        return Promise.resolve();\r\n      }\r\n\r\n      const currentlyLoadingPromise = common.currentlyLoadingPromise(\r\n        data.profileType,\r\n      );\r\n      if (currentlyLoadingPromise !== null) {\r\n        Logger.debug(\r\n          'Already loading, waiting for existing load to finish',\r\n          'memberProfile',\r\n        );\r\n        return currentlyLoadingPromise;\r\n      }\r\n\r\n      if (!authStore.isInitialized) {\r\n        await authStore.dispatchInitialize();\r\n      }\r\n\r\n      if (!authStore.isAuthenticated) {\r\n        Logger.debug('Not authenticated, clearing memberProfile');\r\n        common.clear(data.profileType);\r\n        storageService.remove(StorageTypes.SESSION, newSession);\r\n      } else {\r\n        const getMemberProfileFunc = resolveGetMemberFunc(\r\n          memberProfilesService,\r\n          data.profileType,\r\n        );\r\n\r\n        const loadingPromise = getMemberProfileFunc()\r\n          .then((memberProfile) => {\r\n            Logger.debug(\r\n              `Load memberProfile success. Type: ${data.profileType}`,\r\n              memberProfile,\r\n            );\r\n            common.setLoadingComplete({\r\n              id: data.profileType,\r\n              data: memberProfile,\r\n            });\r\n            if (common.isUsingProxy) {\r\n              Logger.debug(\r\n                'Current ProfileProxy being used:',\r\n                common.currentProxy,\r\n              );\r\n            }\r\n          })\r\n          .catch((error) => {\r\n            Logger.warn(\r\n              `Load memberProfile failed. Type: ${data.profileType}`,\r\n              error,\r\n            );\r\n            common.setLoadingError({ id: data.profileType, error });\r\n            return Promise.reject(error);\r\n          });\r\n\r\n        common.setLoading({ id: data.profileType, loadingPromise });\r\n\r\n        return loadingPromise;\r\n      }\r\n    },\r\n    async useProxyProfile(proxy: ProfileProxy): Promise<any> {\r\n      if (common.effectiveProfile?.memberId === proxy.giverContactId) {\r\n        return Promise.resolve();\r\n      }\r\n\r\n      proxyProfileStorageUtil.setProxyUser(proxy.giverContactId);\r\n      try {\r\n        await this.dispatchLoad({\r\n          force: true,\r\n          profileType: ProfileType.Proxy,\r\n        });\r\n      } catch (error) {\r\n        Logger.warn('Use proxy profile failed', error);\r\n        proxyProfileStorageUtil.removeProxyUser();\r\n        common.clear(ProfileType.Proxy);\r\n        return Promise.reject(error);\r\n      }\r\n    },\r\n    useMyProfile(): Promise<any> {\r\n      if (!common.isUsingProxy) {\r\n        return Promise.resolve();\r\n      }\r\n\r\n      this.removeProxyProfile();\r\n      return this.dispatchLoad({\r\n        force: false,\r\n        profileType: ProfileType.Mine,\r\n      });\r\n    },\r\n    removeProxyProfile() {\r\n      proxyProfileStorageUtil.removeProxyUser();\r\n      common.clear(ProfileType.Proxy);\r\n    },\r\n    /**\r\n     * Does nothing by itself, but the action can be subscribed to within a component.\r\n     */\r\n    triggerChangeProfileModal(options: TriggerChangeProfileModalOptions): void {\r\n      Logger.debug('Triggering change profile modal.', options);\r\n    },\r\n    async updatePreferences(\r\n      updatePreferences: MarketingProductsPreferences,\r\n    ): Promise<void> {\r\n      return memberProfilesService\r\n        .updateMemberProfilePreferences(updatePreferences)\r\n        .then((memberProfile: MemberProfile) => {\r\n          Logger.debug('Update preferences success', memberProfile);\r\n          common.setEffectiveLoadingComplete({\r\n            data: memberProfile,\r\n          });\r\n        })\r\n        .catch((error) => {\r\n          Logger.debug('Update preferences failed');\r\n          return Promise.reject(error);\r\n        });\r\n    },\r\n\r\n    async updateEconomics(economics: EconomicChoices): Promise<void> {\r\n      return memberProfilesService\r\n        .updateMemberEconomics(economics)\r\n        .then((memberProfile: MemberProfile) => {\r\n          Logger.debug('Update economics success', memberProfile);\r\n          common.setEffectiveLoadingComplete({\r\n            data: memberProfile,\r\n          });\r\n        })\r\n        .catch((error) => {\r\n          Logger.warn('Update economics failed', error);\r\n          return Promise.reject(error);\r\n        });\r\n    },\r\n    async updateContactDetails(\r\n      updateContactDetails: UpdateContactDetails,\r\n    ): Promise<void> {\r\n      const updateContactDetailsPromise = memberProfilesService\r\n        .updateMemberProfileContactDetails(updateContactDetails)\r\n        .then((memberProfile: MemberProfile) => {\r\n          Logger.debug('Update contact details success', memberProfile);\r\n          common.setEffectiveLoadingComplete({\r\n            data: memberProfile,\r\n          });\r\n        })\r\n        .catch((error) => {\r\n          Logger.debug('Update contact details failed');\r\n          return Promise.reject(error);\r\n        });\r\n\r\n      return updateContactDetailsPromise;\r\n    },\r\n\r\n    async updateContactAddress(address: Address): Promise<void> {\r\n      return memberProfilesService\r\n        .updateMemberProfileContactAddress(address)\r\n        .then(() => {\r\n          Logger.debug('Update address success');\r\n          return Promise.resolve();\r\n        })\r\n        .catch((error) => {\r\n          Logger.warn('Update address failed', error);\r\n          return Promise.reject(error);\r\n        });\r\n    },\r\n  };\r\n\r\n  const hasEffectiveAccessToRouteByEpiserverRouteName = (routeName: string) => {\r\n    return common.effectiveRouteAccess.get(routeName) ?? true;\r\n  };\r\n\r\n  const getters = {\r\n    /** Always the profile of the signed in user. */\r\n    myProfile: computed(() => common.profile),\r\n    /** Always the loading status for the profile of the signed in user. */\r\n    myLoading: computed(() => common.loading),\r\n    /** The proxy profile if it exists, else the signed in user. */\r\n    effectiveProfile: computed(() => common.effectiveProfile),\r\n    /** Loading status for the proxy profile if it exists, else the signed in user. */\r\n    effectiveLoading: computed(() => common.effectiveLoading),\r\n    isUsingProxy: computed(() => common.isUsingProxy),\r\n    isMemberImpersonated: computed(\r\n      () => !!common.profile?.isMemberImpersonated,\r\n    ),\r\n    currentProxy: computed(() => common.currentProxy),\r\n    /**\r\n     * Always based on the profile of the signed in user.\r\n     */\r\n    hasProxies: computed(() => !!common.profile?.proxies.length),\r\n    shouldUseProxy: proxyProfileStorageUtil.shouldUseProxy,\r\n    getProxyUserId: proxyProfileStorageUtil.getProxyUserId,\r\n    hasEffectiveAccessToRoute(\r\n      route: RouteLocationNormalizedLoaded | RouteRecordNormalized,\r\n    ): boolean {\r\n      if (route.meta.authRequirements?.roleRequirement) {\r\n        return doesProfileMeetRoleRequirements(\r\n          common.effectiveRoles,\r\n          route.meta.authRequirements.roleRequirement,\r\n        );\r\n      }\r\n\r\n      return hasEffectiveAccessToRouteByEpiserverRouteName(\r\n        route.name?.toString() ?? '',\r\n      );\r\n    },\r\n    hasEffectiveRole(role: Role | string): boolean {\r\n      return common.effectiveRoles.includes(role);\r\n    },\r\n  };\r\n\r\n  return {\r\n    ...getters,\r\n    ...actions,\r\n  };\r\n});\r\n\r\nfunction resolveGetMemberFunc(\r\n  service: typeof memberProfilesService,\r\n  profileType: ProfileType,\r\n) {\r\n  return (\r\n    profileType === ProfileType.Mine\r\n      ? service.getMeMemberProfile\r\n      : service.getMemberProfile\r\n  ).bind(service);\r\n}\r\n\r\nexport const newSession = 'isNewSession';\r\n","export enum ProblemType {\r\n  undefined = 0,\r\n  impersonatedSessionExpired = 1,\r\n}\r\n","import type { LoginRedirection } from '@/models/LoginRedirection';\r\nimport mitt, { type Emitter } from 'mitt';\r\n\r\nexport const EventLogin = 'EventLogin';\r\nexport const EventLogout = 'EventLogout';\r\nexport const EventChangePassword = 'EventChangePassword';\r\n\r\ntype GlobalEvents = {\r\n  EventLogin: LoginRedirection | undefined;\r\n  EventLogout: void;\r\n  EventChangePassword: void;\r\n};\r\n\r\nexport const EventBus: Emitter<GlobalEvents> = mitt<GlobalEvents>();\r\n","<template>\r\n  <div class=\"c-carousel mb-4\">\r\n    <div class=\"c-carousel__track\">\r\n      <div class=\"c-carousel__slide\">\r\n        <div\r\n          class=\"c-banner c-banner--background-size-cover c-banner--height-pixels-200\"\r\n          :style=\"'background-image:url(' + imageUrl + ');'\"\r\n        >\r\n          <template v-if=\"$slots.default\">\r\n            <div\r\n              class=\"c-banner__overlay c-banner__overlay--dark-left-to-right\"\r\n            ></div>\r\n\r\n            <div class=\"container-fluid d-flex\">\r\n              <div\r\n                class=\"c-banner__text c-banner__text--color-white c-banner__text--vertical-align-center\"\r\n              >\r\n                <slot></slot>\r\n              </div>\r\n            </div>\r\n          </template>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  imageUrl: string;\r\n}>();\r\n\r\nconst { imageUrl } = toRefs(props);\r\n</script>\r\n","export const VideoModalId = 'videoModal';\r\n","export enum MaterialSymbolNames {\r\n  Account = 'manage_accounts',\r\n  Add = 'add',\r\n  AddCircle = 'add_circle',\r\n  Adjust = 'adjust',\r\n  ArrowBack = 'arrow_back',\r\n  ArrowDown = 'expand_more',\r\n  ArrowLeft = 'keyboard_arrow_left',\r\n  ArrowRight = 'keyboard_arrow_right',\r\n  ArrowUp = 'expand_less',\r\n  Article = 'article',\r\n  Assignment = 'assignment',\r\n  AssignmentLate = 'assignment_late',\r\n  BulletList = 'format_list_bulleted',\r\n  Calendar = 'calendar_month',\r\n  CalendarToday = 'calendar_today',\r\n  Chat = 'chat',\r\n  CheckCircle = 'check_circle',\r\n  Close = 'close',\r\n  Contact = '3p',\r\n  Contribution = 'control_point_duplicate',\r\n  Cookies = 'cookie',\r\n  Copy = 'content_copy',\r\n  Delete = 'delete',\r\n  Document = 'description',\r\n  Done = 'done',\r\n  Download = 'download',\r\n  Edit = 'edit',\r\n  EditSquare = 'edit_square',\r\n  Economy = 'account_balance_wallet',\r\n  Email = 'email',\r\n  Environment = 'eco',\r\n  Error = 'error',\r\n  Expand = 'expand_all',\r\n  ExternalLink = 'open_in_new',\r\n  Filter = 'tune',\r\n  Forest = 'forest',\r\n  Globe = 'globe',\r\n  Group = 'group',\r\n  Help = 'help',\r\n  Info = 'info',\r\n  Location = 'near_me',\r\n  Lock = 'lock',\r\n  LogOut = 'logout',\r\n  Mail = 'mail',\r\n  Map = 'map',\r\n  Menu = 'menu',\r\n  NestEcoLeaf = 'nest_eco_leaf',\r\n  OrderApprove = 'order_approve',\r\n  Overview = 'visibility',\r\n  Phone = 'phone',\r\n  Refresh = 'refresh',\r\n  Remove = 'remove',\r\n  RemoveCircle = 'do_not_disturb_on',\r\n  Search = 'search',\r\n  SendMoney = 'send_money',\r\n  Sort = 'sort',\r\n  UnfoldMore = 'unfold_more',\r\n  Upload = 'upload',\r\n  UseAs = 'supervisor_account',\r\n}\r\n","<template>\r\n  <header class=\"c-compact-header\">\r\n    <div\r\n      class=\"c-compact-header__content-container container-fluid u-border-bottom u-border-color-opacity-8 box-shadow-lg-up__compact-header mw-100 px-4 px-xl-5\"\r\n    >\r\n      <div class=\"c-compact-header__content c-compact-header__content--left\">\r\n        <slot name=\"headerStart\"></slot>\r\n      </div>\r\n\r\n      <div class=\"c-compact-header__content c-compact-header__content--center\">\r\n        <router-link\r\n          v-if=\"logoUrl && logoRouteName\"\r\n          :to=\"{ name: logoRouteName }\"\r\n          class=\"d-xl-none c-compact-header__logo-link\"\r\n        >\r\n          <img :src=\"logoUrl\" class=\"c-compact-header__logo-image\" alt=\"logo\" />\r\n        </router-link>\r\n\r\n        <slot name=\"headerCenter\"></slot>\r\n      </div>\r\n\r\n      <div class=\"c-compact-header__content c-compact-header__content--right\">\r\n        <slot name=\"headerEnd\"></slot>\r\n      </div>\r\n    </div>\r\n  </header>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  logoUrl?: string;\r\n  logoRouteName?: string;\r\n}>();\r\n\r\nconst { logoUrl, logoRouteName } = toRefs(props);\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.u-border-color-opacity-8 {\r\n  border-color: $sodra-black-opacity-8 !important;\r\n}\r\n</style>\r\n","export default \"__VITE_PUBLIC_ASSET__78be880a__\"","export enum RouteNames {\r\n  Home = 'Home',\r\n  Authentication = 'Authentication',\r\n  Login = 'Login',\r\n  PasswordChange = 'PasswordChange',\r\n  NotFound = 'NotFound',\r\n}\r\n","<template>\r\n  <div>\r\n    <router-link\r\n      :to=\"{ name: RouteNames.Home }\"\r\n      class=\"c-compact-header__logo-link d-flex\"\r\n    >\r\n      <img\r\n        src=\"/img/sodra-logo.svg\"\r\n        class=\"c-compact-header__logo-image\"\r\n        :alt=\"t('alts.sodraLogo')\"\r\n      />\r\n    </router-link>\r\n  </div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { useI18n } from 'vue-i18n';\r\nimport { RouteNames } from '@/router/routeNames';\r\n\r\nconst { t } = useI18n();\r\n</script>\r\n","<template>\r\n  <i\r\n    class=\"material-symbols-outlined\"\r\n    :class=\"[\r\n      'material-symbols-outlined--' + size,\r\n      { 'material-symbols-filled': filled },\r\n    ]\"\r\n  >\r\n    {{ symbolName }}\r\n  </i>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nexport interface MMaterialSymbolProps {\r\n  size: string;\r\n  symbolName: string;\r\n  filled?: boolean;\r\n}\r\n\r\nconst props = defineProps<MMaterialSymbolProps>();\r\n\r\nconst { size, symbolName, filled } = toRefs(props);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.material-symbols-filled {\r\n  font-variation-settings:\r\n    'FILL' 1,\r\n    'wght' 400,\r\n    'GRAD' 0,\r\n    'opsz' 24;\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <button\r\n      class=\"row c-compact-header__button-container g-0\"\r\n      :class=\"{ 'd-none d-lg-flex': desktopOnly }\"\r\n    >\r\n      <div\r\n        class=\"col-auto c-compact-header__button c-compact-header__button--yellow\"\r\n      >\r\n        <div class=\"c-compact-header__button-icon d-flex\">\r\n          <span class=\"t-label-large u-text-uppercase m-auto\">\r\n            {{ initials }}\r\n          </span>\r\n        </div>\r\n        <MMaterialSymbol\r\n          v-if=\"isUsingProxy\"\r\n          :symbol-name=\"MaterialSymbolNames.Group\"\r\n          size=\"18\"\r\n          class=\"proxy-icon u-background-color-yellow-50 rounded-circle u-border border-white\"\r\n        />\r\n      </div>\r\n\r\n      <div\r\n        class=\"col d-xxs-none ms-2_5 me-3 u-ellipsis\"\r\n        :class=\"{ 'd-none d-lg-inline': !overrideMobile }\"\r\n      >\r\n        <div\r\n          class=\"d-block u-color-black t-label-medium u-text-left u-truncate\"\r\n        >\r\n          {{ profile.name }}\r\n        </div>\r\n        <div\r\n          class=\"t-alt-label-medium w-100 u-text-left text-lowercase u-truncate\"\r\n        >\r\n          {{ profile.emailAddress }}\r\n        </div>\r\n      </div>\r\n\r\n      <MMaterialSymbol\r\n        class=\"d-none d-lg-flex col-auto my-auto\"\r\n        size=\"20\"\r\n        :symbol-name=\"MaterialSymbolNames.ArrowDown\"\r\n      />\r\n    </button>\r\n    <slot></slot>\r\n  </div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { computed, toRefs } from 'vue';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\n\r\nconst props = defineProps<{\r\n  profile: MemberProfile;\r\n  isUsingProxy: boolean;\r\n  desktopOnly?: boolean;\r\n  overrideMobile?: boolean;\r\n}>();\r\n\r\nconst { profile, isUsingProxy, desktopOnly, overrideMobile } = toRefs(props);\r\n\r\nconst initials = computed<string>(() => {\r\n  const fullInitials = profile.value.name.split(' ').map((x) => x[0]);\r\n\r\n  return fullInitials.length > 1\r\n    ? `${fullInitials.at(0)}${fullInitials.at(-1)}`\r\n    : fullInitials.join('');\r\n});\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.c-compact-header__button {\r\n  white-space: unset;\r\n  &-icon {\r\n    height: 30px;\r\n  }\r\n  &-container {\r\n    line-height: 0 !important;\r\n  }\r\n}\r\n.c-compact-header__button-container {\r\n  @media (min-width: $unity-lg-breakpoint) {\r\n    max-width: 28vw;\r\n  }\r\n}\r\n\r\n.proxy-icon {\r\n  position: absolute;\r\n  top: auto;\r\n  left: auto;\r\n  padding: 0.125rem;\r\n\r\n  @include media-breakpoint-up(xl) {\r\n    right: -8px;\r\n    bottom: -12px;\r\n  }\r\n\r\n  @include media-breakpoint-down(xl) {\r\n    right: -8px;\r\n    bottom: -12px;\r\n    font-size: 16px !important;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div\r\n    class=\"dropdown-container box-shadow__popover u-background-color-white mt-2 pt-lg-2 pb-lg-2_5\"\r\n  >\r\n    <div class=\"dropdown\">\r\n      <nav class=\"dropdown-nav w-100 h-100\">\r\n        <ul class=\"dropdown-nav__list m-0 px-0 p-lg-0 u-min-height-percent-100\">\r\n          <slot></slot>\r\n        </ul>\r\n      </nav>\r\n    </div>\r\n    <div\r\n      v-if=\"hideOnClickOutside\"\r\n      class=\"dropdown-overlay\"\r\n      @click.stop=\"emit('close')\"\r\n    ></div>\r\n  </div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  hideOnClickOutside?: boolean;\r\n}>();\r\n\r\nconst { hideOnClickOutside } = toRefs(props);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'close'): void;\r\n}>();\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.dropdown-container {\r\n  position: absolute;\r\n  white-space: nowrap;\r\n  z-index: 600;\r\n\r\n  @include media-breakpoint-down(lg) {\r\n    position: fixed;\r\n    bottom: 0;\r\n    left: 50%;\r\n    transform: translateX(-50%);\r\n    width: 100%;\r\n    box-shadow: none !important;\r\n    border-top: 1px solid $sodra-black-10;\r\n  }\r\n\r\n  @include media-breakpoint-up(lg) {\r\n    max-width: 275px;\r\n  }\r\n}\r\n\r\n.dropdown-nav {\r\n  @include media-breakpoint-down(lg) {\r\n    position: fixed;\r\n    left: 0;\r\n\r\n    &__list {\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n  }\r\n}\r\n\r\n.dropdown-overlay {\r\n  background-color: transparent;\r\n  position: fixed;\r\n  top: 0;\r\n  left: 0;\r\n  right: 0;\r\n  bottom: 0;\r\n  display: block;\r\n  z-index: -1;\r\n\r\n  @include media-breakpoint-down(lg) {\r\n    background-color: white;\r\n  }\r\n}\r\n</style>\r\n","export class TooltipSettings {\r\n  public static readonly Placement = {\r\n    Bottom: 'bottom',\r\n    Top: 'top',\r\n  };\r\n  public static readonly Trigger = {\r\n    Manual: 'manual', // Programatically trigger\r\n    Click: 'click',\r\n    MouseEnterFocus: 'mouseenter focus',\r\n  };\r\n  public static readonly Theme = {\r\n    Blue: 'blue',\r\n    Yellow: 'yellow',\r\n    Black: 'black',\r\n    Green: 'green',\r\n    Red: 'red',\r\n  };\r\n  public static readonly MaxWidthDefault = 200;\r\n}\r\n","<template>\r\n  <div\r\n    :ref=\"refs.element\"\r\n    :class=\"{ pointer: trigger === TooltipSettings.Trigger.Click }\"\r\n  >\r\n    <slot></slot>\r\n  </div>\r\n</template>\r\n<script lang=\"ts\" setup>\r\nimport tippy, { type Instance, type Placement, type Props } from 'tippy.js';\r\nimport { nextTick, onBeforeUnmount, onMounted, ref, toRefs } from 'vue';\r\nimport { TooltipSettings } from '@/models/TooltipSettings';\r\nimport { watch } from 'vue';\r\n\r\nexport interface TooltipExpose {\r\n  show(): void;\r\n  hide(): void;\r\n}\r\ndefineExpose<TooltipExpose>({ hide, show });\r\n\r\nexport interface TooltipComponentProps {\r\n  content: string;\r\n  hideOnClick?: boolean;\r\n  showOnCreate?: boolean;\r\n  trigger?: string;\r\n  theme?: string;\r\n  placement?: Placement | string;\r\n  maxWidth?: string | number;\r\n  duration?: number | [number | null, number | null];\r\n  timeout?: number;\r\n}\r\nconst props = withDefaults(defineProps<TooltipComponentProps>(), {\r\n  hideOnClick: true,\r\n  showOnCreate: false,\r\n  trigger: undefined,\r\n  theme: TooltipSettings.Theme.Blue,\r\n  placement: TooltipSettings.Placement.Top,\r\n  maxWidth: TooltipSettings.MaxWidthDefault,\r\n  duration: undefined,\r\n  timeout: undefined,\r\n});\r\n\r\nconst {\r\n  content,\r\n  hideOnClick,\r\n  showOnCreate,\r\n  trigger,\r\n  theme,\r\n  placement,\r\n  maxWidth,\r\n  duration,\r\n  timeout,\r\n} = toRefs(props);\r\n\r\nconst refs = {\r\n  element: ref<HTMLElement>(),\r\n};\r\n\r\nconst popover = ref<Instance<Props> | undefined>();\r\nlet timeoutId: number | undefined;\r\n\r\nfunction show(): void {\r\n  popover.value?.show();\r\n  if (timeout?.value) {\r\n    timeoutId = window.setTimeout(() => popover.value?.hide(), timeout!.value);\r\n  }\r\n}\r\n\r\nfunction hide(): void {\r\n  popover.value?.hide();\r\n}\r\n\r\nfunction create(): void {\r\n  popover.value = tippy(refs.element.value as HTMLElement, {\r\n    content: content.value,\r\n    hideOnClick: hideOnClick?.value,\r\n    showOnCreate: showOnCreate?.value,\r\n    trigger: trigger?.value,\r\n    theme: theme?.value,\r\n    placement: placement?.value as Placement,\r\n    maxWidth: maxWidth?.value,\r\n    duration: duration?.value,\r\n  });\r\n}\r\n\r\nfunction destroy(): void {\r\n  if (timeoutId) {\r\n    clearTimeout(timeoutId);\r\n  }\r\n}\r\n\r\nwatch(\r\n  [\r\n    content,\r\n    hideOnClick,\r\n    showOnCreate,\r\n    trigger,\r\n    theme,\r\n    placement,\r\n    maxWidth,\r\n    duration,\r\n    timeout,\r\n  ],\r\n  () => {\r\n    destroy();\r\n\r\n    const isShown = popover.value?.state.isShown;\r\n    hide();\r\n    popover.value = undefined;\r\n\r\n    create();\r\n    if (isShown) {\r\n      show();\r\n    }\r\n  },\r\n);\r\n\r\nonMounted(() => {\r\n  nextTick(() => {\r\n    create();\r\n  });\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  destroy();\r\n});\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.pointer {\r\n  cursor: pointer;\r\n}\r\n</style>\r\n","<template>\r\n  <TooltipComponent v-if=\"active\" v-bind=\"props\">\r\n    <slot />\r\n  </TooltipComponent>\r\n  <div v-else>\r\n    <slot />\r\n  </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { toRefs } from 'vue';\r\nimport type { TooltipComponentProps } from './TooltipComponent.vue';\r\nimport TooltipComponent from './TooltipComponent.vue';\r\n\r\ninterface TooltipConditionalProps extends TooltipComponentProps {\r\n  active: boolean;\r\n}\r\n\r\nconst props = defineProps<TooltipConditionalProps>();\r\nconst { active } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <component\r\n    :is=\"componentType\"\r\n    v-bind=\"isRouterLink ? (props as RouterLinkProps) : linkAttributes\"\r\n    class=\"d-flex align-items-center\"\r\n    :class=\"{\r\n      'm-button o-button--disabled': disabled && isStyledAsButton,\r\n      'u-disabled': disabled && !isStyledAsButton,\r\n      'd-flex': !inline,\r\n    }\"\r\n  >\r\n    <MMaterialSymbol\r\n      v-if=\"icon\"\r\n      :symbol-name=\"icon\"\r\n      :size=\"iconSize ? iconSize : '20'\"\r\n      class=\"order-0 mr-1 mt-2_px\"\r\n      :class=\"{ 'order-2 ml-1 mr-0': iconPlacementEnd }\"\r\n    />\r\n    <slot class=\"order-1\"> {{ linkText }}</slot>\r\n  </component>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, toRefs, useAttrs, type ComputedRef } from 'vue';\r\nimport MMaterialSymbol from '../icons/MMaterialSymbol.vue';\r\nimport type { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport type { RouterLinkProps } from 'vue-router';\r\n\r\nexport interface MLinkProps extends RouterLinkProps {\r\n  linkText?: string;\r\n  target?: '_blank' | '_self' | '_parent' | '_top';\r\n  icon?: MaterialSymbolNames;\r\n  iconSize?: string;\r\n  iconPlacementEnd?: boolean;\r\n  disabled?: boolean;\r\n  inline?: boolean;\r\n}\r\n\r\nconst attrs = useAttrs();\r\n\r\nconst props = defineProps<MLinkProps>();\r\n\r\nconst { to, linkText, target, icon, iconPlacementEnd, disabled } =\r\n  toRefs(props);\r\n\r\nconst componentType: ComputedRef<string> = computed(() => {\r\n  return disabled.value && !isStyledAsButton.value\r\n    ? 'div'\r\n    : isExternalLink.value\r\n      ? 'a'\r\n      : 'router-link';\r\n});\r\n\r\nconst isStyledAsButton: ComputedRef<boolean> = computed(() => {\r\n  return (attrs.class as string)?.split(' ').includes('o-button');\r\n});\r\n\r\nconst isExternalLink: ComputedRef<boolean> = computed(() => {\r\n  return typeof to.value === 'string' && to.value.startsWith('http');\r\n});\r\n\r\nconst isRouterLink: ComputedRef<boolean> = computed(() => {\r\n  return componentType.value !== 'div' && !isExternalLink.value;\r\n});\r\n\r\nconst linkAttributes: ComputedRef<{\r\n  href: string | undefined;\r\n  target: string | undefined;\r\n}> = computed(() => {\r\n  if (disabled.value) {\r\n    return { href: undefined, target: undefined };\r\n  }\r\n\r\n  return { href: to.value as string, target: target.value };\r\n});\r\n</script>\r\n","<template>\r\n  <MLink v-if=\"hasAccess && !isDisabled\" v-bind=\"props\">\r\n    <slot></slot>\r\n  </MLink>\r\n\r\n  <TooltipConditional\r\n    v-else\r\n    :content=\"tooltipText\"\r\n    :active=\"!disableTooltip\"\r\n    theme=\"black\"\r\n    :class=\"[\r\n      isStyledAsButton ? 'm-button o-button--disabled' : 'u-disabled',\r\n      {\r\n        'd-inline': !isStyledAsButton && !disableTooltip,\r\n      },\r\n    ]\"\r\n    tabindex=\"0\"\r\n    aria-disabled=\"true\"\r\n    role=\"link\"\r\n  >\r\n    <slot></slot>\r\n  </TooltipConditional>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { computed, toRefs, useAttrs } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport TooltipConditional from '../TooltipConditional.vue';\r\nimport MLink, { type MLinkProps } from './links/MLink.vue';\r\nimport {\r\n  useRouter,\r\n  type RouteLocationNamedRaw,\r\n  type RouteLocationRaw,\r\n  type RouteLocationPathRaw,\r\n} from 'vue-router';\r\nimport type { RouteRecordNormalized } from 'vue-router';\r\n\r\nconst { t } = useI18n();\r\nconst router = useRouter();\r\nconst attrs = useAttrs();\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\ninterface RouterLinkGuardedProps extends MLinkProps {\r\n  disableTooltip?: boolean;\r\n  isDisabled?: boolean;\r\n  customTooltipText?: string;\r\n}\r\n\r\nconst props = defineProps<RouterLinkGuardedProps>();\r\nconst { to, disableTooltip, isDisabled, customTooltipText } = toRefs(props);\r\n\r\nconst isStyledAsButton = computed<boolean>(() => {\r\n  return (attrs.class as string)?.split(' ').includes('o-button');\r\n});\r\n\r\nconst hasAccess = computed<boolean>(() => {\r\n  const destRoute = router\r\n    .getRoutes()\r\n    .find(\r\n      (route) =>\r\n        isMatchByName(to.value, route) || isMatchByPath(to.value, route),\r\n    );\r\n\r\n  return destRoute\r\n    ? memberProfileStore.hasEffectiveAccessToRoute(destRoute)\r\n    : true;\r\n});\r\n\r\nconst tooltipText = computed<string>(() => {\r\n  return customTooltipText.value ?? t('components.routerLinkGuarded.tooltip');\r\n});\r\n\r\nfunction isMatchByName(\r\n  to: RouteLocationRaw,\r\n  existingRoute: RouteRecordNormalized,\r\n): boolean {\r\n  const toName = (to as RouteLocationNamedRaw).name?.toString();\r\n  return !!toName && toName === existingRoute.name;\r\n}\r\n\r\nfunction isMatchByPath(\r\n  to: RouteLocationRaw,\r\n  existingRoute: RouteRecordNormalized,\r\n): boolean {\r\n  const toPath = (to as RouteLocationPathRaw).path;\r\n  if (!toPath) {\r\n    return false;\r\n  }\r\n\r\n  const toPathTrailingSlash = toPath.endsWith('/') ? toPath : `${toPath}/`;\r\n  return (\r\n    toPath === existingRoute.path || toPathTrailingSlash === existingRoute.path\r\n  );\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.u-disabled,\r\n.o-button--disabled,\r\n#unity2-app .o-button--disabled {\r\n  cursor: default !important;\r\n  pointer-events: unset !important;\r\n}\r\n</style>\r\n","<template>\r\n  <li class=\"dropdown-nav__item d-flex\">\r\n    <a v-if=\"url\" :href=\"url\" class=\"dropdown-nav__link t-body-large\">\r\n      <slot></slot>\r\n      {{ linkContent }}\r\n    </a>\r\n\r\n    <RouterLinkGuarded\r\n      v-else-if=\"routeName\"\r\n      :to=\"{ name: routeName }\"\r\n      class=\"dropdown-nav__link t-body-large\"\r\n      disable-tooltip\r\n    >\r\n      <slot></slot>\r\n      {{ linkContent }}\r\n    </RouterLinkGuarded>\r\n\r\n    <slot v-else></slot>\r\n  </li>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport RouterLinkGuarded from '@/components/common/RouterLinkGuarded.vue';\r\n\r\nconst props = defineProps<{\r\n  linkContent?: string;\r\n  url?: string;\r\n  routeName?: string;\r\n}>();\r\n\r\nconst { linkContent, url } = toRefs(props);\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.dropdown-nav {\r\n  &__item {\r\n    align-items: center;\r\n    height: 48px;\r\n    border-top: 1px solid $sodra-black-10;\r\n\r\n    @media (max-width: $unity-lg-breakpoint) {\r\n      text-align: left;\r\n    }\r\n  }\r\n\r\n  &__link {\r\n    color: $sodra-black-60;\r\n\r\n    @media (max-width: $unity-lg-breakpoint) {\r\n      display: block;\r\n      width: 100%;\r\n      height: auto;\r\n    }\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div>\r\n    <div v-if=\"title || titleIcon\" class=\"d-flex align-items-center\">\r\n      <MMaterialSymbol\r\n        v-if=\"titleIcon\"\r\n        :symbol-name=\"titleIcon\"\r\n        size=\"20\"\r\n        class=\"me-1\"\r\n      />\r\n      <div v-if=\"title\" class=\"t-alt-label-small\" :class=\"titleClass\">\r\n        {{ title }}\r\n      </div>\r\n    </div>\r\n\r\n    <div class=\"t-label-medium u-color-black\" :class=\"labelClass\">\r\n      {{ label }}\r\n    </div>\r\n\r\n    <div>\r\n      <div v-if=\"infoLabel\" class=\"t-alt-label-small mt-2 mb-1\">\r\n        {{ infoLabel }}\r\n      </div>\r\n      <slot name=\"info\">\r\n        <div class=\"t-body-small\" :class=\"infoClass\">{{ info }}</div>\r\n      </slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport type { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\n\r\nconst props = defineProps<{\r\n  title?: string;\r\n  titleIcon?: MaterialSymbolNames;\r\n  titleClass?: string;\r\n  label: string;\r\n  labelClass?: string;\r\n  info?: string;\r\n  infoLabel?: string;\r\n  infoClass?: string;\r\n}>();\r\n\r\nconst {\r\n  title,\r\n  titleIcon,\r\n  titleClass,\r\n  label,\r\n  labelClass,\r\n  info,\r\n  infoLabel,\r\n  infoClass,\r\n} = toRefs(props);\r\n</script>\r\n","export enum PageType {\r\n  Unknown = 0,\r\n  StartPage = 5,\r\n  ExternalUrlPage = 10,\r\n  ContentPage = 15,\r\n  GroupPage = 20,\r\n}\r\n","import { PageType } from '@/models/content/PageType';\r\nimport type { ProfileProxyDetails } from '@/models/memberProfile/ProfileProxy';\r\nimport type { Route } from '@/models/memberProfile/Route';\r\n\r\nexport function formatProxyProfileDetails(\r\n  details: ProfileProxyDetails[],\r\n): string {\r\n  return details.map((d) => d.title).join(', ');\r\n}\r\n\r\nexport function toRoutesAvailableInMenu(\r\n  filteredRoutes: Route[],\r\n  route: Route,\r\n): Route[] {\r\n  const filteredChildRoutes: Route[] =\r\n    route.routes?.reduce(toRoutesAvailableInMenu, []) ?? [];\r\n\r\n  if (route.pageType === PageType.GroupPage && !filteredChildRoutes.length) {\r\n    return filteredRoutes;\r\n  }\r\n\r\n  if (route.showInMenu && route.hasAccess) {\r\n    filteredRoutes.push({ ...route, routes: filteredChildRoutes });\r\n  }\r\n\r\n  return filteredRoutes;\r\n}\r\n","export interface FeatureFlag {\r\n  name: string;\r\n  isEnabled: boolean;\r\n  useEpiserverRouteAsFallback: boolean;\r\n}\r\n\r\nexport enum FeatureFlagName {\r\n  MapNotes = 'MapNotes',\r\n  MapValuableWater = 'MapValuableWater',\r\n  MyMapPerformedActivity = 'MyMapPerformedActivity',\r\n  MyMapProposedActivity = 'MyMapProposedActivity',\r\n  MyMapPerformProposedActivity = 'MyMapPerformProposedActivity',\r\n  MyMapDeleteActivity = 'MyMapDeleteActivity',\r\n  MyMapEditCompartmentComment = 'MyMapEditCompartmentComment',\r\n  MyMapEditCompartment = 'MyMapEditCompartment',\r\n  MyMapManagePlan = 'MyMapManagePlan',\r\n  MyMapReportCalculation = 'MyMapReportCalculation',\r\n  MyMapProjection = 'MyMapProjection',\r\n  MyMapCompartmentCycle = 'MyMapCompartmentCycle',\r\n  MemberProduction = 'MemberProduction',\r\n  MemberProductionAssortments = 'MemberProductionAssortments',\r\n  MemberProductionAssortmentsPowerBi = 'MemberProductionAssortmentsPowerBi',\r\n  MemberProductionMap = 'MemberProductionMap',\r\n  RoleManagement = 'RoleManagement',\r\n  CertificationStatus = 'CertificationStatus',\r\n  CertificationStatusDownloadCertifications = 'CertificationStatusDownloadCertifications',\r\n  PriceConditions = 'PriceConditions',\r\n  Accounts = 'Accounts',\r\n  Eudr = 'Eudr',\r\n  TimberManagerViol3Opportunity = 'TimberManagerViol3Opportunity',\r\n  TimberManagerViol3Delivery = 'TimberManagerViol3Delivery',\r\n  TimberManagerViol3 = 'TimberManagerViol3',\r\n  TimberManagerViol2Opportunity = 'TimberManagerViol2Opportunity',\r\n  TimberManagerViol2Delivery = 'TimberManagerViol2Delivery',\r\n  TimberManagerViol2 = 'TimberManagerViol2',\r\n  PriceCalculation = 'PriceCalculation',\r\n  ProfileEconomics = 'ProfileEconomics',\r\n  ProfileEconomicsChart = 'ProfileEconomicsChart',\r\n  EconomicDevelopment = 'EconomicDevelopment',\r\n  CapitalTrade = 'CapitalTrade',\r\n}\r\n","import type { ItemWithLoadingStatus } from './ItemWithLoadingStatus';\r\nimport { getMinutesBetweenDates } from '@/utils/Dates';\r\n\r\ninterface Item<T> extends ItemWithLoadingStatus<T> {\r\n  id?: any;\r\n}\r\n\r\nexport class CommonStore<T> {\r\n  public item: Item<T> = {\r\n    data: null,\r\n    loading: {\r\n      isLoading: false,\r\n      isError: false,\r\n      error: undefined,\r\n      loadingPromise: null,\r\n      loadDate: null,\r\n    },\r\n  };\r\n\r\n  private settings: { freshMinutes: number };\r\n\r\n  constructor(settings: { freshMinutes: number }) {\r\n    this.settings = settings;\r\n  }\r\n\r\n  // -----------------\r\n  // ### Mutations ###\r\n  // -----------------\r\n\r\n  public setLoading(payload: { id?: any; loadingPromise: Promise<any> }): void {\r\n    this.item.data = null;\r\n    this.item.id = payload.id;\r\n\r\n    this.item.loading.isLoading = true;\r\n    this.item.loading.isError = false;\r\n    this.item.loading.error = undefined;\r\n    this.item.loading.loadingPromise = payload.loadingPromise;\r\n  }\r\n\r\n  public setLoadingComplete(payload: { id?: any; data: T }): void {\r\n    this.item.data = payload.data;\r\n    this.item.id = payload.id;\r\n\r\n    this.item.loading.isLoading = false;\r\n    this.item.loading.isError = false;\r\n    this.item.loading.error = undefined;\r\n    this.item.loading.loadDate = new Date();\r\n  }\r\n\r\n  public setStaleData(): void {\r\n    this.item.loading.isLoading = false;\r\n    this.item.loading.isError = false;\r\n    this.item.loading.error = undefined;\r\n    this.item.loading.loadDate = null;\r\n  }\r\n\r\n  public setLoadingError(payload?: { id?: any; error?: any }): void {\r\n    this.item.data = null;\r\n    this.item.id = payload?.id;\r\n\r\n    this.item.loading.isLoading = false;\r\n    this.item.loading.isError = true;\r\n    this.item.loading.error = payload?.error;\r\n    this.item.loading.loadDate = null;\r\n  }\r\n\r\n  public clearData() {\r\n    this.item.data = null;\r\n    this.item.id = null;\r\n  }\r\n\r\n  public clearLoading(): void {\r\n    this.item.loading.isLoading = false;\r\n    this.item.loading.isError = false;\r\n    this.item.loading.error = null;\r\n  }\r\n\r\n  //\r\n  // Helper functions\r\n  //\r\n  public hasFreshData(id?: any): boolean {\r\n    if (this.item.id !== id) {\r\n      return false;\r\n    }\r\n\r\n    return this.checkIsDataFresh();\r\n  }\r\n\r\n  public currentlyLoadingPromise(id?: any): Promise<T> | null {\r\n    if (\r\n      this.item.id === id &&\r\n      this.item.loading.isLoading &&\r\n      this.item.loading.loadingPromise !== null\r\n    ) {\r\n      return this.item.loading.loadingPromise;\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private checkIsDataFresh(): boolean {\r\n    return (\r\n      this.item.data !== null &&\r\n      this.item.loading.loadDate !== null &&\r\n      getMinutesBetweenDates(this.item.loading.loadDate, new Date()) <=\r\n        this.settings.freshMinutes\r\n    );\r\n  }\r\n}\r\n","import { BaseServiceDefinition } from './BaseService';\r\nimport type { FeatureManagement } from '@/models/featureManagement/FeatureManagement';\r\n\r\nclass FeatureManagementService extends BaseServiceDefinition {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  public async getFeatureManagement(): Promise<FeatureManagement> {\r\n    try {\r\n      const response = await this.get('/api/v1/featureManagement/');\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n}\r\n\r\nconst featureManagementService: FeatureManagementService =\r\n  new FeatureManagementService();\r\n\r\nexport default featureManagementService;\r\n","import { defineStore } from 'pinia';\r\nimport { reactive, toRefs } from 'vue';\r\nimport { CommonStore } from './common/CommonStore';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { FeatureManagement } from '@/models/featureManagement/FeatureManagement';\r\nimport featureManagementService from '@/services/FeatureManagementService';\r\nimport type { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\n\r\nexport const featureManagementStoreId = 'featureManagement';\r\n\r\nexport const useFeatureManagementStore = defineStore(\r\n  featureManagementStoreId,\r\n  () => {\r\n    const common = reactive(\r\n      new CommonStore<FeatureManagement>({ freshMinutes: 360 }),\r\n    );\r\n\r\n    const actions = {\r\n      async load(): Promise<any> {\r\n        // If recently loaded, return\r\n        if (common.hasFreshData() && common.item !== null) {\r\n          return Promise.resolve();\r\n        }\r\n\r\n        const currentlyLoadingPromise = common.currentlyLoadingPromise();\r\n        if (currentlyLoadingPromise !== null) {\r\n          Logger.debug(\r\n            'Already loading, waiting for existing load to finish',\r\n            'featureManagement',\r\n          );\r\n          return currentlyLoadingPromise;\r\n        }\r\n\r\n        const loadingPromise = featureManagementService\r\n          .getFeatureManagement()\r\n          .then((response) => {\r\n            common.setLoadingComplete({ data: response });\r\n            Logger.debug('Load feature management success', response);\r\n            return Promise.resolve();\r\n          })\r\n          .catch((error) => {\r\n            Logger.warn('Load feature management failed', error);\r\n            common.setLoadingError({ error });\r\n            return Promise.reject(error);\r\n          });\r\n        common.setLoading({ loadingPromise });\r\n        return loadingPromise;\r\n      },\r\n\r\n      isEnabled(featureFlagName: FeatureFlagName): boolean {\r\n        return (\r\n          common.item.data?.featureFlags.some((featureFlag) => {\r\n            return (\r\n              featureFlag.name === featureFlagName && featureFlag.isEnabled\r\n            );\r\n          }) === true\r\n        );\r\n      },\r\n\r\n      shouldOnlyUseEpiserverRoute(featureFlagName: FeatureFlagName): boolean {\r\n        return (\r\n          common.item.data?.featureFlags.some((featureFlag) => {\r\n            return (\r\n              featureFlag.name === featureFlagName &&\r\n              !featureFlag.isEnabled &&\r\n              featureFlag.useEpiserverRouteAsFallback\r\n            );\r\n          }) === true\r\n        );\r\n      },\r\n    };\r\n\r\n    return {\r\n      ...toRefs(common.item),\r\n      ...actions,\r\n    };\r\n  },\r\n);\r\n","export enum DetailsRouteNames {\r\n  HomePage = 'Details_HomePage',\r\n  ConfirmOrUpdate = 'Details_ConfirmOrUpdateDetailsPage',\r\n  EconomicsHome = 'Economics_HomePage',\r\n}\r\n","<template>\r\n  <MDropdownNavList\r\n    hide-on-click-outside\r\n    @close=\"emit('close')\"\r\n    id=\"unity2-app\"\r\n    class=\"overflow-sm-auto overflow-md-hidden\"\r\n  >\r\n    <MDropdownNavListItem\r\n      :route-name=\"DetailsRouteNames.HomePage\"\r\n      :link-content=\"t('sidebar.links.detailsHome')\"\r\n      class=\"px-4\"\r\n    >\r\n      <MMaterialSymbol\r\n        size=\"24\"\r\n        :symbol-name=\"MaterialSymbolNames.Contact\"\r\n        class=\"u-color-black me-2_5\"\r\n      />\r\n    </MDropdownNavListItem>\r\n\r\n    <MDropdownNavListItem\r\n      :route-name=\"DetailsRouteNames.EconomicsHome\"\r\n      :link-content=\"t('sidebar.links.economicsHome')\"\r\n      class=\"px-4\"\r\n    >\r\n      <MMaterialSymbol\r\n        size=\"24\"\r\n        :symbol-name=\"MaterialSymbolNames.Contribution\"\r\n        class=\"u-color-black me-2_5\"\r\n      />\r\n    </MDropdownNavListItem>\r\n\r\n    <MDropdownNavListItem\r\n      :url=\"' '\"\r\n      :link-content=\"t('sidebar.logout')\"\r\n      @click.prevent=\"logout()\"\r\n      class=\"px-4 order-last\"\r\n    >\r\n      <MMaterialSymbol\r\n        size=\"24\"\r\n        :symbol-name=\"MaterialSymbolNames.LogOut\"\r\n        class=\"u-color-black me-2_5\"\r\n      />\r\n    </MDropdownNavListItem>\r\n\r\n    <!-- TODO: Remove \"v-if\" from element below AND the \"v-else\" element when removing the RoleManagement feature flag from source code. -->\r\n    <!-- TODO: continued: the empty v-else item is added to not mess up style when feature flag is disabled -->\r\n    <MDropdownNavListItem\r\n      v-if=\"featureManagementStore.isEnabled(FeatureFlagName.RoleManagement)\"\r\n      class=\"p-2 text-wrap\"\r\n      :class=\"{ 'h-unset flex-column': !!currentProxy }\"\r\n    >\r\n      <div v-if=\"currentProxy\" class=\"u-background-color-yellow-20 p-3 w-100\">\r\n        <ProxyProfileInfoItem\r\n          :title=\"t('header.changeProfile.currentProfileTitle')\"\r\n          :title-icon=\"MaterialSymbolNames.Group\"\r\n          title-class=\"u-color-black\"\r\n          :label=\"currentProxy!.giverContactName\"\r\n          label-class=\"mt-2\"\r\n          :info=\"formatProxyProfileDetails(currentProxy!.details)\"\r\n          info-class=\"u-color-sodra-black-60\"\r\n        />\r\n      </div>\r\n\r\n      <div class=\"w-100 p-3 pb-lg-2\">\r\n        <button\r\n          @click.prevent=\"emit('changeProfile')\"\r\n          class=\"o-text-link t-body-large\"\r\n        >\r\n          {{ t('header.changeProfile.chooseOther') }}\r\n        </button>\r\n      </div>\r\n    </MDropdownNavListItem>\r\n    <MDropdownNavListItem class=\"d-md-none\" v-else />\r\n  </MDropdownNavList>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { EventBus, EventLogout } from '@/utils/EventBus';\r\nimport { computed } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport MDropdownNavList from '../common/list/MDropdownNavList.vue';\r\nimport MDropdownNavListItem from '../common/list/MDropdownNavListItem.vue';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport type { ProfileProxy } from '@/models/memberProfile/ProfileProxy';\r\nimport ProxyProfileInfoItem from './changeProfile/ProxyProfileInfoItem.vue';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { formatProxyProfileDetails } from '@/utils/memberProfile/memberProfileUtils';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { useFeatureManagementStore } from '@/stores/featureManagementStore';\r\nimport { DetailsRouteNames } from '@/features/details/router/routeNames';\r\n\r\nconst { t } = useI18n();\r\nconst memberProfileStore = useMemberProfileStore();\r\nconst featureManagementStore = useFeatureManagementStore();\r\n\r\nconst currentProxy = computed<ProfileProxy | undefined>(\r\n  () => memberProfileStore.currentProxy,\r\n);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'close'): void;\r\n  (e: 'changeProfile'): void;\r\n}>();\r\n\r\nfunction logout() {\r\n  EventBus.emit(EventLogout);\r\n}\r\n</script>\r\n","export class StyleBreakpoints {\r\n  public static readonly Sm = 580;\r\n  public static readonly Md = 768;\r\n  public static readonly Lg = 992;\r\n  public static readonly Xl = 1260;\r\n  public static readonly Xxl = 1400;\r\n  public static readonly PageSidebarWidth = 390;\r\n}\r\n\r\nexport type StyleBreakpointName = 'sm' | 'md' | 'lg' | 'xl' | 'xxl';\r\n","import UAParser from 'ua-parser-js';\r\n\r\nexport const DeviceTypes = {\r\n  MOBILE: 'mobile',\r\n  TABLET: 'tablet',\r\n  SMARTTV: 'smarttv',\r\n  CONSOLE: 'console',\r\n  WEARABLE: 'wearable',\r\n  EMBEDDED: 'embedded',\r\n\r\n  DESKTOP: undefined,\r\n};\r\n\r\nexport function getDeviceType(): keyof typeof DeviceTypes {\r\n  const userAgentParser = new UAParser();\r\n  const device = userAgentParser.getDevice();\r\n  return device.type;\r\n}\r\n\r\nexport function isDesktopDevice(): boolean {\r\n  return getDeviceType() === DeviceTypes.DESKTOP;\r\n}\r\n\r\nexport function isMobileDevice(): boolean {\r\n  return getDeviceType() === DeviceTypes.MOBILE;\r\n}\r\n","export enum UnityModalType {\r\n  Default = '',\r\n  Info = 'c-modal--info',\r\n  Attention = 'c-modal--attention',\r\n  Error = 'c-modal--error',\r\n  Success = 'c-modal--success',\r\n}\r\n","<template>\r\n  <div\r\n    class=\"o-loader\"\r\n    :class=\"{\r\n      'o-loader--white': !grey,\r\n      'o-loader--absolute': absolute,\r\n      'o-loader--small': size === 'small',\r\n      'o-loader--xs': size === 'xs',\r\n    }\"\r\n  >\r\n    <div v-if=\"text || addedText\" class=\"mt-2\">\r\n      {{ text }}\r\n      <div v-if=\"addedText\">{{ addedText }}</div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { LoadingTextIfSlow } from '@/models/LoadingTextIfSlow';\r\nimport { ref, toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  text?: string;\r\n  grey?: boolean;\r\n  absolute?: boolean;\r\n  size?: 'xs' | 'small' | 'medium';\r\n  textIfSlow?: LoadingTextIfSlow;\r\n}>();\r\n\r\nconst { text, grey, absolute, size, textIfSlow } = toRefs(props);\r\n\r\nconst addedText = ref<string | undefined>(undefined);\r\n\r\nfunction initialize(): void {\r\n  addedText.value = undefined;\r\n\r\n  if (textIfSlow.value) {\r\n    setTimeout(() => {\r\n      addedText.value = textIfSlow.value?.text;\r\n    }, textIfSlow.value.afterTimeInMs);\r\n  }\r\n}\r\n\r\ninitialize();\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n#unity2-app {\r\n  .o-loader.o-loader--small:before {\r\n    width: 20px;\r\n    height: 20px;\r\n    border-width: 4px;\r\n  }\r\n  .o-loader.o-loader--xs:before {\r\n    width: 16px;\r\n    height: 16px;\r\n    border-width: 3px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <Teleport to=\"body\">\r\n    <div v-show=\"showModal\" id=\"unity2-app\">\r\n      <div\r\n        :id=\"id\"\r\n        class=\"c-modal\"\r\n        :class=\"[\r\n          type,\r\n          {\r\n            'is-mobile': !isDesktop,\r\n            'mobile-bottom': !isDesktop && mobileBottomPlacement,\r\n          },\r\n        ]\"\r\n        :data-closable=\"\r\n          (closeableByOutsideClickAndEscKey &&\r\n            !preventCloseDefault &&\r\n            !loading) ??\r\n          false\r\n        \"\r\n      >\r\n        <div\r\n          class=\"c-modal__dialog\"\r\n          :class=\"{\r\n            'c-modal__dialog--lg': large,\r\n          }\"\r\n        >\r\n          <div\r\n            v-if=\"loading\"\r\n            class=\"position-absolute d-flex flex-column align-items-center justfy-content-center w-100 h-100 z-index-sticky max-height-inherit\"\r\n          >\r\n            <LoaderComponent\r\n              :text=\"loadingText\"\r\n              :text-if-slow=\"loadingTextIfSlow\"\r\n              grey\r\n              class=\"my-auto\"\r\n            />\r\n          </div>\r\n\r\n          <div\r\n            class=\"c-modal__content d-flex flex-column\"\r\n            :class=\"{\r\n              'white-opacity-filter': showBottomWarning || loading,\r\n              'pb-0': !showFooter,\r\n              'overflow-visible': bottomWarningOverflowVisible,\r\n            }\"\r\n          >\r\n            <div\r\n              v-if=\"!hideHeader\"\r\n              class=\"c-modal__header d-flex justify-content-between align-items-center max-height-inherit\"\r\n            >\r\n              <div\r\n                v-if=\"backButton\"\r\n                class=\"clickable\"\r\n                @click.prevent=\"onBackClick\"\r\n              >\r\n                <MMaterialSymbol\r\n                  size=\"24\"\r\n                  class=\"mt-2_px\"\r\n                  :symbol-name=\"MaterialSymbolNames.ArrowBack\"\r\n                />\r\n              </div>\r\n\r\n              <div class=\"d-flex gap-2 align-items-center\">\r\n                <MMaterialSymbol\r\n                  v-if=\"titleIconSymbolName\"\r\n                  :symbol-name=\"titleIconSymbolName\"\r\n                  size=\"22\"\r\n                />\r\n\r\n                <label\r\n                  class=\"c-modal__title\"\r\n                  :class=\"{\r\n                    'u-truncate': truncateTitle,\r\n                  }\"\r\n                >\r\n                  <slot name=\"title\">\r\n                    <span v-if=\"smallTitle\" class=\"t-title-medium\">\r\n                      {{ title }}\r\n                    </span>\r\n                    <template v-else>{{ title }}</template>\r\n                  </slot>\r\n                </label>\r\n              </div>\r\n              <div\r\n                v-if=\"closeButton\"\r\n                class=\"clickable\"\r\n                @click.prevent=\"onCloseClick\"\r\n              >\r\n                <MMaterialSymbol\r\n                  size=\"24\"\r\n                  class=\"mt-2_px\"\r\n                  :symbol-name=\"MaterialSymbolNames.Close\"\r\n                />\r\n              </div>\r\n            </div>\r\n            <div\r\n              v-if=\"!hideBody\"\r\n              :ref=\"refs.modalBody\"\r\n              class=\"c-modal__body d-block h-100 max-height-inherit overflow-y-auto\"\r\n              :class=\"{\r\n                'box-shadow--bottom-inset': showBodyBottomBoxShadow,\r\n                'c-modal__body-loading': loading,\r\n              }\"\r\n            >\r\n              <slot></slot>\r\n            </div>\r\n            <div v-if=\"showFooter\" class=\"c-modal__footer max-height-inherit\">\r\n              <div class=\"c-modal__footer__content\">\r\n                <slot name=\"footer\"></slot>\r\n              </div>\r\n            </div>\r\n\r\n            <template v-if=\"showBottomWarning\">\r\n              <div\r\n                class=\"position-absolute bottom-0 z-index-2 w-100 mh-100vh overflow-y-auto\"\r\n              >\r\n                <slot name=\"bottom-warning\"></slot>\r\n              </div>\r\n            </template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </Teleport>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { isDesktopDevice } from '@/utils/UserAgentParser';\r\nimport { nextTick, ref, toRefs, type Ref } from 'vue';\r\nimport { UnityModalType } from '@/models/modal/UnityModalType';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport MMaterialSymbol from '../icons/MMaterialSymbol.vue';\r\nimport LoaderComponent from '@/components/LoaderComponent.vue';\r\nimport type { LoadingTextIfSlow } from '@/models/LoadingTextIfSlow';\r\n\r\nexport interface ModalExpose {\r\n  show(): void;\r\n  hide(): void;\r\n}\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    id: string;\r\n    title?: string | null;\r\n    large?: boolean;\r\n    showFooter?: boolean;\r\n    closeableByOutsideClickAndEscKey?: boolean;\r\n    closeButton?: boolean;\r\n    backButton?: boolean;\r\n    truncateTitle?: boolean;\r\n    smallTitle?: boolean;\r\n    hideHeader?: boolean;\r\n    hideBody?: boolean;\r\n    type?: UnityModalType;\r\n    mobileBottomPlacement?: boolean;\r\n    showBottomWarning?: boolean;\r\n    preventCloseDefault?: boolean;\r\n    showOnInitialize?: boolean;\r\n    loading?: boolean;\r\n    loadingText?: string;\r\n    loadingTextIfSlow?: LoadingTextIfSlow;\r\n    showModal?: boolean;\r\n    bottomWarningOverflowVisible?: boolean;\r\n    titleIconSymbolName?: MaterialSymbolNames;\r\n  }>(),\r\n  {\r\n    hideHeader: false,\r\n    hideBody: false,\r\n    title: undefined,\r\n    type: UnityModalType.Default,\r\n    showBottomWarning: false,\r\n    preventCloseDefault: false,\r\n    showOnInitialize: false,\r\n    loadingText: undefined,\r\n    loadingTextIfSlow: undefined,\r\n    showModal: true,\r\n    bottomWarningOverflowVisible: false,\r\n    titleIconSymbolName: undefined,\r\n  },\r\n);\r\n\r\nconst {\r\n  id,\r\n  title,\r\n  large,\r\n  closeableByOutsideClickAndEscKey,\r\n  closeButton,\r\n  backButton,\r\n  truncateTitle,\r\n  smallTitle,\r\n  showBottomWarning,\r\n  preventCloseDefault,\r\n  showOnInitialize,\r\n  showFooter,\r\n} = toRefs(props);\r\n\r\nconst refs = {\r\n  modalBody: ref<HTMLElement | undefined>(),\r\n};\r\n\r\nconst showBodyBottomBoxShadow: Ref<boolean> = ref(false);\r\nconst resizeObserver = new ResizeObserver(() => updateHasScrollbar());\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'close'): void;\r\n  (e: 'back'): void;\r\n}>();\r\n\r\nconst exposed: ModalExpose = {\r\n  show,\r\n  hide,\r\n};\r\n\r\ndefineExpose(exposed);\r\n\r\nfunction updateHasScrollbar() {\r\n  nextTick(() => {\r\n    if (!refs.modalBody.value) {\r\n      return;\r\n    }\r\n\r\n    showBodyBottomBoxShadow.value =\r\n      showFooter.value &&\r\n      refs.modalBody.value.scrollHeight > refs.modalBody.value.clientHeight;\r\n  });\r\n}\r\n\r\nconst isDesktop: boolean = isDesktopDevice();\r\n\r\nfunction show(): void {\r\n  dispathWindowEventForModal(true);\r\n  updateHasScrollbar();\r\n  if (refs.modalBody.value) {\r\n    resizeObserver.observe(refs.modalBody.value);\r\n  }\r\n}\r\n\r\nfunction hide(): void {\r\n  if (refs.modalBody.value) {\r\n    resizeObserver.unobserve(refs.modalBody.value);\r\n  }\r\n  dispathWindowEventForModal(false);\r\n}\r\n\r\nfunction onBackClick(): void {\r\n  emit('back');\r\n}\r\n\r\nfunction onCloseClick(): void {\r\n  if (!preventCloseDefault.value) {\r\n    hide();\r\n  }\r\n  emit('close');\r\n}\r\n\r\nfunction dispathWindowEventForModal(openNotClose: boolean): void {\r\n  const eventType = openNotClose ? 'openUnityModal' : 'closeUnityModal';\r\n  const event = new CustomEvent(eventType, {\r\n    detail: { targetModal: '#' + id.value },\r\n  });\r\n  document.dispatchEvent(event);\r\n}\r\n\r\nfunction initialize(): void {\r\n  if (showOnInitialize.value) {\r\n    nextTick(() => {\r\n      show();\r\n    });\r\n  }\r\n}\r\n\r\ninitialize();\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n$modal-x-spacer: $spacer-4;\r\n#unity2-app {\r\n  .c-modal {\r\n    &__header {\r\n      border-bottom: 0;\r\n      padding: $spacer-1 $modal-x-spacer;\r\n    }\r\n\r\n    &__dialog {\r\n      padding: 0;\r\n      width: 620px;\r\n      max-width: 100%;\r\n\r\n      &--lg {\r\n        width: 1032px;\r\n      }\r\n    }\r\n\r\n    &__content {\r\n      padding: $spacer-4 0;\r\n      border: none;\r\n      max-height: 100vh;\r\n\r\n      @media (min-height: 880px) {\r\n        max-height: 880px;\r\n      }\r\n    }\r\n\r\n    &__body {\r\n      padding: 0 $modal-x-spacer $spacer-4;\r\n\r\n      &-loading {\r\n        min-height: 100px;\r\n      }\r\n    }\r\n\r\n    &__footer {\r\n      padding-top: $spacer-4;\r\n      border-top: $border-light;\r\n\r\n      &__content {\r\n        padding: 0 $modal-x-spacer;\r\n      }\r\n    }\r\n\r\n    &__title {\r\n      cursor: default;\r\n      padding-bottom: 0;\r\n    }\r\n\r\n    &.is-mobile {\r\n      .c-modal__content {\r\n        max-height: 100dvh;\r\n      }\r\n      &.mobile-bottom {\r\n        .c-modal__dialog {\r\n          position: absolute;\r\n          bottom: 0;\r\n          width: 100%;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n","import { defineStore } from 'pinia';\r\n\r\ninterface State {\r\n  fullscreen: boolean;\r\n}\r\n\r\nexport const fullscreenStoreId = 'fullscreen';\r\n\r\nexport const useFullscreenStore = defineStore(fullscreenStoreId, {\r\n  state: (): State => ({ fullscreen: false }),\r\n\r\n  actions: {\r\n    setFullscreen(value: boolean) {\r\n      this.fullscreen = value;\r\n    },\r\n  },\r\n});\r\n","export enum PageFeatureType {\r\n  TimberManagerV2 = 'TimberManagerV2',\r\n  TimberManagerV3 = 'TimberManagerV3',\r\n  Documents = 'Documents',\r\n  MyMap = 'MyMap',\r\n  Production = 'Production',\r\n  SodraEl = 'SodraEl',\r\n  Support = 'Support',\r\n  Proxy = 'Proxy',\r\n  Profile = 'Profile',\r\n  EconomicProfile = 'EconomicProfile',\r\n  Certification = 'Certification',\r\n  PriceConditions = 'PriceConditions',\r\n  Accounts = 'Accounts',\r\n  PriceCalculation = 'PriceCalculation',\r\n  EconomicDevelopment = 'EconomicDevelopment',\r\n  CapitalTrade = 'CapitalTrade',\r\n}\r\n","import { type PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { BaseServiceDefinition } from './BaseService';\r\nimport type { Page } from '@/models/content/Page';\r\nimport type { StatusContainer } from '@/models/pageFeature/StatusContainer';\r\n\r\nclass PagesService extends BaseServiceDefinition {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  public getPage(\r\n    pageId: number,\r\n    includeChildren: boolean,\r\n    includeContent: boolean,\r\n  ): Promise<Page> {\r\n    return this.get(`/api/v1/pages/${pageId}`, {\r\n      params: {\r\n        includeChildren,\r\n        includeContent,\r\n      },\r\n    })\r\n      .then((response) => {\r\n        return response.data;\r\n      })\r\n      .catch((error) => {\r\n        return Promise.reject(error);\r\n      });\r\n  }\r\n\r\n  public getHomePage(): Promise<Page> {\r\n    return this.get('/api/v1/pages/startpage')\r\n      .then((response) => {\r\n        return response.data;\r\n      })\r\n      .catch((error) => {\r\n        return Promise.reject(error);\r\n      });\r\n  }\r\n\r\n  public getPublicHomePage(): Promise<Page> {\r\n    return this.get('/api/v1/pages/publicstartpage')\r\n      .then((response) => {\r\n        return response.data;\r\n      })\r\n      .catch((error) => {\r\n        return Promise.reject(error);\r\n      });\r\n  }\r\n\r\n  public getPageStatus(type: PageFeatureType): Promise<StatusContainer> {\r\n    return this.get(`/api/v1/pages/status/${type}`)\r\n      .then((response) => {\r\n        return response.data;\r\n      })\r\n      .catch((error) => {\r\n        return Promise.reject(error);\r\n      });\r\n  }\r\n}\r\n\r\nconst pagesService: PagesService = new PagesService();\r\n\r\nexport default pagesService;\r\n","import { defineStore } from 'pinia';\r\nimport { reactive } from 'vue';\r\nimport { CommonArrayStore } from './common/CommonArrayStore';\r\nimport type { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport pagesService from '@/services/PagesService';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type {\r\n  Message,\r\n  StatusContainer,\r\n} from '@/models/pageFeature/StatusContainer';\r\n\r\nexport const pageStatusStoreId = 'pageStatus';\r\n\r\nexport const usePageStatusStore = defineStore(pageStatusStoreId, () => {\r\n  const common = reactive(\r\n    new CommonArrayStore<StatusContainer, PageFeatureType>({ freshMinutes: 5 }),\r\n  );\r\n\r\n  const overrideOfflines = reactive<PageFeatureType[]>([]);\r\n\r\n  const getters = {\r\n    isOffline(type: PageFeatureType): boolean {\r\n      return !!common.getDataFor(type)?.offlineStatus.isOffline;\r\n    },\r\n    getOfflineMessage(type: PageFeatureType): string {\r\n      return common.getDataFor(type)?.offlineStatus.message ?? '';\r\n    },\r\n    isOverrideOffline(type: PageFeatureType): boolean {\r\n      return overrideOfflines.indexOf(type) >= 0;\r\n    },\r\n    getMessages(type: PageFeatureType): Message[] {\r\n      return common.getDataFor(type)?.messages ?? [];\r\n    },\r\n  };\r\n\r\n  const actions = {\r\n    dispatchLoad(type: PageFeatureType): Promise<StatusContainer> {\r\n      if (common.hasFreshDataFor(type)) {\r\n        Logger.debug(`Page status for ${type} already loaded`);\r\n        return Promise.resolve(common.getDataFor(type)!);\r\n      }\r\n\r\n      const currentlyLoadingPromise = common.currentlyLoadingPromise(type);\r\n      if (currentlyLoadingPromise != null) {\r\n        return currentlyLoadingPromise;\r\n      }\r\n\r\n      const loadingPromise = pagesService\r\n        .getPageStatus(type)\r\n        .then((statusContainer) => {\r\n          Logger.debug(`Page status for ${type} loaded`, statusContainer);\r\n          common.setLoadingComplete({\r\n            id: type,\r\n            data: statusContainer,\r\n          });\r\n          return Promise.resolve(statusContainer);\r\n        })\r\n        .catch((error) => {\r\n          common.setLoadingError({ id: type, error });\r\n          return Promise.reject(error);\r\n        });\r\n\r\n      common.setLoading({ id: type, loadingPromise });\r\n      return loadingPromise;\r\n    },\r\n\r\n    overrideOffline(type: PageFeatureType): void {\r\n      if (overrideOfflines.indexOf(type) < 0) {\r\n        overrideOfflines.push(type);\r\n      }\r\n    },\r\n\r\n    restoreOverrideOffline(type: PageFeatureType): void {\r\n      const index = overrideOfflines.indexOf(type);\r\n      if (index >= 0) {\r\n        overrideOfflines.splice(index, 1);\r\n      }\r\n    },\r\n  };\r\n\r\n  return {\r\n    data: common.items,\r\n    ...getters,\r\n    ...actions,\r\n  };\r\n});\r\n","import { defineStore } from 'pinia';\r\nimport { reactive, toRefs } from 'vue';\r\n\r\nexport const startupStoreId = 'startup';\r\n\r\nexport const useStartupStore = defineStore(startupStoreId, () => {\r\n  const state = reactive({\r\n    initialized: false,\r\n    initializeError: false,\r\n  });\r\n\r\n  const actions = {\r\n    initialize(): void {\r\n      state.initialized = true;\r\n    },\r\n    error(): void {\r\n      state.initializeError = true;\r\n    },\r\n  };\r\n\r\n  return {\r\n    ...toRefs(state),\r\n    ...actions,\r\n  };\r\n});\r\n","import { authStoreId } from '@/stores/authStore';\r\nimport { featureManagementStoreId } from '@/stores/featureManagementStore';\r\nimport { fullscreenStoreId } from '@/stores/fullscreenStore';\r\nimport { memberProfileStoreId } from '@/stores/memberProfileStore';\r\nimport { pageStatusStoreId } from '@/stores/pageStatusStore';\r\nimport { startupStoreId } from '@/stores/startupStore';\r\nimport { getActivePinia, type Pinia, type Store } from 'pinia';\r\n\r\ninterface ExtendedPinia extends Pinia {\r\n  _s: Map<string, Store>;\r\n}\r\n\r\n/**\r\n * Disposes all of the currently initialized Pinia stores, except the ones\r\n * whose ID matches the input IDs.\r\n * Based on https://github.com/vuejs/pinia/discussions/911\r\n * @param storeIdsToExclude A list of store IDs that should not be reset.\r\n */\r\nfunction disposeAllStoresExcept(storeIdsToExclude: string[]): void {\r\n  const pinia = getActivePinia() as ExtendedPinia;\r\n\r\n  if (!pinia) {\r\n    return;\r\n  }\r\n\r\n  const exceptIdsSet = new Set(storeIdsToExclude);\r\n  pinia._s.forEach((store) => {\r\n    if (!exceptIdsSet.has(store.$id)) {\r\n      store.$dispose();\r\n\r\n      // Must also delete state of store after disposing it.\r\n      // https://pinia.vuejs.org/api/interfaces/pinia._StoreWithState.html#-dispose\r\n      delete pinia.state.value[store.$id];\r\n    }\r\n  });\r\n}\r\n\r\nfunction disposeNonEssentialStores(): void {\r\n  disposeAllStoresExcept([\r\n    memberProfileStoreId,\r\n    authStoreId,\r\n    startupStoreId,\r\n    featureManagementStoreId,\r\n    pageStatusStoreId,\r\n    fullscreenStoreId,\r\n  ]);\r\n}\r\n\r\nexport const storeUtil = {\r\n  disposeNonEssentialStores,\r\n};\r\n","export enum UnityAlertType {\r\n  Info = 'c-alert--info',\r\n  Attention = 'c-alert--attention',\r\n  Warning = 'c-alert--warning',\r\n  Error = 'c-alert--error',\r\n  Success = 'c-alert--success',\r\n  Black = 'c-alert--black',\r\n  Black5 = 'c-alert--black-5',\r\n}\r\n","<template>\r\n  <button\r\n    type=\"button\"\r\n    class=\"o-button m-button\"\r\n    :class=\"modifierClasses\"\r\n    :disabled=\"disabled\"\r\n  >\r\n    <span v-if=\"loader\" class=\"o-loader\"></span>\r\n    <slot></slot>\r\n  </button>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs, type ComputedRef, computed } from 'vue';\r\n\r\nexport type ButtonColors =\r\n  | 'white'\r\n  | 'black'\r\n  | 'primary'\r\n  | 'secondary'\r\n  | 'danger'\r\n  | 'light-grey'\r\n  | 'red'\r\n  | 'red-20'\r\n  | 'yellow'\r\n  | 'green'\r\n  | 'green-50'\r\n  | 'blue-20'\r\n  | 'blue-50'\r\n  | 'blue';\r\n// TODO: Seems to be some differences in which colors normal vs round button in Unity supports?\r\n\r\nexport type BorderColors = 'black-15' | 'black-70';\r\n\r\nexport interface MButtonProps {\r\n  background?: ButtonColors;\r\n  border?: BorderColors;\r\n  image?: boolean;\r\n  round?: boolean;\r\n  disabled?: boolean;\r\n  forwardIcon?: boolean;\r\n  bounce?: boolean;\r\n  back?: boolean;\r\n  loader?: boolean;\r\n  smallBorderRadius?: boolean;\r\n  noBorderRadius?: boolean;\r\n  size?: 'sm' | 'md';\r\n  color?: 'red';\r\n}\r\n\r\nconst prefix = 'o-button';\r\n\r\nconst props = defineProps<MButtonProps>();\r\n\r\nconst {\r\n  background,\r\n  border,\r\n  image,\r\n  round,\r\n  disabled,\r\n  forwardIcon,\r\n  bounce,\r\n  back,\r\n  loader,\r\n  smallBorderRadius,\r\n  noBorderRadius,\r\n  size,\r\n  color,\r\n} = toRefs(props);\r\n\r\nconst modifierClasses: ComputedRef<string[]> = computed(() => {\r\n  const classes: string[] = [];\r\n\r\n  // Unity modifiers\r\n  if (background?.value) {\r\n    classes.push(\r\n      `${round.value ? 'o-round-button' : 'o-button'}--${background.value}`,\r\n    );\r\n  }\r\n  if (round.value) {\r\n    classes.push('o-round-button');\r\n  }\r\n  if (size?.value) {\r\n    classes.push(`${prefix}${size.value === 'sm' ? '--small' : '--medium'}`);\r\n  }\r\n  if (forwardIcon.value) {\r\n    classes.push(`${prefix}--forward-icon`);\r\n  }\r\n  if (bounce.value) {\r\n    classes.push(`${prefix}--bounce`);\r\n  }\r\n  if (back.value) {\r\n    classes.push(`${prefix}--back`);\r\n  }\r\n\r\n  // Custom modifiers\r\n  if (smallBorderRadius.value) {\r\n    classes.push(`${prefix}--small-border-radius`);\r\n  }\r\n  if (noBorderRadius.value) {\r\n    classes.push(`${prefix}--no-border-radius`);\r\n  }\r\n  if (border?.value) {\r\n    classes.push(`${prefix}--border-${border.value}`);\r\n  }\r\n  if (image?.value) {\r\n    classes.push(`${prefix}--image`);\r\n  }\r\n\r\n  if (color?.value) {\r\n    classes.push(`u-color-${color.value}`);\r\n  }\r\n\r\n  if (disabled?.value && !background?.value) {\r\n    classes.push(\r\n      border.value\r\n        ? `${prefix}--unstyled-disabled`\r\n        : `${prefix}--secondary disabled u-border-none`,\r\n    );\r\n  }\r\n\r\n  return classes;\r\n});\r\n</script>\r\n","<template>\r\n  <div\r\n    :class=\"[\r\n      `c-alert ${type}`,\r\n      {\r\n        'c-alert--with-close-button': closeButton,\r\n        'c-alert--slim t-body-medium': slim,\r\n      },\r\n    ]\"\r\n    class=\"d-flex align-items-center justify-content-between\"\r\n  >\r\n    <div\r\n      class=\"d-flex align-items-center\"\r\n      :class=\"{ 'u-ellipsis': textEllipsis }\"\r\n    >\r\n      <LoaderComponent v-if=\"loader\" size=\"small\" grey class=\"me-2\" />\r\n\r\n      <MMaterialSymbol\r\n        v-if=\"icon\"\r\n        :symbol-name=\"icon\"\r\n        :size=\"slim ? '20' : '24'\"\r\n        class=\"me-2\"\r\n        :class=\"{ 'top-0': slim }\"\r\n      ></MMaterialSymbol>\r\n\r\n      <div\r\n        class=\"c-alert__text\"\r\n        :class=\"{\r\n          'u-ellipsis u-min-width-0': textEllipsis,\r\n          't-label-medium': bold,\r\n        }\"\r\n      >\r\n        <slot>\r\n          <span v-if=\"text\">\r\n            {{ text }}\r\n          </span>\r\n\r\n          <span v-if=\"linkUrl && linkText\" class=\"ml-1\"\r\n            ><a class=\"u-color-link\" :href=\"linkUrl\" target=\"_blank\">{{\r\n              linkText\r\n            }}</a>\r\n          </span>\r\n        </slot>\r\n      </div>\r\n    </div>\r\n\r\n    <div v-if=\"closeButton\" class=\"c-alert__close-button\">\r\n      <MButton background=\"black\" size=\"sm\" @click=\"emit('close')\">{{\r\n        closeButton.text\r\n      }}</MButton>\r\n    </div>\r\n\r\n    <span\r\n      v-else-if=\"close\"\r\n      class=\"c-alert__close\"\r\n      :class=\"{ 'c-alert__close-slim': slim }\"\r\n      @click=\"emit('close')\"\r\n    >\r\n    </span>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { UnityAlertType } from '@/models/alert/UnityAlertType';\r\nimport { computed, onUnmounted, toRefs } from 'vue';\r\nimport MButton from '../common/buttons/MButton.vue';\r\nimport LoaderComponent from '../LoaderComponent.vue';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\n\r\nexport interface CloseButton {\r\n  text: string;\r\n}\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    text?: string;\r\n    type?: UnityAlertType;\r\n    icon?: string | undefined | null;\r\n    loader?: boolean;\r\n    close?: boolean | CloseButton;\r\n    /** Close alert timer (milliseconds) */\r\n    closeTimer?: number;\r\n    textEllipsis?: boolean;\r\n    slim?: boolean;\r\n    bold?: boolean;\r\n    linkUrl?: string;\r\n    linkText?: string;\r\n  }>(),\r\n  {\r\n    type: UnityAlertType.Black,\r\n    icon: MaterialSymbolNames.Info,\r\n    close: undefined,\r\n    closeTimer: undefined,\r\n    text: undefined,\r\n    slim: false,\r\n    bold: false,\r\n    linkUrl: undefined,\r\n    linkText: undefined,\r\n  },\r\n);\r\n\r\nconst { text, type, icon, loader, close, closeTimer } = toRefs(props);\r\n\r\nlet timeoutId: number | undefined = undefined;\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'close'): void;\r\n}>();\r\n\r\nconst closeButton = computed<CloseButton | null>(() =>\r\n  typeof close.value === 'object' ? (close.value as CloseButton) : null,\r\n);\r\n\r\nfunction setTimedCloseEvent(milliseconds: number) {\r\n  timeoutId = window.setTimeout(() => {\r\n    emit('close');\r\n  }, milliseconds);\r\n}\r\n\r\nonUnmounted(() => clearTimeout(timeoutId));\r\n\r\nfunction initialize() {\r\n  if (!closeTimer?.value) {\r\n    return;\r\n  }\r\n\r\n  setTimedCloseEvent(closeTimer.value);\r\n}\r\n\r\ninitialize();\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n.c-alert {\r\n  z-index: 45;\r\n  padding-top: $spacer-2_5 !important;\r\n  padding-bottom: $spacer-2_5 !important;\r\n\r\n  &--with-close-button {\r\n    padding-right: $spacer-3;\r\n  }\r\n\r\n  &--slim {\r\n    padding: $spacer-2 10px !important;\r\n  }\r\n\r\n  &__close-button {\r\n    margin-top: -$spacer-1;\r\n    margin-bottom: -$spacer-1;\r\n    margin-left: -$spacer-1;\r\n  }\r\n\r\n  &__close {\r\n    top: unset !important;\r\n    line-height: 13px;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <div\r\n    class=\"c-list__item\"\r\n    :class=\"{ 'py-2_5': !smallerPadding, 'py-2': smallerPadding }\"\r\n  >\r\n    <div\r\n      class=\"d-flex justify-content-between u-color-black\"\r\n      :class=\"{\r\n        't-label-medium': bold,\r\n        't-body-medium': !bold,\r\n        'align-items-center': alignItemsCenter,\r\n      }\"\r\n    >\r\n      <div\r\n        class=\"d-flex\"\r\n        :class=\"{\r\n          'o-text-link': externalUrl || clickable,\r\n          'w-50': alignLeft && slots.right,\r\n          'align-items-center': alignItemsCenter,\r\n        }\"\r\n        @click=\"onItemClick\"\r\n      >\r\n        <a v-if=\"externalUrl\" :href=\"externalUrl\" target=\"_blank\">\r\n          <slot></slot>\r\n        </a>\r\n        <slot v-else></slot>\r\n      </div>\r\n      <div v-if=\"slots.right\" class=\"ms-3\" :class=\"{ 'w-50': alignLeft }\">\r\n        <slot name=\"right\"></slot>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs, useSlots } from 'vue';\r\n\r\nconst slots = useSlots();\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    clickable?: boolean;\r\n    externalUrl?: string;\r\n    bold?: boolean;\r\n    alignLeft?: boolean;\r\n    smallerPadding?: boolean;\r\n    alignItemsCenter?: boolean;\r\n  }>(),\r\n  {\r\n    clickable: false,\r\n    externalUrl: '',\r\n    bold: false,\r\n    alignLeft: false,\r\n    smallerPadding: false,\r\n    alignItemsCenter: true,\r\n  },\r\n);\r\n\r\nconst {\r\n  clickable,\r\n  externalUrl,\r\n  bold,\r\n  alignLeft,\r\n  smallerPadding,\r\n  alignItemsCenter,\r\n} = toRefs(props);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'click'): void;\r\n}>();\r\n\r\nfunction onItemClick(): void {\r\n  if (clickable.value) {\r\n    emit('click');\r\n  }\r\n}\r\n</script>\r\n","<template>\r\n  <p class=\"mb-0\" :class=\"[typographyClass, { 'u-text-muted': textMuted }]\">\r\n    <i18n-t :keypath=\"textKeyPath\" scope=\"global\">\r\n      <template #link>\r\n        <a\r\n          v-if=\"link.href\"\r\n          :href=\"link.href\"\r\n          target=\"_blank\"\r\n          class=\"o-text-link\"\r\n        >\r\n          {{ t(linkKeyPath) }}\r\n        </a>\r\n        <router-link\r\n          v-else-if=\"link.to\"\r\n          :to=\"link.to\"\r\n          @click.prevent=\"emit('linkClick')\"\r\n        >\r\n          {{ t(linkKeyPath) }}\r\n        </router-link>\r\n      </template>\r\n    </i18n-t>\r\n  </p>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useI18n } from 'vue-i18n';\r\nimport type { RouteLocationNamedRaw } from 'vue-router';\r\n\r\nconst { t } = useI18n();\r\n\r\nwithDefaults(\r\n  defineProps<{\r\n    link:\r\n      | { to: RouteLocationNamedRaw; href?: never }\r\n      | { href: string; to?: never };\r\n    textKeyPath: string;\r\n    linkKeyPath: string;\r\n    typographyClass?: string;\r\n    textMuted?: boolean;\r\n  }>(),\r\n  {\r\n    typographyClass: 't-body-regular-sans-serif',\r\n  },\r\n);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'linkClick'): void;\r\n}>();\r\n</script>\r\n","export enum RouteNames {\r\n  Home = 'Proxies_HomePage',\r\n  CreateProxy = 'Proxies_CreateProxyModal',\r\n  ReplaceProxy = 'Proxies_ReplaceProxyModal',\r\n  Proxy = 'Proxies_ProxyPage',\r\n  RegisterProxyUser = 'Proxies_RegisterProxyUserPage',\r\n  RegisterProxyUserCallback = 'Proxies_RegisterProxyUserCallbackPage',\r\n}\r\n","<template>\r\n  <hr class=\"o-line o-line--thin\" :class=\"`u-background-color-${background}`\" />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = withDefaults(\r\n  defineProps<{\r\n    background?: 'sodra-black-10' | 'sodra-black-15';\r\n  }>(),\r\n  {\r\n    background: 'sodra-black-10',\r\n  },\r\n);\r\n\r\nconst { background } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <MModal\r\n    id=\"changeProfileModal\"\r\n    :title=\"changeProfileSuccess ? undefined : tBasePath('modal.title')\"\r\n    :ref=\"refs.modal\"\r\n    :close-button=\"!loading && !changeProfileSuccess\"\r\n    :closeable-by-outside-click-and-esc-key=\"!loading && !changeProfileSuccess\"\r\n    :show-footer=\"changeProfileSuccess\"\r\n    mobile-bottom-placement\r\n  >\r\n    <LoaderComponent\r\n      v-if=\"loading\"\r\n      :text=\"tBasePath('modal.loading')\"\r\n      class=\"w-100\"\r\n    />\r\n\r\n    <div\r\n      v-else-if=\"!isError && changeProfileSuccess\"\r\n      class=\"d-flex justify-content-center\"\r\n    >\r\n      <h4 class=\"text-center\">\r\n        <template v-if=\"memberProfileStore.isUsingProxy\"\r\n          >{{ tBasePath('modal.success.changedToProxy') }}\r\n          <span>{{ effectiveProfile?.name }}</span>\r\n        </template>\r\n        <template v-else>{{\r\n          tBasePath('modal.success.changedToMyProfile')\r\n        }}</template>\r\n        <MMaterialSymbol\r\n          :symbol-name=\"MaterialSymbolNames.CheckCircle\"\r\n          size=\"32\"\r\n          class=\"ms-1 u-color-sodra-green\"\r\n        />\r\n      </h4>\r\n    </div>\r\n\r\n    <div v-else :ref=\"refs.scrollTarget\">\r\n      <ProxyProfileInfoItem\r\n        :title=\"tBasePath('currentProfileTitle')\"\r\n        title-class=\"mb-2\"\r\n        :label=\"effectiveProfile!.name\"\r\n        :info=\"\r\n          memberProfileStore.isUsingProxy\r\n            ? formatProxyProfileDetails(currentProxy!.details)\r\n            : tBasePath('modal.myProfile')\r\n        \"\r\n        class=\"mb-3 p-3 u-border--sm u-border-color-black-15\"\r\n      />\r\n\r\n      <section class=\"d-flex flex-column gap-3\">\r\n        <h6 class=\"d-flex mb-0\">\r\n          <span>\r\n            {{ tBasePath('modal.availableProfiles.title') }}\r\n          </span>\r\n          <button\r\n            v-if=\"hasProxies\"\r\n            @click=\"emit('showInfoClick')\"\r\n            type=\"button\"\r\n            class=\"ms-1\"\r\n            :title=\"tBasePath('modal.availableProfiles.readMore')\"\r\n          >\r\n            <MMaterialSymbol\r\n              :symbol-name=\"MaterialSymbolNames.Help\"\r\n              size=\"20\"\r\n            />\r\n          </button>\r\n        </h6>\r\n\r\n        <div v-if=\"!hideHelpText && hasProxies && !currentProxy\">\r\n          <MTextWithLink\r\n            :link=\"{ to: { name: ProxyRouteNames.Home } }\"\r\n            :text-key-path=\"`${i18nBasePath}.modal.help.text`\"\r\n            :link-key-path=\"`${i18nBasePath}.modal.help.link`\"\r\n            typography-class=\"t-body-medium\"\r\n            @link-click=\"hide\"\r\n          />\r\n        </div>\r\n\r\n        <MAlert\r\n          v-if=\"isError\"\r\n          :type=\"UnityAlertType.Error\"\r\n          :text=\"tBasePath('modal.error')\"\r\n        />\r\n\r\n        <MCompactList v-if=\"availableProfiles.length\" border-bottom>\r\n          <template v-for=\"(profile, index) in availableProfiles\" :key=\"index\">\r\n            <MCompactListItem v-if=\"profile.show\">\r\n              <ProxyProfileInfoItem\r\n                :label=\"profile.name\"\r\n                :info-label=\"tBasePath('modal.permissions')\"\r\n                class=\"flex-grow-1\"\r\n              >\r\n                <template #info>\r\n                  <p\r\n                    v-if=\"isDetailsString(profile.details)\"\r\n                    class=\"t-body-small m-0\"\r\n                  >\r\n                    {{ profile.details }}\r\n                  </p>\r\n                  <template v-else>\r\n                    <p\r\n                      v-for=\"(detail, detailIndex) in profile.details\"\r\n                      :key=\"detailIndex\"\r\n                      class=\"t-body-small m-0\"\r\n                    >\r\n                      {{ detail.title }}\r\n                    </p>\r\n                  </template>\r\n                </template>\r\n              </ProxyProfileInfoItem>\r\n\r\n              <template #right>\r\n                <MButton @click.prevent=\"profile.use()\" background=\"primary\">\r\n                  {{ t('common.choose') }}\r\n                </MButton>\r\n              </template>\r\n            </MCompactListItem>\r\n          </template>\r\n        </MCompactList>\r\n\r\n        <template v-else>\r\n          <MLine class=\"my-0\" />\r\n          <span class=\"t-body-large u-color-sodra-black-60\">\r\n            {{ tBasePath('modal.noAvailableProfiles') }}\r\n          </span>\r\n        </template>\r\n      </section>\r\n    </div>\r\n\r\n    <template #footer>\r\n      <div class=\"d-flex gap-3\">\r\n        <MButton\r\n          v-if=\"currentProxy\"\r\n          @click=\"useMyProfile()\"\r\n          background=\"secondary\"\r\n        >\r\n          {{ tBasePath('modal.footer.useMyProfile') }}\r\n        </MButton>\r\n        <MButton @click=\"hide()\" background=\"primary\" class=\"flex-grow-1\">\r\n          {{ tBasePath('modal.footer.continue') }}\r\n        </MButton>\r\n      </div>\r\n    </template>\r\n  </MModal>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, nextTick } from 'vue';\r\nimport MModal, { type ModalExpose } from '@/components/common/modal/MModal.vue';\r\nimport { RouteNames } from '@/router/routeNames';\r\nimport {\r\n  useMemberProfileStore,\r\n  type TriggerChangeProfileModalOptions,\r\n} from '@/stores/memberProfileStore';\r\nimport type {\r\n  ProfileProxy,\r\n  ProfileProxyDetails,\r\n} from '@/models/memberProfile/ProfileProxy';\r\nimport { useRouter } from 'vue-router';\r\nimport { storeUtil } from '@/utils/StoreUtil';\r\nimport { UnityAlertType } from '@/models/alert/UnityAlertType';\r\nimport MAlert from '@/components/common/MAlert.vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport ProxyProfileInfoItem from './ProxyProfileInfoItem.vue';\r\nimport MButton from '@/components/common/buttons/MButton.vue';\r\nimport LoaderComponent from '@/components/LoaderComponent.vue';\r\nimport MCompactList from '@/components/common/list/MCompactList.vue';\r\nimport MCompactListItem from '@/components/common/list/MCompactListItem.vue';\r\nimport { formatProxyProfileDetails } from '@/utils/memberProfile/memberProfileUtils';\r\nimport MTextWithLink from '@/components/common/MTextWithLink.vue';\r\nimport { RouteNames as ProxyRouteNames } from '@/features/proxy/router/routeNames';\r\nimport MLine from '@/components/common/MLine.vue';\r\nimport { Logger } from '@/utils/Logger';\r\n\r\ninterface ProfileItem {\r\n  name: string;\r\n  details: ProfileProxyDetails[] | string;\r\n  show: boolean;\r\n  use: (proxy?: ProfileProxy) => void;\r\n}\r\n\r\nconst i18nBasePath = 'header.changeProfile';\r\nconst { t } = useI18n();\r\nconst tBasePath = (key: string) => t(`${i18nBasePath}.${key}`);\r\n\r\nconst memberProfileStore = useMemberProfileStore();\r\nconst router = useRouter();\r\n\r\nconst refs = {\r\n  modal: ref<ModalExpose>(),\r\n  scrollTarget: ref<HTMLDivElement>(),\r\n};\r\n\r\nconst isError = ref(false);\r\nconst loading = ref(false);\r\nconst hideHelpText = ref(false);\r\nconst changeProfileSuccess = ref(false);\r\n\r\nconst myProfile = computed(() => memberProfileStore.myProfile);\r\nconst effectiveProfile = computed(() => memberProfileStore.effectiveProfile);\r\nconst currentProxy = computed<ProfileProxy | undefined>(\r\n  () => memberProfileStore.currentProxy,\r\n);\r\nconst hasProxies = computed(() => memberProfileStore.hasProxies);\r\n\r\nconst availableProfiles = computed<ProfileItem[]>(() => {\r\n  if (!myProfile.value || !hasProxies.value) {\r\n    return [];\r\n  }\r\n\r\n  const proxyProfiles: ProfileItem[] =\r\n    myProfile.value?.proxies.map((proxy) => {\r\n      return {\r\n        name: proxy.giverContactName,\r\n        details: proxy.details,\r\n        show: currentProxy.value?.giverContactId !== proxy.giverContactId,\r\n        use: () => useProxyProfile(proxy),\r\n      };\r\n    }) ?? [];\r\n\r\n  const mine: ProfileItem = {\r\n    name: myProfile.value.name,\r\n    details: tBasePath('modal.myProfile'),\r\n    show: memberProfileStore.isUsingProxy,\r\n    use: useMyProfile,\r\n  };\r\n\r\n  return [mine, ...proxyProfiles];\r\n});\r\n\r\nfunction isDetailsString(\r\n  details: ProfileProxyDetails[] | string,\r\n): details is string {\r\n  return typeof details === 'string';\r\n}\r\n\r\nasync function useMyProfile(): Promise<void> {\r\n  await useProfile(() => memberProfileStore.useMyProfile());\r\n}\r\n\r\nasync function useProxyProfile(proxy: ProfileProxy): Promise<void> {\r\n  await useProfile(() => memberProfileStore.useProxyProfile(proxy));\r\n}\r\n\r\nasync function useProfile(loadProfile: () => Promise<void>): Promise<void> {\r\n  changeProfileSuccess.value = false;\r\n  isError.value = false;\r\n  loading.value = true;\r\n  try {\r\n    await loadProfile();\r\n    await router.push({ name: RouteNames.Home });\r\n    storeUtil.disposeNonEssentialStores();\r\n    changeProfileSuccess.value = true;\r\n  } catch {\r\n    isError.value = true;\r\n  } finally {\r\n    loading.value = false;\r\n    nextTick(() => refs.scrollTarget.value?.scrollIntoView(true));\r\n  }\r\n}\r\n\r\nconst show = (\r\n  options: TriggerChangeProfileModalOptions = {\r\n    hideHelpText: false,\r\n    changeProfileSuccess: false,\r\n  },\r\n): void => {\r\n  changeProfileSuccess.value = options.changeProfileSuccess;\r\n  isError.value = false;\r\n  hideHelpText.value = options.hideHelpText;\r\n  refs.modal.value?.show();\r\n};\r\nconst hide = (): void => refs.modal.value?.hide();\r\n\r\ndefineExpose({\r\n  hide,\r\n  show,\r\n} as ModalExpose);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'showInfoClick'): void;\r\n}>();\r\n\r\nmemberProfileStore.$onAction(({ name, after, args }) => {\r\n  if (name !== 'triggerChangeProfileModal') {\r\n    return;\r\n  }\r\n\r\n  Logger.debug(\r\n    'Received triggerChangeProfileModal action. Showing change profile modal.',\r\n    args,\r\n  );\r\n\r\n  const hideHelpText =\r\n    (args?.[0] as TriggerChangeProfileModalOptions)?.hideHelpText ?? false;\r\n\r\n  const changeProfileSuccess =\r\n    (args?.[0] as TriggerChangeProfileModalOptions)?.changeProfileSuccess ??\r\n    false;\r\n\r\n  after(() => show({ hideHelpText, changeProfileSuccess }));\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.cursor-default {\r\n  cursor: default;\r\n}\r\n</style>\r\n","<template>\r\n  <MModal\r\n    id=\"changeProfileInfoModal\"\r\n    :ref=\"refs.modal\"\r\n    :title=\"tBasePath('title')\"\r\n    mobile-bottom-placement\r\n    close-button\r\n    closeable-by-outside-click-and-esc-key\r\n    back-button\r\n    @close=\"hide()\"\r\n    @back=\"emit('back')\"\r\n  >\r\n    <p class=\"t-body-large mb-3 u-color-sodra-black-60\">\r\n      {{ tBasePath('text') }}\r\n    </p>\r\n\r\n    <div\r\n      class=\"d-flex flex-column gap-3 pt-3 u-border-top u-border-color-black-10\"\r\n    >\r\n      <div v-for=\"(detail, index) in distinctProxyDetails\" :key=\"index\">\r\n        <p class=\"t-label-large\">{{ detail.title }}</p>\r\n        <p class=\"t-body-large u-color-sodra-black-60\">{{ detail.text }}</p>\r\n      </div>\r\n    </div>\r\n  </MModal>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport MModal, { type ModalExpose } from '@/components/common/modal/MModal.vue';\r\nimport type { ProfileProxyDetails } from '@/models/memberProfile/ProfileProxy';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { groupBy } from '@/utils/ArrayUtil';\r\nimport { ref, computed } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nconst { t } = useI18n();\r\nconst tBasePath = (key: string) => t(`header.changeProfile.infoModal.${key}`);\r\n\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nconst refs = {\r\n  modal: ref<ModalExpose>(),\r\n};\r\n\r\nconst distinctProxyDetails = computed<ProfileProxyDetails[]>(() => {\r\n  const allDetails =\r\n    memberProfileStore.myProfile?.proxies.flatMap((proxy) => proxy.details) ??\r\n    [];\r\n\r\n  const detailsMap = groupBy(allDetails, (detail) => detail.title);\r\n\r\n  const distinct: ProfileProxyDetails[] = [];\r\n  detailsMap.forEach((detail) => distinct.push(detail[0]));\r\n\r\n  return distinct.sort((a, b) => a.code - b.code);\r\n});\r\n\r\nconst show = () => {\r\n  refs.modal.value?.show();\r\n};\r\nconst hide = () => refs.modal.value?.hide();\r\n\r\ndefineExpose<ModalExpose>({\r\n  show,\r\n  hide,\r\n});\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'back'): void;\r\n}>();\r\n</script>\r\n","<template>\r\n  <div>\r\n    <ChangeProfileModal\r\n      :ref=\"refs.changeProfileModal\"\r\n      @show-info-click=\"onShowInfo\"\r\n    />\r\n\r\n    <ChangeProfileInfoModal\r\n      v-if=\"memberProfileStore.hasProxies\"\r\n      :ref=\"refs.changeProfileInfoModal\"\r\n      @back=\"onBackFromInfo\"\r\n    />\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { ref } from 'vue';\r\nimport ChangeProfileModal from './ChangeProfileModal.vue';\r\nimport ChangeProfileInfoModal from './ChangeProfileInfoModal.vue';\r\nimport type { ModalExpose } from '@/components/common/modal/MModal.vue';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\n\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nconst refs = {\r\n  changeProfileModal: ref<ModalExpose>(),\r\n  changeProfileInfoModal: ref<ModalExpose>(),\r\n};\r\n\r\nfunction onShowInfo(): void {\r\n  refs.changeProfileModal.value?.hide();\r\n  refs.changeProfileInfoModal.value?.show();\r\n}\r\n\r\nfunction onBackFromInfo(): void {\r\n  refs.changeProfileInfoModal.value?.hide();\r\n  refs.changeProfileModal.value?.show();\r\n}\r\n\r\nconst show = () => refs.changeProfileModal.value?.show();\r\ndefineExpose({\r\n  show,\r\n});\r\n</script>\r\n","<template>\r\n  <MCompactHeader\r\n    :logo-url=\"logoUrl\"\r\n    :logo-route-name=\"RouteNames.Home\"\r\n    class=\"d-print-none\"\r\n    id=\"page-header\"\r\n  >\r\n    <template #headerStart>\r\n      <MSodraHeaderLogo class=\"d-none d-xl-inline\" />\r\n\r\n      <MMenuButton\r\n        v-if=\"isAuthenticated && myProfile\"\r\n        class=\"menu-button d-flex d-xl-none clickable\"\r\n        :class=\"{\r\n          'd-none d-xl-flex': showProfileDropdown && !menuIconOnDesktop,\r\n        }\"\r\n        @click=\"emit('toggle-sidebar-menu')\"\r\n      />\r\n\r\n      <PageHeaderProfile\r\n        v-if=\"showProfileOnDropdownMobile\"\r\n        class=\"d-lg-none not-clickable\"\r\n        :profile=\"myProfile!\"\r\n        :is-using-proxy=\"isUsingProxy\"\r\n        override-mobile\r\n      />\r\n    </template>\r\n\r\n    <template v-if=\"isAuthenticated && myProfile\" #headerEnd>\r\n      <a\r\n        href=\"https://www.sodra.com\"\r\n        class=\"o-button u-float-left me-3 d-none d-lg-inline-flex u-border-color-black-15\"\r\n      >\r\n        {{ t('header.to_sodra') }}\r\n      </a>\r\n\r\n      <PageHeaderProfile\r\n        @click=\"toggleProfileMenu\"\r\n        :profile=\"myProfile!\"\r\n        :is-using-proxy=\"isUsingProxy\"\r\n        :desktop-only=\"showProfileDropdown\"\r\n      >\r\n        <HeaderDropdownNavList\r\n          v-if=\"showProfileDropdown\"\r\n          :profile=\"myProfile!\"\r\n          @close=\"showProfileDropdown = false\"\r\n          @change-profile=\"refs.changeProfileModalContainer.value?.show()\"\r\n        />\r\n      </PageHeaderProfile>\r\n\r\n      <template v-if=\"showProfileDropdown\">\r\n        <MMaterialSymbol\r\n          class=\"d-xl-none clickable\"\r\n          :class=\"{ 'd-none': menuIconOnDesktop }\"\r\n          size=\"24\"\r\n          :symbol-name=\"MaterialSymbolNames.Close\"\r\n          @click=\"toggleProfileMenu\"\r\n        />\r\n      </template>\r\n\r\n      <ChangeProfileModalContainer :ref=\"refs.changeProfileModalContainer\" />\r\n    </template>\r\n  </MCompactHeader>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport { toRefs, computed, ref } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport MCompactHeader from '@/components/common/header/MCompactHeader.vue';\r\nimport { useAuthStore } from '@/stores/authStore';\r\nimport MSodraHeaderLogo from '@/components/common/icons/MSodraHeaderLogo.vue';\r\nimport PageHeaderProfile from './PageHeaderProfile.vue';\r\nimport HeaderDropdownNavList from '@/components/header/HeaderDropdownNavList.vue';\r\nimport MMenuButton from '@/components/common/buttons/MMenuButton.vue';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport { StyleBreakpoints } from '@/models/StyleBreakpoints';\r\nimport { RouteNames } from '@/router/routeNames';\r\nimport ChangeProfileModalContainer from './changeProfile/ChangeProfileModalContainer.vue';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\n\r\nconst { t } = useI18n();\r\nconst authStore = useAuthStore();\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nconst props = defineProps<{\r\n  windowWidth: number;\r\n}>();\r\n\r\nconst { windowWidth } = toRefs(props);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'toggle-sidebar-menu'): void;\r\n}>();\r\n\r\nconst refs = {\r\n  changeProfileModalContainer: ref<{ show: () => void }>(),\r\n};\r\n\r\nconst showProfileDropdown = ref<boolean>(false);\r\n\r\nconst myProfile = computed<MemberProfile | null>(() => {\r\n  return memberProfileStore.myProfile;\r\n});\r\nconst isUsingProxy = computed<boolean>(() => {\r\n  return memberProfileStore.isUsingProxy;\r\n});\r\n\r\nconst isAuthenticated = computed<boolean>(() => {\r\n  return authStore.isAuthenticated;\r\n});\r\n\r\nconst menuIconOnDesktop = computed<boolean>(() => {\r\n  return (\r\n    windowWidth.value >= StyleBreakpoints.Lg &&\r\n    windowWidth.value < StyleBreakpoints.Xl\r\n  );\r\n});\r\n\r\nconst showProfileOnDropdownMobile = computed<boolean>(() => {\r\n  return (\r\n    !!myProfile.value && isAuthenticated.value && showProfileDropdown.value\r\n  );\r\n});\r\n\r\nconst logoUrl = computed<string | undefined>(() => {\r\n  return !showProfileDropdown.value || menuIconOnDesktop.value\r\n    ? '/img/sodra-logo.svg'\r\n    : undefined;\r\n});\r\n\r\nfunction toggleProfileMenu(): void {\r\n  showProfileDropdown.value = !showProfileDropdown.value;\r\n}\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.u-border-color-black-15 {\r\n  border-color: $sodra-black-15 !important;\r\n}\r\n</style>\r\n","export default class SidebarNavItem {\r\n  public route = '';\r\n  public url = '';\r\n  public text = '';\r\n  public icon = '';\r\n  public menuChip = '';\r\n  public externalUrl = '';\r\n  public children: Array<SidebarNavItem> | null = null;\r\n\r\n  public constructor(init?: Partial<SidebarNavItem>) {\r\n    Object.assign(this, init);\r\n  }\r\n}\r\n","import type SidebarNavItem from './SideBarNavItem';\r\n\r\nexport default class SidebarNavModel {\r\n  public heading? = '';\r\n  public items: Array<SidebarNavItem> | null = null;\r\n\r\n  public constructor(init?: Partial<SidebarNavModel>) {\r\n    Object.assign(this, init);\r\n  }\r\n}\r\n","export enum RouteNames {\r\n  Home = 'Support_HomePage',\r\n}\r\n","<template>\r\n  <div\r\n    class=\"c-sidebar-container\"\r\n    :class=\"{\r\n      'u-position-static': positionStatic,\r\n      'disable-scrollbar': disableScrollbar,\r\n      'c-sidebar-container--pinned': pinned,\r\n    }\"\r\n    :data-element-id=\"sidebarId\"\r\n    :aria-expanded=\"expanded\"\r\n  >\r\n    <div\r\n      class=\"c-sidebar py-0\"\r\n      :class=\"{ 'u-position-static': positionStatic }\"\r\n    >\r\n      <div class=\"c-sidebar__header\">\r\n        <slot name=\"header\"></slot>\r\n      </div>\r\n\r\n      <div class=\"sidebar__content\">\r\n        <slot name=\"content\"></slot>\r\n      </div>\r\n\r\n      <slot name=\"nav\"></slot>\r\n\r\n      <slot name=\"footer\"></slot>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  sidebarId?: string;\r\n  positionStatic?: boolean;\r\n  expanded?: boolean;\r\n  disableScrollbar?: boolean;\r\n  pinned?: boolean;\r\n}>();\r\n\r\nconst { sidebarId, positionStatic, expanded, disableScrollbar, pinned } =\r\n  toRefs(props);\r\n</script>\r\n","<template>\r\n  <div class=\"t-label-small p-1\" :class=\"theme\">\r\n    {{ text }}\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, toRefs } from 'vue';\r\n\r\ninterface ChipTheme {\r\n  backgroundColor: string;\r\n  textColor: string;\r\n}\r\n\r\ntype Color = 'green' | 'red' | 'muted';\r\n\r\nconst props = defineProps<{\r\n  text: string;\r\n  color: Color;\r\n}>();\r\n\r\nconst { text, color } = toRefs(props);\r\n\r\nconst themes: Record<Color, ChipTheme> = {\r\n  green: {\r\n    backgroundColor: 'u-background-color-sodra-green-20',\r\n    textColor: 'u-color-sodra-green',\r\n  },\r\n  red: {\r\n    backgroundColor: 'u-background-color-red-20',\r\n    textColor: 'u-color-red',\r\n  },\r\n  muted: {\r\n    backgroundColor: 'u-background-color-sodra-black-10',\r\n    textColor: 'u-color-sodra-black-60',\r\n  },\r\n};\r\n\r\nconst theme = computed<string>(() => {\r\n  const theme = themes[color.value];\r\n  return `${theme.backgroundColor} ${theme.textColor}`;\r\n});\r\n</script>\r\n","<template>\r\n  <MMaterialSymbol\r\n    v-if=\"item.icon\"\r\n    class=\"c-sidebar-nav__symbol-left\"\r\n    size=\"24\"\r\n    :symbol-name=\"item.icon\"\r\n  ></MMaterialSymbol>\r\n\r\n  {{ item.text }}\r\n\r\n  <MChip\r\n    v-if=\"item.menuChip\"\r\n    :text=\"item.menuChip\"\r\n    color=\"green\"\r\n    class=\"mx-2_5\"\r\n  />\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type SidebarNavItem from '@/models/sidebar/SideBarNavItem';\r\nimport { toRefs } from 'vue';\r\nimport MMaterialSymbol from '../icons/MMaterialSymbol.vue';\r\nimport MChip from '../chip/MChip.vue';\r\n\r\nconst props = defineProps<{ item: SidebarNavItem }>();\r\n\r\nconst { item } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <button class=\"c-sidebar-nav__open-submenu\" aria-expanded=\"false\">\r\n    <i class=\"material-icons\"></i>\r\n  </button>\r\n\r\n  <ul class=\"c-sidebar-nav__submenu\">\r\n    <MSidebarNavItem\r\n      v-for=\"navItem in item.children\"\r\n      :key=\"navItem.route ?? navItem.url\"\r\n      :item=\"navItem\"\r\n    />\r\n  </ul>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type SidebarNavItem from '@/models/sidebar/SideBarNavItem';\r\nimport MSidebarNavItem from './MSideBarNavItem.vue';\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{ item: SidebarNavItem }>();\r\n\r\nconst { item } = toRefs(props);\r\n</script>\r\n","import type { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport type { RoleRequirement } from './roleRequirement';\r\n\r\nexport interface AuthRequirements {\r\n  allowAnonymous: boolean;\r\n  roleRequirement: RoleRequirement | undefined;\r\n  featureFlag?: FeatureFlagName | null;\r\n}\r\n\r\nexport const authRequirementsCommonPublic: AuthRequirements = {\r\n  allowAnonymous: true,\r\n  roleRequirement: undefined,\r\n};\r\n\r\nexport const authRequirementsContentPrivate: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: undefined,\r\n};\r\n","<template>\r\n  <div>\r\n    <MBanner :image-url=\"t('startpage.banner.image_url')\" />\r\n\r\n    <div class=\"container-fluid container-fluid--page\">\r\n      <div class=\"row\">\r\n        <div class=\"col-12 u-text-center\">\r\n          <h1 class=\"t-heading-3\" v-html=\"t('notFoundPage.title')\"></h1>\r\n          <p class=\"mt-4\">\r\n            <router-link to=\"/\">{{ t('notFoundPage.goBack') }}</router-link>\r\n          </p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport MBanner from '@/components/common/MBanner.vue';\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nconst { t } = useI18n();\r\n</script>\r\n","import type { RouteRecordRaw } from 'vue-router';\r\nimport { authRequirementsCommonPublic } from './authRequirements';\r\nimport NotFoundPage from '@/views/NotFoundPage.vue';\r\nimport { RouteNames } from './routeNames';\r\n\r\nconst defaultDocumentTitle = import.meta.env.VITE_APP_DOCUMENT_DEFAULT_TITLE;\r\n\r\nexport const HomeRouteDefinition: RouteRecordRaw = {\r\n  path: '/',\r\n  component: () => import('@/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: defaultDocumentTitle,\r\n    title: defaultDocumentTitle,\r\n    authRequirements: authRequirementsCommonPublic,\r\n  },\r\n  children: [],\r\n};\r\n\r\nexport const AuthenticationRouteDefinition: RouteRecordRaw = {\r\n  path: '/authentication/:action',\r\n  component: () => import('@/views/AuthorizationPage.vue'),\r\n  name: RouteNames.Authentication,\r\n  meta: {\r\n    authRequirements: authRequirementsCommonPublic,\r\n  },\r\n};\r\n\r\nexport const LoginRouteDefinition: RouteRecordRaw = {\r\n  path: '/login',\r\n  component: () => import('@/views/LoginPage.vue'),\r\n  name: RouteNames.Login,\r\n  meta: {\r\n    authRequirements: authRequirementsCommonPublic,\r\n  },\r\n};\r\n\r\nexport const PasswordChangeRouteDefinition: RouteRecordRaw = {\r\n  path: '/password-change',\r\n  component: () => import('@/views/PasswordChangePage.vue'),\r\n  name: RouteNames.PasswordChange,\r\n  props: true,\r\n};\r\n\r\nexport const NotFoundRouteDefinition: RouteRecordRaw = {\r\n  path: '/:pathMatch(.*)*',\r\n  component: NotFoundPage,\r\n  name: RouteNames.NotFound,\r\n  meta: {\r\n    authRequirements: authRequirementsCommonPublic,\r\n  },\r\n};\r\n","<template>\r\n  <router-link\r\n    v-if=\"item.route\"\r\n    :to=\"{\r\n      name: item.route,\r\n    }\"\r\n    custom\r\n    v-slot=\"{ href, navigate }\"\r\n  >\r\n    <li\r\n      class=\"c-sidebar-nav__item\"\r\n      :aria-haspopup=\"!!item.children?.length\"\r\n      :ref=\"refs.navItem\"\r\n    >\r\n      <a\r\n        :href=\"href\"\r\n        @click=\"navigate\"\r\n        class=\"c-sidebar-nav__link\"\r\n        :aria-current=\"isActiveRoute ? 'page' : undefined\"\r\n      >\r\n        <MSidebarContent :item=\"item\" />\r\n      </a>\r\n      <MSidebarSubMenu v-if=\"item.children?.length\" :item=\"item\" />\r\n    </li>\r\n  </router-link>\r\n\r\n  <li\r\n    v-else\r\n    class=\"c-sidebar-nav__item\"\r\n    :aria-haspopup=\"!!item.children?.length\"\r\n    :ref=\"refs.navItem\"\r\n  >\r\n    <span class=\"c-sidebar-nav__link\">\r\n      <MSidebarContent :item=\"item\" />\r\n    </span>\r\n    <MSidebarSubMenu v-if=\"item.children?.length\" :item=\"item\" />\r\n  </li>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, ref, toRefs } from 'vue';\r\nimport { RouterLink, useRoute } from 'vue-router';\r\nimport MSidebarContent from './MSidebarContent.vue';\r\nimport MSidebarSubMenu from './MSidebarSubMenu.vue';\r\nimport type SidebarNavItem from '@/models/sidebar/SideBarNavItem';\r\nimport { HomeRouteDefinition } from '@/router/routes';\r\nimport { RouteNames } from '@/router/routeNames';\r\nimport { watch } from 'vue';\r\n\r\nconst route = useRoute();\r\n\r\nconst props = defineProps<{ item: SidebarNavItem }>();\r\n\r\nconst refs = {\r\n  navItem: ref<HTMLElement>(),\r\n};\r\n\r\nconst { item } = toRefs(props);\r\n\r\nconst isActiveRoute = computed<boolean>(() => {\r\n  let isActive = false;\r\n  if (!item.value.children?.length) {\r\n    isActive =\r\n      item.value.route !== RouteNames.Home\r\n        ? route.path.startsWith(item.value.url)\r\n        : route.path === HomeRouteDefinition.path;\r\n  } else {\r\n    isActive =\r\n      route.path.startsWith(item.value.url) &&\r\n      !item.value.children?.some((child) => route.path.startsWith(child.url));\r\n  }\r\n\r\n  return isActive;\r\n});\r\n\r\nconst hasActiveChildRecursive = (item: SidebarNavItem): boolean => {\r\n  return (\r\n    (route.path.startsWith(item.url) ||\r\n      item.children?.some(hasActiveChildRecursive)) ??\r\n    false\r\n  );\r\n};\r\n\r\nwatch(\r\n  route,\r\n  () => {\r\n    if (isActiveRoute.value || hasActiveChildRecursive(item.value)) {\r\n      expandSubMenu();\r\n    }\r\n  },\r\n  { immediate: true },\r\n);\r\n\r\nfunction expandSubMenu() {\r\n  const closestExpandable = refs.navItem.value?.closest(\r\n    '[aria-haspopup=\"true\"]',\r\n  );\r\n\r\n  if (closestExpandable) {\r\n    closestExpandable.ariaExpanded = 'true';\r\n  }\r\n}\r\n</script>\r\n","import events from '@sodraskog/unity/scripts/utils/eventsHelper';\r\n\r\nexport default class SidebarNav {\r\n  _menuElement!: HTMLElement;\r\n  _document!: Document;\r\n\r\n  constructor(document: Document, menuElement: HTMLElement) {\r\n    if (!document || !menuElement) {\r\n      return;\r\n    }\r\n\r\n    this._document = document;\r\n\r\n    this._menuElement = menuElement;\r\n    // If menu not yet loaded then wait for items\r\n    this.waitForAddedMenuItems({\r\n      selector: 'ul li',\r\n      parent: menuElement,\r\n      recursive: true,\r\n      done: () => {\r\n        this.menuLoaded();\r\n      },\r\n    });\r\n\r\n    // Set observer for class change on list items and set height\r\n    this.menuLoaded();\r\n\r\n    //Click event for open/close submenu\r\n    events.live(\r\n      '.c-sidebar-nav__open-submenu, .c-sidebar-nav__link[href=\"\"], .c-sidebar-nav__link:not([href])',\r\n      events.clickOrTouchEvent,\r\n      (event: any, clickedElement: any) => {\r\n        event.preventDefault();\r\n        event.stopPropagation();\r\n\r\n        if (clickedElement) {\r\n          // Toggle submenu\r\n          const listItem = clickedElement.closest('.c-sidebar-nav__item');\r\n\r\n          if (listItem.getAttribute('aria-expanded') === 'true') {\r\n            listItem.setAttribute('aria-expanded', 'false');\r\n\r\n            // Also close children menus\r\n            const openChildren = listItem.querySelectorAll(\r\n              '[aria-expanded=\"true\"]',\r\n            );\r\n\r\n            if (openChildren) {\r\n              openChildren.forEach((child: any) => {\r\n                child.setAttribute('aria-expanded', 'false');\r\n              });\r\n            }\r\n          } else {\r\n            listItem.setAttribute('aria-expanded', 'true');\r\n            clickedElement.setAttribute('aria-expanded', 'true');\r\n          }\r\n        }\r\n\r\n        return false;\r\n      },\r\n      this._document,\r\n    );\r\n  }\r\n\r\n  menuLoaded() {\r\n    const menus = this._menuElement.querySelectorAll('ul');\r\n    menus.forEach((menu: any) => {\r\n      this.setMenuHeight(menu, true);\r\n\r\n      //After list items has rendered check if class is changed then regenerate height\r\n      const observer = new MutationObserver(() => {\r\n        menus.forEach((menu: any) => {\r\n          this.setMenuHeight(menu, true);\r\n        });\r\n      });\r\n\r\n      // Observe list items if is-open is set\r\n      menu.querySelectorAll('li').forEach((listItem: any) => {\r\n        observer.observe(listItem, {\r\n          attributes: true,\r\n          attributeFilter: ['aria-expanded'],\r\n          childList: false,\r\n          characterData: false,\r\n        });\r\n      });\r\n    });\r\n  }\r\n\r\n  waitForAddedMenuItems(params: any) {\r\n    const observer: any = new MutationObserver(() => {\r\n      const el = this._menuElement.querySelectorAll(params.selector);\r\n\r\n      if (el) {\r\n        if (observer) {\r\n          observer.disconnect();\r\n        }\r\n        params.done();\r\n      }\r\n    }).observe(params.parent || this._menuElement, {\r\n      subtree: !!params.recursive || !params.parent,\r\n      childList: true,\r\n    });\r\n  }\r\n\r\n  setMenuHeight(submenu: any, isOpen: boolean) {\r\n    if (submenu !== null && submenu.parentElement) {\r\n      let menuItems: any = submenu.parentElement.querySelectorAll(\r\n        '[aria-expanded=\"true\"] > ul > li',\r\n      );\r\n      if (submenu.parentElement.classList.contains('c-sidebar-nav')) {\r\n        menuItems = Array.from(submenu.children).concat(Array.from(menuItems));\r\n      }\r\n\r\n      if (menuItems.length) {\r\n        const menuItemHeight = 50;\r\n        const menuItemLength = menuItems.length;\r\n        const menuHeight = menuItemHeight * menuItemLength;\r\n\r\n        if (isOpen) {\r\n          submenu.style.height = menuHeight + 'px';\r\n          submenu.inert = false; // Enable tabbing\r\n        } else {\r\n          submenu.style.height = 0;\r\n          submenu.inert = true;\r\n        }\r\n      } else {\r\n        submenu.style.height = 0;\r\n        submenu.inert = true;\r\n      }\r\n\r\n      // Also change parent heights\r\n      const parentChildMenu = submenu.parentElement.closest('ul');\r\n\r\n      if (parentChildMenu && parentChildMenu.parentElement) {\r\n        this.setMenuHeight(\r\n          parentChildMenu,\r\n          parentChildMenu.parentElement.getAttribute('aria-expanded') ===\r\n            'true' ||\r\n            parentChildMenu.parentElement.classList.contains('c-sidebar-nav'),\r\n        );\r\n      }\r\n    }\r\n  }\r\n}\r\n","<template>\r\n  <span v-if=\"sidebarNav.heading\" class=\"c-sidebar__label mb-3\">\r\n    {{ sidebarNav.heading }}\r\n  </span>\r\n\r\n  <nav :ref=\"refs.sidebarNavElement\" class=\"c-sidebar-nav js-sidebar-nav\">\r\n    <ul class=\"u-border-top-black-10\">\r\n      <slot></slot>\r\n\r\n      <div\r\n        v-for=\"item in sidebarNav.items\"\r\n        :key=\"item.route ?? item.url ?? item.text\"\r\n      >\r\n        <MSidebarNavItem :item=\"item\" />\r\n      </div>\r\n      <slot name=\"secondary\"></slot>\r\n    </ul>\r\n  </nav>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { toRefs, ref, onMounted, nextTick } from 'vue';\r\nimport MSidebarNavItem from '@/components/common/sidebar/MSideBarNavItem.vue';\r\nimport type SidebarNav from '@/models/sidebar/SideBarNav';\r\nimport SidebarNavScript from '@/models/sidebar/SideBarNavScript';\r\n\r\nconst refs = {\r\n  sidebarNavElement: ref<HTMLElement>(),\r\n};\r\n\r\nconst props = defineProps<{\r\n  sidebarNav: SidebarNav;\r\n}>();\r\nconst { sidebarNav } = toRefs(props);\r\n\r\nonMounted(() => {\r\n  nextTick(() => {\r\n    if (refs.sidebarNavElement.value) {\r\n      new SidebarNavScript(document, refs.sidebarNavElement.value);\r\n    }\r\n  });\r\n});\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.u-border-top-black-10 {\r\n  border-top: 1px solid $sodra-black-10;\r\n}\r\n</style>\r\n","<template>\r\n  <div\r\n    class=\"d-flex m-round-button o-round-button o-round-button--border\"\r\n    :class=\"{\r\n      'o-round-button--small': small,\r\n      'o-round-button--x-small': xSmall,\r\n      'o-round-button--border': hasBorder,\r\n    }\"\r\n  >\r\n    <slot></slot>\r\n  </div>\r\n</template>\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  xSmall?: boolean;\r\n  small?: boolean;\r\n  hasBorder?: boolean;\r\n}>();\r\n\r\nconst { xSmall, small, hasBorder } = toRefs(props);\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.o-round-button {\r\n  line-height: initial;\r\n}\r\n.o-round-button--x-small {\r\n  height: $spacer-5_25;\r\n  width: $spacer-5_25;\r\n}\r\n.o-round-button--border {\r\n  border: 1.5px solid $sodra-black-10;\r\n}\r\n</style>\r\n","<template>\r\n  <section\r\n    class=\"c-carousel--multiple-items c-carousel swiper\"\r\n    data-type=\"carousel\"\r\n    :data-per-view=\"dataPerView\"\r\n    :data-autoplay=\"!!autoPlay\"\r\n    :data-controls=\"dataControls\"\r\n    :ref=\"refs.carousel\"\r\n  >\r\n    <div class=\"c-carousel__track swiper-wrapper\">\r\n      <slot></slot>\r\n    </div>\r\n\r\n    <div v-if=\"!hidePagination\" class=\"c-carousel__navigation\">\r\n      <div v-if=\"!!paginationControl\" class=\"swiper-button-prev\"></div>\r\n\r\n      <div class=\"swiper-pagination\"></div>\r\n\r\n      <div v-if=\"!!paginationControl\" class=\"swiper-button-next\"></div>\r\n    </div>\r\n  </section>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { Carousel } from '@sodraskog/unity/scripts/unity';\r\nimport { nextTick, onMounted, ref, toRefs } from 'vue';\r\n\r\nconst refs = {\r\n  carousel: ref<HTMLElement>(),\r\n};\r\n\r\nconst props = defineProps<{\r\n  dataPerView: number;\r\n  autoPlay?: boolean;\r\n  hidePagination?: boolean;\r\n  paginationControl?: boolean;\r\n  dataControls?: boolean;\r\n}>();\r\n\r\nconst {\r\n  dataPerView,\r\n  autoPlay,\r\n  hidePagination,\r\n  paginationControl,\r\n  dataControls,\r\n} = toRefs(props);\r\n\r\nonMounted(() => {\r\n  nextTick(() => new Carousel(document, refs.carousel.value));\r\n});\r\n</script>\r\n","export default \"data:image/svg+xml,%3csvg%20width='64'%20height='65'%20viewBox='0%200%2064%2065'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='64'%20height='64'%20transform='translate(0%200.142822)'%20fill='%23EDF1F2'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M40.9378%2039.02C40.9378%2039.0201%2040.9379%2039.0201%2039.9756%2039.7466L40.9378%2039.02L42.3967%2040.9523H21.6467L23.1028%2039.0208L24.0655%2039.7466C23.1028%2039.0208%2023.1027%2039.0209%2023.1028%2039.0208L26.3313%2034.7384C28.041%2032.4709%2029.9423%2029.9496%2030.7071%2028.9368L31.9259%2029.8571L33.2487%2028.8506C33.9734%2029.8031%2035.8965%2032.3466%2037.6368%2034.6496C38.5072%2035.8016%2039.3325%2036.8943%2039.9401%2037.6989L40.9378%2039.02ZM32.0123%2031.2103C31.0778%2032.4489%2029.6077%2034.3984%2028.2568%2036.1902L26.4845%2038.5409H37.5542C37.0184%2037.8314%2036.3788%2036.9848%2035.7128%2036.1033C34.3774%2034.3359%2032.9368%2032.4304%2032.0123%2031.2103Z'%20fill='%23A2A8AA'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M32.0001%2018.7789L41.1999%2030.9518H22.8003L32.0001%2018.7789ZM27.6453%2028.5404H36.3549L32.0001%2022.7783L27.6453%2028.5404Z'%20fill='%23A2A8AA'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M32%2018.5542C24.4952%2018.5542%2018.4114%2024.638%2018.4114%2032.1428C18.4114%2039.6476%2024.4952%2045.7314%2032%2045.7314C39.5048%2045.7314%2045.5886%2039.6476%2045.5886%2032.1428C45.5886%2024.638%2039.5048%2018.5542%2032%2018.5542ZM16%2032.1428C16%2023.3063%2023.1634%2016.1428%2032%2016.1428C40.8366%2016.1428%2048%2023.3063%2048%2032.1428C48%2040.9794%2040.8366%2048.1428%2032%2048.1428C23.1634%2048.1428%2016%2040.9794%2016%2032.1428Z'%20fill='%23A2A8AA'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20width='64'%20height='65'%20viewBox='0%200%2064%2065'%20fill='none'%20xmlns='http://www.w3.org/2000/svg'%3e%3crect%20width='64'%20height='64'%20transform='translate(0%200.142822)'%20fill='white'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M40.938%2039.02C40.9381%2039.0201%2040.9381%2039.0201%2039.9759%2039.7466L40.938%2039.02L42.3969%2040.9523H21.647L23.103%2039.0208L24.0658%2039.7466C23.103%2039.0208%2023.103%2039.0209%2023.103%2039.0208L26.3316%2034.7384C28.0413%2032.4709%2029.9425%2029.9496%2030.7074%2028.9368L31.9262%2029.8571L33.249%2028.8506C33.9737%2029.8031%2035.8968%2032.3466%2037.637%2034.6496C38.5075%2035.8016%2039.3327%2036.8943%2039.9404%2037.6989L40.938%2039.02ZM32.0125%2031.2103C31.078%2032.4489%2029.608%2034.3984%2028.257%2036.1902L26.4847%2038.5409H37.5545C37.0186%2037.8314%2036.3791%2036.9848%2035.7131%2036.1033C34.3776%2034.3359%2032.9371%2032.4304%2032.0125%2031.2103Z'%20fill='%23A2A8AA'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M32.0002%2018.7789L41.2%2030.9518H22.8004L32.0002%2018.7789ZM27.6454%2028.5404H36.355L32.0002%2022.7783L27.6454%2028.5404Z'%20fill='%23A2A8AA'/%3e%3cpath%20fill-rule='evenodd'%20clip-rule='evenodd'%20d='M32%2018.5542C24.4952%2018.5542%2018.4114%2024.638%2018.4114%2032.1428C18.4114%2039.6476%2024.4952%2045.7314%2032%2045.7314C39.5048%2045.7314%2045.5886%2039.6476%2045.5886%2032.1428C45.5886%2024.638%2039.5048%2018.5542%2032%2018.5542ZM16%2032.1428C16%2023.3063%2023.1634%2016.1428%2032%2016.1428C40.8366%2016.1428%2048%2023.3063%2048%2032.1428C48%2040.9794%2040.8366%2048.1428%2032%2048.1428C23.1634%2048.1428%2016%2040.9794%2016%2032.1428Z'%20fill='%23A2A8AA'/%3e%3c/svg%3e\"","<template>\r\n  <div class=\"c-contact-card\">\r\n    <div\r\n      class=\"c-contact-card__image\"\r\n      :class=\"{\r\n        'c-contact-card__image--round': roundImage,\r\n        'c-contact-card__image--fixed-size': fixedImageSize,\r\n      }\"\r\n    >\r\n      <img\r\n        :src=\"imageUrlWithPlaceholderFallback\"\r\n        :alt=\"title\"\r\n        :class=\"{ 'c-contact-card__image--fixed-size': fixedImageSize }\"\r\n      />\r\n    </div>\r\n\r\n    <div class=\"c-contact-card__information-row\">\r\n      <span v-if=\"name\" class=\"c-contact-card__name\">\r\n        <strong>{{ name }}</strong>\r\n      </span>\r\n\r\n      <em v-if=\"title\" class=\"c-contact-card__title\">{{ title }}</em>\r\n\r\n      <span v-if=\"phone\" class=\"c-contact-card__information o-text-link\">{{\r\n        phone\r\n      }}</span>\r\n\r\n      <span v-if=\"email\" class=\"c-contact-card__information text-lowercase\">\r\n        <a :href=\"`mailto:${email}`\">{{ email }}</a>\r\n      </span>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { computed, toRefs } from 'vue';\r\nimport greyContactPlaceholderImage from '@/assets/img/contact-placeholder-image_grey.svg';\r\nimport whiteContactPlaceholderImage from '@/assets/img/contact-placeholder-image_white.svg';\r\n\r\nconst props = defineProps<{\r\n  imageUrl?: string;\r\n  fixedImageSize?: boolean;\r\n  roundImage?: boolean;\r\n  placeholderImage: 'grey' | 'white';\r\n  name?: string;\r\n  title?: string;\r\n  phone?: string;\r\n  email?: string;\r\n}>();\r\n\r\nconst { imageUrl, roundImage, placeholderImage, name, title, phone, email } =\r\n  toRefs(props);\r\n\r\nconst imageUrlWithPlaceholderFallback = computed<string>(() => {\r\n  return imageUrl?.value\r\n    ? imageUrl.value\r\n    : placeholderImage.value === 'white'\r\n      ? whiteContactPlaceholderImage\r\n      : greyContactPlaceholderImage;\r\n});\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.c-contact-card__image--fixed-size {\r\n  height: $spacer-6 !important;\r\n  width: $spacer-6 !important;\r\n  min-width: $spacer-6 !important;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"c-carousel__slide swiper-slide\">\r\n    <slot></slot>\r\n  </div>\r\n</template>\r\n","<template>\r\n  <div class=\"w-100\" :class=\"{ 'carousel-override': carouselOverride }\">\r\n    <MCarousel\r\n      class=\"me-md-0\"\r\n      :data-per-view=\"1\"\r\n      :hide-pagination=\"inspectors.length < 2\"\r\n    >\r\n      <MCarouselSlide v-for=\"(item, index) in inspectors\" :key=\"index\">\r\n        <MContactCard\r\n          :class=\"{ 'u-sodra-black-5': !whiteBackground }\"\r\n          :email=\"item.emailAddress\"\r\n          :name=\"item.firstName + ' ' + item.lastName\"\r\n          :phone=\"item.phone\"\r\n          :image-url=\"item.imageUrl\"\r\n          fixed-image-size\r\n          round-image\r\n          placeholder-image=\"white\"\r\n        />\r\n      </MCarouselSlide>\r\n    </MCarousel>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport MCarousel from './MCarousel.vue';\r\nimport MContactCard from '../MContactCard.vue';\r\nimport MCarouselSlide from './MCarouselSlide.vue';\r\nimport type { Contact } from '@/models/Contact';\r\n\r\nconst props = defineProps<{\r\n  inspectors: Contact[];\r\n  whiteBackground?: boolean;\r\n  carouselOverride?: boolean;\r\n}>();\r\n\r\nconst { inspectors } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <MSidebar\r\n    id=\"page-sidebar\"\r\n    :expanded=\"isMdSidebarOpen || pinnedSidebar\"\r\n    disable-scrollbar\r\n    :pinned=\"pinnedSidebar\"\r\n    class=\"d-print-none\"\r\n    @click=\"(event) => hideOnClick(event)\"\r\n  >\r\n    <template #header>\r\n      <MSodraHeaderLogo class=\"sidebar-header u-float-left my-auto\" />\r\n\r\n      <div class=\"text-end w-100\">\r\n        <MRoundButton\r\n          class=\"d-inline-flex o-round-button--white\"\r\n          x-small\r\n          has-border\r\n        >\r\n          <MMaterialSymbol\r\n            class=\"clickable m-auto\"\r\n            size=\"24\"\r\n            :symbol-name=\"MaterialSymbolNames.Close\"\r\n            @click=\"emit('toggle-sidebar-menu')\"\r\n          />\r\n        </MRoundButton>\r\n      </div>\r\n    </template>\r\n\r\n    <template #nav>\r\n      <div class=\"nav-container d-flex flex-column mx-neg-5\">\r\n        <div class=\"nav-header t-alt-label-small px-5\">\r\n          {{ t('sidebar.header') }}\r\n        </div>\r\n\r\n        <div class=\"nav-content px-5\">\r\n          <MSidebarNav :sidebar-nav=\"sidebarNav\">\r\n            <MSidebarNavItem :item=\"sidebarNavOverview\" />\r\n          </MSidebarNav>\r\n\r\n          <span v-for=\"(item, index) in sidebarExternalUrls\" :key=\"index\">\r\n            <div class=\"my-3\">\r\n              <a\r\n                :href=\"item.externalUrl\"\r\n                target=\"_blank\"\r\n                class=\"t-body-medium u-color-sodra-black-60\"\r\n              >\r\n                {{ item.text }}\r\n              </a>\r\n            </div>\r\n          </span>\r\n        </div>\r\n\r\n        <div\r\n          class=\"nav-inspector px-3\"\r\n          :class=\"[inspectors.length < 2 ? 'mb-3_5' : 'mb-3']\"\r\n        >\r\n          <div v-if=\"inspectors.length\" class=\"c-sidebar__contact-cards\">\r\n            <div\r\n              class=\"inspector-header u-border-bottom u-border-color-black-10 ms-neg-3 mb-3_5 pb-3\"\r\n            >\r\n              <span class=\"t-alt-label-small d-block ps-5 pt-4\">\r\n                {{ t('sidebar.inspectors.header') }}\r\n              </span>\r\n            </div>\r\n            <MInspectorCarousel :inspectors=\"inspectors\" />\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </template>\r\n\r\n    <template #footer>\r\n      <div class=\"footer-content box-shadow--top px-3\">\r\n        <div class=\"contact-btn-container d-block\">\r\n          <RouterLinkGuarded\r\n            :to=\"{ name: SupportRouteNames.Home }\"\r\n            class=\"o-button o-button--white u-border-color-black-15 w-100 m-auto\"\r\n          >\r\n            {{ t('sidebar.contactSupport') }}\r\n          </RouterLinkGuarded>\r\n        </div>\r\n      </div>\r\n    </template>\r\n  </MSidebar>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport authService from '@/services/AuthService';\r\nimport SidebarNavItem from '@/models/sidebar/SideBarNavItem';\r\nimport SidebarNav from '@/models/sidebar/SideBarNav';\r\nimport SidebarNavItemModel from '@/models/sidebar/SideBarNavItem';\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport { useAuthStore } from '@/stores/authStore';\r\nimport { computed, onMounted, ref, toRefs } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { PageType } from '@/models/content/PageType';\r\nimport { StyleBreakpoints } from '@/models/StyleBreakpoints';\r\nimport { RouteNames as SupportRouteNames } from '@/features/support/router/routeNames';\r\nimport { RouteNames } from '@/router/routeNames';\r\nimport type { Contact } from '@/models/Contact';\r\nimport type { UserProfile } from 'oidc-client-ts';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\nimport MSidebar from '@/components/common/sidebar/MSidebar.vue';\r\nimport MSidebarNav from '@/components/common/sidebar/MSideBarNav.vue';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport MSodraHeaderLogo from '@/components/common/icons/MSodraHeaderLogo.vue';\r\nimport MRoundButton from '../common/buttons/MRoundButton.vue';\r\nimport MSidebarNavItem from '@/components/common/sidebar/MSideBarNavItem.vue';\r\nimport RouterLinkGuarded from '@/components/common/RouterLinkGuarded.vue';\r\nimport { toRoutesAvailableInMenu } from '@/utils/memberProfile/memberProfileUtils';\r\nimport type { Route } from '@/models/memberProfile/Route';\r\nimport MInspectorCarousel from '../common/carousel/MInspectorCarousel.vue';\r\n\r\nconst { t } = useI18n();\r\nconst authStore = useAuthStore();\r\nconst authenticatedByIDP = ref(true);\r\n\r\nconst props = defineProps<{\r\n  isMdSidebarOpen: boolean;\r\n  windowWidth: number;\r\n  profile: MemberProfile;\r\n}>();\r\n\r\nconst { isMdSidebarOpen, windowWidth, profile } = toRefs(props);\r\n\r\nconst emit = defineEmits<{\r\n  (e: 'toggle-sidebar-menu'): void;\r\n}>();\r\n\r\nonMounted(async () => {\r\n  authenticatedByIDP.value = await isAuthenticatedByIDP();\r\n});\r\n\r\nconst pinnedSidebar = computed(() => {\r\n  return windowWidth.value >= StyleBreakpoints.Xl;\r\n});\r\n\r\nconst isTabletSidebar = computed(() => {\r\n  return (\r\n    windowWidth.value >= StyleBreakpoints.Sm &&\r\n    windowWidth.value < StyleBreakpoints.Xl\r\n  );\r\n});\r\n\r\nconst isAuthenticated = computed(() => {\r\n  return authStore.isAuthenticated;\r\n});\r\n\r\nconst sidebarNavOverview = computed(() => {\r\n  return new SidebarNavItemModel({\r\n    text: t('sidebar.overview'),\r\n    icon: MaterialSymbolNames.Overview,\r\n    route: RouteNames.Home,\r\n  });\r\n});\r\n\r\nconst sidebarNavItems = computed<SidebarNavItem[]>(() => {\r\n  const toSidebarNavItemRecursive = (\r\n    route: Route,\r\n    parentUrlName: string = '',\r\n  ): SidebarNavItem => {\r\n    const url = parentUrlName\r\n      ? `${parentUrlName}/${route.urlName}`\r\n      : `/${route.urlName}`;\r\n    return new SidebarNavItem({\r\n      url: url.endsWith('/') ? url : url + '/',\r\n      text: route.name,\r\n      icon: mapIcon(route.icon),\r\n      menuChip: route.menuChip,\r\n      externalUrl: route.externalUrl,\r\n      route:\r\n        route.pageType === PageType.ContentPage\r\n          ? route.id.toString()\r\n          : undefined,\r\n      children: route.routes?.map((r) => toSidebarNavItemRecursive(r, url)),\r\n    });\r\n  };\r\n\r\n  const items = profile.value.routes\r\n    .reduce(toRoutesAvailableInMenu, [])\r\n    .map((r) => toSidebarNavItemRecursive(r));\r\n\r\n  return items;\r\n});\r\n\r\nconst sidebarNavItemsWithoutExternalUrls = computed<SidebarNavItem[]>(() => {\r\n  return sidebarNavItems.value?.flatMap((item) => {\r\n    const newItem = { ...item };\r\n    newItem.children =\r\n      item.children?.filter((childItem) => !childItem.externalUrl) ?? [];\r\n\r\n    return newItem.children.length ? [newItem] : [];\r\n  });\r\n});\r\n\r\nconst sidebarNav = computed<SidebarNav>(() => {\r\n  return new SidebarNav({\r\n    items: [...(sidebarNavItemsWithoutExternalUrls.value ?? [])],\r\n  });\r\n});\r\n\r\nconst sidebarExternalUrls = computed<SidebarNavItem[]>(() => {\r\n  return sidebarNavItems.value?.flatMap(\r\n    (item) =>\r\n      item.children?.filter((childItem) => !!childItem.externalUrl) ?? [],\r\n  );\r\n});\r\n\r\nconst inspectors = computed<Contact[]>(() => {\r\n  return profile.value.inspectors ?? [];\r\n});\r\n\r\nfunction hideOnClick(event: MouseEvent) {\r\n  if (\r\n    isMdSidebarOpen.value &&\r\n    isTabletSidebar.value &&\r\n    event.clientX > StyleBreakpoints.PageSidebarWidth\r\n  ) {\r\n    emit('toggle-sidebar-menu');\r\n  }\r\n}\r\nfunction mapIcon(icon) {\r\n  const iconMap = {\r\n    'pine-tree': 'forest',\r\n    briefcase: 'work',\r\n    'piggy-bank': 'savings',\r\n    'account-group': 'group',\r\n  };\r\n  return iconMap[icon] || icon;\r\n}\r\n\r\nasync function isAuthenticatedByIDP(): Promise<boolean> {\r\n  if (!isAuthenticated.value) {\r\n    return false;\r\n  }\r\n\r\n  const userProfile: UserProfile | undefined | null =\r\n    await authService.getUserProfile();\r\n\r\n  return userProfile?.idp ? true : false;\r\n}\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.u-border-color-black-15 {\r\n  border: 1px solid $sodra-black-15;\r\n}\r\n</style>\r\n","<template>\r\n  <Teleport to=\"body\">\r\n    <div\r\n      id=\"unity2-app\"\r\n      class=\"o-loader o-loader--fullscreen\"\r\n      :class=\"{ customClass: customClass }\"\r\n    >\r\n      <div v-if=\"text || addedText\" class=\"mt-2\">\r\n        {{ text }}\r\n        <div v-if=\"addedText\">{{ addedText }}</div>\r\n      </div>\r\n    </div>\r\n  </Teleport>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { LoadingTextIfSlow } from '@/models/LoadingTextIfSlow';\r\nimport { ref, toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  text?: string;\r\n  customClass?: string;\r\n  textIfSlow?: LoadingTextIfSlow;\r\n}>();\r\n\r\nconst { text, customClass, textIfSlow } = toRefs(props);\r\n\r\nconst addedText = ref<string | undefined>(undefined);\r\n\r\nfunction initialize(): void {\r\n  addedText.value = undefined;\r\n\r\n  if (textIfSlow.value) {\r\n    setTimeout(() => {\r\n      addedText.value = textIfSlow.value?.text;\r\n    }, textIfSlow.value.afterTimeInMs);\r\n  }\r\n}\r\n\r\ninitialize();\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.o-loader--fullscreen {\r\n  &:before {\r\n    position: unset;\r\n    margin: 0;\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <MAlert\r\n    v-for=\"(alert, index) in visibleAlerts\"\r\n    :key=\"index\"\r\n    text=\"\"\r\n    :type=\"alert.type\"\r\n    close\r\n    @close=\"onCloseAlert(alert.id)\"\r\n    class=\"mb-0\"\r\n  >\r\n    <div v-html=\"alert.textHtml\"></div>\r\n  </MAlert>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport MAlert from '@/components/common/MAlert.vue';\r\nimport { UnityAlertType } from '@/models/alert/UnityAlertType';\r\nimport type { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { Message } from '@/models/pageFeature/StatusContainer';\r\nimport { usePageStatusStore } from '@/stores/pageStatusStore';\r\nimport { computed, nextTick, ref, toRefs, watch } from 'vue';\r\n\r\ninterface PageStatusMessage {\r\n  id: string;\r\n  textHtml: string;\r\n  type: UnityAlertType;\r\n}\r\n\r\nconst pageStatusStore = usePageStatusStore();\r\n\r\nconst props = defineProps<{\r\n  pageFeatureType: PageFeatureType;\r\n}>();\r\n\r\nconst { pageFeatureType } = toRefs(props);\r\n\r\nconst closedAlertIds = ref<string[]>([]);\r\n\r\nconst pageMessages = computed<Message[]>(() =>\r\n  pageFeatureType.value\r\n    ? pageStatusStore.getMessages(pageFeatureType.value)\r\n    : [],\r\n);\r\n\r\nconst alerts = computed<PageStatusMessage[]>(() =>\r\n  pageMessages.value.map((x) => ({\r\n    id: x.id,\r\n    type: getAlertType(x.messageType),\r\n    textHtml: x.text,\r\n  })),\r\n);\r\n\r\nconst visibleAlerts = computed<PageStatusMessage[]>(() =>\r\n  alerts.value.filter((x) => !closedAlertIds.value.some((y) => y === x.id)),\r\n);\r\n\r\nwatch(pageFeatureType, () => {\r\n  closedAlertIds.value = [];\r\n});\r\n\r\nfunction getAlertType(\r\n  messageType: 'Info' | 'Success' | 'Warning' | 'Error' | 'Attention' | 'Black',\r\n): UnityAlertType {\r\n  switch (messageType) {\r\n    case 'Success':\r\n      return UnityAlertType.Success;\r\n    case 'Warning':\r\n      return UnityAlertType.Warning;\r\n    case 'Error':\r\n      return UnityAlertType.Error;\r\n    case 'Attention':\r\n      return UnityAlertType.Attention;\r\n    case 'Black':\r\n      return UnityAlertType.Black;\r\n    case 'Info':\r\n    default:\r\n      return UnityAlertType.Info;\r\n  }\r\n}\r\n\r\nfunction onCloseAlert(id: string): void {\r\n  closedAlertIds.value.push(id);\r\n  nextTick(() => {\r\n    // NOTE: Triggering a window resize here for map containers etc to redraw and fill all available space.\r\n    window.dispatchEvent(new Event('resize'));\r\n  });\r\n}\r\n</script>\r\n","import { ref, onMounted, onUnmounted } from 'vue';\r\n\r\nexport function useResize() {\r\n  const windowWidth = ref(window.innerWidth);\r\n  const windowHeight = ref(window.innerHeight);\r\n\r\n  type DebounceFunction = (func: () => void, delay: number) => () => void;\r\n\r\n  const debounce: DebounceFunction = (func, delay) => {\r\n    let timeoutId: ReturnType<typeof setTimeout>;\r\n    return () => {\r\n      clearTimeout(timeoutId);\r\n      timeoutId = setTimeout(func, delay);\r\n    };\r\n  };\r\n\r\n  const updateWithDebounce = debounce(() => {\r\n    windowWidth.value = window.innerWidth;\r\n    windowHeight.value = window.innerHeight;\r\n  }, 150);\r\n\r\n  onMounted(() => window.addEventListener('resize', updateWithDebounce));\r\n  onUnmounted(() => window.removeEventListener('resize', updateWithDebounce));\r\n\r\n  return { windowWidth, windowHeight };\r\n}\r\n","<template>\r\n  <div\r\n    class=\"impersonated impersonated-lg-down d-flex u-background-color-yellow-20\"\r\n  >\r\n    <MMaterialSymbol size=\"24\" :symbol-name=\"MaterialSymbolNames.UseAs\" />\r\n\r\n    <div class=\"impersonated-name-container\">\r\n      <span\r\n        class=\"t-body-large impersonated-lg-down__name ms-2 truncate-row-one-line\"\r\n      >\r\n        {{\r\n          proxyProfileUserName\r\n            ? t(`impersonatedUser.proxyProfile`)\r\n            : t('impersonatedUser.info')\r\n        }}\r\n      </span>\r\n      <span\r\n        class=\"t-body-large impersonated-lg-down__name ms-2 truncate-row-one-line\"\r\n      >\r\n        {{ proxyProfileUserName ? proxyProfileUserName : impersonatedUserName }}\r\n      </span>\r\n    </div>\r\n\r\n    <MButton\r\n      v-if=\"isUsingProxy\"\r\n      @click=\"switchToOwnAccount()\"\r\n      class=\"impersonated-button truncate-row-one-line px-2_5 py-1\"\r\n      background=\"white\"\r\n      :title=\"t('impersonatedUser.useMyProfile')\"\r\n      ><span class=\"t-label-medium p-1\">{{\r\n        t('impersonatedUser.useMyProfile')\r\n      }}</span></MButton\r\n    >\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { MaterialSymbolNames } from '@/models/MaterialSymbolNames';\r\nimport { useI18n } from 'vue-i18n';\r\nimport MMaterialSymbol from '@/components/common/icons/MMaterialSymbol.vue';\r\nimport { toRefs } from 'vue';\r\nimport MButton from '../common/buttons/MButton.vue';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { useRouter } from 'vue-router';\r\nimport { RouteNames } from '@/router/routeNames';\r\nimport { storeUtil } from '@/utils/StoreUtil';\r\n\r\nconst { t } = useI18n();\r\nconst router = useRouter();\r\n\r\nconst props = defineProps<{\r\n  impersonatedUserName: string;\r\n  proxyProfileUserName?: string;\r\n  isUsingProxy?: boolean;\r\n}>();\r\n\r\nconst { impersonatedUserName, proxyProfileUserName, isUsingProxy } =\r\n  toRefs(props);\r\n\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nasync function switchToOwnAccount(): Promise<void> {\r\n  await memberProfileStore.useMyProfile();\r\n  await router.push({ name: RouteNames.Home });\r\n  storeUtil.disposeNonEssentialStores();\r\n  memberProfileStore.triggerChangeProfileModal({\r\n    hideHelpText: true,\r\n    changeProfileSuccess: true,\r\n  });\r\n}\r\n</script>\r\n\r\n<style scoped lang=\"scss\">\r\n.impersonated {\r\n  position: sticky;\r\n  padding: $spacer-2_5 $spacer-5 $spacer-2_5 $spacer-5 !important;\r\n  top: $site-header-small-height;\r\n  z-index: 46;\r\n  width: 100%;\r\n  align-items: center;\r\n\r\n  @media (min-width: $unity-xl-breakpoint) {\r\n    top: $site-header-height;\r\n  }\r\n}\r\n\r\n.impersonated-button {\r\n  height: auto;\r\n  margin-left: auto;\r\n}\r\n\r\n.impersonated-name-container {\r\n  @media (min-width: $unity-sm-breakpoint) {\r\n    display: flex;\r\n  }\r\n}\r\n\r\n@media (max-width: $unity-xl-breakpoint) {\r\n  .material-symbols-outlined {\r\n    font-size: 20px !important;\r\n  }\r\n\r\n  .impersonated {\r\n    width: 100%;\r\n\r\n    &-lg-down {\r\n      padding: $spacer-2 $spacer-4 $spacer-2 $spacer-4 !important;\r\n\r\n      &__name {\r\n        font-size: 14px !important;\r\n        line-height: 22px !important;\r\n      }\r\n    }\r\n  }\r\n}\r\n</style>\r\n","<template>\r\n  <FullscreenLoader v-if=\"!initialized\" />\r\n  <div\r\n    v-if=\"!route.meta.hideContactBar && !isHiddenOnFullscreen\"\r\n    class=\"c-fixed-button-bar c-fixed-button-bar__contact d-print-none\"\r\n  >\r\n    <a :href=\"contactLink\" target=\"_blank\" :title=\"t('contactLink.title')\">\r\n      <MMaterialSymbol\r\n        :symbol-name=\"MaterialSymbolNames.Phone\"\r\n        size=\"24\"\r\n      ></MMaterialSymbol>\r\n      <MMaterialSymbol\r\n        :symbol-name=\"MaterialSymbolNames.Email\"\r\n        size=\"24\"\r\n      ></MMaterialSymbol>\r\n    </a>\r\n    <MMaterialSymbol\r\n      :symbol-name=\"MaterialSymbolNames.Cookies\"\r\n      :title=\"t('cookieButton.title')\"\r\n      size=\"24\"\r\n      class=\"clickable\"\r\n      @click=\"renewCookieConsent()\"\r\n    ></MMaterialSymbol>\r\n  </div>\r\n\r\n  <PageHeader\r\n    v-if=\"!isHiddenOnFullscreen\"\r\n    :window-width=\"windowWidth\"\r\n    @toggle-sidebar-menu=\"toggleSidebarMenu\"\r\n  />\r\n\r\n  <VideoModal />\r\n\r\n  <PageSidebar\r\n    v-if=\"\r\n      initialized &&\r\n      isAuthenticated &&\r\n      effectiveProfile &&\r\n      !isHiddenOnFullscreen\r\n    \"\r\n    :class=\"{\r\n      'd-none': !isMdSidebarOpen && !isXlScreen,\r\n      'is-impersonated': isImpersonated || isUsingProxy,\r\n    }\"\r\n    :window-width=\"windowWidth\"\r\n    :is-md-sidebar-open=\"isMdSidebarOpen\"\r\n    :profile=\"effectiveProfile\"\r\n    @toggle-sidebar-menu=\"toggleSidebarMenu\"\r\n  />\r\n\r\n  <main\r\n    :class=\"{\r\n      'router-view': isAuthenticated && effectiveProfile,\r\n    }\"\r\n    class=\"d-flex flex-column content\"\r\n  >\r\n    <ImpersonatedUser\r\n      v-if=\"(isImpersonated || isUsingProxy) && !isHiddenOnFullscreen\"\r\n      :impersonated-user-name=\"impersonatedUserName\"\r\n      :proxy-profile-user-name=\"\r\n        isUsingProxy ? effectiveProfile?.name : undefined\r\n      \"\r\n      :is-using-proxy=\"isUsingProxy\"\r\n      class=\"d-print-none\"\r\n    />\r\n    <MAlert\r\n      v-if=\"isPageOverrideOffline\"\r\n      :text=\"t('app.pageOverrideOffline.text')\"\r\n      text-ellipsis\r\n      :type=\"UnityAlertType.Attention\"\r\n      :close=\"{ text: t('app.pageOverrideOffline.restore') }\"\r\n      @close=\"restorePageOverrideOffline\"\r\n      class=\"top-alert-message mb-0\"\r\n    />\r\n    <PageStatusMessages\r\n      v-if=\"pageFeatureType && !isHiddenOnFullscreen\"\r\n      :page-feature-type=\"pageFeatureType\"\r\n    />\r\n\r\n    <div v-if=\"showRouterView\" class=\"u-position-relative flex-fill\">\r\n      <RouterView v-slot=\"{ Component }\">\r\n        <component :is=\"routerViewComponentOverride ?? Component\" />\r\n      </RouterView>\r\n    </div>\r\n\r\n    <template v-if=\"initialized && commonError\">\r\n      <MBanner :image-url=\"t('startpage.banner.image_url')\" />\r\n\r\n      <div class=\"container u-text-center mt-5\">\r\n        <div class=\"row\">\r\n          <div class=\"col-12 u-text-center\">\r\n            <h4 v-html=\"t('app.error.title')\"></h4>\r\n            <p>{{ t('app.error.info') }}</p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </template>\r\n\r\n    <template v-if=\"initialized && impersonatedSessionExpiredError\">\r\n      <MBanner :image-url=\"t('startpage.banner.image_url')\" />\r\n      <div class=\"container u-text-center mt-5\">\r\n        <div class=\"row\">\r\n          <div class=\"col-12 u-text-center\">\r\n            <h4 v-html=\"t('app.impersonated_session_expired_error.title')\"></h4>\r\n            <p>{{ t('app.impersonated_session_expired_error.info') }}</p>\r\n            <p>\r\n              <button\r\n                class=\"o-button o-button--primary u-center-text\"\r\n                @click.prevent=\"logout()\"\r\n              >\r\n                <i class=\"mdi mdi-exit-to-app\"></i>\r\n                <span class=\"ms-1\">\r\n                  {{ t('app.impersonated_session_expired_error.button_text') }}\r\n                </span>\r\n              </button>\r\n            </p>\r\n          </div>\r\n        </div>\r\n      </div>\r\n    </template>\r\n  </main>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport '@/assets/scss/main.scss';\r\nimport { useRoute } from 'vue-router';\r\nimport {\r\n  nextTick,\r\n  onBeforeUnmount,\r\n  onMounted,\r\n  computed,\r\n  ref,\r\n  watch,\r\n  defineAsyncComponent,\r\n} from 'vue';\r\nimport Unity from '@sodraskog/unity/scripts/unity';\r\nimport { useMemberProfileStore } from './stores/memberProfileStore';\r\nimport { ProblemType } from './models/ProblemType';\r\nimport { Config } from './utils/Config';\r\nimport type { LoginRedirection } from './models/LoginRedirection';\r\nimport { useAuthStore } from './stores/authStore';\r\nimport {\r\n  EventBus,\r\n  EventLogin,\r\n  EventLogout,\r\n  EventChangePassword,\r\n} from './utils/EventBus';\r\nimport MBanner from './components/common/MBanner.vue';\r\nimport VideoModal from './components/modal/VideoModal.vue';\r\nimport PageHeader from './components/header/PageHeader.vue';\r\nimport MMaterialSymbol from './components/common/icons/MMaterialSymbol.vue';\r\nimport { Logger } from './utils/Logger';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { RouteNames } from './router/routeNames';\r\nimport { useStartupStore } from './stores/startupStore';\r\nimport PageSidebar from '@/components/sidebar/PageSidebar.vue';\r\nimport { StyleBreakpoints } from './models/StyleBreakpoints';\r\nimport { MaterialSymbolNames } from './models/MaterialSymbolNames';\r\nimport FullscreenLoader from './components/FullscreenLoader.vue';\r\nimport { usePageStatusStore } from './stores/pageStatusStore';\r\nimport MAlert from '@/components/common/MAlert.vue';\r\nimport { UnityAlertType } from './models/alert/UnityAlertType';\r\nimport type { MemberProfile } from './models/memberProfile/MemberProfile';\r\nimport { ProfileType } from '@/stores/profile/ProfileArrayStore';\r\nimport PageStatusMessages from '@/components/common/PageStatusMessages.vue';\r\nimport type { PageFeatureType } from './models/infrastructure/PageFeatureType';\r\nimport { useResize } from '@/composables/Resize';\r\nimport ImpersonatedUser from './components/header/ImpersonatedUser.vue';\r\nimport { useFullscreenStore } from './stores/fullscreenStore';\r\n\r\nconst { t } = useI18n();\r\nconst route = useRoute();\r\nconst authStore = useAuthStore();\r\nconst startupStore = useStartupStore();\r\nconst memberProfileStore = useMemberProfileStore();\r\nconst pageStatusStore = usePageStatusStore();\r\nconst fullscreenStore = useFullscreenStore();\r\n\r\nconst contactLink = Config.Settings.ContactLink;\r\n\r\nconst isMdSidebarOpen = ref<boolean>(false);\r\nconst { windowWidth } = useResize();\r\n\r\nconst PageFeatureOfflinePage = defineAsyncComponent(\r\n  () => import('./views/PageFeatureOfflinePage.vue'),\r\n);\r\nconst AccessDeniedPage = defineAsyncComponent(\r\n  () => import('./views/AccessDeniedPage.vue'),\r\n);\r\n\r\nconst routerViewComponentOverride = computed(() => {\r\n  if (!memberProfileStore.hasEffectiveAccessToRoute(route)) {\r\n    return AccessDeniedPage;\r\n  }\r\n\r\n  if (isPageOffline.value && !isPageOverrideOffline.value) {\r\n    return PageFeatureOfflinePage;\r\n  }\r\n\r\n  return undefined;\r\n});\r\n\r\nconst isAuthenticated = computed<boolean>(() => {\r\n  return authStore.isAuthenticated;\r\n});\r\n\r\nconst pageFeatureType = computed<PageFeatureType | undefined>(\r\n  () => route.meta?.pageFeatureType,\r\n);\r\n\r\nconst isPageOffline = computed<boolean>(() => {\r\n  return (\r\n    !!pageFeatureType.value && pageStatusStore.isOffline(pageFeatureType.value)\r\n  );\r\n});\r\n\r\nconst isPageOverrideOffline = computed<boolean>(() => {\r\n  return (\r\n    !!pageFeatureType.value &&\r\n    pageStatusStore.isOverrideOffline(pageFeatureType.value)\r\n  );\r\n});\r\n\r\nconst impersonatedSessionExpiredError = computed<boolean>(() => {\r\n  return (\r\n    memberProfileStore.myLoading.isError &&\r\n    memberProfileStore.myLoading.error.response &&\r\n    memberProfileStore.myLoading.error.response.status === 401 &&\r\n    memberProfileStore.myLoading.error.response.data &&\r\n    memberProfileStore.myLoading.error.response.data.problemType ===\r\n      ProblemType.impersonatedSessionExpired\r\n  );\r\n});\r\n\r\nconst effectiveProfile = computed<MemberProfile | null>(\r\n  () => memberProfileStore.effectiveProfile,\r\n);\r\n\r\nconst initialized = computed<boolean>(() => {\r\n  return startupStore.initialized;\r\n});\r\n\r\nconst showRouterView = computed<boolean>(() => {\r\n  return (\r\n    startupStore.initialized &&\r\n    !startupStore.initializeError &&\r\n    (route.name === RouteNames.Authentication ||\r\n      !impersonatedSessionExpiredError.value)\r\n  );\r\n});\r\n\r\nconst commonError = computed<boolean>(() => {\r\n  return startupStore.initializeError && !impersonatedSessionExpiredError.value;\r\n});\r\n\r\nconst isXlScreen = computed<boolean>(\r\n  () => windowWidth.value >= StyleBreakpoints.Xl,\r\n);\r\n\r\nconst myProfile = computed<MemberProfile | null>(() => {\r\n  return memberProfileStore.myProfile;\r\n});\r\n\r\nconst impersonatedUserName = computed<string>(() => {\r\n  return myProfile.value?.impersonatedMemberName ?? '';\r\n});\r\n\r\nconst isImpersonated = computed<boolean>(() => {\r\n  return memberProfileStore.isMemberImpersonated;\r\n});\r\n\r\nconst isUsingProxy = computed<boolean>(() => {\r\n  return memberProfileStore.isUsingProxy;\r\n});\r\n\r\nconst isHiddenOnFullscreen = computed<boolean>(() => {\r\n  return fullscreenStore.fullscreen;\r\n});\r\n\r\nonMounted(() => {\r\n  nextTick(() => {\r\n    new Unity(document);\r\n    Logger.debug('Setup Unity');\r\n  });\r\n  updateScreenSize();\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  EventBus.off(EventLogin, login);\r\n  EventBus.off(EventLogout, logout);\r\n  EventBus.off(EventChangePassword, changePassword);\r\n\r\n  authStore.dispatchDeinitialize();\r\n});\r\n\r\nwatch(route, () => {\r\n  isMdSidebarOpen.value = false;\r\n});\r\n\r\nfunction updateScreenSize(): void {\r\n  if (window.innerWidth >= StyleBreakpoints.Xl) {\r\n    isMdSidebarOpen.value = false;\r\n  }\r\n}\r\n\r\nfunction logout(): void {\r\n  memberProfileStore.removeProxyProfile();\r\n  authStore.dispatchLogout();\r\n}\r\n\r\nfunction toggleSidebarMenu(): void {\r\n  isMdSidebarOpen.value = !isMdSidebarOpen.value;\r\n}\r\n\r\nfunction login(redirectData: LoginRedirection | undefined) {\r\n  authStore.dispatchLogin(redirectData).then(() => {\r\n    memberProfileStore.dispatchLoad({\r\n      force: true,\r\n      profileType: ProfileType.Mine,\r\n    });\r\n  });\r\n}\r\n\r\nfunction changePassword(): void {\r\n  authStore.dispatchChangePassword();\r\n}\r\n\r\nfunction renewCookieConsent(): void {\r\n  const cookieConsent = (window as any).CookieConsent;\r\n  if (cookieConsent) {\r\n    cookieConsent.renew();\r\n  }\r\n}\r\n\r\nfunction restorePageOverrideOffline(): void {\r\n  if (!pageFeatureType.value) {\r\n    return;\r\n  }\r\n  pageStatusStore.restoreOverrideOffline(pageFeatureType.value);\r\n}\r\n\r\nEventBus.on(EventLogin, login);\r\nEventBus.on(EventLogout, logout);\r\nEventBus.on(EventChangePassword, changePassword);\r\n</script>\r\n<style scoped lang=\"scss\">\r\n.sidebar {\r\n  margin-left: $spacer;\r\n  height: 100%;\r\n  min-height: 100vh;\r\n  z-index: 40;\r\n  top: $site-header-height;\r\n  transition: all ease-in-out 0.15s !important;\r\n\r\n  @media (max-width: $unity-xl-breakpoint) {\r\n    left: -$spacer;\r\n    z-index: $zindex-modal;\r\n    position: fixed !important;\r\n    margin-top: -$site-header-height !important;\r\n    bottom: 0;\r\n    height: auto !important;\r\n  }\r\n}\r\n\r\n.router-view {\r\n  @media (min-width: $unity-xl-breakpoint) {\r\n    margin-left: $sidebar-xl-width;\r\n    z-index: 40;\r\n    position: relative;\r\n  }\r\n\r\n  @media (max-width: $unity-lg-breakpoint) {\r\n    width: 100% !important;\r\n  }\r\n}\r\n</style>\r\n","import type { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\n\r\nexport function addPageFeatureTypeToRouteRecursive(\r\n  route: RouteRecordRaw,\r\n  pageFeatureType: PageFeatureType,\r\n): RouteRecordRaw {\r\n  if (route.meta) {\r\n    route.meta.pageFeatureType = pageFeatureType;\r\n  } else {\r\n    route.meta = {\r\n      pageFeatureType: pageFeatureType,\r\n    };\r\n  }\r\n\r\n  if (route.children?.length) {\r\n    route.children.forEach((child) =>\r\n      addPageFeatureTypeToRouteRecursive(child, pageFeatureType),\r\n    );\r\n  }\r\n\r\n  return route;\r\n}\r\n","export enum Role {\r\n  ServiceMyMapRead = 'Service_MyMap_Read',\r\n  ServiceMyMapWrite = 'Service_MyMap_Write',\r\n\r\n  PageCertificationRead = 'Page_Certification_Read',\r\n  ServiceCertificationRead = 'Service_Certification_Read',\r\n  ServiceCertificationWrite = 'Service_Certification_Write',\r\n\r\n  ServiceSeedlingOrderRead = 'Service_SeedlingOrder_Read',\r\n  ServiceSeedlingOrderWrite = 'Service_SeedlingOrder_Write',\r\n\r\n  ServiceTimberDeliveriesRead = 'Service_TimberDeliveries_Read',\r\n\r\n  ServiceDocumentsRead = 'Service_Documents_Read',\r\n\r\n  ServiceTimberManagerAgreementsRead = 'Service_TimberManager_Agreements_Read',\r\n  ServiceTimberManagerAgreementsWrite = 'Service_TimberManager_Agreements_Write',\r\n  ServiceTimberManagerDeliveriesRead = 'Service_TimberManager_Deliveries_Read',\r\n  ServiceTimberManagerDeliveriesWrite = 'Service_TimberManager_Deliveries_Write',\r\n\r\n  ServiceFinanceRead = 'Service_Finance_Read',\r\n  ServiceFinanceWrite = 'Service_Finance_Write',\r\n\r\n  ServiceProfileEconomicsRead = 'Service_Profile_Economics_Read',\r\n  ServiceProfileEconomicsWrite = 'Service_Profile_Economics_Write',\r\n  ServiceProfileCommonRead = 'Service_Profile_Common_Read',\r\n  ServiceProfileCommonWrite = 'Service_Profile_Common_Write',\r\n  ServiceProfileMarketingProductsPreferencesWrite = 'Service_Profile_MarketingProductsPreferences_Write',\r\n\r\n  ServiceEconomicDevelopmentRead = 'Service_EconomicDevelopment_Read',\r\n\r\n  ServiceTradeRead = 'Service_Trade_Read',\r\n  ServiceTradeWrite = 'Service_Trade_Write',\r\n\r\n  ServiceDigitalDemocracyRead = 'Service_DigitalDemocracy_Read',\r\n  ServiceDigitalDemocracyWrite = 'Service_DigitalDemocracy_Write',\r\n\r\n  ServiceProxyRead = 'Service_Proxy_Read',\r\n  ServiceProxyWrite = 'Service_Proxy_Write',\r\n\r\n  ServiceSupportWrite = 'Service_Support_Write',\r\n  ServiceSupportRead = 'Service_Support_Read',\r\n\r\n  PageMemberOffersRead = 'Page_MemberOffers_Read',\r\n  PageInterestRatesRead = 'Page_InterestRates_Read',\r\n  PageLegalForestryRead = 'Page_LegalForestry_Read',\r\n\r\n  ServiceProductionRead = 'Service_Production_Read',\r\n  ServiceProductionWrite = 'Service_Production_Write',\r\n\r\n  ServiceSodraElRead = 'Service_SodraEl_Read',\r\n  ServiceSodraElWrite = 'Service_SodraEl_Write',\r\n\r\n  ServicePriceCalculationRead = 'Service_PriceCalculation_Read',\r\n}\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsMemberProxyPublic: AuthRequirements = {\r\n  allowAnonymous: true,\r\n  roleRequirement: undefined,\r\n};\r\nconst authRequirementsMemberProxyDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: undefined,\r\n};\r\n\r\nconst authRequirementRead: AuthRequirements = {\r\n  ...authRequirementsMemberProxyDefault,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceProxyRead,\r\n  },\r\n};\r\n\r\nconst authRequirementReadWrite: AuthRequirements = {\r\n  ...authRequirementsMemberProxyDefault,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([Role.ServiceProxyRead, Role.ServiceProxyWrite]),\r\n  },\r\n};\r\n\r\nconst basePath = '/medlem-i-sodra';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst ProxiesHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/fullmakter/'),\r\n  component: () => import('@features/proxy/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: 'proxy.routes.homePage',\r\n    authRequirements: authRequirementRead,\r\n  },\r\n  children: [\r\n    {\r\n      path: 'ny',\r\n      name: RouteNames.CreateProxy,\r\n      components: {\r\n        modal: () =>\r\n          import('@features/proxy/views/CreateReplaceProxyModalPage.vue'),\r\n      },\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.CreateProxy,\r\n        title: 'proxy.routes.createProxy',\r\n        authRequirements: authRequirementReadWrite,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nconst ProxiesProxyRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/fullmakter/:proxyId/'),\r\n  component: () => import('@features/proxy/views/ProxyPage.vue'),\r\n  name: RouteNames.Proxy,\r\n  props: true,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Proxy,\r\n    title: 'proxy.routes.proxyPage',\r\n    authRequirements: authRequirementRead,\r\n  },\r\n  children: [\r\n    {\r\n      path: 'redigera',\r\n      name: RouteNames.ReplaceProxy,\r\n      props: true,\r\n      components: {\r\n        modal: () =>\r\n          import('@features/proxy/views/CreateReplaceProxyModalPage.vue'),\r\n      },\r\n      meta: {\r\n        name: RouteNames.ReplaceProxy,\r\n        title: 'proxy.routes.replaceProxy',\r\n        authRequirements: authRequirementReadWrite,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nconst ProxiesRegisterProxyUserRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/fullmakter/extern/:ticketId/'),\r\n  component: () => import('@features/proxy/views/RegisterProxyUserPage.vue'),\r\n  name: RouteNames.RegisterProxyUser,\r\n  props: true,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.RegisterProxyUser,\r\n    title: 'proxy.routes.registerProxyUser',\r\n    authRequirements: authRequirementsMemberProxyPublic,\r\n  },\r\n  children: [],\r\n};\r\n\r\nconst ProxiesRegisterProxyUserCallbackRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/fullmakter/extern/:ticketId/slutfor'),\r\n  component: () =>\r\n    import('@features/proxy/views/RegisterProxyUserCallbackPage.vue'),\r\n  name: RouteNames.RegisterProxyUserCallback,\r\n  props: (route) => ({\r\n    ...route.params,\r\n    ...route.query,\r\n  }),\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.RegisterProxyUserCallback,\r\n    title: 'proxy.routes.registerProxyUserCallback',\r\n    authRequirements: authRequirementsMemberProxyPublic,\r\n  },\r\n  children: [],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [\r\n  ProxiesHomeRouteDefinition,\r\n  ProxiesProxyRouteDefinition,\r\n  ProxiesRegisterProxyUserRouteDefinition,\r\n  ProxiesRegisterProxyUserCallbackRouteDefinition,\r\n].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Proxy),\r\n);\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsDocumentsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([Role.ServiceSupportRead, Role.ServiceSupportWrite]),\r\n  },\r\n};\r\n\r\nconst basePath = '/medlem-i-sodra';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst SupportHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/skogsagarsupport/'),\r\n  component: () => import('@features/support/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: 'support.routes.homePage',\r\n    authRequirements: authRequirementsDocumentsDefault,\r\n  },\r\n  children: [],\r\n};\r\n\r\nconst OldSupportHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/medlemssupport/'),\r\n  redirect: { name: RouteNames.Home },\r\n};\r\n\r\nconst supportRoutes = [SupportHomeRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Support),\r\n);\r\n\r\nexport const routes: RouteRecordRaw[] = [\r\n  OldSupportHomeRouteDefinition,\r\n  ...supportRoutes,\r\n];\r\n","export enum RouteNames {\r\n  Home = 'Documents_HomePage',\r\n}\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsDocumentsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceDocumentsRead,\r\n  },\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst DocumentsHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/mina-dokument/'),\r\n  component: () => import('@features/documents/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: 'documents.routes.homePage',\r\n    authRequirements: authRequirementsDocumentsDefault,\r\n  },\r\n  children: [],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [DocumentsHomeRouteDefinition].map(\r\n  (route) =>\r\n    addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Documents),\r\n);\r\n","export enum AccountsRouteNames {\r\n  Home = 'Accounts_Home',\r\n  Account = 'Accounts_Account',\r\n  Withdraw = 'Accounts_Withdraw',\r\n  WithdrawCallback = 'Accounts_WithdrawCallback',\r\n  NewAccount = 'Accounts_NewAccount',\r\n  NewAccountCallback = 'Accounts_NewAccountCallback',\r\n}\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { DetailsRouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport { useFeatureManagementStore } from '@/stores/featureManagementStore';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { AccountsRouteNames } from '@/features/accounts/router/routeNames';\r\n\r\nconst authRequirementsDetailsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([\r\n      Role.ServiceProfileCommonRead,\r\n      Role.ServiceProfileCommonWrite,\r\n    ]),\r\n  },\r\n};\r\nconst authRequirementsEconomicsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([\r\n      Role.ServiceProfileEconomicsRead,\r\n      Role.ServiceProfileEconomicsWrite,\r\n    ]),\r\n  },\r\n};\r\nconst basePath = '/medlem-i-sodra';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst economicsBasePath = '/skogsgardens-ekonomi';\r\nfunction getEconomicsPath(path: string) {\r\n  return `${economicsBasePath}${path}`;\r\n}\r\n\r\nconst DetailsHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/profil/'),\r\n  redirect: { name: DetailsRouteNames.HomePage },\r\n  meta: {\r\n    track: true,\r\n    authRequirements: authRequirementsDetailsDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: () => import('@features/details/views/HomePage.vue'),\r\n      name: DetailsRouteNames.HomePage,\r\n      meta: {\r\n        name: DetailsRouteNames.HomePage,\r\n        title: 'details.routes.homePage',\r\n        authRequirements: authRequirementsDetailsDefault,\r\n      },\r\n    },\r\n    {\r\n      path: 'bekrafta',\r\n      component: () =>\r\n        import('@features/details/views/ConfirmOrUpdateDetailsPage.vue'),\r\n      name: DetailsRouteNames.ConfirmOrUpdate,\r\n      meta: {\r\n        name: DetailsRouteNames.ConfirmOrUpdate,\r\n        title: 'details.routes.confirmOrUpdateDetailsPage',\r\n        authRequirements: authRequirementsDetailsDefault,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nconst OldDetailsRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/mina-kontaktuppgifter/'),\r\n  redirect: { name: DetailsRouteNames.HomePage },\r\n};\r\n\r\nconst OldConfirmDetailsRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/mina-kontaktuppgifter/bekrafta'),\r\n  redirect: { name: DetailsRouteNames.ConfirmOrUpdate },\r\n};\r\n\r\nconst EconomicsHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getEconomicsPath('/mina-insatsval/'),\r\n  component: () => import('@features/details/views/EconomicsHomePage.vue'),\r\n  name: DetailsRouteNames.EconomicsHome,\r\n  beforeEnter: () => {\r\n    const featureManagementStore = useFeatureManagementStore();\r\n    if (featureManagementStore.isEnabled(FeatureFlagName.ProfileEconomics)) {\r\n      return { name: AccountsRouteNames.Home };\r\n    }\r\n  },\r\n  meta: {\r\n    track: true,\r\n    name: DetailsRouteNames.EconomicsHome,\r\n    title: 'details.routes.economicsHomePage',\r\n    authRequirements: authRequirementsEconomicsDefault,\r\n  },\r\n  children: [],\r\n};\r\n\r\nconst profileRoutes = [DetailsHomeRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Profile),\r\n);\r\n\r\nconst economicProfileRoutes = [EconomicsHomeRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.EconomicProfile),\r\n);\r\n\r\nexport const routes: RouteRecordRaw[] = [\r\n  OldDetailsRouteDefinition,\r\n  OldConfirmDetailsRouteDefinition,\r\n  ...profileRoutes,\r\n  ...economicProfileRoutes,\r\n];\r\n","export enum RouteNames {\r\n  Home = 'Production_Home',\r\n  HomeActive = 'Production_Home_Active',\r\n  HomeFinished = 'Production_Home_Finished',\r\n  Details = 'Production_Details',\r\n  DetailsMap = 'Production_DetailsMap',\r\n  DetailsMapTreatmentUnitList = 'Production_DetailsMap_TreatmentUnitList',\r\n  DetailsMapTreatmentUnitItem = 'Production_DetailsMap_TreatmentUnitItem',\r\n  AssortmentDetails = 'Production_AssortmentDetails',\r\n}\r\n","import { BaseServiceDefinition } from '@/services/BaseService';\r\nimport type { AxiosRequestConfigExtended } from '@/models/axios/types';\r\n\r\nexport abstract class ProductionBaseService extends BaseServiceDefinition {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  protected async get(url: string, params?: any): Promise<any> {\r\n    try {\r\n      return await super.get(url, params);\r\n    } catch (error: any) {\r\n      return Promise.reject(error?.response?.data ?? error);\r\n    }\r\n  }\r\n\r\n  protected async post(\r\n    url: string,\r\n    data?: any,\r\n    config?: AxiosRequestConfigExtended,\r\n  ): Promise<any> {\r\n    try {\r\n      return await super.post(url, data, config);\r\n    } catch (error: any) {\r\n      return Promise.reject(error?.response?.data ?? error);\r\n    }\r\n  }\r\n\r\n  protected async put(\r\n    url: string,\r\n    data: any,\r\n    config?: AxiosRequestConfigExtended,\r\n  ): Promise<any> {\r\n    try {\r\n      return await super.put(url, data, config);\r\n    } catch (error: any) {\r\n      return Promise.reject(error?.response?.data ?? error);\r\n    }\r\n  }\r\n\r\n  protected async delete(url: string, params?: any): Promise<any> {\r\n    try {\r\n      return await super.delete(url, {\r\n        params,\r\n      });\r\n    } catch (error: any) {\r\n      return Promise.reject(error?.response?.data ?? error);\r\n    }\r\n  }\r\n\r\n  protected async sleep(ms: number): Promise<void> {\r\n    return new Promise((resolve) => setTimeout(resolve, ms));\r\n  }\r\n}\r\n","import { ProductionBaseService } from './ProductionBaseService';\r\n\r\nclass ProductionCustomEventService extends ProductionBaseService {\r\n  public constructor() {\r\n    super();\r\n  }\r\n  public async trackOpenProduction(): Promise<void> {\r\n    return await this.post(`/api/v1/production/customevents/openProduction`);\r\n  }\r\n\r\n  public async trackOpenTimberDeliveriesLink(): Promise<void> {\r\n    return await this.post(`/api/v1/production/customevents/openLink`);\r\n  }\r\n\r\n  public async trackOpenAssortmentPowerBiReportPage(): Promise<void> {\r\n    return await this.post(\r\n      `/api/v1/production/customevents/openAssortmentPowerBiReportPage`,\r\n    );\r\n  }\r\n}\r\n\r\nconst productionCustomEventService: ProductionCustomEventService =\r\n  new ProductionCustomEventService();\r\n\r\nexport default productionCustomEventService;\r\n","import { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { RouterView, type RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport productionCustomEventService from '../services/ProductionCustomEventService';\r\n\r\nconst authRequirementsProductionDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  featureFlag: FeatureFlagName.MemberProduction,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceProductionRead,\r\n  },\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst ProductionLayoutRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/bestallda-tjanster/'),\r\n  component: () => import('@/features/production/views/LayoutPage.vue'),\r\n  meta: {\r\n    title: 'production.routes.homePage',\r\n    track: true,\r\n    authRequirements: authRequirementsProductionDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: RouterView,\r\n      name: RouteNames.Home,\r\n      props: (route) => ({\r\n        ...route.params,\r\n      }),\r\n      beforeEnter: () => {\r\n        productionCustomEventService.trackOpenProduction();\r\n        return true;\r\n      },\r\n      redirect: { name: RouteNames.HomeActive },\r\n      meta: {\r\n        name: RouteNames.Home,\r\n      },\r\n      children: [\r\n        {\r\n          path: 'aktiva',\r\n          component: () => import('@/features/production/views/HomePage.vue'),\r\n          name: RouteNames.HomeActive,\r\n          props: {\r\n            archived: false,\r\n          },\r\n          meta: {\r\n            name: RouteNames.HomeActive,\r\n          },\r\n        },\r\n        {\r\n          path: 'avslutade',\r\n          component: () => import('@/features/production/views/HomePage.vue'),\r\n          name: RouteNames.HomeFinished,\r\n          props: {\r\n            archived: true,\r\n          },\r\n          meta: {\r\n            name: RouteNames.HomeFinished,\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    {\r\n      path: 'tjanst/:serviceOrderNumber',\r\n      component: () => import('@/features/production/views/DetailsPage.vue'),\r\n      name: RouteNames.Details,\r\n      props: (route) => ({\r\n        ...route.params,\r\n      }),\r\n      meta: {\r\n        name: RouteNames.Details,\r\n      },\r\n    },\r\n    {\r\n      path: 'tjanst/:serviceOrderNumber/inmatt',\r\n      component: () =>\r\n        import('@/features/production/views/AssortmentPowerBiReportPage.vue'),\r\n      name: RouteNames.AssortmentDetails,\r\n      props: (route) => ({\r\n        ...route.params,\r\n      }),\r\n      beforeEnter: () => {\r\n        productionCustomEventService.trackOpenAssortmentPowerBiReportPage();\r\n        return true;\r\n      },\r\n      meta: {\r\n        name: RouteNames.AssortmentDetails,\r\n        authRequirements: {\r\n          ...authRequirementsProductionDefault,\r\n          featureFlag: FeatureFlagName.MemberProductionAssortmentsPowerBi,\r\n        },\r\n      },\r\n    },\r\n    {\r\n      path: 'tjanst/:serviceOrderNumber/karta',\r\n      component: () => import('@/features/production/views/DetailsMapPage.vue'),\r\n      name: RouteNames.DetailsMap,\r\n      redirect: { name: RouteNames.DetailsMapTreatmentUnitList },\r\n      props: (route) => ({\r\n        ...route.params,\r\n      }),\r\n      meta: {\r\n        name: RouteNames.DetailsMap,\r\n        authRequirements: {\r\n          ...authRequirementsProductionDefault,\r\n          featureFlag: FeatureFlagName.MemberProductionMap,\r\n        },\r\n        hideContactBar: true,\r\n      },\r\n      // Child routes inherit meta of parent\r\n      children: [\r\n        {\r\n          path: 'atgardsobjekt',\r\n          component: () =>\r\n            import('../views/detailsMap/TreatmentUnitListView.vue'),\r\n          name: RouteNames.DetailsMapTreatmentUnitList,\r\n          props: (route) => ({\r\n            ...route.params,\r\n            ...route.query,\r\n          }),\r\n          meta: {\r\n            name: RouteNames.DetailsMapTreatmentUnitList,\r\n          },\r\n        },\r\n        {\r\n          path: 'atgardsobjekt/:guid',\r\n          component: () =>\r\n            import('../views/detailsMap/TreatmentUnitItemView.vue'),\r\n          name: RouteNames.DetailsMapTreatmentUnitItem,\r\n          props: (route) => ({\r\n            ...route.params,\r\n            ...route.query,\r\n          }),\r\n          meta: {\r\n            name: RouteNames.DetailsMapTreatmentUnitItem,\r\n            sidebarFullyExpanded: true,\r\n          },\r\n        },\r\n      ],\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [ProductionLayoutRouteDefinition].map(\r\n  (route) =>\r\n    addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Production),\r\n);\r\n","export enum RouteNames {\r\n  Home = 'MyMap_Home',\r\n  HomeCompartmentList = 'MyMap_Home_CompartmentList',\r\n  HomeCompartmentItem = 'MyMap_Home_CompartmentItem',\r\n  HomeActivityList = 'MyMap_Home_ActivityList',\r\n  HomeActivityItem = 'MyMap_Home_ActivityItem',\r\n  HomeNoteList = 'MyMap_Home_NoteList',\r\n  HomeNoteItem = 'MyMap_Home_NoteItem',\r\n  SymbolExplanations = 'MyMap_SymbolExplanations',\r\n}\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsMyMapDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([Role.ServiceMyMapRead, Role.ServiceMyMapWrite]),\r\n  },\r\n};\r\n\r\nconst basePath = '/min-skog';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst MyMapHomeRouteDefintion: RouteRecordRaw = {\r\n  path: getPath('/min-karta/'),\r\n  component: () => import('@/features/myMap/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  props: (route) => ({\r\n    ...route.params,\r\n    ...route.query,\r\n  }),\r\n  redirect: { name: RouteNames.HomeCompartmentList },\r\n  meta: {\r\n    name: RouteNames.Home,\r\n    title: 'myMap.common.pageName',\r\n    authRequirements: authRequirementsMyMapDefault,\r\n    hideContactBar: true,\r\n  },\r\n  // Child routes inherit meta of parent\r\n  children: [\r\n    {\r\n      path: 'skogsbruksplaner/:planId?',\r\n      component: () => import('../views/home/CompartmentListView.vue'),\r\n      name: RouteNames.HomeCompartmentList,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeCompartmentList,\r\n        requiresForestManagementPlan: true,\r\n      },\r\n    },\r\n    {\r\n      path: 'skogsbruksplaner/:planId?/avdelningar/:compartmentId',\r\n      component: () => import('../views/home/CompartmentItemView.vue'),\r\n      name: RouteNames.HomeCompartmentItem,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeCompartmentItem,\r\n        requiresForestManagementPlan: true,\r\n        sidebarFullyExpanded: true,\r\n      },\r\n    },\r\n    {\r\n      path: 'skogsbruksplaner/:planId?/atgarder',\r\n      component: () => import('../views/home/ActivityListView.vue'),\r\n      name: RouteNames.HomeActivityList,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeActivityList,\r\n        requiresForestManagementPlan: true,\r\n        authRequirements: authRequirementsMyMapDefault,\r\n      },\r\n    },\r\n    {\r\n      path: 'skogsbruksplaner/:planId?/atgarder/:activityId',\r\n      component: () => import('../views/home/ActivityItemView.vue'),\r\n      name: RouteNames.HomeActivityItem,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeActivityItem,\r\n        requiresForestManagementPlan: true,\r\n        sidebarFullyExpanded: true,\r\n        authRequirements: authRequirementsMyMapDefault,\r\n      },\r\n    },\r\n    {\r\n      path: 'noteringar',\r\n      component: () => import('../views/home/NoteListView.vue'),\r\n      name: RouteNames.HomeNoteList,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeNoteList,\r\n      },\r\n    },\r\n    {\r\n      path: 'noteringar/:noteId',\r\n      component: () => import('../views/home/NoteItemView.vue'),\r\n      name: RouteNames.HomeNoteItem,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.HomeNoteItem,\r\n        sidebarFullyExpanded: true,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [MyMapHomeRouteDefintion].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.MyMap),\r\n);\r\n","import type { RouteMeta, RouteRecordRaw } from 'vue-router';\r\n\r\nexport enum RequiredCustomerType {\r\n  Active = 0,\r\n  Inactive = 1,\r\n  Any = 2,\r\n}\r\n\r\nexport interface SodraElRouteMeta extends RouteMeta {\r\n  requiredCustomerType: RequiredCustomerType;\r\n}\r\n\r\nexport type SodraElRouteRecordRaw = RouteRecordRaw & {\r\n  meta: SodraElRouteMeta;\r\n  children?: SodraElRouteRecordRaw[];\r\n};\r\n","export enum RouteNames {\r\n  Home = 'SodraEl_Home',\r\n  Statistics = 'SodraEl_Statistics',\r\n  Invoices = 'SodraEl_Invoices',\r\n  CustomerDetails = 'SodraEl_CustomerDetails',\r\n  Agreements = 'SodraEl_Agreements',\r\n  NonCustomer = 'SodraEl_NonCustomer',\r\n  Contact = 'SodraEl_Contact',\r\n}\r\n","import type { AuthRequirements } from '@/router/authRequirements';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RequiredCustomerType, type SodraElRouteRecordRaw } from './types';\r\nimport { RouteNames } from './routeNames';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsSodraElDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set<Role>([Role.ServiceSodraElRead, Role.ServiceSodraElWrite]),\r\n  },\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nfunction getPath(path: string): string {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst SodraElHomeRouteDefinition: SodraElRouteRecordRaw = {\r\n  path: getPath('/sodra-el/'),\r\n  component: () => import('@/features/sodraEl/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: 'sodraEl.routes.home',\r\n    authRequirements: authRequirementsSodraElDefault,\r\n    requiredCustomerType: RequiredCustomerType.Any,\r\n  },\r\n  children: [\r\n    {\r\n      path: 'statistik',\r\n      component: () => import('@features/sodraEl/views/StatisticsPage.vue'),\r\n      name: RouteNames.Statistics,\r\n      meta: {\r\n        name: RouteNames.Statistics,\r\n        requiredCustomerType: RequiredCustomerType.Active,\r\n      },\r\n    },\r\n    {\r\n      path: 'fakturor',\r\n      component: () => import('@features/sodraEl/views/InvoicesPage.vue'),\r\n      name: RouteNames.Invoices,\r\n      meta: {\r\n        name: RouteNames.Invoices,\r\n        requiredCustomerType: RequiredCustomerType.Active,\r\n      },\r\n    },\r\n    {\r\n      path: 'kunduppgifter',\r\n      component: () =>\r\n        import('@features/sodraEl/views/CustomerDetailsPage.vue'),\r\n      name: RouteNames.CustomerDetails,\r\n      meta: {\r\n        name: RouteNames.CustomerDetails,\r\n        requiredCustomerType: RequiredCustomerType.Active,\r\n      },\r\n    },\r\n    {\r\n      path: 'avtal',\r\n      component: () => import('@features/sodraEl/views/AgreementsPage.vue'),\r\n      name: RouteNames.Agreements,\r\n      meta: {\r\n        name: RouteNames.Agreements,\r\n        requiredCustomerType: RequiredCustomerType.Active,\r\n      },\r\n    },\r\n    {\r\n      path: 'ny-kund',\r\n      component: () => import('@features/sodraEl/views/NonCustomerPage.vue'),\r\n      name: RouteNames.NonCustomer,\r\n      meta: {\r\n        name: RouteNames.NonCustomer,\r\n        requiredCustomerType: RequiredCustomerType.Inactive,\r\n      },\r\n    },\r\n    {\r\n      path: 'kontakt',\r\n      component: () => import('@features/sodraEl/views/ContactPage.vue'),\r\n      name: RouteNames.Contact,\r\n      meta: {\r\n        name: RouteNames.Contact,\r\n        requiredCustomerType: RequiredCustomerType.Any,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [SodraElHomeRouteDefinition].map(\r\n  (route) => addPageFeatureTypeToRouteRecursive(route, PageFeatureType.SodraEl),\r\n);\r\n","export enum CertificationRouteNames {\r\n  Home = 'Certification_Home',\r\n}\r\n","const BasePath = '/min-skog/skogscertifiering';\r\n\r\nexport const CertificationPaths = {\r\n  BasePath,\r\n  DocumentsEService: `${BasePath}/dokument-om-skogscertifiering`,\r\n  GetCertifiedEService: `${BasePath}/bli-certifierad`,\r\n} as const;\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { CertificationRouteNames } from './routeNames';\r\nimport { CertificationPaths } from './paths';\r\n\r\nconst authRequirementsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.PageCertificationRead,\r\n  },\r\n};\r\n\r\nconst CertificationLayoutRouteDefinition: RouteRecordRaw = {\r\n  path: `${CertificationPaths.BasePath}/`,\r\n  component: () => import('@/views/FeatureLayoutPage.vue'),\r\n  meta: {\r\n    title: 'certification.routes.layout',\r\n    track: true,\r\n    authRequirements: authRequirementsDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: () => import('@/features/certification/views/HomePage.vue'),\r\n      name: CertificationRouteNames.Home,\r\n      meta: {\r\n        name: CertificationRouteNames.Home,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes = [CertificationLayoutRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Certification),\r\n);\r\n","export enum PriceConditionsRouteNames {\r\n  Overview = 'PriceConditions_Overview',\r\n  BasePriceAndMarketPremiums = 'PriceConditions_BasePriceAndMarketPremiums',\r\n  RewardedAchievements = 'PriceConditions_RewardedAchievments',\r\n  ProfitSharing = 'PriceConditions_ProfitSharing',\r\n}\r\n","import type { AuthRequirements } from '@/router/authRequirements';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { PriceConditionsRouteNames } from './routeNames';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\n\r\nconst authRequirementsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  featureFlag: FeatureFlagName.PriceConditions,\r\n  roleRequirement: undefined,\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst PriceConditionsLayoutRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/sa-fungerar-sodras-prissattning/'),\r\n  component: () => import('@/features/priceConditions/views/LayoutPage.vue'),\r\n  redirect: { name: PriceConditionsRouteNames.Overview },\r\n  meta: {\r\n    track: true,\r\n    authRequirements: authRequirementsDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: 'oversikt/',\r\n      name: PriceConditionsRouteNames.Overview,\r\n      component: () => import('@/views/ContentPage.vue'),\r\n      meta: {\r\n        title: 'priceConditions.routes.overview',\r\n        name: PriceConditionsRouteNames.Overview,\r\n      },\r\n    },\r\n    {\r\n      path: 'grundpris-och-marknadspremier/',\r\n      component: () => import('@/views/ContentPage.vue'),\r\n      name: PriceConditionsRouteNames.BasePriceAndMarketPremiums,\r\n      meta: {\r\n        title: 'priceConditions.routes.basePrice',\r\n        name: PriceConditionsRouteNames.BasePriceAndMarketPremiums,\r\n      },\r\n    },\r\n    {\r\n      path: 'prestationer-som-premieras/',\r\n      name: PriceConditionsRouteNames.RewardedAchievements,\r\n      component: () => import('@/views/ContentPage.vue'),\r\n      meta: {\r\n        title: 'priceConditions.routes.rewardedAchievements',\r\n        name: PriceConditionsRouteNames.RewardedAchievements,\r\n      },\r\n    },\r\n    {\r\n      path: 'vinstdelning/',\r\n      name: PriceConditionsRouteNames.ProfitSharing,\r\n      component: () => import('@/views/ContentPage.vue'),\r\n      meta: {\r\n        title: 'priceConditions.routes.profitSharing',\r\n        name: PriceConditionsRouteNames.ProfitSharing,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes: RouteRecordRaw[] = [\r\n  PriceConditionsLayoutRouteDefinition,\r\n].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.PriceConditions),\r\n);\r\n","import { Logger } from '@/utils/Logger';\r\nimport type {\r\n  RouteLocationNamedRaw,\r\n  RouteLocationNormalized,\r\n} from 'vue-router';\r\n\r\nexport function grandIdCallbackGuard(\r\n  to: RouteLocationNormalized,\r\n  fallbackRoute: RouteLocationNamedRaw,\r\n): RouteLocationNamedRaw | undefined {\r\n  if (!to.query.grandidsession?.toString()) {\r\n    Logger.debug(\r\n      `grandIdCallbackGuard - Missing grandidsession in query parameter. Falling back to route ${fallbackRoute.name?.toString()}`,\r\n    );\r\n    return fallbackRoute;\r\n  }\r\n}\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { AccountsRouteNames } from './routeNames';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { grandIdCallbackGuard } from './guards/grandidCallbackGuard';\r\n\r\nconst authRequirementsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  featureFlag: FeatureFlagName.Accounts,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceFinanceRead,\r\n  },\r\n};\r\n\r\nconst authRequirementsReadWrite: AuthRequirements = {\r\n  ...authRequirementsDefault,\r\n  roleRequirement: {\r\n    type: 'and',\r\n    roles: new Set([Role.ServiceFinanceRead, Role.ServiceFinanceWrite]),\r\n  },\r\n};\r\n\r\nconst AccountsRouteDefinition: RouteRecordRaw = {\r\n  path: '/skogsgardens-ekonomi/konton-i-sodra/',\r\n  component: () => import('@/views/FeatureLayoutPage.vue'),\r\n  meta: {\r\n    track: true,\r\n    authRequirements: authRequirementsDefault,\r\n    title: 'accounts.routes.home',\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: () => import('@/features/accounts/views/HomePage.vue'),\r\n      name: AccountsRouteNames.Home,\r\n      meta: {\r\n        name: AccountsRouteNames.Home,\r\n      },\r\n      children: [\r\n        {\r\n          path: 'nytt-konto',\r\n          name: AccountsRouteNames.NewAccount,\r\n          components: {\r\n            modal: () =>\r\n              import(\r\n                '@/features/accounts/views/modals/NewAccountModalPage.vue'\r\n              ),\r\n          },\r\n          meta: {\r\n            authRequirements: authRequirementsReadWrite,\r\n          },\r\n        },\r\n      ],\r\n    },\r\n    {\r\n      path: 'nytt-konto/slutfor',\r\n      name: AccountsRouteNames.NewAccountCallback,\r\n      beforeEnter: (to) =>\r\n        grandIdCallbackGuard(to, { name: AccountsRouteNames.Home }),\r\n      component: () =>\r\n        import(\r\n          '@/features/accounts/views/modals/NewAccountCallbackModalPage.vue'\r\n        ),\r\n      meta: {\r\n        name: AccountsRouteNames.NewAccountCallback,\r\n        authRequirements: authRequirementsReadWrite,\r\n      },\r\n    },\r\n    {\r\n      path: 'konto/:id/',\r\n      children: [\r\n        {\r\n          path: '',\r\n          component: () => import('@/features/accounts/views/AccountPage.vue'),\r\n          name: AccountsRouteNames.Account,\r\n          props: (route) => ({\r\n            ...route.params,\r\n          }),\r\n          meta: {\r\n            name: AccountsRouteNames.Account,\r\n          },\r\n          children: [\r\n            {\r\n              path: 'uttag',\r\n              components: {\r\n                modal: () =>\r\n                  import(\r\n                    '@/features/accounts/views/modals/WithdrawModalPage.vue'\r\n                  ),\r\n              },\r\n              props: true,\r\n              name: AccountsRouteNames.Withdraw,\r\n              meta: {\r\n                name: AccountsRouteNames.Withdraw,\r\n                authRequirements: authRequirementsReadWrite,\r\n              },\r\n            },\r\n          ],\r\n        },\r\n        {\r\n          path: 'uttag/slutfor',\r\n          component: () =>\r\n            import(\r\n              '@/features/accounts/views/modals/WithdrawCallbackModalPage.vue'\r\n            ),\r\n          name: AccountsRouteNames.WithdrawCallback,\r\n          props: (route) => ({ ...route.params }),\r\n          beforeEnter: (to) => {\r\n            const fallbackRoute = to.params.id\r\n              ? {\r\n                  name: AccountsRouteNames.Account,\r\n                  params: { id: to.params.id },\r\n                }\r\n              : { name: AccountsRouteNames.Home };\r\n\r\n            return grandIdCallbackGuard(to, fallbackRoute);\r\n          },\r\n          meta: {\r\n            name: AccountsRouteNames.WithdrawCallback,\r\n            authRequirements: authRequirementsReadWrite,\r\n          },\r\n        },\r\n      ],\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes = [AccountsRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.Accounts),\r\n);\r\n","export enum RouteNames {\r\n  Home = 'PriceCalculation_Home',\r\n}\r\n","const basePath: string = 'priceCalculation.routes';\r\n\r\nexport const RouteTitlePaths = {\r\n  Home: `${basePath}.homePage`,\r\n};\r\n","import { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { RouteTitlePaths } from './routeTitlePaths';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsPriceCalculationDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServicePriceCalculationRead,\r\n  },\r\n  featureFlag: FeatureFlagName.PriceCalculation,\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nconst priceCalculationPath = '/priskalkyl/';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst PriceCalculationHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath(priceCalculationPath),\r\n  name: RouteNames.Home,\r\n  component: () => import('@/features/priceCalculation/views/HomePage.vue'),\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: RouteTitlePaths.Home,\r\n    authRequirements: {\r\n      ...authRequirementsPriceCalculationDefault,\r\n    },\r\n  },\r\n};\r\n\r\nconst OldPriceCalculationHomeRouteDefinition: RouteRecordRaw = {\r\n  path: getPath('/prisjamforelseverktyg/'),\r\n  redirect: { name: RouteNames.Home },\r\n};\r\n\r\nconst priceCalculationRoutes = [PriceCalculationHomeRouteDefinition].map(\r\n  (route) =>\r\n    addPageFeatureTypeToRouteRecursive(route, PageFeatureType.PriceCalculation),\r\n);\r\n\r\nexport const routes: RouteRecordRaw[] = [\r\n  OldPriceCalculationHomeRouteDefinition,\r\n  ...priceCalculationRoutes,\r\n];\r\n","export enum EconomicDevelopmentRouteNames {\r\n  Home = 'EconomicDevelopment_Home',\r\n}\r\n","import { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { EconomicDevelopmentRouteNames } from './routeNames';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { Role } from '@/models/memberProfile/Role';\r\n\r\nconst authRequirementsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  featureFlag: FeatureFlagName.EconomicDevelopment,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceEconomicDevelopmentRead,\r\n  },\r\n};\r\n\r\nconst basePath = '/skogsgardens-ekonomi/ekonomisk-utveckling/';\r\n\r\nconst EconomicDevelopmentLayoutRouteDefinition: RouteRecordRaw = {\r\n  path: basePath,\r\n  component: () => import('@/views/FeatureLayoutPage.vue'),\r\n  meta: {\r\n    title: 'economicDevelopment.routes.home',\r\n    track: true,\r\n    authRequirements: authRequirementsDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: () =>\r\n        import('@/features/economicDevelopment/views/HomePage.vue'),\r\n      name: EconomicDevelopmentRouteNames.Home,\r\n      meta: {\r\n        name: EconomicDevelopmentRouteNames.Home,\r\n        authRequirements: authRequirementsDefault,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes = [EconomicDevelopmentLayoutRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(\r\n    route,\r\n    PageFeatureType.EconomicDevelopment,\r\n  ),\r\n);\r\n","export enum CapitalTradeRouteNames {\r\n  Home = 'CapitalTrade_Home',\r\n  TradePeriods = 'CapitalTrade_TradePeriods',\r\n}\r\n","const basePath: string = 'capitalTrade.routes';\r\n\r\nexport const RouteTitlePaths = {\r\n  Home: `${basePath}.home`,\r\n  TradePeriods: `${basePath}.tradePeriods`,\r\n};\r\n","import { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { CapitalTradeRouteNames } from './routeNames';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport { RouteTitlePaths } from './routeTitlePaths';\r\n\r\nconst authRequirementsDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  featureFlag: FeatureFlagName.CapitalTrade,\r\n  roleRequirement: {\r\n    type: 'single',\r\n    role: Role.ServiceTradeWrite,\r\n  },\r\n};\r\n\r\nconst basePath = '/skogsgardens-ekonomi/handel-med-insatskapital/';\r\n\r\nconst CapitalTradeHomeRouteDefinition: RouteRecordRaw = {\r\n  path: basePath,\r\n  component: () => import('@/views/FeatureLayoutPage.vue'),\r\n  meta: {\r\n    title: RouteTitlePaths.Home,\r\n    track: true,\r\n    authRequirements: authRequirementsDefault,\r\n  },\r\n  children: [\r\n    {\r\n      path: '',\r\n      component: () => import('@/features/capitalTrade/views/HomePage.vue'),\r\n      name: CapitalTradeRouteNames.Home,\r\n      meta: {\r\n        name: CapitalTradeRouteNames.Home,\r\n        authRequirements: authRequirementsDefault,\r\n      },\r\n    },\r\n    {\r\n      path: 'handelsperioder',\r\n      component: () =>\r\n        import('@/features/capitalTrade/views/TradePeriodsPage.vue'),\r\n      name: CapitalTradeRouteNames.TradePeriods,\r\n      meta: {\r\n        title: RouteTitlePaths.TradePeriods,\r\n        authRequirements: authRequirementsDefault,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nexport const routes = [CapitalTradeHomeRouteDefinition].map((route) =>\r\n  addPageFeatureTypeToRouteRecursive(route, PageFeatureType.CapitalTrade),\r\n);\r\n","import { createI18n } from 'vue-i18n';\r\n\r\nimport svGlobal from '@/i18n/locales/sv.json';\r\nimport svProxy from '@features/proxy/i18n/locales/sv.json';\r\nimport svSupport from '@/features/support/i18n/locales/sv.json';\r\nimport svTimberManagerV2 from '@features/timberManagerV2/i18n/locales/sv.json';\r\nimport svTimberManagerV3 from '@features/timberManagerV3/i18n/locales/sv.json';\r\nimport svMyMap from '@features/myMap/i18n/locales/sv.json';\r\nimport svMap from '@features/map/i18n/locales/sv.json';\r\nimport svDocuments from '@features/documents/i18n/locales/sv.json';\r\nimport svDetails from '@features/details/i18n/locales/sv.json';\r\nimport svProduction from '@features/production/i18n/locales/sv.json';\r\nimport svSodraEl from '@/features/sodraEl/i18n/locales/sv.json';\r\nimport svCertification from '@features/certification/i18n/locales/sv.json';\r\nimport svEconomicDevelopment from '@features/economicDevelopment/i18n/locales/sv.json';\r\nimport svPriceConditions from '@features/priceConditions/i18n/locales/sv.json';\r\nimport svAccounts from '@features/accounts/i18n/locales/sv.json';\r\nimport svPriceCalculation from '@features/priceCalculation/i18n/locales/sv.json';\r\nimport svCapitalTrade from '@features/capitalTrade/i18n/locales/sv.json';\r\n\r\nconst sv = {\r\n  ...svGlobal,\r\n  ...svProxy,\r\n  ...svTimberManagerV2,\r\n  ...svTimberManagerV3,\r\n  ...svMyMap,\r\n  ...svMap,\r\n  ...svDocuments,\r\n  ...svDetails,\r\n  ...svSupport,\r\n  ...svProduction,\r\n  ...svSodraEl,\r\n  ...svCertification,\r\n  ...svPriceConditions,\r\n  ...svAccounts,\r\n  ...svPriceCalculation,\r\n  ...svEconomicDevelopment,\r\n  ...svCapitalTrade,\r\n};\r\n\r\nconst defaultLocale = 'sv';\r\n\r\nexport type MessageSchema = typeof sv;\r\n\r\nexport const NumberFormats = {\r\n  Currency: 'currency',\r\n  Percent: 'percent',\r\n} as const;\r\n\r\nconst i18n = createI18n<[MessageSchema], 'sv'>({\r\n  legacy: false,\r\n  locale: defaultLocale,\r\n  fallbackLocale: defaultLocale,\r\n  messages: {\r\n    sv: sv,\r\n  },\r\n  numberFormats: {\r\n    sv: {\r\n      [NumberFormats.Currency]: {\r\n        style: 'currency',\r\n        currency: 'SEK',\r\n        minimumFractionDigits: 0,\r\n        maximumFractionDigits: 20,\r\n      },\r\n      [NumberFormats.Percent]: {\r\n        style: 'percent',\r\n        minimumFractionDigits: 2,\r\n        maximumFractionDigits: 2,\r\n      },\r\n    },\r\n  },\r\n});\r\n\r\nexport default i18n;\r\n","import type { Page } from '@/models/content/Page';\r\nimport pageService from '@/services/PagesService';\r\nimport { Logger } from '@/utils/Logger';\r\nimport { defineStore } from 'pinia';\r\nimport { reactive } from 'vue';\r\nimport { CommonArrayStore } from './common/CommonArrayStore';\r\n\r\nexport const usePageStore = defineStore('page', () => {\r\n  const common = reactive(\r\n    new CommonArrayStore<Page, number>({ freshMinutes: 5 }),\r\n  );\r\n\r\n  const actions = {\r\n    getPageById(id: number): Page | null {\r\n      return common.getDataFor(id);\r\n    },\r\n\r\n    async dispatchLoad(pageId: number): Promise<any> {\r\n      // If recently loaded, return\r\n      if (common.hasFreshDataFor(pageId)) {\r\n        return Promise.resolve(common.getDataFor(pageId)!);\r\n      }\r\n\r\n      const currentlyLoadingPromise = common.currentlyLoadingPromise(pageId);\r\n      if (currentlyLoadingPromise !== null) {\r\n        Logger.debug(\r\n          'Already loading, waiting for existing load to finish',\r\n          'page',\r\n        );\r\n        return currentlyLoadingPromise;\r\n      }\r\n\r\n      const loadingPromise = pageService\r\n        .getPage(pageId, false, true)\r\n        .then((response) => {\r\n          common.setLoadingComplete({ id: pageId, data: response });\r\n          Logger.debug('Load page success', response);\r\n          return Promise.resolve(response);\r\n        })\r\n        .catch((error) => {\r\n          Logger.warn('Load page failed', error);\r\n          common.setLoadingError({ id: pageId, error });\r\n          return Promise.reject(error);\r\n        });\r\n\r\n      common.setLoading({ id: pageId, loadingPromise, clearData: true });\r\n\r\n      return loadingPromise;\r\n    },\r\n  };\r\n\r\n  return {\r\n    ...actions,\r\n  };\r\n});\r\n","import { Config } from '@/utils/Config';\r\n\r\nexport default class UrlUtil {\r\n  private static baseCmsPathRegex: RegExp;\r\n\r\n  public static getLastSegment(url: string): string | undefined {\r\n    const segments = url.split('/');\r\n    return segments.pop() || segments.pop(); // Pop twice handles cases of trailing /.\r\n  }\r\n\r\n  public static getParameterByName(\r\n    name: string,\r\n    url: string,\r\n  ): string | undefined {\r\n    name = name.replace('[[]]/g', '\\\\$&');\r\n    const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)');\r\n    const results = regex.exec(url);\r\n\r\n    if (!results) {\r\n      return undefined;\r\n    }\r\n\r\n    if (!results[2]) {\r\n      return '';\r\n    }\r\n\r\n    return decodeURIComponent(results[2].replace(/\\+/g, ' '));\r\n  }\r\n\r\n  public static replaceCmsPath(path: string, replaceValue = ''): string {\r\n    if (!this.baseCmsPathRegex) {\r\n      this.baseCmsPathRegex = new RegExp(Config.Settings.BaseCmsPathRegex);\r\n    }\r\n    return path.replace(this.baseCmsPathRegex, replaceValue);\r\n  }\r\n}\r\n","export const customElementLoadingEventName = 'customElementLoading';\r\nexport const customElementLoadingEventCompleteName =\r\n  'customElementLoadingComplete';\r\n\r\nclass CustomElementLoadingInstance {\r\n  public dispatchLoadingEvent(customElementName: string) {\r\n    document\r\n      .querySelector(customElementName)\r\n      ?.dispatchEvent(new Event(customElementLoadingEventName));\r\n  }\r\n\r\n  public dispatchLoadingCompleteEvent(customElementName: string) {\r\n    document\r\n      .querySelector(customElementName)\r\n      ?.dispatchEvent(new Event(customElementLoadingEventCompleteName));\r\n  }\r\n}\r\n\r\nexport const CustomElementLoading = new CustomElementLoadingInstance();\r\n","<template>\r\n  <div :ref=\"refs.root\">\r\n    <div v-if=\"error\" class=\"container-fluid\">\r\n      <div class=\"c-alert c-alert--red mb-2\">\r\n        <p class=\"c-alert__body\">\r\n          {{ t('components.componentContent.error') }}\r\n        </p>\r\n      </div>\r\n    </div>\r\n\r\n    <div v-if=\"component && component.id && !error\">\r\n      <div v-if=\"loading && !offline\" class=\"row justify-content-md-center\">\r\n        <div class=\"o-loader o-loader--white\">\r\n          <div class=\"mt-2\">\r\n            <template v-if=\"customElementLoading\">{{\r\n              t('components.componentContent.loading.customElement')\r\n            }}</template>\r\n            <template v-else>{{\r\n              t('components.componentContent.loading.default')\r\n            }}</template>\r\n          </div>\r\n        </div>\r\n      </div>\r\n\r\n      <div v-show=\"!loading || offline\" class=\"container-fluid\">\r\n        <div v-if=\"offline\">\r\n          <div class=\"c-alert c-alert--yellow mb-2\">\r\n            <p class=\"mb-3\">\r\n              <i class=\"mdi mdi-information\"></i>\r\n              <span class=\"c-alert__text\">\r\n                <strong>{{ t('components.componentContent.offline') }}</strong>\r\n              </span>\r\n            </p>\r\n            <div\r\n              v-if=\"componentModel.status.offlineMessage\"\r\n              class=\"c-alert__body mt-2\"\r\n              v-html=\"componentModel.status.offlineMessage\"\r\n            ></div>\r\n          </div>\r\n        </div>\r\n\r\n        <template v-else>\r\n          <div\r\n            :id=\"component.id\"\r\n            :key=\"component.id\"\r\n            class=\"e-service\"\r\n            :style=\"{ opacity: customElementLoading ? 0 : undefined }\"\r\n          ></div>\r\n        </template>\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport {\r\n  computed,\r\n  onBeforeUnmount,\r\n  onMounted,\r\n  onUpdated,\r\n  ref,\r\n  toRefs,\r\n} from 'vue';\r\nimport type { Component as ComponentModel } from '@/models/content/Component';\r\nimport Axios from 'axios';\r\nimport {\r\n  customElementLoadingEventName,\r\n  customElementLoadingEventCompleteName,\r\n} from '@/common/utils/CustomElementLoading';\r\nimport type { Component as MemberProfileComponent } from '@/models/memberProfile/Component';\r\nimport type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport { Config } from '@/utils/Config';\r\nimport storageService from '@/services/StorageService';\r\nimport { StorageTypes } from '@/common/enums/StorageTypes';\r\nimport { getPathFromBreadcrumbs } from '@/router';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { Logger } from '@/utils/Logger';\r\nimport { useI18n } from 'vue-i18n';\r\n\r\nconst { t } = useI18n();\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nconst props = defineProps<{\r\n  componentModel: ComponentModel;\r\n  breadcrumbs: Breadcrumb[];\r\n}>();\r\n\r\nconst { componentModel, breadcrumbs } = toRefs(props);\r\n\r\nconst appendedComponentId = ref('');\r\nconst loading = ref(true);\r\nconst customElementLoading = ref(false);\r\nconst error = ref(false);\r\n\r\nconst refs = {\r\n  root: ref<HTMLElement>(),\r\n  customElement: ref<HTMLElement>(),\r\n};\r\n\r\nconst components = computed(() => {\r\n  return memberProfileStore.effectiveProfile !== null\r\n    ? memberProfileStore.effectiveProfile.components\r\n    : [];\r\n});\r\n\r\nconst component = computed(() => {\r\n  const component = components.value.find(\r\n    (component) => component.id === componentModel.value.componentId,\r\n  );\r\n  return component as MemberProfileComponent;\r\n});\r\n\r\n/**\r\n * Offline if:\r\n * offline == true\r\n * OR\r\n * (\r\n *    (offlineStarts !== undefined OR offlineEnds !=== undefined)\r\n *    AND\r\n *    (offlineStarts === undefined OR offlineStarts is before or exactly now)\r\n *    AND\r\n *    (offlineEnds === undefined OR offlineEnds is after now)\r\n * )\r\n */\r\nconst offline = computed(() => {\r\n  if (!componentModel.value.status) {\r\n    return false;\r\n  }\r\n\r\n  return (\r\n    componentModel.value.status.offline ||\r\n    ((componentModel.value.status.offlineStarts !== undefined ||\r\n      componentModel.value.status.offlineEnds !== undefined) &&\r\n      (componentModel.value.status.offlineStarts === undefined ||\r\n        new Date(componentModel.value.status.offlineStarts) <= new Date()) &&\r\n      (componentModel.value.status.offlineEnds === undefined ||\r\n        new Date(componentModel.value.status.offlineEnds) > new Date()))\r\n  );\r\n});\r\n\r\nonMounted(() => {\r\n  appendedComponentId.value = component.value?.id;\r\n  if (!offline.value) {\r\n    addComponentScript();\r\n  }\r\n});\r\n\r\nonUpdated(() => {\r\n  if (appendedComponentId.value !== component.value?.id) {\r\n    error.value = false;\r\n    appendedComponentId.value = component.value?.id;\r\n\r\n    if (refs.customElement.value !== undefined) {\r\n      removeCustomElementEventListeners();\r\n    }\r\n\r\n    if (!offline.value) {\r\n      addComponentScript();\r\n    }\r\n  }\r\n});\r\n\r\nonBeforeUnmount(() => {\r\n  removeCustomElementEventListeners();\r\n});\r\n\r\nfunction getAppJsFilename(): Promise<string> {\r\n  if (Config.isDevelopment) {\r\n    return Promise.resolve('js/app.js');\r\n  }\r\n\r\n  return Axios.get(component.value.host + 'api/v1/app', {\r\n    headers: {\r\n      Pragma: 'no-cache',\r\n      'Cache-Control': 'no-cache',\r\n    },\r\n  })\r\n    .then((result) => {\r\n      Logger.debug(\r\n        'Successfully loaded custom element app.js filename',\r\n        result,\r\n      );\r\n      return result.data;\r\n    })\r\n    .catch((error) => {\r\n      Logger.warn('Could not load custom element app.js filename', error);\r\n      return '';\r\n    });\r\n}\r\n\r\nasync function addComponentScript() {\r\n  if (!component.value?.element) {\r\n    error.value = true;\r\n    return;\r\n  }\r\n\r\n  error.value = false;\r\n  loading.value = true;\r\n\r\n  const appJsFilename = await getAppJsFilename();\r\n  if (!appJsFilename) {\r\n    error.value = true;\r\n    loading.value = false;\r\n    return;\r\n  }\r\n\r\n  const scriptSrc = component.value.host + appJsFilename;\r\n  if (!document.querySelector('script[src=\"' + scriptSrc + '\"]')) {\r\n    const hostKey = component.value.storageKey + '_host';\r\n    storageService.set(\r\n      StorageTypes.LOCAL,\r\n      hostKey,\r\n      component.value.host,\r\n      false,\r\n    );\r\n\r\n    const pathKey = component.value.storageKey + '_path';\r\n    const path = getPathFromBreadcrumbs(breadcrumbs.value);\r\n    storageService.set(StorageTypes.LOCAL, pathKey, path, false);\r\n\r\n    const scriptElement = document.createElement('script');\r\n    scriptElement.setAttribute('src', scriptSrc);\r\n    scriptElement.setAttribute('type', 'text/javascript');\r\n    document.head.appendChild(scriptElement);\r\n  }\r\n\r\n  const configurationIdKey = component.value.storageKey + '_configurationId';\r\n  if (component.value.configurationId) {\r\n    storageService.set(\r\n      StorageTypes.LOCAL,\r\n      configurationIdKey,\r\n      component.value.configurationId,\r\n      false,\r\n    );\r\n  } else {\r\n    storageService.remove(StorageTypes.LOCAL, configurationIdKey);\r\n  }\r\n\r\n  const componentWrapper = refs.root.value!.querySelector(\r\n    '#' + component.value?.id,\r\n  );\r\n  if (componentWrapper) {\r\n    customElementLoading.value = false;\r\n    refs.customElement.value = document.createElement(component.value.element);\r\n    addCustomElementEventListeners();\r\n    componentWrapper.appendChild(refs.customElement.value);\r\n  }\r\n}\r\n\r\nfunction addCustomElementEventListeners() {\r\n  if (refs.customElement.value === undefined) {\r\n    return;\r\n  }\r\n  refs.customElement.value.addEventListener('vce-ready', onCustomElementReady);\r\n  refs.customElement.value.addEventListener(\r\n    customElementLoadingEventName,\r\n    onCustomElementLoading,\r\n  );\r\n  refs.customElement.value.addEventListener(\r\n    customElementLoadingEventCompleteName,\r\n    onCustomElementLoadingComplete,\r\n  );\r\n}\r\n\r\nfunction removeCustomElementEventListeners() {\r\n  if (refs.customElement.value === undefined) {\r\n    return;\r\n  }\r\n  refs.customElement.value.removeEventListener(\r\n    'vce-ready',\r\n    onCustomElementReady,\r\n  );\r\n  refs.customElement.value.removeEventListener(\r\n    customElementLoadingEventName,\r\n    onCustomElementLoading,\r\n  );\r\n  refs.customElement.value.removeEventListener(\r\n    customElementLoadingEventCompleteName,\r\n    onCustomElementLoadingComplete,\r\n  );\r\n}\r\n\r\nfunction onCustomElementReady() {\r\n  Logger.debug('Custom element ready');\r\n  if (!customElementLoading.value) {\r\n    loading.value = false;\r\n  }\r\n}\r\n\r\nfunction onCustomElementLoading() {\r\n  Logger.debug('CustomElement loading event received.');\r\n  loading.value = true;\r\n  customElementLoading.value = true;\r\n}\r\n\r\nfunction onCustomElementLoadingComplete() {\r\n  Logger.debug('CustomElement loading complete event received.');\r\n  loading.value = false;\r\n  customElementLoading.value = false;\r\n}\r\n</script>\r\n","<template>\r\n  <div\r\n    :ref=\"refs.root\"\r\n    v-if=\"text\"\r\n    :class=\"\r\n      text.backgroundColorClass +\r\n      ' ' +\r\n      (text.backgroundColorClass\r\n        ? 'c-text p-3'\r\n        : 'c-text u-background-color-light-grey')\r\n    \"\r\n    v-html=\"text.text\"\r\n  ></div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Text } from '@/models/content/Text';\r\nimport { VideoModalId } from '@/models/ElementReference';\r\nimport UrlUtil from '@/utils/UrlUtil';\r\nimport { onMounted, onUpdated, ref, toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  text: Text;\r\n}>();\r\n\r\nconst { text } = toRefs(props);\r\n\r\nconst refs = {\r\n  root: ref<HTMLElement>(),\r\n};\r\n\r\nonMounted(() => {\r\n  updateYouTubeLinks();\r\n});\r\n\r\nonUpdated(() => {\r\n  updateYouTubeLinks();\r\n});\r\n\r\nfunction updateYouTubeLinks() {\r\n  refs.root\r\n    .value!.querySelectorAll(\r\n      \"a[href^='https://youtu']:not([target='_blank']), a[href^='https://www.youtube']:not([target='_blank'])\",\r\n    )\r\n    .forEach((element: any) => {\r\n      const href = element.href;\r\n      // Open modal\r\n      let youtubeId = UrlUtil.getParameterByName('v', href);\r\n\r\n      if (!youtubeId) {\r\n        youtubeId = UrlUtil.getLastSegment(href);\r\n      }\r\n\r\n      element.setAttribute('data-target', `#${VideoModalId}`);\r\n      element.setAttribute('data-videoType', 'Youtube');\r\n      element.setAttribute('data-video', youtubeId);\r\n\r\n      element.classList.add('js-modal-trigger');\r\n      element.classList.add('js-video-modal-trigger');\r\n    });\r\n}\r\n</script>\r\n","<template>\r\n  <div>\r\n    <span\r\n      v-if=\"teaser\"\r\n      class=\"c-teaser c-teaser--light-grey\"\r\n      @click.prevent=\"clickedTeaser()\"\r\n    >\r\n      <div class=\"c-teaser__image\">\r\n        <img v-if=\"teaser.imageUrl\" :src=\"teaser.imageUrl\" />\r\n      </div>\r\n      <div class=\"c-teaser__inner\">\r\n        <span class=\"c-teaser__heading\">\r\n          {{ teaser.title }}\r\n        </span>\r\n        <div class=\"c-teaser__text\">\r\n          {{ teaser.text }}\r\n        </div>\r\n        <ul class=\"c-teaser__actions\">\r\n          <li class=\"mt-2\">\r\n            <span class=\"c-teaser__link\">{{ teaser.linkText }}</span>\r\n            <span class=\"c-teaser__link m-1\"\r\n              ><span\r\n                v-if=\"isExternalUrl\"\r\n                class=\"mdi u-color-sodra-black mdi--18 mdi-open-in-new me-2\"\r\n              ></span>\r\n            </span>\r\n          </li>\r\n        </ul>\r\n      </div>\r\n    </span>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Teaser } from '@/models/content/Teaser';\r\nimport UrlUtil from '@/utils/UrlUtil';\r\nimport { computed, toRefs } from 'vue';\r\nimport { useRouter } from 'vue-router';\r\n\r\nconst router = useRouter();\r\n\r\nconst props = defineProps<{\r\n  teaser: Teaser;\r\n}>();\r\n\r\nconst { teaser } = toRefs(props);\r\n\r\nconst isExternalUrl = computed(() => {\r\n  return (\r\n    teaser.value.linkUrl != null && teaser.value.linkUrl.startsWith('http')\r\n  );\r\n});\r\n\r\nfunction clickedTeaser() {\r\n  if (teaser.value.linkUrl) {\r\n    if (isExternalUrl.value) {\r\n      window.open(teaser.value.linkUrl);\r\n    } else {\r\n      router.push(UrlUtil.replaceCmsPath(teaser.value.linkUrl, '/'));\r\n    }\r\n  }\r\n  return false;\r\n}\r\n</script>\r\n","<template>\r\n  <div>\r\n    <div class=\"row\">\r\n      <TeaserContent\r\n        v-for=\"(teaser, index) in teasers.teasers\"\r\n        :key=\"index\"\r\n        :teaser=\"teaser\"\r\n        :class=\"teaser.bootstrapClass\"\r\n      />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport type { Teasers } from '@/models/content/Teasers';\r\nimport TeaserContent from '@/components/content/TeaserContent.vue';\r\n\r\nconst props = defineProps<{\r\n  teasers: Teasers;\r\n}>();\r\n\r\nconst { teasers } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <div class=\"c-accordion__item u-background-color-white\">\r\n    <a class=\"c-accordion__toggle js-accordion-trigger\">\r\n      {{ accordionItem.header }}\r\n    </a>\r\n    <div class=\"c-accordion__content\">\r\n      <div v-html=\"accordionItem.content\"></div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { AccordionItem } from '@/models/content/AccordionItem';\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  accordionItem: AccordionItem;\r\n}>();\r\n\r\nconst { accordionItem } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <div>\r\n    <div class=\"c-accordion c-accordion--white u-full-width\">\r\n      <header class=\"c-accordion__header\">\r\n        {{ accordion.header }}\r\n      </header>\r\n      <AccordionItemContent\r\n        v-for=\"(accordionItem, index) in accordion.accordionItems\"\r\n        :key=\"index\"\r\n        :accordion-item=\"accordionItem\"\r\n      />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Accordion } from '@/models/content/Accordion';\r\nimport AccordionItemContent from '@/components/content/AccordionItemContent.vue';\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  accordion: Accordion;\r\n}>();\r\n\r\nconst { accordion } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <MBanner :image-url=\"banner.imageUrl\">\r\n    <slot></slot>\r\n  </MBanner>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport MBanner from '@/components/common/MBanner.vue';\r\nimport type { Banner } from '@/models/content/Banner';\r\nimport { toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  banner: Banner;\r\n}>();\r\n\r\nconst { banner } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <figure class=\"c-image u-width-100\">\r\n    <img :src=\"image.imageUrl\" />\r\n    <figcaption v-if=\"image.customCaption\">\r\n      {{ image.customCaption }}\r\n    </figcaption>\r\n  </figure>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport type { Image } from '@/models/content/Image';\r\n\r\nconst props = defineProps<{\r\n  image: Image;\r\n}>();\r\n\r\nconst { image } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <div\r\n    class=\"c-text-and-image\"\r\n    :class=\"textAndImage.imageRight ? 'c-text-and-image--image-right' : ''\"\r\n  >\r\n    <img\r\n      class=\"c-text-and-image__image\"\r\n      :src=\"textAndImage.imageUrl\"\r\n      :alt=\"textAndImage.altText\"\r\n    />\r\n    <div\r\n      class=\"c-text-and-image__text\"\r\n      :class=\"\r\n        (textAndImage.textBackgroundColor\r\n          ? 'u-background-color-' + textAndImage.textBackgroundColor\r\n          : '') +\r\n        ' ' +\r\n        (textAndImage.textVerticalPosition\r\n          ? 'c-text-and-image__text--vertical-align-' +\r\n            textAndImage.textVerticalPosition\r\n          : 'c-text-and-image__text--vertical-align-center')\r\n      \"\r\n    >\r\n      <div\r\n        class=\"c-text-and-image__text-inner c-text-and-image__text-inner--padding\"\r\n        :class=\"\r\n          textAndImage.textColor ? 'u-color-' + textAndImage.textColor : ''\r\n        \"\r\n        v-html=\"textAndImage.text\"\r\n      ></div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport type { TextAndImage } from '@/models/content/TextAndImage';\r\n\r\nconst props = defineProps<{\r\n  textAndImage: TextAndImage;\r\n}>();\r\n\r\nconst { textAndImage } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <div\r\n    v-if=\"showMessage\"\r\n    class=\"c-alert ps-0 pe-0 mb-0\"\r\n    :class=\"[\r\n      'c-alert--' + message.messageType,\r\n      message.marginBottom ? 'mb-2' : '',\r\n    ]\"\r\n    style=\"z-index: 1\"\r\n    :data-element-id=\"'message' + message.id\"\r\n  >\r\n    <div class=\"container-fluid\">\r\n      <span class=\"c-alert__text\" v-html=\"message.text\"> </span>\r\n    </div>\r\n    <span\r\n      class=\"js-toggle-hidden c-alert__close\"\r\n      :data-element-id=\"'message' + message.id\"\r\n    ></span>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { Message } from '@/models/content/Message';\r\nimport { computed, toRefs } from 'vue';\r\n\r\nconst props = defineProps<{\r\n  message: Message;\r\n}>();\r\n\r\nconst { message } = toRefs(props);\r\n\r\n/**\r\n * Show message if:\r\n * active == true\r\n * OR\r\n * (\r\n *    (starts === undefined OR start is before or exactly now)\r\n *    AND\r\n *    (ends === undefined OR ends is after now)\r\n * )\r\n */\r\nconst showMessage = computed(() => {\r\n  return (\r\n    message.value.active ||\r\n    ((message.value.starts === undefined ||\r\n      new Date(message.value.starts) <= new Date()) &&\r\n      (message.value.ends === undefined ||\r\n        new Date(message.value.ends) > new Date()))\r\n  );\r\n});\r\n</script>\r\n","export enum ContentType {\r\n  Unknown = 0,\r\n\r\n  Component = 5,\r\n\r\n  Text = 10,\r\n\r\n  Teaser = 15,\r\n\r\n  Teasers = 16,\r\n\r\n  Accordion = 20,\r\n\r\n  AccordionItem = 25,\r\n\r\n  Banner = 30,\r\n\r\n  Image = 35,\r\n\r\n  TextAndImage = 40,\r\n\r\n  Contacts = 45,\r\n\r\n  Contact = 50,\r\n\r\n  Section = 55,\r\n\r\n  Message = 60,\r\n\r\n  News = 75,\r\n}\r\n","<template>\r\n  <div class=\"row\">\r\n    <div\r\n      v-for=\"(contentItem, index) in section.content\"\r\n      :key=\"index\"\r\n      :class=\"\r\n        contentItem.bootstrapClass +\r\n        ' ' +\r\n        (contentItem.hasMarginBottom ? 'mb-3' : '')\r\n      \"\r\n    >\r\n      <ComponentContent\r\n        v-if=\"contentItem.type === ContentType.Component\"\r\n        :component-model=\"contentItem\"\r\n        :breadcrumbs=\"breadcrumbs\"\r\n      />\r\n      <TextContent\r\n        v-else-if=\"contentItem.type === ContentType.Text\"\r\n        :text=\"contentItem\"\r\n      />\r\n      <TeaserContent\r\n        v-else-if=\"contentItem.type === ContentType.Teaser\"\r\n        :teaser=\"contentItem\"\r\n      />\r\n      <TeasersContent\r\n        v-else-if=\"contentItem.type === ContentType.Teasers\"\r\n        :teasers=\"contentItem\"\r\n      />\r\n      <AccordionContent\r\n        v-else-if=\"contentItem.type === ContentType.Accordion\"\r\n        :accordion=\"contentItem\"\r\n      />\r\n      <AccordionItemContent\r\n        v-else-if=\"contentItem.type === ContentType.AccordionItem\"\r\n        :accordion-item=\"contentItem\"\r\n      />\r\n      <BannerContent\r\n        v-else-if=\"contentItem.type === ContentType.Banner\"\r\n        :banner=\"contentItem\"\r\n      >\r\n        <div v-if=\"contentItem\" v-html=\"contentItem.text\"></div>\r\n      </BannerContent>\r\n      <ImageContent\r\n        v-else-if=\"contentItem.type === ContentType.Image\"\r\n        :image=\"contentItem\"\r\n      />\r\n      <TextAndImageContent\r\n        v-else-if=\"contentItem.type === ContentType.TextAndImage\"\r\n        :text-and-image=\"contentItem\"\r\n      />\r\n      <MessageContent\r\n        v-else-if=\"contentItem.type === ContentType.Message\"\r\n        :message=\"contentItem\"\r\n      />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport ComponentContent from '@/components/content/ComponentContent.vue';\r\nimport TextContent from '@/components/content/TextContent.vue';\r\nimport TeaserContent from '@/components/content/TeaserContent.vue';\r\nimport TeasersContent from '@/components/content/TeasersContent.vue';\r\nimport AccordionContent from '@/components/content/AccordionContent.vue';\r\nimport AccordionItemContent from '@/components/content/AccordionItemContent.vue';\r\nimport BannerContent from '@/components/content/BannerContent.vue';\r\nimport ImageContent from '@/components/content/ImageContent.vue';\r\nimport TextAndImageContent from '@/components/content/TextAndImageContent.vue';\r\nimport MessageContent from '@/components/content/MessageContent.vue';\r\nimport type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport { ContentType } from '@/models/content/ContentType';\r\nimport type { Section } from '@/models/content/Section';\r\n\r\nconst props = defineProps<{\r\n  section: Section;\r\n  breadcrumbs: Breadcrumb[];\r\n}>();\r\n\r\nconst { section, breadcrumbs } = toRefs(props);\r\n</script>\r\n","import type { NewsItem } from '@/models/news/NewsItem';\r\nimport { BaseServiceDefinition } from './BaseService';\r\n\r\nclass NewsService extends BaseServiceDefinition {\r\n  constructor() {\r\n    super();\r\n  }\r\n\r\n  public async getNews(newsId: string): Promise<NewsItem[]> {\r\n    try {\r\n      const response = await this.get(`/api/v1/news/${newsId}`);\r\n      return response.data;\r\n    } catch (error) {\r\n      return Promise.reject(error);\r\n    }\r\n  }\r\n}\r\n\r\nconst newsService: NewsService = new NewsService();\r\n\r\nexport default newsService;\r\n","import type { NewsItem } from '@/models/news/NewsItem';\r\nimport newsService from '@/services/NewsService';\r\nimport { Logger } from '@/utils/Logger';\r\nimport { defineStore } from 'pinia';\r\nimport { reactive } from 'vue';\r\nimport { CommonArrayStore } from './common/CommonArrayStore';\r\n\r\nexport const useNewsStore = defineStore('news', () => {\r\n  const common = reactive(\r\n    new CommonArrayStore<NewsItem[], string>({ freshMinutes: 3 }),\r\n  );\r\n\r\n  const actions = {\r\n    getByNewsId(id: string): NewsItem[] | null {\r\n      return common.getDataFor(id);\r\n    },\r\n\r\n    async dispatchLoad(newsId: string): Promise<any> {\r\n      // If recently loaded, return\r\n      if (common.hasFreshDataFor(newsId)) {\r\n        return Promise.resolve(common.getDataFor(newsId)!);\r\n      }\r\n\r\n      const currentlyLoadingPromise = common.currentlyLoadingPromise(newsId);\r\n      if (currentlyLoadingPromise !== null) {\r\n        Logger.debug(\r\n          'Already loading, waiting for existing load to finish',\r\n          'news',\r\n        );\r\n        return currentlyLoadingPromise;\r\n      }\r\n\r\n      const loadingPromise = newsService\r\n        .getNews(newsId)\r\n        .then((response) => {\r\n          common.setLoadingComplete({ id: newsId, data: response });\r\n          Logger.debug('Load news success', response);\r\n          return Promise.resolve(response);\r\n        })\r\n        .catch((error) => {\r\n          Logger.debug('Load news failed', error);\r\n          common.setLoadingError({ id: newsId, error });\r\n          return Promise.reject(error);\r\n        });\r\n\r\n      common.setLoading({ id: newsId, loadingPromise, clearData: true });\r\n\r\n      return loadingPromise;\r\n    },\r\n  };\r\n\r\n  return {\r\n    ...actions,\r\n  };\r\n});\r\n","export default \"__VITE_ASSET__CV_HQr0a__\"","<template>\r\n  <div class=\"mt-3\">\r\n    <header class=\"mb-5\">\r\n      <h2 class=\"u-center-text\">{{ news.heading }}</h2>\r\n    </header>\r\n\r\n    <div v-if=\"isLoading\" class=\"container u-text-center\">\r\n      <div class=\"o-loader mt-5 mb-5 o-loader--white\">\r\n        <div class=\"mt-2\">\r\n          {{ t('components.newsContent.fetching') }}\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div v-else>\r\n      <section\r\n        v-if=\"error || !newsItems.length\"\r\n        class=\"container u-text-center mt-5\"\r\n      >\r\n        <div class=\"row\">\r\n          <div class=\"col-12 u-text-center\">\r\n            <h2 class=\"t-heading-4\">\r\n              {{\r\n                error\r\n                  ? t('components.newsContent.error')\r\n                  : t('components.newsContent.none_received')\r\n              }}\r\n            </h2>\r\n          </div>\r\n        </div>\r\n      </section>\r\n\r\n      <MCarousel\r\n        v-if=\"!error && newsItems.length\"\r\n        class=\"mt-5\"\r\n        :data-per-view=\"4\"\r\n        pagination-control\r\n        data-controls\r\n      >\r\n        <MCarouselSlide v-for=\"(item, index) in newsItems\" :key=\"index\">\r\n          <a :href=\"item.link\" class=\"c-card\" target=\"_blank\">\r\n            <div class=\"c-card__sub-heading\">\r\n              {{ resolveInformationType(item.informationType) }}\r\n            </div>\r\n\r\n            <figure\r\n              class=\"c-card__image\"\r\n              :style=\"{\r\n                'background-image': resolveBackgroundImage(item.imageUrl),\r\n              }\"\r\n            ></figure>\r\n            <article class=\"c-card__text\">\r\n              <h3 class=\"c-card__heading\">{{ item.title }}</h3>\r\n              <p class=\"c-card__summary\">{{ item.description }}</p>\r\n            </article>\r\n            <time class=\"c-card__timestamp\">{{\r\n              formatDate(item.publishedDate)\r\n            }}</time>\r\n          </a>\r\n        </MCarouselSlide>\r\n      </MCarousel>\r\n\r\n      <section>\r\n        <div class=\"row justify-content-center\">\r\n          <div class=\"col-8 col-md-3\">\r\n            <a\r\n              :href=\"newsArchiveLink\"\r\n              target=\"_blank\"\r\n              type=\"button\"\r\n              class=\"o-button o-button--black u-full-width u-center-text mb-3 o-button--forward-icon o-button--bounce u-text-uppercase\"\r\n            >\r\n              {{ t('components.newsContent.newsArchive') }}\r\n            </a>\r\n          </div>\r\n        </div>\r\n      </section>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport type { News } from '@/models/content/News';\r\nimport type { InformationType, NewsItem } from '@/models/news/NewsItem';\r\nimport { useNewsStore } from '@/stores/newsStore';\r\nimport { Config } from '@/utils/Config';\r\nimport { formatDate } from '@/utils/Dates';\r\nimport { computed, ref, toRefs } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport placeHolderImgUrl from '@/assets/placeholder-image.jpg';\r\nimport MCarousel from '../common/carousel/MCarousel.vue';\r\nimport MCarouselSlide from '../common/carousel/MCarouselSlide.vue';\r\n\r\nconst { t, te } = useI18n();\r\nconst newsStore = useNewsStore();\r\n\r\nconst props = defineProps<{\r\n  news: News;\r\n}>();\r\n\r\nconst { news } = toRefs(props);\r\n\r\nconst newsArchiveLink = Config.Settings.NewsArchiveLink;\r\nconst isLoading = ref(false);\r\nconst error = ref(false);\r\n\r\nconst newsItems = computed<NewsItem[]>(() => {\r\n  const items = newsStore.getByNewsId(news.value.id);\r\n\r\n  if (items) {\r\n    return getNthMostRecentNews(items, 20);\r\n  }\r\n\r\n  return [];\r\n});\r\n\r\nasync function loadNews() {\r\n  isLoading.value = true;\r\n\r\n  try {\r\n    await newsStore.dispatchLoad(news.value.id);\r\n  } catch {\r\n    error.value = true;\r\n  } finally {\r\n    isLoading.value = false;\r\n  }\r\n}\r\n\r\nfunction getNthMostRecentNews(\r\n  newsItems: NewsItem[],\r\n  maxCount: number,\r\n): NewsItem[] {\r\n  return sortNewsItemsByDate(newsItems).slice(0, maxCount);\r\n}\r\n\r\nfunction sortNewsItemsByDate(newsItems: NewsItem[]): NewsItem[] {\r\n  return [...newsItems].sort(\r\n    (item1: NewsItem, item2: NewsItem) =>\r\n      new Date(item2.publishedDate).valueOf() -\r\n      new Date(item1.publishedDate).valueOf(),\r\n  );\r\n}\r\n\r\nfunction resolveInformationType(informationType: InformationType) {\r\n  const defaultTranslation = 'components.newsContent.informationTypes.news';\r\n  const exactTranslation = `components.newsContent.informationTypes.${informationType.valueOf()}`;\r\n\r\n  return te(exactTranslation) ? t(exactTranslation) : t(defaultTranslation);\r\n}\r\n\r\nfunction resolveBackgroundImage(imageUrl: string): string {\r\n  if (!imageUrl) {\r\n    imageUrl = placeHolderImgUrl;\r\n  }\r\n\r\n  return `url(${imageUrl})`;\r\n}\r\n\r\nasync function initialize() {\r\n  await loadNews();\r\n}\r\n\r\ninitialize();\r\n</script>\r\n\r\n<style scoped>\r\nbutton.c-carousel__bullet.d-md-none {\r\n  display: none !important;\r\n}\r\n</style>\r\n","<template>\r\n  <div class=\"row\">\r\n    <div\r\n      v-for=\"(contentItem, index) in content\"\r\n      :key=\"index\"\r\n      :class=\"\r\n        contentItem.bootstrapClass +\r\n        ' ' +\r\n        (contentItem.hasMarginBottom ? 'mb-3' : '')\r\n      \"\r\n    >\r\n      <ComponentContent\r\n        v-if=\"contentItem.type === ContentType.Component\"\r\n        :component-model=\"contentItem\"\r\n        :breadcrumbs=\"breadcrumbs\"\r\n      />\r\n      <TextContent\r\n        v-else-if=\"contentItem.type === ContentType.Text\"\r\n        :text=\"contentItem\"\r\n      />\r\n      <TeaserContent\r\n        v-else-if=\"contentItem.type === ContentType.Teaser\"\r\n        :teaser=\"contentItem\"\r\n      />\r\n      <TeasersContent\r\n        v-else-if=\"contentItem.type === ContentType.Teasers\"\r\n        :teasers=\"contentItem\"\r\n      />\r\n      <AccordionContent\r\n        v-else-if=\"contentItem.type === ContentType.Accordion\"\r\n        :accordion=\"contentItem\"\r\n      />\r\n      <AccordionItemContent\r\n        v-else-if=\"contentItem.type === ContentType.AccordionItem\"\r\n        :accordion-item=\"contentItem\"\r\n      />\r\n      <BannerContent\r\n        v-else-if=\"contentItem.type === ContentType.Banner\"\r\n        :banner=\"contentItem\"\r\n      >\r\n        <div v-if=\"contentItem\" v-html=\"contentItem.text\"></div>\r\n      </BannerContent>\r\n      <ImageContent\r\n        v-else-if=\"contentItem.type === ContentType.Image\"\r\n        :image=\"contentItem\"\r\n      />\r\n      <TextAndImageContent\r\n        v-else-if=\"contentItem.type === ContentType.TextAndImage\"\r\n        :text-and-image=\"contentItem\"\r\n      />\r\n      <SectionContent\r\n        v-else-if=\"contentItem.type === ContentType.Section\"\r\n        :section=\"contentItem\"\r\n        :breadcrumbs=\"breadcrumbs\"\r\n      />\r\n      <MessageContent\r\n        v-else-if=\"contentItem.type === ContentType.Message\"\r\n        :message=\"contentItem\"\r\n      />\r\n      <NewsContent\r\n        v-else-if=\"contentItem.type === ContentType.News\"\r\n        :news=\"contentItem\"\r\n      />\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { toRefs } from 'vue';\r\nimport ComponentContent from '@/components/content/ComponentContent.vue';\r\nimport TextContent from '@/components/content/TextContent.vue';\r\nimport TeaserContent from '@/components/content/TeaserContent.vue';\r\nimport TeasersContent from '@/components/content/TeasersContent.vue';\r\nimport AccordionContent from '@/components/content/AccordionContent.vue';\r\nimport AccordionItemContent from '@/components/content/AccordionItemContent.vue';\r\nimport BannerContent from '@/components/content/BannerContent.vue';\r\nimport ImageContent from '@/components/content/ImageContent.vue';\r\nimport TextAndImageContent from '@/components/content/TextAndImageContent.vue';\r\nimport SectionContent from '@/components/content/SectionContent.vue';\r\nimport MessageContent from '@/components/content/MessageContent.vue';\r\nimport NewsContent from '@/components/content/NewsContent.vue';\r\nimport type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport { ContentType } from '@/models/content/ContentType';\r\n\r\nconst props = defineProps<{\r\n  content: any[];\r\n  breadcrumbs: Breadcrumb[];\r\n}>();\r\n\r\nconst { content, breadcrumbs } = toRefs(props);\r\n</script>\r\n","<template>\r\n  <MModal\r\n    v-if=\"\r\n      !memberProfileStore.isMemberImpersonated &&\r\n      !memberProfileStore.isUsingProxy &&\r\n      isNewSession &&\r\n      isTimeToUpdateContactDetails\r\n    \"\r\n    id=\"updateDetailsModal\"\r\n    :title=\"t('homePage.updateDetailsHeader')\"\r\n    close-button\r\n    closeable-by-outside-click-and-esc-key\r\n    show-footer\r\n    show-on-initialize\r\n  >\r\n    <p class=\"mb-0\">\r\n      {{ t('homePage.updateDetailsMessage') }}\r\n    </p>\r\n\r\n    <template #footer>\r\n      <RouterLinkGuarded\r\n        :to=\"{ name: DetailsRouteNames.ConfirmOrUpdate }\"\r\n        class=\"o-button o-button--green\"\r\n        >{{ t('homePage.updateDetailsButton') }}</RouterLinkGuarded\r\n      >\r\n    </template>\r\n  </MModal>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { StorageTypes } from '@/common/enums/StorageTypes';\r\nimport storageService from '@/services/StorageService';\r\nimport { newSession, useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { computed } from 'vue';\r\nimport { useI18n } from 'vue-i18n';\r\nimport { DetailsRouteNames } from '@/features/details/router/routeNames';\r\nimport RouterLinkGuarded from '../common/RouterLinkGuarded.vue';\r\nimport MModal from '../common/modal/MModal.vue';\r\nimport { UTCDateMini } from '@date-fns/utc';\r\nimport { add } from 'date-fns';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\n\r\nconst { t } = useI18n();\r\nconst memberProfileStore = useMemberProfileStore();\r\n\r\nconst effectiveProfile = computed<MemberProfile | null>(\r\n  () => memberProfileStore.effectiveProfile,\r\n);\r\n\r\nconst profileLastModifiedEmailPhone = computed<string | undefined>(\r\n  () => effectiveProfile.value?.lastModifiedEmailPhone,\r\n);\r\n\r\nconst isNewSession = computed<boolean>(\r\n  () => storageService.get(StorageTypes.SESSION, newSession, false) !== 'false',\r\n);\r\n\r\nconst isTimeToUpdateContactDetails = computed<boolean>(() => {\r\n  if (!profileLastModifiedEmailPhone.value) {\r\n    storageService.set(StorageTypes.SESSION, newSession, false, false);\r\n    return true;\r\n  }\r\n  const lastmodifiedDate = new UTCDateMini(profileLastModifiedEmailPhone.value);\r\n  const oneYearAgo = add(new UTCDateMini(), { years: -1 });\r\n  if (oneYearAgo >= lastmodifiedDate) {\r\n    storageService.set(StorageTypes.SESSION, newSession, false, false);\r\n    return true;\r\n  } else {\r\n    return false;\r\n  }\r\n});\r\n</script>\r\n","<template>\r\n  <div :ref=\"refs.root\">\r\n    <div v-if=\"loading\" class=\"container u-text-center\">\r\n      <div class=\"o-loader mt-5 mb-5 o-loader--white\">\r\n        <div class=\"mt-2\">\r\n          {{ t('page.loading') }}\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div v-if=\"error\" class=\"container u-text-center mt-5\">\r\n      <div class=\"row\">\r\n        <div class=\"col-12 u-text-center\">\r\n          <h2 class=\"t-heading-4\" v-html=\"t('app.error.title')\"></h2>\r\n          <p>{{ t('app.error.info') }}</p>\r\n        </div>\r\n      </div>\r\n    </div>\r\n\r\n    <div v-if=\"!loading && !error && page && page.messages\">\r\n      <MessageContent\r\n        v-for=\"(message, index) in page.messages\"\r\n        :key=\"index\"\r\n        :message=\"message\"\r\n      />\r\n    </div>\r\n\r\n    <div\r\n      v-if=\"!loading && !error && page\"\r\n      class=\"container-fluid container-fluid--page\"\r\n      @click=\"handleClicks\"\r\n    >\r\n      <div>\r\n        <h1\r\n          v-if=\"!hideTitle\"\r\n          class=\"mt-5 pb-2 mb-4 u-border-bottom--lg t-heading-1\"\r\n        >\r\n          {{ page.title ? page.title : page.name }}\r\n        </h1>\r\n\r\n        <ContentWrapper\r\n          v-if=\"page.topContent\"\r\n          :content=\"page.topContent\"\r\n          :breadcrumbs=\"breadcrumbs\"\r\n        />\r\n\r\n        <div v-if=\"page.asideContent && page.asideContent.length\" class=\"row\">\r\n          <div class=\"col-md-9\">\r\n            <div\r\n              v-if=\"page.preamble\"\r\n              class=\"t-body-preamble mb-3\"\r\n              v-html=\"page.preamble\"\r\n            ></div>\r\n            <ContentWrapper\r\n              v-if=\"page.content\"\r\n              :content=\"page.content\"\r\n              :breadcrumbs=\"breadcrumbs\"\r\n            />\r\n          </div>\r\n          <div class=\"col-md-3\">\r\n            <ContentWrapper\r\n              v-if=\"page.asideContent && page.asideContent.length\"\r\n              :content=\"page.asideContent\"\r\n              :breadcrumbs=\"breadcrumbs\"\r\n            />\r\n          </div>\r\n        </div>\r\n        <div v-if=\"!page.asideContent || !page.asideContent.length\">\r\n          <div\r\n            v-if=\"page.preamble\"\r\n            class=\"t-body-preamble mb-3\"\r\n            v-html=\"page.preamble\"\r\n          ></div>\r\n          <ContentWrapper\r\n            v-if=\"page.content\"\r\n            :content=\"page.content\"\r\n            :breadcrumbs=\"breadcrumbs\"\r\n          />\r\n        </div>\r\n        <UpdateMemberDetailsModal\r\n          v-if=\"\r\n            effectiveProfile &&\r\n            !memberProfileStore.isMemberImpersonated &&\r\n            !isMemberDetailsPage()\r\n          \"\r\n        />\r\n      </div>\r\n    </div>\r\n  </div>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { useRouter } from 'vue-router';\r\nimport { ref, computed, watch, toRefs, onUpdated } from 'vue';\r\nimport type { Page } from '@/models/content/Page';\r\nimport { useI18n } from 'vue-i18n';\r\nimport type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport { usePageStore } from '@/stores/pageStore';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport UrlUtil from '@/utils/UrlUtil';\r\nimport { routes } from '@/router';\r\nimport ContentWrapper from '@/components/content/ContentWrapper.vue';\r\nimport MessageContent from '@/components/content/MessageContent.vue';\r\nimport UpdateMemberDetailsModal from '@/components/modal/UpdateMemberDetailsModal.vue';\r\nimport type { MemberProfile } from '@/models/memberProfile/MemberProfile';\r\n\r\nconst { t } = useI18n();\r\n\r\nconst memberProfileStore = useMemberProfileStore();\r\nconst pageStore = usePageStore();\r\nconst router = useRouter();\r\n\r\nconst props = defineProps<{\r\n  pageId: number;\r\n  breadcrumbs: Breadcrumb[];\r\n  hideTitle?: boolean;\r\n}>();\r\n\r\nconst { pageId, breadcrumbs } = toRefs(props);\r\n\r\nconst loading = ref(true);\r\nconst error = ref(true);\r\n\r\nconst refs = {\r\n  root: ref<HTMLElement>(),\r\n};\r\n\r\nconst page = computed<Page | null>(() => {\r\n  return pageStore.getPageById(pageId.value);\r\n});\r\n\r\nconst effectiveProfile = computed<MemberProfile | null>(\r\n  () => memberProfileStore.effectiveProfile,\r\n);\r\n\r\nonUpdated(() => {\r\n  updateLinks();\r\n});\r\n\r\nwatch(\r\n  pageId,\r\n  () => {\r\n    loadPage();\r\n  },\r\n  { immediate: false, deep: false },\r\n);\r\n\r\nfunction isMemberDetailsPage() {\r\n  return page.value?.name === t('contentPage.contactDetails').toString();\r\n}\r\n\r\nfunction loadPage() {\r\n  loading.value = true;\r\n  error.value = false;\r\n  pageStore\r\n    .dispatchLoad(pageId.value)\r\n    .catch(() => {\r\n      error.value = true;\r\n    })\r\n    .finally(() => {\r\n      loading.value = false;\r\n    });\r\n}\r\n\r\nfunction updateLinks() {\r\n  refs.root.value!.querySelectorAll(\"a[href^='/']\").forEach((element: any) => {\r\n    const href = element.getAttribute('href');\r\n\r\n    if (href === '/first-sub-page' || href === '/first-sub-page/') {\r\n      const subRoute = routes.find(\r\n        (route) =>\r\n          route.meta &&\r\n          route.meta.pageFiltered !== true &&\r\n          route.meta.parentRoutes &&\r\n          (route.meta.parentRoutes as any)[\r\n            (route.meta.parentRoutes as any).length - 1\r\n          ] === route.name,\r\n      );\r\n      if (subRoute) {\r\n        element.href = subRoute.path.replace(/\\/$/, '');\r\n      } else {\r\n        element.classList.add('o-button--disabled');\r\n        element.removeAttribute('href');\r\n      }\r\n    } else if (!href.startsWith('//')) {\r\n      element.href = UrlUtil.replaceCmsPath(href, '/');\r\n    }\r\n  });\r\n}\r\n\r\n// https://dennisreimann.de/articles/delegating-html-links-to-vue-router.html\r\nfunction handleClicks(event: any): void {\r\n  // ensure we use the link, in case the click has been received by a subelement\r\n  let { target } = event;\r\n  while (target && target.tagName !== 'A') {\r\n    target = target.parentNode;\r\n  }\r\n\r\n  // handle only links that occur inside the component and do not reference external resources\r\n  if (\r\n    target &&\r\n    target.matches(\"a[href^='/']\") &&\r\n    target.href &&\r\n    !target.getAttribute('href').startsWith('//')\r\n  ) {\r\n    // some sanity checks taken from vue-router:\r\n    // https://github.com/vuejs/vue-router/blob/dev/src/components/link.js#L106\r\n    const { altKey, ctrlKey, metaKey, shiftKey, button, defaultPrevented } =\r\n      event;\r\n\r\n    // don't handle with control keys\r\n    if (metaKey || altKey || ctrlKey || shiftKey) {\r\n      return;\r\n    }\r\n    // don't handle when preventDefault called\r\n    if (defaultPrevented) {\r\n      return;\r\n    }\r\n    // don't handle right clicks\r\n    if (button !== undefined && button !== 0) {\r\n      return;\r\n    }\r\n    // don't handle if `target=\"_blank\"`\r\n    if (target.getAttribute) {\r\n      const linkTarget = target.getAttribute('target');\r\n      if (/\\b_blank\\b/i.test(linkTarget)) {\r\n        return;\r\n      }\r\n    }\r\n\r\n    // don't handle same page links/anchors\r\n    const url = new URL(target.href);\r\n    const to = url.pathname;\r\n    if (window.location.pathname !== to && event.preventDefault) {\r\n      event.preventDefault();\r\n      router.push(to);\r\n    }\r\n  }\r\n}\r\n\r\nfunction initialize() {\r\n  loadPage();\r\n}\r\n\r\ninitialize();\r\n</script>\r\n","export enum RouteNames {\r\n  Home = 'TimberManagerV2_Home',\r\n  Opportunity = 'TimberManagerV2_Opportunity',\r\n  OpportunityStep1Estate = 'TimberManagerV2_OpportunityStep1Estate',\r\n  OpportunityStep2PricingMoment = 'TimberManagerV2_OpportunityStep2PricingMoment',\r\n  OpportunityStep3Assortments = 'TimberManagerV2_OpportunityStep3Assortments',\r\n  OpportunityStep4Review = 'TimberManagerV2_OpportunityStep4Review',\r\n  OpportunityStep5Sign = 'TimberManagerV2_OpportunityStep5Sign',\r\n  Delivery = 'TimberManagerV2_Delivery',\r\n  DeliveryLandingList = 'TimberManagerV2_Delivery_LandingList',\r\n  AgreementDeliveries = 'TimberManagerV2_Delivery_AgreementDeliveries',\r\n  DeliveryLanding = 'TimberManagerV2_Delivery_Landing',\r\n  DeliveryCreateLanding = 'TimberManagerV2_Delivery_CreateLanding',\r\n  DeliveryUpdateLanding = 'TimberManagerV2_Delivery_UpdateLanding',\r\n  DeliverySelectAssortments = 'TimberManagerV2_Delivery_SelectAssortments',\r\n  DeliveryAddAssortment = 'TimberManagerV2_Delivery_AddAssortment',\r\n  DeliveryUpdateAssortment = 'TimberManagerV2_Delivery_UpdateAssortment',\r\n  DeliveryComplete = 'TimberManagerV2_Delivery_CompleteDelivery',\r\n}\r\n\r\nexport const OpportunityQuoteProjectIdForNew = 'nytt';\r\n","const basePath: string = 'timberManagerV2.routes';\r\n\r\nexport const RouteTitlePaths = {\r\n  Home: `${basePath}.homePage`,\r\n  Opportunity: `${basePath}.opportunity`,\r\n  Delivery: `${basePath}.delivery`,\r\n};\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport { RouteTitlePaths } from './routeTitlePaths';\r\n\r\nconst authRequirementsTimberManagerDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: undefined,\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nconst timberManagerPath = '/leveransvirke/';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst TimberManagerHomeRouteDefintion: RouteRecordRaw = {\r\n  path: getPath(timberManagerPath),\r\n  component: () => import('@/features/timberManagerV2/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: RouteTitlePaths.Home,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'or',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerAgreementsRead,\r\n          Role.ServiceTimberManagerDeliveriesRead,\r\n        ]),\r\n      },\r\n    },\r\n  },\r\n};\r\n\r\nconst TimberManagerOpportunityRouteDefinition: RouteRecordRaw = {\r\n  path: getPath(`${timberManagerPath}avtal/:opportunityQuoteProjectId`),\r\n  component: () =>\r\n    import('@/features/timberManagerV2/views/OpportunityPage.vue'),\r\n  name: RouteNames.Opportunity,\r\n  props: (route) => ({\r\n    ...route.params,\r\n    ...route.query,\r\n  }),\r\n  meta: {\r\n    name: RouteNames.Opportunity,\r\n    title: RouteTitlePaths.Opportunity,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'and',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerAgreementsRead,\r\n          Role.ServiceTimberManagerAgreementsWrite,\r\n        ]),\r\n      },\r\n    },\r\n  },\r\n  // Child routes inherit meta of parent\r\n  children: [\r\n    {\r\n      path: 'fastighet',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/opportunity/Step1EstateView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep1Estate,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep1Estate,\r\n      },\r\n    },\r\n    {\r\n      path: 'prissattningstillfalle',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/opportunity/Step2PricingMomentView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep2PricingMoment,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep2PricingMoment,\r\n      },\r\n    },\r\n    {\r\n      path: 'sortiment',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/opportunity/Step3AssortmentsView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep3Assortments,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep3Assortments,\r\n      },\r\n    },\r\n    {\r\n      path: 'granska',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/opportunity/Step4ReviewView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep4Review,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep4Review,\r\n      },\r\n    },\r\n    {\r\n      path: 'signera',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/opportunity/Step5SignView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep5Sign,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep5Sign,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nconst TimberManagerDeliveryRouteDefinition: RouteRecordRaw = {\r\n  // Parameter deliveryGuid is optional\r\n  path: getPath(`${timberManagerPath}avtal/:agreementId/anmalan/`),\r\n  component: () => import('@/features/timberManagerV2/views/DeliveryPage.vue'),\r\n  name: RouteNames.Delivery,\r\n  props: true,\r\n  redirect: { name: RouteNames.AgreementDeliveries },\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Delivery,\r\n    title: RouteTitlePaths.Delivery,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'and',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerDeliveriesRead,\r\n          Role.ServiceTimberManagerDeliveriesWrite,\r\n        ]),\r\n      },\r\n    },\r\n    hideContactBar: true,\r\n  },\r\n  // Child routes inherit meta of parent\r\n  children: [\r\n    {\r\n      path: 'virkesordrar',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV2/views/delivery/AgreementDeliveriesView.vue'\r\n        ),\r\n      name: RouteNames.AgreementDeliveries,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        authRequirements: {\r\n          ...authRequirementsTimberManagerDefault,\r\n          roleRequirement: {\r\n            type: 'and',\r\n            roles: new Set<Role>([\r\n              Role.ServiceTimberManagerDeliveriesRead,\r\n              Role.ServiceTimberManagerDeliveriesWrite,\r\n            ]),\r\n          },\r\n        },\r\n      },\r\n    },\r\n    {\r\n      path: ':deliveryGuid?/upplag',\r\n      component: () =>\r\n        import('@/features/timberManagerV2/views/delivery/LandingListView.vue'),\r\n      name: RouteNames.DeliveryLandingList,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n    },\r\n    {\r\n      path: ':deliveryGuid?/upplag/:landingGisGuid',\r\n      component: () =>\r\n        import('@/features/timberManagerV2/views/delivery/LandingView.vue'),\r\n      name: RouteNames.DeliveryLanding,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n    },\r\n  ],\r\n};\r\n\r\nexport const timberManagerHomeRouteDefintion =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerHomeRouteDefintion,\r\n    PageFeatureType.TimberManagerV2,\r\n  );\r\nexport const timberManagerOpportunityRouteDefinition =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerOpportunityRouteDefinition,\r\n    PageFeatureType.TimberManagerV2,\r\n  );\r\nexport const timberManagerDeliveryRouteDefinition =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerDeliveryRouteDefinition,\r\n    PageFeatureType.TimberManagerV2,\r\n  );\r\n","export enum RouteNames {\r\n  Home = 'TimberManagerV3_Home',\r\n  Opportunity = 'TimberManagerV3_Opportunity',\r\n  OpportunityStep1Estate = 'TimberManagerV3_OpportunityStep1Estate',\r\n  OpportunityStep2PricingMoment = 'TimberManagerV3_OpportunityStep2PricingMoment',\r\n  OpportunityStep3Assortments = 'TimberManagerV3_OpportunityStep3Assortments',\r\n  OpportunityStep4Review = 'TimberManagerV3_OpportunityStep4Review',\r\n  OpportunityStep5Sign = 'TimberManagerV3_OpportunityStep5Sign',\r\n  Delivery = 'TimberManagerV3_Delivery',\r\n  DeliveryLandingList = 'TimberManagerV3_Delivery_LandingList',\r\n  AgreementDeliveries = 'TimberManagerV3_Delivery_AgreementDeliveries',\r\n  DeliveryLanding = 'TimberManagerV3_Delivery_Landing',\r\n  DeliveryCreateLanding = 'TimberManagerV3_Delivery_CreateLanding',\r\n  DeliveryUpdateLanding = 'TimberManagerV3_Delivery_UpdateLanding',\r\n  DeliverySelectAssortments = 'TimberManagerV3_Delivery_SelectAssortments',\r\n  DeliveryAddAssortment = 'TimberManagerV3_Delivery_AddAssortment',\r\n  DeliveryUpdateAssortment = 'TimberManagerV3_Delivery_UpdateAssortment',\r\n  DeliveryComplete = 'TimberManagerV3_Delivery_CompleteDelivery',\r\n}\r\n\r\nexport const OpportunityIdForNew = 'nytt';\r\n","const basePath: string = 'timberManagerV3.routes';\r\n\r\nexport const RouteTitlePaths = {\r\n  Home: `${basePath}.homePage`,\r\n  Opportunity: `${basePath}.opportunity`,\r\n  Delivery: `${basePath}.delivery`,\r\n};\r\n","import { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\nimport type { AuthRequirements } from '@/router/authRequirements';\r\nimport { addPageFeatureTypeToRouteRecursive } from '@/utils/RouteDefinitionUtil';\r\nimport type { RouteRecordRaw } from 'vue-router';\r\nimport { RouteNames } from './routeNames';\r\nimport { Role } from '@/models/memberProfile/Role';\r\nimport { RouteTitlePaths } from './routeTitlePaths';\r\n\r\nconst authRequirementsTimberManagerDefault: AuthRequirements = {\r\n  allowAnonymous: false,\r\n  roleRequirement: undefined,\r\n};\r\n\r\nconst basePath = '/skogsgardens-affarer';\r\nconst timberManagerPath = '/leveransvirke/';\r\nfunction getPath(path: string) {\r\n  return `${basePath}${path}`;\r\n}\r\n\r\nconst TimberManagerHomeRouteDefintion: RouteRecordRaw = {\r\n  path: getPath(timberManagerPath),\r\n  component: () => import('@/features/timberManagerV3/views/HomePage.vue'),\r\n  name: RouteNames.Home,\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Home,\r\n    title: RouteTitlePaths.Home,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'or',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerAgreementsRead,\r\n          Role.ServiceTimberManagerDeliveriesRead,\r\n        ]),\r\n      },\r\n    },\r\n  },\r\n};\r\n\r\nconst TimberManagerOpportunityRouteDefinition: RouteRecordRaw = {\r\n  path: getPath(`${timberManagerPath}avtal/:opportunityId`),\r\n  component: () =>\r\n    import('@/features/timberManagerV3/views/OpportunityPage.vue'),\r\n  name: RouteNames.Opportunity,\r\n  props: (route) => ({\r\n    ...route.params,\r\n    ...route.query,\r\n  }),\r\n  meta: {\r\n    name: RouteNames.Opportunity,\r\n    title: RouteTitlePaths.Opportunity,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'and',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerAgreementsRead,\r\n          Role.ServiceTimberManagerAgreementsWrite,\r\n        ]),\r\n      },\r\n    },\r\n  },\r\n  // Child routes inherit meta of parent\r\n  children: [\r\n    {\r\n      path: 'fastighet',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/opportunity/Step1EstateView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep1Estate,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep1Estate,\r\n      },\r\n    },\r\n    {\r\n      path: 'prissattningstillfalle',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/opportunity/Step2PricingMomentView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep2PricingMoment,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep2PricingMoment,\r\n      },\r\n    },\r\n    {\r\n      path: 'sortiment',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/opportunity/Step3AssortmentsView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep3Assortments,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep3Assortments,\r\n      },\r\n    },\r\n    {\r\n      path: 'granska',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/opportunity/Step4ReviewView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep4Review,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep4Review,\r\n      },\r\n    },\r\n    {\r\n      path: 'signera',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/opportunity/Step5SignView.vue'\r\n        ),\r\n      name: RouteNames.OpportunityStep5Sign,\r\n      meta: {\r\n        track: true,\r\n        name: RouteNames.OpportunityStep5Sign,\r\n      },\r\n    },\r\n  ],\r\n};\r\n\r\nconst TimberManagerDeliveryRouteDefinition: RouteRecordRaw = {\r\n  // Parameter deliveryGuid is optional\r\n  path: getPath(`${timberManagerPath}avtal/:subProjectId/anmalan/`),\r\n  component: () => import('@/features/timberManagerV3/views/DeliveryPage.vue'),\r\n  name: RouteNames.Delivery,\r\n  props: true,\r\n  redirect: { name: RouteNames.AgreementDeliveries },\r\n  meta: {\r\n    track: true,\r\n    name: RouteNames.Delivery,\r\n    title: RouteTitlePaths.Delivery,\r\n    authRequirements: {\r\n      ...authRequirementsTimberManagerDefault,\r\n      roleRequirement: {\r\n        type: 'and',\r\n        roles: new Set<Role>([\r\n          Role.ServiceTimberManagerDeliveriesRead,\r\n          Role.ServiceTimberManagerDeliveriesWrite,\r\n        ]),\r\n      },\r\n    },\r\n    hideContactBar: true,\r\n  },\r\n  // Child routes inherit meta of parent\r\n  children: [\r\n    {\r\n      path: 'virkesordrar',\r\n      component: () =>\r\n        import(\r\n          '@/features/timberManagerV3/views/delivery/AgreementDeliveriesView.vue'\r\n        ),\r\n      name: RouteNames.AgreementDeliveries,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n      meta: {\r\n        authRequirements: {\r\n          ...authRequirementsTimberManagerDefault,\r\n          roleRequirement: {\r\n            type: 'and',\r\n            roles: new Set<Role>([\r\n              Role.ServiceTimberManagerDeliveriesRead,\r\n              Role.ServiceTimberManagerDeliveriesWrite,\r\n            ]),\r\n          },\r\n        },\r\n      },\r\n    },\r\n    {\r\n      path: ':deliveryGuid?/upplag',\r\n      component: () =>\r\n        import('@/features/timberManagerV3/views/delivery/LandingListView.vue'),\r\n      name: RouteNames.DeliveryLandingList,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n    },\r\n    {\r\n      path: ':deliveryGuid?/upplag/:landingGisGuid',\r\n      component: () =>\r\n        import('@/features/timberManagerV3/views/delivery/LandingView.vue'),\r\n      name: RouteNames.DeliveryLanding,\r\n      props: (route) => ({\r\n        ...route.params,\r\n        ...route.query,\r\n      }),\r\n    },\r\n  ],\r\n};\r\n\r\nexport const timberManagerHomeRouteDefintion =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerHomeRouteDefintion,\r\n    PageFeatureType.TimberManagerV3,\r\n  );\r\nexport const timberManagerOpportunityRouteDefinition =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerOpportunityRouteDefinition,\r\n    PageFeatureType.TimberManagerV3,\r\n  );\r\nexport const timberManagerDeliveryRouteDefinition =\r\n  addPageFeatureTypeToRouteRecursive(\r\n    TimberManagerDeliveryRouteDefinition,\r\n    PageFeatureType.TimberManagerV3,\r\n  );\r\n","import ContentPage from '@/views/ContentPage.vue';\r\nimport { authRequirementsContentPrivate } from '../authRequirements';\r\nimport { useAuthStore } from '@/stores/authStore';\r\nimport { useFeatureManagementStore } from '@/stores/featureManagementStore';\r\nimport { useMemberProfileStore } from '@/stores/memberProfileStore';\r\nimport { useStartupStore } from '@/stores/startupStore';\r\nimport {\r\n  type RouteLocationNormalized,\r\n  type RouteRecordRaw,\r\n  type RouteComponent,\r\n  type RouteMeta,\r\n  type Router,\r\n} from 'vue-router';\r\nimport { NotFoundRouteDefinition } from '../routes';\r\nimport { RouteNames } from '../routeNames';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { Route } from '@/models/memberProfile/Route';\r\nimport { PageType } from '@/models/content/PageType';\r\nimport type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport { EventBus, EventLogin } from '@/utils/EventBus';\r\nimport { ProfileType } from '@/stores/profile/ProfileArrayStore';\r\nimport { FeatureFlagName } from '@/models/featureManagement/FeatureFlag';\r\nimport { timberManagerDeliveryRouteDefinition as timberManagerV2DeliveryRouteDefinition } from '@features/timberManagerV2/router';\r\nimport { timberManagerOpportunityRouteDefinition as timberManagerV2OpportunityRouteDefinition } from '@features/timberManagerV2/router';\r\nimport { timberManagerHomeRouteDefintion as timberManagerV2HomeRouteDefintion } from '@features/timberManagerV2/router';\r\nimport { timberManagerDeliveryRouteDefinition as timberManagerV3DeliveryRouteDefinition } from '@features/timberManagerV3/router';\r\nimport { timberManagerOpportunityRouteDefinition as timberManagerV3OpportunityRouteDefinition } from '@features/timberManagerV3/router';\r\nimport { timberManagerHomeRouteDefintion as timberManagerV3HomeRouteDefintion } from '@features/timberManagerV3/router';\r\n\r\nexport interface StartupResult {\r\n  routes?: RouteRecordRaw[];\r\n  /**\r\n   * If false, navigation should be cancelled. If string, navigation should be redirected to the string value.\r\n   */\r\n  navigationResult: boolean | string;\r\n}\r\n\r\n/**\r\n * Initialize the application by initiating feature management, loading the member profile and adding the profile routes to vue router.\r\n * @returns A navigation result that can be used to redirect to a route or cancel navigation. If dynamic routes are added,\r\n * the created routes are returned in the result.\r\n */\r\nexport async function startupGuard(\r\n  to: RouteLocationNormalized,\r\n  router: Router,\r\n): Promise<StartupResult> {\r\n  const anyRouteMatch = to.matched.length;\r\n\r\n  Logger.debug(\r\n    'Router beforeEach checking route.',\r\n    to,\r\n    'anyRouteMatch',\r\n    anyRouteMatch,\r\n  );\r\n\r\n  const startupStore = useStartupStore();\r\n  if (startupStore.initialized) {\r\n    return { navigationResult: true };\r\n  }\r\n\r\n  const authStore = useAuthStore();\r\n  const featureManagementStore = useFeatureManagementStore();\r\n  const memberProfileStore = useMemberProfileStore();\r\n  try {\r\n    await authStore.dispatchInitialize();\r\n    await featureManagementStore.load();\r\n\r\n    if (to.name !== RouteNames.Authentication) {\r\n      await memberProfileStore.dispatchLoad({\r\n        force: false,\r\n        profileType: ProfileType.Mine,\r\n      });\r\n\r\n      if (memberProfileStore.shouldUseProxy()) {\r\n        await memberProfileStore.dispatchLoad({\r\n          force: false,\r\n          profileType: ProfileType.Proxy,\r\n        });\r\n      }\r\n    }\r\n\r\n    // TimberManager/viol2/viol3 routes\r\n    const addedTimberManagerRoute = addTimberManagerRoutes(router);\r\n\r\n    // Dynamic routes\r\n    if (memberProfileStore.myProfile?.routes) {\r\n      const dynamicRoutes = addRoutes(\r\n        memberProfileStore.myProfile.routes,\r\n        router,\r\n        featureManagementStore.shouldOnlyUseEpiserverRoute,\r\n      );\r\n\r\n      if (!anyRouteMatch) {\r\n        Logger.debug(\r\n          'Replace current route with current route to trigger routing.',\r\n          to.fullPath,\r\n        );\r\n        return { routes: dynamicRoutes, navigationResult: to.fullPath };\r\n      }\r\n    }\r\n\r\n    if (!anyRouteMatch && addedTimberManagerRoute) {\r\n      Logger.debug(\r\n        'Timbermanager routes added and no other route found, trigger redirect to check if navigation matches new routes.',\r\n        to.fullPath,\r\n      );\r\n      return {\r\n        navigationResult: to.fullPath,\r\n      };\r\n    }\r\n  } catch {\r\n    startupStore.error();\r\n    return { navigationResult: false };\r\n  } finally {\r\n    startupStore.initialize();\r\n  }\r\n\r\n  return { navigationResult: true };\r\n}\r\n\r\nfunction addTimberManagerRoutes(router: Router): boolean {\r\n  const featureManagementStore = useFeatureManagementStore();\r\n\r\n  let addedTimberManagerRoute = false;\r\n\r\n  // Viol3\r\n  if (featureManagementStore.isEnabled(FeatureFlagName.TimberManagerViol3)) {\r\n    router.addRoute(timberManagerV3HomeRouteDefintion);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  if (\r\n    featureManagementStore.isEnabled(\r\n      FeatureFlagName.TimberManagerViol3Opportunity,\r\n    )\r\n  ) {\r\n    router.addRoute(timberManagerV3OpportunityRouteDefinition);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  if (\r\n    featureManagementStore.isEnabled(FeatureFlagName.TimberManagerViol3Delivery)\r\n  ) {\r\n    router.addRoute(timberManagerV3DeliveryRouteDefinition);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  // Viol2\r\n  if (featureManagementStore.isEnabled(FeatureFlagName.TimberManagerViol2)) {\r\n    router.addRoute(timberManagerV2HomeRouteDefintion);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  if (\r\n    featureManagementStore.isEnabled(\r\n      FeatureFlagName.TimberManagerViol2Opportunity,\r\n    )\r\n  ) {\r\n    router.addRoute(timberManagerV2OpportunityRouteDefinition);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  if (\r\n    featureManagementStore.isEnabled(FeatureFlagName.TimberManagerViol2Delivery)\r\n  ) {\r\n    router.addRoute(timberManagerV2DeliveryRouteDefinition);\r\n    addedTimberManagerRoute = true;\r\n  }\r\n\r\n  return addedTimberManagerRoute;\r\n}\r\n\r\nfunction addRoutes(\r\n  userRoutes: Route[],\r\n  router: Router,\r\n  shouldOnlyUseEpiserverRoute: (featureFlagName: FeatureFlagName) => boolean,\r\n): RouteRecordRaw[] {\r\n  // Get all static routes, added before dynamic routes.\r\n  const currentRoutes = router.getRoutes();\r\n\r\n  const wildcardRoutePostfix = '/:pathMatch(.*)*';\r\n  const wildcardRoutePostfixIndex = wildcardRoutePostfix.length - 1;\r\n\r\n  const dynamicRoutes: RouteRecordRaw[] = [];\r\n  userRoutes\r\n    .map((userRoute) => generateRoute(userRoute, []))\r\n    .flat()\r\n    .forEach((userRoute) => {\r\n      // Ignore wildcard route for dynamic routes if a static route exists.\r\n      // Wildcard route is used for e-service/component loaded from external source.\r\n      if (userRoute.path.endsWith(wildcardRoutePostfix)) {\r\n        const currentRoute = userRoute.path.substring(\r\n          0,\r\n          userRoute.path.length - wildcardRoutePostfixIndex,\r\n        );\r\n\r\n        const ignoreWildcardRoute = currentRoutes.some((existingRoute) => {\r\n          const featureFlag = existingRoute.meta.authRequirements?.featureFlag;\r\n          return (\r\n            existingRoute.path === currentRoute &&\r\n            (!featureFlag || !shouldOnlyUseEpiserverRoute(featureFlag))\r\n          );\r\n        });\r\n\r\n        if (ignoreWildcardRoute) {\r\n          Logger.debug(\r\n            'Ignore wildcard route because of existing route.',\r\n            userRoute,\r\n          );\r\n          return;\r\n        }\r\n      }\r\n\r\n      const matchingRoutes = currentRoutes.filter(\r\n        (r) => r.path === userRoute.path,\r\n      );\r\n\r\n      // Enable links to use the dynamic route id and name, but redirect to the static route.\r\n      if (matchingRoutes.length) {\r\n        Logger.debug(\r\n          'Add redirect prop to existing route.',\r\n          userRoute,\r\n          matchingRoutes,\r\n        );\r\n\r\n        matchingRoutes.forEach((matchingRoute) => {\r\n          const featureFlag = matchingRoute.meta.authRequirements?.featureFlag;\r\n\r\n          if (featureFlag && shouldOnlyUseEpiserverRoute(featureFlag)) {\r\n            matchingRoute.redirect = userRoute;\r\n          } else {\r\n            // We can do this each iteration if there are multiple matching routes since the parent will be last.\r\n            // There are multiple matches when a route has a certain path and one of its children has a path of ''.\r\n            userRoute.redirect = matchingRoute;\r\n          }\r\n        });\r\n      }\r\n\r\n      dynamicRoutes.push(userRoute);\r\n      router.addRoute(userRoute);\r\n    });\r\n\r\n  // The 404 not found route is not added\r\n  // until member component routes is added\r\n  if (!router.hasRoute(RouteNames.NotFound)) {\r\n    Logger.debug('Adding 404 not found route');\r\n    router.addRoute(NotFoundRouteDefinition);\r\n  }\r\n\r\n  return dynamicRoutes;\r\n}\r\n\r\nfunction generateRoute(\r\n  route: Route,\r\n  breadcrumbs: Breadcrumb[] = [],\r\n  routePath = '/',\r\n  parentRoutes: string[] = [],\r\n): RouteRecordRaw[] {\r\n  if (route) {\r\n    // Clone to not affect other siblings\r\n    const menuBreadcrumbs = [...breadcrumbs];\r\n    const parentRoutesClone = [...parentRoutes];\r\n    let menuRoutePath = routePath;\r\n\r\n    if (route.pageType === PageType.GroupPage) {\r\n      if (!route.routes) {\r\n        return [];\r\n      }\r\n\r\n      menuBreadcrumbs.push({\r\n        routeName: undefined,\r\n        route: route.urlName,\r\n        name: route.name,\r\n      });\r\n\r\n      menuRoutePath += route.urlName + '/';\r\n\r\n      parentRoutesClone.push(route.id.toString());\r\n\r\n      return route.routes\r\n        .map((subRoute) => {\r\n          return generateRoute(\r\n            subRoute,\r\n            menuBreadcrumbs,\r\n            menuRoutePath,\r\n            parentRoutesClone,\r\n          );\r\n        })\r\n        .flat();\r\n    } else if (route.pageType === PageType.ContentPage) {\r\n      menuBreadcrumbs.push({\r\n        routeName: route.id.toString(),\r\n        route: route.urlName,\r\n        name: route.name,\r\n      });\r\n      menuRoutePath += route.urlName + '/';\r\n\r\n      const routes: RouteRecordRaw[] = [\r\n        getRouteConfig(\r\n          route.id.toString(),\r\n          route.id,\r\n          menuRoutePath,\r\n          menuBreadcrumbs,\r\n          ContentPage,\r\n          {\r\n            track: true,\r\n            name: route.name,\r\n            title: route.name,\r\n            parentRoutes: [...parentRoutesClone],\r\n            pageFiltered: route.pageFiltered,\r\n            authRequirements: authRequirementsContentPrivate,\r\n          },\r\n        ),\r\n      ];\r\n\r\n      if (route.routes && route.routes.length > 0) {\r\n        parentRoutesClone.push(route.id.toString());\r\n        routes.push(\r\n          ...route.routes\r\n            .map((subRoute) => {\r\n              return generateRoute(\r\n                subRoute,\r\n                menuBreadcrumbs,\r\n                menuRoutePath,\r\n                parentRoutesClone,\r\n              );\r\n            })\r\n            .flat(),\r\n        );\r\n      } else {\r\n        routes.push(\r\n          getRouteConfig(\r\n            undefined,\r\n            route.id,\r\n            menuRoutePath + ':pathMatch(.*)*',\r\n            menuBreadcrumbs,\r\n            ContentPage,\r\n            {\r\n              track: true,\r\n              name: route.name,\r\n              title: route.name,\r\n              parentRoutes: parentRoutesClone,\r\n              pageFiltered: route.pageFiltered,\r\n              authRequirements: authRequirementsContentPrivate,\r\n            },\r\n          ),\r\n        );\r\n      }\r\n\r\n      return routes;\r\n    }\r\n  }\r\n\r\n  return [];\r\n}\r\n\r\nfunction getRouteConfig(\r\n  name: string | undefined,\r\n  pageId: number,\r\n  path: string,\r\n  breadcrumbs: Breadcrumb[],\r\n  component: RouteComponent,\r\n  meta?: RouteMeta,\r\n): RouteRecordRaw {\r\n  return {\r\n    name,\r\n    path,\r\n    component: component,\r\n    props: {\r\n      breadcrumbs,\r\n      pageId,\r\n    },\r\n    beforeEnter: (to) => {\r\n      const authStore = useAuthStore();\r\n      if (!authStore.isAuthenticated) {\r\n        Logger.debug(\r\n          'Route needs auth and is not authenticated, triggering login.',\r\n          to,\r\n        );\r\n        EventBus.emit(EventLogin, { returnTo: to });\r\n        return false;\r\n      }\r\n    },\r\n    meta,\r\n  };\r\n}\r\n","import type { AuthRequirements } from '@/router/authRequirements';\r\nimport { useAuthStore } from '@/stores/authStore';\r\nimport { useFeatureManagementStore } from '@/stores/featureManagementStore';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { FeatureFlagName } from '../featureManagement/FeatureFlag';\r\n\r\nconst isFeatureEnabled = (featureFlagName: FeatureFlagName): boolean => {\r\n  const featureManagementStore = useFeatureManagementStore();\r\n\r\n  if (!featureManagementStore.data) {\r\n    return false;\r\n  }\r\n\r\n  const isEnabled = featureManagementStore.isEnabled(featureFlagName);\r\n\r\n  if (!isEnabled) {\r\n    Logger.debug('Feature flag disabled.', featureFlagName);\r\n  }\r\n\r\n  return isEnabled;\r\n};\r\n\r\nexport enum ValidationError {\r\n  NotAuthenticated,\r\n  FeatureFlagDisabled,\r\n}\r\n\r\nconst validate = (\r\n  requirements: AuthRequirements,\r\n): { valid: boolean; error: ValidationError | undefined } => {\r\n  if (requirements.allowAnonymous !== true) {\r\n    const authStore = useAuthStore();\r\n    if (!authStore.isAuthenticated) {\r\n      Logger.debug(\r\n        'Requirement do not have public access and user is not authenticated.',\r\n        requirements,\r\n      );\r\n      return { valid: false, error: ValidationError.NotAuthenticated };\r\n    }\r\n  }\r\n\r\n  if (requirements.featureFlag && !isFeatureEnabled(requirements.featureFlag)) {\r\n    return { valid: false, error: ValidationError.FeatureFlagDisabled };\r\n  }\r\n\r\n  return { valid: true, error: undefined };\r\n};\r\n\r\nexport const Permissions = {\r\n  isFeatureEnabled,\r\n  validate,\r\n};\r\n","import { useAuthStore } from '@/stores/authStore';\r\nimport { EventBus, EventLogin } from '@/utils/EventBus';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { RouteLocationNormalized } from 'vue-router';\r\nimport { RouteNames } from '../routeNames';\r\nimport { Permissions, ValidationError } from '@/models/permissions/Permissions';\r\n\r\nexport async function authorizationGuard(to: RouteLocationNormalized) {\r\n  const anyRouteMatch = to.matched.length;\r\n  const authStore = useAuthStore();\r\n\r\n  if (!anyRouteMatch && !authStore.isAuthenticated) {\r\n    Logger.debug(\r\n      'No route match, but since not authenticated we might just not have the matching route yet, so triggering login.',\r\n      to,\r\n    );\r\n    EventBus.emit(EventLogin, { returnTo: to });\r\n    return false;\r\n  }\r\n\r\n  const authRequirements = to.meta.authRequirements;\r\n\r\n  if (authRequirements) {\r\n    const validationResult = Permissions.validate(authRequirements);\r\n    if (!validationResult.valid) {\r\n      Logger.debug('Auth requirement validation failed.', authRequirements);\r\n      if (validationResult.error === ValidationError.NotAuthenticated) {\r\n        EventBus.emit(EventLogin, { returnTo: to });\r\n      } else {\r\n        return {\r\n          name: RouteNames.Home,\r\n        };\r\n      }\r\n\r\n      return false;\r\n    }\r\n  }\r\n}\r\n","import type { RouteLocationNormalized } from 'vue-router';\r\nimport telemetryService from '@/common/services/TelemetryService';\r\n\r\nexport function startTrackPage(to: RouteLocationNormalized) {\r\n  if (to.meta.track === true) {\r\n    const name = to.meta.name as string;\r\n    telemetryService.startTrackPage(name);\r\n  }\r\n}\r\n\r\nexport function stopTrackPage(route: RouteLocationNormalized) {\r\n  if (route.meta.track === true) {\r\n    const url = location.protocol + '//' + location.host + route.fullPath;\r\n    const name = route.meta.name as string;\r\n\r\n    telemetryService.stopTrackPage(name, url);\r\n  }\r\n}\r\n","import { usePageStatusStore } from '@/stores/pageStatusStore';\r\nimport { Logger } from '@/utils/Logger';\r\nimport type { RouteLocationNormalized } from 'vue-router';\r\n\r\nexport async function pageStatusGuard(to: RouteLocationNormalized) {\r\n  if (!to.meta?.pageFeatureType) {\r\n    return;\r\n  }\r\n\r\n  const pageStatusStore = usePageStatusStore();\r\n  try {\r\n    await pageStatusStore.dispatchLoad(to.meta.pageFeatureType);\r\n  } catch {\r\n    Logger.debug(\r\n      'Navigation guard error - Failed to load page status. Assuming it is online and proceeding with navigation.',\r\n    );\r\n  }\r\n}\r\n","import type { Breadcrumb } from '@/models/Breadcrumb';\r\nimport {\r\n  createRouter,\r\n  createWebHistory,\r\n  type RouteRecordRaw,\r\n} from 'vue-router';\r\nimport { nextTick } from 'vue';\r\nimport { routes as proxyRoutes } from '@features/proxy/router';\r\nimport { routes as supportRoutes } from '@/features/support/router';\r\nimport { routes as documentsRoutes } from '@features/documents/router';\r\nimport { routes as detailsRoutes } from '@features/details/router';\r\nimport { routes as productionRoutes } from '@features/production/router';\r\nimport { routes as myMapRoutes } from '@features/myMap/router';\r\nimport { routes as sodraElRoutes } from '@/features/sodraEl/router';\r\nimport { routes as certificationRoutes } from '@features/certification/router';\r\nimport { routes as priceConditionsRoutes } from '@features/priceConditions/router';\r\nimport { routes as accountsRoutes } from '@features/accounts/router';\r\nimport { routes as priceCalculationRoutes } from '@features/priceCalculation/router';\r\nimport { routes as economicDevelopmentRoutes } from '@features/economicDevelopment/router';\r\nimport { routes as capitalTradeRoutes } from '@features/capitalTrade/router';\r\nimport { type AuthRequirements } from './authRequirements';\r\nimport {\r\n  AuthenticationRouteDefinition,\r\n  HomeRouteDefinition,\r\n  LoginRouteDefinition,\r\n  PasswordChangeRouteDefinition,\r\n} from './routes';\r\nimport i18n from '@/i18n';\r\nimport { startupGuard, type StartupResult } from './guards/startupGuard';\r\nimport { authorizationGuard } from './guards/authGuard';\r\nimport { startTrackPage, stopTrackPage } from './guards/trackingGuard';\r\nimport { pageStatusGuard } from './guards/pageStatusGuard';\r\nimport type { PageFeatureType } from '@/models/infrastructure/PageFeatureType';\r\n\r\ndeclare module 'vue-router' {\r\n  interface RouteMeta {\r\n    track?: boolean;\r\n    name?: string;\r\n    title?: string;\r\n    parentRoutes?: string[];\r\n    pageFiltered?: boolean;\r\n    authRequirements?: AuthRequirements;\r\n    hideContactBar?: boolean;\r\n    pageFeatureType?: PageFeatureType;\r\n  }\r\n}\r\n\r\nconst defaultDocumentTitle = import.meta.env.VITE_APP_DOCUMENT_DEFAULT_TITLE;\r\nconst baseDocumentTitle = import.meta.env.VITE_APP_DOCUMENT_BASE_TITLE;\r\n\r\nconst router = createRouter({\r\n  history: createWebHistory(import.meta.env.BASE_URL),\r\n  linkExactActiveClass: 'active',\r\n  linkActiveClass: 'open',\r\n  routes: [\r\n    HomeRouteDefinition,\r\n    AuthenticationRouteDefinition,\r\n    LoginRouteDefinition,\r\n    PasswordChangeRouteDefinition,\r\n    // Add feature routes.\r\n    ...proxyRoutes,\r\n    ...supportRoutes,\r\n    ...documentsRoutes,\r\n    ...myMapRoutes,\r\n    ...detailsRoutes,\r\n    ...productionRoutes,\r\n    ...sodraElRoutes,\r\n    ...certificationRoutes,\r\n    ...priceConditionsRoutes,\r\n    ...accountsRoutes,\r\n    ...priceCalculationRoutes,\r\n    ...economicDevelopmentRoutes,\r\n    ...capitalTradeRoutes,\r\n  ],\r\n});\r\n\r\nconst routes: RouteRecordRaw[] = [];\r\n\r\n// The router.beforeEach takes care of checking if no route match, and not authenticated,\r\n// then login is triggered (so that member profile can be loaded and component routes added).\r\n// Router guards are executed in order of creation. https://router.vuejs.org/guide/advanced/navigation-guards.html#Global-Before-Guards\r\nrouter.beforeEach(async (to) => {\r\n  const startupResult: StartupResult = await startupGuard(to, router);\r\n  routes.push(...(startupResult.routes ?? []));\r\n  return startupResult.navigationResult;\r\n});\r\nrouter.beforeEach(async (to) => await authorizationGuard(to));\r\nrouter.beforeEach(pageStatusGuard);\r\nrouter.beforeEach(startTrackPage);\r\n\r\nrouter.afterEach(stopTrackPage);\r\nrouter.afterEach((route) => {\r\n  // Update document title.\r\n  let documentTitle = baseDocumentTitle;\r\n  if (route.meta.title) {\r\n    documentTitle += i18n.global.te(route.meta.title)\r\n      ? i18n.global.t(route.meta.title)\r\n      : route.meta.title;\r\n  } else {\r\n    documentTitle += defaultDocumentTitle;\r\n  }\r\n\r\n  nextTick(() => {\r\n    document.title = documentTitle;\r\n  });\r\n});\r\n\r\nexport function getPathFromBreadcrumbs(breadcrumbs: Breadcrumb[]): string {\r\n  let path = '';\r\n  breadcrumbs.forEach((breadcrumb) => {\r\n    path += breadcrumb.route + '/';\r\n  });\r\n\r\n  return path;\r\n}\r\n\r\nexport { router, routes };\r\n","import { defineRule } from 'vee-validate';\r\nimport {\r\n  required,\r\n  email,\r\n  max,\r\n  regex,\r\n  integer,\r\n  min_value,\r\n  max_value,\r\n} from '@vee-validate/rules';\r\n\r\nexport default {\r\n  install: () => {\r\n    defineRule('required', required);\r\n    defineRule('email', email);\r\n    defineRule('max', max);\r\n    defineRule('regex', regex);\r\n    defineRule('integer', integer);\r\n    defineRule('minValue', min_value);\r\n    defineRule('maxValue', max_value);\r\n\r\n    defineRule(\r\n      'custom',\r\n      (\r\n        value: any,\r\n        [func]: Array<\r\n          (value: any) => boolean | string | Promise<string | boolean>\r\n        >,\r\n      ) => {\r\n        return func(value);\r\n      },\r\n    );\r\n\r\n    const socialSecurityNumberRegex =\r\n      /^(?:(?:19|20)[0-9]{2})(?:0[1-9]|1[0-2])(?:0[1-9]|[12]\\d|3[01])(\\d{4})$/;\r\n\r\n    defineRule('ssn', (value: string) => {\r\n      if (!value || !value.length) {\r\n        return true;\r\n      }\r\n\r\n      if (!socialSecurityNumberRegex.test(value)) {\r\n        return false;\r\n      }\r\n\r\n      let sum = 0;\r\n      const values = value.substring(2, 11);\r\n      for (let i = 0; i < values.length; i++) {\r\n        let v = parseInt(values[i]);\r\n        v *= 2 - (i % 2);\r\n\r\n        if (v > 9) {\r\n          v -= 9;\r\n        }\r\n        sum += v;\r\n      }\r\n\r\n      const checkValue = Math.ceil(sum / 10) * 10 - sum;\r\n\r\n      return value.endsWith(checkValue.toString());\r\n    });\r\n\r\n    const phoneNumberRegex = /^[0-9]{1}[0-9]{6,9}$/;\r\n\r\n    defineRule('phoneNumber', (value: string) => {\r\n      if (!value) {\r\n        return true;\r\n      }\r\n\r\n      return phoneNumberRegex.test(value);\r\n    });\r\n\r\n    const phoneNumberCountryCodeRegex = /^\\+[0-9]{1,4}$/;\r\n\r\n    defineRule('phoneNumberCountryCode', (value: string) => {\r\n      if (!value || !value.length) {\r\n        return true;\r\n      }\r\n\r\n      return phoneNumberCountryCodeRegex.test(value);\r\n    });\r\n  },\r\n};\r\n","import type { App } from 'vue';\r\nimport HighchartsVue from 'highcharts-vue';\r\nimport Highcharts from 'highcharts';\r\nimport NoDataModule from 'highcharts/modules/no-data-to-display.js';\r\nimport highchartsMore from 'highcharts/highcharts-more';\r\nimport accessibility from 'highcharts/modules/accessibility';\r\nimport solidGauge from 'highcharts/modules/solid-gauge';\r\n\r\nexport default {\r\n  install: (app: App) => {\r\n    // There is an issue with type definitions for highcharts-vue with Vite (that's why using \"as any\" below).\r\n    // See: https://github.com/highcharts/highcharts-vue/issues/219#issuecomment-1199171132\r\n    // and: https://github.com/highcharts/highcharts-vue/issues/209\r\n    app.use(HighchartsVue as any);\r\n\r\n    NoDataModule(Highcharts);\r\n    accessibility(Highcharts);\r\n    highchartsMore(Highcharts);\r\n    solidGauge(Highcharts);\r\n\r\n    Highcharts.setOptions({\r\n      chart: {\r\n        style: {\r\n          fontFamily: '\"Source Sans Pro\", Arial, sans-serif', // Unity 4 fonts\r\n        },\r\n      },\r\n    });\r\n  },\r\n};\r\n","import type { App } from 'vue';\r\nimport VueDatePicker from '@vuepic/vue-datepicker';\r\n\r\nexport default {\r\n  install: (app: App) => {\r\n    app.component('VueDatePicker', VueDatePicker);\r\n  },\r\n};\r\n","import { Config } from './utils/Config';\r\nimport 'document-register-element/build/document-register-element';\r\nimport authService, { ApplicationPaths } from './services/AuthService';\r\nimport telemetryService from '@/common/services/TelemetryService';\r\nimport { Logger } from './utils/Logger';\r\nimport { createApp } from 'vue';\r\nimport { createPinia } from 'pinia';\r\nimport App from './App.vue';\r\nimport { router } from './router';\r\nimport i18n from '@/i18n';\r\nimport veeValidate from '@/plugins/vee-validate';\r\nimport highchartsVue from './plugins/highcharts-vue';\r\nimport vueDatepicker from './plugins/vue-datepicker';\r\nimport VueVirtualScroller from 'vue-virtual-scroller';\r\n\r\nConfig.initialize();\r\nLogger.initialize();\r\n\r\nauthService.setConfig(\r\n  Config.Settings.ClientB2C,\r\n  ApplicationPaths.LoginCallback,\r\n  ApplicationPaths.LogOutCallback,\r\n  ApplicationPaths.PasswordChangeCallback,\r\n);\r\n\r\nif (Config.Settings.AIInstrumentationKey) {\r\n  telemetryService.initialize(Config.Settings.AIInstrumentationKey);\r\n}\r\n\r\nconst app = createApp(App);\r\n\r\napp.config.errorHandler = (err, instance, info) => {\r\n  telemetryService.trackException(err as any);\r\n\r\n  if (import.meta.env.PROD) {\r\n    // eslint-disable-next-line no-console\r\n    console.error(`Error in ${info}: \"${(err as any).toString()}\"`);\r\n  }\r\n\r\n  // eslint-disable-next-line no-console\r\n  console.error(err);\r\n};\r\n\r\napp.use(veeValidate);\r\napp.use(highchartsVue);\r\napp.use(vueDatepicker);\r\napp.use(createPinia());\r\napp.use(router);\r\napp.use(i18n);\r\napp.use(VueVirtualScroller);\r\n\r\napp.mount('#app');\r\n","import jQuery from 'jquery';\r\n\r\nwindow.$ = jQuery;\r\nwindow.jQuery = jQuery;\r\n"],"file":"assets/Bi6JBtcsA2RaCxj.js"}