{"version":3,"file":"main.bd58bbbfb837cd58.js","mappings":"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","names":["e","__webpack_require__","webpackAsyncContext","module","HaDatePipe","constructor","translocoService","transform","value","format","compareValue","replace","date","Date","compareWithDate","undefined","activeLang","this","getActiveLang","toLocaleDateString","hour","minute","toLocaleTimeString","year","month","day","getFullYear","toDateString","toLocaleString","core","pure","HaCardNumberPipe","length","slice","join","HaInlineDelimiterListPipe","lastSeparator","wrapElement","separator","text","startElement","endElement","forEach","v","i","isLast","isSecondLast","HaPersonalNumberPipe","key","substring","HaStripHtmlPipe","store","tmp","document","createElement","innerHTML","textContent","innerText","HaTranslatePipe","currentLanguage","selectSnapshot","_","settings","find","language","HaPhoneNumberPipe","isForeignPhoneNumber","number","RegExp","test","SafeHtmlPipe","sanitized","bypassSecurityTrustHtml","HaUtilPipesModule","imports","CommonModule","ErrorsStateActions","New","correlationId","httpStatus","message","error","type","Dismiss","ErrorsState","_class","new","ctx","action","newError","setState","patch","errors","append","dismiss","patchState","factory","__decorate","Action","tslib_es6","State","name","defaults","LanguageState","language_state_class","slideDownTrigger","trigger","transition","style","animate","DimmerComponentAnimations","fadeInOutTrigger","opacity","DimmerComponent","selectors","i0","ErrorSelectors","static","state","Selector","ErrorsComponent","getShortCorrelationId","dispatch","Select","FeedbackComponent","FilterCheckboxState","FilterMenuCheckboxComponent","filter_menu_checkbox_component_class","showTick","isChecked","showDot","UntilDestroy","ClickOutsideDirective","EventEmitter","compareEvent","event","localEvent","isClickInOverlay","target","className","clickOutside","emit","trackEvent","FilterMenuComponent","toggleMenu","stopPropagation","showMenu","hideMenu","clear","clearFilter","LogoComponent","ModalComponent","renderer","crd","ngOnInit","autoOpen","openModal","ngOnChanges","closeLabel","okLabel","cancelLabel","console","invalidInputs","windowKeyUp","emitCancel","emitClose","preventDefault","showModal","detectChanges","disableBodyScroll","cancel","closeModal","close","emitOk","ok","scrollDown","modalElement","modal","nativeElement","scrollHeight","offsetHeight","scrollBy","enableBodyScroll","addClass","body","removeClass","NewsPuffComponent","colorClass","item","color","hasUrl","url","onClick","Array","isArray","Navigate","location","href","openCard","isOpen","SplashScreenComponent","splash_screen_component_class","cdr","sessionStorage","getItem","show","timer","pipe","untilDestroyed","subscribe","setItem","query","animateChild","optional","changeDetection","ButtonLoadingDirective","button_loading_directive_class","element","ngAfterViewInit","select","actionsExecuting","loading","loadingClass","ClickAnchorDirective","click","tagName","toLowerCase","clickAnchor","CtrlClickDirective","unsubscribe","listen","ctrlKey","getSelection","removeAllRanges","ctrlClick","ngOnDestroy","LanguageStateActions","SetLanguage","LanguageStateSelectors","HaUiCommonModule","TranslocoModule","RouterModule","NgxsModule","NgxsActionsExecutingModule","OverlayModule","BaseModalComponent","base_modal_component_class","closeModalEvent","outputs","checkProperties","GoogleGeolocationService","httpClient","getReverseGeocodeAddress","lat","long","params","HttpParams","get","ApplicationFlagsEnum","HaModalService","overlay","router","routerSubscription","events","filter","NavigationStart","overlayRefs","removeAll","open","component","closeOnEscapeOrOutsideClick","componentData","positionStrategy","position","global","newOverlay","create","backdropClass","disposeOnNavigation","hasBackdrop","panelClass","push","backdropClick","removeLatest","fromEvent","componentPortal","ComponentPortal","componentRef","attach","instance","data","splice","detach","dispose","HaUtilCommonModule","String","prototype","toCamelCase","s","charAt","toRouteComponents","split","ValidationService","Subject","currentControlSubject","asObservable","controlFocused","control","next","getControlName","group","parent","Object","keys","controls","some","BaseControlValueAccessor","injector","validationService","changeDetectorRef","deviceDetectorService","dateAdapter","Math","floor","random","langChanges$","lang","setLocale","_value","newValue","propagateChange","invalidAndDirty","invalid","touched","isRequired","validator","required","requiredTrue","isNotDesktop","isDesktop","ngAfterContentInit","formControlName","NgControl","registerOnChange","fn","registerOnTouched","propagateTouched","writeValue","setDisabledState","isDisabled","markAsPristineAndUntouched","markAsPristine","markAsUntouched","onBlur","hasFocus","onChange","onFocus","MakeValueAccessorProvider","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","multi","inputs","CheckboxComponent","t","ctx_r6","ctx_r7","ctx_r14","ctx_r15","InputComponent","super","isDateType","hasNeitherValueNorFocusNorPrefix","prefix","autofocus","inputElement","focus","setFocus","setTimeout","onInputFocus","onInputBlur","emitDate","toString","call","dateChanged","InputRadioGroupComponent","randomNameNumber","SearchBoxComponent","reset","autocompleteHidden","searchInputElement","blur","isSelected","autocompleteListItem","selectedAutocompleteListItem","searchKeypress","setSelectedAutocompleteItem","search","queryChange","down","newIndex","autocompleteList","indexOf","autoCompleteSearch","triggerSearch","clickSearch","SelectComponent","options","listItems","genereateListItems","isUnselected","TranslocoService","x","map","extraLabelText","extraLabelLangKey","translate","langKey","sortWhenTranslated","sort","a","b","toggleExpand","expanded","selectOption","option","ValidationMessagesComponent","validation_messages_component_class","el","changeDetectorRefef","getTranslation","validationResult","isValid","form","camelCaseAllParts","propertyName","setErrors","incorrect","markAsTouched","focusInput","currentControl$","parentControlName","controlName","longControlName","errorIndex","findIndex","markForCheck","canChangeError","propertyNames","Set","numberOfControlsWithError","previousError","nextError","translateError","translation","read","r","translateKey","errorCode","translationCallback","shortPropertyName","validationMessageKey","shortValidationMessageKey","allTranslations","propertyNameTranslation","translatePropertyName","readKey","shortReadKey","globalKey","shortGlobalKey","invalidControl","parentElement","querySelector","parts","selector","part","HaUiFormsModule","Severity","FormsModule","ReactiveFormsModule","MatDatepickerModule","MatNativeDateModule","BreadcrumbActions","createBreadcrumbs","route","breadcrumbs","children","child","snapshot","segment","path","routeURL","title","hasDetailsLink","SetTextOrLangKey","names","BreadcrumbState","breadcrumb_state_class","titleService","ngxsOnInit","combineLatest","NavigationEnd","events$","routerState","root","firstChild","autoBreadcrumbsDisabled","createBreadCrumbs","set","translateBreadcrumbs","take","tap","prepareBrowerTitle","setTextOrLangKey","produce","getState","draft","reverse","breadcrumb","selectTranslate","setBrowserTitle","includeAppTitle","setTitle","mergeAll","translationData","highlighted","toArray","of","SidebarActions","TogglePersonalPanelExpanded","SidebarState","sidebar_state_class","personalPanelExpanded","AccountImpersonateActions","ImpersonateStart","identityUserId","ImpersonateStop","AccountImpersonateService","impersonateStart","command","post","impersonateStop","model","dirty","status","result","AccountImpersonateState","account_impersonate_state_class","accountImpersonateService","success","autoSignInRedirect","AuthActions","cancelUncompleted","SignOut","GetCurrentAccount","CurrentAccountService","AuthState","auth_state_class","oidcSecurityService","currentAccountService","isAuthenticated$","isAuthenticated","getPayloadFromIdToken","originalPayload","sub","forceRefreshSession","newPayload","newSub","reload","logout","logoff","getCurrentAccount","currentAccount","HaFeatureAuthModule","AuthSelectors","AccountImpersonateSelectors","CurrentAccountSelectors","account","isAdministrator","isSuperman","isImpersonated","user","realUser","IsAdministratorGuard","canActivate","IsAdministratorOrImpersonatedGuard","PwaUpdateAvailableModalComponent","pwa_update_available_modal_component_class","update","PwaActions","InstallDismiss","InstallGoTo","SetUpdateAvailable","OpenModalIfUpdateAvailable","PwaService","app","swUpdate","network","deviceService","isRunningAsPwa","displayMode","window","matchMedia","matches","isMobile","isIos","os","isAndroid","isSafari","browser","isChrome","init","trackAppStarted","log","pwaCheckForUpdate","interval","periodicUpgradeCheck","versionUpdates","evt","online","activateUpdate","then","addEventListener","beforeInstallPromptEvent","deferredPrompt","userAgent","JSON","stringify","getDeviceInfo","pwa","addToHomeScreen","checkForUpdate","PwaState","pwa_state_class","pwaService","modalService","isOnline","pwaState","installDismissDate","getTime","showInstallModal","isOnInstallPage","onlineChanges","installGoTo","installDismiss","updateAvailable","openModalIfUpdateAvailable","PwaState_1","HaUtilPwaModule","SidebarComponent","UiLanguageSelectorComponent","setLanguage","languageCode","languageChanged","ImpersonatedInformationPanelComponent","HaUiNavigationModule","BreadcrumbSelectors","ApplicationListModalComponent","applicationList$","currentAccount$","accessToApplications","entries","applicationList","includes","internalIdentifier","signOut","BreadcrumbsComponent","globalEnvironment","ApplicationInsightsMonitoringService","appInsights","ApplicationInsights","config","autoTrackPageVisitTime","instrumentationKey","enableAutoRouteTracking","loadAppInsights","logPageView","trackPageView","uri","logEvent","properties","logMetric","average","trackMetric","logException","exception","severityLevel","trackException","logTrace","trackTrace","ApplicationInsightsErrorHandlerService","ErrorHandler","applicationInsightsMonitoringService","handleError","HaUtilApplicationInsightsModule","APP_INITIALIZER","useFactory","deps","useClass","environment","SettingsStateActions","GetSettings","ChangeLanguage","AppComponent","app_component_class","actions$","ofActionSuccessful","ApplicationPaths","SettingsService","getSettings","SettingsState","settings_state_class","settingsService","uiLanguages","applications","navigator","startsWith","changeLanguage","setActiveLang","setDateFnsLanguage","setDefaultOptions","locale","sv","enUS","SignIn","payload","SignInStatus","SignInService","signIn","SignInState","sign_in_state_class","signInService","returnUrl","SignInSelectors","SignInComponent","sign_in_component_class","fb","activatedRoute","identity","Validators","password","newPassword","newPasswordConfirm","queryParams","redirectUri","parseUrl","redirect_uri","onSubmit","changePasswordMode$","yes","disable","enable","setValue","openPasswordHintModal","passwordHintModal","SignOutComponent","IdentityAuthModule","NgxsFormPluginModule","AppInitService","CoreModule","service","HomeComponent","routes","pathMatch","HomeModule","TranslocoFileLoaderService","langPath","files","globalFiles","file","from","toGlobalPath","forkJoin","assign","TranslationModule","TRANSLOCO_LOADER","TRANSLOCO_CONFIG","useValue","translocoConfig","availableLangs","defaultLang","fallbackLang","reRenderOnLangChange","prodMode","missingHandler","useFallbackTranslation","AppModule","bootstrap","onSameUrlNavigation","anchorScrolling","scrollPositionRestoration","scrollOffset","NgxsStoragePluginModule","developmentMode","selectorOptions","suppressErrors","injectContainerState","NgxsRouterPluginModule","NgxsReduxDevtoolsPluginModule","disabled","NgxsSelectSnapshotModule","BrowserModule","BrowserAnimationsModule","HttpClientModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","err"],"sourceRoot":"webpack:///","sources":["./apps/identity/src/i18n/ lazy ^\\.\\/.*.*\\.json$ namespace object","./global-i18n/ lazy ^\\.\\/.*.*\\.json$ namespace object","./libs/ lazy ^\\.\\/.*\\/src\\/i18n\\/.*\\..*\\.json$ namespace object","./libs/util/pipes/src/lib/pipes/ha-date.pipe.ts","./libs/util/pipes/src/lib/pipes/ha-card-number.pipe.ts","./libs/util/pipes/src/lib/pipes/ha-inline-delimeter-list.pipe.ts","./libs/util/pipes/src/lib/pipes/ha-personal-number.pipe.ts","./libs/util/pipes/src/lib/pipes/ha-strip-html.pipe.ts","./libs/util/pipes/src/lib/pipes/ha-translate.pipe.ts","./libs/util/pipes/src/lib/pipes/phone-number.pipe.ts","./libs/util/pipes/src/lib/pipes/safe-html.pipe.ts","./libs/util/pipes/src/lib/util-pipes.module.ts","./libs/ui/common/src/lib/states/errors.actions.ts","./libs/ui/common/src/lib/states/errors.state.ts","./libs/ui/common/src/lib/states/language.state.ts","./libs/ui/common/src/lib/animations/slide-animations.ts","./libs/ui/common/src/lib/components/dimmer/dimmer.component.animation.ts","./libs/ui/common/src/lib/components/dimmer/dimmer.component.ts","./libs/ui/common/src/lib/components/dimmer/dimmer.component.html","./libs/ui/common/src/lib/components/errors/errors.selectors.ts","./libs/ui/common/src/lib/components/errors/errors.component.html","./libs/ui/common/src/lib/components/errors/errors.component.ts","./libs/ui/common/src/lib/components/feedback/feedback.component.ts","./libs/ui/common/src/lib/components/feedback/feedback.component.html","./libs/ui/common/src/lib/models/filter-checkbox-state.ts","./libs/ui/common/src/lib/components/filter-menu/filter-menu-checkbox/filter-menu-checkbox.component.ts","./libs/ui/common/src/lib/components/filter-menu/filter-menu-checkbox/filter-menu-checkbox.component.html","./libs/ui/common/src/lib/directives/click-outside.directive.ts","./libs/ui/common/src/lib/components/filter-menu/filter-menu.component.html","./libs/ui/common/src/lib/components/filter-menu/filter-menu.component.ts","./libs/ui/common/src/lib/components/logo/logo.component.ts","./libs/ui/common/src/lib/components/logo/logo.component.html","./libs/ui/common/src/lib/components/modal/modal.component.html","./libs/ui/common/src/lib/components/modal/modal.component.ts","./libs/ui/common/src/lib/components/news-puff/news-puff.component.html","./libs/ui/common/src/lib/components/news-puff/news-puff.component.ts","./libs/ui/common/src/lib/components/splash-screen/splash-screen.component.html","./libs/ui/common/src/lib/components/splash-screen/splash-screen.component.ts","./libs/ui/common/src/lib/directives/button-loading.directive.ts","./libs/ui/common/src/lib/directives/click-anchor.directive.ts","./libs/ui/common/src/lib/directives/ctrl-click.directive.ts","./libs/ui/common/src/lib/states/language.actions.ts","./libs/ui/common/src/lib/states/language.selectors.ts","./libs/ui/common/src/lib/ui-common.module.ts","./libs/ui/common/src/lib/components/modal/base-modal.component.ts","./libs/ui/common/src/lib/services/google-geolocation.service.ts","./libs/ui/common/src/lib/models/application-flags.enum.ts","./libs/ui/common/src/lib/services/modal.service.ts","./libs/util/common/src/lib/util-common.module.ts","./libs/util/common/src/lib/functions/to-camel-case.ts","./libs/util/common/src/lib/functions/to-route-components.ts","./libs/ui/forms/src/lib/components/validation-messages/validation.service.ts","./libs/ui/forms/src/lib/components/base-control-value-accessor.component.ts","./libs/ui/forms/src/lib/components/checkbox/checkbox.component.ts","./libs/ui/forms/src/lib/components/checkbox/checkbox.component.html","./libs/ui/forms/src/lib/components/input/input.component.html","./libs/ui/forms/src/lib/components/input/input.component.ts","./libs/ui/forms/src/lib/components/input-radio-group/input-radio-group.component.html","./libs/ui/forms/src/lib/components/input-radio-group/input-radio-group.component.ts","./libs/ui/forms/src/lib/components/search-box/search-box.component.html","./libs/ui/forms/src/lib/components/search-box/search-box.component.ts","./libs/ui/forms/src/lib/components/select/select.component.html","./libs/ui/forms/src/lib/components/select/select.component.ts","./libs/ui/forms/src/lib/components/validation-messages/validation-messages.component.html","./libs/ui/forms/src/lib/components/validation-messages/validation-messages.component.ts","./libs/ui/forms/src/lib/ui-forms.module.ts","./libs/ui/forms/src/lib/models/validation.model.ts","./libs/ui/navigation/src/lib/states/breadcrumb.actions.ts","./libs/ui/navigation/src/lib/components/breadcrumbs/create-breadcrumb.ts","./libs/ui/navigation/src/lib/states/breadcrumb.state.ts","./libs/ui/navigation/src/lib/states/sidebar.actions.ts","./libs/ui/navigation/src/lib/states/sidebar.state.ts","./libs/feature/auth/src/lib/states/account-impersonate.actions.ts","./libs/feature/auth/src/lib/services/account-impersonate.service.ts","./libs/feature/auth/src/lib/states/account-impersonate.state.ts","./libs/feature/auth/src/lib/states/auth.actions.ts","./libs/feature/auth/src/lib/services/current-account.service.ts","./libs/feature/auth/src/lib/states/auth.state.ts","./libs/feature/auth/src/lib/feature-auth.module.ts","./libs/feature/auth/src/lib/states/auth.selectors.ts","./libs/feature/auth/src/lib/states/account-impersonate.selectors.ts","./libs/feature/auth/src/lib/states/current-account.selectors.ts","./libs/feature/auth/src/lib/guards/is-administrator.guard.ts","./libs/feature/auth/src/lib/guards/is-administrator-or-impersonated.guard.ts","./libs/util/pwa/src/lib/components/pwa-update-available-modal/pwa-update-available-modal.component.html","./libs/util/pwa/src/lib/components/pwa-update-available-modal/pwa-update-available-modal.component.ts","./libs/util/pwa/src/lib/states/pwa.actions.ts","./libs/util/pwa/src/lib/services/pwa.service.ts","./libs/util/pwa/src/lib/states/pwa.state.ts","./libs/util/pwa/src/lib/util-pwa.module.ts","./libs/ui/navigation/src/lib/components/sidebar/sidebar.component.html","./libs/ui/navigation/src/lib/components/sidebar/sidebar.component.ts","./libs/ui/navigation/src/lib/components/ui-language-selector/ui-language-selector.component.html","./libs/ui/navigation/src/lib/components/ui-language-selector/ui-language-selector.component.ts","./libs/ui/navigation/src/lib/components/impersonated-information-panel/impersonated-information-panel.component.html","./libs/ui/navigation/src/lib/components/impersonated-information-panel/impersonated-information-panel.component.ts","./libs/ui/navigation/src/lib/ui-navigation.module.ts","./libs/ui/navigation/src/lib/states/breadcrumb.selectors.ts","./libs/ui/navigation/src/lib/components/application-list-modal/application-list-modal.component.html","./libs/ui/navigation/src/lib/components/application-list-modal/application-list-modal.component.ts","./libs/ui/navigation/src/lib/components/breadcrumbs/breadcrumbs.component.html","./libs/ui/navigation/src/lib/components/breadcrumbs/breadcrumbs.component.ts","./libs/constants/src/lib/global-environment.ts","./libs/util/application-insights/src/lib/services/application-insights-monitoring.service.ts","./libs/util/application-insights/src/lib/services/application-insights-error-handler.service.ts","./libs/util/application-insights/src/lib/util-application-insights.module.ts","./apps/identity/src/environments/environment.ts","./apps/identity/src/app/core/states/settings.actions.ts","./apps/identity/src/app/app.component.ts","./apps/identity/src/app/app.component.html","./apps/identity/src/app/app.routes.ts","./apps/identity/src/app/constants/application-paths.ts","./apps/identity/src/app/core/services/settings.service.ts","./apps/identity/src/app/core/states/settings.state.ts","./libs/util/common/src/lib/functions/date-fns-config.ts","./apps/identity/src/app/auth/states/sign-in.actions.ts","./apps/identity/src/app/auth/models/sign-in-result.ts","./apps/identity/src/app/auth/services/sign-in.service.ts","./apps/identity/src/app/auth/states/sign-in.state.ts","./apps/identity/src/app/auth/states/sign-in.selectors.ts","./apps/identity/src/app/auth/components/sign-in.component.html","./apps/identity/src/app/auth/components/sign-in.component.ts","./apps/identity/src/app/auth/components/sign-out.component.ts","./apps/identity/src/app/auth/auth.module.ts","./apps/identity/src/app/core/services/app-init.service.ts","./apps/identity/src/app/core/core.module.ts","./apps/identity/src/app/home/components/home.component.html","./apps/identity/src/app/home/components/home.component.ts","./apps/identity/src/app/home/home.module.ts","./apps/identity/src/app/translation/transloco-file-loader.service.ts","./apps/identity/src/app/translation/translation.module.ts","./apps/identity/src/app/app.module.ts","./apps/identity/src/main.ts"],"sourcesContent":["var map = {\n\t\"./en.json\": [\n\t\t1129,\n\t\t\"apps_identity_src_i18n_en_json\"\n\t],\n\t\"./sv.json\": [\n\t\t8007,\n\t\t\"apps_identity_src_i18n_sv_json\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 3451;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./countries.en.json\": [\n\t\t6688,\n\t\t\"global-i18n_countries_en_json\"\n\t],\n\t\"./countries.sv.json\": [\n\t\t9775,\n\t\t\"global-i18n_countries_sv_json\"\n\t],\n\t\"./global.en.json\": [\n\t\t9413,\n\t\t\"global-i18n_global_en_json\"\n\t],\n\t\"./global.sv.json\": [\n\t\t8409,\n\t\t\"global-i18n_global_sv_json\"\n\t],\n\t\"./languages.en.json\": [\n\t\t6391,\n\t\t\"global-i18n_languages_en_json\"\n\t],\n\t\"./languages.sv.json\": [\n\t\t562,\n\t\t\"global-i18n_languages_sv_json\"\n\t],\n\t\"./libs.en.json\": [\n\t\t3516,\n\t\t\"global-i18n_libs_en_json\"\n\t],\n\t\"./libs.sv.json\": [\n\t\t623,\n\t\t\"global-i18n_libs_sv_json\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 2199;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./feature/account-users/src/i18n/account-users.en.json\": [\n\t\t6226,\n\t\t\"libs_feature_account-users_src_i18n_account-users_en_json\"\n\t],\n\t\"./feature/account-users/src/i18n/account-users.sv.json\": [\n\t\t1929,\n\t\t\"libs_feature_account-users_src_i18n_account-users_sv_json\"\n\t],\n\t\"./feature/permit/src/i18n/permit.en.json\": [\n\t\t7492,\n\t\t\"libs_feature_permit_src_i18n_permit_en_json\"\n\t],\n\t\"./feature/permit/src/i18n/permit.sv.json\": [\n\t\t6049,\n\t\t\"libs_feature_permit_src_i18n_permit_sv_json\"\n\t],\n\t\"./feature/public-education-events/src/i18n/public-education-events.en.json\": [\n\t\t977,\n\t\t\"libs_feature_public-education-events_src_i18n_public-education-events_en_json\"\n\t],\n\t\"./feature/public-education-events/src/i18n/public-education-events.sv.json\": [\n\t\t4771,\n\t\t\"libs_feature_public-education-events_src_i18n_public-education-events_sv_json\"\n\t],\n\t\"./feature/support/src/i18n/support.en.json\": [\n\t\t9031,\n\t\t\"libs_feature_support_src_i18n_support_en_json\"\n\t],\n\t\"./feature/support/src/i18n/support.sv.json\": [\n\t\t7335,\n\t\t\"libs_feature_support_src_i18n_support_sv_json\"\n\t],\n\t\"./feature/user-change-password/src/i18n/user-change-password.en.json\": [\n\t\t9917,\n\t\t\"libs_feature_user-change-password_src_i18n_user-change-password_en_json\"\n\t],\n\t\"./feature/user-change-password/src/i18n/user-change-password.sv.json\": [\n\t\t2877,\n\t\t\"libs_feature_user-change-password_src_i18n_user-change-password_sv_json\"\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 3129;\nmodule.exports = webpackAsyncContext;","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { TranslocoService } from \"@ngneat/transloco\";\n\n@Pipe({ name: \"haDate\" })\nexport class HaDatePipe implements PipeTransform {\n public constructor(private translocoService: TranslocoService) {}\n\n public transform(value: string | undefined, format?: string, compareValue?: string): string {\n if (!value) {\n return \"\";\n }\n\n value = value.replace(\" \", \"T\"); // Safari (and FireFox?) Date parse inconsistency\n const date = new Date(value);\n\n // Date for comparison. If compareValue is not specified, use new date.\n const compareWithDate = compareValue !== undefined ? new Date(compareValue.replace(\" \", \"T\")) : new Date();\n\n const activeLang = this.translocoService.getActiveLang();\n\n if (format === \"dateTimeStandard\") {\n // Example: 2021-02-22 18:09\n return date.toLocaleDateString(activeLang, { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (format === \"time\") {\n // Example: 18:09\n return date.toLocaleTimeString(activeLang, { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (format === \"date\") {\n // Example: 2021-02-22\n return date.toLocaleDateString(activeLang, { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" });\n } else if (format === \"birthDate\") {\n // Example: 2021-02-22\n return date.toLocaleDateString(\"sv\", { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" });\n } else if (format === \"fullDateShortMonth\") {\n // Example: 22 feb 2021\n return date.toLocaleDateString(activeLang, { year: \"numeric\", month: \"short\", day: \"numeric\" }).replace(/\\./g, \"\");\n } else if (format === \"fullDateShortMonthYearIfDiffering\") {\n // Example: 22 feb [or] 22 feb 2021\n return date.toLocaleDateString(activeLang, {\n year: compareWithDate.getFullYear() !== date.getFullYear() ? \"numeric\" : undefined,\n month: \"short\",\n day: \"numeric\"\n }).replace(/\\./g, \"\");\n } else if (format === \"timeIfSameDayElseFullDate\") {\n // Example: 13:41 [or] 2022-03-30 13:41\n const dayDiffers = compareWithDate.toDateString() !== date.toDateString();\n\n return dayDiffers\n ? date.toLocaleDateString(activeLang, { hour: \"2-digit\", minute: \"2-digit\" })\n : date.toLocaleTimeString(activeLang, { hour: \"2-digit\", minute: \"2-digit\" });\n } else if (format === \"dateTimeLongMonthNoYear\") {\n // Example: 22 februari 18:09\n return date.toLocaleString(activeLang, {\n month: \"long\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } else if (format === \"dateTimeLongMonthWithYear\") {\n // Example: 22 februari 2022 18:09\n return date.toLocaleString(activeLang, {\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n } else if (format === \"dayOfMonthAndShortMonth\") {\n // Example: 22 feb\n return date.toLocaleDateString(activeLang, { month: \"short\", day: \"numeric\" }).replace(/\\./g, \"\");\n } else if (format === \"monthAndYear\") {\n // Example: feb 2024\n return date.toLocaleDateString(activeLang, { month: \"short\", year: \"numeric\" });\n }\n\n return date.toLocaleDateString(activeLang);\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({ name: \"haCardNumber\" })\nexport class HaCardNumberPipe implements PipeTransform {\n public transform(value: string) {\n if (value.length !== 12) {\n return value;\n }\n\n return [value.slice(0, 4), value.slice(4, 8), value.slice(8, 12)].join(\" \");\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({ name: \"haInlineDelimiterList\" })\nexport class HaInlineDelimiterListPipe implements PipeTransform {\n public transform(value: string[], lastSeparator: string, wrapElement: string = \"\", separator: string = \", \") {\n let text = \"\";\n\n const startElement = wrapElement ? `<${wrapElement}>` : \"\";\n const endElement = wrapElement ? `` : \"\";\n\n value.forEach((v, i) => {\n const isLast = i + 1 === value.length;\n const isSecondLast = i + 2 === value.length;\n text += `${startElement}${v}${endElement}${isLast ? \"\" : isSecondLast ? lastSeparator : separator}`;\n });\n\n return text;\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({ name: \"haPersonalNumber\" })\nexport class HaPersonalNumberPipe implements PipeTransform {\n public transform(key: string): string {\n if (key) {\n key = key.replace(/\\D/g, \"\");\n\n if (key.length === 12) {\n return key.substring(0, 8) + \"-\" + key.substring(8, 12);\n } else {\n return \"-\";\n }\n } else {\n return \"-\";\n }\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { Store } from \"@ngxs/store\";\n\n@Pipe({ name: \"haStripHtml\" })\nexport class HaStripHtmlPipe implements PipeTransform {\n constructor(private store: Store) {\n }\n\n public transform(value: string): string {\n if (!value) {\n return \"\";\n }\n\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = value;\n return tmp.textContent || tmp.innerText || \"\";\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { Translation } from \"@ha/data/basic\";\nimport { Store } from \"@ngxs/store\";\n\n@Pipe({\n name: \"haTranslate\",\n})\nexport class HaTranslatePipe implements PipeTransform {\n constructor(private store: Store) {\n }\n\n public transform(value: Translation[] | undefined): string {\n if (!value) {\n return \"\";\n }\n\n const currentLanguage = this.store.selectSnapshot((_: { settings: { currentLanguage: string; }; }) =>\n _.settings.currentLanguage\n );\n\n return value.find((_) => _.language === currentLanguage)?.text ?? \"Error haTranslate\";\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({ name: \"haPhonenumber\" })\nexport class HaPhoneNumberPipe implements PipeTransform {\n public transform(key: string): string {\n if (!key) {\n return \"-\";\n }\n if (this.isForeignPhoneNumber(key)) {\n return key;\n }\n\n const digits = key.replace(/[^\\d]/, \"\");\n // eslint-disable-next-line max-len\n const regex = /(0(?:10|100|11|120|121|122|123|125|13|140|141|142|143|144|150|151|152|155|156|157|158|159|16|171|173|174|175|176|18|19|20|21|220|221|222|223|224|225|226|227|23|240|241|243|246|247|248|250|251|252|253|254|255|258|26|270|271|278|280|281|290|291|292|293|294|295|297|300|301|302|303|304|31|320|321|322|325|33|340|345|346|35|36|370|371|372|376|378|379|380|381|382|383|390|392|393|394|40|400|410|411|413|414|415|416|417|418|42|430|431|433|435|44|451|454|455|456|457|459|46|470|471|472|474|476|477|478|479|480|481|485|486|490|491|492|493|494|495|496|498|499|500|501|502|503|504|505|506|510|511|512|513|514|515|518|519|520|521|522|523|524|525|526|528|530|531|532|533|534|54|550|551|552|553|554|555|560|563|564|565|570|571|573|580|581|582|583|584|585|586|587|589|590|591|60|600|611|612|613|620|621|622|623|624|63|640|642|643|644|645|647|649|650|651|652|653|655|656|657|660|661|662|663|670|671|672|673|674|675|676|680|682|684|687|690|691|692|693|695|696|70|71|72|73|74|75|76|77|78|8|800|90|900|910|911|912|913|914|915|916|918|920|921|922|923|924|925|926|927|928|929|930|932|933|934|935|939|940|941|942|943|944|950|951|952|953|954|958|960|961|967|969|970|971|973|975|976|977|978|980|981|99))(?:(\\d{2}(?!\\d{3}$|\\d{5}$|\\d{7}$)|\\d{3}))(?:(\\d{2}(?!\\d{1}$|\\d{3}$)|\\d{3}))(\\d{0,3})/;\n\n return digits.replace(regex, \"$1-$2 $3 $4\");\n }\n\n private isForeignPhoneNumber(number: string): boolean {\n const regexp = new RegExp(/(^([0]{2})|^([+]))(?!46)([\\d-\\s]+)$/);\n\n return regexp.test(number);\n }\n}\n","import { Pipe, PipeTransform } from \"@angular/core\";\nimport { DomSanitizer, SafeHtml } from \"@angular/platform-browser\";\n\n@Pipe({ name: \"safeHtml\" })\nexport class SafeHtmlPipe implements PipeTransform {\n constructor(private sanitized: DomSanitizer) {}\n\n public transform(value: string): SafeHtml {\n return this.sanitized.bypassSecurityTrustHtml(value);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\nimport { HaCardNumberPipe } from \"./pipes/ha-card-number.pipe\";\nimport { HaDatePipe } from \"./pipes/ha-date.pipe\";\nimport { HaInlineDelimiterListPipe } from \"./pipes/ha-inline-delimeter-list.pipe\";\nimport { HaPersonalNumberPipe } from \"./pipes/ha-personal-number.pipe\";\nimport { HaStripHtmlPipe } from \"./pipes/ha-strip-html.pipe\";\nimport { HaTranslatePipe } from \"./pipes/ha-translate.pipe\";\nimport { HaPhoneNumberPipe } from \"./pipes/phone-number.pipe\";\nimport { SafeHtmlPipe } from \"./pipes/safe-html.pipe\";\n\nexport { HaCardNumberPipe } from \"./pipes/ha-card-number.pipe\";\nexport { HaDatePipe } from \"./pipes/ha-date.pipe\";\nexport { HaInlineDelimiterListPipe } from \"./pipes/ha-inline-delimeter-list.pipe\";\nexport { HaPersonalNumberPipe } from \"./pipes/ha-personal-number.pipe\";\nexport { HaStripHtmlPipe } from \"./pipes/ha-strip-html.pipe\";\nexport { HaTranslatePipe } from \"./pipes/ha-translate.pipe\";\nexport { HaPhoneNumberPipe } from \"./pipes/phone-number.pipe\";\nexport { SafeHtmlPipe } from \"./pipes/safe-html.pipe\";\n\n@NgModule({\n imports: [CommonModule],\n declarations: [\n HaCardNumberPipe,\n HaDatePipe,\n HaInlineDelimiterListPipe,\n HaPersonalNumberPipe,\n HaPhoneNumberPipe,\n HaTranslatePipe,\n HaStripHtmlPipe,\n SafeHtmlPipe,\n ],\n exports: [\n HaCardNumberPipe,\n HaDatePipe,\n HaInlineDelimiterListPipe,\n HaPersonalNumberPipe,\n HaPhoneNumberPipe,\n HaTranslatePipe,\n HaStripHtmlPipe,\n SafeHtmlPipe,\n ],\n providers: [HaDatePipe],\n})\nexport class HaUtilPipesModule {}\n","import { HaError } from \"../models/error.model\";\n\nexport namespace ErrorsStateActions {\n export class New {\n public static readonly type = \"[Errors] New\";\n constructor(\n public correlationId: string,\n public httpStatus: number,\n public message: string,\n public error: string,\n ) {}\n }\n\n export class Dismiss {\n public static readonly type = \"[Errors] Dismiss\";\n constructor(public error: HaError) {}\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Action, State, StateContext } from \"@ngxs/store\";\nimport { append, patch } from \"@ngxs/store/operators\";\n\nimport { HaError } from \"../models/error.model\";\nimport { ErrorsStateActions } from \"./errors.actions\";\n\nexport interface ErrorsStateModel {\n errors: HaError[];\n}\n\n@Injectable()\n@State({\n name: \"errors\",\n defaults: {\n errors: [],\n },\n})\nexport class ErrorsState {\n @Action(ErrorsStateActions.New)\n public new(ctx: StateContext, action: ErrorsStateActions.New): void {\n const newError: HaError = {\n correlationId: action.correlationId,\n date: new Date(),\n httpStatus: action.httpStatus,\n message: action.message,\n error: action.error,\n };\n\n ctx.setState(patch({\n errors: append([newError]),\n }));\n }\n\n @Action(ErrorsStateActions.Dismiss)\n public dismiss(ctx: StateContext): void {\n ctx.patchState({\n errors: []\n });\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { State } from \"@ngxs/store\";\n\nexport interface LanguageStateModel {\n currentLanguage: string;\n}\n\n@Injectable()\n@State({\n name: \"language\",\n defaults: {\n currentLanguage: \"sv\",\n },\n})\nexport class LanguageState {\n}\n","import { animate, style, transition, trigger } from \"@angular/animations\";\n\nexport const SlideAnimations = {\n slideDownTrigger: trigger(\"slideDownTrigger\", [\n transition(\":enter\", [\n style({\n transform: \"translateY(-100%)\",\n }),\n animate(\n \"200ms\",\n style({\n transform: \"translateY(0)\",\n }),\n ),\n ]),\n transition(\":leave\", [\n style({\n transform: \"translateY(0)\",\n }),\n animate(\n \"200ms\",\n style({\n transform: \"translateY(-100%)\",\n }),\n ),\n ]),\n ])\n};\n","import { animate, style, transition, trigger } from \"@angular/animations\";\n\nexport const DimmerComponentAnimations = {\n fadeInOutTrigger: trigger(\"fadeInOutTrigger\", [\n transition(\":enter\", [\n style({\n opacity: \"0\",\n }),\n animate(\n \"300ms\",\n style({\n opacity: \"0.1\",\n }),\n ),\n ]),\n transition(\":leave\", [\n style({\n opacity: \"0.1\",\n }),\n animate(\n \"300ms\",\n style({\n opacity: \"0\",\n }),\n ),\n ]),\n ]),\n};\n","import { Component } from \"@angular/core\";\n\nimport { DimmerComponentAnimations } from \"./dimmer.component.animation\";\n\n@Component({\n selector: \"ha-dimmer\",\n templateUrl: \"./dimmer.component.html\",\n styleUrls: [\"./dimmer.component.scss\"],\n animations: [DimmerComponentAnimations.fadeInOutTrigger],\n})\nexport class DimmerComponent {}\n","
\n","import { Selector } from \"@ngxs/store\";\n\nimport { HaError } from \"../../models/error.model\";\nimport { ErrorsState, ErrorsStateModel } from \"../../states/errors.state\";\n\nexport class ErrorSelectors {\n @Selector([ErrorsState])\n public static errors(state: ErrorsStateModel): HaError[] {\n return state.errors;\n }\n\n @Selector([ErrorSelectors.errors])\n public static firstError(errors: HaError[]): HaError {\n return errors[0];\n }\n}\n","
\n
\n
\n
\n \n
\n
\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { Select, Store } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\n\nimport { HaError } from \"../../models/error.model\";\nimport { ErrorsStateActions } from \"../../states/errors.actions\";\nimport { ErrorSelectors } from \"./errors.selectors\";\n\n@Component({\n selector: \"errors\",\n templateUrl: \"./errors.component.html\",\n styleUrls: [\"./errors.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ErrorsComponent {\n @Select(ErrorSelectors.firstError)\n public error$!: Observable;\n\n public constructor(private store: Store) {}\n\n public getShortCorrelationId(error: HaError): string {\n return error.correlationId.slice(error.correlationId.length - 6);\n }\n\n public dismiss(error: HaError): void {\n this.store.dispatch(new ErrorsStateActions.Dismiss(error));\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"feedback\",\n templateUrl: \"./feedback.component.html\",\n styleUrls: [\"./feedback.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FeedbackComponent {\n @Input() public type: \"info\" | \"error\" = \"info\";\n}\n","
\n
\n
\n \n
\n
\n","export enum FilterCheckboxState {\n notChecked = 0,\n indeterminate = 1,\n checked = 2\n}\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\n\nimport { FilterCheckboxState } from \"../../../models/filter-checkbox-state\";\n\n@UntilDestroy()\n@Component({\n selector: \"prm-filter-menu-checkbox\",\n templateUrl: \"./filter-menu-checkbox.component.html\",\n styleUrls: [\"./filter-menu-checkbox.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilterMenuCheckboxComponent {\n @Input() public isChecked: FilterCheckboxState | boolean | null;\n\n public FilterCheckboxState = FilterCheckboxState;\n\n public get showTick() {\n return this.isChecked === true || this.isChecked === FilterCheckboxState.checked;\n }\n\n public get showDot() {\n return this.isChecked !== true && this.isChecked === FilterCheckboxState.indeterminate;\n }\n}\n","
\n \n \n \n \n \n \n
\n","import { Directive, EventEmitter, HostListener, Output } from \"@angular/core\";\n\n@Directive({\n selector: \"[clickOutside]\",\n})\nexport class ClickOutsideDirective {\n @Output() public clickOutside = new EventEmitter();\n\n private localEvent: Event | undefined;\n\n /** Compare event at the Document level to a reference of the Element:click\n * This method triggers when we are on Document level - Document was clicked or event bubbling\n * If the Document click DON'T MATCH the Event:click reference => than the click is from outside of the Element\n * @param event\n */\n @HostListener(\"document:click\", [\"$event\"])\n public compareEvent(event: PointerEvent): void {\n function isClickInOverlay() {\n return (event.target as Element).className === \"cdk-overlay-container\";\n }\n\n if (event !== this.localEvent && isClickInOverlay()) {\n this.clickOutside.emit(event);\n }\n\n this.localEvent = undefined;\n }\n\n /** Track user click from inside the bound target\n * We use this to track the click Event when it bubbles up the DOM tree\n * @param event\n */\n @HostListener(\"click\", [\"$event\"])\n public trackEvent(event: Event): void {\n this.localEvent = event;\n }\n}\n","
\n
\n
\n
\n
{{ t(\"title\") }}
\n
\n
{{ filterCount }}
\n
{{ t(\"clear\") }}
\n
\n
\n \n
\n
\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from \"@angular/core\";\n\n@Component({\n selector: \"ha-filter-menu\",\n templateUrl: \"./filter-menu.component.html\",\n styleUrls: [\"./filter-menu.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FilterMenuComponent {\n @Input() public filterCount: number;\n @Output() public clearFilter = new EventEmitter();\n\n public showMenu = false;\n\n public toggleMenu(event: MouseEvent): void {\n event.stopPropagation();\n\n this.showMenu = !this.showMenu;\n }\n\n public hideMenu(): void {\n this.showMenu = false;\n }\n\n public clear() {\n this.clearFilter.emit();\n }\n}\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\n\n@Component({\n selector: \"logo\",\n templateUrl: \"./logo.component.html\",\n styleUrls: [\"./logo.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LogoComponent {\n @Input() public mobileOnly = false;\n}\n","\n","\n
\n
\n
\n
\n \n
\n\n
\n
\n {{ cancelLabel }}\n
\n
\n {{ closeLabel }}\n
\n
\n {{ okLabel }}\n
\n
\n
\n
\n
\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n OnInit,\n Output,\n Renderer2,\n ViewChild,\n} from \"@angular/core\";\n\n@Component({\n selector: \"modal\",\n templateUrl: \"./modal.component.html\",\n styleUrls: [\"./modal.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ModalComponent implements OnInit, OnChanges {\n @ViewChild(\"modal\") private modal!: ElementRef;\n\n @Input() public cancelLabel!: string;\n @Input() public closeLabel!: string;\n @Input() public okLabel!: string;\n\n @Input() public autoOpen!: boolean;\n\n @Input() public width: \"narrow\" | \"wide\" = \"narrow\";\n @Input() public textSource: \"from-translation\" | \"from-editor\" = \"from-translation\";\n\n @Output() public cancel = new EventEmitter();\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() public close = new EventEmitter();\n @Output() public ok = new EventEmitter();\n\n public showModal = false;\n public invalidInputs = false;\n public scrollHeight!: number;\n\n constructor(private renderer: Renderer2, private crd: ChangeDetectorRef) { }\n\n public ngOnInit(): void {\n if (this.autoOpen) {\n this.openModal();\n }\n }\n\n public ngOnChanges(): void {\n if (this.closeLabel && (this.okLabel || this.cancelLabel)) {\n console.error(\"modal.component.ts: 'closeLabel' cannot be combined with 'cancelLabel' or 'okLabel'.\");\n this.invalidInputs = true;\n } else if ((this.cancelLabel && !this.okLabel) || (!this.cancelLabel && this.okLabel)) {\n console.error(\"modal.component.ts: 'cancelLabel' and 'okLabel' must be passed together.\");\n this.invalidInputs = true;\n }\n }\n\n @HostListener(\"window:keyup\", [\"$event\"])\n public windowKeyUp(event: KeyboardEvent): boolean {\n if (event.key === \"Escape\") {\n this.emitCancel();\n this.emitClose();\n return true;\n } else {\n event.preventDefault();\n return false;\n }\n }\n\n public openModal(): void {\n if (this.invalidInputs) {\n return;\n }\n\n this.showModal = true;\n this.crd.detectChanges();\n\n this.disableBodyScroll();\n }\n\n public emitCancel(): void {\n this.cancel.emit();\n this.closeModal();\n }\n\n public emitClose(): void {\n this.close.emit();\n this.closeModal();\n }\n\n public emitOk(): void {\n this.ok.emit();\n this.closeModal();\n }\n\n public scrollDown(): void {\n const modalElement = this.modal.nativeElement as HTMLElement;\n\n // Only calculate scroll height the first time.\n if (this.scrollHeight === undefined) {\n this.scrollHeight = modalElement ? modalElement.offsetHeight - 150 : 0;\n }\n\n if (modalElement) {\n modalElement.scrollBy(0, this.scrollHeight);\n }\n }\n\n private closeModal(): void {\n this.enableBodyScroll();\n this.showModal = false;\n }\n\n private disableBodyScroll() {\n this.renderer.addClass(document.body, \"no-scroll\");\n }\n\n private enableBodyScroll() {\n this.renderer.removeClass(document.body, \"no-scroll\");\n }\n}\n","
\n
\n
\n
\n
\n
\n\n \n
\n
\n
\n
\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\nimport { NewsItem } from \"@ha/data/basic\";\nimport { Store } from \"@ngxs/store\";\nimport { Navigate } from \"@ngxs/router-plugin\";\n\n@Component({\n selector: \"news-puff\",\n templateUrl: \"./news-puff.component.html\",\n styleUrls: [\"./news-puff.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NewsPuffComponent {\n @Input()\n public item: NewsItem;\n\n public isOpen = false;\n public get colorClass() {\n return \"puff--\" + this.item.color;\n }\n\n public get hasUrl() {\n return this.item.url;\n }\n\n public onClick() {\n if (this.item.url) {\n const url = this.item.url;\n if (Array.isArray(url)) {\n this.store.dispatch(new Navigate(url));\n } else {\n location.href = url;\n }\n }\n }\n\n constructor(private store: Store) {}\n\n public openCard() {\n this.isOpen = !this.isOpen;\n }\n\n\n // public onClickLink() {\n // if (this.item.url) {\n // const url = this.item.url;\n // if (Array.isArray(url)) {\n // this.store.dispatch(new Navigate(url));\n // } else {\n // location.href = url;\n // }\n // } else {\n // this.isOpen = false;\n // }\n // }\n}\n","
\n
\n
\n
\n
\n
\n","import { animate, animateChild, query, style, transition, trigger } from \"@angular/animations\";\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from \"@angular/core\";\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { timer } from \"rxjs\";\n\n@UntilDestroy()\n@Component({\n selector: \"splash-screen\",\n templateUrl: \"./splash-screen.component.html\",\n styleUrls: [\"./splash-screen.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger(\"fadeOut\", [\n transition(\":leave\", [\n query(\":leave\", animateChild(), { optional: true }),\n animate(300, style({ opacity: 0 })),\n ]),\n ]),\n ],\n})\nexport class SplashScreenComponent implements OnInit {\n public show = false;\n\n constructor(private cdr: ChangeDetectorRef) {}\n\n public ngOnInit(): void {\n const hasSplashBeenShown = sessionStorage.getItem(\"hasSplashBeenShown\");\n if (!hasSplashBeenShown) {\n this.show = true;\n this.cdr.detectChanges();\n timer(1000).pipe(untilDestroyed(this)).subscribe(() => {\n this.show = false;\n sessionStorage.setItem(\"hasSplashBeenShown\", \"true\");\n this.cdr.detectChanges();\n });\n }\n }\n}\n","import { AfterViewInit, Directive, ElementRef, Input, Renderer2 } from \"@angular/core\";\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { actionsExecuting } from \"@ngxs-labs/actions-executing\";\nimport { ActionType, Store } from \"@ngxs/store\";\n\n@UntilDestroy()\n@Directive({\n selector: \"button[loading]\",\n})\nexport class ButtonLoadingDirective implements AfterViewInit {\n @Input() public loading: ActionType;\n\n private loadingClass = \"button-loading-directive-loading\";\n\n constructor(private readonly renderer: Renderer2, private readonly element: ElementRef, private store: Store) { }\n\n public ngAfterViewInit(): void {\n this.store.select(actionsExecuting([this.loading]))\n .pipe(untilDestroyed(this))\n .subscribe((actionsExecuting) => {\n if (actionsExecuting) {\n this.renderer.addClass(this.element.nativeElement, this.loadingClass);\n } else {\n this.renderer.removeClass(this.element.nativeElement, this.loadingClass);\n }\n });\n }\n}\n","import { Directive, EventEmitter, HostListener, Output } from \"@angular/core\";\n\n@Directive({\n selector: \"[clickAnchor]\",\n})\nexport class ClickAnchorDirective {\n @Output()\n public clickAnchor = new EventEmitter();\n\n @HostListener(\"click\", [\"$event\"])\n public click(event: MouseEvent): void {\n const element = event.target as HTMLElement;\n if (element.tagName.toLowerCase() === \"a\") {\n this.clickAnchor.emit(event);\n }\n }\n}\n","import { Directive, ElementRef, EventEmitter, OnDestroy, OnInit, Output, Renderer2 } from \"@angular/core\";\n\n@Directive({\n selector: \"[ctrlClick]\",\n})\nexport class CtrlClickDirective implements OnInit, OnDestroy {\n private unsubscribe: (() => void) | undefined;\n\n @Output()\n public ctrlClick = new EventEmitter();\n\n constructor(private readonly renderer: Renderer2, private readonly element: ElementRef) {}\n\n public ngOnInit(): void {\n this.unsubscribe = this.renderer.listen(this.element.nativeElement, \"click\", (event: MouseEvent) => {\n if (event.ctrlKey) {\n event.preventDefault();\n event.stopPropagation();\n // unselect accidentally selected text (browser default behaviour)\n document.getSelection()?.removeAllRanges();\n\n this.ctrlClick.emit(event);\n }\n });\n }\n\n public ngOnDestroy(): void {\n if (!this.unsubscribe) {\n return;\n }\n\n this.unsubscribe();\n }\n}\n","export namespace LanguageStateActions {\n export class SetLanguage {\n public static readonly type = \"[Language] SetLanguage\";\n constructor(public language: string) {}\n }\n}\n","import { Selector } from \"@ngxs/store\";\n\nimport { LanguageState, LanguageStateModel } from \"./language.state\";\n\nexport class LanguageStateSelectors {\n @Selector([LanguageState])\n public static currentLanguage(state: LanguageStateModel): string {\n return state?.currentLanguage;\n }\n}\n","import { OverlayModule } from \"@angular/cdk/overlay\";\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { HaUtilPipesModule } from \"@ha/util/pipes\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\nimport { NgxsActionsExecutingModule } from \"@ngxs-labs/actions-executing\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { DimmerComponent } from \"./components/dimmer/dimmer.component\";\nimport { ErrorsComponent } from \"./components/errors/errors.component\";\nimport { FeedbackComponent } from \"./components/feedback/feedback.component\";\nimport { FilterMenuCheckboxComponent } from \"./components/filter-menu/filter-menu-checkbox/filter-menu-checkbox.component\";\nimport { FilterMenuComponent } from \"./components/filter-menu/filter-menu.component\";\nimport { LogoComponent } from \"./components/logo/logo.component\";\nimport { ModalComponent } from \"./components/modal/modal.component\";\nimport { NewsPuffComponent } from \"./components/news-puff/news-puff.component\";\nimport { SplashScreenComponent } from \"./components/splash-screen/splash-screen.component\";\nimport { ButtonLoadingDirective } from \"./directives/button-loading.directive\";\nimport { ClickAnchorDirective } from \"./directives/click-anchor.directive\";\nimport { ClickOutsideDirective } from \"./directives/click-outside.directive\";\nimport { CtrlClickDirective } from \"./directives/ctrl-click.directive\";\nimport { ErrorsState } from \"./states/errors.state\";\nimport { LanguageState } from \"./states/language.state\";\n\n// HEAD\n//\n// master\nexport { SlideAnimations } from \"./animations/slide-animations\";\nexport { DimmerComponent } from \"./components/dimmer/dimmer.component\";\nexport { ErrorsComponent } from \"./components/errors/errors.component\";\nexport { FeedbackComponent } from \"./components/feedback/feedback.component\";\nexport { FilterMenuCheckboxComponent } from \"./components/filter-menu/filter-menu-checkbox/filter-menu-checkbox.component\";\nexport { FilterMenuComponent } from \"./components/filter-menu/filter-menu.component\";\nexport { LogoComponent } from \"./components/logo/logo.component\";\nexport { ModalComponent } from \"./components/modal/modal.component\";\nexport { NewsPuffComponent } from \"./components/news-puff/news-puff.component\";\nexport { SplashScreenComponent } from \"./components/splash-screen/splash-screen.component\";\nexport { ButtonLoadingDirective } from \"./directives/button-loading.directive\";\nexport { ClickAnchorDirective } from \"./directives/click-anchor.directive\";\nexport { ClickOutsideDirective } from \"./directives/click-outside.directive\";\nexport { CtrlClickDirective } from \"./directives/ctrl-click.directive\";\nexport { LanguageStateActions } from \"./states/language.actions\";\nexport { LanguageStateSelectors } from \"./states/language.selectors\";\nexport { LanguageState } from \"./states/language.state\";\n\n@NgModule({\n imports: [\n CommonModule,\n TranslocoModule,\n RouterModule,\n NgxsModule.forFeature([ErrorsState, LanguageState]),\n NgxsActionsExecutingModule.forRoot(),\n OverlayModule,\n HaUtilPipesModule,\n ],\n declarations: [\n ButtonLoadingDirective,\n ClickAnchorDirective,\n ClickOutsideDirective,\n CtrlClickDirective,\n DimmerComponent,\n ErrorsComponent,\n FeedbackComponent,\n FilterMenuCheckboxComponent,\n FilterMenuComponent,\n LogoComponent,\n ModalComponent,\n NewsPuffComponent,\n SplashScreenComponent,\n ],\n exports: [\n ButtonLoadingDirective,\n ClickAnchorDirective,\n ClickOutsideDirective,\n CtrlClickDirective,\n DimmerComponent,\n ErrorsComponent,\n FeedbackComponent,\n FilterMenuCheckboxComponent,\n FilterMenuComponent,\n LogoComponent,\n ModalComponent,\n NewsPuffComponent,\n SplashScreenComponent,\n ],\n providers: [],\n})\nexport class HaUiCommonModule {}\n","import { Directive, EventEmitter, Output } from \"@angular/core\";\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\n\n@UntilDestroy({ checkProperties: true })\n@Directive()\nexport abstract class BaseModalComponent {\n @Output() public closeModalEvent = new EventEmitter();\n\n public data: unknown;\n\n public busy = false;\n\n public closeModal(): void {\n this.closeModalEvent.emit();\n }\n}\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\nimport { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\nimport { GeocodingResult } from \"../models/geocoding-result.model\";\n\nconst url = \"https://maps.googleapis.com/maps/api/geocode/json\";\n\n@Injectable({ providedIn: \"root\" })\nexport class GoogleGeolocationService {\n constructor(private httpClient: HttpClient) {}\n\n public getReverseGeocodeAddress(lat: number, long: number, key: string): Observable {\n let params = new HttpParams();\n params = params.append(\"latlng\", `${lat},${long}`);\n params = params.append(\"key\", key);\n params = params.append(\"result_type\", \"street_address\");\n\n return this.httpClient.get(url, { params });\n }\n}\n","export enum ApplicationFlagsEnum {\n App = 1 << 0,\n Premium = 1 << 1,\n Admin = 1 << 2,\n}\n","import { ComponentType, Overlay, OverlayRef } from \"@angular/cdk/overlay\";\nimport { ComponentPortal } from \"@angular/cdk/portal\";\nimport { Injectable, OnDestroy } from \"@angular/core\";\nimport { NavigationStart, Router } from \"@angular/router\";\nimport { fromEvent, Subscription } from \"rxjs\";\nimport { filter } from \"rxjs/operators\";\n\nimport { BaseModalComponent } from \"../..\";\n\n@Injectable({ providedIn: \"root\" })\nexport class HaModalService implements OnDestroy {\n private overlayRefs!: OverlayRef[];\n\n private routerSubscription: Subscription;\n\n constructor(private overlay: Overlay, private router: Router) {\n this.routerSubscription = this.router.events\n .pipe(\n filter((e) => e instanceof NavigationStart),\n filter(() => !!this.overlayRefs)\n )\n .subscribe(() => {\n this.removeAll();\n });\n }\n\n public ngOnDestroy(): void {\n this.routerSubscription.unsubscribe();\n this.removeAll();\n }\n\n public open(component: ComponentType, closeOnEscapeOrOutsideClick: boolean, componentData: unknown = undefined): void {\n const positionStrategy = this.overlay\n .position()\n .global();\n // .centerHorizontally()\n // .centerVertically();\n\n // We create the overlay\n this.overlayRefs = this.overlayRefs ?? [];\n\n const newOverlay = this.overlay.create({\n backdropClass: \"ha-modal-backdrop\",\n disposeOnNavigation: true,\n hasBackdrop: true,\n panelClass: [\"ha-modal\"],\n positionStrategy: positionStrategy,\n });\n\n this.overlayRefs.push(newOverlay);\n\n // If modal doesn't require an active choice, close\n // on backdrop click and escape keypress.\n if (closeOnEscapeOrOutsideClick) {\n newOverlay.backdropClick().subscribe(() => {\n this.removeLatest();\n });\n\n fromEvent(document, \"keydown\").subscribe((event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n this.removeLatest();\n }\n });\n }\n\n //Then we create a portal to render a component\n const componentPortal = new ComponentPortal(component);\n\n //We render the portal in the overlay\n const componentRef = newOverlay.attach(componentPortal);\n componentRef.instance.data = componentData;\n\n // Remove overlay on close modal event from component\n componentRef.instance.closeModalEvent.subscribe(() => {\n this.removeLatest();\n });\n }\n\n private removeLatest() {\n const overlay = this.overlayRefs.splice(-1)[0];\n overlay.detach();\n }\n\n private removeAll() {\n this.overlayRefs.forEach(_ => {\n _.dispose();\n });\n\n this.overlayRefs.length = 0;\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\n\n\n@NgModule({\n imports: [\n CommonModule\n ]\n})\nexport class HaUtilCommonModule {}\n","export function toCamelCase(s: string): string {\n return s.charAt(0).toLowerCase() + s.slice(1);\n}\n\ndeclare global {\n interface String {\n toCamelCase(): string;\n }\n}\n\nString.prototype.toCamelCase = function () {\n return toCamelCase(this as string);\n};\n","export function toRouteComponents(s: string): string[] {\n return s.length > 1 ? s.split(\"/\") : [s];\n}\n\ndeclare global {\n interface String {\n toRouteComponents(): string[];\n }\n}\n\nString.prototype.toRouteComponents = function () {\n return toRouteComponents(this as string);\n};\n","import { Injectable } from \"@angular/core\";\nimport { AbstractControl, UntypedFormGroup } from \"@angular/forms\";\nimport { Subject } from \"rxjs\";\n\n@Injectable({ providedIn: \"root\" })\nexport class ValidationService {\n private currentControlSubject = new Subject();\n public currentControl$ = this.currentControlSubject.asObservable();\n\n public controlFocused(control: AbstractControl): void {\n this.currentControlSubject.next(control);\n }\n\n public getControlName(control: AbstractControl): string | null {\n const group = control.parent;\n\n if (!group) {\n return null;\n }\n\n let name: string;\n Object.keys(group.controls).some((key) => {\n const childControl = group.get(key);\n\n if (childControl !== control) {\n return false;\n } else {\n name = key;\n return true;\n }\n });\n\n return name;\n }\n}\n","import { AfterContentInit, ChangeDetectorRef, Directive, forwardRef, Injector, Input } from \"@angular/core\";\nimport { AbstractControl, ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl } from \"@angular/forms\";\nimport { DateAdapter } from \"@angular/material/core\";\nimport { TranslocoService } from \"@ngneat/transloco\";\nimport { DeviceDetectorService } from \"ngx-device-detector\";\n\nimport { ValidationService } from \"./validation-messages/validation.service\";\n\n@Directive()\n// eslint-disable-next-line @angular-eslint/directive-class-suffix\nexport class BaseControlValueAccessor implements ControlValueAccessor, AfterContentInit {\n @Input()\n public formControlName: string | number = Math.floor(Math.random() * 10000);\n\n constructor(\n protected injector: Injector,\n protected validationService: ValidationService,\n protected changeDetectorRef: ChangeDetectorRef,\n protected deviceDetectorService: DeviceDetectorService,\n protected translocoService: TranslocoService,\n protected dateAdapter: DateAdapter,\n ) {\n this.translocoService.langChanges$.subscribe((lang) => {\n this.dateAdapter.setLocale(lang);\n });\n }\n\n public hasFocus = false;\n\n public set value(v: T) {\n if (v !== this._value) {\n const newValue = this._value !== v;\n this._value = v;\n\n if (newValue) {\n this.propagateChange(this._value);\n }\n }\n }\n public get value(): T {\n return this._value;\n }\n\n public get invalidAndDirty(): boolean {\n return this.control && this.control.invalid && this.control.touched;\n }\n\n public get isRequired(): boolean {\n if (this.control?.validator) {\n const validator = this.control.validator({} as AbstractControl);\n return (validator && (validator[\"required\"] || validator[\"requiredTrue\"])) as boolean;\n }\n\n return false;\n }\n\n public get isNotDesktop() {\n return !this.deviceDetectorService.isDesktop();\n }\n\n public isDisabled = false;\n\n public control: AbstractControl;\n\n protected _value: T = undefined;\n\n public ngAfterContentInit(): void {\n if (this.formControlName) {\n this.control = this.injector.get(NgControl).control;\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public propagateChange = (_: T): void => null;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public propagateTouched = (_: T): void => null;\n\n public registerOnChange(fn: (_: T) => void): void {\n this.propagateChange = fn;\n }\n\n public registerOnTouched(fn: (_: T) => void): void {\n this.propagateTouched = fn;\n }\n\n public writeValue(value: T): void {\n this.value = value;\n }\n\n public setDisabledState(isDisabled: boolean): void {\n this.isDisabled = isDisabled;\n }\n\n public markAsPristineAndUntouched(): void {\n this.control.markAsPristine();\n this.control.markAsUntouched();\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n public onBlur(event: FocusEvent): void {\n this.hasFocus = false;\n this.propagateTouched(undefined);\n }\n\n public onChange(event: Event): void {\n this.propagateTouched(undefined);\n }\n\n public onFocus(): void {\n this.hasFocus = true;\n this.validationService.controlFocused(this.control);\n }\n}\n\nexport function MakeValueAccessorProvider(type: unknown): { provide: unknown; useExisting: unknown; multi: boolean; } {\n return {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => type),\n multi: true,\n };\n}\n","import { Component, Input } from \"@angular/core\";\n\nimport { BaseControlValueAccessor, MakeValueAccessorProvider } from \"../base-control-value-accessor.component\";\n\n@Component({\n selector: \"ha-checkbox\",\n templateUrl: \"./checkbox.component.html\",\n styleUrls: [\"./checkbox.component.scss\"],\n providers: [MakeValueAccessorProvider(CheckboxComponent)],\n})\nexport class CheckboxComponent extends BaseControlValueAccessor {\n @Input() public label: string;\n}\n","
\n \n \n
\n","
\n\n \n
\n
\n \n
\n \n
\n\n \n
\n
\n \n
\n \n\n \n
\n
\n","import { AfterViewInit, Component, ElementRef, EventEmitter, Input, OnInit, Output, ViewChild } from \"@angular/core\";\nimport { MatDatepickerInputEvent } from \"@angular/material/datepicker\";\nimport format from \"date-fns/format\";\n\nimport { BaseControlValueAccessor, MakeValueAccessorProvider } from \"../base-control-value-accessor.component\";\n\n@Component({\n selector: \"ha-input\",\n templateUrl: \"./input.component.html\",\n styleUrls: [\"./input.component.scss\"],\n providers: [MakeValueAccessorProvider(InputComponent)],\n})\nexport class InputComponent extends BaseControlValueAccessor implements OnInit, AfterViewInit {\n @Input() public label: string;\n @Input() public name: string;\n @Input() public type = \"text\";\n @Input() public autocomplete = \"off\";\n @Input() public autofocus = false;\n @Input() public readOnlyOnDisabled = false;\n @Input() public prefix: string;\n @Input() public maxlength: number;\n @Input() public uppercaseOnly = false;\n @Input() public min: string | number;\n @Input() public max: string | number;\n\n @ViewChild(\"inputElement\", { static: false }) private inputElement: ElementRef;\n\n @Output() public dateChanged = new EventEmitter();\n\n public isDateType: boolean;\n\n public override get value(): string {\n return super.value;\n }\n\n public override set value(v: string) {\n // Fix for input of type date.\n if (this.isDateType) {\n // Set to null when cleared to avoid empty string.\n // Set value to yyyy-MM-dd format\n super.value = !v || v == \"\" ? null : format(new Date(v), \"yyyy-MM-dd\");\n } else {\n super.value = v;\n }\n }\n\n public get hasNeitherValueNorFocusNorPrefix(): boolean {\n return !this.value && !this.hasFocus && !this.prefix;\n }\n\n public ngOnInit(): void {\n // Fix for input of type date. We want the\n // date type to be active only when focused.\n if (this.type == \"date\") {\n this.isDateType = true;\n this.type = \"text\";\n }\n }\n\n public ngAfterViewInit(): void {\n if (this.autofocus) {\n this.hasFocus = true;\n this.inputElement.nativeElement.focus();\n this.changeDetectorRef.detectChanges();\n }\n }\n\n public setFocus(): void {\n setTimeout(() => {\n this.inputElement.nativeElement.focus();\n this.changeDetectorRef.detectChanges();\n });\n }\n\n public onInputFocus(): void {\n // Fix for input of type date. We want the\n // date type to be active only when focused.\n if (this.isDateType) {\n this.type = \"date\";\n }\n }\n\n public onInputBlur(): void {\n // Fix for input of type date. We want the\n // date type to be active only when focused.\n if (this.isDateType) {\n this.type = \"text\";\n }\n }\n\n public emitDate(date: MatDatepickerInputEvent): void {\n if (Object.prototype.toString.call(date.value) === \"[object Date]\") {\n this.dateChanged.emit(date.value as Date);\n }\n }\n}\n","
\n
\n \n \n
\n
\n","import { Component, Input } from \"@angular/core\";\n\nimport { SelectionList } from \"../../models/selection-list.model\";\nimport { BaseControlValueAccessor, MakeValueAccessorProvider } from \"../base-control-value-accessor.component\";\n\n@Component({\n selector: \"input-radio-group\",\n templateUrl: \"./input-radio-group.component.html\",\n styleUrls: [\"./input-radio-group.component.scss\"],\n providers: [MakeValueAccessorProvider(InputRadioGroupComponent)],\n})\nexport class InputRadioGroupComponent extends BaseControlValueAccessor {\n @Input() public list: SelectionList;\n\n private randomNameNumber = Math.floor(Math.random() * 10000);\n\n public get name(): string {\n return `${this.formControlName}-${this.randomNameNumber}`;\n }\n}\n","
\n
\n \n
\n \n
\n
0\" class=\"search__autocomplete\">\n
\n
\n
\n\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n ViewChild,\n} from \"@angular/core\";\n\nimport { BaseControlValueAccessor, MakeValueAccessorProvider } from \"../base-control-value-accessor.component\";\nimport { SearchBoxAutocompleteListItem } from \"./search-box-autocomplete.model\";\n\n@Component({\n selector: \"search-box\",\n templateUrl: \"search-box.component.html\",\n styleUrls: [\"search-box.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [MakeValueAccessorProvider(SearchBoxComponent)],\n})\nexport class SearchBoxComponent extends BaseControlValueAccessor implements AfterViewInit {\n public override get value(): string {\n return super.value;\n }\n\n public override set value(v: string) {\n super.value = v;\n }\n\n @Output() public queryChange = new EventEmitter();\n\n @Input() public focus: boolean;\n\n @Input() public autocompleteList: SearchBoxAutocompleteListItem[];\n\n @Input() public placeholder: string;\n\n @Output() public triggerSearch = new EventEmitter();\n\n @ViewChild(\"searchInput\", { static: true }) private searchInputElement: ElementRef;\n\n public autocompleteHidden = true;\n\n private selectedAutocompleteListItem: SearchBoxAutocompleteListItem;\n\n public ngAfterViewInit(): void {\n this.setFocus();\n }\n\n public reset(): void {\n this.value = undefined;\n this.autocompleteHidden = true;\n this.searchInputElement.nativeElement.blur();\n this.changeDetectorRef.detectChanges();\n }\n\n public clickOutside(): void {\n this.autocompleteHidden = true;\n }\n\n public setFocus(): void {\n if (this.focus) {\n setTimeout(() => {\n this.searchInputElement.nativeElement.focus();\n this.changeDetectorRef.detectChanges();\n });\n }\n }\n\n public isSelected(autocompleteListItem: SearchBoxAutocompleteListItem): boolean {\n return this.selectedAutocompleteListItem === autocompleteListItem;\n }\n\n public searchKeypress(event: KeyboardEvent): void {\n switch (event.key) {\n case \"ArrowDown\": {\n this.setSelectedAutocompleteItem(true);\n break;\n }\n case \"ArrowUp\": {\n this.setSelectedAutocompleteItem(false);\n break;\n }\n case \"Escape\": {\n this.autocompleteHidden = true;\n this.selectedAutocompleteListItem = undefined;\n break;\n }\n case \"Tab\": {\n return;\n }\n case \"Enter\": {\n this.search();\n break;\n }\n default: {\n this.autocompleteHidden = false;\n this.queryChange.emit(this.value);\n }\n }\n\n event.preventDefault();\n }\n\n private setSelectedAutocompleteItem(down: boolean) {\n let newIndex: number;\n\n if (this.selectedAutocompleteListItem) {\n newIndex = this.autocompleteList.indexOf(this.selectedAutocompleteListItem) + (down ? 1 : -1);\n } else {\n newIndex = 0;\n }\n\n if (newIndex >= this.autocompleteList.length) {\n newIndex = 0;\n } else if (newIndex < 0) {\n newIndex = this.autocompleteList.length - 1;\n }\n\n this.selectedAutocompleteListItem = this.autocompleteList[newIndex];\n this.value = this.selectedAutocompleteListItem.text;\n }\n\n public autoCompleteSearch(autocompleteListItem: SearchBoxAutocompleteListItem): void {\n this.autocompleteHidden = true;\n this.triggerSearch.emit(autocompleteListItem.text);\n }\n\n public search(): void {\n this.autocompleteHidden = true;\n this.triggerSearch.emit(this.value);\n }\n\n public clickSearch(event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n this.search();\n }\n}\n","
\n \n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, Component, Input } from \"@angular/core\";\nimport { TranslocoService } from \"@ngneat/transloco\";\n\nimport { SelectionListItem } from \"../../models/selection-list-item.model\";\nimport { BaseControlValueAccessor, MakeValueAccessorProvider } from \"../base-control-value-accessor.component\";\n\nexport interface SelectItem {\n extraLabelText: string;\n isDisabled: boolean;\n text: string;\n value: string | number | boolean;\n}\n\n@Component({\n selector: \"ha-select\",\n templateUrl: \"./select.component.html\",\n styleUrls: [\"./select.component.scss\"],\n providers: [MakeValueAccessorProvider(SelectComponent)],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SelectComponent extends BaseControlValueAccessor {\n @Input()\n public label: string;\n\n @Input()\n public set options(value: SelectionListItem[] | null) {\n this.listItems = this.genereateListItems(value);\n }\n\n @Input()\n public sortWhenTranslated: boolean;\n\n public listItems: SelectItem[];\n\n public expanded = false;\n\n public get isUnselected() {\n return this.value === undefined && this.listItems[0]?.value !== undefined;\n }\n\n public genereateListItems(options: SelectionListItem[] | null): SelectItem[] {\n const translocoService = this.injector.get(TranslocoService);\n\n const listItems = options?.filter(x => !x.isDisabled).map((item) => {\n return {\n extraLabelText: item.extraLabelLangKey != null\n ? translocoService.translate(item.extraLabelLangKey)\n : item.extraLabelText,\n isDisabled: item.isDisabled,\n text: item.langKey != null ? translocoService.translate(item.langKey) : item.text,\n value: item.value,\n };\n });\n\n return this.sortWhenTranslated\n ? listItems?.sort((a, b) => {\n // sort items with undefined or null valus on top as we assume this is the default.\n if (!b.value) {\n return 1;\n }\n\n return (a.text < b.text ? -1 : 1);\n })\n : listItems;\n }\n\n public get text(): string {\n return this.listItems?.find((_) => _.value === this.value)?.text;\n }\n\n public get extraLabelText(): string {\n return this.listItems?.find((_) => _.value == this.value)?.extraLabelText;\n }\n\n public toggleExpand(): void {\n this.expanded = !this.expanded;\n }\n\n public selectOption(option: SelectItem): void {\n this.value = option.value as string;\n }\n\n public close(): void {\n this.expanded = false;\n }\n\n private open(): void {\n this.expanded = true;\n }\n}\n","
\n \n\n
\n {{ translateError(error) }}\n
\n\n \n
\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Input, OnChanges } from \"@angular/core\";\nimport { UntypedFormGroup } from \"@angular/forms\";\nimport { Translation, TranslocoService } from \"@ngneat/transloco\";\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\n\nimport { ValidationFailure, ValidationResult } from \"../../models/validation.model\";\nimport { ValidationService } from \"./validation.service\";\n\n/**\n * Displays validation messages for backend validation\n * Automatically translation validation messages with some predefined rules.\n * 1. First read.validation.propertyName.errorCode is read. I.e. userEdit.validation.firstName.notEmptyValidator\n * 2. If #1 has no translation general validation messages is read from validation.errorCode. I.e. validation.notEmptyValidator\n *\n * @export\n * @class ValidationMessagesComponent\n */\n@UntilDestroy()\n@Component({\n selector: \"validation-messages\",\n templateUrl: \"./validation-messages.component.html\",\n styleUrls: [\"./validation-messages.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ValidationMessagesComponent implements OnChanges {\n /**\n * Form group\n *\n * @type {UntypedFormGroup}\n * @memberof ValidationMessagesComponent\n */\n @Input() public form: UntypedFormGroup;\n\n /**\n * Translation group\n * If array they will be evaluated in order\n *\n * @type {(string | string[])}\n * @memberof ValidationMessagesComponent\n */\n @Input() public read: string | string[];\n\n /**\n * Validation result from backend\n *\n * @type {ValidationResult}\n * @memberof ValidationMessagesComponent\n */\n @Input() public validationResult!: ValidationResult;\n\n /**\n * Custom supplied validation text function provided by component using validation messages\n *\n * @memberof ValidationMessagesComponent\n */\n @Input() public translationCallback: (translation: string) => string;\n\n public errorIndex = 0;\n\n private allTranslations: Translation = this.translocoService\n .getTranslation()\n .get(this.translocoService.getActiveLang());\n\n constructor(\n private translocoService: TranslocoService,\n private el: ElementRef,\n private validationService: ValidationService,\n private changeDetectorRefef: ChangeDetectorRef,\n ) { }\n\n public ngOnChanges(): void {\n if (this.validationResult && !this.validationResult.isValid) {\n this.validationResult.errors.forEach((error) => {\n const control = this.form.get(this.camelCaseAllParts(error.propertyName));\n if (control) {\n control.setErrors({ incorrect: true });\n control.markAsTouched();\n }\n });\n\n this.focusInput();\n }\n\n // Find and set index of currently focussed control\n this.validationService.currentControl$.pipe(untilDestroyed(this)).subscribe((control) => {\n if (control && control.invalid && this.validationResult) {\n const parentControlName = this.validationService.getControlName(control.parent);\n const controlName = this.validationService.getControlName(control);\n const longControlName = `${parentControlName}.${controlName}`;\n\n this.errorIndex = this.validationResult.errors\n .map((_) => this.camelCaseAllParts(_.propertyName))\n .findIndex((_) => _ === controlName || _ === longControlName);\n\n this.changeDetectorRefef.markForCheck();\n }\n });\n }\n\n public get canChangeError(): boolean {\n return this.validationResult.errors.length > 1;\n }\n\n private get propertyNames(): string[] {\n if (!this.validationResult) {\n return [];\n }\n\n return [...new Set(this.validationResult.errors.map((_) => _.propertyName))];\n }\n\n public get numberOfControlsWithError(): number {\n const length = this.propertyNames.length;\n return length;\n }\n\n public previousError(): void {\n this.errorIndex = this.errorIndex <= 0 ? this.numberOfControlsWithError - 1 : this.errorIndex - 1;\n this.focusInput();\n }\n\n public nextError(): void {\n this.errorIndex = this.errorIndex >= this.numberOfControlsWithError - 1 ? 0 : this.errorIndex + 1;\n this.focusInput();\n }\n\n public translateError(error: ValidationFailure): string {\n let translation: string;\n if (Array.isArray(this.read)) {\n this.read.some((r) => {\n translation = this.translateKey(r, error.errorCode, error.propertyName);\n return !!translation;\n });\n } else {\n translation = this.translateKey(this.read, error.errorCode, error.propertyName);\n }\n\n if (this.translationCallback) {\n translation = this.translationCallback(translation);\n }\n\n return translation;\n }\n\n private translateKey(read: string, errorCode: string, propertyName: string) {\n errorCode = this.camelCaseAllParts(errorCode);\n propertyName = this.camelCaseAllParts(propertyName);\n const shortPropertyName = propertyName?.split(\".\").slice(-1)[0]; // i.e. invoiceAddress.recipient > recipient\n\n // If the component have custom validation messages set in lang file.\n // Example { \"user\": { \"validation\": { \"firstName\": { \"notEmptyValidator\": \"Förnamn får inte vara tom\" }}}}\n const validationMessageKey = `${read}.validation.${propertyName ? `${propertyName}.` : \"\"}${errorCode}`;\n const shortValidationMessageKey = `${read}.validation.${shortPropertyName ? `${shortPropertyName}.` : \"\"}${errorCode}`;\n\n let translation: string;\n if (this.allTranslations[validationMessageKey]) {\n translation = this.translocoService.translate(validationMessageKey);\n } else if (this.allTranslations[shortValidationMessageKey]) {\n translation = this.translocoService.translate(shortValidationMessageKey);\n } else {\n // If not use global validation messages from { \"validation\": { ... }}\n\n // Translate property name first, ie. firstName > \"Förnamn\"\n const propertyNameTranslation = this.translatePropertyName(read, propertyName, shortPropertyName);\n\n // Translate full validation message using the translated property\n // Example: propertyNameTranslation = \"Förnamn\".\n // Translation \"validation.invalid\" = \"{{propertyName}} har ett felaktigt värde.\". Will result in \"Förnamn har ett felaktigt värde.\"\n translation = this.translocoService.translate(`validation.${errorCode}`, {\n propertyName: propertyNameTranslation,\n });\n }\n\n return translation;\n }\n\n private translatePropertyName(read: string, propertyName: string, shortPropertyName: string): string\n {\n let propertyNameTranslation: string;\n\n const readKey = `${read}.${propertyName}`;\n const shortReadKey = `${read}.${shortPropertyName}`;\n const globalKey = propertyName;\n const shortGlobalKey = shortPropertyName;\n\n if (!propertyName) {\n propertyNameTranslation = \"\";\n } else if (this.allTranslations[readKey]) {\n // Try with full propertyName first\n propertyNameTranslation = this.translocoService.translate(readKey);\n } else if (this.allTranslations[shortReadKey]) {\n // Then the short one\n propertyNameTranslation = this.translocoService.translate(shortReadKey);\n } else if (this.allTranslations[globalKey]) {\n // Use the global key not prefixed with read and without propertyNAme\n propertyNameTranslation = this.translocoService.translate(globalKey);\n } else if (this.allTranslations[shortGlobalKey]) {\n // Use the global key not prefixed with read and without propertyNAme\n propertyNameTranslation = this.translocoService.translate(shortGlobalKey);\n } else {\n propertyNameTranslation = \"\";\n }\n\n return propertyNameTranslation;\n }\n\n private focusInput() {\n if (this.errorIndex > this.numberOfControlsWithError) {\n return;\n }\n\n const propertyName = this.camelCaseAllParts(this.propertyNames[this.errorIndex]);\n let invalidControl = this.el.nativeElement.parentElement.querySelector(`[formcontrolname=\"${propertyName}\"] input`);\n\n // if invalidControl is not found we need to search deeper. This happens for example if you have nesled formgroups. ie. Address\n if (!invalidControl) {\n const parts = propertyName.split(\".\");\n const selector = `#${parts[0]} [formcontrolname=\"${parts[1]}\"] input`;\n invalidControl = this.el.nativeElement.parentElement.querySelector(selector);\n }\n\n invalidControl?.focus();\n }\n\n private camelCaseAllParts(text: string): string {\n return text\n ?.split(\".\")\n .map((part) => part.toCamelCase())\n .join(\".\");\n }\n}\n","import \"@ha/util/common\";\n\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\nimport { MatNativeDateModule } from \"@angular/material/core\";\nimport { MatDatepickerModule } from \"@angular/material/datepicker\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\n\nimport { CheckboxComponent } from \"./components/checkbox/checkbox.component\";\nimport { InputRadioGroupComponent } from \"./components/input-radio-group/input-radio-group.component\";\nimport { InputComponent } from \"./components/input/input.component\";\nimport { SearchBoxComponent } from \"./components/search-box/search-box.component\";\nimport { SelectComponent } from \"./components/select/select.component\";\nimport { ValidationMessagesComponent } from \"./components/validation-messages/validation-messages.component\";\n\nexport { CheckboxComponent } from \"./components/checkbox/checkbox.component\";\nexport { InputComponent } from \"./components/input/input.component\";\nexport { InputRadioGroupComponent } from \"./components/input-radio-group/input-radio-group.component\";\nexport { SearchBoxComponent } from \"./components/search-box/search-box.component\";\nexport { SelectComponent } from \"./components/select/select.component\";\nexport { ValidationMessagesComponent } from \"./components/validation-messages/validation-messages.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n TranslocoModule,\n MatDatepickerModule,\n MatNativeDateModule,\n ],\n declarations: [\n CheckboxComponent,\n InputRadioGroupComponent,\n InputComponent,\n SearchBoxComponent,\n SelectComponent,\n ValidationMessagesComponent,\n ],\n exports: [\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n CheckboxComponent,\n InputRadioGroupComponent,\n InputComponent,\n SelectComponent,\n SearchBoxComponent,\n ValidationMessagesComponent,\n ],\n})\nexport class HaUiFormsModule { }\n","import { BaseResult } from \"@ha/data/basic\";\n\nexport interface BaseValidationResult extends BaseResult {\n validationResult: ValidationResult;\n}\n\nexport interface ValidationResult {\n isValid: boolean;\n errors: ValidationFailure[];\n ruleSetsExecuted: string[];\n}\n\nexport interface ValidationFailure {\n propertyName: string;\n errorMessage: string;\n attemptedValue: unknown;\n customState: unknown;\n severity: Severity;\n errorCode: string;\n formattedMessageArguments: unknown[];\n formattedMessagePlaceholderValues: { [key: string]: unknown };\n}\n\nexport enum Severity {\n Error = 0,\n Warning = 1,\n Info = 2,\n}\n","import { Breadcrumb } from \"../models/breadcrumb.model\";\n\nexport namespace BreadcrumbActions {\n export class Set {\n public static readonly type = \"[Breadcrumb] Set\";\n constructor(public breadcrumbs: Breadcrumb[] | undefined) {}\n }\n\n export class SetTextOrLangKey {\n public static readonly type = \"[Breadcrumb] SetTextOrLangKey\";\n constructor(public names: { langKey?: string, text?: string; }[]) {}\n }\n}\n","import { ActivatedRoute } from \"@angular/router\";\n\nimport { Breadcrumb } from \"../../models/breadcrumb.model\";\n\nexport function createBreadcrumbs(route: ActivatedRoute, url: string = \"\", breadcrumbs: Breadcrumb[] = []): Breadcrumb[] | undefined {\n const children: ActivatedRoute[] = route.children;\n\n if (children.length === 0) {\n return breadcrumbs;\n }\n\n for (const child of children) {\n if (child.snapshot.url.map((segment) => segment.path).length === 0) {\n return createBreadcrumbs(child, url, breadcrumbs);\n }\n\n const routeURL: string = child.snapshot.url.map((segment) => segment.path).join(\"/\");\n if (routeURL !== \"\") {\n url += `/${routeURL}`;\n }\n\n const name = child.snapshot.data[\"title\"] as string;\n if (name) {\n breadcrumbs.push({ langKey: name, url, hasDetailsLink: true });\n }\n\n return createBreadcrumbs(child, url, breadcrumbs);\n }\n\n return undefined;\n}\n","import { Injectable } from \"@angular/core\";\nimport { Title } from \"@angular/platform-browser\";\nimport { NavigationEnd, Router } from \"@angular/router\";\nimport { TranslocoService } from \"@ngneat/transloco\";\nimport { Action, NgxsOnInit, State, StateContext } from \"@ngxs/store\";\nimport { produce } from \"immer\";\nimport { combineLatest, Observable, of } from \"rxjs\";\nimport { filter, map, mergeAll, take, tap, toArray } from \"rxjs/operators\";\n\nimport { createBreadcrumbs } from \"../components/breadcrumbs/create-breadcrumb\";\nimport { Breadcrumb } from \"../models/breadcrumb.model\";\nimport { BreadcrumbActions } from \"./breadcrumb.actions\";\n\nexport interface BreadcrumbStateModel {\n breadcrumbs: Breadcrumb[];\n}\n\n@Injectable() @State({ name: \"breadcrumb\" })\nexport class BreadcrumbState implements NgxsOnInit {\n constructor(private router: Router, private titleService: Title, private translocoService: TranslocoService) {}\n\n public ngxsOnInit(ctx: StateContext): void {\n combineLatest([\n this.router.events.pipe(filter((event) => event instanceof NavigationEnd)),\n this.translocoService.events$.pipe(filter((_) => !!_)),\n ]).subscribe(() => {\n let route = this.router.routerState.root;\n while (route.firstChild) {\n if (route.snapshot.data[\"autoBreadcrumbsDisabled\"]) {\n return;\n }\n\n route = route.firstChild;\n }\n\n ctx.dispatch(new BreadcrumbActions.Set(this.createBreadCrumbs()));\n });\n }\n\n @Action(BreadcrumbActions.Set)\n public set(ctx: StateContext, action: BreadcrumbActions.Set) {\n return this.translateBreadcrumbs(action.breadcrumbs).pipe(\n take(1),\n tap((breadcrumbs) => {\n ctx.setState({\n breadcrumbs: breadcrumbs ?? [],\n });\n\n this.prepareBrowerTitle(breadcrumbs);\n }),\n );\n }\n\n /**\n * Set the text or langKey of current breadcrumbs.\n *\n * @param {StateContext} ctx\n * @param {BreadcrumbActions.SetTextOrLangKey} action\n * @memberof BreadcrumbState\n */\n @Action(BreadcrumbActions.SetTextOrLangKey)\n public setTextOrLangKey(\n ctx: StateContext,\n action: BreadcrumbActions.SetTextOrLangKey,\n ): Observable {\n return this.translateBreadcrumbs(this.createBreadCrumbs()).pipe(\n take(1),\n tap((breadcrumbs) => {\n ctx.setState({\n breadcrumbs: breadcrumbs ?? [],\n });\n\n ctx.setState(produce(ctx.getState(), (draft) => {\n action.names.reverse().forEach((_, i) => {\n if (!draft.breadcrumbs[draft.breadcrumbs.length - i - 1]) {\n return;\n }\n\n draft.breadcrumbs[draft.breadcrumbs.length - i - 1].langKey = undefined;\n\n if (_.langKey) {\n draft.breadcrumbs[draft.breadcrumbs.length - i - 1].text = this.translocoService.translate<\n string\n >(_.langKey);\n } else if (_.text) {\n draft.breadcrumbs[draft.breadcrumbs.length - i - 1].text = _.text;\n }\n });\n }));\n\n this.prepareBrowerTitle(ctx.getState().breadcrumbs);\n }),\n );\n }\n\n private prepareBrowerTitle(breadcrumbs: Breadcrumb[] | undefined): void {\n if (!breadcrumbs) {\n return;\n }\n\n const breadcrumb = breadcrumbs[breadcrumbs.length - 1];\n\n if (breadcrumb.langKey) {\n this.translocoService.selectTranslate(breadcrumb.langKey).pipe(take(1)).subscribe((translation: string) => {\n this.setBrowserTitle(translation.replace(/<.*?>/g, \"\"), breadcrumb.url !== \"\");\n });\n } else if (breadcrumb.text) {\n this.setBrowserTitle(breadcrumb.text.replace(/<.*?>/g, \"\"), breadcrumb.url !== \"\");\n }\n }\n\n private setBrowserTitle(title: string, includeAppTitle: boolean = true) {\n if (includeAppTitle) {\n this.translocoService.selectTranslate(\"appName\").pipe(take(1)).subscribe((translation: string) => {\n this.titleService.setTitle(`${title} – ${translation.replace(/<.*?>/g, \"\")}`);\n });\n } else {\n this.titleService.setTitle(title);\n }\n }\n\n private createBreadCrumbs() {\n const breadcrumbs = createBreadcrumbs(this.router.routerState.root);\n\n if (breadcrumbs?.length === 0) {\n breadcrumbs.push({ langKey: \"appName\", url: \"\", text: \"\", hasDetailsLink: true, });\n }\n\n return breadcrumbs ?? [];\n }\n\n private translateBreadcrumbs(breadcrumbs: Breadcrumb[] | undefined): Observable {\n if (!breadcrumbs) {\n return of([]);\n }\n\n return combineLatest(breadcrumbs.map((_) => this.translocoService.selectTranslate(_.langKey ?? \"\")))\n .pipe(\n take(1),\n mergeAll(),\n map((_) => (_ === \"\" ? undefined : _)),\n map((translation, i) => ( {\n url: breadcrumbs[i].url,\n text: translation ?? breadcrumbs[i].text,\n translationData: breadcrumbs[i].translationData,\n highlighted: breadcrumbs[i].highlighted,\n hasDetailsLink: breadcrumbs[i].hasDetailsLink,\n })),\n toArray(),\n );\n }\n}\n","export namespace SidebarActions {\n export class TogglePersonalPanelExpanded {\n public static readonly type = \"[Sidebar] TogglePersonalPanelExpanded\";\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Action, Selector, State, StateContext } from \"@ngxs/store\";\n\nimport { SidebarActions } from \"./sidebar.actions\";\n\nexport interface SidebarStateModel {\n personalPanelExpanded: boolean;\n}\n\n@Injectable()\n@State({\n name: \"sidebar\",\n defaults: {\n personalPanelExpanded: false,\n },\n})\nexport class SidebarState {\n @Selector()\n public static personalPanelExpanded(state: SidebarStateModel): boolean {\n return state.personalPanelExpanded;\n }\n\n @Action(SidebarActions.TogglePersonalPanelExpanded)\n public TogglePersonalPanelExpanded(ctx: StateContext): void {\n ctx.patchState({ personalPanelExpanded: !ctx.getState().personalPanelExpanded });\n }\n}\n","export namespace AccountImpersonateActions {\n export class ImpersonateStart {\n public static readonly type = \"[AccountImpersonate] ImpersonateStart\";\n constructor(public identityUserId: string) {}\n }\n\n export class ImpersonateStop {\n public static readonly type = \"[AccountImpersonate] ImpersonateStop\";\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport { AccountImpersonateCommand } from \"../models/account-impersonate-command.model\";\nimport { AccountImpersonateResult } from \"../models/account-impersonate-result.model\";\n\n@Injectable({\n providedIn: \"root\",\n})\nexport class AccountImpersonateService {\n constructor(private httpClient: HttpClient) {}\n\n public impersonateStart(command: AccountImpersonateCommand): Observable {\n return this.httpClient.post(\"/api/AccountService/ImpersonateStart\", command);\n }\n\n public impersonateStop(): Observable {\n return this.httpClient.get(\"/api/AccountService/ImpersonateStop\");\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Action, State, StateContext } from \"@ngxs/store\";\nimport { Observable, of } from \"rxjs\";\nimport { tap } from \"rxjs/operators\";\n\nimport { AccountImpersonateCommand } from \"../models/account-impersonate-command.model\";\nimport { AccountImpersonateResult } from \"../models/account-impersonate-result.model\";\nimport { AccountImpersonateService } from \"../services/account-impersonate.service\";\nimport { AccountImpersonateActions } from \"./account-impersonate.actions\";\n\nexport interface AccountImpersonateStateModel {\n form: {\n model?: AccountImpersonateCommand;\n dirty: boolean;\n status: string;\n errors: unknown;\n };\n result: AccountImpersonateResult | undefined;\n}\n\nconst defaults: AccountImpersonateStateModel = {\n form: {\n model: undefined,\n dirty: false,\n status: \"\",\n errors: {},\n },\n result: undefined,\n};\n\n@Injectable()\n@State({\n name: \"accountImpersonate\",\n defaults: defaults,\n})\nexport class AccountImpersonateState {\n constructor(private accountImpersonateService: AccountImpersonateService,) {}\n\n @Action(AccountImpersonateActions.ImpersonateStart, { cancelUncompleted: true })\n public impersonateStart(ctx: StateContext, action: AccountImpersonateActions.ImpersonateStart): Observable {\n ctx.patchState({\n result: undefined,\n });\n\n\n if (!action.identityUserId) {\n return of();\n }\n\n const command = {\n ...ctx.getState().form.model,\n identityUserId: action.identityUserId\n };\n\n return this.accountImpersonateService.impersonateStart(command).pipe(tap((result) => {\n if (result.success) {\n ctx.setState(defaults);\n location.href = result.autoSignInRedirect;\n } else {\n ctx.patchState({\n result: result,\n });\n }\n }));\n }\n\n @Action(AccountImpersonateActions.ImpersonateStop, { cancelUncompleted: true })\n public impersonateStop(ctx: StateContext): Observable {\n return this.accountImpersonateService.impersonateStop().pipe(tap((result) => {\n if (result.success) {\n ctx.setState(defaults);\n location.href = result.autoSignInRedirect;\n } else {\n ctx.patchState({\n result: result,\n });\n }\n }));\n }\n}\n","export namespace AuthActions {\n export class SignOut {\n public static readonly type = \"[Auth] SignOut\";\n }\n\n export class GetCurrentAccount {\n public static readonly type = \"[Auth] GetCurrentAccount\";\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport { Account } from \"../models/current-account.model\";\n\n@Injectable({ providedIn: \"root\" })\nexport class CurrentAccountService {\n constructor(private httpClient: HttpClient) {}\n\n public get(): Observable {\n return this.httpClient.get(\"/api/AccountService/GetCurrentAccount\");\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Action, NgxsOnInit, State, StateContext } from \"@ngxs/store\";\nimport { OidcSecurityService } from \"angular-auth-oidc-client\";\nimport { Observable } from \"rxjs\";\nimport { filter, map, take, tap } from \"rxjs/operators\";\n\nimport { Account } from \"../models/current-account.model\";\nimport { CurrentAccountService } from \"../services/current-account.service\";\nimport { AuthActions } from \"./auth.actions\";\n\nexport interface AuthStateModel {\n isAuthenticated: boolean;\n currentAccount?: Account;\n}\n\n@Injectable() @State({ name: \"auth\" })\nexport class AuthState implements NgxsOnInit {\n constructor(\n private oidcSecurityService: OidcSecurityService,\n private currentAccountService: CurrentAccountService,\n ) {}\n\n public ngxsOnInit(ctx: StateContext): void {\n this.oidcSecurityService.isAuthenticated$.pipe(filter((_) => _.isAuthenticated), take(1)).subscribe(() => {\n ctx.dispatch(new AuthActions.GetCurrentAccount());\n\n interface payloadFromIdToken {\n sub: string;\n }\n\n this.oidcSecurityService.getPayloadFromIdToken().subscribe((originalPayload: payloadFromIdToken) => {\n const sub = originalPayload.sub;\n this.oidcSecurityService.forceRefreshSession().subscribe(() => {\n this.oidcSecurityService.getPayloadFromIdToken().subscribe((newPayload: payloadFromIdToken) => {\n const newSub = newPayload.sub;\n\n if (!!newSub && !!sub && sub !== newSub) {\n location.reload();\n }\n });\n });\n });\n });\n\n this.oidcSecurityService.isAuthenticated$.pipe(map((_) => _.isAuthenticated)).subscribe((isAuthenticated) => {\n ctx.patchState({\n isAuthenticated: isAuthenticated,\n });\n });\n }\n\n @Action(AuthActions.SignOut)\n public logout(): void {\n this.oidcSecurityService.logoff().subscribe();\n }\n\n @Action(AuthActions.GetCurrentAccount)\n public getCurrentAccount(ctx: StateContext): Observable {\n return this.currentAccountService.get().pipe(tap((currentAccount) => {\n if (currentAccount) {\n ctx.patchState({\n currentAccount: currentAccount,\n });\n } else {\n ctx.setState({ currentAccount: undefined, isAuthenticated: false });\n }\n }));\n }\n}\n","import \"@ha/util/common\";\n\nimport { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { AccountImpersonateState } from \"./states/account-impersonate.state\";\nimport { AuthState } from \"./states/auth.state\";\n\n@NgModule({\n imports: [\n CommonModule,\n NgxsModule.forFeature([AuthState, AccountImpersonateState]),\n ]\n})\nexport class HaFeatureAuthModule {}\n","import { Selector } from \"@ngxs/store\";\n\nimport { Account } from \"../models/current-account.model\";\nimport { AuthState, AuthStateModel } from \"./auth.state\";\n\nexport class AuthSelectors {\n @Selector([AuthState])\n public static isAuthenticated(state: AuthStateModel): boolean {\n return state && state.isAuthenticated;\n }\n\n @Selector([AuthState])\n public static currentAccount(state: AuthStateModel): Account | undefined {\n return state?.currentAccount;\n }\n}\n","import { Selector } from \"@ngxs/store\";\n\nimport { AccountImpersonateResult } from \"../models/account-impersonate-result.model\";\nimport { AccountImpersonateState, AccountImpersonateStateModel } from \"./account-impersonate.state\";\n\nexport class AccountImpersonateSelectors {\n @Selector([AccountImpersonateState])\n public static result(state: AccountImpersonateStateModel): AccountImpersonateResult | undefined {\n return state.result;\n }\n}\n","import { Selector } from \"@ngxs/store\";\n\nimport { Account, AccountUser } from \"../models/current-account.model\";\nimport { AuthState, AuthStateModel } from \"./auth.state\";\n\nexport class CurrentAccountSelectors {\n @Selector([AuthState])\n public static currentAccount(state: AuthStateModel): Account | undefined {\n return state?.currentAccount;\n }\n\n @Selector([CurrentAccountSelectors.currentAccount])\n public static isAdministrator(account: Account | undefined): boolean | undefined {\n return account?.isAdministrator;\n }\n\n @Selector([CurrentAccountSelectors.currentAccount])\n public static isSuperman(account: Account | undefined): boolean | undefined {\n return account?.isSuperman;\n }\n\n @Selector([CurrentAccountSelectors.currentAccount])\n public static isAdministratorOrImpersonated(account: Account | undefined): boolean | undefined {\n if (account === undefined) {\n return undefined;\n }\n\n return account && (account.isAdministrator || account.isImpersonated);\n }\n\n @Selector([CurrentAccountSelectors.currentAccount])\n public static currentAccountUser(account: Account | undefined): AccountUser | undefined {\n return account?.user;\n }\n\n @Selector([CurrentAccountSelectors.currentAccount])\n public static currentAccountRealUser(account: Account | undefined): AccountUser | undefined {\n return account?.realUser;\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from \"@angular/router\";\nimport { Store } from \"@ngxs/store\";\nimport { filter, map, Observable } from \"rxjs\";\n\nimport { CurrentAccountSelectors } from \"../states/current-account.selectors\";\n\n@Injectable({ providedIn: \"root\" })\nexport class IsAdministratorGuard implements CanActivate {\n constructor(private store: Store) {}\n\n public canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\n return this.store.select(CurrentAccountSelectors.isAdministrator)\n .pipe(\n // We can't let observable emit undefined because then it will resolve on first value.\n // We have to wait for selector to get an actual account from backend and resolve to either true or false\n filter(_ => _ !== undefined),\n map(_ => !!_)\n );\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { ActivatedRouteSnapshot, CanActivate, RouterStateSnapshot } from \"@angular/router\";\nimport { Store } from \"@ngxs/store\";\nimport { filter, map, Observable } from \"rxjs\";\n\nimport { CurrentAccountSelectors } from \"../states/current-account.selectors\";\n\n@Injectable({ providedIn: \"root\" })\nexport class IsAdministratorOrImpersonatedGuard implements CanActivate {\n constructor(private store: Store) {}\n\n public canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable {\n return this.store.select(CurrentAccountSelectors.isAdministratorOrImpersonated)\n .pipe(\n // We can't let observable emit undefined because then it will resolve on first value.\n // We have to wait for selector to get an actual account from backend and resolve to either true or false\n filter(_ => _ !== undefined),\n map(_ => !!_)\n );\n }\n}\n","\n
\n
\n\n
\n \n \n
\n
\n
\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { BaseModalComponent } from \"@ha/ui/common\";\nimport { UntilDestroy } from \"@ngneat/until-destroy\";\n\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface PwaUpdateAvailableModalComponentData {\n}\n\n@UntilDestroy()\n@Component({\n templateUrl: \"./pwa-update-available-modal.component.html\",\n styleUrls: [\"./pwa-update-available-modal.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PwaUpdateAvailableModalComponent extends BaseModalComponent {\n public override data: PwaUpdateAvailableModalComponentData;\n\n public update(): void {\n location.reload();\n }\n\n public cancel(): void {\n this.closeModal();\n }\n}\n\n","export namespace PwaActions {\n export class InstallDismiss {\n public static readonly type = \"[Pwa] InstallDismiss\";\n }\n\n export class InstallGoTo {\n public static readonly type = \"[Pwa] InstallGoTo\";\n }\n\n export class SetUpdateAvailable {\n public static readonly type = \"[Pwa] UpdateAvailable\";\n }\n\n export class OpenModalIfUpdateAvailable {\n public static readonly type = \"[Pwa] OpenModalIfUpdateAvailable\";\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { ApplicationRef, Injectable } from \"@angular/core\";\nimport { SwUpdate, VersionReadyEvent } from \"@angular/service-worker\";\nimport { Network } from \"@ngx-pwa/offline\";\nimport { Store } from \"@ngxs/store\";\nimport { DeviceDetectorService } from \"ngx-device-detector\";\nimport { concat, interval } from \"rxjs\";\nimport { first, take, filter } from \"rxjs/operators\";\n\nimport { BeforeInstallPromptEvent } from \"../models/before-install-prompt-event\";\nimport { PwaActions } from \"../states/pwa.actions\";\n\n@Injectable({ providedIn: \"root\" })\nexport class PwaService {\n public static deferredPrompt?: BeforeInstallPromptEvent;\n\n private periodicUpgradeCheck = false;\n\n public get isRunningAsPwa(): boolean {\n return [\"fullscreen\", \"standalone\", \"minimal-ui\"].some((displayMode) => window.matchMedia(\"(display-mode: \" + displayMode + \")\").matches,);\n }\n\n public get isDesktop(): boolean {\n return this.deviceService.isDesktop();\n }\n\n public get isMobile(): boolean {\n return this.deviceService.isMobile();\n }\n\n public get isIos(): boolean {\n return this.deviceService.os === \"iOS\" || this.deviceService.os === \"Mac\";\n }\n\n public get isAndroid(): boolean {\n return this.deviceService.os === \"Android\";\n }\n\n public get isSafari(): boolean {\n return this.deviceService.browser === \"Safari\";\n }\n\n public get isChrome(): boolean {\n return this.deviceService.browser === \"Chrome\";\n }\n\n constructor(\n private app: ApplicationRef,\n private swUpdate: SwUpdate,\n private network: Network,\n private deviceService: DeviceDetectorService,\n private store: Store,\n private httpClient: HttpClient,\n ) {}\n\n public init(trackAppStarted: boolean): void {\n // Always check for updates on startup\n console.log(\"PWA: Initial update check..\");\n this.pwaCheckForUpdate();\n\n // Check for PWA updates every minute\n interval(1 * 1 * 60 * 1000).subscribe(() => {\n console.log(\"PWA: Periodic update check..\");\n this.periodicUpgradeCheck = true;\n this.pwaCheckForUpdate();\n });\n\n // When PWA have been updated\n this.swUpdate.versionUpdates\n .pipe(filter((evt): evt is VersionReadyEvent => evt.type === 'VERSION_READY'))\n .subscribe(() => {\n if (this.network.online) {\n void this.swUpdate.activateUpdate().then((success) => {\n if (success) {\n // Initial\n console.log(\"PWA: New version is ready - please update\");\n if (!this.periodicUpgradeCheck) {\n window.location.reload();\n } else {\n this.store.dispatch(new PwaActions.OpenModalIfUpdateAvailable());\n this.store.dispatch(new PwaActions.SetUpdateAvailable());\n }\n }\n });\n }\n });\n\n window.addEventListener(\"beforeinstallprompt\", function (beforeInstallPromptEvent) {\n // Prevent the mini-infobar from appearing on mobile\n beforeInstallPromptEvent.preventDefault();\n\n // Stash the event so it can be triggered later.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n PwaService.deferredPrompt = beforeInstallPromptEvent as BeforeInstallPromptEvent;\n });\n\n\n\n if (trackAppStarted) {\n // Track app install to backend\n window.addEventListener(\"appinstalled\", () => {\n this.httpClient\n .post(\"/api/pwa/AppInstalled\", { userAgent: JSON.stringify(this.deviceService.getDeviceInfo()) })\n .subscribe(() => {\n location.href = \"/\";\n });\n });\n\n // Track application starts to backend\n interval(3000)\n .pipe(take(1))\n .subscribe(() => {\n if (this.network.online) {\n this.httpClient\n .post(\"/api/pwa/AppStarted\", {\n pwa: this.isRunningAsPwa,\n userAgent: JSON.stringify(this.deviceService.getDeviceInfo()),\n })\n .subscribe();\n }\n });\n }\n }\n\n public addToHomeScreen(): void {\n if (!PwaService.deferredPrompt) {\n return;\n }\n\n }\n\n private pwaCheckForUpdate(): void {\n void this.swUpdate.checkForUpdate();\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { AuthSelectors } from \"@ha/feature/auth\";\nimport { HaModalService } from \"@ha/ui/common\";\nimport { Network } from \"@ngx-pwa/offline\";\nimport { Action, NgxsOnInit, Selector, State, StateContext } from \"@ngxs/store\";\n\nimport {\n PwaUpdateAvailableModalComponent,\n} from \"../components/pwa-update-available-modal/pwa-update-available-modal.component\";\nimport { PwaService } from \"./../services/pwa.service\";\nimport { PwaActions } from \"./pwa.actions\";\n\nexport interface PwaStateModel {\n updateAvailable: boolean;\n isOnline: boolean;\n showInstallModal: boolean;\n installDismissDate: Date;\n isOnInstallPage: boolean;\n isRunningAsPwa: boolean;\n isDesktop: boolean;\n isMobile: boolean;\n}\n\n@Injectable()\n@State({ name: \"pwa\" })\nexport class PwaState implements NgxsOnInit {\n constructor(private network: Network, private pwaService: PwaService, private modalService: HaModalService) {}\n\n @Selector()\n public static isOnline(state: PwaStateModel) {\n return state.isOnline;\n }\n\n @Selector()\n public static isOffline(state: PwaStateModel) {\n return !state.isOnline;\n }\n\n @Selector()\n public static isRunningAsPwa(state: PwaStateModel) {\n return state.isRunningAsPwa;\n }\n\n @Selector()\n public static isDesktop(state: PwaStateModel) {\n return state.isDesktop;\n }\n\n @Selector()\n public static isMobile(state: PwaStateModel) {\n return state.isMobile;\n }\n\n @Selector([PwaState, AuthSelectors.isAuthenticated])\n public static showInstallModal(pwaState: PwaStateModel, isAuthenticated: boolean) {\n if (!isAuthenticated) {\n return false;\n }\n\n if (pwaState.isRunningAsPwa || pwaState.isDesktop) {\n return false;\n }\n\n if (pwaState.installDismissDate) {\n const diffTime = new Date().getTime() - new Date(pwaState.installDismissDate).getTime();\n const diffDays = diffTime / (1000 * 3600 * 24);\n const showModalAgain = diffDays > 7;\n\n return showModalAgain && pwaState.showInstallModal;\n }\n\n if (pwaState.isOnInstallPage) {\n return false;\n }\n\n return pwaState.showInstallModal;\n }\n\n public ngxsOnInit(ctx: StateContext) {\n this.network.onlineChanges.subscribe((isOnline) => {\n ctx.patchState({\n isOnline: isOnline,\n });\n });\n\n ctx.patchState({\n isRunningAsPwa: this.pwaService.isRunningAsPwa,\n isDesktop: this.pwaService.isDesktop,\n isMobile: this.pwaService.isMobile,\n });\n }\n\n @Action(PwaActions.InstallGoTo)\n public installGoTo(ctx: StateContext) {\n ctx.patchState({\n showInstallModal: false,\n });\n }\n\n @Action(PwaActions.InstallDismiss)\n public installDismiss(ctx: StateContext) {\n ctx.patchState({\n installDismissDate: new Date(),\n });\n }\n\n @Action(PwaActions.SetUpdateAvailable)\n public updateAvailable(ctx: StateContext) {\n ctx.patchState({\n updateAvailable: true,\n });\n\n ctx.dispatch(new PwaActions.OpenModalIfUpdateAvailable());\n }\n\n @Action(PwaActions.OpenModalIfUpdateAvailable)\n public openModalIfUpdateAvailable(ctx: StateContext) {\n if (ctx.getState().updateAvailable) {\n this.modalService.open(PwaUpdateAvailableModalComponent, false, undefined);\n }\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { HaUiCommonModule } from \"@ha/ui/common\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport {\n PwaUpdateAvailableModalComponent,\n} from \"./components/pwa-update-available-modal/pwa-update-available-modal.component\";\nimport { PwaState } from \"./states/pwa.state\";\n\n@NgModule({\n imports: [\n CommonModule,\n HaUiCommonModule,\n TranslocoModule,\n NgxsModule.forFeature([PwaState]),\n ],\n declarations: [\n PwaUpdateAvailableModalComponent\n ]\n})\nexport class HaUtilPwaModule {}\n","
\n \n\n \n\n
\n \n
\n
\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { PwaState } from \"@ha/util/pwa\";\nimport { Select } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\n\nimport { SidebarState } from \"../../states/sidebar.state\";\n\n@Component({\n selector: \"ha-sidebar\",\n templateUrl: \"./sidebar.component.html\",\n styleUrls: [\"./sidebar.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent {\n @Select(SidebarState.personalPanelExpanded)\n public personalPanelExpanded$!: Observable;\n\n @Select(PwaState.isMobile)\n public isMobile$!: Observable;\n}\n","
\n
\n
{{ language }}
\n
\n
\n","import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from \"@angular/core\";\n\n@Component({\n selector: \"ui-language\",\n templateUrl: \"./ui-language-selector.component.html\",\n styleUrls: [\"./ui-language-selector.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class UiLanguageSelectorComponent {\n @Input() public currentLanguage!: string;\n @Input() public languages!: string[];\n @Input() public horizontal!: boolean;\n @Input() public lightBackground!: boolean;\n\n @Output() public languageChanged = new EventEmitter();\n\n public setLanguage(languageCode: string): void {\n this.languageChanged.emit(languageCode);\n }\n}\n","\n
\n
\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { Account, AccountImpersonateActions, AuthSelectors } from \"@ha/feature/auth\";\nimport { Select, Store } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\n\n@Component({\n selector: \"ha-impersonated-information-panel\",\n templateUrl: \"./impersonated-information-panel.component.html\",\n styleUrls: [\"./impersonated-information-panel.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ImpersonatedInformationPanelComponent {\n @Select(AuthSelectors.currentAccount)\n public currentAccount$: Observable;\n\n constructor(private store: Store) {\n\n }\n\n public impersonateStop() {\n this.store.dispatch(new AccountImpersonateActions.ImpersonateStop());\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { HaUiCommonModule } from \"@ha/ui/common\";\nimport { HaUiFormsModule } from \"@ha/ui/forms\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { ApplicationListModalComponent } from \"./components/application-list-modal/application-list-modal.component\";\nimport { BreadcrumbsComponent } from \"./components/breadcrumbs/breadcrumbs.component\";\nimport {\n ImpersonatedInformationPanelComponent,\n} from \"./components/impersonated-information-panel/impersonated-information-panel.component\";\nimport { SidebarComponent } from \"./components/sidebar/sidebar.component\";\nimport { UiLanguageSelectorComponent } from \"./components/ui-language-selector/ui-language-selector.component\";\nimport { BreadcrumbState } from \"./states/breadcrumb.state\";\nimport { SidebarState } from \"./states/sidebar.state\";\n\nexport { SidebarComponent } from \"./components/sidebar/sidebar.component\";\nexport { UiLanguageSelectorComponent } from \"./components/ui-language-selector/ui-language-selector.component\";\nexport { SidebarState } from \"./states/sidebar.state\";\nexport {\n ImpersonatedInformationPanelComponent,\n} from \"./components/impersonated-information-panel/impersonated-information-panel.component\";\n\n@NgModule({\n imports: [\n CommonModule,\n TranslocoModule,\n RouterModule,\n NgxsModule.forFeature([BreadcrumbState, SidebarState]),\n HaUiFormsModule,\n HaUiCommonModule,\n ],\n declarations: [\n BreadcrumbsComponent,\n SidebarComponent,\n UiLanguageSelectorComponent,\n ApplicationListModalComponent,\n ImpersonatedInformationPanelComponent\n ],\n exports: [\n BreadcrumbsComponent,\n SidebarComponent,\n UiLanguageSelectorComponent,\n ImpersonatedInformationPanelComponent\n ],\n providers: []\n})\nexport class HaUiNavigationModule {}\n","import { Selector } from \"@ngxs/store\";\n\nimport { BreadcrumbLink } from \"../models/breadcrumb-link.model\";\nimport { BreadcrumbState, BreadcrumbStateModel } from \"./breadcrumb.state\";\n\nexport class BreadcrumbSelectors {\n @Selector([BreadcrumbState])\n public static breadcrumbs(state: BreadcrumbStateModel): BreadcrumbLink[] {\n return state.breadcrumbs?.map(_ => { text: _.text, url: _.url, highlighted: _.highlighted, hasDetailsLink: _.hasDetailsLink });\n }\n\n @Selector([BreadcrumbSelectors.breadcrumbs])\n public static previousBreadcrumb(breadcrumbs: BreadcrumbLink[]): BreadcrumbLink | undefined {\n if (breadcrumbs?.length > 0) {\n return breadcrumbs[breadcrumbs.length - 2];\n }\n\n return undefined;\n }\n\n @Selector([BreadcrumbSelectors.breadcrumbs])\n public static mobileBreadcrumb(breadcrumbs: BreadcrumbLink[]): BreadcrumbLink | undefined {\n if (breadcrumbs) {\n return breadcrumbs[0];\n }\n\n return undefined;\n }\n}\n","
\n
\n \n \n
\n
\n
\n
\n\n
\n\n
\n
\n
\n
\n
\n
\n\n
\n {{t('noApplications')}}\n
\n\n
\n
\n \n \n
\n
\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { Account, AccountImpersonateActions, AuthActions, CurrentAccountSelectors } from \"@ha/feature/auth\";\nimport { BaseModalComponent } from \"@ha/ui/common\";\nimport { Select, Store } from \"@ngxs/store\";\nimport { map, Observable } from \"rxjs\";\n\nimport { Application } from \"../../models/application.model\";\n\nexport interface ApplicationListModalComponentData {\n applicationList: Application[];\n}\n\n@Component({\n templateUrl: \"./application-list-modal.component.html\",\n styleUrls: [\"./application-list-modal.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ApplicationListModalComponent extends BaseModalComponent {\n\n public data: ApplicationListModalComponentData;\n\n @Select(CurrentAccountSelectors.currentAccount)\n public currentAccount$: Observable;\n\n public signOutAction = AuthActions.SignOut;\n\n public impersonateStopAction = AccountImpersonateActions.ImpersonateStop;\n\n public get applicationList$(): Observable {\n return this.currentAccount$.pipe(map(account => {\n const accessToApplications = Object.entries(account.accessToApplications)\n .filter((app) => app[1] || (app[0] === \"admin\" && account.isImpersonated))\n .map(_ => _[0]);\n\n return this.data.applicationList.filter(_ => accessToApplications.includes(_.internalIdentifier));\n }));\n }\n\n constructor(private store: Store) {\n super();\n }\n\n public signOut(): void {\n this.closeModal();\n this.store.dispatch(new AuthActions.SignOut());\n }\n}\n","\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { Select } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\n\nimport { BreadcrumbLink } from \"../../models/breadcrumb-link.model\";\nimport { BreadcrumbSelectors } from \"../../states/breadcrumb.selectors\";\n\n@Component({\n selector: \"breadcrumbs\",\n templateUrl: \"./breadcrumbs.component.html\",\n styleUrls: [\"./breadcrumbs.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BreadcrumbsComponent {\n @Select(BreadcrumbSelectors.breadcrumbs)\n public breadcrumbs$: Observable | undefined;\n}\n","export const globalEnvironment = {\n production: false,\n instrumentationKey: \"499edcc6-2861-4bdb-9788-0de711babfbf\",\n googleGeolocationKey: \"AIzaSyDGj7ft-u2u3vk34vATm8B0tewuWfGLOMg\",\n globalI18nFiles: [\"global\", \"countries\", \"libs\", \"languages\"],\n};\n","import { Injectable } from \"@angular/core\";\nimport { globalEnvironment } from \"@ha/constants\";\nimport { ApplicationInsights } from \"@microsoft/applicationinsights-web\";\n\n@Injectable({ providedIn: \"root\" })\nexport class ApplicationInsightsMonitoringService {\n private appInsights: ApplicationInsights;\n\n constructor() {\n this.appInsights = new ApplicationInsights({\n config: {\n autoTrackPageVisitTime: true,\n instrumentationKey: globalEnvironment.instrumentationKey,\n enableAutoRouteTracking: true // option to log all route changes\n }\n });\n\n this.appInsights.loadAppInsights();\n }\n\n public logPageView(name?: string, url?: string): void { // option to call manually\n this.appInsights.trackPageView({\n name: name,\n uri: url\n });\n }\n\n public logEvent(name: string, properties?: { [key: string]: unknown }): void {\n this.appInsights.trackEvent({ name: name }, properties);\n }\n\n public logMetric(name: string, average: number, properties?: { [key: string]: unknown }): void {\n this.appInsights.trackMetric({ name: name, average: average }, properties);\n }\n\n public logException(exception: Error, severityLevel?: number): void {\n this.appInsights.trackException({ exception: exception, severityLevel: severityLevel });\n }\n\n public logTrace(message: string, properties?: { [key: string]: unknown }): void {\n this.appInsights.trackTrace({ message: message }, properties);\n }\n}\n","import { ErrorHandler, Injectable } from \"@angular/core\";\n\nimport { ApplicationInsightsMonitoringService } from \"./application-insights-monitoring.service\";\n\n@Injectable()\nexport class ApplicationInsightsErrorHandlerService extends ErrorHandler {\n\n constructor(private applicationInsightsMonitoringService: ApplicationInsightsMonitoringService) {\n super();\n }\n\n public handleError(error: Error): void {\n console.error(error);\n this.applicationInsightsMonitoringService.logException(error);\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { APP_INITIALIZER, ErrorHandler, NgModule } from \"@angular/core\";\n\nimport { ApplicationInsightsErrorHandlerService } from \"./services/application-insights-error-handler.service\";\nimport { ApplicationInsightsMonitoringService } from \"./services/application-insights-monitoring.service\";\n\n\n@NgModule({\n imports: [\n CommonModule\n ],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (applicationInsightsMonitoringService: ApplicationInsightsMonitoringService) => () => {\n return applicationInsightsMonitoringService;\n },\n multi: true,\n deps: [ApplicationInsightsMonitoringService]\n },\n { provide: ErrorHandler, useClass: ApplicationInsightsErrorHandlerService }\n ]\n})\nexport class HaUtilApplicationInsightsModule { }\n","// This file can be replaced during build by using the `fileReplacements` array.\n// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.\n// The list of file replacements can be found in `angular.json`.\n\nexport const environment = {\n production: false,\n};\n\n/*\n * For easier debugging in development mode, you can import the following file\n * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.\n *\n * This import should be commented out in production mode because it will have a negative impact\n * on performance if an error is thrown.\n */\n// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.\n","export namespace SettingsStateActions {\n export class GetSettings {\n public static readonly type = \"[Settings] GetSettings\";\n }\n\n export class ChangeLanguage {\n public static readonly type = \"[Settings] ChangeLanguage\";\n constructor(public language: string) {}\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from \"@angular/core\";\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { Actions, ofActionSuccessful } from \"@ngxs/store\";\n\nimport { SettingsStateActions } from \"./core/states/settings.actions\";\n\n@UntilDestroy()\n@Component({\n selector: \"identity-root\",\n templateUrl: \"./app.component.html\",\n styleUrls: [\"./app.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppComponent implements OnInit {\n constructor(private actions$: Actions, private cdr: ChangeDetectorRef) {}\n\n public ngOnInit(): void {\n // Transloco sucks workaround\n this.actions$.pipe(ofActionSuccessful(SettingsStateActions.ChangeLanguage), untilDestroyed(this)).subscribe(() => this.cdr.markForCheck());\n }\n}\n","
\n
\n
\n \n
\n
\n
\n","import { Routes } from \"@angular/router\";\n\nexport const routes: Routes = [\n];\n","export const ApplicationPaths = {\n Home: \"/\",\n SignIn: \"login\",\n SignOut: \"logout\",\n};\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable } from \"@angular/core\";\n\nimport { Settings } from \"../models/settings.model\";\n\n@Injectable({ providedIn: \"root\" })\nexport class SettingsService {\n constructor(private httpClient: HttpClient) {}\n\n public getSettings() {\n return this.httpClient.get(\"/api/settings\");\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { LanguageStateActions } from \"@ha/ui/common\";\nimport { SelectionListItem } from \"@ha/ui/forms\";\nimport { Application } from \"@ha/ui/navigation\";\nimport { setDateFnsLanguage } from \"@ha/util/common\";\nimport { TranslocoService } from \"@ngneat/transloco\";\nimport { Action, Selector, State, StateContext } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\nimport { tap } from \"rxjs/operators\";\n\nimport { Settings } from \"../models/settings.model\";\nimport { SettingsService } from \"../services/settings.service\";\nimport { SettingsStateActions } from \"./settings.actions\";\n\nexport interface SettingsStateModel {\n settings: Settings;\n currentLanguage: string;\n}\n\n@Injectable()\n@State({\n name: \"settings\",\n})\nexport class SettingsState {\n constructor(private settingsService: SettingsService, private translocoService: TranslocoService) {}\n\n @Selector()\n public static currentLanguage(state: SettingsStateModel): string {\n return state?.currentLanguage;\n }\n\n @Selector()\n public static uiLanguages(state: SettingsStateModel): string[] {\n return state?.settings?.uiLanguages;\n }\n\n @Selector()\n public static settings(state: SettingsStateModel): Settings {\n return state?.settings;\n }\n\n @Selector()\n public static uiLanguagesSelectOptions(state: SettingsStateModel): SelectionListItem[] {\n return state?.settings?.uiLanguages?.map((lang) => {\n return { value: lang, langKey: `languagesInNative.${lang}` };\n });\n }\n\n @Selector()\n public static applications(state: SettingsStateModel): Application[] {\n return state.settings?.applications.filter((_) =>\n _.internalIdentifier !== \"www\" && _.internalIdentifier !== \"admin\"\n );\n }\n\n // @Selector()\n // public static applicationNavigatorSelectOptions(state: SettingsStateModel): SelectionListItem[] {\n // return state?.settings?.applications?.map((data) => {\n // return { value: data.baseUrl, text: data.name };\n // });\n // }\n\n public ngxsOnInit(ctx: StateContext): void {\n const lang = ctx.getState().currentLanguage ?? (navigator.language.startsWith(\"sv\") ? \"sv\" : \"en\");\n this.setLanguage(ctx, lang);\n }\n\n @Action(SettingsStateActions.GetSettings)\n public getSettings(ctx: StateContext): Observable {\n return this.settingsService.getSettings().pipe(tap((settings) => {\n ctx.patchState({\n settings: settings,\n });\n }));\n }\n\n @Action(SettingsStateActions.ChangeLanguage)\n public changeLanguage(ctx: StateContext, action: SettingsStateActions.ChangeLanguage): void {\n this.setLanguage(ctx, action.language);\n ctx.dispatch(new LanguageStateActions.SetLanguage(action.language));\n }\n\n private setLanguage(ctx: StateContext, language: string) {\n if (!language) {\n return;\n }\n\n this.translocoService.setActiveLang(language);\n\n setDateFnsLanguage(language);\n\n ctx.patchState({\n currentLanguage: language,\n });\n }\n}\n","import { setDefaultOptions } from \"date-fns\";\nimport { enUS, sv } from \"date-fns/esm/locale\";\n\nexport function setDateFnsLanguage(language: string) {\n if (language === \"sv\") {\n setDefaultOptions({ locale: sv });\n } else {\n setDefaultOptions({ locale: enUS });\n }\n}\n\n","import { SignInCommand } from \"../models/sign-in-command\";\n\nexport class SignIn {\n public static readonly type = \"[Auth] SignIn\";\n constructor(public payload: SignInCommand) {}\n}\n","export interface SignInResult {\n status: SignInStatus;\n lockoutEndDate: string | null;\n}\n\nexport enum SignInStatus {\n Success = 1,\n Failed = 2,\n IsLockedOut = 3,\n IsBanned = 4,\n PasswordExpired = 5,\n CannotReuseOldPassword = 6,\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable } from \"@angular/core\";\nimport { Observable } from \"rxjs\";\n\nimport { SignInCommand } from \"../models/sign-in-command\";\nimport { SignInResult } from \"../models/sign-in-result\";\n\n@Injectable({ providedIn: \"root\" })\nexport class SignInService {\n constructor(private httpClient: HttpClient) {}\n\n public signIn(payload: SignInCommand): Observable {\n return this.httpClient.post(\"/api/account/signin\", payload);\n }\n}\n","import { Injectable } from \"@angular/core\";\nimport { Action, State, StateContext } from \"@ngxs/store\";\nimport { produce } from \"immer\";\nimport { Observable } from \"rxjs\";\nimport { tap } from \"rxjs/operators\";\n\nimport { SignInCommand } from \"../models/sign-in-command\";\nimport { SignInResult, SignInStatus } from \"../models/sign-in-result\";\nimport { SignInService } from \"../services/sign-in.service\";\nimport { SignIn } from \"./sign-in.actions\";\n\nexport interface SignInStateModel {\n signIn: {\n form: {\n model: SignInCommand;\n dirty: boolean;\n status: string;\n errors: never;\n };\n result: SignInResult;\n };\n}\n\n@Injectable()\n@State({ name: \"signIn\" })\nexport class SignInState {\n constructor(private signInService: SignInService) { }\n\n @Action(SignIn)\n public signIn(ctx: StateContext, action: SignIn): Observable {\n return this.signInService.signIn(action.payload).pipe(tap((result) => {\n ctx.setState(produce(ctx.getState(), (draft) => {\n draft.signIn = draft.signIn ?? {\n form: undefined,\n result: undefined,\n };\n\n draft.signIn.result = result;\n }));\n\n if (result.status === SignInStatus.Success) {\n if (action.payload.returnUrl) {\n location.href = action.payload.returnUrl;\n } else {\n location.href = \"/\";\n }\n }\n }));\n }\n}\n","import { Selector } from \"@ngxs/store\";\n\nimport { SignInResult, SignInStatus } from \"../models/sign-in-result\";\nimport { SignInState, SignInStateModel } from \"./sign-in.state\";\n\nexport class SignInSelectors {\n @Selector([SignInState])\n public static signInResult(state: SignInStateModel): SignInResult {\n return state.signIn?.result;\n }\n\n @Selector([SignInState])\n public static changePasswordMode(state: SignInStateModel): boolean {\n const status = state?.signIn?.result?.status;\n return status === SignInStatus.PasswordExpired || status === SignInStatus.CannotReuseOldPassword;\n }\n}\n","
\n \n \n\n \n \n\n
\n
\n \n \n \n \n\n \n
1 && (changePasswordMode$ | async) === false\" class=\"sign-in__form__error-message\">\n {{ t(\"status.\" + signInResult.status, { lockoutEndDate: signInResult.lockoutEndDate | haDate: \"time\" }) }}\n
\n\n \n
\n
\n \n \n\n \n \n\n
1 && signInResult.status !== 5\" class=\"sign-in__form__error-message\">\n {{ t(\"status.\" + signInResult.status, { lockoutEndDate: signInResult.lockoutEndDate | haDate: \"time\" }) }}\n
\n
\n
\n\n \n\n
\n\n \n
\n
\n\n \n \n\n
\n
{{ t(\"activateHeader\") }}
\n {{ t(\"activateAccount\") }}\n
\n
\n
\n
\n","import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from \"@angular/core\";\nimport { UntypedFormBuilder, Validators } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { AuthSelectors } from \"@ha/feature/auth\";\nimport { ModalComponent } from \"@ha/ui/common\";\nimport { UntilDestroy, untilDestroyed } from \"@ngneat/until-destroy\";\nimport { Select, Store } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\n\nimport { Settings } from \"../../core/models/settings.model\";\nimport { SettingsStateActions } from \"../../core/states/settings.actions\";\nimport { SettingsState } from \"../../core/states/settings.state\";\nimport { SignInResult } from \"../models/sign-in-result\";\nimport { SignIn } from \"../states/sign-in.actions\";\nimport { SignInSelectors } from \"../states/sign-in.selectors\";\n\n@UntilDestroy()\n@Component({\n templateUrl: \"sign-in.component.html\",\n styleUrls: [\"sign-in.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SignInComponent implements OnInit {\n public redirectUri: string;\n\n @ViewChild(\"passwordHintModal\") private passwordHintModal: ModalComponent;\n\n @Select(SettingsState.settings)\n public settings$: Observable;\n\n @Select(SignInSelectors.signInResult)\n public signInResult$: Observable;\n\n @Select(SignInSelectors.changePasswordMode)\n public changePasswordMode$: Observable;\n\n @Select(AuthSelectors.isAuthenticated)\n public isAuthenticated$: Observable;\n\n @Select(SettingsState.currentLanguage)\n public currentLanguage$: Observable;\n\n @Select(SettingsState.uiLanguages)\n public uiLanguages$: Observable;\n\n public form = this.fb.group({\n identity: [\"\", Validators.required],\n password: [\"\", Validators.required],\n newPassword: [\"\", Validators.required],\n newPasswordConfirm: [\"\", Validators.required],\n });\n\n public signInAction = SignIn;\n\n constructor(\n private fb: UntypedFormBuilder,\n private store: Store,\n private activatedRoute: ActivatedRoute,\n private router: Router,\n ) { }\n\n public ngOnInit(): void {\n this.activatedRoute.queryParams\n .pipe(untilDestroyed(this))\n .subscribe((params) => {\n if (params.returnUrl) {\n const queryParams = this.router.parseUrl(params.returnUrl as string).queryParams;\n const redirectUri = queryParams[\"redirect_uri\"] as string;\n if (redirectUri) {\n this.redirectUri = redirectUri;\n }\n }\n });\n }\n\n public onSubmit(): void {\n this.store.dispatch(new SignIn({\n identity: this.form.get(\"identity\").value as string,\n password: this.form.get(\"password\").value as string,\n newPassword: this.form.get(\"newPassword\")?.value as string,\n newPasswordConfirm: this.form.get(\"newPasswordConfirm\")?.value as string,\n returnUrl: this.redirectUri,\n }));\n\n this.changePasswordMode$.pipe(untilDestroyed(this)).subscribe((yes) => {\n if (yes) {\n this.form.get(\"identity\").disable();\n this.form.get(\"password\").disable();\n } else {\n this.form.get(\"identity\").enable();\n this.form.get(\"password\").enable();\n\n this.form.get(\"newPassword\").setValue(undefined);\n this.form.get(\"newPasswordConfirm\").setValue(undefined);\n }\n });\n }\n\n public openPasswordHintModal(event: MouseEvent): void {\n const element = event.target as HTMLElement;\n if (element.tagName.toLowerCase() === \"a\") {\n this.passwordHintModal.openModal();\n }\n }\n\n public languageChanged(languageCode: string): void {\n this.store.dispatch(new SettingsStateActions.ChangeLanguage(languageCode));\n }\n}\n","import { Component, OnInit } from \"@angular/core\";\nimport { AuthActions } from \"@ha/feature/auth\";\nimport { Store } from \"@ngxs/store\";\n\n@Component({\n template: \"\",\n})\nexport class SignOutComponent implements OnInit {\n constructor(private store: Store) {}\n\n public ngOnInit(): void {\n this.signOut();\n }\n\n public signOut(): void {\n this.store.dispatch(new AuthActions.SignOut());\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { HaUiCommonModule } from \"@ha/ui/common\";\nimport { HaUiFormsModule } from \"@ha/ui/forms\";\nimport { HaUiNavigationModule } from \"@ha/ui/navigation\";\nimport { HaUtilPipesModule } from \"@ha/util/pipes\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\nimport { NgxsFormPluginModule } from \"@ngxs/form-plugin\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { ApplicationPaths } from \"../constants/application-paths\";\nimport { SignInComponent } from \"./components/sign-in.component\";\nimport { SignOutComponent } from \"./components/sign-out.component\";\nimport { SignInState } from \"./states/sign-in.state\";\n\n@NgModule({\n imports: [\n CommonModule,\n TranslocoModule,\n NgxsFormPluginModule,\n HaUiCommonModule,\n HaUiFormsModule,\n HaUtilPipesModule,\n HaUiNavigationModule,\n\n NgxsModule.forFeature([SignInState]),\n RouterModule.forChild([\n { path: ApplicationPaths.SignIn, component: SignInComponent },\n { path: ApplicationPaths.SignOut, component: SignOutComponent },\n ]),\n ],\n declarations: [SignInComponent, SignOutComponent],\n exports: [\n SignInComponent,\n SignOutComponent\n ],\n providers: [\n ],\n})\nexport class IdentityAuthModule { }\n","import { Injectable } from \"@angular/core\";\nimport { Store } from \"@ngxs/store\";\n\nimport { SettingsStateActions } from \"../states/settings.actions\";\n\n@Injectable({ providedIn: \"root\" })\nexport class AppInitService {\n constructor(private store: Store) {}\n\n public init() {\n this.store.dispatch(new SettingsStateActions.GetSettings());\n }\n}\n","import { CommonModule } from \"@angular/common\";\nimport { APP_INITIALIZER, NgModule } from \"@angular/core\";\nimport { RouterModule } from \"@angular/router\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { AppInitService } from \"./services/app-init.service\";\nimport { SettingsState } from \"./states/settings.state\";\n\n// extension methods have to be imported somethere or else they will not be compiled\n@NgModule({\n declarations: [\n ],\n imports: [\n CommonModule,\n RouterModule,\n TranslocoModule,\n NgxsModule.forFeature([SettingsState]),\n ],\n exports: [\n\n ],\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: function OnInit(service: AppInitService) {\n return () => service.init();\n },\n deps: [AppInitService],\n multi: true,\n }\n ],\n})\nexport class CoreModule {}\n","\n","import { ChangeDetectionStrategy, Component } from \"@angular/core\";\nimport { AuthSelectors } from \"@ha/feature/auth\";\nimport { Application } from \"@ha/ui/navigation\";\nimport { Select } from \"@ngxs/store\";\nimport { Observable } from \"rxjs\";\nimport { SettingsState } from \"../../core/states/settings.state\";\n\n@Component({\n templateUrl: \"./home.component.html\",\n styleUrls: [\"home.component.scss\"],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class HomeComponent {\n @Select(AuthSelectors.isAuthenticated)\n public isAuthenticated$: Observable;\n\n @Select(SettingsState.applications)\n public applications$: Observable;\n}\n","import { CommonModule } from \"@angular/common\";\nimport { NgModule } from \"@angular/core\";\nimport { RouterModule, Routes } from \"@angular/router\";\nimport { TranslocoModule } from \"@ngneat/transloco\";\n\nimport { HomeComponent } from \"./components/home.component\";\n\nconst routes: Routes = [\n {\n path: \"\",\n pathMatch: \"full\",\n component: HomeComponent,\n }\n];\n\n@NgModule({\n declarations: [HomeComponent],\n imports: [\n CommonModule,\n TranslocoModule,\n RouterModule.forChild(routes),\n ],\n})\nexport class HomeModule {}\n","import { Injectable } from \"@angular/core\";\nimport { globalEnvironment } from \"@ha/constants\";\nimport { Translation, TranslocoLoader } from \"@ngneat/transloco\";\nimport { forkJoin, from, Observable } from \"rxjs\";\nimport { map } from \"rxjs/operators\";\n\n@Injectable({ providedIn: \"root\" })\nexport class TranslocoFileLoaderService implements TranslocoLoader {\n private globalFiles = globalEnvironment.globalI18nFiles;\n\n public getTranslation(langPath: string): Observable {\n const toAppPath = (file: string) => from(import(`apps/identity/src/i18n/${file}${langPath}.json`));\n const toGlobalPath = (file: string) => from(import(`global-i18n/${file}${langPath}.json`));\n\n const files = [...this.globalFiles.map((_) => toGlobalPath(_ + \".\")), toAppPath(\"\")];\n\n return forkJoin(files).pipe(map((_) => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n return Object.assign({}, ..._) as Translation;\n }));\n }\n}\n","import { NgModule } from \"@angular/core\";\nimport { TRANSLOCO_CONFIG, TRANSLOCO_LOADER, translocoConfig, TranslocoModule } from \"@ngneat/transloco\";\n\nimport { environment } from \"../../environments/environment\";\nimport { TranslocoFileLoaderService } from \"./transloco-file-loader.service\";\n\n@NgModule({\n imports: [\n TranslocoModule\n ],\n exports: [\n TranslocoModule\n ],\n providers: [\n { provide: TRANSLOCO_LOADER, useClass: TranslocoFileLoaderService },\n {\n provide: TRANSLOCO_CONFIG,\n useValue: translocoConfig({\n availableLangs: [\"en\", \"sv\"],\n defaultLang: \"sv\",\n fallbackLang: [\"en\", \"sv\"],\n reRenderOnLangChange: true,\n prodMode: environment.production,\n missingHandler: {\n useFallbackTranslation: true\n }\n }),\n }\n ],\n})\nexport class TranslationModule {}\n","import { HttpClientModule } from \"@angular/common/http\";\nimport { NgModule } from \"@angular/core\";\nimport { BrowserModule } from \"@angular/platform-browser\";\nimport { BrowserAnimationsModule } from \"@angular/platform-browser/animations\";\nimport { RouterModule } from \"@angular/router\";\nimport { HaUiNavigationModule } from \"@ha/ui/navigation\";\nimport { HaUtilApplicationInsightsModule } from \"@ha/util/application-insights\";\nimport { NgxsSelectSnapshotModule } from \"@ngxs-labs/select-snapshot\";\nimport { NgxsReduxDevtoolsPluginModule } from \"@ngxs/devtools-plugin\";\nimport { NgxsFormPluginModule } from \"@ngxs/form-plugin\";\nimport { NgxsRouterPluginModule } from \"@ngxs/router-plugin\";\nimport { NgxsStoragePluginModule } from \"@ngxs/storage-plugin\";\nimport { NgxsModule } from \"@ngxs/store\";\n\nimport { environment } from \"../environments/environment\";\nimport { AppComponent } from \"./app.component\";\nimport { routes } from \"./app.routes\";\nimport { IdentityAuthModule } from \"./auth/auth.module\";\nimport { CoreModule } from \"./core/core.module\";\nimport { SettingsState } from \"./core/states/settings.state\";\nimport { HomeModule } from \"./home/home.module\";\nimport { TranslationModule } from \"./translation/translation.module\";\n\n@NgModule({\n declarations: [AppComponent],\n imports: [\n TranslationModule,\n RouterModule.forRoot(routes, {\n onSameUrlNavigation: \"ignore\",\n anchorScrolling: \"enabled\",\n scrollPositionRestoration: \"enabled\",\n scrollOffset: [0, 100],\n }),\n NgxsStoragePluginModule.forRoot({\n key: [SettingsState],\n }),\n NgxsModule.forRoot([], {\n developmentMode: !environment.production,\n selectorOptions: {\n suppressErrors: false,\n injectContainerState: false,\n },\n }),\n NgxsFormPluginModule.forRoot(),\n NgxsRouterPluginModule.forRoot(),\n NgxsReduxDevtoolsPluginModule.forRoot({\n disabled: environment.production,\n }),\n NgxsSelectSnapshotModule.forRoot(),\n BrowserModule,\n BrowserAnimationsModule,\n HttpClientModule,\n\n HaUiNavigationModule,\n HaUtilApplicationInsightsModule,\n\n CoreModule,\n\n IdentityAuthModule,\n HomeModule\n ],\n providers: [\n ],\n bootstrap: [AppComponent],\n})\nexport class AppModule {}\n","import { enableProdMode } from \"@angular/core\";\nimport { platformBrowserDynamic } from \"@angular/platform-browser-dynamic\";\n\nimport { AppModule } from \"./app/app.module\";\nimport { environment } from \"./environments/environment\";\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic()\n .bootstrapModule(AppModule)\n .catch((err) => console.error(err));\n"],"x_google_ignoreList":[]}