@deviceinsight/ng-ui-scale-lib 9.25.0 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/AccessEditModal-x6TMxYkb.js +90 -0
- package/dist/AccessEditModal-x6TMxYkb.js.map +1 -0
- package/dist/BundleManagementContainer-B49bT5K-.js +16 -0
- package/dist/BundleManagementContainer-B49bT5K-.js.map +1 -0
- package/dist/BundlesContainer-BHzbWPe9.js +914 -0
- package/dist/BundlesContainer-BHzbWPe9.js.map +1 -0
- package/dist/DatapointImport-BSFXGuOh.js +293 -0
- package/dist/DatapointImport-BSFXGuOh.js.map +1 -0
- package/dist/FileUploadInput-Ccq_3cug.js +45 -0
- package/dist/FileUploadInput-Ccq_3cug.js.map +1 -0
- package/dist/Files-BniY5cJF.js +347 -0
- package/dist/Files-BniY5cJF.js.map +1 -0
- package/dist/GlobalPowerBiReports-CayA5Bqf.js +103 -0
- package/dist/GlobalPowerBiReports-CayA5Bqf.js.map +1 -0
- package/dist/Graph-BqYDNKEo.js +53 -0
- package/dist/Graph-BqYDNKEo.js.map +1 -0
- package/dist/JsonSettingWidget-pI5gCFnm.js +53 -0
- package/dist/JsonSettingWidget-pI5gCFnm.js.map +1 -0
- package/dist/LicensesEditPage-Bef9P-VO.js +145 -0
- package/dist/LicensesEditPage-Bef9P-VO.js.map +1 -0
- package/dist/LicensesList-Bwb2a9OS.js +149 -0
- package/dist/LicensesList-Bwb2a9OS.js.map +1 -0
- package/dist/PropertiesEditPage-OrwneFF4.js +373 -0
- package/dist/PropertiesEditPage-OrwneFF4.js.map +1 -0
- package/dist/{PropertiesList-0aa186df.js → PropertiesList-DRYRjsEu.js} +56 -58
- package/dist/PropertiesList-DRYRjsEu.js.map +1 -0
- package/dist/TemplateEditPage-B9v3VwGH.js +508 -0
- package/dist/TemplateEditPage-B9v3VwGH.js.map +1 -0
- package/dist/TemplateTextInput-CZFJ0oAT.js +45 -0
- package/dist/TemplateTextInput-CZFJ0oAT.js.map +1 -0
- package/dist/TemplatesListPage-BIZ0egkq.js +330 -0
- package/dist/TemplatesListPage-BIZ0egkq.js.map +1 -0
- package/dist/UserGroupAssignments-Wk1S9obw.js +297 -0
- package/dist/UserGroupAssignments-Wk1S9obw.js.map +1 -0
- package/dist/{UserGroupTheme-0f17124b.js → UserGroupTheme-BLBu4kUe.js} +51 -53
- package/dist/UserGroupTheme-BLBu4kUe.js.map +1 -0
- package/dist/api.d.ts +790 -786
- package/dist/api.js +72 -76
- package/dist/api.js.map +1 -0
- package/dist/{consts-012135e5.js → consts-CZ_QkIyI.js} +1 -2
- package/dist/consts-CZ_QkIyI.js.map +1 -0
- package/dist/{customFileCategories-1b64ed45.js → customFileCategories-bG5S9qSy.js} +1 -0
- package/dist/customFileCategories-bG5S9qSy.js.map +1 -0
- package/dist/index.d.ts +3 -7
- package/dist/index.js +4744 -17135
- package/dist/index.js.map +1 -0
- package/dist/setTitle-Ck-71vC0.js +39377 -0
- package/dist/setTitle-Ck-71vC0.js.map +1 -0
- package/dist/style.css +1 -1
- package/dist/{useCanDeleteBundleVersion-64f35949.js → useCanDeleteBundleVersion-CUD1pDJ0.js} +1 -0
- package/dist/useCanDeleteBundleVersion-CUD1pDJ0.js.map +1 -0
- package/package.json +86 -107
- package/dist/AccessEditModal-cedd4fb0.js +0 -92
- package/dist/BundleManagementContainer-08557220.js +0 -20
- package/dist/BundlesContainer-bff2a150.js +0 -912
- package/dist/ContextBarContext-7e6ed0f4.js +0 -88545
- package/dist/DatapointImport-ec7416a8.js +0 -864
- package/dist/FileUploadInput-b89d7c2f.js +0 -44
- package/dist/Files-5e4b71b0.js +0 -364
- package/dist/GlobalPowerBiReports-ad9449e0.js +0 -11081
- package/dist/Graph-865da2fa.js +0 -25012
- package/dist/JsonSettingWidget-24f37cfc.js +0 -56
- package/dist/LicensesEditPage-a0445b99.js +0 -146
- package/dist/LicensesList-9706b88d.js +0 -150
- package/dist/PropertiesEditPage-56eebca4.js +0 -371
- package/dist/TemplateEditPage-e281b762.js +0 -508
- package/dist/TemplateTextInput-63d68053.js +0 -49
- package/dist/TemplatesListPage-f2d7bd81.js +0 -330
- package/dist/UserGroupAssignments-b30d1774.js +0 -297
- package/dist/index-69036fda.js +0 -18679
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../ng-ui-scale/src/setupDayjs.ts","../ng-ui-scale/src/customization/tenantSettingsInitialization.ts","../ng-ui-scale/src/setup.ts","../ng-ui-scale/src/contexts/authorizationServers/AuthorizationServersContextProvider.tsx","../ng-ui-scale/src/modules/properties/properties.ts","../ng-ui-scale/src/contexts/globalResources/GlobalResourcesContextProvider.tsx","../ng-ui-scale/src/contexts/user/UserContextProvider.tsx","../ng-ui-scale/src/modules/axiosErrors/AxiosErrorHandler.tsx","../ng-ui-scale/src/components/page/footer/components/EulaTag.tsx","../ng-ui-scale/src/components/page/footer/components/CustomFooter.tsx","../ng-ui-scale/src/components/page/footer/components/VersionTag.tsx","../ng-ui-scale/src/components/page/footer/components/DefaultFooter.tsx","../ng-ui-scale/src/components/page/footer/Footer.tsx","../ng-ui-scale/src/components/page/header/Logo.tsx","../ng-ui-scale/src/modules/changeemail/LandingPage.tsx","../ng-ui-scale/src/modules/changeemail/LandingPageContainer.tsx","../ng-ui-scale/src/modules/forgotpassword/ForgotPasswordForm.tsx","../ng-ui-scale/src/modules/forgotpassword/ForgotPassword.tsx","../ng-ui-scale/src/modules/legals/Legals.tsx","../ng-ui-scale/src/modules/users/actions/signin.ts","../ng-ui-scale/src/modules/setpassword/LoginPasswordInput.tsx","../ng-ui-scale/src/modules/setpassword/validation.ts","../ng-ui-scale/src/modules/setpassword/PasswordPolicy.tsx","../ng-ui-scale/src/modules/setpassword/SetPasswordForm.tsx","../ng-ui-scale/src/modules/setpassword/SetPassword.tsx","../ng-ui-scale/src/utils/urlUtils.ts","../ng-ui-scale/src/customization/contexts/customLoginPageElements/CustomLoginPageElementsContextProvider.tsx","../ng-ui-scale/src/modules/legals/LegalsLinks.tsx","../ng-ui-scale/src/modules/signin/CountDown.tsx","../ng-ui-scale/src/modules/signin/SingleSignOn.tsx","../ng-ui-scale/src/modules/signin/SigninForm.tsx","../ng-ui-scale/src/modules/signin/Signin.tsx","../ng-ui-scale/src/components/page/header/Header.tsx","../ng-ui-scale/src/assets/svg/icon_star.svg","../ng-ui-scale/src/assets/svg/icon_timemachine.svg","../ng-ui-scale/src/contexts/currentPageTitle/CurrentPageTitleContext.ts","../ng-ui-scale/src/hooks/usePortalRoot.ts","../ng-ui-scale/src/components/FloatingPanel/FloatingPanelPortal.tsx","../ng-ui-scale/src/components/FloatingPanel/useFadeAnimation.ts","../ng-ui-scale/src/components/FloatingPanel/FloatingPanel.tsx","../ng-ui-scale/src/assets/svg/icon_drag_handle.svg","../ng-ui-scale/src/modules/favorites/EditedNameInput.tsx","../ng-ui-scale/src/modules/favorites/FavoriteItem.tsx","../ng-ui-scale/src/modules/favorites/Favorites.tsx","../ng-ui-scale/src/modules/favorites/favoritesApi.ts","../ng-ui-scale/src/modules/favorites/FavoritesProvider.tsx","../ng-ui-scale/src/modules/favorites/useFavorites.ts","../ng-ui-scale/src/modules/history/HistoryPanel.tsx","../ng-ui-scale/src/modules/history/historyApi.ts","../ng-ui-scale/src/modules/history/HistoryProvider.tsx","../ng-ui-scale/src/components/page/header/Ux4iotConnectionState.tsx","../ng-ui-scale/src/components/page/header/HeaderLinks.tsx","../ng-ui-scale/src/components/page/header/HeaderSearchContextSelect.tsx","../ng-ui-scale/src/modules/contextSearch/GlobalContextSearch.tsx","../ng-ui-scale/src/modules/fullSearch/SearchResultSection.tsx","../ng-ui-scale/src/modules/fullSearch/useNavigationEventEmitter.ts","../ng-ui-scale/src/modules/fullSearch/useResultsKeyboardNavigation.ts","../ng-ui-scale/src/modules/fullSearch/FullSearchResultsPanel.tsx","../ng-ui-scale/src/modules/fullSearch/useFullSearch.ts","../ng-ui-scale/src/modules/fullSearch/GlobalFullSearch.tsx","../ng-ui-scale/src/components/page/header/SearchModeSwitch.tsx","../ng-ui-scale/src/components/page/header/HeaderSearch.tsx","../ng-ui-scale/src/contexts/contextBar/ContextBar.tsx","../ng-ui-scale/src/utils/pathUtils.ts","../ng-ui-scale/src/components/page/navbar/ContextAction.tsx","../ng-ui-scale/src/assets/svg/icon_asset_linked_to_gateway.svg","../ng-ui-scale/src/components/page/navbar/contextinfo/ContextInfoCrumbMain.tsx","../ng-ui-scale/src/components/page/navbar/contextinfo/ContextInfoCrumbStatus.tsx","../ng-ui-scale/src/components/page/navbar/contextinfo/AssetContextInfo.tsx","../ng-ui-scale/src/components/page/navbar/contextinfo/getTranslationsByContext.ts","../ng-ui-scale/src/components/page/navbar/contextinfo/SearchContextInfo.tsx","../ng-ui-scale/src/components/page/navbar/contextinfo/DefaultContextInfoPanel.tsx","../ng-ui-scale/src/components/page/navbar/contextinfo/ContextInfoPanel.tsx","../ng-ui-scale/src/routes/helper.ts","../ng-ui-scale/src/utils/htmlIdUtils.ts","../ng-ui-scale/src/assets/svg/icon_home.svg","../ng-ui-scale/src/components/page/navbar/MainNavi.tsx","../ng-ui-scale/src/components/page/subnavi/helpers.ts","../ng-ui-scale/src/components/page/subnavi/SubNavi.tsx","../ng-ui-scale/src/contexts/assetShadowKeyTypes/AssetShadowKeyTypesContextProvider.tsx","../ng-ui-scale/src/contexts/authorities/AuthoritiesContextProvider.tsx","../ng-ui-scale/src/contexts/contextBar/ContextBarContextProvider.tsx","../ng-ui-scale/src/contexts/liveValues/LiveValuesContext.ts","../ng-ui-scale/src/contexts/liveValues/LiveValuesContextProvider.tsx","../ng-ui-scale/src/modules/assets/contexts/useInitialColumns.ts","../ng-ui-scale/src/modules/assets/contexts/AssetTableColumnsContextProvider.tsx","../ng-ui-scale/src/utils/isIE11.ts","../ng-ui-scale/src/modules/help/helpPanel/helpers.ts","../ng-ui-scale/src/modules/help/helpPanel/DocumentationIFrame.tsx","../ng-ui-scale/src/modules/help/helpPanel/HelpModal.tsx","../ng-ui-scale/src/modules/help/helpPanel/Highlight.tsx","../ng-ui-scale/src/modules/help/helpPanel/SearchBar.tsx","../ng-ui-scale/src/assets/svg/icon_dock.svg","../ng-ui-scale/src/assets/svg/icon_undock.svg","../ng-ui-scale/src/modules/help/helpPanel/TitleBar.tsx","../ng-ui-scale/src/modules/help/helpPanel/HelpPanel.tsx","../ng-ui-scale/src/modules/help/context/HelpPanelProvider.tsx","../ng-ui-scale/src/modules/requiredAuthorities/RequiredAuthoritiesPanel.tsx","../ng-ui-scale/src/utils/ContextProviders.tsx","../ng-ui-scale/src/components/trendv2/context/providerUtils.ts","../ng-ui-scale/src/components/trendv2/highchartsUtils/series.ts","../ng-ui-scale/src/components/trendv2/highchartsUtils/tooltip.ts","../ng-ui-scale/src/components/trendv2/highchartsUtils/thresholds.ts","../ng-ui-scale/src/components/trendv2/highchartsUtils/yAxis.ts","../ng-ui-scale/src/components/trendv2/highchartsUtils/createChartConfig.ts","../ng-ui-scale/src/components/trendv2/context/reducerUtils.ts","../ng-ui-scale/src/components/trendv2/context/trendAppContextReducer.ts","../ng-ui-scale/src/components/trendv2/context/TrendAppContextProvider.tsx","../ng-ui-scale/src/contexts/currentPageTitle/CurrentPageTitleContextProvider.tsx","../ng-ui-scale/src/contexts/globalSearch/GlobalSearchContextProvider.tsx","../ng-ui-scale/src/contexts/ux4iot/Ux4iotProvider.tsx","../ng-ui-scale/src/customization/globalContextProviders.tsx","../ng-ui-scale/src/modules/assets/globalAssetTimezoneSelection/GlobalAssetTimezoneContextProvider.tsx","../ng-ui-scale/src/components/page/misc/PageError.tsx","../ng-ui-scale/src/routes/NavRoute.tsx","../ng-ui-scale/src/routes/NavRoutes.tsx","../ng-ui-scale/src/routes/MainPage.tsx","../ng-ui-scale/src/routes/ProtectedRouteLegacy.tsx","../ng-ui-scale/src/i18n/MultiBackend.ts","../ng-ui-scale/src/i18n/TenantLocizeBackend.ts","../ng-ui-scale/src/i18n/withLocale.tsx","../ng-ui-scale/src/i18n/I18nextNGUIProvider.tsx","../ng-ui-scale/src/assets/welcomeModalWave.tsx","../ng-ui-scale/src/modules/welcome/useEulaActions.ts","../ng-ui-scale/src/modules/welcome/useHeightObserver.ts","../ng-ui-scale/src/modules/welcome/WelcomeModalContainer.tsx","../ng-ui-scale/src/utils/DiscardChangesModalContainer.tsx","../ng-ui-scale/src/utils/WhatsNewModalContainer.tsx","../ng-ui-scale/src/AppLegacy.tsx","../ng-ui-scale/src/routes/ProtectedRouteMsal.tsx","../ng-ui-scale/src/components/landingpages/AfterRegisterMFADevice.tsx","../ng-ui-scale/src/components/landingpages/AfterSignUp.tsx","../ng-ui-scale/src/utils/msalUtils/AuthErrorView.tsx","../ng-ui-scale/src/utils/msalUtils/MsalErrorComponent.tsx","../ng-ui-scale/src/AppMsal.tsx","../ng-ui-scale/src/App.tsx"],"sourcesContent":["import dayjs from 'dayjs';\nimport advancedFormat from 'dayjs/plugin/advancedFormat';\nimport localizedFormat from 'dayjs/plugin/localizedFormat';\nimport timezone from 'dayjs/plugin/timezone';\nimport utc from 'dayjs/plugin/utc';\nimport 'dayjs/locale/de';\n\nexport function setupDayjs() {\n\tdayjs.extend(localizedFormat);\n\tdayjs.extend(advancedFormat);\n\tdayjs.extend(utc);\n\tdayjs.extend(timezone);\n}\n","import {setGlobalErrorMessageBoxOptions} from '@deviceinsight/ng-ui-components';\n\nimport {setTitle, UiConfigurationApi} from './CustomApi';\nimport StyleApi from './StyleApi';\nimport ThemeApi from './ThemeApi';\n\nexport const initializeTenantSettingsFromConfiguration = () => {\n\tsetTitle(UiConfigurationApi.getAppName());\n\tThemeApi.initializeThemeConfiguration();\n\n\tif (UiConfigurationApi.getErrorMessageAutocloseTimeout()) {\n\t\tsetGlobalErrorMessageBoxOptions({\n\t\t\tautoClose: UiConfigurationApi.getErrorMessageAutocloseTimeout() ?? undefined,\n\t\t});\n\t}\n\n\tconst customStyleConfiguration = UiConfigurationApi.getCustomStyleConfiguration();\n\n\tif (customStyleConfiguration) {\n\t\tStyleApi.setStyleCustomizations(customStyleConfiguration);\n\t}\n};\n","import {type AuthenticationResult, EventType, PublicClientApplication} from '@azure/msal-browser';\nimport axios from 'axios';\nimport i18n from 'i18next';\nimport {merge} from 'lodash';\nimport qs from 'qs';\nimport {initReactI18next} from 'react-i18next';\nimport {useSecretsStore} from 'stores/secrets';\n\nimport {getAxios, readUIConfigurations, readUISecrets, setAxios} from '@deviceinsight/ng-ui-api-client';\nimport {initializeTranslation} from '@deviceinsight/ng-ui-components';\n\nimport {setupDayjs} from 'setupDayjs';\nimport {setEnvironment, UiConfigurationApi} from 'customization/CustomApi';\nimport getEnv from 'customization/getEnv';\nimport {initializeTenantSettingsFromConfiguration} from 'customization/tenantSettingsInitialization';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {setup429Retry} from 'utils/axiosUtils';\nimport {initAxiosLegacy} from 'utils/initAxiosLegacy';\nimport {initAxiosMsal} from 'utils/initAxiosMsal';\nimport {initMsalGlobals} from 'utils/msalUtils/msalGlobals';\nimport {convertB2cConfigIntoMsalConfig, fetchAzureB2cConfiguration} from 'utils/msalUtils/msalUtils';\nimport validateUiConfiguration from './customization/utils/validateUiConfiguration';\nimport {Trans, useTranslation} from './i18n';\nimport {onSignin} from './utils/eventBus';\n\nasync function loadUiConfigurationBlob() {\n\tconst uiConfiguration = (await readUiConfigurationBlob()) ?? {};\n\tawait configureTenantConfigUrl(uiConfiguration);\n\tawait UiConfigurationApi.syncWithBackend(uiConfiguration);\n\tinitializeTenantSettingsFromConfiguration();\n}\n\nasync function readUiConfigurationBlob() {\n\ttry {\n\t\treturn (await readUIConfigurations()) as Record<string, string>;\n\t} catch (e) {\n\t\tconsole.warn('UI configuration not available', e);\n\t}\n}\n\nasync function configureTenantConfigUrl(uiConfiguration: Record<string, string>) {\n\tconst configKey = 'REACT_APP_TENANT_CONFIG_URL';\n\tif (uiConfiguration[configKey]) {\n\t\tawait setEnvironment({\n\t\t\t[configKey]: uiConfiguration[configKey],\n\t\t});\n\t}\n}\n\nasync function loadRuntimeEnv() {\n\twindow.runtimeEnv = merge(\n\t\tgetEnv(),\n\t\t(await readRuntimeEnv()) ?? {},\n\t\twindow.runtimeEnv ?? {},\n\t\twindow.tenantRuntimeEnv ?? {},\n\t);\n}\n\nasync function readRuntimeEnv() {\n\ttry {\n\t\treturn (\n\t\t\tawait axios.get('/runtimeEnv.json', {\n\t\t\t\tresponseType: 'json',\n\t\t\t})\n\t\t).data as Record<string, string>;\n\t} catch (e) {\n\t\tconsole.error('Runtime environment not available', e);\n\t}\n}\n\nfunction loadRuntimeSecretsAndUiSecretsBlobOnSigning() {\n\tonSignin(async () => {\n\t\twindow.runtimeEnv = merge(\n\t\t\t(await readRuntimeSecrets()) ?? {},\n\t\t\t(await readUiSecretsBlob()) ?? {},\n\t\t\twindow.runtimeEnv ?? {},\n\t\t);\n\n\t\tvalidateUiConfiguration(window.runtimeEnv, true);\n\t\tuseSecretsStore.getState().setGoogleMapsApiKey(window.runtimeEnv['REACT_APP_GOOGLE_MAPS_API_KEY']);\n\t});\n}\n\nasync function readRuntimeSecrets() {\n\ttry {\n\t\t// axios has set base URL to API, so we need to go up one level\n\t\treturn (await getAxios().get('../runtimeSecrets.json')).data as Record<string, string>;\n\t} catch (e) {\n\t\tconsole.error('Runtime secrets not available', e);\n\t}\n}\n\nasync function readUiSecretsBlob() {\n\ttry {\n\t\treturn (await readUISecrets()) as Record<string, string>;\n\t} catch (e) {\n\t\tconsole.warn('UI secrets not available', e);\n\t}\n}\n\nfunction createB2cAxiosInstance() {\n\treturn axios.create({\n\t\tbaseURL: UIConfiguration.getApiBaseUrl(),\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json; charset=utf-8',\n\t\t\tAccept: 'application/json',\n\t\t},\n\t\tparamsSerializer: params =>\n\t\t\tqs.stringify(params, {\n\t\t\t\tarrayFormat: 'repeat',\n\t\t\t}),\n\t});\n}\n\nasync function initAzureB2cAndAxios() {\n\tconst axiosInstance = createB2cAxiosInstance();\n\tsetup429Retry(axiosInstance);\n\tsetAxios(axiosInstance);\n\tconst b2cConfig = await fetchAzureB2cConfiguration();\n\n\tif (b2cConfig) {\n\t\tconst msalConfig = convertB2cConfigIntoMsalConfig(b2cConfig);\n\t\tconst msalInstance = new PublicClientApplication(msalConfig);\n\n\t\tawait msalInstance.initialize();\n\t\t// Optional - This will update account state if a user signs in from another tab or window\n\t\tmsalInstance.enableAccountStorageEvents();\n\n\t\tmsalInstance.addEventCallback(event => {\n\t\t\tif (\n\t\t\t\t(event.eventType === EventType.LOGIN_SUCCESS ||\n\t\t\t\t\tevent.eventType === EventType.ACQUIRE_TOKEN_SUCCESS ||\n\t\t\t\t\tevent.eventType === EventType.SSO_SILENT_SUCCESS) &&\n\t\t\t\tevent.payload\n\t\t\t) {\n\t\t\t\tconst payload = event.payload as AuthenticationResult;\n\t\t\t\tconst account = payload.account;\n\t\t\t\tmsalInstance.setActiveAccount(account);\n\t\t\t}\n\t\t});\n\n\t\tinitMsalGlobals(msalInstance, msalConfig.auth.clientId);\n\t\tinitAxiosMsal();\n\t} else {\n\t\tinitAxiosLegacy();\n\t}\n}\n\nexport async function initializeApp() {\n\tawait loadRuntimeEnv();\n\tsetupDayjs();\n\tawait initAzureB2cAndAxios();\n\tawait loadUiConfigurationBlob();\n\tloadRuntimeSecretsAndUiSecretsBlobOnSigning();\n\tinitializeTranslation(Trans as any, useTranslation as any);\n\n\ttry {\n\t\tif (!i18n.isInitialized) {\n\t\t\tawait i18n.use(initReactI18next).init({\n\t\t\t\tfallbackLng: 'en',\n\t\t\t\tdebug: false,\n\t\t\t\treact: {\n\t\t\t\t\tuseSuspense: false,\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tconsole.error(error);\n\t}\n}\n","import type * as React from 'react';\nimport {useState} from 'react';\n\nimport type {AuthorizationServer} from '@deviceinsight/ng-ui-api-client';\n\nimport AuthorizationServersContext from './AuthorizationServersContext';\n\nconst getBlankAuthorizationServer = (): AuthorizationServer => ({\n\tname: '',\n\tclientSecret: '',\n\trevocationUri: '',\n\tscope: '',\n\tuserinfoUri: '',\n\tdisplayName: '',\n\tclientId: '',\n\tauthorizationUri: '',\n\tredirectUri: '',\n\ttokenUri: '',\n\tuiCallbackUri: '',\n\tjwksUri: '',\n});\n\nexport const AuthorizationServersContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst [editModalOpen, setEditModalOpen] = useState<boolean>(false);\n\tconst [authorizationServer, setAuthorizationServer] = useState<AuthorizationServer | null>(null);\n\n\tconst openModal = (authorizationServer?: AuthorizationServer | null | undefined) => {\n\t\tsetEditModalOpen(true);\n\t\tsetAuthorizationServer(authorizationServer || getBlankAuthorizationServer());\n\t};\n\n\tconst closeModal = () => {\n\t\tsetEditModalOpen(false);\n\t\tsetAuthorizationServer(null);\n\t};\n\n\treturn (\n\t\t<AuthorizationServersContext.Provider\n\t\t\tvalue={{\n\t\t\t\teditModalOpen,\n\t\t\t\tauthorizationServer,\n\t\t\t\topenModal,\n\t\t\t\tcloseModal,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AuthorizationServersContext.Provider>\n\t);\n};\n","import {fetchProperties as fetchPropertiesApi, type Property} from '@deviceinsight/ng-ui-api-client';\n\nimport {assetFields, assetGroupFields, userFields, userGroupFields} from 'modules/contextSearch/fields';\n\nexport function fetchProperties(): Promise<Property[]> {\n\treturn fetchPropertiesApi()\n\t\t.then(properties => {\n\t\t\tproperties.forEach(property => {\n\t\t\t\tproperty.entityTargets.forEach(entityTarget => {\n\t\t\t\t\tswitch (entityTarget) {\n\t\t\t\t\t\tcase 'ASSET':\n\t\t\t\t\t\t\textendSearchFields(assetFields, property);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ASSET_GROUP':\n\t\t\t\t\t\t\textendSearchFields(assetGroupFields, property);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ACCOUNT':\n\t\t\t\t\t\t\textendSearchFields(userFields, property);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ACCOUNT_GROUP':\n\t\t\t\t\t\t\textendSearchFields(userGroupFields, property);\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn Promise.resolve(properties);\n\t\t})\n\t\t.catch(error => {\n\t\t\tconsole.error('failed to fetch properties', error);\n\t\t\treturn Promise.resolve([]);\n\t\t});\n}\n\ntype Field = {key: unknown; type: unknown};\n\nfunction extendSearchFields(fields: Array<Field>, {key, type}: Field) {\n\tif (!fields.some(field => field.key === key)) {\n\t\tfields.push({\n\t\t\tkey,\n\t\t\ttype,\n\t\t});\n\t}\n}\n","import type * as React from 'react';\nimport {useCallback, useState} from 'react';\n\nimport {\n\ttype AssetGroupDefinition,\n\tfetchAssetGroupDefinitions,\n\tfetchLocales,\n\ttype Property,\n} from '@deviceinsight/ng-ui-api-client';\n\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {fetchProperties} from '../../modules/properties/properties';\nimport {GlobalResourcesContext} from './GlobalResourcesContext';\nimport {setGlobalAssetGroupDefinitions, setGlobalAssetGroupDefinitionsPromise} from './globalAssetGroupDefinitions';\n\nasync function tryFetchAssetGroupDefinitions() {\n\tif (hasAuthorities(['READ_ASSET_GROUP_DEFINITION'])) {\n\t\treturn await fetchAssetGroupDefinitions();\n\t} else {\n\t\treturn [];\n\t}\n}\n\nasync function tryFetchLocales(): Promise<string[]> {\n\tif (hasAuthorities(['READ_LOCALE'])) {\n\t\treturn await fetchLocales();\n\t} else {\n\t\treturn [];\n\t}\n}\n\nasync function tryFetchProperties(): Promise<Property[]> {\n\tif (hasAuthorities(['READ_PROPERTY'])) {\n\t\treturn await fetchProperties();\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexport const GlobalResourcesContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst [initialFetchingComplete, setInitialFetchingComplete] = useState<boolean>(false);\n\tconst [properties, setProperties] = useState<Property[]>([]);\n\tconst [assetGroupDefinitions, setAssetGroupDefinitions] = useState<AssetGroupDefinition[]>([]);\n\tconst [locales, setLocales] = useState<string[]>([]);\n\tconst reloadProperties = useCallback(\n\t\t() =>\n\t\t\ttryFetchProperties()\n\t\t\t\t.then(properties => {\n\t\t\t\t\tsetProperties(properties);\n\t\t\t\t\treturn properties;\n\t\t\t\t})\n\t\t\t\t.catch(error => {\n\t\t\t\t\tconsole.error('failed to fetch properties', error);\n\t\t\t\t\treturn [];\n\t\t\t\t}),\n\t\t[],\n\t);\n\tconst reloadAssetGroupDefinitions = useCallback(async () => {\n\t\ttry {\n\t\t\tconst assetGroupDefinitions = await tryFetchAssetGroupDefinitions();\n\t\t\tsetAssetGroupDefinitions(assetGroupDefinitions);\n\t\t\tsetGlobalAssetGroupDefinitions(assetGroupDefinitions);\n\t\t\tsetGlobalAssetGroupDefinitionsPromise(null);\n\t\t\treturn assetGroupDefinitions;\n\t\t} catch (error) {\n\t\t\tconsole.error('failed to fetch asset group definitions', error);\n\t\t\treturn [];\n\t\t}\n\t}, []);\n\n\tconst loadGlobalResources = useCallback(() => {\n\t\tPromise.all([\n\t\t\ttryFetchProperties(),\n\t\t\ttryFetchLocales().catch(error => {\n\t\t\t\tconsole.error('failed to fetch locales', error);\n\t\t\t\treturn [];\n\t\t\t}),\n\t\t]).then(responseArray => {\n\t\t\tconst properties = responseArray[0];\n\t\t\tconst locales = responseArray[1];\n\t\t\tsetProperties(properties);\n\t\t\tsetLocales(locales);\n\t\t\tsetInitialFetchingComplete(true);\n\t\t});\n\t\t// Asset group definitions take a long time to fetch,\n\t\t// therefore do not wait in MainPage for the fetching to complete.\n\t\t// This speeds up the login / initial page load of NG UI.\n\t\tconst assetGroupDefinitionsPromise = reloadAssetGroupDefinitions();\n\t\tsetGlobalAssetGroupDefinitionsPromise(assetGroupDefinitionsPromise);\n\t}, [reloadAssetGroupDefinitions]);\n\n\tfunction resetGlobalResources() {\n\t\tif (initialFetchingComplete) {\n\t\t\tsetInitialFetchingComplete(false);\n\t\t\tsetProperties([]);\n\t\t\tsetAssetGroupDefinitions([]);\n\t\t\tsetLocales([]);\n\t\t\tsetGlobalAssetGroupDefinitions([]);\n\t\t}\n\t}\n\n\treturn (\n\t\t<GlobalResourcesContext.Provider\n\t\t\tvalue={{\n\t\t\t\tinitialFetchingComplete,\n\t\t\t\tproperties,\n\t\t\t\tassetGroupDefinitions,\n\t\t\t\tlocales,\n\t\t\t\tresetGlobalResources,\n\t\t\t\tloadGlobalResources,\n\t\t\t\treloadProperties,\n\t\t\t\treloadAssetGroupDefinitions,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</GlobalResourcesContext.Provider>\n\t);\n};\n","import type * as React from 'react';\nimport {useCallback, useEffect, useState} from 'react';\n\nimport {\n\treadAccountObject,\n\ttype User,\n\ttype UserPaginationSettings,\n\twritePaginationSettings as writePaginationSettingsApi,\n} from '@deviceinsight/ng-ui-api-client';\n\nimport UIConfiguration from '../../customization/UIConfiguration';\nimport {setGlobalUserAuthorities} from './globalUserAuthorities';\nimport {setGlobalUserLocale} from './globalUserLocale';\nimport {INITIAL_PAGINATION_SETTINGS, INITIAL_PRINCIPAL, INITIAL_USER, UserContext} from './UserContext';\n\nexport const UserContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\t// Not used in code, but useful for debugging, because a user can have multiple principals\n\tconst [principal, setPrincipal] = useState<string>(INITIAL_PRINCIPAL);\n\tconst [user, setUser] = useState<User>(INITIAL_USER);\n\tconst [authenticated, setAuthenticated] = useState<boolean>(false);\n\tconst [afterSignout, setAfterSignout] = useState<boolean>(false);\n\tconst [defaultSearchMode, setDefaultSearchMode] = useState<'full' | 'context'>(\n\t\tUIConfiguration.getDefaultSearchMode(),\n\t);\n\tconst [paginationSettings, setPaginationSettings] = useState<UserPaginationSettings | null | undefined>();\n\n\tconst setAuthenticatedUser = useCallback(\n\t\t(principal: string, user: User, paginationSettings: UserPaginationSettings | null | undefined) => {\n\t\t\tsetPrincipal(principal);\n\t\t\tsetUser(user);\n\t\t\tsetAuthenticated(!!user);\n\t\t\tsetAfterSignout(false);\n\n\t\t\tif (paginationSettings) {\n\t\t\t\tsetPaginationSettings(paginationSettings);\n\t\t\t}\n\t\t\tsetGlobalUserLocale(user.locale);\n\t\t\tsetGlobalUserAuthorities(user.authorities);\n\t\t},\n\t\t[],\n\t);\n\n\tuseEffect(() => {\n\t\tif (user?.id) {\n\t\t\treadAccountObject('uiConfigurations/searchmode').then(setDefaultSearchMode);\n\t\t}\n\t}, [user?.id]);\n\n\tfunction resetAuthenticatedUser() {\n\t\tsetPrincipal(INITIAL_PRINCIPAL);\n\t\tsetUser(INITIAL_USER);\n\t\tsetAuthenticated(false);\n\t\tsetAfterSignout(true);\n\t\tsetPaginationSettings(INITIAL_PAGINATION_SETTINGS);\n\t\tsetGlobalUserLocale(INITIAL_USER.locale);\n\t\tsetGlobalUserAuthorities(INITIAL_USER.authorities);\n\t}\n\n\tfunction writePaginationSettings(paginationSettings: UserPaginationSettings) {\n\t\treturn writePaginationSettingsApi(paginationSettings)\n\t\t\t.then(() => {\n\t\t\t\tsetPaginationSettings(paginationSettings);\n\t\t\t})\n\t\t\t.catch((error: Error) => {\n\t\t\t\tconsole.error('failed to write pagination settings', error);\n\t\t\t});\n\t}\n\n\treturn (\n\t\t<UserContext.Provider\n\t\t\tvalue={{\n\t\t\t\tprincipal,\n\t\t\t\tuser,\n\t\t\t\tauthenticated,\n\t\t\t\tafterSignout,\n\t\t\t\tpaginationSettings,\n\t\t\t\tsetAuthenticatedUser,\n\t\t\t\tresetAuthenticatedUser,\n\t\t\t\twritePaginationSettings,\n\t\t\t\tdefaultSearchMode,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</UserContext.Provider>\n\t);\n};\n","import {useMsal} from '@azure/msal-react';\nimport {useCallback, useContext, useEffect, useState} from 'react';\n\nimport type {User} from '@deviceinsight/ng-ui-api-client';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {INITIAL_USER, type ResetAuthenticatedUserType, UserContext} from 'contexts/user/UserContext';\nimport {Trans} from 'i18n';\nimport {signoutLegacy, signoutMsal} from 'modules/users/actions/signout';\nimport {isAzureB2cActive} from 'utils/msalUtils/msalUtils';\nimport {type AxiosErrorDescriptor, setAxiosErrorsCallback} from './axiosErrors';\n\nexport default function AxiosErrorHandler() {\n\tconst {user, resetAuthenticatedUser} = useContext(UserContext);\n\tconst {instance} = useMsal();\n\tconst [axiosErrors, setAxiosErrors] = useState<AxiosErrorDescriptor[]>([]);\n\tconst [payloadErrorOpen, setPayloadErrorOpen] = useState<boolean>(false);\n\tconst [networkErrorOpen, setNetworkErrorOpen] = useState<boolean>(false);\n\tconst [authoritiesMissingErrorOpen, setAuthoritiesMissingErrorOpen] = useState<boolean>(false);\n\tconst [index, setIndex] = useState<number>(0);\n\n\tconst signout = useCallback(\n\t\tasync (user: User, resetAuthenticatedUser: ResetAuthenticatedUserType): Promise<void> => {\n\t\t\tif (isAzureB2cActive()) {\n\t\t\t\tawait signoutMsal(user, instance);\n\t\t\t} else {\n\t\t\t\tawait signoutLegacy(user, resetAuthenticatedUser);\n\t\t\t}\n\t\t\treturn Promise.resolve();\n\t\t},\n\t\t[instance],\n\t);\n\n\tuseEffect(() => {\n\t\tsetAxiosErrorsCallback(setAxiosErrors);\n\t}, []);\n\tconst handleError = useCallback(\n\t\t(error: AxiosErrorDescriptor) => {\n\t\t\tif (isAuthorizationError(error)) {\n\t\t\t\t// window.location.reload as well as any other reload methods cause flickering\n\t\t\t\t// this way errors regarding the 401 still will be displayed in the console\n\t\t\t\tsignout(user, resetAuthenticatedUser);\n\t\t\t} else if (isRateLimitError(error)) {\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"axios.errors.rateLimitError\">\n\t\t\t\t\t\tToo many attempts to refresh authorization token.\n\t\t\t\t\t</Trans>,\n\t\t\t\t);\n\t\t\t\tsignout(user, resetAuthenticatedUser);\n\t\t\t\tconsole.error('Renew token request failed (RateLimitError)', error);\n\t\t\t} else if (isAuthTokenRefreshError(error)) {\n\t\t\t\tsignout(user, resetAuthenticatedUser);\n\t\t\t\tconsole.error('Renew token request failed (AuthTokenRefreshError)', error);\n\t\t\t} else if (isTimeoutError(error)) {\n\t\t\t\tconsole.error('timeout error: node.js service responded with the following error', error);\n\t\t\t} else if (isAuthoritiesMissingError(user, error) && !authoritiesMissingErrorOpen) {\n\t\t\t\tsetAuthoritiesMissingErrorOpen(true);\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"axios.errors.authoritiesMissing\">\n\t\t\t\t\t\tMissing authorities. Please contact your administrator.\n\t\t\t\t\t</Trans>,\n\t\t\t\t\t{\n\t\t\t\t\t\tonClose: () => setAuthoritiesMissingErrorOpen(false),\n\t\t\t\t\t\ttoastId: 'authoritiesMissing',\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} else if (isPayloadError(error) && !payloadErrorOpen) {\n\t\t\t\tsetPayloadErrorOpen(true);\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"axios.errors.payload\">Request/File is larger than limits defined by server.</Trans>,\n\t\t\t\t\t{\n\t\t\t\t\t\tonClose: () => setPayloadErrorOpen(false),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} else if (isNetworkError(error) && !networkErrorOpen) {\n\t\t\t\tsetNetworkErrorOpen(true);\n\t\t\t\tmessageBoxError(\n\t\t\t\t\t<Trans i18nKey=\"axios.errors.network\">Network error. Check your internet connection.</Trans>,\n\t\t\t\t\t{\n\t\t\t\t\t\tonClose: () => setNetworkErrorOpen(false),\n\t\t\t\t\t\ttoastId: 'networkError',\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\t\t},\n\t\t[authoritiesMissingErrorOpen, networkErrorOpen, payloadErrorOpen, user, resetAuthenticatedUser, signout],\n\t);\n\n\tuseEffect(() => {\n\t\tlet newIndex = index;\n\n\t\t// axiosErrors contains all errors since opening the application, we only want to handle new errors\n\t\twhile (newIndex < axiosErrors.length) {\n\t\t\thandleError(axiosErrors[newIndex]);\n\t\t\tnewIndex += 1;\n\t\t}\n\n\t\tif (index !== newIndex) {\n\t\t\tsetIndex(newIndex);\n\t\t}\n\t}, [axiosErrors, index, handleError]);\n\n\treturn null;\n}\n\nfunction isAuthorizationError({error}: AxiosErrorDescriptor) {\n\treturn error && error.response && error.response.status === 401;\n}\n\nfunction isRateLimitError({error}: AxiosErrorDescriptor) {\n\treturn error && error.response && error.response.status === 429 && error.message === 'REFRESH_TOKEN_ERROR';\n}\n\nfunction isAuthTokenRefreshError({error}: AxiosErrorDescriptor) {\n\treturn error && error.message === 'REFRESH_TOKEN_ERROR';\n}\n\nfunction isTimeoutError({error}: AxiosErrorDescriptor) {\n\treturn error && error.code === 'ECONNABORTED';\n}\n\nfunction isAuthoritiesMissingError(user: User, {error}: AxiosErrorDescriptor) {\n\tif (user === INITIAL_USER || user.state === 'TERMS_ACCEPTANCE_PENDING') {\n\t\treturn false;\n\t}\n\n\treturn error && error.response && error.response.status === 403;\n}\n\nfunction isPayloadError({error}: AxiosErrorDescriptor) {\n\treturn error && error.response && error.response.status === 413;\n}\n\nfunction isNetworkError({error}: AxiosErrorDescriptor) {\n\treturn error && error.message === 'Network Error';\n}\n","import {saveAs} from 'file-saver';\n\nimport {Trans} from 'i18n';\nimport {EulaWithMeta} from 'modules/eula/readEulaWithMeta';\n\ntype Props = {\n\teula: EulaWithMeta;\n};\nexport const EulaTag = ({eula}: Props) => (\n\t<span\n\t\tclassName=\"eula-download\"\n\t\tonClick={() => {\n\t\t\tsaveAs(\n\t\t\t\tnew Blob([eula.data], {\n\t\t\t\t\ttype: eula.meta.contentType,\n\t\t\t\t}),\n\t\t\t\teula.meta.userMetadata['X-Blob-Meta-Filename'],\n\t\t\t);\n\t\t}}\n\t>\n\t\t<Trans i18nKey=\"eula.title\">End-User License Agreement</Trans>\n\t</span>\n);\n","import domPurify from 'dompurify';\n\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {EulaWithMeta} from 'modules/eula/readEulaWithMeta';\nimport {getAppVersion} from 'utils/env';\nimport {EulaTag} from './EulaTag';\n\ntype Props = {\n\tapiVersion: string | null | undefined;\n\teula: EulaWithMeta | null | undefined;\n\tcontents: string;\n\tisTestTenant: boolean;\n};\nexport const CustomFooter = ({apiVersion, eula, contents, isTestTenant}: Props) => {\n\tconst year = new Date().getFullYear();\n\tconst eulaRegExp = new RegExp(/({{eula}})/, 'gi');\n\tconst appVersion = getAppVersion();\n\tconst parsedCustomFooter = contents\n\t\t.replace(/{{year}}/g, `${year}`)\n\t\t.replace(/{{guiVersion}}/g, isTestTenant && appVersion ? appVersion : '')\n\t\t.replace(/{{gitCommitSha}}/g, UIConfiguration.getGitCommitShaShort() || '')\n\t\t.replace(/{{apiVersion}}/g, apiVersion || '');\n\n\tconst splitCustomFooter = parsedCustomFooter.split(eulaRegExp);\n\treturn (\n\t\t<footer>\n\t\t\t{splitCustomFooter.map((part, index) =>\n\t\t\t\tpart.match(eulaRegExp) ? (\n\t\t\t\t\teula && <EulaTag key={index} eula={eula} />\n\t\t\t\t) : (\n\t\t\t\t\t<span\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t__html: domPurify(window).sanitize(part),\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t)}\n\t\t</footer>\n\t);\n};\n","type Props = {\n\tlabel: string | null | undefined;\n\tversion: string | null | undefined;\n};\nexport const VersionTag = ({label, version}: Props) =>\n\tversion ? (\n\t\t<span className=\"version-tag\">\n\t\t\t{label} <span>v{version}</span>\n\t\t</span>\n\t) : null;\n","import UIConfiguration from 'customization/UIConfiguration';\nimport {EulaWithMeta} from 'modules/eula/readEulaWithMeta';\nimport {getAppVersion} from 'utils/env';\nimport {EulaTag} from './EulaTag';\nimport {VersionTag} from './VersionTag';\n\ntype Props = {\n\teula: EulaWithMeta | null | undefined;\n\tisTestTenant: boolean;\n};\n\nexport const DefaultFooter = ({eula, isTestTenant}: Props) => {\n\tconst year = new Date().getFullYear();\n\tconst guiVersion = getAppVersion();\n\tconst gitShaShort = UIConfiguration.getGitCommitShaShort();\n\treturn (\n\t\t<footer>\n\t\t\t© Device Insight GmbH · {year}\n\t\t\t<div className=\"footer-version\">\n\t\t\t\t{UIConfiguration.getAppName()}\n\t\t\t\t{isTestTenant && guiVersion && <VersionTag label=\"UI\" version={guiVersion} />}\n\t\t\t\t{gitShaShort && (\n\t\t\t\t\t<span className=\"version-tag\">\n\t\t\t\t\t\tSHA <span>{gitShaShort}</span>\n\t\t\t\t\t</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{eula && <EulaTag eula={eula} />}\n\t\t</footer>\n\t);\n};\n","import {ComponentType, useContext, useEffect, useState} from 'react';\n\nimport {getVersion} from '@deviceinsight/ng-ui-api-client';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport customizable from 'customization/customizable';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport useLocale from 'hooks/useLocale';\nimport useMounted from 'hooks/useMounted';\nimport {CustomFooter} from './components/CustomFooter';\nimport {DefaultFooter} from './components/DefaultFooter';\nimport './Footer.scss';\n\nimport {EulaWithMeta, readEulaWithMeta} from 'modules/eula/readEulaWithMeta';\n\ntype Props = {\n\tshowApiVersion?: boolean;\n};\n\nfunction Footer({showApiVersion}: Props) {\n\tconst [apiVersion, setApiVersion] = useState<string | null | undefined>(null);\n\tconst [eula, setEula] = useState<EulaWithMeta | null | undefined>(null);\n\tconst mountedRef = useMounted();\n\tconst locale = useLocale();\n\tconst {authenticated} = useContext(UserContext);\n\n\tuseEffect(() => {\n\t\t(async () => {\n\t\t\tif (showApiVersion) {\n\t\t\t\tconst apiVersion = await getVersion();\n\t\t\t\tif (mountedRef.current) {\n\t\t\t\t\tsetApiVersion(apiVersion);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, [showApiVersion, mountedRef]);\n\n\tuseEffect(() => {\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tconst eula = await readEulaWithMeta(locale.toLowerCase());\n\n\t\t\t\tif (mountedRef.current) {\n\t\t\t\t\tsetEula(eula);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tif (locale !== UIConfiguration.getFallbackLocale()) {\n\t\t\t\t\tconst eula = await readEulaWithMeta(UIConfiguration.getFallbackLocale().toLowerCase());\n\t\t\t\t\tsetEula(eula);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\t}, [locale, mountedRef]);\n\tconst publicFooterContents = UIConfiguration.getPublicAppFooter();\n\tconst footerContents = UIConfiguration.getAppFooter();\n\n\tif (!authenticated && publicFooterContents) {\n\t\treturn (\n\t\t\t<CustomFooter\n\t\t\t\teula={eula}\n\t\t\t\tcontents={publicFooterContents}\n\t\t\t\tisTestTenant={UIConfiguration.isTestTenant()}\n\t\t\t\tapiVersion={apiVersion}\n\t\t\t/>\n\t\t);\n\t}\n\n\tif (footerContents || publicFooterContents) {\n\t\treturn (\n\t\t\t<CustomFooter\n\t\t\t\teula={eula}\n\t\t\t\tapiVersion={apiVersion}\n\t\t\t\tcontents={footerContents || publicFooterContents || ''}\n\t\t\t\tisTestTenant={UIConfiguration.isTestTenant()}\n\t\t\t/>\n\t\t);\n\t}\n\n\treturn <DefaultFooter eula={eula} isTestTenant={UIConfiguration.isTestTenant()} />;\n}\n\nexport default customizable('Footer')(Footer) as ComponentType<Props>;\n","import {type ComponentType, useEffect, useState} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport logoImage from 'assets/img/cs_scale_logo.svg';\nimport customizable from 'customization/customizable';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {getStartPage} from 'modules/users/startpage';\nimport {onThemeChange} from 'utils/eventBus';\nimport './Logo.scss';\n\ntype Props = {\n\tcentered?: boolean;\n\tlinkToStartPage?: boolean;\n};\n\nfunction useForceUpdateOnThemeChange() {\n\tconst [, updateState] = useState(false);\n\tuseEffect(() => {\n\t\tonThemeChange(() => updateState(flag => !flag));\n\t}, []);\n}\n\nfunction Logo({centered, linkToStartPage}: Props) {\n\tuseForceUpdateOnThemeChange();\n\tconst history = useHistory();\n\n\tfunction handleClick() {\n\t\tif (linkToStartPage) {\n\t\t\tgetStartPage().then(url => history.push(url));\n\t\t}\n\t}\n\n\tconst logo = centered ? (\n\t\t<img\n\t\t\tsrc={UIConfiguration.getLogo() || logoImage}\n\t\t\talt=\"logo\"\n\t\t\tstyle={{\n\t\t\t\tmaxWidth: 230,\n\t\t\t}}\n\t\t/>\n\t) : (\n\t\t<img\n\t\t\tsrc={UIConfiguration.getLogo() || logoImage}\n\t\t\talt=\"logo\"\n\t\t\tstyle={{\n\t\t\t\tmaxHeight: 40,\n\t\t\t}}\n\t\t/>\n\t);\n\treturn (\n\t\t<div className=\"di logo\" onClick={handleClick}>\n\t\t\t{logo}\n\t\t</div>\n\t);\n}\n\nexport default customizable('Logo')(Logo) as ComponentType<any>;\n","import {Component} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\nimport Footer from 'components/page/footer/Footer';\nimport Logo from 'components/page/header/Logo';\nimport {Trans} from 'i18n';\nimport '../../modules/signin/Signin.scss';\n\ntype Props = {\n\tisLoading: boolean;\n\tsuccess: boolean;\n\ttokenExpired: boolean;\n};\nexport default class LandingPage extends Component<Props> {\n\trender() {\n\t\tconst {isLoading, success, tokenExpired} = this.props;\n\t\treturn (\n\t\t\t<div className=\"di login\">\n\t\t\t\t<div className=\"wrap\">\n\t\t\t\t\t<div className=\"hold\">\n\t\t\t\t\t\t<Logo centered linkToStartPage={true} />\n\t\t\t\t\t\t<SpinnerContainer show={isLoading}>\n\t\t\t\t\t\t\t{!isLoading && success && (\n\t\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t\t<div className=\"msg\">\n\t\t\t\t\t\t\t\t\t\t<span className=\"success\">\n\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"email.change.landing.page\">\n\t\t\t\t\t\t\t\t\t\t\t\tYour email has been changed successfully\n\t\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isLoading && tokenExpired && (\n\t\t\t\t\t\t\t\t<div className=\"error\">\n\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"changeEmail.tokenExpired\">Your change email link has expired</Trans>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{!isLoading && (\n\t\t\t\t\t\t\t\t<div className=\"forgot\">\n\t\t\t\t\t\t\t\t\t<Link to=\"/signin\">\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"page.back.login\">Back to login</Trans>\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</SpinnerContainer>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<Footer />\n\t\t\t</div>\n\t\t);\n\t}\n}\n","import qs from 'qs';\nimport {Component} from 'react';\nimport {type RouteComponentProps, withRouter} from 'react-router-dom';\n\nimport {changeEmail} from '@deviceinsight/ng-ui-api-client';\n\nimport LandingPage from './LandingPage';\n\ntype Props = RouteComponentProps;\n\ntype OwnState = {\n\tisLoading: boolean;\n\tsuccess: boolean;\n\ttokenExpired: boolean;\n};\n\nclass LandingPageContainer extends Component<Props, OwnState> {\n\tstate = {\n\t\tisLoading: true,\n\t\tsuccess: false,\n\t\ttokenExpired: false,\n\t};\n\tgetSearchParams = () => {\n\t\tconst {search} = this.props.location;\n\n\t\tif (!search || !search.length) {\n\t\t\treturn {};\n\t\t}\n\n\t\treturn qs.parse(search.substring(1));\n\t};\n\tonChangeEmailFailed = (error: any) => {\n\t\tswitch (error.response.data) {\n\t\t\tcase 'TOKEN_EXPIRED':\n\t\t\t\tthis.setState({\n\t\t\t\t\ttokenExpired: true,\n\t\t\t\t\tisLoading: false,\n\t\t\t\t});\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error('unhandled error while setting new email:', error);\n\t\t\t\tthis.setState({\n\t\t\t\t\tisLoading: false,\n\t\t\t\t});\n\t\t}\n\t};\n\n\tcomponentDidMount() {\n\t\tconst {token} = this.getSearchParams();\n\t\tif (typeof token === 'string')\n\t\t\tchangeEmail(token)\n\t\t\t\t.then(() => {\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\tsuccess: true,\n\t\t\t\t\t\tisLoading: false,\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(error => this.onChangeEmailFailed(error));\n\t}\n\n\trender() {\n\t\tconst {isLoading, success, tokenExpired} = this.state;\n\t\treturn <LandingPage isLoading={isLoading} success={success} tokenExpired={tokenExpired} />;\n\t}\n}\n\nexport default withRouter(LandingPageContainer);\n","import {useState} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport Footer from 'components/page/footer/Footer';\nimport Logo from 'components/page/header/Logo';\nimport {type TFunction, Trans, useTranslation} from 'i18n';\nimport TextInput from '../../components/inputs/textInput/TextInput';\nimport {isEmail} from '../../utils/isEmail';\nimport type {MessageType} from './ForgotPassword';\n\ntype Props = {\n\tshowFeedback: boolean;\n\tfeedbackType: MessageType;\n\tfeedbackMessage: string;\n\tonSubmit: (values: any) => Promise<any>;\n};\n\nconst validateEmail = (values: any, t: TFunction): string => {\n\tif (values.email && values.email.length && !isEmail(values.email)) {\n\t\treturn t('forgotPassword.validation.email.format', {\n\t\t\tdefaultValue: 'Please enter a valid email',\n\t\t});\n\t}\n\n\treturn '';\n};\n\nexport const ForgotPasswordForm = ({onSubmit, showFeedback, feedbackType, feedbackMessage}: Props) => {\n\tconst {t} = useTranslation();\n\tconst [email, setEmail] = useState<string>('');\n\tconst [emailError, setEmailError] = useState<string>('');\n\tconst [submitting, setSubmitting] = useState<boolean>(false);\n\tconst isValid = email !== '' && !emailError;\n\n\tconst handleChangeEmail = (value: string) => {\n\t\tsetEmail(value);\n\t\tsetEmailError(validateEmail(value, t));\n\t};\n\n\tconst handleSubmit = () => {\n\t\tsetSubmitting(true);\n\n\t\ttry {\n\t\t\tonSubmit(email);\n\t\t} catch (_e) {\n\t\t\tsetSubmitting(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"di login\">\n\t\t\t<div className=\"wrap\">\n\t\t\t\t<div className=\"hold\">\n\t\t\t\t\t<Logo centered={true} />\n\t\t\t\t\t<div className=\"forgotpasswordinput\">\n\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\tvalue={email}\n\t\t\t\t\t\t\tonChange={handleChangeEmail}\n\t\t\t\t\t\t\terror={emailError}\n\t\t\t\t\t\t\tclassName=\"emailInput\"\n\t\t\t\t\t\t\tplaceholder={t('user.email', {\n\t\t\t\t\t\t\t\tdefaultValue: 'E-mail',\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\tautoCorrect=\"off\"\n\t\t\t\t\t\t\tautoCapitalize=\"off\"\n\t\t\t\t\t\t\tspellCheck=\"false\"\n\t\t\t\t\t\t\tautoFocus\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tprimary\n\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\tclassName=\"send\"\n\t\t\t\t\t\t\tonClick={handleSubmit}\n\t\t\t\t\t\t\tdisabled={!isValid || submitting}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Trans i18nKey=\"user.password.reset.send\">Send</Trans>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t\t{showFeedback && feedbackMessage && (\n\t\t\t\t\t\t<div className=\"msg\">\n\t\t\t\t\t\t\t<div className={feedbackType}>{feedbackMessage}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"forgot\">\n\t\t\t\t\t\t<Link to=\"/signin\">\n\t\t\t\t\t\t\t<Trans i18nKey=\"page.back.login\">Back to login</Trans>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<Footer />\n\t\t</div>\n\t);\n};\n","import {useState} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {triggerPasswordReset} from '@deviceinsight/ng-ui-api-client';\n\nimport {useTranslation} from 'i18n';\nimport {ForgotPasswordForm} from './ForgotPasswordForm';\nimport './forgotpassword.scss';\n\nexport type MessageType = 'success' | 'error' | '';\nexport const ForgotPassword = () => {\n\tconst {t} = useTranslation();\n\tconst history = useHistory();\n\tconst [showFeedback, setShowFeedback] = useState<boolean>(false);\n\tconst [feedbackType, setFeedbackType] = useState<MessageType>('');\n\tconst [feedbackMessage, setFeedbackMessage] = useState<string>('');\n\n\tconst handleSubmit = (email: string): Promise<any> => {\n\t\treturn triggerPasswordReset(email)\n\t\t\t.then(() => {\n\t\t\t\tsetTimeout(() => history.push('/signin'), 5 * 1000);\n\t\t\t\tsetShowFeedback(true);\n\t\t\t\tsetFeedbackType('success');\n\t\t\t\tsetFeedbackMessage(\n\t\t\t\t\tt('forgotPassword.info', {\n\t\t\t\t\t\tdefaultValue: 'A link will be sent to your E-Mail to change your password',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tsetShowFeedback(true);\n\t\t\t\tsetFeedbackType('error');\n\t\t\t\tsetFeedbackMessage(\n\t\t\t\t\tt('forgotPassword.error', {\n\t\t\t\t\t\tdefaultValue: 'A problem occurred while trying to reset your password',\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\t};\n\n\treturn (\n\t\t<ForgotPasswordForm\n\t\t\tshowFeedback={showFeedback}\n\t\t\tfeedbackType={feedbackType}\n\t\t\tfeedbackMessage={feedbackMessage}\n\t\t\tonSubmit={handleSubmit}\n\t\t/>\n\t);\n};\n","import * as React from 'react';\nimport {Link, type RouteComponentProps, withRouter} from 'react-router-dom';\n\nimport {readLegalPage} from '@deviceinsight/ng-ui-api-client';\nimport {ContentHeader} from '@deviceinsight/ng-ui-components';\n\nimport {Trans, type TranslationDescriptor} from 'i18n';\n\ntype Props = RouteComponentProps;\n\ntype State = {\n\textHtml: string;\n\tpageType: string;\n};\n\nconst PAGE_TYPE_IMPRINT = 'imprint';\nconst PAGE_TYPE_PRIVACY = 'privacy';\n\nclass Legals extends React.Component<Props, State> {\n\tstate = {\n\t\textHtml: '',\n\t\tpageType: '',\n\t};\n\n\tcomponentDidMount() {\n\t\tconst {location} = this.props;\n\t\tconst pathParts: Array<string> = location.pathname.split('/');\n\t\tconst legalPage = pathParts[pathParts.length - 1];\n\n\t\tif (legalPage !== 'imprint' && legalPage !== 'privacy') {\n\t\t\tthrow new Error(\"Wrong legalPage parameter. Should be 'imprint' or 'privacy'. Was \" + legalPage);\n\t\t}\n\n\t\treadLegalPage(legalPage)\n\t\t\t.then((extHtml: string) => {\n\t\t\t\tthis.setState({\n\t\t\t\t\textHtml,\n\t\t\t\t\tpageType: legalPage,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\tthis.setState({\n\t\t\t\t\textHtml: '',\n\t\t\t\t\tpageType: legalPage,\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tgetPageTypeTitle(): TranslationDescriptor {\n\t\tconst {pageType} = this.state;\n\n\t\tswitch (pageType) {\n\t\t\tcase PAGE_TYPE_IMPRINT:\n\t\t\t\treturn {\n\t\t\t\t\tid: 'legal.page.imprint',\n\t\t\t\t\tdefaultValue: 'Imprint / legal',\n\t\t\t\t};\n\n\t\t\tcase PAGE_TYPE_PRIVACY:\n\t\t\t\treturn {\n\t\t\t\t\tid: 'legal.page.privacy',\n\t\t\t\t\tdefaultValue: 'Privacy statement',\n\t\t\t\t};\n\n\t\t\tdefault:\n\t\t\t\treturn {\n\t\t\t\t\tid: '',\n\t\t\t\t\tdefaultValue: '',\n\t\t\t\t};\n\t\t}\n\t}\n\n\trender() {\n\t\tconst {extHtml} = this.state;\n\t\treturn (\n\t\t\t<div className=\"di legal\">\n\t\t\t\t<ContentHeader title={this.getPageTypeTitle()} />\n\t\t\t\t<hr />\n\t\t\t\t<div\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: extHtml,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<hr />\n\t\t\t\t<div className=\"foot-link\">\n\t\t\t\t\t<Link to=\"/\">\n\t\t\t\t\t\t<Trans i18nKey=\"page.back.login\">Back to Login</Trans>\n\t\t\t\t\t</Link>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n}\n\nexport default withRouter(Legals) as React.ComponentType;\n","import {\n\tfetchMe,\n\treadPaginationSettings,\n\trequestToken,\n\ttype User,\n\ttype UserPaginationSettings,\n} from '@deviceinsight/ng-ui-api-client';\n\nimport {INITIAL_PAGINATION_SETTINGS, type SetAuthenticatedUserType} from 'contexts/user/UserContext';\nimport {emitSigninEvent} from 'utils/eventBus';\nimport {deleteAuthInfo, storeAuthInfo} from '../authHelper';\n\nexport function signinSuccess(\n\tprincipal: string,\n\tuser: User,\n\tautoSignin: boolean,\n\tpaginationSettings: UserPaginationSettings,\n\tsetAuthenticatedUser: SetAuthenticatedUserType,\n): Promise<void> {\n\tsetAuthenticatedUser(principal, user, {\n\t\tsize: paginationSettings.size,\n\t});\n\treturn emitSigninEvent(user, autoSignin);\n}\nexport async function fetchPaginationSettings(): Promise<{\n\tsize: number;\n}> {\n\tlet paginationSettings;\n\n\ttry {\n\t\tpaginationSettings = await readPaginationSettings();\n\t} catch (_err) {\n\t\t// If the user did not change the pagination settings yet, the request will fail\n\t\tpaginationSettings = INITIAL_PAGINATION_SETTINGS;\n\t}\n\n\treturn paginationSettings;\n}\n\nexport async function signin(\n\tprincipal: string,\n\tpassword: string,\n\tautoSignin: boolean,\n\tsetAuthenticatedUser: SetAuthenticatedUserType,\n): Promise<void> {\n\ttry {\n\t\tconst authInfo = await requestToken(principal, password);\n\t\tstoreAuthInfo(authInfo);\n\t\tconst [me, paginationSettings] = await Promise.all([fetchMe(), fetchPaginationSettings()]);\n\t\tsetAuthenticatedUser(principal, me, paginationSettings);\n\t\treturn emitSigninEvent(me, autoSignin);\n\t} catch (error) {\n\t\tconsole.error('signin failed', error);\n\t\tdeleteAuthInfo();\n\t\tthrow error;\n\t}\n}\n","import type {FocusEventHandler} from 'react';\n\nimport FieldDecorator from 'components/inputs/FieldDecorator';\nimport {type TFunction, useTranslation} from 'i18n';\nimport type {PasswordError} from './SetPasswordForm';\n\ntype Props = {\n\terror: PasswordError | undefined;\n\tplaceholder: string;\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tonBlur: FocusEventHandler;\n};\n\nconst translateErrorCode = (error: PasswordError | undefined, t: TFunction): string | undefined => {\n\tswitch (error) {\n\t\tcase 'MINLENGTH':\n\t\t\treturn t('form.passwordField.error.minLength', {defaultValue: 'Password is too short'});\n\t\tcase 'DIGITS':\n\t\t\treturn t('form.passwordField.error.digits', {defaultValue: 'Must contain digits'});\n\t\tcase 'LOWERCASE':\n\t\t\treturn t('form.passwordField.error.lowercase', {defaultValue: 'Must contain lowercase characters'});\n\t\tcase 'UPPERCASE':\n\t\t\treturn t('form.passwordField.error.uppercase', {defaultValue: 'Must contain uppercase characters'});\n\t\tcase 'SPECIAL_CHARACTERS':\n\t\t\treturn t('form.passwordField.error.specialCharacters', {defaultValue: 'Must contain special characters'});\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n};\n\nexport const LoginPasswordInput = ({value, onChange, onBlur, placeholder, error}: Props) => {\n\tconst {t} = useTranslation();\n\treturn (\n\t\t<FieldDecorator error={translateErrorCode(error, t)}>\n\t\t\t<input\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={event => onChange(event.currentTarget.value)}\n\t\t\t\tonBlur={onBlur}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tclassName=\"passwordInput\"\n\t\t\t\ttype=\"password\"\n\t\t\t\tautoCorrect=\"off\"\n\t\t\t\tspellCheck=\"false\"\n\t\t\t/>\n\t\t</FieldDecorator>\n\t);\n};\n","import type {TFunction} from '../../i18n';\nimport {nonNull} from '../../utils/tsUtils';\nimport type {PasswordError} from './SetPasswordForm';\n\nexport const MINLENGTH_ERROR = 'MINLENGTH';\nexport const DIGITS_ERROR = 'DIGITS';\nexport const UPPERCASE_ERROR = 'UPPERCASE';\nexport const LOWERCASE_ERROR = 'LOWERCASE';\nexport const SPECIAL_CHARACTERS_ERROR = 'SPECIAL_CHARACTERS';\nexport const passwordMinLength = 8;\n\nexport const validatePasswordMinLength = (password: string): PasswordError | undefined => {\n\tif (password.length < passwordMinLength) {\n\t\treturn MINLENGTH_ERROR;\n\t}\n};\n\nexport const validatePasswordIncludesDigits = (password: string): PasswordError | undefined => {\n\tif (!/.*\\d/.test(password)) {\n\t\treturn DIGITS_ERROR;\n\t}\n};\n\nexport const validatePasswordUppercaseLetters = (password: string): PasswordError | undefined => {\n\tif (![...password].some(char => char.toLowerCase() !== char.toUpperCase() && char.toUpperCase() === char)) {\n\t\treturn UPPERCASE_ERROR;\n\t}\n};\n\nexport const validatePasswordLowercaseLetters = (password: string): PasswordError | undefined => {\n\tif (!/.*[a-z]/.test(password)) {\n\t\treturn LOWERCASE_ERROR;\n\t}\n};\n\nexport const validatePasswordSpecialCharacters = (password: string): PasswordError | undefined => {\n\tif (!/.*\\W/.test(password) && !password.includes('_')) {\n\t\treturn SPECIAL_CHARACTERS_ERROR;\n\t}\n};\n\nexport function validatePassword(password: string): string[] {\n\treturn [\n\t\tvalidatePasswordMinLength,\n\t\tvalidatePasswordIncludesDigits,\n\t\tvalidatePasswordUppercaseLetters,\n\t\tvalidatePasswordLowercaseLetters,\n\t\tvalidatePasswordSpecialCharacters,\n\t]\n\t\t.map(validateFn => validateFn(password) as string)\n\t\t.filter(nonNull);\n}\n\nexport const validateConfirmPasswordMatches = (\n\tpassword: string,\n\tconfirmPassword: string,\n\tt: TFunction,\n): string | undefined => {\n\tif (password !== confirmPassword) {\n\t\treturn t('setPassword.formFields.confirmPassword.mustMatch', {\n\t\t\tdefaultValue: 'Passwords do not match',\n\t\t});\n\t}\n};\n","import classnames from 'classnames';\n\nimport {Bubble} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans, useTranslation} from 'i18n';\nimport {\n\tDIGITS_ERROR,\n\tLOWERCASE_ERROR,\n\tMINLENGTH_ERROR,\n\tpasswordMinLength,\n\tSPECIAL_CHARACTERS_ERROR,\n\tUPPERCASE_ERROR,\n\tvalidatePassword,\n} from './validation';\n\ntype Props = {\n\tpassword: string;\n};\nexport default function PasswordPolicy({password}: Props) {\n\tconst {t} = useTranslation();\n\tconst passwordErrors = validatePassword(password);\n\treturn (\n\t\t<ul className=\"pw-policy\">\n\t\t\t<li\n\t\t\t\tclassName={classnames({\n\t\t\t\t\tcompleted: !passwordErrors.includes(MINLENGTH_ERROR),\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t{t('form.passwordField.minLength', {\n\t\t\t\t\tlength: passwordMinLength,\n\t\t\t\t\tdefaultValue: 'At least {{length}} characters ',\n\t\t\t\t})}\n\t\t\t</li>\n\t\t\t<li\n\t\t\t\tclassName={classnames({\n\t\t\t\t\tcompleted: !passwordErrors.includes(UPPERCASE_ERROR),\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<Trans i18nKey=\"form.passwordField.uppercase\">Upper case letter</Trans>\n\t\t\t</li>\n\t\t\t<li\n\t\t\t\tclassName={classnames({\n\t\t\t\t\tcompleted: !passwordErrors.includes(LOWERCASE_ERROR),\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<Trans i18nKey=\"form.passwordField.lowercase\">Lower case letter</Trans>\n\t\t\t</li>\n\t\t\t<li\n\t\t\t\tclassName={classnames({\n\t\t\t\t\tcompleted: !passwordErrors.includes(SPECIAL_CHARACTERS_ERROR),\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<Bubble\n\t\t\t\t\tcontent={<Trans i18nKey=\"form.passwordField.specialsAsciiOnly\">Without language specials</Trans>}\n\t\t\t\t>\n\t\t\t\t\t<Trans i18nKey=\"form.passwordField.special\">Special character</Trans>\n\t\t\t\t\t \n\t\t\t\t\t<span\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\tcursor: 'pointer',\n\t\t\t\t\t\t\tcolor: 'blue',\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t(?)\n\t\t\t\t\t</span>\n\t\t\t\t</Bubble>\n\t\t\t</li>\n\t\t\t<li\n\t\t\t\tclassName={classnames({\n\t\t\t\t\tcompleted: !passwordErrors.includes(DIGITS_ERROR),\n\t\t\t\t})}\n\t\t\t>\n\t\t\t\t<Trans i18nKey=\"form.passwordField.digits\">Number</Trans>\n\t\t\t</li>\n\t\t</ul>\n\t);\n}\n","import {Controller, useForm} from 'react-hook-form';\nimport {Link} from 'react-router-dom';\n\nimport Logo from 'components/page/header/Logo';\nimport {Trans, useTranslation} from 'i18n';\nimport TextInput from '../../components/inputs/textInput/TextInput';\nimport {LoginPasswordInput} from './LoginPasswordInput';\nimport PasswordPolicy from './PasswordPolicy';\nimport {\n\tvalidateConfirmPasswordMatches,\n\tvalidatePasswordIncludesDigits,\n\tvalidatePasswordLowercaseLetters,\n\tvalidatePasswordMinLength,\n\tvalidatePasswordSpecialCharacters,\n\tvalidatePasswordUppercaseLetters,\n} from './validation';\n\ntype Props = {\n\ttokenError: TokenError | null | undefined;\n\trequestFailed?: boolean;\n\tonSubmit: (passwordSubmitObject: {password: string; passwordConfirm: string}) => Promise<void>;\n\tusername?: string | null | undefined;\n};\n\nexport type MessageTokenExpired = 'TOKEN_EXPIRED';\nexport type MessageTokenInvalid = 'TOKEN_INVALID';\nexport type TokenError = MessageTokenExpired | MessageTokenInvalid;\nexport type PasswordError = 'MINLENGTH' | 'DIGITS' | 'UPPERCASE' | 'LOWERCASE' | 'SPECIAL_CHARACTERS' | '';\n\nexport type SetPasswordFormData = {\n\tpassword: string;\n\tpasswordConfirm: string;\n};\n\nexport const SetPasswordForm = ({tokenError, requestFailed, username, onSubmit}: Props) => {\n\tconst {t} = useTranslation();\n\tconst {\n\t\thandleSubmit,\n\t\tformState: {isSubmitting},\n\t\tcontrol,\n\t\tgetValues,\n\t} = useForm<SetPasswordFormData>({\n\t\tdefaultValues: {password: '', passwordConfirm: ''},\n\t});\n\n\tfunction submit(): Promise<void> {\n\t\treturn handleSubmit(onSubmit, errors => {\n\t\t\tconsole.warn('Validation error', errors);\n\t\t})();\n\t}\n\n\treturn (\n\t\t<form className=\"di login\" onSubmit={e => e.preventDefault()}>\n\t\t\t<div className=\"wrap\">\n\t\t\t\t<div className=\"hold\">\n\t\t\t\t\t<Logo centered={true} />\n\t\t\t\t\t<div className=\"headline\">\n\t\t\t\t\t\t<Trans i18nKey=\"setPassword.username\">User</Trans>\n\t\t\t\t\t\t{': '}\n\t\t\t\t\t\t<span>{username}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"loginpasswordinput\">\n\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\tvalidate: {\n\t\t\t\t\t\t\t\t\tminLength: validatePasswordMinLength,\n\t\t\t\t\t\t\t\t\tincludesDigits: validatePasswordIncludesDigits,\n\t\t\t\t\t\t\t\t\tuppercase: validatePasswordUppercaseLetters,\n\t\t\t\t\t\t\t\t\tlowercase: validatePasswordLowercaseLetters,\n\t\t\t\t\t\t\t\t\tspecialChars: validatePasswordSpecialCharacters,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\trender={({field: {value, onChange, onBlur}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t<LoginPasswordInput\n\t\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\t\t\t\t\terror={error?.message as PasswordError | undefined}\n\t\t\t\t\t\t\t\t\t\tplaceholder={t('setPassword.formFields.password', {\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'New password',\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t<PasswordPolicy password={value} />\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\tname=\"passwordConfirm\"\n\t\t\t\t\t\t\tcontrol={control}\n\t\t\t\t\t\t\trules={{\n\t\t\t\t\t\t\t\trequired: t('setPassword.formFields.confirmPassword.mustBeSet', {\n\t\t\t\t\t\t\t\t\tdefaultValue: 'Please confirm new password',\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\tvalidate: passwordConfirm =>\n\t\t\t\t\t\t\t\t\tvalidateConfirmPasswordMatches(getValues('password'), passwordConfirm, t),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\trender={({field: {value, onChange, onBlur}, fieldState: {error}}) => (\n\t\t\t\t\t\t\t\t<TextInput\n\t\t\t\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\t\t\t\tonChange={onChange}\n\t\t\t\t\t\t\t\t\tonBlur={onBlur}\n\t\t\t\t\t\t\t\t\terror={error?.message}\n\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\tclassName=\"passwordConfirmInput\"\n\t\t\t\t\t\t\t\t\tplaceholder={t('setPassword.formFields.confirmPassword.actionName', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Confirm new password',\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<button className=\"di button primary send\" onClick={submit} title=\"\" disabled={isSubmitting}>\n\t\t\t\t\t\t\t<Trans i18nKey=\"setPassword.button.changePassword\">Change Password</Trans>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"msg\">\n\t\t\t\t\t\t{requestFailed && (\n\t\t\t\t\t\t\t<div className=\"error\">\n\t\t\t\t\t\t\t\t<Trans i18nKey=\"setPassword.request.failed\">\n\t\t\t\t\t\t\t\t\tA problem occurred while submitting your new password\n\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div className=\"msg\">\n\t\t\t\t\t\t{tokenError && (\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div className=\"error\">\n\t\t\t\t\t\t\t\t\t{tokenError === 'TOKEN_EXPIRED' && (\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"setPassword.tokenExpired\">\n\t\t\t\t\t\t\t\t\t\t\tYour password reset link has expired\n\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t{tokenError === 'TOKEN_INVALID' && (\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"setPassword.tokenInvalid\">\n\t\t\t\t\t\t\t\t\t\t\tYour password reset link is invalid\n\t\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"forgot\">\n\t\t\t\t\t\t\t\t\t<Link to=\"/forgotpassword\">\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"setPassword.resendEmail\">Resend Password Reset Email</Trans>\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</form>\n\t);\n};\n","import qs from 'qs';\nimport {useContext, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport {setUserPassword} from '@deviceinsight/ng-ui-api-client';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport {signin} from 'modules/users/actions/signin';\nimport {SetPasswordForm, type SetPasswordFormData, type TokenError} from './SetPasswordForm';\n\nimport './setpassword.scss';\n\nexport const SetPassword = () => {\n\tconst {setAuthenticatedUser} = useContext(UserContext);\n\tconst history = useHistory();\n\tconst location = useLocation();\n\tconst [tokenError, setTokenError] = useState<TokenError | null | undefined>(null);\n\tconst {token, username} = qs.parse(location.search.substring(1));\n\n\tconst handleSubmit = ({password}: SetPasswordFormData): Promise<void> => {\n\t\tif (!token) {\n\t\t\tconsole.error('change password: could not retrieve token from url');\n\t\t\treturn Promise.reject();\n\t\t} else if (!username) {\n\t\t\tconsole.error('change password: could not retrieve username from url');\n\t\t\treturn Promise.reject();\n\t\t}\n\n\t\treturn setUserPassword(token as string, password)\n\t\t\t.then(() => signin(username as string, password, false, setAuthenticatedUser))\n\t\t\t.then(() => history.push('/'))\n\t\t\t.catch(error => {\n\t\t\t\tconst backendMessage = error.response.data.message;\n\n\t\t\t\tif (['TOKEN_EXPIRED', 'TOKEN_INVALID'].includes(backendMessage)) {\n\t\t\t\t\tsetTokenError(backendMessage);\n\t\t\t\t} else {\n\t\t\t\t\tconst msg = 'change password: unhandled error while setting password:';\n\t\t\t\t\tmessageBoxError(`${msg} ${backendMessage}`);\n\t\t\t\t\tconsole.error(msg, error);\n\t\t\t\t}\n\t\t\t});\n\t};\n\n\treturn <SetPasswordForm username={username as string} tokenError={tokenError} onSubmit={handleSubmit} />;\n};\n","export const isUrlAbsolute = (url: string): boolean => /^(?:[a-z0-9]+:)?\\/\\/.*/i.test(url);\n","import {type PropsWithChildren, type ReactNode, useEffect, useState} from 'react';\n\nimport {CustomLoginPageElementsContext} from './CustomLoginPageElementsContext';\nimport {\n\ttype CustomLoginPageElementsChangeListener,\n\tgetCustomLoginPageElements,\n\tregisterCustomLoginPageElementsChange,\n\tunregisterCustomLoginPageElementsChange,\n} from './setCustomLoginPageElement';\nexport function CustomLoginPageElementsContextProvider({children}: PropsWithChildren) {\n\tconst [aboveForm, setAboveForm] = useState<ReactNode | null>(getCustomLoginPageElements().aboveForm);\n\tconst [belowForm, setBelowForm] = useState<ReactNode | null>(getCustomLoginPageElements().belowForm);\n\tconst [belowLoginButton, setBelowLoginButton] = useState<ReactNode | null>(\n\t\tgetCustomLoginPageElements().belowLoginButton,\n\t);\n\tconst [nextToLoginButton, setNextToLoginButton] = useState<ReactNode | null>(\n\t\tgetCustomLoginPageElements().nextToLoginButton,\n\t);\n\n\tuseEffect(() => {\n\t\tconst listener: CustomLoginPageElementsChangeListener = ({position, element}) => {\n\t\t\tswitch (position) {\n\t\t\t\tcase 'aboveForm':\n\t\t\t\t\tsetAboveForm(element);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'belowForm':\n\t\t\t\t\tsetBelowForm(element);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'belowLoginButton':\n\t\t\t\t\tsetBelowLoginButton(element);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'nextToLoginButton':\n\t\t\t\t\tsetNextToLoginButton(element);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t};\n\t\tregisterCustomLoginPageElementsChange(listener);\n\t\treturn () => unregisterCustomLoginPageElementsChange(listener);\n\t}, []);\n\n\treturn (\n\t\t<CustomLoginPageElementsContext.Provider\n\t\t\tvalue={{\n\t\t\t\taboveForm,\n\t\t\t\tbelowForm,\n\t\t\t\tbelowLoginButton,\n\t\t\t\tnextToLoginButton,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</CustomLoginPageElementsContext.Provider>\n\t);\n}\n","import {Link} from 'react-router-dom';\n\nimport {Trans} from 'i18n';\n\nconst LegalsLinks = () => {\n\treturn (\n\t\t<div className=\"di imprint\">\n\t\t\t<span className=\"link\">\n\t\t\t\t<Link to=\"/legals/imprint\">\n\t\t\t\t\t<Trans i18nKey=\"legal.link.imprint\">Imprint / legal</Trans>\n\t\t\t\t</Link>\n\t\t\t</span>\n\t\t\t<span>\n\t\t\t\t<Link to=\"/legals/privacy\">\n\t\t\t\t\t<Trans i18nKey=\"legal.link.privacy\">Privacy statement</Trans>\n\t\t\t\t</Link>\n\t\t\t</span>\n\t\t</div>\n\t);\n};\n\nexport default LegalsLinks;\n","import {useEffect, useState} from 'react';\n\nimport {Trans} from 'i18n';\n\ntype Props = {\n\tonDone: () => void;\n\tseconds: number;\n};\n\nexport function CountDown({onDone, seconds: initialSeconds}: Props) {\n\tconst [seconds, setSeconds] = useState<number>(initialSeconds);\n\n\tuseEffect(() => {\n\t\tconst startMs = Date.now();\n\t\tconst intervalId = setInterval(() => {\n\t\t\tconst elapsedMs = Date.now() - startMs;\n\t\t\tif (elapsedMs > initialSeconds * 1000) {\n\t\t\t\tsetSeconds(0);\n\t\t\t\tclearInterval(intervalId);\n\t\t\t\tonDone();\n\t\t\t} else {\n\t\t\t\tsetSeconds(initialSeconds - elapsedMs / 1000);\n\t\t\t}\n\t\t}, 200);\n\n\t\treturn () => {\n\t\t\tclearInterval(intervalId);\n\t\t};\n\t}, [onDone, initialSeconds]);\n\n\tif (seconds === 0) return null;\n\treturn (\n\t\t<Trans i18nKey=\"signin.signinForm.countDown\" count={Math.floor(seconds)}>\n\t\t\tTry again in {{count: Math.floor(seconds)}} seconds.\n\t\t</Trans>\n\t);\n}\n","import {kebabCase} from 'lodash';\n\nimport type {AuthorizationServerOption} from '@deviceinsight/ng-ui-api-client';\n\nimport {Trans} from 'i18n';\n\ntype Props = {\n\tauthorizationServers?: AuthorizationServerOption[];\n};\n\nexport const SingleSignOn = ({authorizationServers}: Props) => {\n\treturn authorizationServers && authorizationServers.length ? (\n\t\t<div className=\"sso\">\n\t\t\t<div className=\"or\">\n\t\t\t\t<Trans i18nKey=\"signin.signinForm.or\">or</Trans>\n\t\t\t</div>\n\t\t\t{authorizationServers.map(authServer => (\n\t\t\t\t<a href={authServer.authorizationUri} className=\"sso-link\" key={authServer.name}>\n\t\t\t\t\t<span className={`sso-icon ${kebabCase(authServer.displayName || authServer.name)}`} />\n\t\t\t\t\t<span className=\"sso-name\">\n\t\t\t\t\t\t<Trans i18nKey=\"signin.signinForm.loginWith\">Login with</Trans>\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tclassName=\"sso-target\"\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tmarginLeft: 5,\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{authServer.displayName || authServer.name}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</span>\n\t\t\t\t</a>\n\t\t\t))}\n\t\t</div>\n\t) : null;\n};\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {type AuthorizationServerOption, fetchAuthorizationOptions} from '@deviceinsight/ng-ui-api-client';\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport Footer from 'components/page/footer/Footer';\nimport Logo from 'components/page/header/Logo';\nimport {CustomLoginPageElementsContext} from 'customization/contexts/customLoginPageElements/CustomLoginPageElementsContext';\nimport {CustomLoginPageElementsContextProvider} from 'customization/contexts/customLoginPageElements/CustomLoginPageElementsContextProvider';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans, type TranslationDescriptor, useTranslation} from 'i18n';\nimport LegalsLinks from '../legals/LegalsLinks';\nimport {CountDown} from './CountDown';\nimport {SingleSignOn} from './SingleSignOn';\n\ntype Props = {\n\tonSubmit: (username: string, password: string) => any;\n\tauthenticating: boolean;\n\tauthenticationFailed: boolean;\n\tauthenticationErrorResponseCode: number | null | undefined;\n};\n\nconst errorCodeTranslations: Record<string, TranslationDescriptor> = {\n\t'400': {\n\t\tid: 'signin.signinForm.wrongUsernamePassword',\n\t\tdefaultValue: 'Wrong Username or Password.',\n\t},\n\t'429': {\n\t\tid: 'signin.signinForm.rateLimitExeeded',\n\t\tdefaultValue: 'Too many login attempts.',\n\t},\n\tother: {\n\t\tid: 'signin.signinForm.backendUnavailable',\n\t\tdefaultValue: 'The platform is currently not available. Please try again in a few minutes.',\n\t},\n};\n\nexport function SigninForm({onSubmit, authenticating, authenticationFailed, authenticationErrorResponseCode}: Props) {\n\tconst [authorizationServers, setAuthorizationServers] = useState<AuthorizationServerOption[]>([]);\n\tconst [displayLegalLinks, setDisplayLegalLinks] = useState(false);\n\tconst {t} = useTranslation();\n\tconst usernameInputRef = useRef<HTMLInputElement>(null);\n\tconst passwordInputRef = useRef<HTMLInputElement>(null);\n\tconst cursor = authenticating ? 'progress' : 'auto';\n\n\tuseEffect(() => {\n\t\tfetchAuthorizationOptions()\n\t\t\t.then(({authorizationServers}) => {\n\t\t\t\tsetAuthorizationServers(authorizationServers);\n\t\t\t\tsetDisplayLegalLinks(UIConfiguration.hasLegalPages());\n\t\t\t})\n\t\t\t.catch(() => {\n\t\t\t\t/* never mind: just render without sso. */\n\t\t\t\tsetDisplayLegalLinks(UIConfiguration.hasLegalPages());\n\t\t\t});\n\t}, []);\n\n\tfunction handleSubmit() {\n\t\tif (usernameInputRef.current && passwordInputRef.current) {\n\t\t\tconst username = usernameInputRef.current.value.trim();\n\t\t\tconst password = passwordInputRef.current.value;\n\t\t\tonSubmit(username, password);\n\t\t}\n\t}\n\n\tfunction getErrorMessage() {\n\t\tconst translation =\n\t\t\terrorCodeTranslations[authenticationErrorResponseCode || 'other'] || errorCodeTranslations.other;\n\t\treturn t(translation.id, {\n\t\t\tdefaultValue: translation.defaultValue,\n\t\t});\n\t}\n\n\tconst [rateLimitExceeded, setRateLimitExeeded] = useState(false);\n\n\tconst handleCountDownDone = useCallback(() => {\n\t\tsetRateLimitExeeded(false);\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (authenticationErrorResponseCode === 429) {\n\t\t\tsetRateLimitExeeded(true);\n\t\t}\n\t}, [authenticationErrorResponseCode]);\n\n\tconst usernamePlaceholder =\n\t\tUIConfiguration.getAccountCreationPrinciple() === 'username'\n\t\t\t? t('signin.signinForm.username', {\n\t\t\t\t\tdefaultValue: 'Username',\n\t\t\t\t})\n\t\t\t: t('signin.signinForm.email', {\n\t\t\t\t\tdefaultValue: 'E-mail',\n\t\t\t\t});\n\n\treturn (\n\t\t<CustomLoginPageElementsContextProvider>\n\t\t\t<CustomLoginPageElementsContext.Consumer>\n\t\t\t\t{extensions => (\n\t\t\t\t\t<div className=\"di login\" style={{cursor}}>\n\t\t\t\t\t\t<div className=\"wrap\">\n\t\t\t\t\t\t\t<div className=\"hold\" data-testid=\"form-wrapper\">\n\t\t\t\t\t\t\t\t<Logo centered={true} />\n\t\t\t\t\t\t\t\t{extensions.aboveForm}\n\t\t\t\t\t\t\t\t<form\n\t\t\t\t\t\t\t\t\tclassName=\"di form\"\n\t\t\t\t\t\t\t\t\tonSubmit={e => {\n\t\t\t\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\t\t\t\thandleSubmit();\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tdata-testid=\"form\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tref={usernameInputRef}\n\t\t\t\t\t\t\t\t\t\tname=\"username\"\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\ttitle={usernamePlaceholder}\n\t\t\t\t\t\t\t\t\t\tplaceholder={usernamePlaceholder}\n\t\t\t\t\t\t\t\t\t\tautoCorrect=\"off\"\n\t\t\t\t\t\t\t\t\t\tautoCapitalize=\"off\"\n\t\t\t\t\t\t\t\t\t\tspellCheck=\"false\"\n\t\t\t\t\t\t\t\t\t\tstyle={{cursor}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\tref={passwordInputRef}\n\t\t\t\t\t\t\t\t\t\tname=\"password\"\n\t\t\t\t\t\t\t\t\t\ttype=\"password\"\n\t\t\t\t\t\t\t\t\t\ttitle={t('signin.signinForm.password', {\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Password',\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\tplaceholder={t('signin.signinForm.password', {\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: 'Password',\n\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\tstyle={{cursor}}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<div className=\"buttons\" data-testid=\"login-button-wrapper\">\n\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\tprimary\n\t\t\t\t\t\t\t\t\t\t\ttype=\"submit\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"send\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={authenticating || rateLimitExceeded}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\t\t\t\tcursor: authenticating ? 'progress' : 'pointer',\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"signin.signinForm.login\">Login</Trans>\n\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t{extensions.nextToLoginButton}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t{extensions.belowLoginButton}\n\t\t\t\t\t\t\t\t</form>\n\t\t\t\t\t\t\t\t<div className=\"msg\">\n\t\t\t\t\t\t\t\t\t{authenticationFailed && (\n\t\t\t\t\t\t\t\t\t\t<div className=\"error\">\n\t\t\t\t\t\t\t\t\t\t\t{getErrorMessage()}\n\t\t\t\t\t\t\t\t\t\t\t{rateLimitExceeded && (\n\t\t\t\t\t\t\t\t\t\t\t\t<CountDown onDone={handleCountDownDone} seconds={60} />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div className=\"forgot\">\n\t\t\t\t\t\t\t\t\t<Link to=\"/forgotpassword\">\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"signin.signinForm.forgotPassword\">Forgot Password?</Trans>\n\t\t\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t{displayLegalLinks && <LegalsLinks />}\n\t\t\t\t\t\t\t\t<SingleSignOn authorizationServers={authorizationServers} />\n\t\t\t\t\t\t\t\t{extensions.belowForm}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<Footer />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</CustomLoginPageElementsContext.Consumer>\n\t\t</CustomLoginPageElementsContextProvider>\n\t);\n}\n","import {useContext, useEffect, useState} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {type AuthInfo, fetchMe} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport {GlobalResourcesContext} from 'contexts/globalResources/GlobalResourcesContext';\nimport {type SetAuthenticatedUserType, UserContext} from 'contexts/user/UserContext';\nimport {fetchPaginationSettings, signin, signinSuccess} from 'modules/users/actions/signin';\nimport {deleteAuthInfo, readRedirectLocation, retrieveAuthInfo} from 'modules/users/authHelper';\nimport {getStartPage} from 'modules/users/startpage';\nimport {isUrlAbsolute} from 'utils/urlUtils';\nimport './Signin.scss';\n\nimport {SigninForm} from './SigninForm';\n\ntype RouterHistory = ReturnType<typeof useHistory>;\n\nfunction storeOAuthCallbackUrl() {\n\ttry {\n\t\tconst params = new URLSearchParams(window.location.search);\n\t\tconst callbackUrl = params.get('oauth_callback');\n\n\t\tif (callbackUrl && !isUrlAbsolute(callbackUrl)) {\n\t\t\tlocalStorage.setItem('OAUTH2_CALLBACK_URL', callbackUrl);\n\t\t}\n\t} catch (e) {\n\t\tconsole.error('Failed to store redirect location from query string', e);\n\t}\n}\n\nasync function tryAutoSignin(\n\thistory: RouterHistory,\n\tsetWaitingForAutoSignin: (arg0: boolean) => void,\n\tsetAuthenticatedUser: SetAuthenticatedUserType,\n) {\n\tsetWaitingForAutoSignin(true);\n\n\ttry {\n\t\tconst authInfo = await retrieveAuthInfo();\n\t\t// prefetch start page, speedup login\n\t\t// also avoids shortly visible rendering of initial page and then redirect to other page\n\t\tconst [user, paginationSettings] = await Promise.all([fetchMe(), fetchPaginationSettings(), getStartPage()]);\n\t\tawait signinSuccess(authInfo.principal, user, true, paginationSettings, setAuthenticatedUser);\n\t\tdoRedirect(history, authInfo);\n\t} catch (err) {\n\t\tconsole.error('auto signin failed', err);\n\t\tawait deleteAuthInfo();\n\t} finally {\n\t\tsetWaitingForAutoSignin(false);\n\t}\n}\n\nfunction doRedirect(history: RouterHistory, authInfo: AuthInfo | null | undefined) {\n\tconst redirectLocation = readRedirectLocation();\n\n\tif (redirectLocation) {\n\t\tif (redirectLocation.pathname && redirectLocation.pathname.startsWith('/api/v2/oauth/authorize') && authInfo) {\n\t\t\tconst url =\n\t\t\t\tredirectLocation.pathname +\n\t\t\t\t(redirectLocation.search || '') +\n\t\t\t\t'&access_token=' +\n\t\t\t\tencodeURIComponent(authInfo.accessToken);\n\t\t\twindow.location.replace(url);\n\t\t} else {\n\t\t\thistory.push(redirectLocation as any);\n\t\t}\n\t} else {\n\t\tgetStartPage().then(url => history.push(url));\n\t}\n}\n\nexport default function Signin() {\n\tconst history = useHistory();\n\tconst {resetGlobalResources} = useContext(GlobalResourcesContext);\n\tconst {user, authenticated, afterSignout, setAuthenticatedUser} = useContext(UserContext);\n\tconst [waitingForAutoSignin, setWaitingForAutoSignin] = useState<boolean>(false);\n\tconst [authenticating, setAuthenticating] = useState<boolean>(false);\n\tconst [authenticationFailed, setAuthenticationFailed] = useState<boolean>(false);\n\tconst [authenticationErrorResponseCode, setAuthenticationErrorResponseCode] = useState<number>(-1);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tstoreOAuthCallbackUrl();\n\t\tresetGlobalResources();\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif (authenticated && user) {\n\t\t\tretrieveAuthInfo().then(authInfo => doRedirect(history, authInfo));\n\t\t} else if (!afterSignout) {\n\t\t\ttryAutoSignin(history, setWaitingForAutoSignin, setAuthenticatedUser);\n\t\t}\n\t}, [history, authenticated, afterSignout, user, setAuthenticatedUser]);\n\n\tasync function handleSubmit(username: string, password: string) {\n\t\tsetAuthenticating(true);\n\t\tsetAuthenticationFailed(false);\n\n\t\ttry {\n\t\t\tawait signin(username, password, false, setAuthenticatedUser);\n\t\t} catch (error: any) {\n\t\t\tsetAuthenticationFailed(true);\n\t\t\tsetAuthenticationErrorResponseCode(error.response ? error.response.status : 404);\n\t\t} finally {\n\t\t\tsetAuthenticating(false);\n\t\t}\n\t}\n\n\tif (waitingForAutoSignin) {\n\t\treturn <Spinner center />;\n\t} else {\n\t\treturn (\n\t\t\t<SigninForm\n\t\t\t\tonSubmit={handleSubmit}\n\t\t\t\tauthenticating={authenticating}\n\t\t\t\tauthenticationFailed={authenticationFailed}\n\t\t\t\tauthenticationErrorResponseCode={authenticationErrorResponseCode}\n\t\t\t/>\n\t\t);\n\t}\n}\n","import type * as React from 'react';\nimport './Header.scss';\n\nexport default function Header({children}: React.PropsWithChildren<unknown>) {\n\treturn <div className=\"di floor-1\">{children}</div>;\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='16'%20height='16'%20viewBox='0%200%2016%2016'%3e%3cpath%20id='star'%20d='M8,0l2.45,4.97,5.55,.76-4.04,3.83,.99,5.44-4.94-2.61-4.94,2.61,.99-5.44L0,5.73l5.55-.76L8,0Z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20data-name='icon_timeMachine'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%3e%3cpath%20id='Uhr'%20d='M12.5,2A10.49,10.49,0,0,0,2.31,10H4.36a8.52,8.52,0,1,1,0,5H2.31A10.5,10.5,0,1,0,12.5,2Z'/%3e%3cg%20id='Zeiger'%3e%3crect%20id='unten'%20x='12.79'%20y='12.32'%20width='2'%20height='5.72'%20transform='translate(34.3%2015.18)%20rotate(132.25)'/%3e%3crect%20id='oben'%20x='11'%20y='7'%20width='2'%20height='7'/%3e%3c/g%3e%3cg%20id='Pfeilende'%3e%3cpath%20d='M0,12H7.05S0,5,0,5Z'/%3e%3c/g%3e%3c/svg%3e\"","import {createContext} from 'react';\n\ntype CurrentPageTitleContextType = {\n\tcurrentPageTitle: string;\n\tsetCurrentPageTitle: (title: string) => void;\n};\n\nexport const CurrentPageTitleContext = createContext<CurrentPageTitleContextType>({\n\tcurrentPageTitle: '',\n\tsetCurrentPageTitle: () => {},\n});\n","import {useEffect, useState} from 'react';\n\nexport function usePortalRoot(parentSelector?: string, className?: string) {\n\tconst [div, setDiv] = useState<HTMLDivElement>();\n\n\tuseEffect(() => {\n\t\tconst div = document.createElement('div');\n\t\tif (className) {\n\t\t\tdiv.classList.add(...className.split(' '));\n\t\t}\n\t\tconst parent = (parentSelector ? document.querySelector(parentSelector) : null) ?? document.body;\n\t\tif (parent) {\n\t\t\tparent.appendChild(div);\n\t\t}\n\t\tsetDiv(div);\n\t\treturn () => {\n\t\t\tif (parent) {\n\t\t\t\tparent.removeChild(div);\n\t\t\t}\n\t\t};\n\t}, [className, parentSelector]);\n\n\treturn div;\n}\n","import type {PropsWithChildren} from 'react';\nimport {createPortal} from 'react-dom';\n\nimport {usePortalRoot} from 'hooks/usePortalRoot';\n\ntype Props = {className?: string};\n\nexport function FloatingPanelPortal({children, className}: PropsWithChildren<Props>) {\n\tconst rootNode = usePortalRoot('.di.app-wrapper');\n\tif (!rootNode) return null;\n\treturn createPortal(<div className={className}>{children}</div>, rootNode);\n}\n","import {useEffect, useReducer} from 'react';\n\ntype State = 'closed' | 'closing' | 'open' | 'pre-opening' | 'opening';\ntype Action = 'open' | 'close' | 'timeout';\n\nconst reducer = (state: State, action: Action): State => {\n\tif (state === 'closed' && action === 'open') return 'pre-opening';\n\tif (state === 'pre-opening' && action === 'timeout') return 'opening';\n\tif (state === 'opening' && action === 'timeout') return 'open';\n\tif (state === 'open' && action === 'close') return 'closing';\n\tif (state === 'closing' && action === 'timeout') return 'closed';\n\n\treturn state;\n};\n\nexport function useFadeAnimation(open: boolean): State {\n\tconst [state, dispatch] = useReducer(reducer, 'closed');\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\tdispatch('open');\n\t\t\tsetTimeout(() => dispatch('timeout'), 50);\n\t\t\tsetTimeout(() => dispatch('timeout'), 300);\n\t\t} else {\n\t\t\tdispatch('close');\n\t\t\tsetTimeout(() => dispatch('timeout'), 300);\n\t\t}\n\t}, [open]);\n\n\treturn state;\n}\n","import cx from 'classnames';\nimport {type PropsWithChildren, useCallback} from 'react';\n\nimport useOutsideClick from 'hooks/useOutsideClick';\nimport {FloatingPanelPortal} from './FloatingPanelPortal';\nimport {useFadeAnimation} from './useFadeAnimation';\nimport './FloatingPanel.scss';\n\ntype Props = {\n\tclassName?: string;\n\tvisible: boolean;\n\tonHide: () => void;\n};\n\nexport function FloatingPanel({className, visible, onHide, children}: PropsWithChildren<Props>) {\n\tconst animationState = useFadeAnimation(visible);\n\n\tconst {ref} = useOutsideClick(\n\t\tuseCallback(() => {\n\t\t\tif (visible) {\n\t\t\t\tonHide();\n\t\t\t}\n\t\t}, [visible, onHide]),\n\t);\n\n\treturn (\n\t\t<FloatingPanelPortal className={cx(className, 'di floating-panel-portal', {open: animationState !== 'closed'})}>\n\t\t\t<div\n\t\t\t\t// @ts-expect-error\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cx('floating-panel-portal-content', animationState)}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t</FloatingPanelPortal>\n\t);\n}\n","export default \"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='UTF-8'?%3e%3csvg%20id='icon_drag'%20xmlns='http://www.w3.org/2000/svg'%20width='6'%20height='10'%20viewBox='0%200%206%2010'%3e%3cg%20id='Btn_drag'%20data-name='Btn%20drag'%3e%3crect%20id='Rectangle_7'%20data-name='Rectangle%207'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3crect%20id='Rectangle_8'%20data-name='Rectangle%208'%20x='4'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3crect%20id='Rectangle_9'%20data-name='Rectangle%209'%20y='4'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3crect%20id='Rectangle_10'%20data-name='Rectangle%2010'%20x='4'%20y='4'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3crect%20id='Rectangle_11'%20data-name='Rectangle%2011'%20y='8'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3crect%20id='Rectangle_12'%20data-name='Rectangle%2012'%20x='4'%20y='8'%20width='2'%20height='2'%20style='fill:%20%23666;'/%3e%3c/g%3e%3c/svg%3e\"","import {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport TextInput from 'components/inputs/textInput/TextInput';\nimport {Trans} from 'i18n';\n\ntype Props = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\tonCancel: () => void;\n\tonSave: () => void;\n};\n\nexport function EditedNameInput({value, onChange, onCancel, onSave}: Props) {\n\treturn (\n\t\t<form\n\t\t\tclassName=\"edited-name-wrapper\"\n\t\t\tonSubmit={e => {\n\t\t\t\te.preventDefault();\n\t\t\t\tonSave();\n\t\t\t}}\n\t\t>\n\t\t\t<TextInput value={value} onChange={onChange} autoFocus data-testid=\"title-input\" />\n\t\t\t<Button primary small onClick={onSave} data-testid=\"save-button\">\n\t\t\t\t<Trans i18nKey=\"general.actions.save\">Save</Trans>\n\t\t\t</Button>\n\t\t\t<Button small onClick={onCancel} data-testid=\"cancel-button\">\n\t\t\t\t<Trans i18nKey=\"general.actions.cancel\">Cancel</Trans>\n\t\t\t</Button>\n\t\t</form>\n\t);\n}\n","import {useSortable} from '@dnd-kit/sortable';\nimport {CSS} from '@dnd-kit/utilities';\nimport cx from 'classnames';\nimport {useState} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {MultiMenu, MultiMenuItem} from '@deviceinsight/ng-ui-components';\n\nimport {ReactComponent as DragHandle} from 'assets/svg/icon_drag_handle.svg';\nimport {ReactComponent as VerticalMenuIcon} from 'assets/svg/icon_menu_vertical.svg';\nimport {Trans} from 'i18n';\nimport {EditedNameInput} from './EditedNameInput';\nimport type {Favorite} from './favoritesApi';\nimport {useFavorites} from './useFavorites';\n\ntype Props = {\n\tfavorite: Favorite;\n\tisActive: boolean;\n\tonDelete: () => void;\n\tisEdited: boolean;\n\tonEdit: () => void;\n\tonSave: (title: string) => void;\n\tonCancel: () => void;\n};\n\nfunction removeTrailingSlash(url: string) {\n\treturn url.replace(/\\/?$/, '');\n}\n\nexport function FavoriteItem({\n\tfavorite: {id, title, url},\n\tisEdited,\n\tisActive,\n\tonEdit,\n\tonDelete,\n\tonSave,\n\tonCancel,\n}: Props) {\n\tconst {attributes, listeners, setNodeRef, setActivatorNodeRef, transform, transition, isOver} = useSortable({\n\t\tid,\n\t});\n\tconst style = {\n\t\ttransform: CSS.Transform.toString(transform),\n\t\ttransition: isOver ? transition : undefined,\n\t};\n\tconst [editedTitle, setEditedTitle] = useState<string>(title);\n\n\tconst handleEditClick = () => {\n\t\tonEdit();\n\t\tsetEditedTitle(title);\n\t};\n\n\tconst handleSave = () => {\n\t\tonSave(editedTitle);\n\t};\n\n\tconst handleCancel = () => {\n\t\tonCancel();\n\t};\n\tconst {hide} = useFavorites();\n\n\treturn (\n\t\t<li className=\"item\" ref={setNodeRef} style={style} {...attributes}>\n\t\t\t<span className=\"drag-handle\" ref={setActivatorNodeRef} {...listeners}>\n\t\t\t\t<DragHandle />\n\t\t\t</span>\n\t\t\t<span className={cx('title', {active: isActive})}>\n\t\t\t\t{isEdited ? (\n\t\t\t\t\t<EditedNameInput\n\t\t\t\t\t\tvalue={editedTitle}\n\t\t\t\t\t\tonChange={setEditedTitle}\n\t\t\t\t\t\tonSave={handleSave}\n\t\t\t\t\t\tonCancel={handleCancel}\n\t\t\t\t\t/>\n\t\t\t\t) : (\n\t\t\t\t\t<Link data-testid=\"link\" to={removeTrailingSlash(url)} onClick={hide}>\n\t\t\t\t\t\t{title || url}\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</span>\n\t\t\t{!isEdited && (\n\t\t\t\t<MultiMenu\n\t\t\t\t\tmenuButton={\n\t\t\t\t\t\t<Button naked className=\"actions-handle\" data-testid=\"actions-button\">\n\t\t\t\t\t\t\t<VerticalMenuIcon />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t}\n\t\t\t\t\tdirection=\"left\"\n\t\t\t\t>\n\t\t\t\t\t<div onClick={e => e.stopPropagation()}>\n\t\t\t\t\t\t<MultiMenuItem icon={<Icon edit />} onClick={handleEditClick} data-testid=\"edit-button\">\n\t\t\t\t\t\t\t<Trans i18nKey=\"favorites.editName\">Edit Name</Trans>\n\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t\t<MultiMenuItem icon={<Icon del />} onClick={onDelete} data-testid=\"delete-button\">\n\t\t\t\t\t\t\t<Trans i18nKey=\"favorites.delete\">Delete</Trans>\n\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t</div>\n\t\t\t\t</MultiMenu>\n\t\t\t)}\n\t\t</li>\n\t);\n}\n","import {useState} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {Button, Icon, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\nimport {VerticalSortContext} from 'components/draggable/VerticalSortContext';\nimport {FloatingPanel} from 'components/FloatingPanel/FloatingPanel';\nimport {Trans} from 'i18n';\nimport {FavoriteItem} from './FavoriteItem';\nimport {useFavorites} from './useFavorites';\nimport './Favorites.scss';\n\nexport function Favorites() {\n\tconst {open, hide} = useFavorites();\n\n\tconst {\n\t\tallFavorites,\n\t\tdeleteFavorite,\n\t\tupdateTitle,\n\t\tupdateFavorites,\n\t\tcreateFavorite,\n\t\tcancelTitleEditing,\n\t\tloading,\n\t\tupdating,\n\t} = useFavorites();\n\tconst {pathname} = useLocation();\n\tconst [editedId, setEditedId] = useState<string | undefined>();\n\n\tconst handleCreate = () => {\n\t\tconst id = createFavorite();\n\t\tsetEditedId(id);\n\t};\n\tconst handleUpdateTitle = (id: string, title: string) => {\n\t\tupdateTitle(id, title);\n\t\tsetEditedId(undefined);\n\t};\n\tconst handleCancelTitleEditing = (id: string) => {\n\t\tsetEditedId(undefined);\n\t\tcancelTitleEditing(id);\n\t};\n\tconst isCurrentPageFavorite = allFavorites.some(favorite => favorite.url.replace(/\\/$/, '') === pathname);\n\n\treturn (\n\t\t<FloatingPanel\n\t\t\tclassName=\"di favorites\"\n\t\t\tvisible={open}\n\t\t\tonHide={() => {\n\t\t\t\tsetEditedId(undefined);\n\t\t\t\thide();\n\t\t\t}}\n\t\t>\n\t\t\t<SpinnerContainer show={loading || updating}>\n\t\t\t\t<div className=\"header\">\n\t\t\t\t\t<h2>\n\t\t\t\t\t\t<Trans i18nKey=\"favorites.header\">My favorites</Trans>\n\t\t\t\t\t</h2>\n\t\t\t\t\t<Button naked onClick={handleCreate} data-testid=\"create-button\" disabled={isCurrentPageFavorite}>\n\t\t\t\t\t\t<Icon add /> <Trans i18nKey=\"favorites.create\">Create new</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"content\">\n\t\t\t\t\t<VerticalSortContext items={allFavorites} onOrderChange={updateFavorites}>\n\t\t\t\t\t\t<ul data-testid=\"favorites-list\">\n\t\t\t\t\t\t\t{allFavorites.map(favorite => (\n\t\t\t\t\t\t\t\t<FavoriteItem\n\t\t\t\t\t\t\t\t\tkey={favorite.id}\n\t\t\t\t\t\t\t\t\tfavorite={favorite}\n\t\t\t\t\t\t\t\t\tonDelete={() => deleteFavorite(favorite.id)}\n\t\t\t\t\t\t\t\t\tisEdited={editedId === favorite.id}\n\t\t\t\t\t\t\t\t\tisActive={favorite.url.replace(/\\/$/, '') === pathname}\n\t\t\t\t\t\t\t\t\tonSave={title => handleUpdateTitle(favorite.id, title)}\n\t\t\t\t\t\t\t\t\tonEdit={() => setEditedId(favorite.id)}\n\t\t\t\t\t\t\t\t\tonCancel={() => handleCancelTitleEditing(favorite.id)}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</VerticalSortContext>\n\t\t\t\t\t{allFavorites.length === 0 && (\n\t\t\t\t\t\t<div data-testid=\"empty-message\">\n\t\t\t\t\t\t\t<Trans i18nKey=\"favorites.empty\">No items. Create your first favorite.</Trans>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</SpinnerContainer>\n\t\t</FloatingPanel>\n\t);\n}\n","import {readFavorites, writeFavorites} from '@deviceinsight/ng-ui-api-client';\n\nexport type Favorite = {\n\tid: string;\n\ttitle: string;\n\turl: string;\n\tlocal?: boolean;\n};\n\nexport async function fetchFavorites(): Promise<Favorite[]> {\n\treturn readFavorites() ?? [];\n}\n\nexport async function updateFavorites(favorites: Favorite[]) {\n\tawait writeFavorites(favorites);\n}\n","import {isEqual, omit} from 'lodash';\nimport {createContext, type PropsWithChildren, useContext, useEffect, useState} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {nanoid10} from '@deviceinsight/ng-ui-components';\n\nimport {CurrentPageTitleContext} from 'contexts/currentPageTitle/CurrentPageTitleContext';\nimport makeCancelable from 'utils/makeCancelable';\nimport {Favorites} from './Favorites';\nimport {type Favorite, fetchFavorites, updateFavorites as updateFavoritesApi} from './favoritesApi';\n\ntype FavoritesContextType = {\n\topen: boolean;\n\tloading: boolean;\n\tupdating: boolean;\n\tallFavorites: Favorite[];\n\tbackendFavorites: Favorite[];\n\tcreateFavorite: () => string;\n\tdeleteFavorite: (id: string) => void;\n\tupdateTitle: (id: string, newTitle: string) => void;\n\tcancelTitleEditing: (id: string) => void;\n\tupdateFavorites: (favorites: Favorite[]) => void;\n\tshow: () => void;\n\thide: () => void;\n};\nexport const FavoritesContext = createContext<FavoritesContextType>({\n\topen: false,\n\tshow: () => {},\n\thide: () => {},\n\tloading: false,\n\tupdating: false,\n\tallFavorites: [],\n\tbackendFavorites: [],\n\tcreateFavorite: () => '',\n\tdeleteFavorite: () => {},\n\tupdateTitle: () => {},\n\tcancelTitleEditing: () => {},\n\tupdateFavorites: () => {},\n});\n\nfunction withoutLocal(favorites: Favorite[]) {\n\treturn favorites.filter(favorite => !favorite.local);\n}\n\nexport function FavoritesProvider({children}: PropsWithChildren<unknown>) {\n\tconst [open, setOpen] = useState(false);\n\tconst [allFavorites, setAllFavorites] = useState<Favorite[]>([]);\n\tconst [backendFavorites, setBackendFavorites] = useState<Favorite[]>([]);\n\tconst [loading, setLoading] = useState(true);\n\tconst [updating, setUpdating] = useState(false);\n\tconst {pathname, search} = useLocation();\n\tconst {currentPageTitle} = useContext(CurrentPageTitleContext);\n\n\tuseEffect(() => {\n\t\tconst {promise, cancel} = makeCancelable(fetchFavorites());\n\t\tpromise\n\t\t\t.then(favorites => {\n\t\t\t\tsetAllFavorites(favorites);\n\t\t\t\tsetBackendFavorites(favorites);\n\t\t\t\tsetLoading(false);\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tif (!e.isCanceled) {\n\t\t\t\t\tconsole.error('Fetching favorites failed', e);\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t}\n\t\t\t});\n\t\treturn cancel;\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst newBackendFavorites = withoutLocal(allFavorites);\n\t\tif (!isEqual(newBackendFavorites, backendFavorites)) {\n\t\t\tconst {promise, cancel} = makeCancelable(updateFavoritesApi(newBackendFavorites));\n\t\t\tsetUpdating(true);\n\n\t\t\tpromise\n\t\t\t\t.then(() => {\n\t\t\t\t\tsetUpdating(false);\n\t\t\t\t\tsetBackendFavorites(newBackendFavorites);\n\t\t\t\t})\n\t\t\t\t.catch(e => {\n\t\t\t\t\tif (!e.isCanceled) {\n\t\t\t\t\t\tconsole.error('Updating favorites failed', e);\n\t\t\t\t\t\tsetUpdating(false);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\treturn cancel;\n\t\t}\n\t}, [allFavorites, backendFavorites]);\n\n\tfunction deleteFavorite(id: string) {\n\t\tsetAllFavorites(allFavorites.filter(favorite => favorite.id !== id));\n\t}\n\n\tfunction updateTitle(id: string, newTitle: string) {\n\t\tsetAllFavorites(\n\t\t\tallFavorites.map(favorite =>\n\t\t\t\tfavorite.id === id\n\t\t\t\t\t? omit(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...favorite,\n\t\t\t\t\t\t\t\ttitle: newTitle,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t'local',\n\t\t\t\t\t\t)\n\t\t\t\t\t: favorite,\n\t\t\t),\n\t\t);\n\t}\n\n\tfunction cancelTitleEditing(id: string) {\n\t\tsetAllFavorites(allFavorites.filter(favorite => favorite.id !== id || !favorite.local));\n\t}\n\n\tfunction updateFavorites(favorites: Favorite[]) {\n\t\tsetAllFavorites(favorites);\n\t}\n\n\tfunction createFavorite() {\n\t\tconst id = nanoid10();\n\t\tsetAllFavorites([\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\ttitle: currentPageTitle,\n\t\t\t\turl: `${pathname}/${search}`,\n\t\t\t\tlocal: true,\n\t\t\t},\n\t\t\t...withoutLocal(allFavorites),\n\t\t]);\n\t\treturn id;\n\t}\n\n\tfunction handleHide() {\n\t\tsetOpen(false);\n\t\tsetAllFavorites(backendFavorites);\n\t}\n\tconst contextValue: FavoritesContextType = {\n\t\topen,\n\t\tshow: () => setOpen(true),\n\t\thide: handleHide,\n\t\tloading,\n\t\tupdating,\n\t\tallFavorites,\n\t\tbackendFavorites,\n\t\tcreateFavorite,\n\t\tdeleteFavorite,\n\t\tupdateTitle,\n\t\tcancelTitleEditing,\n\t\tupdateFavorites,\n\t};\n\n\treturn (\n\t\t<FavoritesContext.Provider value={contextValue}>\n\t\t\t<Favorites />\n\t\t\t{children}\n\t\t</FavoritesContext.Provider>\n\t);\n}\n","import {useContext} from 'react';\n\nimport {FavoritesContext} from './FavoritesProvider';\n\nexport function useFavorites() {\n\treturn useContext(FavoritesContext);\n}\n","import {useContext} from 'react';\nimport {Link} from 'react-router-dom';\n\nimport {Button, Icon} from '@deviceinsight/ng-ui-basic-components';\nimport {MultiMenu, MultiMenuItem} from '@deviceinsight/ng-ui-components';\n\nimport {FloatingPanel} from 'components/FloatingPanel/FloatingPanel';\nimport {Trans} from 'i18n';\nimport {formatTimestamp} from 'utils/timestampUtils';\nimport {HistoryContext} from './HistoryProvider';\nimport './HistoryPanel.scss';\n\nimport {ReactComponent as VerticalMenuIcon} from 'assets/svg/icon_menu_vertical.svg';\n\nfunction removeTrailingSlash(url: string) {\n\treturn url.replace(/\\/?$/, '');\n}\n\nexport function HistoryPanel() {\n\tconst {open, hide, historyItems, clearHistory} = useContext(HistoryContext);\n\treturn (\n\t\t<FloatingPanel visible={open} onHide={hide} className=\"di history-panel\">\n\t\t\t<div className=\"wrapper\">\n\t\t\t\t<div className=\"header\">\n\t\t\t\t\t<h2>\n\t\t\t\t\t\t<Trans i18nKey=\"history.header\">Page history</Trans>\n\t\t\t\t\t</h2>\n\t\t\t\t\t<MultiMenu\n\t\t\t\t\t\tmenuButton={\n\t\t\t\t\t\t\t<Button naked className=\"actions-handle\" data-testid=\"actions-button\">\n\t\t\t\t\t\t\t\t<VerticalMenuIcon />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdirection=\"left\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<div onClick={e => e.stopPropagation()}>\n\t\t\t\t\t\t\t<MultiMenuItem icon={<Icon del />} onClick={clearHistory} data-testid=\"clear-button\">\n\t\t\t\t\t\t\t\t<Trans i18nKey=\"history.clear\">Clear History</Trans>\n\t\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</MultiMenu>\n\t\t\t\t</div>\n\t\t\t\t<ul className=\"content\">\n\t\t\t\t\t{historyItems.map(({title, url, date}) => (\n\t\t\t\t\t\t<li key={date} className=\"item\">\n\t\t\t\t\t\t\t<Link className=\"title\" to={removeTrailingSlash(url)} onClick={hide}>\n\t\t\t\t\t\t\t\t{title}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<span className=\"date\" title={formatTimestamp(date)} data-testid=\"date-field\">\n\t\t\t\t\t\t\t\t{formatTimestamp(date, {format: 'L'})}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t\t{historyItems.length === 0 && (\n\t\t\t\t\t<div data-testid=\"empty-message\">\n\t\t\t\t\t\t<Trans i18nKey=\"history.empty\">No history items.</Trans>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</FloatingPanel>\n\t);\n}\n","export type HistoryItem = {\n\ttitle: string;\n\tdate: number;\n\turl: string;\n};\n\nconst STORAGE_KEY = 'di-history-items';\nconst MAX_ITEMS = 20;\n\nfunction getStorage(): Record<string, HistoryItem[]> {\n\tconst storageSerialized = localStorage.getItem(STORAGE_KEY) ?? '{}';\n\treturn JSON.parse(storageSerialized);\n}\n\nexport function getHistoryItems(accountNumber: string): HistoryItem[] {\n\treturn getStorage()[accountNumber] ?? [];\n}\n\nexport function addHistoryItem(historyItem: HistoryItem, accountNumber: string) {\n\tconst storage = getStorage();\n\tconst historyItems = getHistoryItems(accountNumber);\n\tlet newHistoryItems: HistoryItem[];\n\tif (historyItems.length && historyItems[0].url === historyItem.url) {\n\t\tnewHistoryItems = [historyItem, ...historyItems.slice(1)];\n\t} else {\n\t\tnewHistoryItems = [historyItem, ...historyItems].slice(0, MAX_ITEMS);\n\t}\n\tlocalStorage.setItem(STORAGE_KEY, JSON.stringify({...storage, [accountNumber]: newHistoryItems}));\n}\n\nexport function clearHistoryItems(accountNumber: string) {\n\tconst storage = getStorage();\n\tlocalStorage.setItem(STORAGE_KEY, JSON.stringify({...storage, [accountNumber]: []}));\n}\n","import {debounce} from 'lodash';\nimport {\n\tcreateContext,\n\ttype Dispatch,\n\ttype PropsWithChildren,\n\ttype SetStateAction,\n\tuseContext,\n\tuseEffect,\n\tuseState,\n} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport type {User} from '@deviceinsight/ng-ui-api-client';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {CurrentPageTitleContext} from '../../contexts/currentPageTitle/CurrentPageTitleContext';\nimport {HistoryPanel} from './HistoryPanel';\nimport {addHistoryItem, clearHistoryItems, getHistoryItems, type HistoryItem} from './historyApi';\n\nexport type HistoryContextType = {\n\topen: boolean;\n\tshow: () => void;\n\thide: () => void;\n\thistoryItems: HistoryItem[];\n\tclearHistory: () => void;\n};\nexport const HistoryContext = createContext<HistoryContextType>({\n\topen: false,\n\tshow: () => {},\n\thide: () => {},\n\tclearHistory: () => {},\n\thistoryItems: [],\n});\n\nconst createHistoryItem = debounce(\n\t(\n\t\tpathname: string,\n\t\tsearch: string,\n\t\tuser: User,\n\t\treactHistoryItemsSetter: Dispatch<SetStateAction<HistoryItem[]>>,\n\t\tcurrentPageTitle: string | undefined,\n\t) => {\n\t\tif (!currentPageTitle) {\n\t\t\treturn;\n\t\t}\n\t\tconst item: HistoryItem = {\n\t\t\tdate: Date.now(),\n\t\t\turl: `${pathname}/${search}`,\n\t\t\ttitle: currentPageTitle,\n\t\t};\n\n\t\taddHistoryItem(item, user.number);\n\t\treactHistoryItemsSetter(getHistoryItems(user.number));\n\t},\n\t500,\n);\n\nexport function HistoryProvider({children}: PropsWithChildren<unknown>) {\n\tconst [open, setOpen] = useState(false);\n\tconst {pathname, search} = useLocation();\n\tconst {user} = useContext(UserContext);\n\tconst [historyItems, setHistoryItems] = useState<HistoryItem[]>([]);\n\tconst {currentPageTitle} = useContext(CurrentPageTitleContext);\n\n\tuseEffect(() => {\n\t\tif (user) {\n\t\t\tsetHistoryItems(getHistoryItems(user.number));\n\t\t}\n\t}, [user]);\n\n\tuseEffect(() => {\n\t\tif (UIConfiguration.isHistoryEnabled() && user) {\n\t\t\tcreateHistoryItem(pathname, search, user, setHistoryItems, currentPageTitle);\n\t\t}\n\t}, [pathname, search, user, currentPageTitle]);\n\n\tconst clearHistory = () => {\n\t\tclearHistoryItems(user.number);\n\t\tsetHistoryItems([]);\n\t};\n\n\tconst contextValue: HistoryContextType = {\n\t\topen,\n\t\tshow: () => setOpen(true),\n\t\thide: () => setOpen(false),\n\t\thistoryItems,\n\t\tclearHistory,\n\t};\n\n\treturn (\n\t\t<HistoryContext.Provider value={contextValue}>\n\t\t\t<HistoryPanel />\n\t\t\t{children}\n\t\t</HistoryContext.Provider>\n\t);\n}\n","import {useContext} from 'react';\n\nimport {Bubble} from '@deviceinsight/ng-ui-basic-components';\n\nimport {ReactComponent as WarningIcon} from 'assets/svg/icon_warning_triangle.svg';\nimport {Ux4iotConnectionStateContext} from 'contexts/ux4iot/Ux4iotConnectionStateContext';\nimport {Trans} from 'i18n';\n\nexport function Ux4iotConnectionState() {\n\tconst {connectionState} = useContext(Ux4iotConnectionStateContext);\n\n\tif (!connectionState || connectionState === 'socket_connect') {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<Bubble\n\t\t\tcontent={\n\t\t\t\t<div className=\"ux4iot-connection-state-hint\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<Trans i18nKey=\"ux4iot.connection.unavailable\">Ux4iot service is currently unavailable!</Trans>\n\t\t\t\t\t</p>\n\t\t\t\t\t<p>\n\t\t\t\t\t\t<Trans i18nKey=\"ux4iot.connection.unavailableTooltip\">\n\t\t\t\t\t\t\tYou will need to reload the page manually to see the latest datapoint values.\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t}\n\t\t>\n\t\t\t<div className=\"ux4iot-connection-state\">\n\t\t\t\t<WarningIcon />\n\t\t\t</div>\n\t\t</Bubble>\n\t);\n}\n","import {useMsal} from '@azure/msal-react';\nimport {zodResolver} from '@hookform/resolvers/zod';\nimport {createElement, useContext} from 'react';\nimport {Controller, FormProvider, useForm} from 'react-hook-form';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport {type User, updateLocaleOfUser} from '@deviceinsight/ng-ui-api-client';\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\nimport {MultiMenu, MultiMenuItem, messageBoxError, messageBoxSuccess} from '@deviceinsight/ng-ui-components';\n\nimport iconGlobe from 'assets/svg/icon_globe_alternative.svg';\nimport {ReactComponent as StarIcon} from 'assets/svg/icon_star.svg';\nimport iconHistory from 'assets/svg/icon_timemachine.svg';\nimport userIcon from 'assets/svg/icon_user.svg';\nimport imgTriangleDown from 'assets/svg/triangle_down.svg';\nimport {type ResetAuthenticatedUserType, UserContext} from 'contexts/user/UserContext';\nimport {CustomHeaderElementsContext} from 'customization/contexts/customHeaderElements/CustomHeaderElementsContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans, useTranslation} from 'i18n';\nimport {useFavorites} from 'modules/favorites/useFavorites';\nimport {HistoryContext} from 'modules/history/HistoryProvider';\nimport {signoutLegacy, signoutMsal} from 'modules/users/actions/signout';\nimport {setCustomStartPage} from 'modules/users/startpage';\nimport {isAzureB2cActive} from 'utils/msalUtils/msalUtils';\nimport {GlobalResourcesContext} from '../../../contexts/globalResources/GlobalResourcesContext';\nimport useUserValidationSchema, {\n\ttype UserFormData,\n} from '../../../modules/users/components/userForm/useUserValidationSchema';\nimport {transformUserToFormData} from '../../../modules/users/components/utils';\nimport {emitUserProfileChange} from '../../../utils/eventBus';\nimport {Ux4iotConnectionState} from './Ux4iotConnectionState';\n\nexport default function HeaderLinks() {\n\tconst {t} = useTranslation();\n\tconst {locales} = useContext(GlobalResourcesContext);\n\tconst {pathname} = useLocation();\n\tconst {instance} = useMsal();\n\tconst {user, resetAuthenticatedUser, setAuthenticatedUser, principal, paginationSettings} = useContext(UserContext);\n\tconst {elements: customHeaderElements} = useContext(CustomHeaderElementsContext);\n\tconst {show: showFavorites, backendFavorites} = useFavorites();\n\tconst {show: showHistoryPanel} = useContext(HistoryContext);\n\tconst isCurrentPageFavorite = backendFavorites.some(favorite => favorite.url.replace(/\\/$/, '') === pathname);\n\tconst schema = useUserValidationSchema(true, true);\n\tconst formContext = useForm<UserFormData>({\n\t\tresolver: zodResolver(schema),\n\t\tdefaultValues: transformUserToFormData(user),\n\t});\n\tconst history = useHistory();\n\n\tasync function signout(user: User, resetAuthenticatedUser: ResetAuthenticatedUserType): Promise<void> {\n\t\tif (isAzureB2cActive()) {\n\t\t\tawait signoutMsal(user, instance);\n\t\t} else {\n\t\t\tawait signoutLegacy(user, resetAuthenticatedUser);\n\t\t}\n\t}\n\n\tfunction setStartpage() {\n\t\tsetCustomStartPage(pathname).then(() => {\n\t\t\tconst defaultValue = 'The current page has been saved as starting page.';\n\t\t\tconst successMessage = t('user.settings.saveStartPageMessage', {\n\t\t\t\tdefaultValue,\n\t\t\t});\n\t\t\tmessageBoxSuccess(successMessage, {\n\t\t\t\tautoClose: 4000,\n\t\t\t});\n\t\t});\n\t}\n\n\tfunction updateLocale(locale: string) {\n\t\tupdateLocaleOfUser({locale: locale})\n\t\t\t.then(updatedUser => {\n\t\t\t\tsetAuthenticatedUser(principal, updatedUser, paginationSettings);\n\t\t\t\temitUserProfileChange(updatedUser);\n\t\t\t\thistory.push(history.location.pathname);\n\t\t\t\tmessageBoxSuccess(\n\t\t\t\t\tt('user.settings.saveLocaleMessage', {defaultValue: 'The language has been changed.'}),\n\t\t\t\t);\n\t\t\t})\n\t\t\t.catch((error: any) => messageBoxError(error));\n\t}\n\n\treturn (\n\t\t<div className=\"di utilities\">\n\t\t\t<Ux4iotConnectionState />\n\t\t\t{/* CustomHeaderElements allow the custom project to add additional elements (e.g. icons) to the Header */}\n\t\t\t{customHeaderElements &&\n\t\t\t\tcustomHeaderElements.map(che => (\n\t\t\t\t\t<span key={che.id} className=\"elm\">\n\t\t\t\t\t\t{createElement(che.component, null, null)}\n\t\t\t\t\t</span>\n\t\t\t\t))}\n\t\t\t<span className=\"elm\">\n\t\t\t\t<FormProvider {...formContext}>\n\t\t\t\t\t<MultiMenu\n\t\t\t\t\t\tdata-testid=\"property-locale\"\n\t\t\t\t\t\tmenuButton={\n\t\t\t\t\t\t\t<button type=\"button\" className=\"di button link\">\n\t\t\t\t\t\t\t\t<img src={iconGlobe} alt=\"locale icon\" />\n\t\t\t\t\t\t\t\t<span title={t('eula.language')} defaultValue=\"Language\">\n\t\t\t\t\t\t\t\t\t{t(`locales.${user.locale}`, {defaultValue: user.locale})}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<img src={imgTriangleDown} alt=\"triangle down\" />\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Controller\n\t\t\t\t\t\t\tname=\"locale\"\n\t\t\t\t\t\t\trender={() => (\n\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t{locales.map(locale => (\n\t\t\t\t\t\t\t\t\t\t<MultiMenuItem\n\t\t\t\t\t\t\t\t\t\t\tkey={locale}\n\t\t\t\t\t\t\t\t\t\t\tdata-testid={`property-locale-${locale}`}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => updateLocale(locale)}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{locale === user.locale ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<b>{t(`locales.${locale}`, {defaultValue: locale})}</b>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\tt(`locales.${locale}`, {defaultValue: locale})\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</MultiMenu>\n\t\t\t\t</FormProvider>\n\t\t\t</span>\n\t\t\t{UIConfiguration.isFavoritesEnabled() && (\n\t\t\t\t<span className=\"elm\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-testid=\"favorites-button\"\n\t\t\t\t\t\tnaked\n\t\t\t\t\t\ttitle={t('favorites.title', {defaultValue: 'Favorites'})}\n\t\t\t\t\t\tonClick={showFavorites}\n\t\t\t\t\t>\n\t\t\t\t\t\t<StarIcon style={isCurrentPageFavorite ? {fill: 'var(--primary-color)'} : {}} />\n\t\t\t\t\t</Button>\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t{UIConfiguration.isHistoryEnabled() && (\n\t\t\t\t<span className=\"elm\">\n\t\t\t\t\t<Button\n\t\t\t\t\t\tdata-testid=\"history-button\"\n\t\t\t\t\t\tnaked\n\t\t\t\t\t\ttitle={t('history.title', {defaultValue: 'History'})}\n\t\t\t\t\t\tonClick={showHistoryPanel}\n\t\t\t\t\t>\n\t\t\t\t\t\t<img src={iconHistory} alt=\"\" style={{width: 16, height: 16}} />\n\t\t\t\t\t</Button>\n\t\t\t\t</span>\n\t\t\t)}\n\t\t\t<span className=\"elm\">\n\t\t\t\t<MultiMenu\n\t\t\t\t\tdata-testid=\"user-menu-button\"\n\t\t\t\t\tmenuButton={\n\t\t\t\t\t\t<button type=\"button\" className=\"di button link\">\n\t\t\t\t\t\t\t<img src={userIcon} alt=\"profile icon\" />\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\ttitle={t('page.headerLinks.userProfile', {\n\t\t\t\t\t\t\t\t\tdefaultValue: 'User Profile',\n\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{user.displayName ?? user.name}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<img src={imgTriangleDown} alt=\"triangle down\" />\n\t\t\t\t\t\t</button>\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t\t<MultiMenuItem data-testid=\"user-profile-button\" linkTo=\"/profile\">\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<Trans i18nKey=\"page.headerLinks.userProfile\">User Profile</Trans>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t\t<MultiMenuItem data-testid=\"start-page-button\" linkTo=\"#\" onClick={setStartpage}>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t<Trans i18nKey=\"page.headerLinks.startPage\">Set as startpage</Trans>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</MultiMenuItem>\n\t\t\t\t</MultiMenu>\n\t\t\t</span>\n\t\t\t<span className=\"elm\">\n\t\t\t\t<button\n\t\t\t\t\tdata-testid=\"logout-button\"\n\t\t\t\t\tclassName=\"di button link\"\n\t\t\t\t\tonClick={e => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\tsignout(user, resetAuthenticatedUser);\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<span>\n\t\t\t\t\t\t<Trans i18nKey=\"page.headerLinks.logout\">Logout</Trans>\n\t\t\t\t\t</span>\n\t\t\t\t</button>\n\t\t\t</span>\n\t\t</div>\n\t);\n}\n","import {useState} from 'react';\n\nimport useOutsideClick from 'hooks/useOutsideClick';\nimport {Trans, type TranslationDescriptor} from 'i18n';\nimport type {ContextType} from 'modules/contextSearch/components/advancedSearch/types';\n\ntype Props = {\n\tvalue: string;\n\toptions: Array<{\n\t\tvalue: string;\n\t\tlabel: TranslationDescriptor;\n\t}>;\n\tonChange: (value: ContextType) => void;\n};\nexport default function HeaderSearchContextSelect({value, options, onChange}: Props) {\n\tconst [expanded, setExpanded] = useState<boolean>(false);\n\tconst {ref: outsideClickRef} = useOutsideClick(handleOutsideClick);\n\n\tfunction handleOutsideClick() {\n\t\tif (expanded) {\n\t\t\tsetExpanded(false);\n\t\t}\n\t}\n\n\tconst selectedOption = options.find(o => o.value === value) || options[0];\n\treturn (\n\t\t<span className=\"search-cat\" ref={outsideClickRef}>\n\t\t\t<span\n\t\t\t\tonClick={() => {\n\t\t\t\t\tsetExpanded(ex => !ex);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<span className=\"cat-selected\">\n\t\t\t\t\t<Trans i18nKey={selectedOption.label.id}>{selectedOption.label.defaultValue}</Trans>\n\t\t\t\t</span>\n\t\t\t\t<span className=\"triangle\" />\n\t\t\t</span>\n\t\t\t{expanded && (\n\t\t\t\t<span className=\"search-cat-box show\">\n\t\t\t\t\t{options.map(option => (\n\t\t\t\t\t\t<span\n\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\tclassName=\"option\"\n\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\tif (option.value !== value) {\n\t\t\t\t\t\t\t\t\t// @ts-expect-error option.value is part of enum\n\t\t\t\t\t\t\t\t\tonChange(option.value);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tsetExpanded(false);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Trans i18nKey={option.label.id}>{option.label.defaultValue}</Trans>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t))}\n\t\t\t\t</span>\n\t\t\t)}\n\t\t</span>\n\t);\n}\n","import {useContext} from 'react';\n\nimport HeaderSearchContextSelect from 'components/page/header/HeaderSearchContextSelect';\nimport GlobalSearchContext from 'contexts/globalSearch/GlobalSearchContext';\nimport type {TranslationDescriptor} from 'i18n';\nimport Search from './components/Search';\n\nconst translations: Record<string, TranslationDescriptor> = {\n\tassets: {\n\t\tid: 'search.assets.searchname',\n\t\tdefaultValue: 'Assets',\n\t},\n\tassetgroups: {\n\t\tid: 'search.assetgroups',\n\t\tdefaultValue: 'Asset Groups',\n\t},\n\tusers: {\n\t\tid: 'search.users.searchname',\n\t\tdefaultValue: 'Users',\n\t},\n\tusergroups: {\n\t\tid: 'search.usergroups',\n\t\tdefaultValue: 'User Groups',\n\t},\n\troles: {\n\t\tid: 'search.roles.searchname',\n\t\tdefaultValue: 'Roles',\n\t},\n};\n\nexport function GlobalContextSearch() {\n\tconst {availableContexts, context, changeContext, searchConfig, submitQuery, query} =\n\t\tuseContext(GlobalSearchContext);\n\n\tif (!context || !searchConfig) {\n\t\treturn null;\n\t}\n\treturn (\n\t\t<div className=\"di searchG\">\n\t\t\t<Search\n\t\t\t\tquery={query}\n\t\t\t\tcontext={context}\n\t\t\t\tconfig={searchConfig}\n\t\t\t\tonSubmit={submitQuery}\n\t\t\t\tautofocus\n\t\t\t\twithQueryBuilder={context !== 'roles'}\n\t\t\t>\n\t\t\t\t{availableContexts && (\n\t\t\t\t\t<HeaderSearchContextSelect\n\t\t\t\t\t\tvalue={context}\n\t\t\t\t\t\toptions={availableContexts.map(value => ({\n\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\tlabel: translations[value],\n\t\t\t\t\t\t}))}\n\t\t\t\t\t\tonChange={changeContext}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</Search>\n\t\t</div>\n\t);\n}\n","import cx from 'classnames';\nimport type * as React from 'react';\nimport {Link, useHistory} from 'react-router-dom';\n\nimport type {Asset, AssetGroup, User, UserGroup} from '@deviceinsight/ng-ui-api-client';\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\nimport type {FindResourcesResult} from './useFullSearch';\n\ntype Props<T> = {\n\ttitle: React.ReactNode;\n\ticon: React.ReactNode;\n\titems: FindResourcesResult<T> | undefined;\n\tgetId: (item: T) => string | number;\n\tgetName: (item: T) => string;\n\tgetUrl: (item: T) => string;\n\tgetAllUrl: () => string;\n\tonHide: () => void;\n\tfocusedItem: number | undefined;\n};\n\nexport function SearchResultSection<Item extends Asset | AssetGroup | User | UserGroup>({\n\ttitle,\n\ticon,\n\titems,\n\tgetId,\n\tgetName,\n\tgetUrl,\n\tgetAllUrl,\n\tonHide,\n\tfocusedItem,\n}: Props<Item>) {\n\tconst history = useHistory();\n\tif (items?.data.length === 0) return null;\n\treturn (\n\t\t<section className=\"results-section\">\n\t\t\t<h2>\n\t\t\t\t<span>{icon}</span>\n\t\t\t\t<span className=\"title\">{title}</span>\n\t\t\t\t<span className=\"line\" />\n\t\t\t\t{items && (\n\t\t\t\t\t<Button\n\t\t\t\t\t\tnaked\n\t\t\t\t\t\tsmall\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\thistory.push(getAllUrl());\n\t\t\t\t\t\t\tonHide();\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Trans i18nKey=\"search.showAll\">Show All</Trans>\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</h2>\n\t\t\t{items ? (\n\t\t\t\t<ul className={cx({columns: items.data.length > 3})}>\n\t\t\t\t\t{items.data.map((item, index) => (\n\t\t\t\t\t\t<li key={getId(item)}>\n\t\t\t\t\t\t\t<Link to={getUrl(item)} onClick={onHide} className={cx({focus: focusedItem === index})}>\n\t\t\t\t\t\t\t\t{getName(item)}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t))}\n\t\t\t\t</ul>\n\t\t\t) : (\n\t\t\t\t<div>\n\t\t\t\t\t<Trans i18nKey=\"general.actions.loading\">Loading...</Trans>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</section>\n\t);\n}\n","import EventEmitter from 'eventemitter3';\nimport {useRef} from 'react';\n\nexport enum NavigationEvent {\n\tup = 'up',\n\tdown = 'down',\n\tleftOrRight = 'leftOrRight',\n\tright = 'right',\n\tenter = 'enter',\n\treset = 'reset',\n}\n\nexport type NavigationEventEmitter = {\n\temit: (event: NavigationEvent) => void;\n\taddListener: (event: NavigationEvent, listener: () => void) => void;\n\tremoveListener: (event: NavigationEvent, listener: () => void) => void;\n};\n\nexport function useNavigationEventEmitter(): NavigationEventEmitter {\n\tconst {current: eventEmitter} = useRef(new EventEmitter());\n\n\tfunction emit(event: NavigationEvent) {\n\t\teventEmitter.emit(event);\n\t}\n\n\tfunction addListener(event: NavigationEvent, listener: () => void) {\n\t\teventEmitter.addListener(event, listener);\n\t}\n\n\tfunction removeListener(event: NavigationEvent, listener: () => void) {\n\t\teventEmitter.removeListener(event, listener);\n\t}\n\n\treturn {emit, addListener, removeListener};\n}\n","import {useCallback, useEffect, useState} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport type {Asset, AssetGroup, Role, User, UserGroup} from '@deviceinsight/ng-ui-api-client';\n\nimport useKeyboardShortcut from '../../hooks/useKeyboardShortcut';\nimport type {FullSearchResults} from './useFullSearch';\nimport {NavigationEvent, type NavigationEventEmitter} from './useNavigationEventEmitter';\n\ntype SearchResultsKey = Exclude<keyof FullSearchResults, 'reload'>;\n\nfunction getNextNonEmptyGroup(\n\tresults: FullSearchResults,\n\tcurrentGroup: SearchResultsKey | undefined,\n\tgoBackward?: boolean,\n): SearchResultsKey | undefined {\n\tlet groups: SearchResultsKey[] = ['assets', 'assetGroups', 'users', 'userGroups', 'roles'];\n\tif (goBackward) groups.reverse();\n\tif (currentGroup) {\n\t\tconst nextGroupIndex = groups.indexOf(currentGroup) + 1;\n\t\tgroups = groups.slice(nextGroupIndex);\n\t}\n\tfor (const group of groups) {\n\t\tif (results[group]?.data?.length) return group;\n\t}\n\treturn undefined;\n}\n\nfunction getGroupSize(results: FullSearchResults, group: Exclude<SearchResultsKey, 'reload'> | undefined) {\n\tif (!group) return 0;\n\treturn results[group]?.data.length ?? 0;\n}\n\n/**\n * Assuming that the elements are arranged in two columns with equal number of elements (the first column has one\n * more element in the odd case), this function returns the index of the element adjacent to the element with the specified index.\n */\nfunction getIndexOnLeftOrRight(index: number, groupSize: number) {\n\tif (groupSize <= 3) return index; // if there are less than or equal to 3 elements, there is only one column.\n\n\t// the case when the specified index is in the first column:\n\tif (index < Math.ceil(groupSize / 2)) {\n\t\treturn Math.min(groupSize - 1, index + Math.ceil(groupSize / 2));\n\t}\n\t// the case when the specified index is in the second column:\n\telse {\n\t\treturn index - Math.ceil(groupSize / 2);\n\t}\n}\n\nfunction getUrl(group: SearchResultsKey, item: unknown) {\n\tswitch (group) {\n\t\tcase 'assets':\n\t\t\treturn `/assets/${(item as Asset).id}`;\n\t\tcase 'assetGroups':\n\t\t\treturn `/assetgroups/${(item as AssetGroup).id}`;\n\t\tcase 'users':\n\t\t\treturn `/users/${(item as User).number}`;\n\t\tcase 'userGroups':\n\t\t\treturn `/usergroups/${(item as UserGroup).id}`;\n\t\tcase 'roles':\n\t\t\treturn `/roles/${(item as Role).id}`;\n\t}\n}\n\nexport function useResultsKeyboardNavigation(\n\tresults: FullSearchResults,\n\tnavigationEventEmitter: NavigationEventEmitter,\n\tonHide: () => void,\n) {\n\tconst [index, setIndex] = useState(0);\n\tconst [group, setGroup] = useState<SearchResultsKey | undefined>();\n\tconst history = useHistory();\n\n\tuseEffect(() => {\n\t\tfunction goToNextResult() {\n\t\t\tif (getGroupSize(results, group) > index + 1) {\n\t\t\t\tsetIndex(index + 1);\n\t\t\t} else {\n\t\t\t\tsetIndex(0);\n\t\t\t\tconst nextGroup = getNextNonEmptyGroup(results, group);\n\t\t\t\tsetGroup(nextGroup);\n\t\t\t\tif (nextGroup === undefined) {\n\t\t\t\t\tnavigationEventEmitter.emit(NavigationEvent.reset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction goToPreviousResult() {\n\t\t\tif (index > 0) {\n\t\t\t\tsetIndex(index - 1);\n\t\t\t} else {\n\t\t\t\tconst previousGroup = getNextNonEmptyGroup(results, group, true);\n\t\t\t\tsetGroup(previousGroup);\n\t\t\t\tsetIndex(getGroupSize(results, previousGroup) - 1);\n\t\t\t\tif (previousGroup === undefined) {\n\t\t\t\t\tnavigationEventEmitter.emit(NavigationEvent.reset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction moveLeftOrRight() {\n\t\t\tsetIndex(getIndexOnLeftOrRight(index, getGroupSize(results, group)));\n\t\t}\n\n\t\tfunction openItem() {\n\t\t\tif (group) {\n\t\t\t\tconst item = results[group]?.data?.[index];\n\t\t\t\tif (item) {\n\t\t\t\t\thistory.push(getUrl(group, item));\n\t\t\t\t\tonHide();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tnavigationEventEmitter.addListener(NavigationEvent.up, goToPreviousResult);\n\t\tnavigationEventEmitter.addListener(NavigationEvent.down, goToNextResult);\n\t\tnavigationEventEmitter.addListener(NavigationEvent.leftOrRight, moveLeftOrRight);\n\t\tnavigationEventEmitter.addListener(NavigationEvent.enter, openItem);\n\n\t\treturn () => {\n\t\t\tnavigationEventEmitter.removeListener(NavigationEvent.up, goToPreviousResult);\n\t\t\tnavigationEventEmitter.removeListener(NavigationEvent.down, goToNextResult);\n\t\t\tnavigationEventEmitter.removeListener(NavigationEvent.leftOrRight, moveLeftOrRight);\n\t\t\tnavigationEventEmitter.removeListener(NavigationEvent.enter, openItem);\n\t\t};\n\t}, [group, history, index, navigationEventEmitter, results, onHide]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tsetIndex(0);\n\t\tsetGroup(undefined);\n\t}, [results]);\n\n\tconst keyboardCallback = useCallback(\n\t\t(evt: KeyboardEvent) => {\n\t\t\tconst keyToNavigationEvent: Record<string, NavigationEvent> = {\n\t\t\t\tArrowUp: NavigationEvent.up,\n\t\t\t\tArrowDown: NavigationEvent.down,\n\t\t\t\tArrowLeft: NavigationEvent.leftOrRight,\n\t\t\t\tArrowRight: NavigationEvent.leftOrRight,\n\t\t\t\tEnter: NavigationEvent.enter,\n\t\t\t};\n\t\t\tif (group) {\n\t\t\t\tevt.preventDefault();\n\t\t\t\tconst event = keyToNavigationEvent[evt.key];\n\t\t\t\tif (event) {\n\t\t\t\t\tnavigationEventEmitter.emit(event);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[group, navigationEventEmitter],\n\t);\n\tuseKeyboardShortcut(['up', 'down', 'left', 'right', 'enter'], keyboardCallback);\n\n\treturn {group, index};\n}\n","import cx from 'classnames';\nimport {createPortal} from 'react-dom';\n\nimport {ReactComponent as AssetSvg} from 'assets/svg/icon_asset.svg';\nimport {ReactComponent as AssetGroupSvg} from 'assets/svg/icon_assetgroups.svg';\nimport {ReactComponent as UserSvg} from 'assets/svg/icon_user.svg';\nimport {ReactComponent as UserGroupSvg} from 'assets/svg/icon_usergroup.svg';\nimport {ReactComponent as RoleSvg} from 'assets/svg/icon_userrole.svg';\nimport {HasAuthorities} from 'components/auth/HasAuthorities';\nimport useOutsideClick from 'hooks/useOutsideClick';\nimport {usePortalRoot} from 'hooks/usePortalRoot';\nimport {Trans} from 'i18n';\nimport {getNameFallbackFromHotpot} from '../users/search';\nimport {SearchResultSection} from './SearchResultSection';\nimport type {FullSearchResults} from './useFullSearch';\nimport type {NavigationEventEmitter} from './useNavigationEventEmitter';\nimport {useResultsKeyboardNavigation} from './useResultsKeyboardNavigation';\n\nimport './FullSearchResults.scss';\n\ntype Props = {\n\tsearchInputRect: DOMRect | undefined;\n\tvisible: boolean;\n\tonHide: () => void;\n\tresults: FullSearchResults;\n\tquery: string;\n\tkeyboardEventEmitter: NavigationEventEmitter;\n\telementsIgnoredOnClickOutside: HTMLElement[];\n};\n\nexport function FullSearchResultsPanel({\n\tsearchInputRect,\n\tvisible,\n\tonHide,\n\tresults,\n\tquery,\n\telementsIgnoredOnClickOutside,\n\tkeyboardEventEmitter,\n}: Props) {\n\tconst root = usePortalRoot();\n\tconst {ref} = useOutsideClick<HTMLDivElement>(onHide, elementsIgnoredOnClickOutside);\n\tconst {index, group} = useResultsKeyboardNavigation(results, keyboardEventEmitter, onHide);\n\n\tif (!root || query === '') {\n\t\treturn null;\n\t}\n\tconst noEntries = [results.assets, results.assetGroups, results.userGroups, results.users, results.roles].every(\n\t\titems => items && items.data.length === 0,\n\t);\n\treturn createPortal(\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cx('full-search-results', {hidden: !visible})}\n\t\t\tstyle={{\n\t\t\t\ttop: searchInputRect?.bottom,\n\t\t\t\tleft: searchInputRect?.left,\n\t\t\t\tminWidth: searchInputRect?.width,\n\t\t\t}}\n\t\t>\n\t\t\t{noEntries ? (\n\t\t\t\t<Trans i18nKey=\"reactable.noEntriesFound\">No entries found</Trans>\n\t\t\t) : (\n\t\t\t\t<>\n\t\t\t\t\t<HasAuthorities authorities={['READ_ASSET']}>\n\t\t\t\t\t\t<SearchResultSection\n\t\t\t\t\t\t\ttitle={<Trans i18nKey=\"search.assets.searchname\">Assets</Trans>}\n\t\t\t\t\t\t\ticon={<AssetSvg id=\"full-search-result-icon-assets\" />}\n\t\t\t\t\t\t\titems={results.assets}\n\t\t\t\t\t\t\tgetId={asset => asset.urn}\n\t\t\t\t\t\t\tgetName={asset => asset.name}\n\t\t\t\t\t\t\tgetUrl={asset => `/assets/${asset.id}`}\n\t\t\t\t\t\t\tgetAllUrl={() => `/assets/list?query=${query}`}\n\t\t\t\t\t\t\tonHide={onHide}\n\t\t\t\t\t\t\tfocusedItem={group === 'assets' ? index : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HasAuthorities>\n\t\t\t\t\t<HasAuthorities authorities={['READ_ASSET_GROUP']}>\n\t\t\t\t\t\t<SearchResultSection\n\t\t\t\t\t\t\ttitle={<Trans i18nKey=\"search.assetgroups\">Asset Groups</Trans>}\n\t\t\t\t\t\t\ticon={<AssetGroupSvg id=\"full-search-result-icon-asset-groups\" />}\n\t\t\t\t\t\t\titems={results.assetGroups}\n\t\t\t\t\t\t\tgetId={assetGroup => assetGroup.id}\n\t\t\t\t\t\t\tgetName={assetGroup => assetGroup.displayName || assetGroup.name}\n\t\t\t\t\t\t\tgetUrl={assetGroup => `/assetgroups/${assetGroup.id}`}\n\t\t\t\t\t\t\tgetAllUrl={() => `/assetgroups/list?query=${query}`}\n\t\t\t\t\t\t\tonHide={onHide}\n\t\t\t\t\t\t\tfocusedItem={group === 'assetGroups' ? index : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HasAuthorities>\n\t\t\t\t\t<HasAuthorities authorities={['READ_ACCOUNT']}>\n\t\t\t\t\t\t<SearchResultSection\n\t\t\t\t\t\t\ttitle={<Trans i18nKey=\"search.users.searchname\">Users</Trans>}\n\t\t\t\t\t\t\ticon={<UserSvg id=\"full-search-result-icon-users\" />}\n\t\t\t\t\t\t\titems={results.users}\n\t\t\t\t\t\t\tgetId={user => user.number}\n\t\t\t\t\t\t\tgetName={user => getNameFallbackFromHotpot(user)}\n\t\t\t\t\t\t\tgetUrl={user => `/users/${user.number}`}\n\t\t\t\t\t\t\tgetAllUrl={() => `/users/list?query=${query}`}\n\t\t\t\t\t\t\tonHide={onHide}\n\t\t\t\t\t\t\tfocusedItem={group === 'users' ? index : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HasAuthorities>\n\t\t\t\t\t<HasAuthorities authorities={['READ_ACCOUNT_GROUP']}>\n\t\t\t\t\t\t<SearchResultSection\n\t\t\t\t\t\t\ttitle={<Trans i18nKey=\"search.usergroups.searchname\">User Groups</Trans>}\n\t\t\t\t\t\t\ticon={<UserGroupSvg id=\"full-search-result-icon-user-groups\" />}\n\t\t\t\t\t\t\titems={results.userGroups}\n\t\t\t\t\t\t\tgetId={userGroup => userGroup.id}\n\t\t\t\t\t\t\tgetName={userGroup => userGroup.displayName ?? userGroup.name}\n\t\t\t\t\t\t\tgetUrl={userGroup => `/usergroups/${userGroup.id}`}\n\t\t\t\t\t\t\tgetAllUrl={() => `/usergroups/list?query=${query}`}\n\t\t\t\t\t\t\tonHide={onHide}\n\t\t\t\t\t\t\tfocusedItem={group === 'userGroups' ? index : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HasAuthorities>\n\t\t\t\t\t<HasAuthorities authorities={['READ_ROLE']}>\n\t\t\t\t\t\t<SearchResultSection\n\t\t\t\t\t\t\ttitle={<Trans i18nKey=\"search.roles.searchname\">Roles</Trans>}\n\t\t\t\t\t\t\ticon={<RoleSvg id=\"full-search-result-icon-roles\" />}\n\t\t\t\t\t\t\titems={results.roles}\n\t\t\t\t\t\t\tgetId={role => role.id}\n\t\t\t\t\t\t\tgetName={role => role.name}\n\t\t\t\t\t\t\tgetUrl={role => `/roles/${role.id}`}\n\t\t\t\t\t\t\tgetAllUrl={() => `/roles/list?query=${query}`}\n\t\t\t\t\t\t\tonHide={onHide}\n\t\t\t\t\t\t\tfocusedItem={group === 'roles' ? index : undefined}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</HasAuthorities>\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>,\n\t\troot,\n\t);\n}\n","import {useEffect, useState} from 'react';\n\nimport {\n\ttype Asset,\n\ttype AssetGroup,\n\ttype Pageable,\n\ttype PaginationSettings,\n\ttype Role,\n\tsearchAssetGroups,\n\tsearchAssets,\n\tsearchUserGroups,\n\tsearchUsers,\n\ttype User,\n\ttype UserGroup,\n} from '@deviceinsight/ng-ui-api-client';\n\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport makeCancelable from 'utils/makeCancelable';\nimport {getSearchAssetListQueryFilteredByAllowedAssetTypes} from '../assets/search';\nimport {searchRoles} from '../roles/search';\n\nexport const MAX_ELEMENTS = 10;\n\nexport type FindResourcesResult<Resource> = {\n\tdata: Resource[];\n\ttotal: number;\n};\nexport type FullSearchResults = {\n\tassets: FindResourcesResult<Asset> | undefined;\n\tassetGroups: FindResourcesResult<AssetGroup> | undefined;\n\tusers: FindResourcesResult<User> | undefined;\n\tuserGroups: FindResourcesResult<UserGroup> | undefined;\n\troles: FindResourcesResult<Role> | undefined;\n\treload: () => void;\n};\n\nconst PAGINATION_SETTINGS: PaginationSettings = {\n\tsize: MAX_ELEMENTS,\n\tpage: 0,\n\tsort: {\n\t\tproperty: 'name',\n\t\tdirection: 'ASC',\n\t},\n};\n\nfunction searchAssetsWithAdditionalQuery(query: string, paginationSettings: PaginationSettings) {\n\treturn searchAssets(getSearchAssetListQueryFilteredByAllowedAssetTypes(query), paginationSettings);\n}\n\nfunction useResources<Resource>(\n\tquery: string,\n\tfetchFn: (query: string, paginationSettings: PaginationSettings) => Promise<Pageable<Resource>>,\n\tauthority: string,\n\treloadTrigger: number,\n): FindResourcesResult<Resource> | undefined {\n\tconst [data, setData] = useState<Resource[]>();\n\tconst [total, setTotal] = useState(0);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tsetData(undefined);\n\t}, [query]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tif (!query.trim() || !hasAuthorities([authority])) {\n\t\t\tsetData([]);\n\t\t\tsetTotal(0);\n\t\t\treturn;\n\t\t}\n\n\t\tsetData(undefined);\n\t\tconst {promise, cancel} = makeCancelable(fetchFn(query, PAGINATION_SETTINGS));\n\n\t\tpromise\n\t\t\t.then(result => {\n\t\t\t\tsetData(result.content);\n\t\t\t\tsetTotal(result.totalElements);\n\t\t\t})\n\t\t\t.catch(error => {\n\t\t\t\tif (error.isCanceled) {\n\t\t\t\t\t// Ignore\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('[useResources] API Error:', error);\n\t\t\t\t}\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tcancel();\n\t\t};\n\t}, [fetchFn, query, authority, reloadTrigger]);\n\n\treturn data ? {data, total} : undefined;\n}\n\nexport function useFullSearch(query: string): FullSearchResults {\n\tconst [reloadTrigger, setReloadTrigger] = useState(0);\n\tconst assets = useResources(query, searchAssetsWithAdditionalQuery, 'READ_ASSET', reloadTrigger);\n\tconst assetGroups = useResources(query, searchAssetGroups, 'READ_ASSET_GROUP', reloadTrigger);\n\tconst users = useResources(query, searchUsers, 'READ_ACCOUNT', reloadTrigger);\n\tconst userGroups = useResources(query, searchUserGroups, 'READ_ACCOUNT_GROUP', reloadTrigger);\n\tconst roles = useResources(query, searchRoles, 'READ_ROLE', reloadTrigger);\n\n\treturn {assets, assetGroups, users, userGroups, roles, reload: () => setReloadTrigger(rt => rt + 1)};\n}\n","import type * as React from 'react';\nimport {useEffect, useRef, useState} from 'react';\n\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport iconMagnifier from 'assets/svg/icon_lupe.svg';\nimport {useResizeObserver} from 'hooks/useResizeObserver';\nimport {useTranslation} from 'i18n';\nimport {nonNull} from 'utils/tsUtils';\nimport {FullSearchResultsPanel} from './FullSearchResultsPanel';\nimport {useFullSearch} from './useFullSearch';\nimport {NavigationEvent, useNavigationEventEmitter} from './useNavigationEventEmitter';\n\nexport function GlobalFullSearch() {\n\tconst {t} = useTranslation();\n\tconst [resultsVisible, setResultsVisible] = useState(false);\n\tconst {ref, entries} = useResizeObserver<HTMLSpanElement>();\n\tconst [inputQuery, setInputQuery] = useState<string>('');\n\tconst finalQuery =\n\t\tinputQuery && inputQuery.includes('*')\n\t\t\t? inputQuery\n\t\t\t: inputQuery.includes(':') && !/^\".*\"$/.test(inputQuery)\n\t\t\t\t? `\"*${inputQuery}*\"`\n\t\t\t\t: `*${inputQuery}*`;\n\tconst fullSearchResults = useFullSearch(finalQuery);\n\tconst searchInputRect = entries?.length ? entries[0].target.getBoundingClientRect() : undefined;\n\tconst keyboardEventEmitter = useNavigationEventEmitter();\n\tconst searchButtonRef = useRef<HTMLElement>(null);\n\tconst searchInputRef = useRef<HTMLInputElement>(null);\n\n\tfunction handleFocus(event: React.FocusEvent<HTMLInputElement>) {\n\t\tkeyboardEventEmitter.emit(NavigationEvent.reset);\n\t\tif (event.target.value) {\n\t\t\tsetResultsVisible(true);\n\t\t}\n\t}\n\n\tfunction handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n\t\tsetInputQuery(event.target.value);\n\t\tif (!resultsVisible && event.target.value) {\n\t\t\tsetResultsVisible(true);\n\t\t} else if (resultsVisible && !event.target.value) {\n\t\t\tsetResultsVisible(false);\n\t\t}\n\t}\n\n\tuseEffect(() => {\n\t\tconst listener = () => {\n\t\t\tsearchInputRef.current?.focus();\n\t\t};\n\t\tkeyboardEventEmitter.addListener(NavigationEvent.reset, listener);\n\t\treturn () => keyboardEventEmitter.removeListener(NavigationEvent.reset, listener);\n\t}, [keyboardEventEmitter]);\n\n\treturn (\n\t\t<span className=\"di search-bar full-search\" ref={ref}>\n\t\t\t<span className=\"di search-input\">\n\t\t\t\t<input\n\t\t\t\t\tref={searchInputRef}\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclassName=\"search-input-field rounded\"\n\t\t\t\t\tplaceholder={t('search.placeholder', {defaultValue: 'Search'})}\n\t\t\t\t\tautoFocus\n\t\t\t\t\tonFocus={handleFocus}\n\t\t\t\t\tonChange={handleChange}\n\t\t\t\t\tonKeyDown={event => {\n\t\t\t\t\t\tif (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\tevent.currentTarget.blur();\n\t\t\t\t\t\t\tkeyboardEventEmitter.emit(\n\t\t\t\t\t\t\t\tevent.key === 'ArrowUp' ? NavigationEvent.up : NavigationEvent.down,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}\n\t\t\t\t\tvalue={inputQuery}\n\t\t\t\t/>\n\t\t\t</span>\n\t\t\t<span className=\"search-btn search-submit-btn rounded\" ref={searchButtonRef}>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => fullSearchResults.reload()}\n\t\t\t\t\tdata-testid=\"search-button\"\n\t\t\t\t\tdisabled={inputQuery.trim() === ''}\n\t\t\t\t>\n\t\t\t\t\t<img src={iconMagnifier} alt=\"search icon\" className=\"icon\" width={16} height={16} />\n\t\t\t\t</Button>\n\t\t\t</span>\n\t\t\t<FullSearchResultsPanel\n\t\t\t\telementsIgnoredOnClickOutside={[searchButtonRef.current, searchInputRef.current].filter(nonNull)}\n\t\t\t\tsearchInputRect={searchInputRect}\n\t\t\t\tvisible={resultsVisible}\n\t\t\t\tonHide={() => setResultsVisible(false)}\n\t\t\t\tresults={fullSearchResults}\n\t\t\t\tquery={finalQuery}\n\t\t\t\tkeyboardEventEmitter={keyboardEventEmitter}\n\t\t\t/>\n\t\t</span>\n\t);\n}\n","import cx from 'classnames';\n\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\nimport './SearchModeSwitch.scss';\n\ntype Props = {\n\tmode: 'full' | 'context';\n\tonModeChange: (mode: 'full' | 'context') => void;\n};\n\nexport function SearchModeSwitch({mode, onModeChange}: Props) {\n\treturn (\n\t\t<div className=\"di search-mode-switch\">\n\t\t\t<Button className={cx({on: mode === 'full'})} naked onClick={() => onModeChange('full')}>\n\t\t\t\t<Trans i18nKey=\"search.mode.full\">Full</Trans>\n\t\t\t</Button>\n\t\t\t<Button className={cx({on: mode === 'context'})} naked onClick={() => onModeChange('context')}>\n\t\t\t\t<Trans i18nKey=\"search.mode.context\">Context</Trans>\n\t\t\t</Button>\n\t\t</div>\n\t);\n}\n","import {type ComponentType, useContext, useState} from 'react';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport {GlobalContextSearch} from 'modules/contextSearch/GlobalContextSearch';\nimport {GlobalFullSearch} from 'modules/fullSearch/GlobalFullSearch';\nimport './HeaderSearch.scss';\n\nimport customizable from 'customization/customizable';\nimport {SearchModeSwitch} from './SearchModeSwitch';\n\nfunction HeaderSearch() {\n\tconst {defaultSearchMode} = useContext(UserContext);\n\tconst [searchMode, setSearchMode] = useState<'full' | 'context'>(defaultSearchMode);\n\treturn (\n\t\t<>\n\t\t\t{searchMode === 'context' ? <GlobalContextSearch /> : <GlobalFullSearch />}\n\t\t\t<SearchModeSwitch mode={searchMode} onModeChange={setSearchMode} />\n\t\t</>\n\t);\n}\n\nexport default customizable('HeaderSearch')(HeaderSearch) as ComponentType;\n","import {useContext} from 'react';\n\nimport {ContextBarContext} from './ContextBarContext';\n\nexport function ContextBar() {\n\tconst {items} = useContext(ContextBarContext);\n\treturn <>{items}</>;\n}\n","import type {ComponentType} from 'react';\n\nimport type {ContextActionType, ContextInfoProps, RouteConfig} from 'routes/types';\n\nconst findMatchingRoute = (routes: RouteConfig[], pathSegments: string[]) => {\n\treturn routes.find(route => {\n\t\tconst routeSegments = route.relativePath.split('/');\n\n\t\treturn routeSegments.every(\n\t\t\t(routeSegment, index) => routeSegment === pathSegments[index] || routeSegment.startsWith(':'),\n\t\t);\n\t});\n};\n\nconst findBestMatchingComponentRec = <Component>(\n\troutes: RouteConfig[],\n\tpathSegments: string[],\n\tgetComponent: (route: RouteConfig) => Component | null | undefined,\n\tcurrentContextAction: Component | null,\n): Component | null => {\n\tif (pathSegments.length === 0) return currentContextAction;\n\n\tconst route = findMatchingRoute(routes, pathSegments);\n\tif (!route) return currentContextAction;\n\n\tconst newContextAction = getComponent(route) || currentContextAction;\n\tconst routeSegmentsCount = route.relativePath.split('/').length;\n\n\treturn findBestMatchingComponentRec(\n\t\troute?.childRoutes ?? [],\n\t\tpathSegments.slice(routeSegmentsCount),\n\t\tgetComponent,\n\t\tnewContextAction,\n\t);\n};\n\nexport const findContextActionComponent = (\n\troutes: Array<RouteConfig>,\n\tpathname: string,\n): ComponentType<ContextActionType> | null => {\n\tconst segments = pathname.split('/').filter(segment => segment.length);\n\n\treturn findBestMatchingComponentRec(routes, segments, route => route.contextAction, null);\n};\n\nexport const findContextInfoComponent = (\n\troutes: Array<RouteConfig>,\n\tpathname: string,\n): ComponentType<ContextInfoProps> | null => {\n\tconst segments = pathname.split('/').filter(segment => segment.length);\n\n\treturn findBestMatchingComponentRec(routes, segments, route => route.contextInfo, null);\n};\n","import {useContext} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {HasAuthorities} from 'components/auth/HasAuthorities';\nimport {ContextBar} from 'contexts/contextBar/ContextBar';\nimport {ContextBarContext} from 'contexts/contextBar/ContextBarContext';\nimport type {RouteConfig} from 'routes/types';\nimport {findContextActionComponent} from 'utils/pathUtils';\nimport './ContextAction.scss';\n\ntype Props = {\n\troutes: Array<RouteConfig>;\n};\n\nexport default function ContextAction({routes}: Props) {\n\tconst {pathname} = useLocation();\n\tconst {items} = useContext(ContextBarContext);\n\tconst ActionButtons = findContextActionComponent(routes, pathname);\n\tconst showToolbar = !!ActionButtons || items.length > 0;\n\n\treturn (\n\t\t<div>\n\t\t\t{showToolbar && (\n\t\t\t\t<div className=\"di floor-2-toolbar\">\n\t\t\t\t\t<ContextBar />\n\t\t\t\t\t{!!ActionButtons && <ActionButtons pathname={pathname} HasAuthorities={HasAuthorities} />}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","export default \"data:image/svg+xml,%3csvg%20id='icon_asset_linked_to_gateway'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2040%2024'%20width='40'%20height='24'%3e%3cg%20id='bed'%3e%3crect%20id='verbinder'%20x='7'%20y='11'%20width='10'%20height='2'%20style='fill:%20%23bbb'/%3e%3ccircle%20id='kreis-links-klein'%20cx='4'%20cy='12'%20r='4'%20style='fill:%20%23bbb'/%3e%3ccircle%20id='kreis-rechts-gross'%20cx='28'%20cy='12'%20r='12'%20style='fill:%20%23bbb'/%3e%3c/g%3e%3cg%20id='sender'%3e%3cpath%20d='M28,11s0,7,3,9'%20style='fill:%20none;stroke:%20%23fff;stroke-linecap:%20round;stroke-miterlimit:%2010;stroke-width:%201.5px'/%3e%3cpath%20d='M28,11s0,7-3,9'%20style='fill:%20none;stroke:%20%23fff;stroke-linecap:%20round;stroke-miterlimit:%2010;stroke-width:%201.5px'/%3e%3c/g%3e%3cpath%20id='welle-innen'%20d='M24.87,15.29a4.56,4.56,0,0,1-.11-6.37A4.37,4.37,0,0,1,31,8.82a4.56,4.56,0,0,1,.11,6.36'%20style='fill:%20none;stroke:%20%23fff;stroke-linecap:%20square;stroke-miterlimit:%2010;stroke-width:%201.5px'/%3e%3cpath%20id='welle-aussen'%20d='M22.58,18a7.85,7.85,0,0,1-.19-11,7.53,7.53,0,0,1,10.78-.18,7.86,7.86,0,0,1,.19,11'%20style='fill:%20none;stroke:%20%23fff;stroke-linecap:%20square;stroke-miterlimit:%2010;stroke-width:%201.5px'/%3e%3c/svg%3e\"","import type {PropsWithChildren} from 'react';\n\nconst ContextInfoCrumbMain = ({children}: PropsWithChildren) => (\n\t<div className=\"di object-holder\">\n\t\t<div className=\"di object-crumbs\">\n\t\t\t<span className=\"crumb\">{children}</span>\n\t\t</div>\n\t</div>\n);\n\nexport default ContextInfoCrumbMain;\n","import type {PropsWithChildren} from 'react';\n\nconst ContextInfoCrumbStatus = ({children}: PropsWithChildren) => (\n\t<div className=\"di object-status\">\n\t\t<div className=\"status-elm\">{children}</div>\n\t</div>\n);\n\nexport default ContextInfoCrumbStatus;\n","import {Link} from 'react-router-dom';\n\nimport {Bubble, Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport linkedToGatewayIcon from 'assets/svg/icon_asset_linked_to_gateway.svg';\nimport gatewayIcon from 'assets/svg/icon_gateway.svg';\nimport {TagsDropdown} from 'components/misc/TagsDropdown';\nimport type {ContextInfoAsset} from 'contexts/contextInfo/ContextInfoContext';\nimport {Trans} from 'i18n';\nimport AssetGroupWithHierarchyBubble from 'modules/assetgroups/components/AssetGroupWithHierarchyBubble';\nimport ContextInfoCrumbMain from './ContextInfoCrumbMain';\nimport './AssetContextInfo.scss';\n\nimport {AssetConnectionState} from './AssetConnectionState';\nimport ContextInfoCrumbStatus from './ContextInfoCrumbStatus';\n\ntype Props = {\n\tinfo: ContextInfoAsset;\n};\n\nconst MAXIMUM_ASSETGROUPS_TO_DISPLAY = 3;\n\nexport const AssetContextInfo = ({info: {asset, assetGroups, gateway}}: Props) => {\n\tconst tooltip = gateway ? (\n\t\t<Trans i18nKey=\"page.contextInfo.connectedGateway\">\n\t\t\tAsset is connected to {{gatewayName: gateway ? `\"${gateway.name}\"` : ''}}. Click to visit the Gateway\n\t\t</Trans>\n\t) : (\n\t\t''\n\t);\n\n\treturn (\n\t\t<div className=\"di object-holder\">\n\t\t\t<ContextInfoCrumbMain>{asset.name || asset.urn}</ContextInfoCrumbMain>\n\t\t\t<ContextInfoCrumbStatus>\n\t\t\t\t<AssetConnectionState asset={asset} />\n\t\t\t</ContextInfoCrumbStatus>\n\t\t\t{asset.isGateway && <img src={gatewayIcon} alt=\"gateway\" className=\"gatewayIconContextInfo\" />}\n\t\t\t{!asset.isGateway && gateway && (\n\t\t\t\t<Bubble direction=\"bottom\" content={tooltip}>\n\t\t\t\t\t<Link to={`/assets/${gateway.id}`}>\n\t\t\t\t\t\t<Button className=\"linkedToGatewayIconContextInfo-button\" naked>\n\t\t\t\t\t\t\t<img\n\t\t\t\t\t\t\t\tsrc={linkedToGatewayIcon}\n\t\t\t\t\t\t\t\talt=\"linked to gateway\"\n\t\t\t\t\t\t\t\tclassName=\"linkedToGatewayIconContextInfo\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Link>\n\t\t\t\t</Bubble>\n\t\t\t)}\n\n\t\t\t<div className=\"di object-groups\">\n\t\t\t\t<TagsDropdown\n\t\t\t\t\ttags={assetGroups.map(({id, name}) => ({\n\t\t\t\t\t\tkey: id,\n\t\t\t\t\t\tname,\n\t\t\t\t\t\turl: '',\n\t\t\t\t\t}))}\n\t\t\t\t\tmultipleItemsLabel={\n\t\t\t\t\t\t<Trans i18nKey=\"page.contextInfo.assetGroupsCount\" count={assetGroups.length}>\n\t\t\t\t\t\t\t{{count: assetGroups.length}} Asset Groups\n\t\t\t\t\t\t</Trans>\n\t\t\t\t\t}\n\t\t\t\t\tmaxTagsInRow={MAXIMUM_ASSETGROUPS_TO_DISPLAY}\n\t\t\t\t\trenderItem={({key}) => {\n\t\t\t\t\t\tconst assetGroup = assetGroups.find(({id}) => id === key);\n\n\t\t\t\t\t\tif (assetGroup) {\n\t\t\t\t\t\t\treturn <AssetGroupWithHierarchyBubble assetGroup={assetGroup} labelSize=\"small\" />;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type {TranslationDescriptor} from 'i18n';\n\nconst assetTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.assets.all',\n\t\tdefaultValue: '{{elements}} Assets',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.assets.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} Assets',\n\t},\n};\n\nconst assetGroupTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.assetGroups.all',\n\t\tdefaultValue: '{{elements}} Asset Groups',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.assetGroups.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} Asset Groups',\n\t},\n};\n\nconst userTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.users.all',\n\t\tdefaultValue: '{{elements}} Users',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.users.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} Users',\n\t},\n};\n\nconst userGroupTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.userGroups.all',\n\t\tdefaultValue: '{{elements}} User Groups',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.userGroups.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} User Groups',\n\t},\n};\n\nconst rolesTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.roles.all',\n\t\tdefaultValue: '{{elements}} Roles',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.roles.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} Roles',\n\t},\n};\n\nconst notificationTemplatesTranslations = {\n\tall: {\n\t\tid: 'page.contextInfo.search.notificationTemplates.all',\n\t\tdefaultValue: '{{elements}} Templates',\n\t},\n\tsome: {\n\t\tid: 'page.contextInfo.search.notificationTemplates.some',\n\t\tdefaultValue: '<strong>{{elements}}</strong> of {{totalElements}} Templates',\n\t},\n};\n\nexport const getTranslationsByContext = (\n\tcontext: string,\n): {\n\tall: TranslationDescriptor;\n\tsome: TranslationDescriptor;\n} => {\n\tswitch (context) {\n\t\tcase 'assets':\n\t\t\treturn assetTranslations;\n\n\t\tcase 'assetgroups':\n\t\t\treturn assetGroupTranslations;\n\n\t\tcase 'users':\n\t\t\treturn userTranslations;\n\n\t\tcase 'usergroups':\n\t\t\treturn userGroupTranslations;\n\n\t\tcase 'roles':\n\t\t\treturn rolesTranslations;\n\n\t\tcase 'notificationtemplates':\n\t\t\treturn notificationTemplatesTranslations;\n\n\t\tdefault:\n\t\t\tthrow Error(`context ${context} not supported`);\n\t}\n};\n","import type {JSX, ReactNode} from 'react';\n\nimport {Bubble} from '@deviceinsight/ng-ui-basic-components';\n\nimport icon from 'assets/svg/icon_lupe.svg';\nimport type {ContextInfoSearch} from 'contexts/contextInfo/ContextInfoContext';\nimport {Trans, useTranslation} from 'i18n';\nimport ContextInfoCrumbMain from './ContextInfoCrumbMain';\nimport {getTranslationsByContext} from './getTranslationsByContext';\n\ntype Props = {\n\tinfo: ContextInfoSearch;\n\ttooltip: string | null | undefined;\n};\n\nconst BubbleWrapper = ({tooltip, children}: {tooltip: ReactNode | null | undefined; children: JSX.Element}) => {\n\tif (tooltip) {\n\t\treturn <Bubble content={tooltip}>{children}</Bubble>;\n\t}\n\n\treturn children;\n};\n\nfunction getTotalElementsLabel(\n\ttotalElements: number | null | undefined,\n\ttotalElementsAccurate: boolean | null | undefined,\n): string {\n\tif (!totalElements) return '0';\n\tif (totalElementsAccurate === false) return '10000+';\n\treturn totalElements.toString();\n}\n\nexport default function SearchContextInfo({\n\tinfo: {elements, totalElements, totalElementsAccurate, context, customTranslations},\n\ttooltip,\n}: Props) {\n\tconst {t} = useTranslation();\n\tconst translations = customTranslations || getTranslationsByContext(context);\n\tconst tooltipTotalElementsNotAccurate = (\n\t\t<Trans i18nKey=\"asset.search.count.tooltip\">Please refine your search to narrow down the result</Trans>\n\t);\n\tconst infoElement =\n\t\telements === totalElements ? (\n\t\t\t<span className=\"search-result\">\n\t\t\t\t<BubbleWrapper tooltip={!totalElementsAccurate ? tooltipTotalElementsNotAccurate : tooltip}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t__html: t(translations.all.id, {\n\t\t\t\t\t\t\t\telements: getTotalElementsLabel(totalElements, totalElementsAccurate),\n\t\t\t\t\t\t\t\tdefaultValue: translations.all.defaultValue,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</BubbleWrapper>\n\t\t\t</span>\n\t\t) : (\n\t\t\t<span className=\"search-result\">\n\t\t\t\t<img\n\t\t\t\t\tsrc={icon}\n\t\t\t\t\talt=\"search icon\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\tmarginRight: '5px',\n\t\t\t\t\t\topacity: '.8',\n\t\t\t\t\t\twidth: 16,\n\t\t\t\t\t\theight: 16,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<BubbleWrapper tooltip={tooltip}>\n\t\t\t\t\t<span\n\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t__html: t(translations.some.id, {\n\t\t\t\t\t\t\t\telements: elements.toString(),\n\t\t\t\t\t\t\t\ttotalElements: totalElements || '?',\n\t\t\t\t\t\t\t\tdefaultValue: translations.some.defaultValue,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</BubbleWrapper>\n\t\t\t</span>\n\t\t);\n\n\treturn <ContextInfoCrumbMain>{infoElement}</ContextInfoCrumbMain>;\n}\n","import {useContext} from 'react';\n\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {AssetContextInfo} from './AssetContextInfo';\nimport ContextInfoCrumbMain from './ContextInfoCrumbMain';\nimport SearchContextInfo from './SearchContextInfo';\n\nexport default function DefaultContextInfoPanel() {\n\tconst {contextInfo, tooltip} = useContext(ContextInfoContext);\n\n\tif (contextInfo) {\n\t\tswitch (contextInfo.type) {\n\t\t\tcase 'string':\n\t\t\t\treturn <ContextInfoCrumbMain>{contextInfo.value}</ContextInfoCrumbMain>;\n\n\t\t\tcase 'search':\n\t\t\t\treturn <SearchContextInfo info={contextInfo} tooltip={tooltip} />;\n\n\t\t\tcase 'asset':\n\t\t\t\treturn <AssetContextInfo info={contextInfo} />;\n\n\t\t\tcase 'assetGroup':\n\t\t\t\treturn (\n\t\t\t\t\t<ContextInfoCrumbMain>\n\t\t\t\t\t\t{contextInfo.assetGroup.displayName || contextInfo.assetGroup.name}\n\t\t\t\t\t</ContextInfoCrumbMain>\n\t\t\t\t);\n\n\t\t\tdefault:\n\t\t\t\t// @ts-expect-error\n\t\t\t\tthrow Error(`unknown context info type: ${contextInfo.type}`);\n\t\t}\n\t} else {\n\t\treturn null;\n\t}\n}\n","import {useLocation} from 'react-router-dom';\n\nimport type {RouteConfig} from 'routes/types';\nimport {findContextInfoComponent} from 'utils/pathUtils';\nimport DefaultContextInfoPanel from './DefaultContextInfoPanel';\nimport './ContextInfo.scss';\n\ntype Props = {\n\troutes: Array<RouteConfig>;\n};\n\nexport default function ContextInfoPanel({routes}: Props) {\n\tconst {pathname} = useLocation();\n\tconst ContextInfoComponent = findContextInfoComponent(routes, pathname);\n\n\tif (ContextInfoComponent) {\n\t\treturn <ContextInfoComponent pathname={pathname} />;\n\t} else {\n\t\treturn <DefaultContextInfoPanel />;\n\t}\n}\n","import type {User} from '@deviceinsight/ng-ui-api-client';\n\nimport {ContextInfo} from 'contexts/contextInfo/ContextInfoContext';\nimport RouteApi from 'customization/RouteApi';\nimport {RouteConfig, RouteLink} from './types';\n\nconst resolvePath = (pathname: string, basePath: string, relativePath: string): string => {\n\tif (relativePath.indexOf(':') === 0) {\n\t\tconst startIndex = basePath.length + 1;\n\t\tconst endIndex = pathname.substring(startIndex).indexOf('/');\n\t\tconst id = pathname.substring(startIndex, endIndex > 0 ? endIndex : undefined);\n\t\treturn `${basePath}/${id}`;\n\t}\n\n\treturn `${basePath}/${relativePath}`;\n};\n\nexport const getRouteLinks = (\n\tpathname: string,\n\tlevel: number,\n\tcontextInfo: ContextInfo | null | undefined,\n\tuser: User,\n): Array<RouteLink> => {\n\tconst rootRoutes = RouteApi.filterRoutesByEnabledApps();\n\tlet routes: Array<RouteConfig> = RouteApi.filterRoutes(rootRoutes, user, contextInfo);\n\tconst basePath = pathname\n\t\t.split('/')\n\t\t.filter(pathSegment => pathSegment.length)\n\t\t.slice(0, level - 1)\n\t\t.reduce((acc, pathSegment) => {\n\t\t\tconst route =\n\t\t\t\troutes.find(c => c.relativePath === pathSegment) || routes.find(c => c.relativePath.indexOf(':') === 0);\n\n\t\t\troutes = route?.childRoutes?.filter(r => !r.show || r.show(contextInfo, user)) ?? [];\n\n\t\t\treturn `${acc}/${pathSegment}`;\n\t\t}, '');\n\n\troutes = routes.filter(route => !route.excludeFromNavigation);\n\treturn routes.map(route => {\n\t\tconst path = resolvePath(pathname, basePath, route.relativePath);\n\t\treturn {\n\t\t\tpath,\n\t\t\tlabel: route.label,\n\t\t\tactive: pathname === path || pathname.indexOf(`${path}/`) === 0,\n\t\t\ticonSvg: route.iconSvg,\n\t\t\ticonLight: route.iconLight,\n\t\t\ticonDark: route.iconDark,\n\t\t\trequiredAuthorities: route.requiredAuthorities,\n\t\t};\n\t});\n};\n","import type {NavGroup, RouteLink} from 'routes/types';\n\nfunction transformRouteLinkId(id: string) {\n\treturn id.replaceAll('.', '-');\n}\n\nexport function getIconRouteLinkHtmlId(prefix: string, routeLink: RouteLink) {\n\tif (routeLink.label && routeLink.label.id) {\n\t\treturn `${prefix}-icon-${transformRouteLinkId(routeLink?.label?.id)}`;\n\t} else {\n\t\treturn undefined;\n\t}\n}\n\nexport function getIconNavGroupHtmlId(prefix: string, navGroup: NavGroup) {\n\tif (navGroup.label && navGroup.label.id) {\n\t\treturn `${prefix}-icon-${transformRouteLinkId(navGroup?.label?.id)}`;\n\t} else {\n\t\treturn undefined;\n\t}\n}\n","export default \"data:image/svg+xml,%3csvg%20id='Layer_1'%20data-name='Layer%201'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2016%2016'%20width='16'%20height='16'%3e%3cg%3e%3cpolygon%20points='10.5%2014.5%2010.5%2010.5%206.5%2010.5%206.5%2014.5%203.5%2014.5%203.5%208.5%2012.5%208.5%2012.5%2014.5%2010.5%2014.5'/%3e%3cpath%20d='M12,9v5H11V10H6v4H4V9h8m1-1H3v7H7V11h3v4h3V8Z'/%3e%3c/g%3e%3cpolygon%20points='8%201%201%208%2015%208%208%201'/%3e%3c/svg%3e\"","import classNames from 'classnames';\nimport {type JSX, useCallback, useContext, useEffect, useState} from 'react';\nimport {Link, useLocation} from 'react-router-dom';\n\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {UserContext} from 'contexts/user/UserContext';\nimport RouteApi from 'customization/RouteApi';\nimport {Trans} from 'i18n';\nimport RequiredAuthoritiesInfo from 'modules/requiredAuthorities/RequiredAuthoritiesInfo';\nimport {getCustomStartPage} from 'modules/users/startpage';\nimport {getRouteLinks} from 'routes/helper';\nimport type {NavGroup, RouteLink} from 'routes/types';\nimport {getIconNavGroupHtmlId, getIconRouteLinkHtmlId} from 'utils/htmlIdUtils';\n\nimport './MainNavi.scss';\n\nimport {ReactComponent as IconHome} from 'assets/svg/icon_home.svg';\n\ntype Entries = {\n\tindex: number;\n\tcomponent: JSX.Element;\n};\n\nfunction IconLight(IconDark: any, iconHtmlId: string | undefined) {\n\tif (IconDark) {\n\t\treturn <IconDark id={iconHtmlId} style={{fill: 'white', width: '16px', height: '16px'}} />;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nfunction MainNaviLink({routeLink}: {routeLink: RouteLink}) {\n\tif (routeLink.iconSvg) {\n\t\tconst iconHtmlId = getIconRouteLinkHtmlId('mainnavi', routeLink);\n\t\treturn (\n\t\t\t<li key={routeLink.path}>\n\t\t\t\t<Link to={routeLink.path}>\n\t\t\t\t\t{IconLight(routeLink.iconSvg, iconHtmlId)}\n\t\t\t\t\t{!!routeLink.label && <Trans i18nKey={routeLink.label.id}>{routeLink.label.defaultValue}</Trans>}\n\t\t\t\t\t<RequiredAuthoritiesInfo authorities={routeLink.requiredAuthorities} />\n\t\t\t\t</Link>\n\t\t\t</li>\n\t\t);\n\t} else {\n\t\treturn (\n\t\t\t<li style={{backgroundImage: `url(${routeLink.iconLight || ''})`}} key={routeLink.path}>\n\t\t\t\t<Link to={routeLink.path}>\n\t\t\t\t\t{!!routeLink.label && <Trans i18nKey={routeLink.label.id}>{routeLink.label.defaultValue}</Trans>}\n\t\t\t\t\t<RequiredAuthoritiesInfo authorities={routeLink.requiredAuthorities} />\n\t\t\t\t</Link>\n\t\t\t</li>\n\t\t);\n\t}\n}\n\nfunction MainNaviSubMenu({\n\tnavGroup,\n\trouteLinks,\n\tseparator,\n}: {\n\tnavGroup: NavGroup;\n\trouteLinks: Array<RouteLink>;\n\tseparator?: boolean;\n}) {\n\tif (routeLinks.length === 0) {\n\t\treturn null;\n\t}\n\n\tconst iconHtmlId = getIconNavGroupHtmlId('mainnavi', navGroup);\n\treturn (\n\t\t<li\n\t\t\tclassName={classNames('has-sub', {\n\t\t\t\tseparator,\n\t\t\t})}\n\t\t>\n\t\t\t{IconLight(navGroup.iconSvg, iconHtmlId)}\n\t\t\t<a>\n\t\t\t\t<Trans i18nKey={navGroup.label.id}>{navGroup.label.defaultValue}</Trans>\n\t\t\t</a>\n\t\t\t<ul>\n\t\t\t\t{routeLinks.map(routeLink => (\n\t\t\t\t\t<MainNaviLink routeLink={routeLink} key={routeLink.path} />\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</li>\n\t);\n}\n\nexport default function MainNavi() {\n\tconst [customStartPageLink, setCustomStartPageLink] = useState<RouteLink | null | undefined>(null);\n\tconst location = useLocation();\n\tconst {user} = useContext(UserContext);\n\tconst {contextInfo} = useContext(ContextInfoContext);\n\n\tconst refreshCustomStartPageLink = useCallback(() => {\n\t\tgetCustomStartPage().then(url => {\n\t\t\tsetCustomStartPageLink(\n\t\t\t\turl\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tpath: url,\n\t\t\t\t\t\t\tlabel: {\n\t\t\t\t\t\t\t\tid: 'route.label.startpage.name',\n\t\t\t\t\t\t\t\tdefaultValue: 'Home',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\ticonSvg: IconHome,\n\t\t\t\t\t\t\tactive: false,\n\t\t\t\t\t\t}\n\t\t\t\t\t: null,\n\t\t\t);\n\t\t});\n\t}, []);\n\n\tuseEffect(() => refreshCustomStartPageLink(), [refreshCustomStartPageLink]);\n\n\tfunction getMainNaviLinks() {\n\t\tconst links = getRouteLinks(location.pathname, 1, contextInfo, user);\n\n\t\tif (customStartPageLink) {\n\t\t\treturn [customStartPageLink].concat(links);\n\t\t} else {\n\t\t\treturn links;\n\t\t}\n\t}\n\n\tconst routeLinks = getMainNaviLinks();\n\tconst entries: Entries[] = [];\n\tconst availableNavGroups = RouteApi.filterNavGroupsByEnabledApps();\n\trouteLinks.forEach((routeLink, index) => {\n\t\tif (availableNavGroups.every(navGroup => !navGroup.paths.includes(routeLink.path))) {\n\t\t\tentries.push({\n\t\t\t\tindex,\n\t\t\t\tcomponent: <MainNaviLink routeLink={routeLink} key={routeLink.path} />,\n\t\t\t});\n\t\t}\n\t});\n\tavailableNavGroups.forEach(navGroup => {\n\t\tconst navGroupRouteLinks = routeLinks.filter(routeLink => navGroup.paths.includes(routeLink.path));\n\n\t\tif (navGroupRouteLinks.length) {\n\t\t\tentries.push({\n\t\t\t\tindex: routeLinks.findIndex(routeLink => routeLink.path === navGroupRouteLinks[0].path),\n\t\t\t\tcomponent: (\n\t\t\t\t\t<MainNaviSubMenu\n\t\t\t\t\t\tnavGroup={navGroup}\n\t\t\t\t\t\trouteLinks={navGroupRouteLinks}\n\t\t\t\t\t\tkey={`group ${navGroup.icon ?? navGroup.label.id}`}\n\t\t\t\t\t\tseparator={navGroup.separator}\n\t\t\t\t\t/>\n\t\t\t\t),\n\t\t\t});\n\t\t}\n\t});\n\tconst activeRouteLink = routeLinks.find(l => l.active);\n\treturn (\n\t\t<div className=\"di modules\">\n\t\t\t<div className=\"modules-trg\">\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"modules-btn\"\n\t\t\t\t\tonMouseOver={\n\t\t\t\t\t\t/* User might have edited his custom start page since we initialised the menu */\n\t\t\t\t\t\t() => refreshCustomStartPageLink()\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t\t<div className=\"modules-box\">\n\t\t\t\t\t<ul>{entries.sort((e1, e2) => e1.index - e2.index).map(({component}) => component)}</ul>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"modules-info\">\n\t\t\t\t{activeRouteLink && typeof activeRouteLink.label === 'object' && (\n\t\t\t\t\t<Link to={activeRouteLink.path}>\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{!!activeRouteLink.label && (\n\t\t\t\t\t\t\t\t<Trans i18nKey={activeRouteLink.label.id}>{activeRouteLink.label.defaultValue}</Trans>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</Link>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","function isNumericOrUuid(token: string) {\n\t// TODO Typescript can this error be fixed?\n\t// @ts-expect-error isNan can also take strings as an argument\n\treturn !isNaN(token) || /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/.test(token);\n}\n\nexport function determineLevel(pathname: string): number {\n\tconst pathSegments = pathname.split('/').filter(e => e.length);\n\n\tif (pathSegments.length >= 2 && isNumericOrUuid(pathSegments[1])) {\n\t\treturn 3; // detail route\n\t} else if (pathSegments.length >= 2) {\n\t\treturn 2; // create route or overview level\n\t} else {\n\t\treturn 1;\n\t}\n}\n","import {useContext, useEffect, useState} from 'react';\nimport {Link, useLocation} from 'react-router-dom';\n\nimport {readAccountObject, writeAccountObject} from '@deviceinsight/ng-ui-api-client';\nimport {Tooltip} from '@deviceinsight/ng-ui-basic-components';\n\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {UserContext} from 'contexts/user/UserContext';\nimport {Trans, type TranslationDescriptor} from 'i18n';\nimport RequiredAuthoritiesInfo from 'modules/requiredAuthorities/RequiredAuthoritiesInfo';\nimport {getRouteLinks} from 'routes/helper';\nimport {getIconRouteLinkHtmlId} from 'utils/htmlIdUtils';\nimport {determineLevel} from './helpers';\n\nimport './SubNavi.scss';\n\nfunction IconDark(IconDark: any, iconHtmlId: string | undefined) {\n\tif (IconDark) {\n\t\treturn <IconDark id={iconHtmlId} style={{width: '16px', height: '16px'}} />;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nfunction IconLight(IconDark: any, iconHtmlId: string | undefined) {\n\tif (IconDark) {\n\t\treturn <IconDark id={iconHtmlId} style={{fill: 'white', width: '16px', height: '16px'}} />;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nexport default function SubNavi() {\n\tconst {user} = useContext(UserContext);\n\tconst [collapsed, setCollapsedState] = useState(false);\n\tconst {pathname, search} = useLocation();\n\tconst {contextInfo} = useContext(ContextInfoContext);\n\tconst COLLAPSED_KEY = 'uiConfigurations/subnavicollapsed';\n\n\tif (!user) {\n\t\tthrow new Error('user not found');\n\t}\n\n\tconst setCollapsed = async (collapsed: boolean) => {\n\t\tsetCollapsedState(collapsed);\n\t\tawait writeAccountObject(COLLAPSED_KEY, collapsed.toString());\n\t};\n\n\tuseEffect(() => {\n\t\tconst fetchCollapsed = async () => {\n\t\t\tsetCollapsedState(await readAccountObject(COLLAPSED_KEY));\n\t\t};\n\t\tfetchCollapsed();\n\t}, []);\n\n\tconst level = determineLevel(pathname);\n\n\tif (level < 2) {\n\t\treturn null;\n\t}\n\n\tconst routeLinks = getRouteLinks(pathname, level, contextInfo, user)\n\t\t.filter(routeLink => routeLink.iconSvg || routeLink.iconLight)\n\t\t.filter(routeLink => typeof routeLink.label === 'object');\n\n\tif (routeLinks.length <= 1) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={`di main-box-nav ${!collapsed ? 'show' : ''}`}>\n\t\t\t<ul>\n\t\t\t\t<li onClick={() => setCollapsed(!collapsed)}>\n\t\t\t\t\t<div className=\"icon triangle\" />\n\t\t\t\t</li>\n\t\t\t\t{routeLinks.map(routeLink => {\n\t\t\t\t\tconst label: TranslationDescriptor | null | undefined = routeLink.label;\n\t\t\t\t\tconst isSelectedClassName = routeLink.active ? 'selected' : '';\n\t\t\t\t\tconst iconHtmlId = getIconRouteLinkHtmlId('subnavi', routeLink);\n\t\t\t\t\tconst iconSvg =\n\t\t\t\t\t\t(routeLink.active\n\t\t\t\t\t\t\t? IconLight(routeLink.iconSvg, iconHtmlId)\n\t\t\t\t\t\t\t: IconDark(routeLink.iconSvg, iconHtmlId)) || null;\n\t\t\t\t\tconst icon = (routeLink.active ? routeLink.iconLight : routeLink.iconDark) || '';\n\t\t\t\t\tconst currentSearchParams = new URLSearchParams(search);\n\t\t\t\t\tconst linkSearchParams = new URLSearchParams();\n\t\t\t\t\tif (currentSearchParams.has('query'))\n\t\t\t\t\t\tlinkSearchParams.set('query', currentSearchParams.get('query') || '');\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li className={isSelectedClassName} key={routeLink.path}>\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto={{\n\t\t\t\t\t\t\t\t\tpathname: routeLink.path,\n\t\t\t\t\t\t\t\t\tsearch: linkSearchParams.toString(),\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Tooltip\n\t\t\t\t\t\t\t\t\tdisabled={!collapsed}\n\t\t\t\t\t\t\t\t\tcontent={label ? <Trans i18nKey={label.id}>{label.defaultValue}</Trans> : ''}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<span className=\"icon-holder\">\n\t\t\t\t\t\t\t\t\t\t{iconSvg ? (\n\t\t\t\t\t\t\t\t\t\t\ticonSvg\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<span className=\"icon\" style={{backgroundImage: `url(${icon})`}} />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t</Tooltip>\n\t\t\t\t\t\t\t\t<RequiredAuthoritiesInfo authorities={routeLink.requiredAuthorities} />\n\t\t\t\t\t\t\t\t<span className=\"text\">\n\t\t\t\t\t\t\t\t\t{!!label && <Trans i18nKey={label.id}>{label.defaultValue}</Trans>}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n","import type * as React from 'react';\nimport {useEffect, useState} from 'react';\n\nimport {fetchShadowKeys, type ShadowKeys} from '@deviceinsight/ng-ui-api-client';\n\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {AssetShadowKeyTypesContext} from './AssetShadowKeyTypesContext';\n\nexport const AssetShadowKeyTypesContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst [shadowKeys, setShadowKeys] = useState<ShadowKeys>({});\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tuseEffect(() => {\n\t\tasync function fetchKeys() {\n\t\t\tsetLoading(true);\n\n\t\t\ttry {\n\t\t\t\tif (hasAuthorities(['READ_ASSET'])) {\n\t\t\t\t\tconst keys = await fetchShadowKeys('assets');\n\t\t\t\t\tsetShadowKeys(keys);\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tsetLoading(false);\n\t\t\t}\n\t\t}\n\n\t\tfetchKeys();\n\t}, []);\n\treturn (\n\t\t<AssetShadowKeyTypesContext.Provider\n\t\t\tvalue={{\n\t\t\t\tassetShadowKeyTypes: shadowKeys,\n\t\t\t\tloading,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AssetShadowKeyTypesContext.Provider>\n\t);\n};\n","import type * as React from 'react';\nimport {useState} from 'react';\n\nimport {AuthoritiesContext, type RequiredAuthorities} from './AuthoritiesContext';\n\nconst hasNumber = (myString: string) => {\n\treturn /\\d/.test(myString);\n};\n\nconst getStateByName = (\n\tstate: RequiredAuthorities,\n\tnames: string[],\n\tauthorities: string[] | string[][],\n): RequiredAuthorities => {\n\tlet name = names[0];\n\tname = hasNumber(name) || name.includes(':') ? ':param:' : name;\n\n\tif (names.length === 1) {\n\t\t// assign here authorities\n\t\treturn {...state, [name as string]: {...state[name], authorities}};\n\t} else {\n\t\tconst stateForName = (\n\t\t\tstate[name]\n\t\t\t\t? state[name]\n\t\t\t\t: {\n\t\t\t\t\t\tauthorities: [] as string[],\n\t\t\t\t\t}\n\t\t) as RequiredAuthorities;\n\t\treturn {...state, [name as string]: {...getStateByName(stateForName, names.slice(1), authorities)}};\n\t}\n};\n\nconst adjustPageAuthorities = (\n\tstate: RequiredAuthorities,\n\turl: string,\n\tauthorities: string[] | string[][],\n): RequiredAuthorities => {\n\tconst urlNames = url.split('/').filter(name => name !== '');\n\treturn getStateByName(state, urlNames, authorities);\n};\n\nexport const AuthoritiesContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst [authoritiesVisible, setAuthoritiesVisible] = useState<boolean>(false);\n\tconst [pageAuthorities, setPageAuthorities] = useState<RequiredAuthorities>({});\n\n\tconst showAuthorities = () => setAuthoritiesVisible(true);\n\n\tconst addPageAuthorities = (url: string, authorities: string[] | string[][]) => {\n\t\tconst newPageAuthorities = adjustPageAuthorities(pageAuthorities, url, authorities);\n\t\tsetPageAuthorities(newPageAuthorities);\n\t};\n\n\treturn (\n\t\t<AuthoritiesContext.Provider\n\t\t\tvalue={{\n\t\t\t\tauthoritiesVisible,\n\t\t\t\tpageAuthorities,\n\t\t\t\tshowAuthorities,\n\t\t\t\taddPageAuthorities,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AuthoritiesContext.Provider>\n\t);\n};\n","import {type PropsWithChildren, type ReactNode, useCallback, useRef, useState} from 'react';\n\nimport {ContextBarContext} from './ContextBarContext';\n\nexport function ContextBarContextProvider({children}: PropsWithChildren) {\n\tconst itemsMapRef = useRef<Map<string, ReactNode>>(new Map());\n\tconst idGenRef = useRef<number>(0);\n\tconst [items, setItems] = useState<ReactNode[]>([]);\n\n\tconst addItem = useCallback((item: ReactNode) => {\n\t\tconst itemsMap = itemsMapRef.current;\n\t\tconst uniqueId = (idGenRef.current += 1).toString();\n\t\titemsMap.set(uniqueId, item);\n\t\tsetItems([...itemsMap.values()]);\n\n\t\tconst deleteItem = () => {\n\t\t\titemsMap.delete(uniqueId);\n\t\t\tsetItems([...itemsMap.values()]);\n\t\t};\n\n\t\treturn deleteItem;\n\t}, []);\n\n\treturn (\n\t\t<ContextBarContext.Provider\n\t\t\tvalue={{\n\t\t\t\titems,\n\t\t\t\taddItem,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</ContextBarContext.Provider>\n\t);\n}\n","import * as React from 'react';\n\nexport type ConnectionStatus = '' | 'pending' | 'unintentionallyDisconnected';\n\nexport type SetConnectionStatus = (connectionStatus: ConnectionStatus) => void;\n\ntype LiveValuesContextType = {\n\tconnectionStatus: ConnectionStatus;\n\tsetConnectionStatus: SetConnectionStatus;\n};\n\nexport const LiveValuesContext: React.Context<LiveValuesContextType> = React.createContext<LiveValuesContextType>({\n\tconnectionStatus: '',\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tsetConnectionStatus: (connectionStatus: ConnectionStatus) => {},\n});\n","import {type PropsWithChildren, useEffect, useState} from 'react';\n\nimport {type ConnectionStatus, LiveValuesContext, type SetConnectionStatus} from './LiveValuesContext';\n\nexport let setLiveValuesConnectionStatus: SetConnectionStatus = () => {\n\tthrow Error('LiveValuesContext: connection status setter not available');\n};\n\nexport const LiveValuesContextProvider = ({children}: PropsWithChildren<unknown>) => {\n\tconst [connectionStatus, setConnectionStatus] = useState<ConnectionStatus>('');\n\tuseEffect(() => {\n\t\tsetLiveValuesConnectionStatus = setConnectionStatus;\n\t}, []);\n\treturn (\n\t\t<LiveValuesContext.Provider\n\t\t\tvalue={{\n\t\t\t\tconnectionStatus,\n\t\t\t\tsetConnectionStatus,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</LiveValuesContext.Provider>\n\t);\n};\n","import {uniqBy} from 'lodash';\nimport {useContext, useEffect, useMemo, useState} from 'react';\n\nimport {type Property, readAccountObject} from '@deviceinsight/ng-ui-api-client';\n\nimport {getDefaultColumnDefs} from 'components/reactable/commonColumnDefs/asset';\nimport {AssetShadowKeyTypesContext} from 'contexts/assetShadowKeyTypes/AssetShadowKeyTypesContext';\nimport {\n\taddAssetColumnDefinitionsChangedListener,\n\tgetCustomAssetColumnDefs,\n\tremoveAssetColumnDefinitionsChangedListener,\n} from 'customization/modifyColumnDefs';\nimport {type Column, TABLE_CONTEXT} from './AssetTableColumnsContext';\n\nconst BLOBOX_PATH = 'uiConfigurations/assetcols';\nconst DEFAULT_COLUMNS = [\n\t{\n\t\tkey: 'name',\n\t\tselected: true,\n\t},\n\t{\n\t\tkey: 'connection',\n\t\tselected: true,\n\t},\n\t{\n\t\tkey: 'assetGroups',\n\t\tselected: true,\n\t},\n\t{\n\t\tkey: 'isGateway',\n\t\tselected: true,\n\t},\n\t{\n\t\tkey: 'urn',\n\t\tselected: true,\n\t},\n];\n\nfunction getDefaultColumns(): Column[] {\n\tif (getCustomAssetColumnDefs) {\n\t\tconst defaultColumnDefs = getDefaultColumnDefs(DEFAULT_COLUMNS, true);\n\t\tconst customColumnDefs = getCustomAssetColumnDefs(defaultColumnDefs, TABLE_CONTEXT, true);\n\t\treturn customColumnDefs.map(column => ({\n\t\t\tkey: column.name,\n\t\t\tselected: true,\n\t\t}));\n\t}\n\n\treturn DEFAULT_COLUMNS;\n}\n\nfunction moveConnectionColumnToTheRight(columns: Column[]) {\n\tconst connectionId = columns.findIndex(c => c.key === 'connection');\n\tif (connectionId !== -1)\n\t\treturn [...columns.slice(0, connectionId), ...columns.slice(connectionId + 1), columns[connectionId]];\n\telse return columns;\n}\n\nfunction mergeColumns(allColumns: Column[], backendColumns: Column[]) {\n\tconst uniqSortedAllColumns = moveConnectionColumnToTheRight(uniqBy(allColumns, 'key'));\n\tconst allColumnKeys = uniqSortedAllColumns.map(({key}) => key);\n\tconst backendColumnKeys = backendColumns.map(({key}) => key);\n\n\tconst columns = backendColumns.filter(({key}) => allColumnKeys.includes(key));\n\tconst additionalColumns = allColumns.filter(({key}) => !backendColumnKeys.includes(key));\n\n\treturn [...columns, ...additionalColumns];\n}\n\nfunction shadowColumnsFiltered(shadowColumns: Column[], properties: Property[]): Column[] {\n\treturn shadowColumns.filter(({key}) => !properties.find(property => property.key === key) && key.startsWith('dp.'));\n}\n\nfunction getPropertyColumns(properties: Property[]): Column[] {\n\treturn properties\n\t\t.filter(({key, deletable}) => deletable && !key.startsWith('_'))\n\t\t.map(({key}) => ({\n\t\t\tkey,\n\t\t\tselected: false,\n\t\t}));\n}\n\nexport default function useInitialColumns(properties: Property[]): Array<Column> {\n\tconst [backendColumns, setBackendColumns] = useState<Column[]>([]);\n\tuseEffect(() => {\n\t\tasync function fetchBackendColumns() {\n\t\t\ttry {\n\t\t\t\tconst backendColumns: Column[] = await readAccountObject(BLOBOX_PATH);\n\t\t\t\tsetBackendColumns(backendColumns);\n\t\t\t} catch (_e) {\n\t\t\t\tsetBackendColumns(getDefaultColumns());\n\t\t\t}\n\t\t}\n\n\t\tfetchBackendColumns();\n\t}, []);\n\n\tconst [trigger, setTrigger] = useState(0);\n\tuseEffect(() => {\n\t\tconst listener = () => {\n\t\t\t// retriggering the state update to force a rerender\n\t\t\tsetTrigger(trigger => trigger + 1);\n\t\t};\n\t\taddAssetColumnDefinitionsChangedListener(listener);\n\t\treturn () => removeAssetColumnDefinitionsChangedListener(listener);\n\t}, []);\n\n\tconst [shadowColumns, setShadowColumns] = useState<Column[]>([]);\n\tconst {assetShadowKeyTypes} = useContext(AssetShadowKeyTypesContext);\n\tuseEffect(() => {\n\t\tsetShadowColumns(\n\t\t\tObject.keys(assetShadowKeyTypes).map(key => ({\n\t\t\t\tkey,\n\t\t\t\tselected: false,\n\t\t\t\tfromShadow: true,\n\t\t\t})),\n\t\t);\n\t}, [assetShadowKeyTypes]);\n\tconst [filteredShadowColumns, setFilteredShadowColumns] = useState<Column[]>(\n\t\tshadowColumnsFiltered(shadowColumns, properties),\n\t);\n\tuseEffect(() => {\n\t\tsetFilteredShadowColumns(shadowColumnsFiltered(shadowColumns, properties));\n\t}, [shadowColumns, properties]);\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: trigger dependency is needed to rebuild the columns after a customization\n\treturn useMemo(() => {\n\t\treturn mergeColumns(\n\t\t\t[...getDefaultColumns(), ...getPropertyColumns(properties), ...filteredShadowColumns],\n\t\t\tbackendColumns,\n\t\t);\n\t}, [backendColumns, filteredShadowColumns, properties, trigger]);\n}\n","import type * as React from 'react';\nimport {useCallback, useEffect, useState} from 'react';\n\nimport {writeAccountObject} from '@deviceinsight/ng-ui-api-client';\n\nimport useProperties from 'hooks/useProperties';\nimport {AssetTableColumnsContext, type Column} from './AssetTableColumnsContext';\nimport useInitialColumns from './useInitialColumns';\n\nconst BLOBOX_PATH = 'uiConfigurations/assetcols';\n\nfunction sortedColumns(columns: Column[]) {\n\tconst {selected, unselected} = columns.reduce(\n\t\t(acc, column) => {\n\t\t\tconst {selected, unselected} = acc;\n\n\t\t\tif (column.selected) {\n\t\t\t\tselected.push(column);\n\t\t\t} else {\n\t\t\t\tunselected.push(column);\n\t\t\t}\n\n\t\t\treturn acc;\n\t\t},\n\t\t{\n\t\t\tselected: [] as Column[],\n\t\t\tunselected: [] as Column[],\n\t\t},\n\t);\n\treturn [...selected, ...unselected];\n}\n\nconst AssetTableColumnsContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst {assetProperties} = useProperties();\n\tconst [pickerVisible, setPickerVisible] = useState(false);\n\tconst initialColumns = useInitialColumns(assetProperties);\n\tconst [localColumns, setLocalColumns] = useState<Array<Column>>(initialColumns);\n\tconst [backendColumns, setBackendColumns] = useState<Array<Column>>(initialColumns);\n\tuseEffect(() => {\n\t\tsetLocalColumns(initialColumns);\n\t\tsetBackendColumns(initialColumns);\n\t}, [initialColumns]);\n\tconst toggleColumn = useCallback((key: string) => {\n\t\tsetLocalColumns(localColumns => {\n\t\t\tconst index = localColumns.findIndex(column => column.key === key);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tconst column = localColumns[index];\n\t\t\t\treturn [\n\t\t\t\t\t...localColumns.slice(0, index),\n\t\t\t\t\t{...column, selected: !column.selected},\n\t\t\t\t\t...localColumns.slice(index + 1),\n\t\t\t\t];\n\t\t\t}\n\n\t\t\treturn localColumns;\n\t\t});\n\t}, []);\n\tconst synchronizeWithBackend = useCallback(async () => {\n\t\tconst newColumns = sortedColumns(localColumns);\n\t\tawait writeAccountObject(BLOBOX_PATH, newColumns);\n\t\tsetLocalColumns(newColumns);\n\t\tsetBackendColumns(newColumns);\n\t}, [localColumns]);\n\tconst resetColumns = useCallback(() => {\n\t\tsetLocalColumns(backendColumns);\n\t}, [backendColumns]);\n\tconst setColumnsOrder = useCallback((orderedKeys: Array<string>) => {\n\t\tsetLocalColumns(localColumns =>\n\t\t\tlocalColumns\n\t\t\t\t.slice()\n\t\t\t\t.sort((col1: Column, col2: Column) => orderedKeys.indexOf(col1.key) - orderedKeys.indexOf(col2.key)),\n\t\t);\n\t}, []);\n\treturn (\n\t\t<AssetTableColumnsContext.Provider\n\t\t\tvalue={{\n\t\t\t\tpickerVisible,\n\t\t\t\tlocalColumns,\n\t\t\t\tsetPickerVisible,\n\t\t\t\ttoggleColumn,\n\t\t\t\tsynchronizeWithBackend,\n\t\t\t\tresetColumns,\n\t\t\t\tsetColumnsOrder,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</AssetTableColumnsContext.Provider>\n\t);\n};\n\nexport default AssetTableColumnsContextProvider;\n","export const isIE11 = (): boolean =>\n\tnavigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') > -1;\nexport const isMSEdge = (): boolean => window.navigator.userAgent.indexOf('Edge') > -1;\n","// biome-ignore lint/suspicious/noShadowRestrictedNames: global unescape is deprecated, it's ok here\nimport {unescape} from 'lodash';\n\nexport async function fetchDocumentation(url: string): Promise<string | null> {\n\tconst response = await fetch(url);\n\n\tif (response.status === 404) {\n\t\treturn null;\n\t}\n\n\tconst documentContent = await response.text();\n\tconst doc = new DOMParser().parseFromString(documentContent, 'text/html');\n\tdoc.querySelectorAll('[src]').forEach((element: any) => {\n\t\telement.setAttribute('src', new URL(element.getAttribute('src'), url).toString());\n\t});\n\treturn unescape(new XMLSerializer().serializeToString(doc));\n}\n","import {Component} from 'react';\n\nimport {SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {InfoBox} from '@deviceinsight/ng-ui-components';\n\nimport {isIE11, isMSEdge} from 'utils/isIE11';\nimport makeCancelable, {type CancelablePromise} from 'utils/makeCancelable';\nimport {fetchDocumentation} from './helpers';\n\ntype Props = {\n\turl: string;\n};\ntype State = {\n\tdocumentContent: string;\n\tfetching: boolean;\n\terror: boolean;\n};\nlet cancelablePromise: CancelablePromise<any> | null | undefined;\nexport default class DocumentationIFrame extends Component<Props, State> {\n\tstate: State = {\n\t\tdocumentContent: '',\n\t\tfetching: false,\n\t\terror: false,\n\t};\n\n\tcomponentDidMount() {\n\t\tthis.loadUrl();\n\t}\n\n\tcomponentDidUpdate(prevProps: Props) {\n\t\tif (prevProps.url !== this.props.url) {\n\t\t\tthis.loadUrl();\n\t\t}\n\t}\n\n\tcomponentWillUnmount() {\n\t\tif (cancelablePromise && cancelablePromise.cancel) {\n\t\t\tcancelablePromise.cancel();\n\t\t}\n\t}\n\n\tloadUrl: () => Promise<void> = async () => {\n\t\tconst {url} = this.props;\n\n\t\tif (isIE11() || isMSEdge() || !url) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.setState({\n\t\t\tfetching: true,\n\t\t\terror: false,\n\t\t});\n\t\tcancelablePromise = makeCancelable(fetchDocumentation(url));\n\t\tcancelablePromise.promise\n\t\t\t.then(documentContent => {\n\t\t\t\tif (documentContent != null) {\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\tdocumentContent,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.setState({\n\t\t\t\t\t\terror: true,\n\t\t\t\t\t\tdocumentContent: '',\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tconsole.error(`error while loading ${url}`, e);\n\t\t\t\tthis.setState({\n\t\t\t\t\terror: true,\n\t\t\t\t\tdocumentContent: '',\n\t\t\t\t});\n\t\t\t})\n\t\t\t.finally(() =>\n\t\t\t\tthis.setState({\n\t\t\t\t\tfetching: false,\n\t\t\t\t}),\n\t\t\t);\n\t};\n\n\trender() {\n\t\tconst {url} = this.props;\n\t\tconst {documentContent, fetching, error} = this.state;\n\t\treturn (\n\t\t\t<SpinnerContainer show={fetching}>\n\t\t\t\t{error && (\n\t\t\t\t\t<InfoBox\n\t\t\t\t\t\ttype=\"error\"\n\t\t\t\t\t\tmessage={{\n\t\t\t\t\t\t\tid: 'helpPanel.failure',\n\t\t\t\t\t\t\tdefaultValue: 'Documentation temporarily unavailable.',\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t{isIE11() || isMSEdge() ? (\n\t\t\t\t\t<iframe title=\"documentation\" src={url} />\n\t\t\t\t) : (\n\t\t\t\t\t/*\n Workaround for mark.js: text inside an iframe can be marked, but:\n 1. Iframe must have src attribute set (https://github.com/julmot/mark.js/issues/357)\n 2. Content of the iframe must exist also outside the iframe - that's why there is the div below\n */\n\t\t\t\t\tdocumentContent && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\tdisplay: 'none',\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{documentContent}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<iframe\n\t\t\t\t\t\t\t\ttitle=\"documentation\"\n\t\t\t\t\t\t\t\tsrc=\"/empty.html\"\n\t\t\t\t\t\t\t\tsrcDoc={documentContent}\n\t\t\t\t\t\t\t\tdata-testid=\"iframe\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)\n\t\t\t\t)}\n\t\t\t</SpinnerContainer>\n\t\t);\n\t}\n}\n","import {Resizable, type ResizeCallback} from 're-resizable';\nimport {type PropsWithChildren, useRef, useState} from 'react';\nimport Draggable, {type DraggableEventHandler} from 'react-draggable';\n\ntype Props = {\n\tclassName?: string;\n};\n\nconst DEFAULT_WIDTH = 300;\nconst DEFAULT_HEIGHT = 420;\nconst MIN_WIDTH = 270;\nconst MIN_HEIGHT = 150;\nconst DEFAULT_MODAL_TOP_MARGIN = 150;\nconst DEFAULT_MODAL_RIGHT_MARGIN = 40;\n\nexport default function HelpModal({children, className}: PropsWithChildren<Props>) {\n\tconst [widthDelta, setWidthDelta] = useState(0);\n\tconst [top, setTop] = useState(DEFAULT_MODAL_TOP_MARGIN);\n\tconst [left, setLeft] = useState(window.innerWidth - DEFAULT_WIDTH - DEFAULT_MODAL_RIGHT_MARGIN);\n\tconst [width, setWidth] = useState(DEFAULT_WIDTH);\n\tconst [height, setHeight] = useState(DEFAULT_HEIGHT);\n\tconst containerRef = useRef<HTMLElement | null>(null);\n\n\tconst handleResize: ResizeCallback = (_event, _direction, _elementRef, delta) => {\n\t\tsetWidthDelta(delta.width);\n\t};\n\n\tconst handleResizeStop: ResizeCallback = (_event, _direction, _elementRef, delta) => {\n\t\tsetWidthDelta(0);\n\t\tsetWidth(width + delta.width);\n\t\tsetHeight(height + delta.height);\n\t\tsetLeft(left - delta.width);\n\t};\n\n\tconst handleDragStop: DraggableEventHandler = (_e, {lastX, lastY}) => {\n\t\tsetLeft(Math.min(Math.max(0, left + lastX), window.innerWidth - width));\n\t\tsetTop(Math.min(Math.max(0, top + lastY), window.innerHeight - height));\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tclassName={className}\n\t\t\tstyle={{\n\t\t\t\ttop,\n\t\t\t\tleft: left - widthDelta,\n\t\t\t}}\n\t\t>\n\t\t\t<Draggable\n\t\t\t\tdefaultClassName=\"wrapper\"\n\t\t\t\thandle=\".handle\"\n\t\t\t\tposition={{\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t}}\n\t\t\t\tnodeRef={containerRef}\n\t\t\t\tonStop={handleDragStop}\n\t\t\t>\n\t\t\t\t<Resizable\n\t\t\t\t\tref={resizable => {\n\t\t\t\t\t\tcontainerRef.current = resizable?.resizable ?? null;\n\t\t\t\t\t}}\n\t\t\t\t\tonResize={handleResize}\n\t\t\t\t\tonResizeStop={handleResizeStop}\n\t\t\t\t\tenable={{\n\t\t\t\t\t\tbottomLeft: true,\n\t\t\t\t\t}}\n\t\t\t\t\tdefaultSize={{\n\t\t\t\t\t\twidth: DEFAULT_WIDTH,\n\t\t\t\t\t\theight: DEFAULT_HEIGHT,\n\t\t\t\t\t}}\n\t\t\t\t\tminWidth={MIN_WIDTH}\n\t\t\t\t\tminHeight={MIN_HEIGHT}\n\t\t\t\t\tsize={{\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Resizable>\n\t\t\t</Draggable>\n\t\t</div>\n\t);\n}\n","import Mark from 'mark.js';\nimport type * as React from 'react';\nimport {useCallback, useEffect, useRef} from 'react';\n\ntype Props = {\n\tphrase: string;\n};\nconst MARK_OPTIONS = {\n\tseparateWordSearch: false,\n\tiframes: true,\n};\n\nexport function Highlight({children, phrase}: React.PropsWithChildren<Props>) {\n\tconst markInstanceRef = useRef<Mark | null>(null);\n\tconst wrapperRef = useCallback(\n\t\t(node: HTMLElement | null | undefined) => {\n\t\t\tif (node) {\n\t\t\t\tconst markInstance = new Mark(node);\n\t\t\t\tmarkInstanceRef.current = markInstance;\n\t\t\t\tmarkInstance.mark(phrase, MARK_OPTIONS);\n\t\t\t}\n\t\t},\n\t\t[phrase],\n\t);\n\tuseEffect(() => {\n\t\tconst markInstance = markInstanceRef.current;\n\n\t\tif (markInstance) {\n\t\t\tmarkInstance.unmark(MARK_OPTIONS);\n\t\t\tmarkInstance.mark(phrase, MARK_OPTIONS);\n\t\t}\n\t}, [phrase]);\n\treturn <div ref={wrapperRef}>{children}</div>;\n}\n","import classNames from 'classnames';\n\nimport smallLupeIcon from '../../../assets/svg/icon_lupe.svg';\n\ntype Props = {\n\topen: boolean;\n\tphrase: string;\n\tonPhraseChange: (event: any) => void;\n};\n\nexport const SearchBar = ({open, phrase, onPhraseChange}: Props) => (\n\t<div\n\t\tclassName={classNames('search-bar', {\n\t\t\t'is-open': open,\n\t\t})}\n\t>\n\t\t<div className=\"search-input-wrapper\">\n\t\t\t<input\n\t\t\t\tdata-testid=\"search-in-documentation-input\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={phrase}\n\t\t\t\tonChange={onPhraseChange}\n\t\t\t\tautoFocus\n\t\t\t/>\n\t\t\t<img className=\"lupe\" src={smallLupeIcon} alt=\"\" />\n\t\t</div>\n\t</div>\n);\n","export default \"data:image/svg+xml,%3csvg%20id='Layer_1'%20data-name='Layer%201'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%3e%3cg%3e%3cpath%20d='M3,20.5A1.5,1.5,0,0,1,1.5,19V5A1.5,1.5,0,0,1,3,3.5H20A1.5,1.5,0,0,1,21.5,5V19A1.5,1.5,0,0,1,20,20.5Zm.5-2h16V5.5H3.5Z'/%3e%3cpath%20d='M20,4a1,1,0,0,1,1,1V19a1,1,0,0,1-1,1H3a1,1,0,0,1-1-1V5A1,1,0,0,1,3,4H20M3,19H20V5H3V19M20,3H3A2,2,0,0,0,1,5V19a2,2,0,0,0,2,2H20a2,2,0,0,0,2-2V5a2,2,0,0,0-2-2ZM4,18V6H19V18Z'/%3e%3c/g%3e%3cpath%20d='M15,5V5m1-1H14V20h2V4Z'/%3e%3c/svg%3e\"","export default \"data:image/svg+xml,%3csvg%20id='Layer_1'%20data-name='Layer%201'%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20width='24'%20height='24'%3e%3cdefs%3e%3cstyle%3e%20.cls-1%20{%20stroke:%20%23000;%20stroke-miterlimit:%2010;%20stroke-width:%202px;%20}%20%3c/style%3e%3c/defs%3e%3cg%3e%3cpath%20d='M4,20.5A1.5,1.5,0,0,1,2.5,19V14.5h2v4h16V5.5h-7v-2H21A1.5,1.5,0,0,1,22.5,5V19A1.5,1.5,0,0,1,21,20.5Z'/%3e%3cpath%20d='M21,4a1,1,0,0,1,1,1V19a1,1,0,0,1-1,1H4a1,1,0,0,1-1-1V15H4v4H21V5H14V4h7m0-1H13V6h7V18H5V14H2v5a2,2,0,0,0,2,2H21a2,2,0,0,0,2-2V5a2,2,0,0,0-2-2Z'/%3e%3c/g%3e%3cg%3e%3crect%20x='2.5'%20y='3.5'%20width='1'%20height='6'/%3e%3cpath%20d='M3,4V4M4,3H2v7H4V3Z'/%3e%3c/g%3e%3cg%3e%3crect%20x='2.5'%20y='3.5'%20width='6'%20height='1'/%3e%3cpolygon%20points='9%203%202%203%202%205%209%205%209%203%209%203'/%3e%3c/g%3e%3cg%3e%3crect%20x='4.5'%20y='5.5'%20width='2'%20height='2'/%3e%3cpath%20d='M6,6V7H5V6H6M7,5H4V8H7V5Z'/%3e%3c/g%3e%3cg%3e%3cline%20class='cls-1'%20x1='9.39'%20y1='10.39'%20x2='5.46'%20y2='6.46'/%3e%3cg%3e%3crect%20x='6.77'%20y='5.65'%20width='1.31'%20height='5.55'%20transform='translate(-3.78%207.72)%20rotate(-45)'/%3e%3cpolygon%20points='5.93%206%205%206.93%208.93%2010.85%209.85%209.93%205.93%206%205.93%206'/%3e%3c/g%3e%3c/g%3e%3c/svg%3e\"","import classNames from 'classnames';\n\nimport {Bubble, Button, Icon} from '@deviceinsight/ng-ui-basic-components';\n\nimport dockIcon from 'assets/svg/icon_dock.svg';\nimport lupeIcon from 'assets/svg/icon_lupe.svg';\nimport undockIcon from 'assets/svg/icon_undock.svg';\nimport {Trans} from 'i18n';\nimport {isIE11, isMSEdge} from 'utils/isIE11';\nimport type {ViewMode} from '../context/HelpPanelContext';\n\ntype Props = {\n\tviewMode: ViewMode;\n\tonSearchModeClick: () => void;\n\tonViewModeToggle: () => void;\n\tonCloseClick: () => void;\n};\n\nexport const TitleBar = ({viewMode, onSearchModeClick, onViewModeToggle, onCloseClick}: Props) => (\n\t<div className=\"title-bar\">\n\t\t<div\n\t\t\tclassName={classNames('title', {\n\t\t\t\thandle: viewMode === 'modal',\n\t\t\t})}\n\t\t>\n\t\t\t<h1>\n\t\t\t\t<Trans i18nKey=\"helpPanel.title\">Help</Trans>\n\t\t\t</h1>\n\t\t</div>\n\t\t<div className=\"actions\">\n\t\t\t{isIE11() || isMSEdge() ? (\n\t\t\t\t<div className=\"search-unavailable\">\n\t\t\t\t\t<Bubble\n\t\t\t\t\t\tcontent={\n\t\t\t\t\t\t\t<Trans i18nKey=\"helpPanel.searchUnavailable\">\n\t\t\t\t\t\t\t\tIn site search is not available on this browser.\n\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Button naked disabled>\n\t\t\t\t\t\t\t<img src={lupeIcon} alt=\"search\" style={{width: 24, height: 24}} />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</Bubble>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<Button naked onClick={onSearchModeClick} data-testid=\"search-button\">\n\t\t\t\t\t<img src={lupeIcon} alt=\"search\" style={{width: 24, height: 24}} />\n\t\t\t\t</Button>\n\t\t\t)}\n\n\t\t\t<Button naked onClick={onViewModeToggle}>\n\t\t\t\t<img src={viewMode === 'modal' ? dockIcon : undockIcon} alt=\"dock\" />\n\t\t\t</Button>\n\t\t\t<Button naked onClick={onCloseClick} data-testid=\"close-help-panel-button\">\n\t\t\t\t<Icon del large />\n\t\t\t</Button>\n\t\t</div>\n\t</div>\n);\n","import classNames from 'classnames';\nimport type * as React from 'react';\nimport {useContext, useState} from 'react';\nimport ReactDOM from 'react-dom';\n\nimport {usePortalRoot} from 'hooks/usePortalRoot';\nimport {HelpPanelContext} from '../context/HelpPanelContext';\nimport DocumentationIFrame from './DocumentationIFrame';\nimport HelpModal from './HelpModal';\nimport {Highlight} from './Highlight';\nimport {SearchBar} from './SearchBar';\nimport {TitleBar} from './TitleBar';\nimport './helpPanel.scss';\n\nexport function HelpPanel(): React.ReactElement | null {\n\tconst [searchbarOpen, setSearchbarOpen] = useState(false);\n\tconst [phrase, setPhrase] = useState('');\n\tconst {isOpen, viewMode, documentationUrl, close, toggleViewMode} = useContext(HelpPanelContext);\n\tconst sidebarNode = usePortalRoot('.di.app-wrapper', 'help-sidebar');\n\n\tfunction wrapDocumentation(documentationNode: React.ReactNode) {\n\t\tconst content = (\n\t\t\t<>\n\t\t\t\t<TitleBar\n\t\t\t\t\tviewMode={viewMode}\n\t\t\t\t\tonSearchModeClick={() => setSearchbarOpen(open => !open)}\n\t\t\t\t\tonViewModeToggle={toggleViewMode}\n\t\t\t\t\tonCloseClick={close}\n\t\t\t\t/>\n\t\t\t\t<SearchBar\n\t\t\t\t\topen={searchbarOpen}\n\t\t\t\t\tphrase={phrase}\n\t\t\t\t\tonPhraseChange={({target: {value}}) => setPhrase(value)}\n\t\t\t\t/>\n\t\t\t\t<div className=\"content\">{documentationNode}</div>\n\t\t\t</>\n\t\t);\n\t\treturn (\n\t\t\t<>\n\t\t\t\t<HelpModal\n\t\t\t\t\tclassName={classNames('root modal', {\n\t\t\t\t\t\topen: isOpen,\n\t\t\t\t\t\thidden: !isOpen || viewMode !== 'modal',\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t{content}\n\t\t\t\t</HelpModal>\n\t\t\t\t<div\n\t\t\t\t\tclassName={classNames('root sidebar', {\n\t\t\t\t\t\topen: isOpen,\n\t\t\t\t\t\thidden: !isOpen || viewMode !== 'sidebar',\n\t\t\t\t\t})}\n\t\t\t\t>\n\t\t\t\t\t{content}\n\t\t\t\t</div>\n\t\t\t</>\n\t\t);\n\t}\n\n\tif (sidebarNode) {\n\t\treturn ReactDOM.createPortal(\n\t\t\twrapDocumentation(\n\t\t\t\t<Highlight phrase={searchbarOpen ? phrase : ''}>\n\t\t\t\t\t<DocumentationIFrame url={documentationUrl} />\n\t\t\t\t</Highlight>,\n\t\t\t),\n\t\t\tsidebarNode,\n\t\t);\n\t}\n\n\treturn null;\n}\n","import type * as React from 'react';\nimport {useEffect, useState} from 'react';\n\nimport {checkShowUserDocumentation, readShowUserDocumentation} from '@deviceinsight/ng-ui-api-client';\n\nimport {HelpPanel} from '../helpPanel/HelpPanel';\nimport {HelpPanelContext, type ViewMode} from './HelpPanelContext';\n\nasync function fetchUserDocumentationEnabled(): Promise<boolean> {\n\ttry {\n\t\tawait checkShowUserDocumentation();\n\t\treturn await readShowUserDocumentation();\n\t} catch (e) {\n\t\tconsole.warn(`fetching showUserDocumentation setting failed`, e);\n\t\treturn true;\n\t}\n}\n\nconst appWrapperNode = document.querySelector('.di.app-wrapper');\n\nexport default function HelpPanelProvider({children}: React.PropsWithChildren) {\n\tconst [isEnabled, setEnabled] = useState<boolean>(false);\n\tconst [viewMode, setViewMode] = useState<ViewMode>('sidebar');\n\tconst [isOpen, setOpen] = useState<boolean>(false);\n\tconst [documentationUrl, setDocumentationUrl] = useState<string>('');\n\n\tfunction open(documentationUrl: string) {\n\t\tsetOpen(true);\n\t\tsetDocumentationUrl(documentationUrl);\n\t}\n\n\tfunction close() {\n\t\tsetOpen(false);\n\t}\n\n\tfunction toggleViewMode() {\n\t\tsetViewMode(mode => (mode === 'sidebar' ? 'modal' : 'sidebar'));\n\t}\n\n\tuseEffect(() => {\n\t\tfetchUserDocumentationEnabled().then(setEnabled);\n\t}, []);\n\tuseEffect(() => {\n\t\tif (appWrapperNode) {\n\t\t\tappWrapperNode.classList.toggle('with-sidebar-help', isOpen && viewMode === 'sidebar');\n\t\t}\n\t}, [viewMode, isOpen]);\n\treturn (\n\t\t<HelpPanelContext.Provider\n\t\t\tvalue={{\n\t\t\t\tisEnabled,\n\t\t\t\tisOpen,\n\t\t\t\tviewMode,\n\t\t\t\tdocumentationUrl,\n\t\t\t\topen,\n\t\t\t\tclose,\n\t\t\t\ttoggleViewMode,\n\t\t\t}}\n\t\t>\n\t\t\t<HelpPanel />\n\t\t\t{children}\n\t\t</HelpPanelContext.Provider>\n\t);\n}\n","import {isEmpty} from 'lodash';\nimport qs from 'qs';\nimport type * as React from 'react';\nimport {useContext, useEffect} from 'react';\nimport {useLocation} from 'react-router-dom';\n\nimport {AuthoritiesContext, type RequiredAuthorities} from 'contexts/authorities/AuthoritiesContext';\n\nconst hasNumber = (myString: string) => {\n\treturn /\\d/.test(myString);\n};\n\nconst getCurrentAuthTree = (authTree: RequiredAuthorities, urlNames: string[]): Record<string, RequiredAuthorities> => {\n\tlet name = urlNames[0];\n\tname = hasNumber(name) || name.includes(':') ? ':param:' : name;\n\tconst currentState = authTree[name] as RequiredAuthorities;\n\n\tif (urlNames.length > 1 && !isEmpty(currentState)) {\n\t\treturn {\n\t\t\t[name as string]: {\n\t\t\t\tauthorities: currentState.authorities,\n\t\t\t\t...getCurrentAuthTree(currentState, urlNames.slice(1)),\n\t\t\t},\n\t\t};\n\t} else {\n\t\treturn {\n\t\t\t[name as string]: currentState,\n\t\t};\n\t}\n};\n\nexport default function RequiredAuthoritiesPanel(): React.ReactElement | null {\n\tconst {showAuthorities, authoritiesVisible, pageAuthorities} = useContext(AuthoritiesContext);\n\tconst location = useLocation();\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tconst search = location.search || '';\n\t\tconst queryParams = qs.parse(search.substring(1));\n\n\t\tif (queryParams.showAuthorities) {\n\t\t\ttry {\n\t\t\t\tif (JSON.parse(queryParams.showAuthorities as string)) {\n\t\t\t\t\tshowAuthorities();\n\t\t\t\t}\n\t\t\t} catch (_e) {\n\t\t\t\tconsole.warn('Wrong value in url param \"showAuthorities\"');\n\t\t\t}\n\t\t}\n\t}, []);\n\n\tif (!authoritiesVisible) {\n\t\treturn null;\n\t}\n\n\tconst urlNames = location.pathname.split('/').filter(name => name !== '');\n\tconst authTree =\n\t\turlNames.length > 0 && !isEmpty(pageAuthorities) ? getCurrentAuthTree(pageAuthorities, urlNames) : {};\n\treturn <div>{authTree && <pre>{JSON.stringify(authTree, null, 2)}</pre>}</div>;\n}\n","import type {ComponentType, PropsWithChildren, ReactNode} from 'react';\n\ntype Props = {\n\tproviders: Array<ComponentType>;\n};\n\nfunction wrapChildrenIntoProviders(children: ReactNode, providers: ComponentType[]): ReactNode {\n\tif (providers.length === 0) return children;\n\n\tconst [providerComponent, ...restProviders] = providers;\n\tconst Provider: ComponentType<PropsWithChildren> = providerComponent;\n\treturn <Provider>{wrapChildrenIntoProviders(children, restProviders)}</Provider>;\n}\n\nexport function ContextProviders({providers, children}: PropsWithChildren<Props>) {\n\treturn <>{wrapChildrenIntoProviders(children, providers)}</>;\n}\n","import Color from 'color';\nimport dayjs from 'dayjs';\nimport type * as React from 'react';\nimport type {Subscribers} from 'ux4iot-react';\n\nimport type {Asset, Datapoint} from '@deviceinsight/ng-ui-api-client';\nimport {nanoid10, type Period} from '@deviceinsight/ng-ui-components';\n\nimport StyleApi from 'customization/StyleApi';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport type {LiveValues} from 'hooks/useLiveValues';\nimport {\n\tcalculateDynamicSlices,\n\ttype DatapointData,\n\tfetchDatapointValues,\n} from 'utils/datapointValuesFetching/fetchDatapointValues';\nimport type {FetchDatapointValuesError} from 'utils/datapointValuesFetching/types';\nimport type {TrendDatapoint, TrendDatapointSettings, ValuesByKey} from '../types';\nimport type {Action} from './trendAppContextReducer';\n\ntype CancelFn = () => void;\n\ntype PendingRequest = {\n\tpromise: Promise<ValuesByKey>;\n\tcancel: CancelFn;\n};\nconst pendingRequestsAll = new Map<string, PendingRequest>();\nconst pendingRequestsSingle = new Map<string, PendingRequest>();\n\nfunction generateRequestKey(period: Period, datapointKeys: string[], slices: number): string {\n\treturn `${period.tsStart}-${period.tsEnd}-${slices}-${datapointKeys.sort().join(',')}`;\n}\n\nfunction getOrCreateRequest(\n\trequestKey: string,\n\tcache: Map<string, PendingRequest>,\n\trequestFactory: () => PendingRequest,\n): PendingRequest {\n\tconst existingRequest = cache.get(requestKey);\n\n\tif (existingRequest) {\n\t\treturn existingRequest;\n\t}\n\n\tconst newRequest = requestFactory();\n\tcache.set(requestKey, newRequest);\n\treturn newRequest;\n}\n\nconst DEFAULT_TREND_DATAPOINT_SETTINGS: Omit<TrendDatapointSettings, 'color' | 'plotType' | 'combineAxis'> = {\n\tshowAxis: true,\n\tshowThresholds: false,\n\tscaleAxis: null,\n};\n\nexport function transformTrendDatapointsToSubscribers(datapoints: TrendDatapoint[]): Subscribers {\n\treturn datapoints.reduce<Subscribers>(\n\t\t(acc, {asset, datapoint}) => ({\n\t\t\t...acc,\n\t\t\t[asset.urn]: [...(acc[asset.urn] ?? []), datapoint.name],\n\t\t}),\n\t\t{},\n\t);\n}\n\nexport function createDefaultPeriod(): Period {\n\treturn {\n\t\ttsStart: dayjs().subtract(1, 'hour').valueOf(),\n\t\ttsEnd: dayjs().add(10, 'minutes').valueOf(),\n\t};\n}\n\nexport function getMaxTimestampFromLiveValues(liveValues: LiveValues) {\n\tconst maxTimestampsPerAsset = Object.values(liveValues).map(assetLiveValues => {\n\t\tconst timestamps = Object.values(assetLiveValues).map(([ts]) => ts);\n\t\treturn Math.max(...timestamps);\n\t});\n\treturn Math.max(...maxTimestampsPerAsset);\n}\n\nfunction transformTrendDatapointToDatapointData({key, asset, datapoint}: TrendDatapoint): DatapointData {\n\treturn {\n\t\tkey,\n\t\tassetUrn: asset.urn,\n\t\tdatapoint,\n\t};\n}\n\nexport function fetchAllSeriesDataFromBackend(\n\ttrendDatapoints: TrendDatapoint[],\n\tperiod: Period,\n\tonError: (errors: FetchDatapointValuesError[]) => void,\n\tdispatch: React.Dispatch<Action>,\n\tcontainerWidth?: number,\n): CancelFn {\n\tconst periodCopy = {...period};\n\tperiodCopy.tsEnd += 1;\n\n\tdispatch({\n\t\ttype: 'fetchRequest',\n\t\ttrendDatapoints,\n\t\tperiod,\n\t});\n\n\tconst datapointsData = trendDatapoints.map(transformTrendDatapointToDatapointData);\n\tconst slices = calculateDynamicSlices(containerWidth);\n\n\tconst requestKey = generateRequestKey(\n\t\tperiodCopy,\n\t\tdatapointsData.map(d => d.key),\n\t\tslices,\n\t);\n\n\tfunction requestFactory(): PendingRequest {\n\t\tconst {promise, cancel} = fetchDatapointValues(slices, periodCopy, datapointsData, onError);\n\n\t\tpromise\n\t\t\t.then((result: ValuesByKey) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'fetchComplete',\n\t\t\t\t\tvaluesByTrendDatapointKey: result,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tif (!e.isCanceled) {\n\t\t\t\t\tdispatch({type: 'fetchFailed'});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tpendingRequestsAll.delete(requestKey);\n\t\t\t});\n\n\t\treturn {promise, cancel};\n\t}\n\n\tconst requestData = getOrCreateRequest(requestKey, pendingRequestsAll, requestFactory);\n\treturn requestData.cancel;\n}\n\nexport function fetchSingleSeriesDataFromBackend(\n\ttrendDatapoint: TrendDatapoint,\n\tperiod: Period,\n\tonError: (errors: FetchDatapointValuesError[]) => void,\n\tdispatch: React.Dispatch<Action>,\n\tcontainerWidth?: number,\n): CancelFn {\n\tconst periodCopy = {...period};\n\tperiodCopy.tsEnd += 1;\n\n\tdispatch({\n\t\ttype: 'fetchTrendDatapointRequest',\n\t\ttrendDatapoint,\n\t\tperiod,\n\t});\n\n\tconst datapointsData = [transformTrendDatapointToDatapointData(trendDatapoint)];\n\tconst slices = calculateDynamicSlices(containerWidth);\n\n\tconst requestKey = generateRequestKey(periodCopy, [trendDatapoint.key], slices);\n\n\tfunction requestFactory(): PendingRequest {\n\t\tconst {promise, cancel} = fetchDatapointValues(slices, periodCopy, datapointsData, onError);\n\n\t\tpromise\n\t\t\t.then((result: ValuesByKey) => {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'fetchTrendDatapointComplete',\n\t\t\t\t\tkey: trendDatapoint.key,\n\t\t\t\t\tvaluesByTrendDatapointKey: result,\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch(e => {\n\t\t\t\tif (!e.isCanceled) {\n\t\t\t\t\tdispatch({type: 'fetchFailed'});\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tpendingRequestsSingle.delete(requestKey);\n\t\t\t});\n\n\t\treturn {promise, cancel};\n\t}\n\n\tconst requestData = getOrCreateRequest(requestKey, pendingRequestsSingle, requestFactory);\n\treturn requestData.cancel;\n}\n\nexport function createTrendDatapoint(\n\tasset: Asset,\n\tdatapoint: Datapoint,\n\ttrendDatapoints: TrendDatapoint[],\n\thidden?: boolean,\n): TrendDatapoint {\n\tconst defaultColors = StyleApi.getColorPalette(false).filter(color => Color(color).isDark());\n\tconst color = StyleApi.getNextColor(\n\t\ttrendDatapoints.map(({settings: {color}}) => color),\n\t\tdefaultColors,\n\t);\n\tconst configuredDefaultPlotType = UIConfiguration.getDefaultPlotType();\n\tconst supportedPlotType =\n\t\tconfiguredDefaultPlotType && ['step', 'line'].includes(configuredDefaultPlotType)\n\t\t\t? (configuredDefaultPlotType as 'step' | 'line')\n\t\t\t: null;\n\tconst plotType = supportedPlotType || (datapoint.datatype === 'BOOLEAN' ? 'step' : 'line');\n\n\treturn {\n\t\tkey: nanoid10(),\n\t\tsettings: {\n\t\t\tcolor,\n\t\t\t...DEFAULT_TREND_DATAPOINT_SETTINGS,\n\t\t\tplotType,\n\t\t\tcombineAxis: !!datapoint.unit,\n\t\t},\n\t\thidden: !!hidden,\n\t\tdatapoint,\n\t\tasset,\n\t};\n}\n\nexport function updateTrendDatapoints(\n\ttrendDatapoints: TrendDatapoint[],\n\tdatapointsWithAsset: Array<{asset: Asset; datapoints: {datapoint: Datapoint; color: string; hidden: boolean}[]}>,\n): TrendDatapoint[] {\n\tconst newDatapoints = [...trendDatapoints];\n\n\tfor (const {asset, datapoints} of datapointsWithAsset) {\n\t\tconst relevantDatapoints = datapoints.filter(\n\t\t\tdp => !trendDatapoints.some(tdp => tdp.datapoint.name === dp.datapoint.name && tdp.asset.urn === asset.urn),\n\t\t);\n\t\tfor (const {datapoint, color, hidden} of relevantDatapoints) {\n\t\t\tconst trendDatapoint = createTrendDatapoint(asset, datapoint, newDatapoints, hidden);\n\t\t\ttrendDatapoint.settings.color = color;\n\t\t\tnewDatapoints.push(trendDatapoint);\n\t\t}\n\t}\n\n\treturn newDatapoints;\n}\n","import type Highcharts from 'highcharts';\n\nimport type {DataType} from '@deviceinsight/ng-ui-api-client';\n\nimport {translateDatapoint} from 'components/datapoints/DatapointTrans';\nimport type {TFunction} from 'i18n';\nimport type {DatapointValue} from '../../../modules/assets/types';\nimport type {TrendDatapoint, ValuesByKey} from '../types';\n\nexport function createSeriesOptions(\n\ttrendDatapoints: TrendDatapoint[],\n\tvaluesByKey: ValuesByKey,\n\tyAxisIndices: Map<TrendDatapoint, number>,\n\tt: TFunction,\n) {\n\tconst result = trendDatapoints\n\t\t.filter(dp => !dp.hidden && dp.datapoint.datatype !== 'TEXT')\n\t\t.map<Highcharts.SeriesLineOptions>(dp => {\n\t\t\tconst datapointValues = valuesByKey[dp.key];\n\t\t\tconst data = convertDatapointValuesToHighchartsData(datapointValues, dp.datapoint.datatype);\n\t\t\treturn {\n\t\t\t\tid: `${dp.asset.urn}/${dp.datapoint.name}`,\n\t\t\t\ttype: 'line',\n\t\t\t\tdata,\n\t\t\t\tanimation: false,\n\t\t\t\tname: translateDatapoint(dp.datapoint, t),\n\t\t\t\tcolor: dp.settings.color,\n\t\t\t\tstep: dp.settings.plotType === 'step' ? 'left' : undefined,\n\t\t\t\tyAxis: yAxisIndices.get(dp),\n\t\t\t};\n\t\t});\n\n\t// The text datapoints are not transformed into series object, so if the widget has only the text series defined,\n\t// the chart utils would have 0 series. But with 0 series x-axis is not displayed and the annotations are not displayed as well.\n\t// Therefore, in this case we need to create one \"fake\" series object with no data just to cause the x-axis display.\n\tif (result.length === 0) {\n\t\tresult.push({\n\t\t\tdata: [],\n\t\t\txAxis: 0,\n\t\t\tyAxis: 0,\n\t\t\ttype: 'line',\n\t\t});\n\t}\n\n\treturn result;\n}\n\nfunction convertDatapointValueFromBooleanToNumber([ts, booleanValue]: DatapointValue): DatapointValue {\n\treturn [ts, booleanValue ? 1 : 0];\n}\n\nfunction convertDatapointValuesToHighchartsData(\n\tdatapointValues: DatapointValue[] | undefined,\n\tdatatype: DataType = 'LONG',\n): DatapointValue[] | undefined {\n\tswitch (datatype) {\n\t\tcase 'BOOLEAN':\n\t\t\treturn datapointValues?.map(convertDatapointValueFromBooleanToNumber);\n\t\tcase 'TEXT':\n\t\t\treturn undefined;\n\t\tcase 'GEO_POSITION':\n\t\t\tthrow new Error('GEO_POSITION series not supported');\n\t\tdefault:\n\t\t\treturn datapointValues?.filter(([_ts, value]) => typeof value === 'number' && !isNaN(value));\n\t}\n}\n","import type {DataType} from '@deviceinsight/ng-ui-api-client';\n\nimport {formatTimestamp} from 'utils/timestampUtils';\n\nfunction formatValue(value: any, datatype: DataType | undefined) {\n\tif (datatype === 'BOOLEAN') {\n\t\treturn value ? 'true' : 'false';\n\t}\n\treturn value;\n}\n\nexport function getTooltipContents(\n\tdatapointName: string,\n\tdatatype: DataType | undefined,\n\ttooltipColor: string,\n\ttimestamp: string | number | undefined,\n\tvalue: any,\n\tunit: string | undefined,\n\ttimezone: string,\n\tdescription: string | undefined,\n): string {\n\treturn `\n\t\t<span style=\"font-size: 10px\">${formatTimestamp(timestamp, {timezone})}</span>\n\t\t<br/>\n\t\t<span style=\"color:${tooltipColor}\">\\u25CF</span>\n\t\t${datapointName}: <b>${formatValue(value, datatype)}${unit || ''}</b>\n\t\t${description ? `<br/><br/><span>${description}</span>` : ''}\n\t`;\n}\n","import type {NavigatorYAxisPlotLinesOptions} from 'highcharts';\n\nimport type {TFunction} from 'i18n';\nimport type {TrendDatapoint} from '../types';\n\nfunction ensureGhostPoint(chart: Highcharts.Chart): Highcharts.Point {\n\tlet tooltipSeries = chart.get('tooltip-ghost') as Highcharts.Series | undefined;\n\n\tif (!tooltipSeries) {\n\t\ttooltipSeries = chart.addSeries({\n\t\t\tid: 'tooltip-ghost',\n\t\t\ttype: 'scatter',\n\t\t\tdata: [[0, 0]],\n\t\t\tvisible: true,\n\t\t\tshowInLegend: false,\n\t\t\tenableMouseTracking: false,\n\t\t\tincludeInDataExport: false,\n\t\t}) as Highcharts.Series;\n\t}\n\n\tconst point = tooltipSeries?.points[0];\n\n\tif (!point) {\n\t\tthrow new Error('Ghost point could not be created');\n\t}\n\treturn point;\n}\n\nfunction createThresholdTooltipEvents(\n\tdatapointName: string,\n\tthresholdName: string,\n\tvalue: number,\n\tunit: string,\n): NavigatorYAxisPlotLinesOptions {\n\treturn {\n\t\tevents: {\n\t\t\tmouseover(e) {\n\t\t\t\tif (e instanceof PointerEvent || e instanceof MouseEvent || e instanceof TouchEvent) {\n\t\t\t\t\tconst series = this.axis.series[0];\n\t\t\t\t\tconst chart = series.chart;\n\t\t\t\t\tconst tooltip = chart.tooltip;\n\n\t\t\t\t\t// Store the original formatter\n\t\t\t\t\tconst originalFormatter = tooltip.options.formatter;\n\n\t\t\t\t\ttooltip.options.formatter = function () {\n\t\t\t\t\t\treturn `${datapointName}, ${thresholdName}: <b>${value}${unit}</b>`;\n\t\t\t\t\t};\n\n\t\t\t\t\tconst normalized = chart.pointer.normalize(e);\n\t\t\t\t\tconst point = ensureGhostPoint(chart);\n\t\t\t\t\t// @ts-expect-error tooltipPos is an internal property, marked as readonly, but modifying it is the only way to position the tooltip correctly.\n\t\t\t\t\tpoint.tooltipPos = [normalized.chartX - chart.plotLeft, normalized.chartY - chart.plotTop];\n\n\t\t\t\t\ttooltip.refresh(point);\n\n\t\t\t\t\t// Restore the original formatter when mouseout occurs\n\t\t\t\t\tthis.axis.chart.tooltip.hide = function () {\n\t\t\t\t\t\ttooltip.hide();\n\t\t\t\t\t\ttooltip.options.formatter = originalFormatter;\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t},\n\t\t\tmouseout() {\n\t\t\t\tthis.axis.chart.tooltip.hide();\n\t\t\t},\n\t\t},\n\t};\n}\n\nexport function createThresholdPlotLines(\n\t{datapoint: {thresholds, name, unit}, settings: {color, showThresholds}, hidden}: TrendDatapoint,\n\tt: TFunction,\n): NavigatorYAxisPlotLinesOptions[] {\n\tconst plotLinesOptions: NavigatorYAxisPlotLinesOptions[] = [];\n\n\tif (hidden || !showThresholds) return plotLinesOptions;\n\tconst commonPlotLineOptions = {\n\t\twidth: 1,\n\t\tcolor,\n\t\tzIndex: 1,\n\t};\n\tif (thresholds.threshold1 != null) {\n\t\tplotLinesOptions.push(\n\t\t\t{\n\t\t\t\t...commonPlotLineOptions,\n\t\t\t\t...createThresholdTooltipEvents(\n\t\t\t\t\tname,\n\t\t\t\t\tt('', {defaultValue: 'Upper Threshold'}),\n\t\t\t\t\tthresholds.threshold1,\n\t\t\t\t\tunit?.print ?? '',\n\t\t\t\t),\n\t\t\t\tvalue: thresholds.threshold1,\n\t\t\t},\n\t\t\t{\n\t\t\t\t...commonPlotLineOptions,\n\t\t\t\t...createThresholdTooltipEvents(\n\t\t\t\t\tname,\n\t\t\t\t\tt('', {defaultValue: 'Upper Threshold'}),\n\t\t\t\t\tthresholds.threshold1,\n\t\t\t\t\tunit?.print ?? '',\n\t\t\t\t),\n\t\t\t\tvalue: thresholds.threshold1,\n\t\t\t\tdashStyle: 'Dash',\n\t\t\t\tclassName: 'plot-line-moved-down',\n\t\t\t},\n\t\t);\n\t}\n\tif (thresholds.threshold2 != null) {\n\t\tplotLinesOptions.push(\n\t\t\t{\n\t\t\t\t...commonPlotLineOptions,\n\t\t\t\t...createThresholdTooltipEvents(\n\t\t\t\t\tname,\n\t\t\t\t\tt('', {defaultValue: 'Lower Threshold'}),\n\t\t\t\t\tthresholds.threshold2,\n\t\t\t\t\tunit?.print ?? '',\n\t\t\t\t),\n\t\t\t\tvalue: thresholds.threshold2,\n\t\t\t},\n\t\t\t{\n\t\t\t\t...commonPlotLineOptions,\n\t\t\t\t...createThresholdTooltipEvents(\n\t\t\t\t\tname,\n\t\t\t\t\tt('', {defaultValue: 'Lower Threshold'}),\n\t\t\t\t\tthresholds.threshold2,\n\t\t\t\t\tunit?.print ?? '',\n\t\t\t\t),\n\t\t\t\tvalue: thresholds.threshold2,\n\t\t\t\tdashStyle: 'Dash',\n\t\t\t\tclassName: 'plot-line-moved-up',\n\t\t\t},\n\t\t);\n\t}\n\n\treturn plotLinesOptions;\n}\n","import type Highcharts from 'highcharts';\nimport {groupBy} from 'lodash';\n\nimport type {DataType} from '@deviceinsight/ng-ui-api-client';\n\nimport type {TFunction} from '../../../i18n';\nimport type {TrendDatapoint, ValuesByKey} from '../types';\nimport {createThresholdPlotLines} from './thresholds';\n\ntype Extremes = {min: number | null; max: number | null};\n\nconst EMPTY_AXIS_OPTIONS: Highcharts.YAxisOptions[] = [\n\t{\n\t\tid: 'id',\n\t\ttitle: {\n\t\t\ttext: undefined,\n\t\t},\n\t\tvisible: false,\n\t},\n];\n\nexport function createYAxisOptions(\n\ttrendDatapoints: TrendDatapoint[],\n\tvaluesByKey: ValuesByKey,\n\tt: TFunction,\n): {yAxisIndices: Map<TrendDatapoint, number>; yAxis: Highcharts.YAxisOptions[]} {\n\tconst combinedExtremesByUnitName = calculateCombinedAxisExtremesGroupedByUnitName(trendDatapoints, valuesByKey);\n\tconst trendDatapointsWithAxis = trendDatapoints.filter(dp => !dp.hidden && dp.datapoint.datatype !== 'TEXT');\n\n\tconst createAxisOptions = (dp: TrendDatapoint): Highcharts.YAxisOptions => ({\n\t\tid: dp.key,\n\t\tlabels: {\n\t\t\tstyle: {\n\t\t\t\tcolor: dp.settings.color,\n\t\t\t\twidth: 1,\n\t\t\t},\n\t\t\tformatter: function () {\n\t\t\t\treturn `${this.value}${dp.datapoint.unit?.print ?? ''}`;\n\t\t\t},\n\t\t},\n\t\ttitle: {\n\t\t\ttext: undefined,\n\t\t},\n\t\tvisible: dp.settings.showAxis,\n\t\tplotLines: createThresholdPlotLines(dp, t),\n\t\t...calculateAxisExtremes(dp, combinedExtremesByUnitName, valuesByKey),\n\t\t...getAxisPropsBySeriesType(dp.datapoint.datatype),\n\t});\n\n\tconst axisOptionsByUnit = trendDatapointsWithAxis.reduce((acc, dp) => {\n\t\tconst combine = dp.settings.combineAxis;\n\t\tconst unit = dp.datapoint.unit?.name;\n\t\tif (!combine || !unit) {\n\t\t\treturn acc;\n\t\t}\n\t\tif (acc.has(unit)) {\n\t\t\tconst currentOptions = acc.get(unit)!;\n\t\t\tacc.set(unit, {\n\t\t\t\t...currentOptions,\n\t\t\t\tlabels: {...currentOptions.labels, style: {...currentOptions.labels?.style, color: '#777'}},\n\t\t\t});\n\t\t} else {\n\t\t\tacc.set(unit, createAxisOptions(dp));\n\t\t}\n\t\treturn acc;\n\t}, new Map<string, Highcharts.YAxisOptions>());\n\n\tconst indices = new Map<TrendDatapoint, number>();\n\tconst axisOptions = trendDatapointsWithAxis.reduce<Highcharts.YAxisOptions[]>((acc, dp) => {\n\t\tconst combine = dp.settings.combineAxis;\n\t\tconst unit = dp.datapoint.unit?.name;\n\t\tconst existingAxisOptions = combine && unit ? axisOptionsByUnit.get(unit) : null;\n\t\tif (existingAxisOptions) {\n\t\t\tif (acc.includes(existingAxisOptions)) {\n\t\t\t\tindices.set(dp, acc.indexOf(existingAxisOptions));\n\t\t\t\treturn acc;\n\t\t\t} else {\n\t\t\t\tindices.set(dp, acc.length);\n\t\t\t\treturn [...acc, existingAxisOptions];\n\t\t\t}\n\t\t} else {\n\t\t\tindices.set(dp, acc.length);\n\t\t\treturn [...acc, createAxisOptions(dp)];\n\t\t}\n\t}, []);\n\n\tif (axisOptions.length) {\n\t\treturn {yAxisIndices: indices, yAxis: axisOptions};\n\t}\n\treturn {yAxisIndices: indices, yAxis: EMPTY_AXIS_OPTIONS};\n}\n\nfunction calculateCombinedAxisExtremesGroupedByUnitName(\n\ttrendDatapoints: TrendDatapoint[],\n\tvaluesByKey: ValuesByKey,\n): Record<string, Extremes> {\n\tconst relevantDatapoints = trendDatapoints.filter(\n\t\t({hidden, settings: {combineAxis}, datapoint: {unit}}) => combineAxis && !hidden && unit,\n\t);\n\n\tconst groups = groupBy(relevantDatapoints, ({datapoint: {unit}}) => unit!.name);\n\n\treturn Object.fromEntries(\n\t\tObject.entries(groups).map(([unitName, datapoints]) => [\n\t\t\tunitName,\n\t\t\tcalculateCombinedAxisExtremes(datapoints, valuesByKey),\n\t\t]),\n\t);\n}\n\nfunction calculateCombinedAxisExtremes(trendDatapoints: TrendDatapoint[], valuesByKey: ValuesByKey): Extremes {\n\treturn trendDatapoints.reduce<Extremes>(\n\t\t(acc, dp) => {\n\t\t\tconst {min, max} = calculateAxisExtremesByValuesAndThresholds(dp, valuesByKey);\n\t\t\tif (min != null && max != null) {\n\t\t\t\tif (acc.min == null || acc.max == null) return {min, max};\n\t\t\t\telse return {min: Math.min(min, acc.min), max: Math.max(max, acc.max)};\n\t\t\t}\n\t\t\treturn acc;\n\t\t},\n\t\t{min: null, max: null},\n\t);\n}\n\nfunction extremesWithPaddings(extremes: Extremes): Extremes {\n\tconst {min, max} = extremes;\n\tif (min == null || max == null) return extremes;\n\tif (min === max) {\n\t\tlet newMin = Math.floor(min);\n\t\tlet newMax = Math.ceil(max);\n\t\tif (newMin === newMax) {\n\t\t\tnewMin--;\n\t\t\tnewMax++;\n\t\t}\n\t\treturn {min: newMin, max: newMax};\n\t} else {\n\t\treturn {min, max};\n\t}\n}\n\n/**\n * This function calculates yAxis extremes (min and max value). It finds those values by checking the datapoint values and the datapoint thresholds.\n */\nfunction calculateAxisExtremesByValuesAndThresholds(dp: TrendDatapoint, valuesByKey: ValuesByKey) {\n\tif (dp.settings.scaleAxis?.min != null && dp.settings.scaleAxis?.max != null)\n\t\treturn {\n\t\t\tmin: dp.settings.scaleAxis?.min,\n\t\t\tmax: dp.settings.scaleAxis?.max,\n\t\t};\n\n\tconst values = (valuesByKey[dp.key] ?? [])\n\t\t.map(dpValue => dpValue[1])\n\t\t.filter(value => typeof value === 'number' && !isNaN(value)) as number[];\n\tif (\n\t\tdp.settings.showThresholds &&\n\t\tdp.datapoint.thresholds.threshold1 != null &&\n\t\tdp.datapoint.thresholds.threshold2 != null\n\t) {\n\t\tvalues.push(dp.datapoint.thresholds.threshold1, dp.datapoint.thresholds.threshold2);\n\t}\n\treturn values.reduce<Extremes>(\n\t\t(acc, value) => {\n\t\t\treturn {\n\t\t\t\tmin: acc.min == null ? value : Math.min(value, acc.min),\n\t\t\t\tmax: acc.max == null ? value : Math.max(value, acc.max),\n\t\t\t};\n\t\t},\n\t\t{min: null, max: null},\n\t);\n}\n\nfunction calculateAxisExtremes(\n\tdp: TrendDatapoint,\n\tcombinedExtremesByUnitName: Record<string, Extremes>,\n\tvaluesByKey: ValuesByKey,\n): Highcharts.YAxisOptions {\n\tif (dp.settings.combineAxis) {\n\t\tconst combinedExtremes = combinedExtremesByUnitName[dp.datapoint.unit?.name ?? ''];\n\t\tif (combinedExtremes?.min != null && combinedExtremes?.max != null) {\n\t\t\treturn combinedExtremes;\n\t\t}\n\t}\n\n\tconst seriesExtremes = calculateAxisExtremesByValuesAndThresholds(dp, valuesByKey);\n\tif (seriesExtremes.min != null && seriesExtremes.max != null) {\n\t\treturn extremesWithPaddings(seriesExtremes);\n\t}\n\treturn {};\n}\n\nfunction getAxisPropsBySeriesType(type: DataType | undefined): Partial<Highcharts.YAxisOptions> {\n\tif (type === 'BOOLEAN') {\n\t\treturn {\n\t\t\tgridLineWidth: 0,\n\t\t\tmin: 0,\n\t\t\tmax: 1,\n\t\t\tlabels: {enabled: false},\n\t\t};\n\t}\n\n\treturn {};\n}\n","import type Highcharts from 'highcharts';\n\nimport type {Period} from '@deviceinsight/ng-ui-components';\n\nimport type {TFunction} from 'i18n';\nimport {getDatapointDescription} from 'modules/datapoints/utils';\nimport type {TrendDatapoint, UpdatePeriodType, ValuesByKey} from '../types';\nimport {createSeriesOptions} from './series';\nimport {getTooltipContents} from './tooltip';\nimport {createYAxisOptions} from './yAxis';\n\nexport function getChartConfig(\n\tperiod: Period,\n\tupdatePeriodRef: React.MutableRefObject<UpdatePeriodType>,\n\ttrendDatapoints: TrendDatapoint[],\n\tvaluesByTrendDatapointKey: ValuesByKey,\n\ttimezone: string,\n\tt: TFunction,\n): Highcharts.Options {\n\tconst visibleTrendDatapoints = trendDatapoints.filter(dp => !dp.hidden);\n\tconst {yAxis, yAxisIndices} = createYAxisOptions(trendDatapoints, valuesByTrendDatapointKey, t);\n\n\treturn {\n\t\tlang: {locale: 'de'},\n\t\tchart: {\n\t\t\tzooming: {type: 'x'},\n\t\t\tevents: {\n\t\t\t\tselection: event => {\n\t\t\t\t\tevent.originalEvent.preventDefault();\n\t\t\t\t\tupdatePeriodRef.current({tsStart: event.xAxis[0].min, tsEnd: event.xAxis[0].max});\n\t\t\t\t\treturn undefined;\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\ttooltip: {\n\t\t\tformatter: function (_tooltip: Highcharts.Tooltip): string {\n\t\t\t\tconst datapoint = visibleTrendDatapoints[this.series.chart.series.indexOf(this.series)]?.datapoint;\n\t\t\t\tconst datatype = datapoint?.datatype;\n\t\t\t\tconst unit = datapoint?.unit?.print;\n\t\t\t\tconst description = getDatapointDescription(datapoint, t);\n\t\t\t\treturn getTooltipContents(\n\t\t\t\t\tthis.series.name,\n\t\t\t\t\tdatatype,\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\tthis.series.color,\n\t\t\t\t\tthis.x,\n\t\t\t\t\tthis.y,\n\t\t\t\t\tunit,\n\t\t\t\t\ttimezone,\n\t\t\t\t\tdescription,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\tseries: createSeriesOptions(trendDatapoints, valuesByTrendDatapointKey, yAxisIndices, t),\n\t\txAxis: {\n\t\t\ttype: 'datetime',\n\t\t\tmin: period.tsStart,\n\t\t\tmax: period.tsEnd,\n\t\t},\n\t\tyAxis,\n\t\taccessibility: {enabled: false},\n\t\ttime: {timezone},\n\t\tcredits: {enabled: false},\n\t\ttitle: {text: undefined},\n\t\tlegend: {enabled: false},\n\t};\n}\n","import dayjs from 'dayjs';\n\nimport type {Period} from '@deviceinsight/ng-ui-components';\n\nimport type {LiveValues} from 'hooks/useLiveValues';\nimport type {TrendDatapoint, ValuesByKey} from '../types';\n\nexport function mergeCurrentTrendValuesWithLiveValues(currentValues: ValuesByKey, liveValues: ValuesByKey) {\n\tconst resultValues = {...currentValues};\n\tObject.entries(liveValues).forEach(([seriesKey, liveValuesForSeriesKey]) => {\n\t\tif (liveValuesForSeriesKey[0]) {\n\t\t\tlet currentSeriesValues = resultValues[seriesKey] ?? [];\n\t\t\t// If the last current value has greater timestamp than liveValue then we remove this value\n\t\t\t// (the timestamp was generated by aggregation query of TSI and might be bigger than \"now\").\n\t\t\tif (\n\t\t\t\tcurrentSeriesValues.length &&\n\t\t\t\tcurrentSeriesValues[currentSeriesValues.length - 1][0] > liveValuesForSeriesKey[0][0]\n\t\t\t) {\n\t\t\t\tcurrentSeriesValues = currentSeriesValues.slice(0, currentSeriesValues.length - 1);\n\t\t\t}\n\t\t\tresultValues[seriesKey] = [...currentSeriesValues, liveValuesForSeriesKey[0]];\n\t\t}\n\t});\n\treturn resultValues;\n}\n\nexport function transformLiveValuesToValuesByKey(liveValues: LiveValues, datapoints: TrendDatapoint[]): ValuesByKey {\n\tconst result: ValuesByKey = {};\n\n\tfor (const [liveValuesAssetUrn, assetDatapointToValues] of Object.entries(liveValues)) {\n\t\tfor (const [liveValuesDatapointName, datapointValue] of Object.entries(assetDatapointToValues)) {\n\t\t\tconst trendDatapointKey = getTrendDatapointKey(datapoints, liveValuesAssetUrn, liveValuesDatapointName);\n\t\t\tif (trendDatapointKey) {\n\t\t\t\tif (result[trendDatapointKey]) {\n\t\t\t\t\tresult[trendDatapointKey].push(datapointValue);\n\t\t\t\t} else {\n\t\t\t\t\tresult[trendDatapointKey] = [datapointValue];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n}\n\nfunction getTrendDatapointKey(\n\tdatapoints: TrendDatapoint[],\n\tliveValuesAssetUrn: string,\n\tliveValuesDatapointName: string,\n) {\n\tconst found = datapoints.find(\n\t\tdp => dp.asset.urn === liveValuesAssetUrn && dp.datapoint.name === liveValuesDatapointName,\n\t);\n\tif (found) {\n\t\treturn found.key;\n\t} else {\n\t\tconsole.error(\n\t\t\t`getTrendDatapointKey: could not find ${liveValuesAssetUrn}-${liveValuesDatapointName} in datapoints =`,\n\t\t\tdatapoints,\n\t\t);\n\t\treturn undefined;\n\t}\n}\n\nexport function getLiveModeAvailable(period: Period) {\n\tconst start = dayjs(period.tsStart);\n\tconst now = dayjs();\n\tconst days = now.diff(start, 'day');\n\treturn days < 1;\n}\n\nexport function toggleTrendDatapointHidden(\n\ttrendDatapoints: TrendDatapoint[],\n\tkey: string,\n\thidden: boolean,\n): TrendDatapoint[] {\n\treturn trendDatapoints.map<TrendDatapoint>(dp => (dp.key === key ? {...dp, hidden} : dp));\n}\n","import type Highcharts from 'highcharts';\nimport {omit} from 'lodash';\nimport type * as React from 'react';\nimport type {ConnectionUpdateReason} from 'ux4iot-react';\n\nimport type {Datapoint} from '@deviceinsight/ng-ui-api-client';\nimport type {Period} from '@deviceinsight/ng-ui-components';\n\nimport type {LiveValues} from 'hooks/useLiveValues';\nimport type {TFunction} from 'i18n';\nimport {createAnnotations} from '../highchartsUtils/annotations';\nimport {getChartConfig} from '../highchartsUtils/createChartConfig';\nimport type {TrendDatapoint, TrendDatapointSettings, UpdatePeriodType, ValuesByKey} from '../types';\nimport {\n\tgetLiveModeAvailable,\n\tmergeCurrentTrendValuesWithLiveValues,\n\ttoggleTrendDatapointHidden,\n\ttransformLiveValuesToValuesByKey,\n} from './reducerUtils';\n\ntype ReducerState = {\n\tfetching: boolean;\n\tfetchFailed: boolean;\n\ttrendDatapoints: TrendDatapoint[];\n\tfetchedValuesByTrendDatapointKey: ValuesByKey;\n\tcurrentPeriod: Period;\n\tchartConfig: Highcharts.Options;\n\tannotations: Highcharts.AnnotationsOptions[];\n\tliveValues: ValuesByKey;\n\tliveModeEnabled: boolean;\n\tupdatePeriodRef: React.MutableRefObject<UpdatePeriodType>;\n\tzoomInDisabled: boolean;\n\ttimezone: string;\n\tt: TFunction;\n\tux4iotConnectionState: ConnectionUpdateReason | undefined;\n};\n\ntype FetchRequestAction = {\n\ttype: 'fetchRequest';\n\ttrendDatapoints: TrendDatapoint[];\n\tperiod: Period;\n};\n\ntype FetchCompleteAction = {\n\ttype: 'fetchComplete';\n\tvaluesByTrendDatapointKey: ValuesByKey;\n};\n\ntype FetchDatapointRequestAction = {\n\ttype: 'fetchTrendDatapointRequest';\n\ttrendDatapoint: TrendDatapoint;\n\tperiod: Period;\n};\n\ntype FetchTrendDatapointComplete = {\n\ttype: 'fetchTrendDatapointComplete';\n\tkey: string;\n\tvaluesByTrendDatapointKey: ValuesByKey;\n};\n\ntype FetchFailedAction = {\n\ttype: 'fetchFailed';\n};\n\ntype UpdateLiveValuesAction = {\n\ttype: 'updateLiveValues';\n\tliveValues: LiveValues;\n};\n\ntype ChangeTrendDatapointSettingsAction = {\n\ttype: 'updateTrendDatapointSettings';\n\tkey: string;\n\tsettings: TrendDatapointSettings;\n};\n\ntype ChangeDatapointAction = {\n\ttype: 'changeDatapoint';\n\tassetUrn: string;\n\tdatapoint: Datapoint;\n};\n\ntype ToggleTrendDatapointAction = {\n\ttype: 'toggleTrendDatapoint';\n\tkey: string;\n\thide: boolean;\n};\n\ntype RemoveTrendDatapointAction = {\n\ttype: 'removeTrendDatapoint';\n\tassetUrn: string;\n\tdatapointName: string;\n};\n\ntype ChangeTimezoneAction = {\n\ttype: 'changeTimezone';\n\ttimezone: string;\n};\n\ntype Ux4iotConnectionStateChangedAction = {\n\ttype: 'ux4iotConnectionStateChanged';\n\tconnectionState: ConnectionUpdateReason | undefined;\n};\n\nexport type Action =\n\t| FetchRequestAction\n\t| FetchCompleteAction\n\t| FetchDatapointRequestAction\n\t| FetchTrendDatapointComplete\n\t| FetchFailedAction\n\t| UpdateLiveValuesAction\n\t| ChangeTrendDatapointSettingsAction\n\t| ChangeDatapointAction\n\t| ToggleTrendDatapointAction\n\t| RemoveTrendDatapointAction\n\t| ChangeTimezoneAction\n\t| Ux4iotConnectionStateChangedAction;\n\nexport function reducer(state: ReducerState, action: Action): ReducerState {\n\tswitch (action.type) {\n\t\tcase 'fetchRequest':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfetching: true,\n\t\t\t\tfetchFailed: false,\n\t\t\t\ttrendDatapoints: action.trendDatapoints,\n\t\t\t\tcurrentPeriod: action.period,\n\t\t\t};\n\n\t\tcase 'fetchComplete': {\n\t\t\tconst values = mergeCurrentTrendValuesWithLiveValues(\n\t\t\t\t{...state.fetchedValuesByTrendDatapointKey, ...action.valuesByTrendDatapointKey},\n\t\t\t\tstate.liveValues,\n\t\t\t);\n\t\t\tconst fetchCompleteChartConfig = getChartConfig(\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tstate.updatePeriodRef,\n\t\t\t\tstate.trendDatapoints,\n\t\t\t\tvalues,\n\t\t\t\tstate.timezone,\n\t\t\t\tstate.t,\n\t\t\t);\n\t\t\tconst annotations = createAnnotations(values, state.trendDatapoints);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfetching: false,\n\t\t\t\tfetchFailed: false,\n\t\t\t\tfetchedValuesByTrendDatapointKey: values,\n\t\t\t\tchartConfig: fetchCompleteChartConfig,\n\t\t\t\tannotations,\n\t\t\t\tliveModeEnabled:\n\t\t\t\t\tstate.ux4iotConnectionState === 'socket_connect' && getLiveModeAvailable(state.currentPeriod),\n\t\t\t};\n\t\t}\n\n\t\tcase 'fetchTrendDatapointRequest':\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfetching: true,\n\t\t\t\tfetchFailed: false,\n\t\t\t\tcurrentPeriod: action.period,\n\t\t\t\ttrendDatapoints: [...state.trendDatapoints, action.trendDatapoint],\n\t\t\t};\n\n\t\tcase 'fetchTrendDatapointComplete': {\n\t\t\tconst values = mergeCurrentTrendValuesWithLiveValues(\n\t\t\t\t{...state.fetchedValuesByTrendDatapointKey, ...action.valuesByTrendDatapointKey},\n\t\t\t\tstate.liveValues,\n\t\t\t);\n\t\t\tconst trendDatapoint = state.trendDatapoints.find(td => td.key === action.key);\n\t\t\tconst fetchCompleteChartConfig = getChartConfig(\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tstate.updatePeriodRef,\n\t\t\t\tstate.trendDatapoints,\n\t\t\t\tvalues,\n\t\t\t\tstate.timezone,\n\t\t\t\tstate.t,\n\t\t\t);\n\t\t\tconst annotations =\n\t\t\t\ttrendDatapoint?.datapoint.datatype === 'TEXT'\n\t\t\t\t\t? createAnnotations(values, state.trendDatapoints)\n\t\t\t\t\t: state.annotations;\n\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tfetching: false,\n\t\t\t\tfetchFailed: false,\n\t\t\t\tfetchedValuesByTrendDatapointKey: values,\n\t\t\t\tchartConfig: fetchCompleteChartConfig,\n\t\t\t\tannotations,\n\t\t\t};\n\t\t}\n\n\t\tcase 'fetchFailed':\n\t\t\treturn {...state, fetching: false, fetchFailed: true};\n\n\t\tcase 'updateLiveValues':\n\t\t\tif (state.fetchedValuesByTrendDatapointKey) {\n\t\t\t\tconst liveValues = transformLiveValuesToValuesByKey(action.liveValues, state.trendDatapoints);\n\n\t\t\t\tconst newValuesByKey = mergeCurrentTrendValuesWithLiveValues(\n\t\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\t\tliveValues,\n\t\t\t\t);\n\t\t\t\tconst updateLiveValuesChartConfig = getChartConfig(\n\t\t\t\t\tstate.currentPeriod,\n\t\t\t\t\tstate.updatePeriodRef,\n\t\t\t\t\tstate.trendDatapoints,\n\t\t\t\t\tnewValuesByKey,\n\t\t\t\t\tstate.timezone,\n\t\t\t\t\tstate.t,\n\t\t\t\t);\n\t\t\t\tconst annotations = createAnnotations(newValuesByKey, state.trendDatapoints);\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tfetchedValuesByTrendDatapointKey: newValuesByKey,\n\t\t\t\t\tliveValues,\n\t\t\t\t\tchartConfig: updateLiveValuesChartConfig,\n\t\t\t\t\tannotations,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'trendChartContextReducer: updateLiveValues: metadata, currentPeriod or valuesByTrendDatapointKey is not set!',\n\t\t\t\t);\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\tcase 'updateTrendDatapointSettings': {\n\t\t\tconst newValuesByKey = mergeCurrentTrendValuesWithLiveValues(\n\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\tstate.liveValues,\n\t\t\t);\n\t\t\tconst newTrendDatapoints = state.trendDatapoints.map(dp =>\n\t\t\t\tdp.key === action.key\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...dp,\n\t\t\t\t\t\t\tsettings: action.settings,\n\t\t\t\t\t\t}\n\t\t\t\t\t: dp,\n\t\t\t);\n\t\t\tconst annotations = createAnnotations(newValuesByKey, newTrendDatapoints);\n\t\t\tconst chartConfig = getChartConfig(\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tstate.updatePeriodRef,\n\t\t\t\tnewTrendDatapoints,\n\t\t\t\tnewValuesByKey,\n\t\t\t\tstate.timezone,\n\t\t\t\tstate.t,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttrendDatapoints: newTrendDatapoints,\n\t\t\t\tannotations,\n\t\t\t\tchartConfig,\n\t\t\t};\n\t\t}\n\n\t\tcase 'changeDatapoint': {\n\t\t\tconst newValuesByKey = mergeCurrentTrendValuesWithLiveValues(\n\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\tstate.liveValues,\n\t\t\t);\n\t\t\tconst newTrendDatapoints = state.trendDatapoints.map(dp =>\n\t\t\t\tdp.asset.urn === action.assetUrn && dp.datapoint.name === action.datapoint.name\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...dp,\n\t\t\t\t\t\t\tdatapoint: action.datapoint,\n\t\t\t\t\t\t}\n\t\t\t\t\t: dp,\n\t\t\t);\n\t\t\tconst chartConfig = getChartConfig(\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tstate.updatePeriodRef,\n\t\t\t\tnewTrendDatapoints,\n\t\t\t\tnewValuesByKey,\n\t\t\t\tstate.timezone,\n\t\t\t\tstate.t,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttrendDatapoints: newTrendDatapoints,\n\t\t\t\tchartConfig,\n\t\t\t};\n\t\t}\n\n\t\tcase 'toggleTrendDatapoint':\n\t\t\tif (state.fetchedValuesByTrendDatapointKey) {\n\t\t\t\tconst newTrendDatapoints = toggleTrendDatapointHidden(state.trendDatapoints, action.key, action.hide);\n\t\t\t\tconst annotations = createAnnotations(state.fetchedValuesByTrendDatapointKey, newTrendDatapoints);\n\t\t\t\tconst newChartConfig = getChartConfig(\n\t\t\t\t\tstate.currentPeriod,\n\t\t\t\t\tstate.updatePeriodRef,\n\t\t\t\t\tnewTrendDatapoints,\n\t\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\t\tstate.timezone,\n\t\t\t\t\tstate.t,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\tannotations,\n\t\t\t\t\ttrendDatapoints: newTrendDatapoints,\n\t\t\t\t\tchartConfig: newChartConfig,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'trendChartContextReducer: toggleTrendDatapoint: currentPeriod or valuesByTrendDatapointKey is not set!',\n\t\t\t\t);\n\t\t\t\treturn state;\n\t\t\t}\n\n\t\tcase 'removeTrendDatapoint': {\n\t\t\tconst trendDatapointKey = state.trendDatapoints.find(\n\t\t\t\tdp => dp.asset.urn === action.assetUrn && dp.datapoint.name === action.datapointName,\n\t\t\t)?.key;\n\n\t\t\tif (trendDatapointKey) {\n\t\t\t\tconst newTrendDatapoints = state.trendDatapoints.filter(({key}) => key !== trendDatapointKey);\n\t\t\t\tconst annotations = createAnnotations(state.fetchedValuesByTrendDatapointKey, newTrendDatapoints);\n\t\t\t\tconst newFetchedValuesByTrendDatapointKey = omit(\n\t\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\t\ttrendDatapointKey,\n\t\t\t\t);\n\t\t\t\tconst newChartConfig = getChartConfig(\n\t\t\t\t\tstate.currentPeriod,\n\t\t\t\t\tstate.updatePeriodRef,\n\t\t\t\t\tnewTrendDatapoints,\n\t\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\t\tstate.timezone,\n\t\t\t\t\tstate.t,\n\t\t\t\t);\n\t\t\t\treturn {\n\t\t\t\t\t...state,\n\t\t\t\t\ttrendDatapoints: newTrendDatapoints,\n\t\t\t\t\tannotations,\n\t\t\t\t\tfetchedValuesByTrendDatapointKey: newFetchedValuesByTrendDatapointKey,\n\t\t\t\t\tchartConfig: newChartConfig,\n\t\t\t\t};\n\t\t\t}\n\t\t\treturn state;\n\t\t}\n\n\t\tcase 'changeTimezone': {\n\t\t\tconst newChartConfig = getChartConfig(\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tstate.updatePeriodRef,\n\t\t\t\tstate.trendDatapoints,\n\t\t\t\tstate.fetchedValuesByTrendDatapointKey,\n\t\t\t\taction.timezone,\n\t\t\t\tstate.t,\n\t\t\t);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\ttimezone: action.timezone,\n\t\t\t\tchartConfig: newChartConfig,\n\t\t\t};\n\t\t}\n\n\t\tcase 'ux4iotConnectionStateChanged': {\n\t\t\tconst liveModeEnabled =\n\t\t\t\taction.connectionState === 'socket_connect' && getLiveModeAvailable(state.currentPeriod);\n\t\t\treturn {\n\t\t\t\t...state,\n\t\t\t\tux4iotConnectionState: action.connectionState,\n\t\t\t\tliveModeEnabled,\n\t\t\t};\n\t\t}\n\n\t\tdefault:\n\t\t\treturn state;\n\t}\n}\n","import type * as React from 'react';\nimport {useCallback, useContext, useEffect, useMemo, useReducer, useRef} from 'react';\n\nimport type {Asset, Datapoint} from '@deviceinsight/ng-ui-api-client';\nimport type {Period} from '@deviceinsight/ng-ui-components';\n\nimport {Ux4iotConnectionStateContext} from 'contexts/ux4iot/Ux4iotConnectionStateContext';\nimport {useLiveValues} from 'hooks/useLiveValues';\nimport {useTranslation} from 'i18n';\nimport {useAssetTimezone} from 'modules/assets/globalAssetTimezoneSelection/useAssetTimezone';\nimport {useDefaultFetchDatapointValuesErrorHandler} from 'utils/datapointValuesFetching/errorHandling';\nimport type {TrendDatapointSettings, UpdatePeriodType} from '../types';\nimport {useElementResizeDebouncedAction} from '../useElementResizeDebouncedAction';\nimport {\n\tcreateDefaultPeriod,\n\tcreateTrendDatapoint,\n\tfetchAllSeriesDataFromBackend,\n\tfetchSingleSeriesDataFromBackend,\n\tgetMaxTimestampFromLiveValues,\n\ttransformTrendDatapointsToSubscribers,\n\tupdateTrendDatapoints,\n} from './providerUtils';\nimport {TrendAppContext} from './TrendAppContext';\nimport {reducer} from './trendAppContextReducer';\n\ntype CancelRefType = (...args: Array<any>) => any;\n\nexport const TrendAppContextProvider = ({children}: React.PropsWithChildren<unknown>) => {\n\tconst {t} = useTranslation();\n\tconst {connectionState} = useContext(Ux4iotConnectionStateContext);\n\tconst updatePeriodRef = useRef<UpdatePeriodType>(() => {});\n\tconst timezone = useAssetTimezone();\n\n\tconst chartContainerRef = useRef<HTMLDivElement>(null);\n\n\tconst [state, dispatch] = useReducer(reducer, {\n\t\tfetching: true,\n\t\tfetchFailed: false,\n\t\ttrendDatapoints: [],\n\t\tfetchedValuesByTrendDatapointKey: {},\n\t\tcurrentPeriod: createDefaultPeriod(),\n\t\tchartConfig: {},\n\t\tannotations: [],\n\t\tliveValues: {},\n\t\tliveModeEnabled: false,\n\t\tzoomInDisabled: false,\n\t\tupdatePeriodRef,\n\t\ttimezone,\n\t\tt,\n\t\tux4iotConnectionState: connectionState,\n\t});\n\n\tconst cancelFetchAllSeriesRef = useRef<CancelRefType>(() => {});\n\tconst cancelFetchSingleSeriesRef = useRef<CancelRefType>(() => {});\n\tconst fetchValuesErrorHandler = useDefaultFetchDatapointValuesErrorHandler();\n\tconst telemetryConfig = useMemo(\n\t\t() => (state.liveModeEnabled ? transformTrendDatapointsToSubscribers(state.trendDatapoints) : {}),\n\t\t[state.trendDatapoints, state.liveModeEnabled],\n\t);\n\tconst liveValues = useLiveValues(telemetryConfig);\n\tconst MIN_PERIOD_LENGTH_IN_MS = 4;\n\n\tupdatePeriodRef.current = (period: Period) => {\n\t\tif (state.currentPeriod) {\n\t\t\tcancelFetchAllSeriesRef.current();\n\t\t\tcancelFetchSingleSeriesRef.current();\n\n\t\t\tif ((state.zoomInDisabled = period.tsEnd - period.tsStart < MIN_PERIOD_LENGTH_IN_MS)) {\n\t\t\t\tperiod.tsStart = (period.tsStart + period.tsEnd) / 2 - 2;\n\t\t\t\tperiod.tsEnd = period.tsStart + MIN_PERIOD_LENGTH_IN_MS;\n\t\t\t}\n\n\t\t\tcancelFetchAllSeriesRef.current = fetchAllSeriesDataFromBackend(\n\t\t\t\tstate.trendDatapoints,\n\t\t\t\tperiod,\n\t\t\t\tfetchValuesErrorHandler,\n\t\t\t\tdispatch,\n\t\t\t\tchartContainerRef.current?.getBoundingClientRect().width,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.error('updatePeriod: fetchMetadata or currentPeriod is undefined!');\n\t\t}\n\t};\n\n\tconst updateDatapointsAndPeriod = useCallback(\n\t\t(\n\t\t\tdatapointDescriptors: Array<{\n\t\t\t\tasset: Asset;\n\t\t\t\tdatapoints: {datapoint: Datapoint; color: string; hidden: boolean}[];\n\t\t\t}>,\n\t\t\tperiod?: Period,\n\t\t) => {\n\t\t\tcancelFetchAllSeriesRef.current();\n\t\t\tcancelFetchSingleSeriesRef.current();\n\n\t\t\tconst newTrendDatapoints = updateTrendDatapoints(state.trendDatapoints, datapointDescriptors);\n\t\t\tfetchAllSeriesDataFromBackend(\n\t\t\t\tnewTrendDatapoints,\n\t\t\t\tperiod ?? state.currentPeriod,\n\t\t\t\tfetchValuesErrorHandler,\n\t\t\t\tdispatch,\n\t\t\t\tchartContainerRef.current?.getBoundingClientRect().width,\n\t\t\t);\n\t\t},\n\t\t[fetchValuesErrorHandler, state.currentPeriod, state.trendDatapoints],\n\t);\n\n\tconst addTrendDatapoint = useCallback(\n\t\t(asset: Asset, datapoint: Datapoint) => {\n\t\t\tcancelFetchAllSeriesRef.current();\n\t\t\tcancelFetchSingleSeriesRef.current();\n\n\t\t\tconst trendDatapoint = createTrendDatapoint(asset, datapoint, state.trendDatapoints);\n\t\t\tcancelFetchSingleSeriesRef.current = fetchSingleSeriesDataFromBackend(\n\t\t\t\ttrendDatapoint,\n\t\t\t\tstate.currentPeriod,\n\t\t\t\tfetchValuesErrorHandler,\n\t\t\t\tdispatch,\n\t\t\t\tchartContainerRef.current?.getBoundingClientRect().width,\n\t\t\t);\n\t\t},\n\t\t[fetchValuesErrorHandler, state.currentPeriod, state.trendDatapoints],\n\t);\n\n\tconst removeTrendDatapoint = useCallback((assetUrn: string, datapointName: string) => {\n\t\tdispatch({\n\t\t\ttype: 'removeTrendDatapoint',\n\t\t\tassetUrn,\n\t\t\tdatapointName,\n\t\t});\n\t}, []);\n\n\t// Triggered by the user\n\tconst reloadData = useCallback(() => {\n\t\tcancelFetchAllSeriesRef.current();\n\t\tcancelFetchSingleSeriesRef.current();\n\n\t\tcancelFetchAllSeriesRef.current = fetchAllSeriesDataFromBackend(\n\t\t\tstate.trendDatapoints,\n\t\t\tstate.currentPeriod,\n\t\t\tfetchValuesErrorHandler,\n\t\t\tdispatch,\n\t\t\tchartContainerRef.current?.getBoundingClientRect().width,\n\t\t);\n\t}, [state, fetchValuesErrorHandler]);\n\n\tconst resetPeriod = useCallback(() => updatePeriodRef.current(createDefaultPeriod()), []);\n\n\t// Called when datapoint settings are changed\n\tconst changeTrendDatapointSettings = useCallback((key: string, settings: TrendDatapointSettings) => {\n\t\tdispatch({\n\t\t\ttype: 'updateTrendDatapointSettings',\n\t\t\tkey,\n\t\t\tsettings,\n\t\t});\n\t}, []);\n\tconst changeDatapoint = useCallback(\n\t\t(assetUrn: string, datapoint: Datapoint) => {\n\t\t\tif (state.trendDatapoints.some(dp => dp.asset.urn === assetUrn && dp.datapoint.name === datapoint.name)) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'changeDatapoint',\n\t\t\t\t\tassetUrn,\n\t\t\t\t\tdatapoint,\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[state.trendDatapoints],\n\t);\n\n\tconst toggleTrendDatapoint = useCallback((key: string, hide: boolean) => {\n\t\tdispatch({\n\t\t\ttype: 'toggleTrendDatapoint',\n\t\t\tkey,\n\t\t\thide,\n\t\t});\n\t}, []);\n\n\tuseEffect(() => {\n\t\tconst liveValuesEmpty = Object.keys(liveValues).length === 0;\n\t\tif (state.liveModeEnabled && !liveValuesEmpty && !state.fetching) {\n\t\t\tconst {tsStart, tsEnd} = state.currentPeriod;\n\t\t\tconst maxDate = getMaxTimestampFromLiveValues(liveValues);\n\n\t\t\t// divisor: The new period will have 1/divisor space to the right\n\t\t\tconst divisor = 3;\n\t\t\tconst millisToShift = Math.floor((tsEnd - tsStart) / divisor);\n\n\t\t\tconst periodVisibleBeforeAndAfterShift = tsStart < maxDate && maxDate < tsEnd + millisToShift;\n\n\t\t\tif (maxDate > tsEnd && periodVisibleBeforeAndAfterShift) {\n\t\t\t\t// To follow the live values, shift the currentPeriod into the future\n\t\t\t\tupdatePeriodRef.current({tsStart: tsStart + millisToShift, tsEnd: tsEnd + millisToShift});\n\t\t\t}\n\n\t\t\tdispatch({type: 'updateLiveValues', liveValues});\n\t\t}\n\t}, [liveValues, state.currentPeriod, state.fetching, state.liveModeEnabled]);\n\n\tuseEffect(() => {\n\t\tdispatch({type: 'changeTimezone', timezone});\n\t}, [timezone]);\n\n\tuseEffect(() => {\n\t\tdispatch({type: 'ux4iotConnectionStateChanged', connectionState});\n\t}, [connectionState]);\n\n\tuseElementResizeDebouncedAction(chartContainerRef, !!state.currentPeriod, reloadData);\n\n\treturn (\n\t\t<TrendAppContext.Provider\n\t\t\tvalue={{\n\t\t\t\taddTrendDatapoint,\n\t\t\t\tremoveTrendDatapoint,\n\t\t\t\tupdateDatapointsAndPeriod,\n\t\t\t\ttrendDatapoints: state.trendDatapoints,\n\t\t\t\tfetchingData: state.fetching,\n\t\t\t\tfetchingDataFailed: state.fetchFailed,\n\t\t\t\tchartConfig: state.chartConfig,\n\t\t\t\tannotations: state.annotations,\n\t\t\t\tchartContainerRef,\n\t\t\t\tcurrentPeriod: state.currentPeriod,\n\t\t\t\treloadData,\n\t\t\t\tchangeTrendDatapointSettings,\n\t\t\t\tchangeDatapoint,\n\t\t\t\tupdatePeriod: updatePeriodRef.current,\n\t\t\t\tresetPeriod,\n\t\t\t\ttoggleTrendDatapoint,\n\t\t\t\tliveModeEnabled: state.liveModeEnabled,\n\t\t\t\tzoomInDisabled: state.zoomInDisabled,\n\t\t\t\tux4iotConnectionState: connectionState,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</TrendAppContext.Provider>\n\t);\n};\n","import {type PropsWithChildren, useState} from 'react';\n\nimport {CurrentPageTitleContext} from './CurrentPageTitleContext';\n\nexport function CurrentPageTitleContextProvider({children}: PropsWithChildren<any>) {\n\tconst [currentPageTitle, setCurrentPageTitle] = useState<string>('');\n\n\treturn (\n\t\t<CurrentPageTitleContext.Provider value={{currentPageTitle, setCurrentPageTitle}}>\n\t\t\t{children}\n\t\t</CurrentPageTitleContext.Provider>\n\t);\n}\n","import type * as React from 'react';\nimport {useCallback, useEffect, useMemo, useState} from 'react';\nimport {useHistory, useLocation} from 'react-router-dom';\n\nimport type {SearchConfig} from 'modules/contextSearch/types';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {getRolesProviderState} from '../roles/RolesContextProvider';\nimport GlobalSearchContext from './GlobalSearchContext';\nimport {\n\tgetAssetGroupsConfig,\n\tgetAssetsConfig,\n\tgetRolesConfig,\n\tgetUserGroupsConfig,\n\tgetUsersConfig,\n} from './searchConfigs';\n\nconst prefetchRoles = () => {\n\tconst {roles, fetchRoles} = getRolesProviderState();\n\n\tif (!roles.length) {\n\t\tfetchRoles();\n\t}\n};\n\nconst CONTEXTS = [\n\t{\n\t\tkey: 'assets',\n\t\trequiredAuthorities: ['READ_ASSET', 'READ_ASSET_GROUP'] as string[],\n\t},\n\t{\n\t\tkey: 'assetgroups',\n\t\trequiredAuthorities: ['READ_ASSET_GROUP', 'READ_ASSET_GROUP_DEFINITION'] as string[],\n\t},\n\t{\n\t\tkey: 'users',\n\t\trequiredAuthorities: ['READ_ACCOUNT'] as string[],\n\t},\n\t{\n\t\tkey: 'usergroups',\n\t\trequiredAuthorities: ['READ_ACCOUNT_GROUP'] as string[],\n\t},\n\t{\n\t\tkey: 'roles',\n\t\trequiredAuthorities: ['READ_ROLE'] as string[],\n\t},\n];\n\nfunction getConfigByContext(context: string, push: (arg0: string) => void): SearchConfig<any> {\n\tswitch (context) {\n\t\tcase 'assets':\n\t\t\treturn getAssetsConfig(asset => {\n\t\t\t\tpush(`/assets/${asset.id}`);\n\t\t\t});\n\n\t\tcase 'assetgroups':\n\t\t\treturn getAssetGroupsConfig(assetGroup => {\n\t\t\t\tpush(`/assetgroups/${assetGroup.id}`);\n\t\t\t});\n\n\t\tcase 'users':\n\t\t\treturn getUsersConfig(user => {\n\t\t\t\tpush(`/users/${user.number}`);\n\t\t\t});\n\n\t\tcase 'usergroups':\n\t\t\treturn getUserGroupsConfig(userGroup => {\n\t\t\t\tpush(`/usergroups/${userGroup.id}`);\n\t\t\t});\n\n\t\tcase 'roles':\n\t\t\treturn getRolesConfig(push);\n\n\t\tdefault:\n\t\t\tthrow Error(`unknown context: ${context}`);\n\t}\n}\n\nconst extractContextFromPathname = (pathname: string): string | null | undefined => {\n\tconst match = pathname.match(/^\\/([^/]+).*/);\n\n\tif (match) {\n\t\treturn match[1];\n\t}\n};\n\n/**\n * Returns a pathname to the page that should be opened when the search is submitted.\n */\nfunction getNextPathname(currentPathname: string, context: string) {\n\tif (\n\t\tcurrentPathname.match(`^/${context}/list`) ||\n\t\tcurrentPathname.match(`^/assets/map`) ||\n\t\tcurrentPathname.match(`^/assets/openevents`)\n\t) {\n\t\treturn currentPathname;\n\t}\n\treturn `/${context}/list`;\n}\n\nexport default function GlobalSearchContextProvider({children}: React.PropsWithChildren<unknown>) {\n\tconst [query, setQuery] = useState<string>('');\n\tconst [context, setContext] = useState<string | null | undefined>(null);\n\tconst [contexts, setContexts] = useState<string[]>([]);\n\tconst {pathname, search} = useLocation();\n\tconst {push} = useHistory();\n\n\t/**\n\t * This effect prefetches the roles.\n\t */\n\tuseEffect(() => {\n\t\tif (context === 'roles') {\n\t\t\tprefetchRoles();\n\t\t}\n\t}, [context]);\n\n\t/**\n\t * This effect initializes the list of available contexts.\n\t */\n\tuseEffect(() => {\n\t\tconst userContexts = CONTEXTS.filter(context => hasAuthorities(context.requiredAuthorities)).map(\n\t\t\t({key}) => key,\n\t\t);\n\t\tsetContexts(userContexts);\n\t}, []);\n\n\t/**\n\t * This effect sets the context extracted from the page URL.\n\t */\n\tuseEffect(() => {\n\t\tconst newContext = extractContextFromPathname(pathname);\n\n\t\tif (newContext && contexts.includes(newContext)) {\n\t\t\tsetContext(newContext);\n\t\t} else {\n\t\t\tsetContext(contexts[0]);\n\t\t}\n\t}, [contexts, pathname]);\n\n\t/**\n\t * This effect initializes the query (in the search input) with the value from the URL \"query\" parameter.\n\t */\n\tuseEffect(() => {\n\t\tconst searchParams = new URLSearchParams(search);\n\t\tconst queryFromUrl = searchParams.get('query') ?? '';\n\n\t\tsetQuery(queryFromUrl);\n\t}, [search]);\n\n\tconst searchConfig = useMemo(() => (context ? getConfigByContext(context, push) : null), [context, push]);\n\n\tconst submitQueryForContext = useCallback(\n\t\t(query: string, context: string) => {\n\t\t\tsetQuery(query);\n\t\t\tconst currentSearchParams = new URLSearchParams(search);\n\t\t\tconst nextPathname = getNextPathname(pathname, context);\n\t\t\tconst nextSearchParams = new URLSearchParams();\n\t\t\tif (query) {\n\t\t\t\tnextSearchParams.set('query', query);\n\t\t\t}\n\t\t\tif (\n\t\t\t\tpathname === nextPathname &&\n\t\t\t\t(currentSearchParams.get('query') ?? '') === query &&\n\t\t\t\tcurrentSearchParams.get('reload') !== 'true'\n\t\t\t) {\n\t\t\t\tnextSearchParams.set('reload', 'true');\n\t\t\t}\n\t\t\tif (nextSearchParams.toString()) {\n\t\t\t\tpush(`${nextPathname}?${nextSearchParams.toString()}`);\n\t\t\t} else {\n\t\t\t\tpush(nextPathname);\n\t\t\t}\n\t\t},\n\t\t[pathname, push, search],\n\t);\n\n\tconst changeContext = useCallback(\n\t\t(context: string) => {\n\t\t\tsetContext(context);\n\t\t\tsubmitQueryForContext(query, context);\n\t\t},\n\t\t[query, submitQueryForContext],\n\t);\n\n\treturn (\n\t\t<GlobalSearchContext.Provider\n\t\t\tvalue={{\n\t\t\t\tquery,\n\t\t\t\tcontext,\n\t\t\t\tavailableContexts: contexts,\n\t\t\t\tsubmitQuery: (query: string) => {\n\t\t\t\t\tif (context) submitQueryForContext(query, context);\n\t\t\t\t},\n\t\t\t\tsearchConfig,\n\t\t\t\tchangeContext,\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</GlobalSearchContext.Provider>\n\t);\n}\n","import type * as React from 'react';\nimport {type PropsWithChildren, useState} from 'react';\nimport {type ConnectionUpdateReason, Ux4iotContextProvider} from 'ux4iot-react';\n\nimport {ux4iotGrantRequestFunction} from 'utils/ux4iot';\nimport UIConfiguration from '../../customization/UIConfiguration';\nimport {Ux4iotConnectionStateContext} from './Ux4iotConnectionStateContext';\n\nexport const Ux4iotProvider: React.FC<PropsWithChildren> = ({children}) => {\n\tconst initialConnectionState = UIConfiguration.getUx4iotUrl() ? undefined : 'ux4iot_unreachable';\n\tconst [connectionState, setConnectionState] = useState<ConnectionUpdateReason | undefined>(initialConnectionState);\n\n\treturn (\n\t\t<Ux4iotConnectionStateContext.Provider value={{connectionState, setConnectionState}}>\n\t\t\t{UIConfiguration.getUx4iotUrl() ? (\n\t\t\t\t<Ux4iotContextProvider\n\t\t\t\t\toptions={{\n\t\t\t\t\t\tux4iotURL: UIConfiguration.getUx4iotUrl() ?? '',\n\t\t\t\t\t\tgrantRequestFunction: ux4iotGrantRequestFunction,\n\t\t\t\t\t\tonSocketConnectionUpdate: setConnectionState,\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</Ux4iotContextProvider>\n\t\t\t) : (\n\t\t\t\tchildren\n\t\t\t)}\n\t\t</Ux4iotConnectionStateContext.Provider>\n\t);\n};\n","import type * as React from 'react';\nimport {type PropsWithChildren, useCallback, useState} from 'react';\n\ntype ContextProvider = React.ComponentType<React.PropsWithChildren<{}>>;\n\nconst globalContextProviders: ContextProvider[] = [];\n\nexport const addGlobalContextProvider = (contextProvider: ContextProvider): (() => void) => {\n\tglobalContextProviders.push(contextProvider);\n\treturn () => {\n\t\tconst index = globalContextProviders.indexOf(contextProvider);\n\n\t\tglobalContextProviders.splice(index, 1);\n\t};\n};\n\nexport function GlobalContextProviders({children}: PropsWithChildren<{}>) {\n\tconst [contextProviders, setContextProviders] = useState<ContextProvider[]>(globalContextProviders);\n\n\tconst addGlobalContextProvider = useCallback((contextProvider: ContextProvider) => {\n\t\tsetContextProviders(providers => {\n\t\t\tif (providers.indexOf(contextProvider) !== -1) {\n\t\t\t\treturn providers;\n\t\t\t}\n\t\t\treturn [...providers, contextProvider];\n\t\t});\n\t\treturn () => setContextProviders(providers => providers.filter(p => p !== contextProvider));\n\t}, []);\n\n\t// We must update the exposed function manually here because initialization of the exposed functions in custom.ts\n\t// is done before the app is rendered and creation of this function is performed later.\n\tif ((window as any)?.ngui) {\n\t\t(window as any).ngui.addGlobalContextProvider = addGlobalContextProvider;\n\t}\n\n\tconst contents = contextProviders.reduce(\n\t\t(contents, ContextProvider) => <ContextProvider>{contents}</ContextProvider>,\n\t\tchildren,\n\t);\n\n\treturn <>{contents}</>;\n}\n","import {type PropsWithChildren, useContext, useState} from 'react';\n\nimport type {Asset, User} from '@deviceinsight/ng-ui-api-client';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {GlobalAssetTimezoneContext} from './GlobalAssetTimezoneContext';\n\nfunction getTimezone(type: 'browser' | 'asset' | 'user', asset: Asset | undefined, user: User | undefined) {\n\tconst browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n\treturn type === 'asset' && asset?.timeZone\n\t\t? asset.timeZone\n\t\t: type === 'user' && user?.timezone\n\t\t\t? user.timezone\n\t\t\t: browserTimezone;\n}\n\nexport function GlobalAssetTimezoneContextProvider({children}: PropsWithChildren) {\n\tconst [asset, setAsset] = useState<Asset | undefined>();\n\tconst [type, setType] = useState<'browser' | 'asset' | 'user'>(UIConfiguration.getGlobalAssetTimezoneMode());\n\tconst {user} = useContext(UserContext);\n\n\treturn (\n\t\t<GlobalAssetTimezoneContext.Provider\n\t\t\tvalue={{\n\t\t\t\tasset,\n\t\t\t\tsetAsset,\n\t\t\t\ttype,\n\t\t\t\tsetType,\n\t\t\t\ttimezone: getTimezone(type, asset, user),\n\t\t\t}}\n\t\t>\n\t\t\t{children}\n\t\t</GlobalAssetTimezoneContext.Provider>\n\t);\n}\n","import imgWarning from 'assets/svg/icon_warning_triangle.svg';\nimport {Trans} from 'i18n';\nimport './PageError.scss';\n\ntype Props = {\n\terror: Error;\n};\n\nfunction isDynamicallyImportedModuleError(error: Error) {\n\treturn error.message.includes('Failed to fetch dynamically imported module');\n}\n\nexport const PageError = ({error}: Props) => (\n\t<div className=\"di page-error\">\n\t\t<h2>\n\t\t\t<img src={imgWarning} alt=\"\" />\n\t\t</h2>\n\t\t<h3>\n\t\t\t<Trans i18nKey=\"page.uncaughtErrorMessage\">Something went wrong</Trans>\n\t\t</h3>\n\t\t{error.message && (\n\t\t\t<>\n\t\t\t\t<hr />\n\t\t\t\t<h3>\n\t\t\t\t\t<span title={error.message}>{error.message}</span>\n\t\t\t\t</h3>\n\t\t\t</>\n\t\t)}\n\t\t{isDynamicallyImportedModuleError(error) && (\n\t\t\t<div data-testid=\"additional-message\">\n\t\t\t\t<hr />\n\t\t\t\t<h4>\n\t\t\t\t\t<Trans i18nKey=\"errorMessage.pleaseReloadPage\">Please reload the page</Trans>\n\t\t\t\t</h4>\n\t\t\t</div>\n\t\t)}\n\t</div>\n);\n","import type {History, Location} from 'history';\nimport {isEqual, uniqWith} from 'lodash';\nimport {useContext, useEffect} from 'react';\nimport {ErrorBoundary} from 'react-error-boundary';\nimport {type match, Route} from 'react-router-dom';\n\nimport PageAccessDenied from 'components/page/misc/PageAccessDenied';\nimport {AuthoritiesContext} from 'contexts/authorities/AuthoritiesContext';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {UserContext} from 'contexts/user/UserContext';\nimport type {AppConfiguration, validateAppConfigurationFunctionType} from 'customization/types';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {type TranslationDescriptor, useTranslation} from 'i18n';\nimport {hasAuthorities} from 'utils/hasAuthorities';\nimport {PageError} from '../components/page/misc/PageError';\nimport {CurrentPageTitleContext} from '../contexts/currentPageTitle/CurrentPageTitleContext';\nimport NavRoutes from './NavRoutes';\nimport type {RouteConfig} from './types';\n\ntype Props = {\n\troute: RouteConfig;\n\tpath: string;\n\turl: string;\n\tbrowserTitleSegments: (TranslationDescriptor | string)[];\n\thistory: History;\n\tlocation: Location;\n\tmatch: match;\n\tcomputedMatch: any;\n};\n\nconst getAppConfiguration = (\n\tappName: string | null | undefined,\n\tvalidateAppConfiguration: validateAppConfigurationFunctionType | null | undefined,\n): AppConfiguration<any> | null | undefined => {\n\treturn appName ? UIConfiguration.getAppConfiguration(appName, validateAppConfiguration ?? undefined) : null;\n};\n\nexport default function NavRoute({\n\troute: {\n\t\tcomponent: Component,\n\t\tchildRoutes,\n\t\tchildRoutesContainer: ChildRoutesContainer,\n\t\trequiredAuthorities,\n\t\tappName,\n\t\tvalidateAppConfiguration,\n\t\tlabel,\n\t\tgetTitleSegments,\n\t},\n\tpath,\n\turl,\n\tbrowserTitleSegments,\n\t...rest\n}: Props) {\n\tconst {user} = useContext(UserContext);\n\tconst {addPageAuthorities} = useContext(AuthoritiesContext);\n\tconst {contextInfo} = useContext(ContextInfoContext);\n\tconst {setCurrentPageTitle} = useContext(CurrentPageTitleContext);\n\tconst {t} = useTranslation();\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: This should only run once on mount\n\tuseEffect(() => {\n\t\tconst authorities = requiredAuthorities !== undefined ? requiredAuthorities : ([] as string[]);\n\t\taddPageAuthorities(url, authorities);\n\t}, []);\n\n\tconst titleSegments = getTitleSegments && contextInfo ? getTitleSegments(contextInfo) : [label];\n\tconst newBrowserTitleSegments = titleSegments\n\t\t? uniqWith([...browserTitleSegments, ...titleSegments].filter(Boolean), isEqual)\n\t\t: browserTitleSegments;\n\tconst newBrowserTitle = newBrowserTitleSegments\n\t\t.map(segment =>\n\t\t\ttypeof segment === 'string' ? segment : t(segment?.id ?? '', {defaultValue: segment?.defaultValue ?? ''}),\n\t\t)\n\t\t.join(' / ');\n\n\tuseEffect(() => {\n\t\tsetCurrentPageTitle(newBrowserTitle);\n\t}, [newBrowserTitle, setCurrentPageTitle]);\n\n\tif (!hasAuthorities(requiredAuthorities)) {\n\t\treturn <Route path={path} strict={false} component={PageAccessDenied} />;\n\t}\n\n\treturn (\n\t\t<Route\n\t\t\tpath={path}\n\t\t\tstrict={false}\n\t\t\tchildren={({match}) => {\n\t\t\t\tif (Component && (match?.isExact || !childRoutes)) {\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<title>\n\t\t\t\t\t\t\t\t{[...newBrowserTitleSegments, UIConfiguration.getAppName()]\n\t\t\t\t\t\t\t\t\t.map(segment =>\n\t\t\t\t\t\t\t\t\t\ttypeof segment === 'string'\n\t\t\t\t\t\t\t\t\t\t\t? segment\n\t\t\t\t\t\t\t\t\t\t\t: t(segment?.id ?? '', {defaultValue: segment?.defaultValue ?? ''}),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join(' - ')}\n\t\t\t\t\t\t\t</title>\n\t\t\t\t\t\t\t<ErrorBoundary fallbackRender={PageError}>\n\t\t\t\t\t\t\t\t<Component\n\t\t\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\t\t\tcurrentUser={user}\n\t\t\t\t\t\t\t\t\tappConfiguration={getAppConfiguration(appName, validateAppConfiguration)}\n\t\t\t\t\t\t\t\t\trequiredAuthorities={requiredAuthorities}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t} else if (childRoutes) {\n\t\t\t\t\tconst ChildRoutes = (\n\t\t\t\t\t\t<NavRoutes\n\t\t\t\t\t\t\troutes={childRoutes}\n\t\t\t\t\t\t\tpath={path}\n\t\t\t\t\t\t\turl={match?.url}\n\t\t\t\t\t\t\t// @ts-expect-error - additional props are passed causing typescript issues\n\t\t\t\t\t\t\tbrowserTitleSegments={newBrowserTitleSegments}\n\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\n\t\t\t\t\tif (ChildRoutesContainer) {\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<ChildRoutesContainer\n\t\t\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\t\t\tparams={match?.params}\n\t\t\t\t\t\t\t\tcurrentUser={user}\n\t\t\t\t\t\t\t\tappConfiguration={getAppConfiguration(appName, validateAppConfiguration)}\n\t\t\t\t\t\t\t\trequiredAuthorities={requiredAuthorities}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{ChildRoutes}\n\t\t\t\t\t\t\t</ChildRoutesContainer>\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn ChildRoutes;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow Error(`neither component nor child routes were defined for ${path}`);\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import {PureComponent} from 'react';\nimport {Redirect, Route, type RouteComponentProps, Switch, withRouter} from 'react-router-dom';\n\nimport PageNotFound from 'components/page/misc/PageNotFound';\nimport type {TranslationDescriptor} from 'i18n';\nimport {ContextInfoContext} from '../contexts/contextInfo/ContextInfoContext';\nimport {UserContext} from '../contexts/user/UserContext';\nimport RouteApi from '../customization/RouteApi';\nimport NavRoute from './NavRoute';\nimport type {RouteConfig} from './types';\n\ntype OwnProps = {\n\troutes: Array<RouteConfig>;\n\tpath?: string;\n\turl?: string;\n\tbrowserTitleSegments?: (TranslationDescriptor | string)[];\n};\ntype Props = OwnProps & RouteComponentProps;\n\nclass NavRoutes extends PureComponent<Props> {\n\trender() {\n\t\tconst {\n\t\t\troutes,\n\t\t\tpath = '',\n\t\t\turl = '',\n\t\t\thistory,\n\t\t\tlocation,\n\t\t\tmatch,\n\t\t\t// @ts-expect-error this field is not defined in RouteContext, but it exists if fact\n\t\t\tcomputedMatch,\n\t\t\tbrowserTitleSegments = [],\n\t\t\t...rest\n\t\t} = this.props;\n\t\treturn (\n\t\t\t<Switch>\n\t\t\t\t<Route exact path={path || '/'} strict={false}>\n\t\t\t\t\t<UserContext.Consumer>\n\t\t\t\t\t\t{({user}) => (\n\t\t\t\t\t\t\t<ContextInfoContext.Consumer>\n\t\t\t\t\t\t\t\t{({contextInfo}) => {\n\t\t\t\t\t\t\t\t\tconst filteredRoutes = RouteApi.filterRoutes(routes, user, contextInfo);\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\tfilteredRoutes.length && (\n\t\t\t\t\t\t\t\t\t\t\t<Redirect\n\t\t\t\t\t\t\t\t\t\t\t\tto={`${url}/${filteredRoutes[0].relativePath}`.replace(/\\/\\//g, '/')}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t</ContextInfoContext.Consumer>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</UserContext.Consumer>\n\t\t\t\t</Route>\n\t\t\t\t{routes.map(route => (\n\t\t\t\t\t<NavRoute\n\t\t\t\t\t\t{...rest}\n\t\t\t\t\t\troute={route}\n\t\t\t\t\t\tpath={`${path}/${route.relativePath}`}\n\t\t\t\t\t\turl={`${url}/${route.relativePath}`}\n\t\t\t\t\t\tkey={route.relativePath}\n\t\t\t\t\t\thistory={history}\n\t\t\t\t\t\tlocation={location}\n\t\t\t\t\t\tmatch={match}\n\t\t\t\t\t\tcomputedMatch={computedMatch}\n\t\t\t\t\t\tbrowserTitleSegments={browserTitleSegments}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t\t<Route component={PageNotFound} />\n\t\t\t</Switch>\n\t\t);\n\t}\n}\n\nexport default withRouter(NavRoutes);\n","import {useContext, useEffect} from 'react';\n\nimport {ConfirmProvider, Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport Footer from 'components/page/footer/Footer';\nimport Header from 'components/page/header/Header';\nimport HeaderLinks from 'components/page/header/HeaderLinks';\nimport HeaderSearch from 'components/page/header/HeaderSearch';\nimport Logo from 'components/page/header/Logo';\nimport ContextAction from 'components/page/navbar/ContextAction';\nimport ContextInfoPanel from 'components/page/navbar/contextinfo/ContextInfoPanel';\nimport MainNavi from 'components/page/navbar/MainNavi';\nimport SubNavi from 'components/page/subnavi/SubNavi';\nimport {AssetShadowKeyTypesContextProvider} from 'contexts/assetShadowKeyTypes/AssetShadowKeyTypesContextProvider';\nimport {AuthoritiesContextProvider} from 'contexts/authorities/AuthoritiesContextProvider';\nimport {ContextBarContextProvider} from 'contexts/contextBar/ContextBarContextProvider';\nimport {ContextInfoContext} from 'contexts/contextInfo/ContextInfoContext';\nimport {ContextInfoContextProvider} from 'contexts/contextInfo/ContextInfoContextProvider';\nimport {GlobalResourcesContext} from 'contexts/globalResources/GlobalResourcesContext';\nimport {LiveValuesContextProvider} from 'contexts/liveValues/LiveValuesContextProvider';\nimport RolesContextProvider from 'contexts/roles/RolesContextProvider';\nimport {UserContext} from 'contexts/user/UserContext';\nimport CustomHeaderElementsContextProvider from 'customization/contexts/customHeaderElements/CustomHeaderElementsContextProvider';\nimport RouteApi from 'customization/RouteApi';\nimport getRouteApi from 'customization/RouteApi';\nimport LocizeUpdaterContextProvider from 'i18n/context/LocizeUpdaterContextProvider';\nimport AssetTableColumnsContextProvider from 'modules/assets/contexts/AssetTableColumnsContextProvider';\nimport {FavoritesProvider} from 'modules/favorites/FavoritesProvider';\nimport HelpPanelProvider from 'modules/help/context/HelpPanelProvider';\nimport {HistoryProvider} from 'modules/history/HistoryProvider';\nimport RequiredAuthoritiesPanel from 'modules/requiredAuthorities/RequiredAuthoritiesPanel';\nimport {ContextProviders} from 'utils/ContextProviders';\nimport {TrendAppContextProvider} from '../components/trendv2/context/TrendAppContextProvider';\nimport {CurrentPageTitleContextProvider} from '../contexts/currentPageTitle/CurrentPageTitleContextProvider';\nimport GlobalSearchContextProvider from '../contexts/globalSearch/GlobalSearchContextProvider';\nimport {Ux4iotProvider} from '../contexts/ux4iot/Ux4iotProvider';\nimport {GlobalContextProviders} from '../customization/globalContextProviders';\nimport {GlobalAssetTimezoneContextProvider} from '../modules/assets/globalAssetTimezoneSelection/GlobalAssetTimezoneContextProvider';\nimport NavRoutes from './NavRoutes';\n\nconst contextProviders = [\n\tUx4iotProvider,\n\tCustomHeaderElementsContextProvider,\n\tHelpPanelProvider,\n\tConfirmProvider,\n\tGlobalContextProviders,\n\tAuthoritiesContextProvider,\n\tRolesContextProvider,\n\tAssetShadowKeyTypesContextProvider,\n\tGlobalSearchContextProvider,\n\tAssetTableColumnsContextProvider,\n\tLiveValuesContextProvider,\n\tContextInfoContextProvider,\n\tCurrentPageTitleContextProvider,\n\tFavoritesProvider,\n\tHistoryProvider,\n\tLocizeUpdaterContextProvider,\n\tGlobalAssetTimezoneContextProvider,\n\tTrendAppContextProvider,\n\tContextBarContextProvider,\n];\n\nconst MainPage = () => {\n\tconst {user} = useContext(UserContext);\n\tconst {initialFetchingComplete, loadGlobalResources} = useContext(GlobalResourcesContext);\n\tuseEffect(() => {\n\t\tif (!initialFetchingComplete) {\n\t\t\tloadGlobalResources();\n\t\t}\n\t}, [loadGlobalResources, initialFetchingComplete]);\n\n\tif (!initialFetchingComplete) {\n\t\treturn <Spinner center />;\n\t}\n\n\treturn (\n\t\t<ContextProviders providers={contextProviders}>\n\t\t\t<RequiredAuthoritiesPanel />\n\t\t\t<Header>\n\t\t\t\t<Logo linkToStartPage={true} />\n\t\t\t\t<HeaderSearch />\n\t\t\t\t<div className=\"separator\" />\n\t\t\t\t<HeaderLinks />\n\t\t\t</Header>\n\n\t\t\t<ContextInfoContext.Consumer>\n\t\t\t\t{({contextInfo}) => {\n\t\t\t\t\tconst routes = RouteApi.filterRoutes(RouteApi.getRoutes(), user, contextInfo);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<div className=\"di floor-2\">\n\t\t\t\t\t\t\t\t<MainNavi /> {/** USES getRouteLinks -> ContextInfo */}\n\t\t\t\t\t\t\t\t<ContextInfoPanel routes={routes} />\n\t\t\t\t\t\t\t\t<ContextAction routes={routes} />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div className=\"di main\">\n\t\t\t\t\t\t\t\t<div className=\"di main-box\">\n\t\t\t\t\t\t\t\t\t<SubNavi /> {/** USES getRouteLinks -> ContextInfo */}\n\t\t\t\t\t\t\t\t\t<div className=\"di main-box-cont\">\n\t\t\t\t\t\t\t\t\t\t<div className=\"content-box\">\n\t\t\t\t\t\t\t\t\t\t\t<NavRoutes routes={routes} />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</ContextInfoContext.Consumer>\n\n\t\t\t<Footer showApiVersion />\n\t\t</ContextProviders>\n\t);\n};\n\nexport default MainPage;\n","import {type ComponentType, createElement, useCallback, useContext, useEffect, useState} from 'react';\nimport {Redirect, Route, useHistory, useLocation} from 'react-router-dom';\n\nimport {type AuthInfo, fetchMe} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport {fetchPaginationSettings, signinSuccess} from 'modules/users/actions/signin';\nimport {deleteAuthInfo, readRedirectLocation, retrieveAuthInfo, storeRedirectLocation} from 'modules/users/authHelper';\nimport {getStartPage} from 'modules/users/startpage';\nimport {isUrlAbsolute} from 'utils/urlUtils';\n\ntype Props = {\n\tcomponent: ComponentType<any>;\n\tredirectTo: string;\n};\n\nfunction redirectToOAuthCallbackUrl(authInfo?: AuthInfo) {\n\tconst callbackUrl = localStorage.getItem('OAUTH2_CALLBACK_URL');\n\tlocalStorage.removeItem('OAUTH2_CALLBACK_URL');\n\n\tif (callbackUrl) {\n\t\tconst redirect = (authInfo: AuthInfo) => {\n\t\t\tconst redirectUrl = callbackUrl + '&access_token=' + encodeURIComponent(authInfo.accessToken);\n\t\t\twindow.location.replace(redirectUrl);\n\t\t};\n\n\t\tif (!authInfo) {\n\t\t\tretrieveAuthInfo().then(redirect, error => console.error(error));\n\t\t} else {\n\t\t\tredirect(authInfo);\n\t\t}\n\t}\n}\n\nexport default function ProtectedRouteLegacy(props: Props) {\n\tconst {component, redirectTo} = props;\n\tconst {authenticated, setAuthenticatedUser} = useContext(UserContext);\n\tconst location = useLocation();\n\tconst history = useHistory();\n\tconst [waitingForAutoSignin, setWaitingForAutoSignin] = useState<boolean>(!authenticated);\n\tconst [hasBeenAuthenticated, setHasBeenAuthenticated] = useState<boolean>(authenticated);\n\tconst doRedirect = useCallback(\n\t\t(authInfo: AuthInfo) => {\n\t\t\tconst redirectLocation = readRedirectLocation();\n\n\t\t\tif (redirectLocation) {\n\t\t\t\tif (redirectLocation.pathname && redirectLocation.pathname.startsWith('/api/v2/oauth/authorize')) {\n\t\t\t\t\tconst url =\n\t\t\t\t\t\tredirectLocation.pathname +\n\t\t\t\t\t\t(redirectLocation.search || '') +\n\t\t\t\t\t\t'&access_token=' +\n\t\t\t\t\t\tencodeURIComponent(authInfo.accessToken);\n\t\t\t\t\twindow.location.replace(url);\n\t\t\t\t} else {\n\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\thistory.push(redirectLocation);\n\t\t\t\t}\n\t\t\t} else if (location.pathname === '/') {\n\t\t\t\tgetStartPage().then(url => history.push(url));\n\t\t\t}\n\t\t},\n\t\t[history, location.pathname],\n\t);\n\n\tconst tryAutoSignin = useCallback(async () => {\n\t\ttry {\n\t\t\tconst authInfo = await retrieveAuthInfo();\n\t\t\t// prefetch start page, speedup login\n\t\t\t// also avoids shortly visible rendering of initial page and then redirect to other page\n\t\t\tconst [user, paginationSettings] = await Promise.all([\n\t\t\t\tfetchMe(),\n\t\t\t\tfetchPaginationSettings(),\n\t\t\t\tgetStartPage(),\n\t\t\t]);\n\t\t\tawait signinSuccess(authInfo.principal, user, true, paginationSettings, setAuthenticatedUser);\n\t\t\tredirectToOAuthCallbackUrl(authInfo);\n\t\t\tdoRedirect(authInfo);\n\t\t} catch (err) {\n\t\t\tconsole.error('auto signin failed', err);\n\t\t\tawait deleteAuthInfo();\n\t\t} finally {\n\t\t\tsetWaitingForAutoSignin(false);\n\t\t}\n\t}, [doRedirect, setAuthenticatedUser]);\n\n\tuseEffect(() => {\n\t\tif (authenticated) {\n\t\t\tsetHasBeenAuthenticated(true);\n\t\t}\n\t}, [authenticated]);\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's legacy code, no time to refactor properly\n\tuseEffect(() => {\n\t\t// The redirect location should only be stored if the unauthenticated user opens a protected route.\n\t\t// The condition below allows to avoid a different case - when the user has been authenticated\n\t\t// and now is not (for instance because clicked Logout)\n\t\tif (!authenticated && !hasBeenAuthenticated) {\n\t\t\tstoreRedirectLocation({\n\t\t\t\tpathname: location.pathname,\n\t\t\t\tsearch: location.search,\n\t\t\t\thash: location.hash,\n\t\t\t});\n\t\t}\n\n\t\tstoreOAuthCallbackUrl();\n\n\t\tif (!authenticated) {\n\t\t\ttryAutoSignin();\n\t\t} else {\n\t\t\tredirectToOAuthCallbackUrl();\n\t\t}\n\t}, [authenticated, location, tryAutoSignin]);\n\n\tfunction storeOAuthCallbackUrl() {\n\t\ttry {\n\t\t\tconst params = new URLSearchParams(window.location.search);\n\t\t\tconst callbackUrl = params.get('oauth_callback');\n\n\t\t\tif (callbackUrl && !isUrlAbsolute(callbackUrl)) {\n\t\t\t\tlocalStorage.setItem('OAUTH2_CALLBACK_URL', callbackUrl);\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.error('Failed to store redirect location from query string', e);\n\t\t}\n\t}\n\n\treturn (\n\t\t<Route\n\t\t\trender={props => {\n\t\t\t\tif (authenticated) {\n\t\t\t\t\treturn createElement(component, props);\n\t\t\t\t} else if (waitingForAutoSignin) {\n\t\t\t\t\treturn <Spinner center />;\n\t\t\t\t} else {\n\t\t\t\t\treturn <Redirect to={redirectTo} />;\n\t\t\t\t}\n\t\t\t}}\n\t\t/>\n\t);\n}\n","import type {BackendModule, InitOptions, ReadCallback, Services} from 'i18next';\nimport {merge} from 'lodash';\n\ntype Options = {\n\tbackends?: Array<any>;\n\tbackendOptions?: Array<unknown>;\n};\n\nfunction createClassOnDemand(ClassOrObject: any) {\n\tif (!ClassOrObject) return null;\n\tif (typeof ClassOrObject === 'function') return new ClassOrObject();\n\treturn ClassOrObject;\n}\n\nexport function createMultiBackend(): BackendModule {\n\tconst backends: Array<BackendModule> = [];\n\treturn {\n\t\ttype: 'backend',\n\t\tinit(services: Services, options: Options, i18nextOptions: InitOptions) {\n\t\t\tif (options.backends) {\n\t\t\t\toptions.backends.forEach((b, i) => {\n\t\t\t\t\tconst backendInstance = createClassOnDemand(b);\n\t\t\t\t\tif (backendInstance?.read) {\n\t\t\t\t\t\tbackends.push(backendInstance);\n\t\t\t\t\t\tbackendInstance.init(services, options.backendOptions?.[i] || {}, i18nextOptions);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tread(language: string, namespace: string, callback: ReadCallback) {\n\t\t\tconst backendsLen = backends.length;\n\t\t\tconst result = {};\n\n\t\t\tconst readFromBackend = (backendNum: number) => {\n\t\t\t\tif (backendNum >= backendsLen) return callback(new Error('non of the backend loaded data;'), undefined);\n\t\t\t\tconst backend = backends[backendNum];\n\t\t\t\tconst resolver: ReadCallback = (err, data) => {\n\t\t\t\t\tif (!err && data && Object.keys(data).length > 0) {\n\t\t\t\t\t\tmerge(result, data);\n\t\t\t\t\t}\n\t\t\t\t\tif (backendNum === backendsLen - 1) {\n\t\t\t\t\t\tcallback(null, result);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treadFromBackend(backendNum + 1);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tbackend.read(language, namespace, resolver);\n\t\t\t};\n\t\t\treadFromBackend(0);\n\t\t},\n\t};\n}\n","import axios from 'axios';\nimport LocizeBackend from 'i18next-locize-backend';\n// @ts-expect-error\nimport {interpolate} from 'i18next-locize-backend/dist/commonjs/utils';\nimport {merge, mergeWith} from 'lodash';\n\nfunction mergeTranslations(object: Record<string, any>, source: Record<string, any>) {\n\treturn mergeWith(object, source, (objectValue, sourceValue) => {\n\t\tif (sourceValue === '') {\n\t\t\treturn objectValue;\n\t\t}\n\t});\n}\n\nexport default class TenantLocizeBackend extends LocizeBackend {\n\t// @ts-expect-error\n\tinit(services: Record<string, any>, backendOptions: Record<string, any>, i18nextOptions: Record<string, any>) {\n\t\tif (typeof backendOptions !== 'undefined') {\n\t\t\tconst inContextEditingCredentials = backendOptions.tenantProjectId\n\t\t\t\t? TenantLocizeBackend.createInContextEditingCredentials(\n\t\t\t\t\t\tbackendOptions.tenantProjectId,\n\t\t\t\t\t\tbackendOptions.tenantApiKey,\n\t\t\t\t\t\tbackendOptions.tenantVersion,\n\t\t\t\t\t)\n\t\t\t\t: TenantLocizeBackend.createInContextEditingCredentials(\n\t\t\t\t\t\tbackendOptions.mainProjectId,\n\t\t\t\t\t\tbackendOptions.mainApiKey,\n\t\t\t\t\t\tbackendOptions.mainVersion,\n\t\t\t\t\t);\n\t\t\tmerge(backendOptions, inContextEditingCredentials);\n\t\t}\n\n\t\t// @ts-expect-error\n\t\tsuper.init(services, backendOptions, i18nextOptions);\n\t}\n\n\tstatic createInContextEditingCredentials(projectId: string, apiKey: string, version: string): Record<string, any> {\n\t\treturn {\n\t\t\tprojectId,\n\t\t\tapiKey,\n\t\t\tversion,\n\t\t};\n\t}\n\n\treadTenantAndMainLocizeProjects(language: string, namespace: string): Promise<Record<string, any>> {\n\t\tconst tenantUrl = this.getReadUrl(\n\t\t\tlanguage,\n\t\t\tnamespace,\n\t\t\t// @ts-expect-error\n\t\t\tthis.options.tenantProjectId,\n\t\t\t// @ts-expect-error\n\t\t\tthis.options.tenantVersion,\n\t\t);\n\t\t// @ts-expect-error\n\t\tconst mainUrl = this.getReadUrl(language, namespace, this.options.mainProjectId, this.options.mainVersion);\n\t\treturn Promise.all([\n\t\t\t// @ts-expect-error\n\t\t\tTenantLocizeBackend.requestData(tenantUrl, this.options.tenantApiKey),\n\t\t\t// @ts-expect-error\n\t\t\tTenantLocizeBackend.requestData(mainUrl, this.options.mainApiKey),\n\t\t]).then(([tenant, main]: [Record<string, any>, Record<string, any>]) => mergeTranslations(main, tenant));\n\t}\n\n\treadMainLocizeProject(language: string, namespace: string): Promise<Record<string, any>> {\n\t\t// @ts-expect-error\n\t\tconst url = this.getReadUrl(language, namespace, this.options.mainProjectId, this.options.mainVersion);\n\t\t// @ts-expect-error\n\t\treturn TenantLocizeBackend.requestData(url, this.options.mainApiKey);\n\t}\n\n\t// @ts-expect-error\n\tread(\n\t\tlanguage: string,\n\t\tnamespace: string,\n\t\tcallback: (error?: Error | null, translations?: Record<string, any>) => void,\n\t) {\n\t\tPromise.resolve(\n\t\t\t// @ts-expect-error\n\t\t\tthis.options.tenantProjectId\n\t\t\t\t? this.readTenantAndMainLocizeProjects(language, namespace)\n\t\t\t\t: this.readMainLocizeProject(language, namespace),\n\t\t)\n\t\t\t.then(translations => callback(null, translations))\n\t\t\t.catch(callback);\n\t}\n\n\tcreate(\n\t\tlanguages: Array<string>,\n\t\tnamespace: string,\n\t\tkey: string,\n\t\tfallbackValue: any,\n\t\tcallback: (...args: Array<any>) => any,\n\t\toptions: Record<string, any>,\n\t) {\n\t\tif (!callback) callback = () => {};\n\t\tif (typeof languages === 'string') languages = [languages];\n\t\tlanguages.forEach(lng => {\n\t\t\t// @ts-expect-error\n\t\t\tif (lng === this.options.referenceLng) {\n\t\t\t\t// @ts-expect-error\n\t\t\t\tthis.queue.call(this, this.options.referenceLng, namespace, key, '', callback, options);\n\t\t\t}\n\t\t});\n\t}\n\n\tgetReadUrl(language: string, namespace: string, projectId: string, version: string): any {\n\t\t// @ts-expect-error\n\t\treturn this.buildUrl(this.options.loadPath, {\n\t\t\tlng: language,\n\t\t\tns: namespace,\n\t\t\tprojectId,\n\t\t\tversion,\n\t\t});\n\t}\n\n\tbuildUrl(urlTemplate: string, options: unknown): any {\n\t\treturn interpolate(urlTemplate, options);\n\t}\n\n\tstatic requestData(url: string, apiKey: string): Promise<Record<string, any>> {\n\t\treturn axios\n\t\t\t.get(url, {\n\t\t\t\theaders: {\n\t\t\t\t\tAuthorization: apiKey,\n\t\t\t\t},\n\t\t\t})\n\t\t\t.then(response => response.data);\n\t}\n}\n","import {type ComponentType, useContext} from 'react';\n\nimport {UserContext} from 'contexts/user/UserContext';\n\nexport type LocaleProps = {\n\tlocale: string;\n};\n\nexport default function withLocale<P>(WrappedComponent: ComponentType<P & LocaleProps>): ComponentType<P> {\n\treturn (props: P) => {\n\t\tconst {user} = useContext(UserContext);\n\t\treturn <WrappedComponent {...props} locale={user.locale} />;\n\t};\n}\n","import dayjs from 'dayjs';\nimport i18n, {type InitOptions} from 'i18next';\nimport {locizePlugin} from 'locize';\nimport {debounce} from 'lodash';\nimport qs from 'qs';\nimport * as React from 'react';\nimport {setI18n} from 'react-i18next';\n\nimport {Spinner, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\n\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {getAdditionalBackends} from './additionalI18nextBackends';\nimport {createMultiBackend} from './MultiBackend';\nimport TenantLocizeBackend from './TenantLocizeBackend';\nimport withLocale, {type LocaleProps} from './withLocale';\n\ntype Props = LocaleProps & {children: React.ReactNode};\ntype State = {\n\ti18nextInitialized: boolean;\n\tlanguageLoading: boolean;\n};\n\nfunction initI18next() {\n\tconst mainLocizeProject = UIConfiguration.getMainLocizeProject();\n\tconst tenantLocizeProject = UIConfiguration.getTenantLocizeProject();\n\tconst optionsLocizeBackend = {\n\t\t// Tenant-specific project on Locize\n\t\ttenantProjectId: tenantLocizeProject ? tenantLocizeProject.projectId : null,\n\t\ttenantApiKey: tenantLocizeProject ? tenantLocizeProject.apiKey : null,\n\t\ttenantVersion: tenantLocizeProject ? tenantLocizeProject.version : null,\n\t\t// Common NG UI project on Locize\n\t\tmainProjectId: mainLocizeProject.projectId,\n\t\tmainApiKey: mainLocizeProject.apiKey,\n\t\tmainVersion: mainLocizeProject.version,\n\t\treferenceLng: 'en',\n\t};\n\t// locize editor only works when locize is used as a direct backend (without chained backend in between)\n\tconst locationQueryParams = qs.parse(window.location.search.substring(1));\n\tconst locizeEditorParam = locationQueryParams.locize || '';\n\tconst printMissingTranslationKeys = locationQueryParams.printMissingTranslationKeys === 'true';\n\tconst additionalBackends = getAdditionalBackends();\n\tconst useAdditionalBackends = locizeEditorParam !== 'true' && additionalBackends.length > 0;\n\tconst configI18Next: InitOptions = {\n\t\tfallbackLng: 'en',\n\t\tappendNamespaceToCIMode: true,\n\t\tdebug: printMissingTranslationKeys,\n\t\t// translation: common namespace used for translations around the full app\n\t\t// documentation: namespace used for storing documentation ids\n\t\tns: ['translation', 'documentation'],\n\t\tdefaultNS: 'translation',\n\t\t// locize settings publish format: json nested: '.', json flat: null\n\t\tkeySeparator: '.',\n\t\tinterpolation: {\n\t\t\tescapeValue: false,\n\t\t\t// not needed for react!!\n\t\t\tformatSeparator: ',',\n\t\t},\n\t\treact: {\n\t\t\tbindI18n: 'languageChanged editorSaved',\n\t\t\tuseSuspense: true,\n\t\t},\n\t};\n\n\tif (useAdditionalBackends) {\n\t\t// use locize and additional backends\n\t\tconst backends = [TenantLocizeBackend, ...additionalBackends.map(bc => bc.backend)];\n\t\tconst backendOptions = [optionsLocizeBackend, ...additionalBackends.map(bc => bc.backendConfig)];\n\t\tconst completeInitOptions = {\n\t\t\t...configI18Next,\n\t\t\tbackend: {\n\t\t\t\tbackends,\n\t\t\t\tbackendOptions,\n\t\t\t},\n\t\t};\n\t\treturn new Promise<void>(resolve => {\n\t\t\ti18n.use(createMultiBackend()).init(completeInitOptions, () => {\n\t\t\t\tsetI18n(i18n);\n\t\t\t\tresolve();\n\t\t\t});\n\t\t});\n\t} else {\n\t\t// only use locize backend\n\t\treturn new Promise<void>(resolve => {\n\t\t\ti18n.use(TenantLocizeBackend)\n\t\t\t\t.use(locizePlugin) // the locize editor only works when the locize backend is used directly\n\t\t\t\t.init({...configI18Next, backend: optionsLocizeBackend}, () => {\n\t\t\t\t\tsetI18n(i18n);\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t});\n\t}\n}\n\nconst storeAndRetrieveCiModeAndLanguage = (locale: string) => {\n\tconst queryParams = qs.parse(window.location.search.substring(1));\n\tconst ciModeActive = queryParams.locize === 'true';\n\tlet language;\n\n\tif (ciModeActive && queryParams.lng) {\n\t\tlanguage = queryParams.lng.toString();\n\t} else {\n\t\tlanguage = locale;\n\t}\n\n\t// These global variables are needed for the Documentation component in ng-ui-components\n\twindow.nguiCiModeActive = ciModeActive;\n\twindow.nguiI18nLanguage = language;\n\treturn language;\n};\n\nclass I18nextNGUIProvider extends React.Component<Props, State> {\n\tstate = {\n\t\ti18nextInitialized: false,\n\t\tlanguageLoading: true,\n\t};\n\n\tasync componentDidMount() {\n\t\tdayjs.locale(this.props.locale);\n\t\tawait this.initializeI18next();\n\t\tconst language = storeAndRetrieveCiModeAndLanguage(this.props.locale);\n\t\ti18n.changeLanguage(language, () =>\n\t\t\tthis.setState({\n\t\t\t\ti18nextInitialized: true,\n\t\t\t}),\n\t\t);\n\t}\n\n\tcomponentDidUpdate(prevProps: Props) {\n\t\tif (this.props.locale !== prevProps.locale) {\n\t\t\tdayjs.locale(this.props.locale);\n\n\t\t\tif (this.state.i18nextInitialized && i18n) {\n\t\t\t\tconst language = storeAndRetrieveCiModeAndLanguage(this.props.locale);\n\t\t\t\ti18n.changeLanguage(language);\n\t\t\t}\n\t\t}\n\t}\n\n\tonLanguageLoaded = debounce(() => {\n\t\tthis.setState({\n\t\t\tlanguageLoading: false,\n\t\t});\n\t}, 500);\n\tinitializeI18next = async () => {\n\t\tawait initI18next();\n\t\ti18n.on('languageChanged', () =>\n\t\t\tthis.setState(\n\t\t\t\t{\n\t\t\t\t\tlanguageLoading: true,\n\t\t\t\t},\n\t\t\t\tthis.onLanguageLoaded,\n\t\t\t),\n\t\t);\n\t\ti18n.on('loaded', this.onLanguageLoaded);\n\t};\n\n\trender() {\n\t\tconst {i18nextInitialized, languageLoading} = this.state;\n\t\tconst isLoading = !i18nextInitialized || languageLoading;\n\n\t\treturn (\n\t\t\t<React.Suspense fallback={<Spinner />}>\n\t\t\t\t<SpinnerContainer show={isLoading} className=\"di i18n-container\">\n\t\t\t\t\t{i18nextInitialized && this.props.children}\n\t\t\t\t</SpinnerContainer>\n\t\t\t</React.Suspense>\n\t\t);\n\t}\n}\n\nexport default withLocale(I18nextNGUIProvider) as React.ComponentType<React.PropsWithChildren<unknown>>;\n","export const wave = (\n\t<svg className=\"whats-new-svg\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 753 194.75\">\n\t\t<title>Whats new</title>\n\t\t<g className=\"wave-background\" fill=\"#1a8ed3\">\n\t\t\t<g id=\"waves\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M194.37,213.62a543.33,543.33,0,0,1-88.23-7.75C51.06,196.52,0,178.83-.49,178.65a1.5,1.5,0,0,1-.93-1.91,1.51,1.51,0,0,1,1.91-.92c.51.18,51.33,17.79,106.15,27.1a553,553,0,0,0,74.68,7.49c-43.35-9-86.54-33.41-117-53.86A572.13,572.13,0,0,1-1,105.41a1.5,1.5,0,0,1-.06-2.12A1.5,1.5,0,0,1,1,103.23a568.45,568.45,0,0,0,65.05,50.86c35.08,23.58,87.27,52.51,136.7,56.41a1.5,1.5,0,0,1-.05,3C202.62,213.5,199.66,213.62,194.37,213.62Z\"\n\t\t\t\t\ttransform=\"translate(1.5 -20.33)\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: 0.1,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\td=\"M224.91,214.09c-3.29,0-6.59,0-9.92-.12C164.29,212.68,92.2,191-.44,158.92A1.5,1.5,0,0,1-1.37,157a1.51,1.51,0,0,1,1.91-.93c92.38,32,164.22,53.61,214.53,54.89,62.22,1.57,116.75-12,199.31-32.57q15.67-3.92,32.7-8.11c26.51-6.53,47.7-12.27,66.4-17.34,44.28-12,73.53-19.94,124.38-25.11,44.3-4.5,88.54-1.06,112.7,8.76a1.5,1.5,0,1,1-1.12,2.78c-23.75-9.65-67.43-13-111.28-8.55-50.6,5.14-79.76,13-123.9,25-18.71,5.08-39.92,10.83-66.47,17.36q-17,4.2-32.69,8.11C336.71,200.84,283.51,214.09,224.91,214.09Z\"\n\t\t\t\t\ttransform=\"translate(1.5 -20.33)\"\n\t\t\t\t\tstyle={{\n\t\t\t\t\t\topacity: 0.2,\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t\t<path\n\t\t\t\t\td=\"M204.29,215.08c-68.07,0-136.9-11.9-204.78-35.43a1.5,1.5,0,0,1-.93-1.9,1.5,1.5,0,0,1,1.91-.93C71.55,201.45,143.66,213.28,214.81,212c69.58-1.27,124.84-14.66,225.17-39,9.95-2.41,19.54-4.77,28.84-7.05,79.32-19.49,136.63-33.57,202.78-29,40.48,2.81,64.87,7.41,79.1,14.91a1.5,1.5,0,1,1-1.4,2.65c-13.84-7.29-37.87-11.79-77.9-14.56-65.69-4.56-122.81,9.47-201.87,28.89q-13.93,3.44-28.84,7.05C340.15,200.3,284.77,213.72,214.86,215,211.34,215.05,207.81,215.08,204.29,215.08Z\"\n\t\t\t\t\ttransform=\"translate(1.5 -20.33)\"\n\t\t\t\t/>\n\t\t\t</g>\n\t\t\t<g id=\"lampe\">\n\t\t\t\t<path\n\t\t\t\t\td=\"M652.67,57h11v7.33h-11V57M583,57h11v7.33H583V57m44-36.66v11h-7.33v-11H627M597.39,29.5l7.81,7.84L600,42.51l-7.8-7.77,5.2-5.24m44.1,7.81,7.77-7.81,5.24,5.24-7.81,7.77-5.2-5.2m-18.15,1.35a22,22,0,0,1,11,41.06v6.6A3.66,3.66,0,0,1,630.68,90H616a3.66,3.66,0,0,1-3.66-3.66v-6.6a22,22,0,0,1,11-41.06m7.34,55v3.66A3.67,3.67,0,0,1,627,101h-7.33A3.67,3.67,0,0,1,616,97.31V93.65h14.67m-11-11H627V74.84a14.67,14.67,0,1,0-7.33,0Z\"\n\t\t\t\t\ttransform=\"translate(1.5 -20.33)\"\n\t\t\t\t/>\n\t\t\t</g>\n\t\t</g>\n\t</svg>\n);\n","import {useMsal} from '@azure/msal-react';\nimport {saveAs} from 'file-saver';\nimport {useContext, useState} from 'react';\nimport {useHistory} from 'react-router-dom';\n\nimport {acceptEULA, PropertyValues, User, updateMe} from '@deviceinsight/ng-ui-api-client';\n\nimport {type ResetAuthenticatedUserType, UserContext} from 'contexts/user/UserContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport useLocale from 'hooks/useLocale';\nimport useQueryParams from 'hooks/useQueryParams';\nimport {EulaWithMeta, readEulaWithMeta} from 'modules/eula/readEulaWithMeta';\nimport {signinSuccess} from 'modules/users/actions/signin';\nimport {signoutLegacy, signoutMsal} from 'modules/users/actions/signout';\nimport {getStartPage} from 'modules/users/startpage';\nimport {isAzureB2cActive} from 'utils/msalUtils/msalUtils';\n\ntype EulaActions = {\n\taccept: (properties: PropertyValues) => Promise<void>;\n\tdecline: () => Promise<void>;\n\tdownload: () => Promise<void>;\n\tdownloaded: boolean;\n};\nexport default function useEulaActions(): EulaActions {\n\tconst {principal, user, paginationSettings, setAuthenticatedUser, resetAuthenticatedUser} = useContext(UserContext);\n\tconst {instance} = useMsal();\n\tconst locale = useLocale();\n\tconst queryParams = useQueryParams();\n\tconst [downloaded, setDownloaded] = useState<boolean>(queryParams.get('downloadedEula') === 'true');\n\tconst history = useHistory();\n\n\tasync function signout(user: User, resetAuthenticatedUser: ResetAuthenticatedUserType): Promise<void> {\n\t\tif (isAzureB2cActive()) {\n\t\t\tawait signoutMsal(user, instance);\n\t\t} else {\n\t\t\tawait signoutLegacy(user, resetAuthenticatedUser);\n\t\t}\n\t}\n\n\tasync function accept(properties: PropertyValues) {\n\t\tconst refreshedUser = await acceptEULA();\n\n\t\tif (user) {\n\t\t\tawait updateMe({...user, properties});\n\t\t}\n\n\t\tif (paginationSettings) {\n\t\t\tawait signinSuccess(principal, refreshedUser, true, paginationSettings, setAuthenticatedUser);\n\t\t} else {\n\t\t\tthrow new Error('Pagination settings for the user does not exist!');\n\t\t}\n\n\t\t// history.replace cannot be used here, because we are not in the BrowserRouter\n\t\tconst startPageUrl = await getStartPage();\n\t\twindow.location.assign(startPageUrl);\n\t}\n\n\tasync function decline() {\n\t\tif (user) {\n\t\t\tawait signout(user, resetAuthenticatedUser);\n\t\t}\n\t}\n\n\tasync function download() {\n\t\tconst localizationCode = locale.toLowerCase();\n\t\tconst fallbackLocalizationCode = UIConfiguration.getFallbackLocale();\n\t\tlet eulaWithMeta: EulaWithMeta | undefined;\n\t\ttry {\n\t\t\teulaWithMeta = await readEulaWithMeta(localizationCode);\n\t\t\tif (!eulaWithMeta) {\n\t\t\t\tthrow new Error(`EULA document for locale ${localizationCode} not found`);\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tif (localizationCode !== fallbackLocalizationCode) {\n\t\t\t\teulaWithMeta = await readEulaWithMeta(fallbackLocalizationCode);\n\t\t\t} else {\n\t\t\t\tconsole.error(error);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (!eulaWithMeta) {\n\t\t\tconsole.error('EULA document could not be found');\n\t\t\treturn;\n\t\t}\n\n\t\tconst searchParams = new URLSearchParams(window.location.search);\n\t\tsearchParams.set('downloadedEula', 'true');\n\t\thistory.replace({search: searchParams.toString()});\n\t\tsetDownloaded(true);\n\n\t\tsaveAs(\n\t\t\tnew Blob([eulaWithMeta.data], {\n\t\t\t\ttype: eulaWithMeta.meta.contentType,\n\t\t\t}),\n\t\t\teulaWithMeta.meta.userMetadata['X-Blob-Meta-Filename'],\n\t\t);\n\t}\n\n\treturn {\n\t\taccept,\n\t\tdecline,\n\t\tdownload,\n\t\tdownloaded,\n\t};\n}\n","import {type RefObject, useEffect, useMemo, useRef, useState} from 'react';\n\ntype HeightObserver = {\n\tref: RefObject<HTMLDivElement | null>;\n\theight: number;\n};\n\nexport default function useHeightObserver(): HeightObserver {\n\tconst ref = useRef<HTMLDivElement>(null);\n\tconst {current} = ref;\n\tconst [height, setHeight] = useState<number>(0);\n\tconst resizeObserver = useMemo(\n\t\t() =>\n\t\t\tnew ResizeObserver(() => {\n\t\t\t\tif (current) {\n\t\t\t\t\tsetHeight(current.scrollHeight);\n\t\t\t\t}\n\t\t\t}),\n\t\t[current],\n\t);\n\tuseEffect(() => {\n\t\tif (current) {\n\t\t\tresizeObserver.observe(current);\n\t\t\tsetHeight(current.scrollHeight);\n\t\t}\n\n\t\treturn () => {\n\t\t\tif (current) {\n\t\t\t\tresizeObserver.unobserve(current);\n\t\t\t}\n\t\t};\n\t}, [current, resizeObserver]);\n\treturn {\n\t\tref,\n\t\theight,\n\t};\n}\n","import domPurify from 'dompurify';\nimport {useContext, useEffect, useState} from 'react';\n\nimport {type User, updateMe} from '@deviceinsight/ng-ui-api-client';\nimport {Button, ButtonRow, Checkbox, Modal, SpinnerContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {messageBoxError} from '@deviceinsight/ng-ui-components';\n\nimport iconDownload from 'assets/svg/icon_download.svg';\nimport {wave} from 'assets/welcomeModalWave';\nimport {UserContext} from 'contexts/user/UserContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport useProperties from 'hooks/useProperties';\nimport {Trans, useTranslation} from 'i18n';\nimport {onSignin, onSignout} from 'utils/eventBus';\nimport useEulaActions from './useEulaActions';\nimport useHeightObserver from './useHeightObserver';\n\nfunction calculateModalHeight(eulaHeight: number, welcomeBodyHeight: number, bottomAreaHeight: number) {\n\treturn Math.min(\n\t\t0.8 * (document.body ? document.body.clientHeight : 800) - 130,\n\t\tMath.max(450, welcomeBodyHeight + eulaHeight + bottomAreaHeight),\n\t);\n}\n\nfunction isEulaAccepted(user: User) {\n\treturn user.state !== 'TERMS_ACCEPTANCE_PENDING';\n}\n\nexport default function WelcomeModalContainer() {\n\tconst {user} = useContext(UserContext);\n\tconst {userProperties} = useProperties();\n\tconst {t} = useTranslation();\n\tconst [open, setOpen] = useState<boolean>(false);\n\tconst {accept, decline, download, downloaded} = useEulaActions();\n\tconst [readEULA, setReadEULA] = useState<boolean>(false);\n\tconst [showAtStart, setShowAtStart] = useState<boolean>(false);\n\tconst [loading, setLoading] = useState<boolean>(false);\n\tconst tenantHasShowWelcomeModalProperty = userProperties.some(property => property.key === '_showWelcomeModal');\n\tconst displayWelcomeScreen = UIConfiguration.getDisplayWelcomeScreen();\n\n\t// biome-ignore lint/correctness/useExhaustiveDependencies: It's ok\n\tuseEffect(() => {\n\t\tonSignin((user, autoSignin) => {\n\t\t\tif (!autoSignin) {\n\t\t\t\tsetOpen(!isEulaAccepted(user) || (!!user.properties._showWelcomeModal && displayWelcomeScreen));\n\t\t\t}\n\t\t});\n\t\tonSignout(() => setOpen(false));\n\t}, [displayWelcomeScreen, user]);\n\n\tuseEffect(() => {\n\t\tif (user && !isEulaAccepted(user)) {\n\t\t\tsetOpen(true);\n\t\t}\n\t}, [user]);\n\n\tconst {ref: welcomeBodyRef, height: welcomeBodyHeight} = useHeightObserver();\n\tconst {ref: eulaRef, height: eulaHeight} = useHeightObserver();\n\tconst {ref: bottomAreaRef, height: bottomAreaHeight} = useHeightObserver();\n\tconst modalHeight = calculateModalHeight(eulaHeight, welcomeBodyHeight, bottomAreaHeight);\n\n\tasync function handleProceed() {\n\t\tsetLoading(true);\n\n\t\ttry {\n\t\t\tif (user) {\n\t\t\t\tconst userProperties = tenantHasShowWelcomeModalProperty\n\t\t\t\t\t? {...user.properties, _showWelcomeModal: showAtStart}\n\t\t\t\t\t: user.properties || {};\n\n\t\t\t\tif (isEulaAccepted(user)) {\n\t\t\t\t\tif (!!user.properties._showWelcomeModal !== showAtStart) {\n\t\t\t\t\t\tawait updateMe({...user, properties: userProperties});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tawait accept(userProperties);\n\t\t\t\t}\n\t\t\t}\n\t\t\tsetLoading(false);\n\t\t\tsetOpen(false);\n\t\t} catch (error: any) {\n\t\t\tsetLoading(false);\n\t\t\tmessageBoxError(error.message || 'Unknown error');\n\t\t}\n\t}\n\n\treturn open ? (\n\t\t<Modal\n\t\t\tclassName=\"di welcome-modal above-all\"\n\t\t\theader={\n\t\t\t\t<span\n\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t__html: domPurify(window).sanitize(\n\t\t\t\t\t\t\tt('welcome.header', {\n\t\t\t\t\t\t\t\tdefaultValue: 'Welcome to CENTERSIGHT!',\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t}\n\t\t\tcontent={\n\t\t\t\t<SpinnerContainer show={loading}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"welcome-content\"\n\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\theight: modalHeight,\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"welcome-body\"\n\t\t\t\t\t\t\tref={welcomeBodyRef}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\toverflow: 'auto',\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t__html: domPurify(window).sanitize(\n\t\t\t\t\t\t\t\t\tt('welcome.body', {\n\t\t\t\t\t\t\t\t\t\tdefaultValue: '',\n\t\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{user && !isEulaAccepted(user) && (\n\t\t\t\t\t\t\t<div ref={eulaRef} className=\"eula\">\n\t\t\t\t\t\t\t\t<hr />\n\t\t\t\t\t\t\t\t<strong>\n\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"welcome.toProceedDownloadEULA\">\n\t\t\t\t\t\t\t\t\t\tTo proceed, please download our End-User-License-Agreement (EULA) first. Thank\n\t\t\t\t\t\t\t\t\t\tyou!\n\t\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t\t</strong>\n\t\t\t\t\t\t\t\t<ButtonRow>\n\t\t\t\t\t\t\t\t\t<Button primary onClick={download}>\n\t\t\t\t\t\t\t\t\t\t<img src={iconDownload} alt=\"\" />{' '}\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"welcome.downloadEULA\">Download EULA</Trans>\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t<Button onClick={decline}>\n\t\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"welcome.leave\">No, leave</Trans>\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\t\tlabel={{\n\t\t\t\t\t\t\t\t\t\t\tid: 'welcome.readEULA',\n\t\t\t\t\t\t\t\t\t\t\tdefaultValue: `I've read the EULA and agree`,\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\tdisabled={!downloaded}\n\t\t\t\t\t\t\t\t\t\tvalue={readEULA}\n\t\t\t\t\t\t\t\t\t\tonChange={() => setReadEULA(value => !value)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</ButtonRow>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t<div className=\"bottom-area\" ref={bottomAreaRef} />\n\t\t\t\t\t\t{!!user && isEulaAccepted(user) && (\n\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\tlabel={{\n\t\t\t\t\t\t\t\t\tid: 'welcome.dontShowAgain',\n\t\t\t\t\t\t\t\t\tdefaultValue: `Please don't show this window again on my next visit`,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tvalue={!showAtStart}\n\t\t\t\t\t\t\t\tonChange={() => setShowAtStart(value => !value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tclassName=\"footer-button\"\n\t\t\t\t\t\t\tonClick={handleProceed}\n\t\t\t\t\t\t\tdisabled={!!user && !isEulaAccepted(user) && !readEULA}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Trans i18nKey=\"welcome.proceed\">Proceed</Trans>\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t{wave}\n\t\t\t\t\t</div>\n\t\t\t\t</SpinnerContainer>\n\t\t\t}\n\t\t\twidth={700}\n\t\t/>\n\t) : null;\n}\n","import {PureComponent} from 'react';\n\nimport {Button, Modal} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\n\nexport type Props = {\n\tmessage: string;\n\tclose: (status: boolean) => any;\n};\nexport default class DiscardChangesModalContainer extends PureComponent<Props> {\n\tcancelTransition: () => void = () => {\n\t\tconst {close} = this.props;\n\t\tclose(false);\n\t};\n\tconfirmTransition: () => void = () => {\n\t\tconst {close} = this.props;\n\t\tclose(true);\n\t};\n\n\trender() {\n\t\tconst {message} = this.props;\n\t\treturn (\n\t\t\t<div>\n\t\t\t\t<Modal\n\t\t\t\t\theader={<Trans i18nKey=\"discardChanges.header\">Leave page</Trans>}\n\t\t\t\t\tcontent={\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t{message ? (\n\t\t\t\t\t\t\t\tmessage\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Trans i18nKey=\"discardChanges.message\">\n\t\t\t\t\t\t\t\t\tYour unsaved changes on this page will be lost ...\n\t\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tfooter={\n\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t<Button primary onClick={this.confirmTransition}>\n\t\t\t\t\t\t\t\t<Trans i18nKey=\"discardChanges.confirm\">Leave without saving</Trans>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button onClick={this.cancelTransition}>\n\t\t\t\t\t\t\t\t<Trans i18nKey=\"discardChanges.cancel\">Stay</Trans>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tonOutsideClick={this.cancelTransition}\n\t\t\t\t\twidth={400}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n}\n","import domPurify from 'dompurify';\nimport {PureComponent} from 'react';\n\nimport {\n\treadReleaseNotesSubscription,\n\treadReleaseNotesVersionsViewed,\n\twriteReleaseNotesSubscription,\n\twriteReleaseNotesVersionsViewed,\n} from '@deviceinsight/ng-ui-api-client';\nimport {Button, Checkbox, Modal} from '@deviceinsight/ng-ui-basic-components';\n\nimport {UserContext, type UserContextType} from 'contexts/user/UserContext';\nimport UIConfiguration from 'customization/UIConfiguration';\nimport {Trans, type WithTranslation, withTranslation} from 'i18n';\nimport {getStorageKey, storeAuthInfo} from 'modules/users/authHelper';\nimport {wave} from '../assets/welcomeModalWave';\nimport {getAppVersion} from './env';\nimport {onSignin} from './eventBus';\nimport {isAzureB2cActive} from './msalUtils/msalUtils';\n\ntype Props = WithTranslation;\ntype State = {show: boolean; viewedVersions: string[]; isSubscribed: boolean; currentWhatsNewVersion: string};\nconst CHARS_TO_CHECK = 6; // ex. for Release 1.26.0 we want 1.26.0\n\nconst CHARS_MAIN_VERSION = 4; // ex. for Release 1.26.0 we want 1.26 (.* will be added later)\n\nconst NOT_FOUND = 'NOT_FOUND';\n\nclass WhatsNewModalContainer extends PureComponent<Props, State> {\n\tstatic contextType = UserContext;\n\tstate = {\n\t\tshow: false,\n\t\tviewedVersions: [],\n\t\tisSubscribed: true,\n\t\tcurrentWhatsNewVersion: getAppVersion().substring(0, CHARS_TO_CHECK).replace(/\\./g, '_'),\n\t};\n\n\tcomponentDidMount() {\n\t\tconst tenantWhatsNewVersion = UIConfiguration.getAppWhatsNewVersion();\n\t\tconst whatsNewVersion = tenantWhatsNewVersion ? tenantWhatsNewVersion : this.state.currentWhatsNewVersion;\n\n\t\tthis.setState({currentWhatsNewVersion: whatsNewVersion});\n\n\t\tonSignin((_user, autoSignIn) => {\n\t\t\tconst authInfoString = localStorage.getItem(getStorageKey());\n\t\t\tconst authInfo = JSON.parse(authInfoString ? authInfoString : '{\"usesOAuth\": false}');\n\n\t\t\tif (!autoSignIn || authInfo.usesOAuth === true || isAzureB2cActive()) {\n\t\t\t\t// delete flag so that the modal only gets displayed once during the user's session\n\t\t\t\tdelete authInfo.usesOAuth;\n\t\t\t\tstoreAuthInfo(authInfo);\n\t\t\t\tthis.checkIfShowModal();\n\t\t\t}\n\t\t});\n\t}\n\n\tcheckIfShowModal = async () => {\n\t\tconst userContext = this.context as UserContextType;\n\t\tconst currentUser = userContext.user;\n\t\tconst {t} = this.props;\n\t\tconst {currentWhatsNewVersion} = this.state;\n\t\tlet isSubscribed = true;\n\n\t\ttry {\n\t\t\tisSubscribed = await readReleaseNotesSubscription();\n\t\t\tthis.setState({isSubscribed});\n\t\t} catch (_e) {\n\t\t\t// by default show news to the user\n\t\t\tisSubscribed = true;\n\t\t\tthis.setState({isSubscribed});\n\t\t}\n\n\t\tlet translationAvailable =\n\t\t\tt(`whatsNew.body.${currentWhatsNewVersion}`, {defaultValue: NOT_FOUND}) !== NOT_FOUND;\n\t\tlet whatsNewVersion = currentWhatsNewVersion;\n\n\t\tif (!translationAvailable) {\n\t\t\tconst mainVersion = `${currentWhatsNewVersion.substring(0, CHARS_MAIN_VERSION)}_*`;\n\t\t\tconst key = `whatsNew.body.${mainVersion}`;\n\t\t\ttranslationAvailable = t(key, {defaultValue: NOT_FOUND}) !== NOT_FOUND;\n\n\t\t\tif (translationAvailable) {\n\t\t\t\twhatsNewVersion = mainVersion;\n\t\t\t}\n\t\t}\n\n\t\tconst showWelcomeModal =\n\t\t\tUIConfiguration.getDisplayWelcomeScreen() && currentUser && !!currentUser.properties._showWelcomeModal;\n\n\t\ttry {\n\t\t\tconst viewedVersions = await readReleaseNotesVersionsViewed();\n\t\t\tconst show =\n\t\t\t\t!showWelcomeModal &&\n\t\t\t\ttranslationAvailable &&\n\t\t\t\tisSubscribed &&\n\t\t\t\tviewedVersions.indexOf(whatsNewVersion) === -1;\n\t\t\tthis.setState({show, viewedVersions, currentWhatsNewVersion: whatsNewVersion});\n\t\t} catch (_e) {\n\t\t\tconst show = isSubscribed && translationAvailable;\n\t\t\tthis.setState({show, viewedVersions: [], currentWhatsNewVersion: whatsNewVersion});\n\t\t}\n\t};\n\tclose = async () => {\n\t\tthis.setState({show: false});\n\t\tconst {viewedVersions, isSubscribed, currentWhatsNewVersion} = this.state;\n\t\tconst versionsToSave = isSubscribed ? [...new Set([...viewedVersions, currentWhatsNewVersion])] : [];\n\n\t\ttry {\n\t\t\tawait Promise.all([\n\t\t\t\twriteReleaseNotesVersionsViewed(versionsToSave),\n\t\t\t\twriteReleaseNotesSubscription(isSubscribed),\n\t\t\t]);\n\t\t} catch (e) {\n\t\t\tconsole.error('Error while saving whatsNew configuration', e);\n\t\t}\n\t};\n\ttoggleSubscription = () => {\n\t\tthis.setState(({isSubscribed}) => ({isSubscribed: !isSubscribed}));\n\t};\n\n\trender() {\n\t\tconst {show, isSubscribed, currentWhatsNewVersion} = this.state;\n\t\tconst {t} = this.props;\n\t\treturn (\n\t\t\t<>\n\t\t\t\t{show && (\n\t\t\t\t\t<Modal\n\t\t\t\t\t\tclassName=\"di welcome-modal whats-new-modal\"\n\t\t\t\t\t\theader={\n\t\t\t\t\t\t\t<Trans i18nKey={`whatsNew.header.${currentWhatsNewVersion}`}>\n\t\t\t\t\t\t\t\tWhat is new in {currentWhatsNewVersion}\n\t\t\t\t\t\t\t</Trans>\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontent={\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tdangerouslySetInnerHTML={{\n\t\t\t\t\t\t\t\t\t\t__html: domPurify(window).sanitize(\n\t\t\t\t\t\t\t\t\t\t\tt(`whatsNew.body.${currentWhatsNewVersion}`, {defaultValue: ''}),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\t\t\tlabel={{\n\t\t\t\t\t\t\t\t\t\tid: 'whatsNewModal.checkboxSubscription',\n\t\t\t\t\t\t\t\t\t\tdefaultValue:\n\t\t\t\t\t\t\t\t\t\t\t'Please keep me informed about further changes and improvements of my views',\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tvalue={isSubscribed}\n\t\t\t\t\t\t\t\t\tonChange={this.toggleSubscription}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<Button className=\"footer-button\" onClick={this.close}>\n\t\t\t\t\t\t\t\t\t<Trans i18nKey=\"whatsNewModal.close\">Close</Trans>\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t{wave}\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t}\n\t\t\t\t\t\twidth={700}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</>\n\t\t);\n\t}\n}\n\nexport default withTranslation()(WhatsNewModalContainer);\n","import {useState} from 'react';\nimport {BrowserRouter, Route, Switch} from 'react-router-dom';\n\nimport {ModalContainer} from '@deviceinsight/ng-ui-basic-components';\nimport {MessageBoxContainer, messageBoxDismissGroup, messageBoxWarn} from '@deviceinsight/ng-ui-components';\n\nimport {AuthorizationServersContextProvider} from 'contexts/authorizationServers/AuthorizationServersContextProvider';\nimport {GlobalResourcesContextProvider} from 'contexts/globalResources/GlobalResourcesContextProvider';\nimport {UserContextProvider} from 'contexts/user/UserContextProvider';\nimport AxiosErrorHandler from 'modules/axiosErrors/AxiosErrorHandler';\nimport LandingPageContainer from 'modules/changeemail/LandingPageContainer';\nimport {ForgotPassword} from 'modules/forgotpassword/ForgotPassword';\nimport Legals from 'modules/legals/Legals';\nimport {SetPassword} from 'modules/setpassword/SetPassword';\nimport Signin from 'modules/signin/Signin';\nimport MainPage from 'routes/MainPage';\nimport ProtectedRouteLegacy from 'routes/ProtectedRouteLegacy';\nimport UIConfiguration from './customization/UIConfiguration';\nimport {Trans} from './i18n';\nimport I18nextNGUIProvider from './i18n/I18nextNGUIProvider';\nimport {tokenRefresher} from './modules/users/TokenRefresher';\nimport WelcomeModalContainer from './modules/welcome/WelcomeModalContainer';\nimport DiscardChangesModalContainer from './utils/DiscardChangesModalContainer';\nimport WhatsNewModalContainer from './utils/WhatsNewModalContainer';\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport 'assets/styles.scss';\nimport 'styles/globals.scss';\nimport 'styles/utils.scss';\nimport 'styles/variables.scss';\nimport 'styles/main.scss';\nimport '@deviceinsight/ng-ui-components/style.css';\n\ntokenRefresher.setNotificationCallbacks({\n\tshowOfflineNotification: () => {\n\t\tmessageBoxWarn(\n\t\t\t<Trans i18nKey=\"tokenRefresher.offline\">You are currently offline</Trans>,\n\t\t\t{autoClose: false, closeOnClick: false, closeButton: false},\n\t\t\t'TOKEN_REFRESHER',\n\t\t);\n\t},\n\thideOfflineNotification: () => {\n\t\tmessageBoxDismissGroup('TOKEN_REFRESHER');\n\t},\n});\n\ntype State = {message: string; callback: (status: boolean) => any} | null | undefined;\n\nexport default function AppLegacy() {\n\tconst [discardChangesModal, setDiscardChangesModal] = useState<State>(null);\n\n\tfunction userConfirmationFunction(message: string, callback: (status: boolean) => any) {\n\t\tsetDiscardChangesModal({message, callback});\n\t}\n\n\tfunction closeDiscardChangesModal(status: boolean) {\n\t\tif (discardChangesModal) {\n\t\t\tdiscardChangesModal.callback(status);\n\t\t}\n\n\t\tsetDiscardChangesModal(null);\n\t}\n\n\treturn (\n\t\t<UserContextProvider>\n\t\t\t<GlobalResourcesContextProvider>\n\t\t\t\t<I18nextNGUIProvider>\n\t\t\t\t\t<AuthorizationServersContextProvider>\n\t\t\t\t\t\t<BrowserRouter getUserConfirmation={userConfirmationFunction}>\n\t\t\t\t\t\t\t<Switch>\n\t\t\t\t\t\t\t\t<Route path=\"/signin\" component={Signin} />\n\t\t\t\t\t\t\t\t<Route path=\"/forgotpassword\" component={ForgotPassword} />\n\t\t\t\t\t\t\t\t<Route path=\"/changeemail\" component={LandingPageContainer} />\n\t\t\t\t\t\t\t\t<Route path=\"/setpassword\" component={SetPassword} />\n\t\t\t\t\t\t\t\t<Route path=\"/legals\" component={Legals} />\n\t\t\t\t\t\t\t\t<ProtectedRouteLegacy component={MainPage} redirectTo=\"/signin\" />\n\t\t\t\t\t\t\t</Switch>\n\t\t\t\t\t\t\t<WelcomeModalContainer />\n\t\t\t\t\t\t</BrowserRouter>\n\t\t\t\t\t\t<MessageBoxContainer />\n\t\t\t\t\t\t<ModalContainer />\n\t\t\t\t\t\t{!UIConfiguration.isReleaseNotesHidden() && <WhatsNewModalContainer />}\n\t\t\t\t\t\t{discardChangesModal && (\n\t\t\t\t\t\t\t<DiscardChangesModalContainer\n\t\t\t\t\t\t\t\tmessage={discardChangesModal.message}\n\t\t\t\t\t\t\t\tclose={closeDiscardChangesModal}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<AxiosErrorHandler />\n\t\t\t\t\t</AuthorizationServersContextProvider>\n\t\t\t\t</I18nextNGUIProvider>\n\t\t\t</GlobalResourcesContextProvider>\n\t\t</UserContextProvider>\n\t);\n}\n","import {useAccount, useMsal} from '@azure/msal-react';\nimport {type ComponentType, createElement, useContext, useEffect, useState} from 'react';\nimport {Redirect, Route, useLocation} from 'react-router-dom';\n\nimport {fetchMe} from '@deviceinsight/ng-ui-api-client';\nimport {Spinner} from '@deviceinsight/ng-ui-basic-components';\n\nimport {UserContext} from 'contexts/user/UserContext';\nimport {fetchPaginationSettings, signinSuccess} from 'modules/users/actions/signin';\nimport {getStartPage} from 'modules/users/startpage';\nimport {msalClientId} from 'utils/msalUtils/msalGlobals';\nimport {buildMsalSilentRequest} from 'utils/msalUtils/msalUtils';\n\ntype Props = {\n\tcomponent: ComponentType<any>;\n};\n\ntype AuthenticatedSetup = {\n\tstartPage: string | undefined;\n\tloading: boolean;\n\terror: unknown;\n};\n\nfunction useAuthenticatedSetup(): AuthenticatedSetup {\n\tconst [loading, setLoading] = useState<boolean>(true);\n\tconst [error, setError] = useState<unknown>();\n\tconst [startPage, setStartPage] = useState<string | undefined>();\n\n\tconst {setAuthenticatedUser} = useContext(UserContext);\n\t//const history = useHistory();\n\tconst {instance, accounts} = useMsal();\n\tconst account = useAccount(accounts[0] || {});\n\n\tuseEffect(() => {\n\t\tlet canceled = false;\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tsetLoading(true);\n\t\t\t\tconst authResult = await instance.acquireTokenSilent(buildMsalSilentRequest(msalClientId(), account));\n\t\t\t\tif (canceled) return;\n\t\t\t\tif (authResult.account.name) {\n\t\t\t\t\t// prefetch start page, speedup login\n\t\t\t\t\t// also avoids shortly visible rendering of initial page and then redirect to other page\n\t\t\t\t\tconst [user, paginationSettings, startPage] = await Promise.all([\n\t\t\t\t\t\tfetchMe(),\n\t\t\t\t\t\tfetchPaginationSettings(),\n\t\t\t\t\t\tgetStartPage(),\n\t\t\t\t\t]);\n\t\t\t\t\tif (canceled) return;\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t\tsetStartPage(startPage);\n\t\t\t\t\tawait signinSuccess(authResult.account.name, user, true, paginationSettings, setAuthenticatedUser);\n\t\t\t\t} else {\n\t\t\t\t\tif (canceled) return;\n\t\t\t\t\tsetError(new Error('msal signin failed, no account name!'));\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tif (!canceled) {\n\t\t\t\t\tsetError(error);\n\t\t\t\t\tsetLoading(false);\n\t\t\t\t}\n\t\t\t}\n\t\t})();\n\n\t\treturn () => {\n\t\t\tcanceled = true;\n\t\t};\n\t}, [account, instance, setAuthenticatedUser]);\n\n\treturn {startPage, loading, error};\n}\n\nexport default function ProtectedRouteMsal({component}: Props) {\n\tconst {loading, startPage, error} = useAuthenticatedSetup();\n\tconst {instance} = useMsal();\n\tconst {pathname} = useLocation();\n\n\tif (loading) {\n\t\treturn <Spinner center />;\n\t}\n\n\tif (error) {\n\t\tconsole.error('ProtectedRouteMsal error: ', error);\n\t\tinstance.logoutRedirect();\n\t\treturn null;\n\t}\n\n\tif (startPage && pathname === '/' && startPage !== '/') {\n\t\treturn <Redirect to={startPage} />;\n\t}\n\n\treturn <Route render={props => createElement(component, props)} />;\n}\n","import {Trans} from 'i18n';\nimport './AfterRegisterMFADevice.scss';\n\nexport const AfterRegisterMFADevice = () => {\n\treturn (\n\t\t<div className=\"afterregistermfadevice\">\n\t\t\t<p>\n\t\t\t\t<Trans i18nKey=\"afterRegister2FADevice.successMessage\">\n\t\t\t\t\tYou have successfully registered your MFA device.\n\t\t\t\t</Trans>\n\t\t\t</p>\n\t\t\t<p>\n\t\t\t\t<Trans i18nKey=\"afterRegister2FADevice.hint\">\n\t\t\t\t\tYou can now close this window and continue using the application.\n\t\t\t\t</Trans>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import {Link} from 'react-router-dom';\n\nimport {Trans} from 'i18n';\nimport './AfterSignUp.scss';\n\nimport UIConfiguration from '../../customization/UIConfiguration';\n\nexport const AfterSignUp = () => {\n\treturn (\n\t\t<div className=\"after-signup\">\n\t\t\t<p>\n\t\t\t\t<Trans i18nKey=\"afterSignup.successMessage\">\n\t\t\t\t\tYou have successfully signed up. Please{' '}\n\t\t\t\t\t<Link to=\"/\" style={{color: UIConfiguration.getPrimaryColorAvoidingGray()}}>\n\t\t\t\t\t\tsign in\n\t\t\t\t\t</Link>\n\t\t\t\t</Trans>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import type {JSX} from 'react';\n\nimport {Button} from '@deviceinsight/ng-ui-basic-components';\n\nimport {Trans} from 'i18n';\n\ntype Props = {\n\terrorMessage?: string | JSX.Element;\n\tafterSigninText?: string | JSX.Element;\n\tonSignin: () => void;\n};\n\nexport function AuthErrorView({errorMessage, afterSigninText, onSignin}: Props): JSX.Element {\n\treturn (\n\t\t<div className=\"signin-message\">\n\t\t\t<p>{errorMessage}</p>\n\t\t\t<p>\n\t\t\t\t<Trans i18nKey=\"msal.errorComponent.serverError.signinMessage\">\n\t\t\t\t\tPlease\n\t\t\t\t\t<Button className=\"signin-button\" primary onClick={onSignin}>\n\t\t\t\t\t\tsign in\n\t\t\t\t\t</Button>\n\t\t\t\t</Trans>\n\t\t\t\t{afterSigninText}\n\t\t\t</p>\n\t\t</div>\n\t);\n}\n","import type {AuthError} from '@azure/msal-browser';\nimport {type MsalAuthenticationResult, useMsal} from '@azure/msal-react';\nimport {useEffect} from 'react';\n\nimport {Trans} from 'i18n';\nimport './SigninMessage.scss';\n\nimport {AuthErrorView} from './AuthErrorView';\n\nfunction getErrorMessage(error: AuthError | null) {\n\tconst errorCode = error?.errorCode;\n\tswitch (errorCode) {\n\t\tcase 'invalid_grant':\n\t\t\treturn (\n\t\t\t\t<Trans i18nKey=\"msal.errorComponent.authenticationError.message\">\n\t\t\t\t\tYour authentication session has expired.\n\t\t\t\t</Trans>\n\t\t\t);\n\t\tcase 'authority_mismatch':\n\t\t\treturn (\n\t\t\t\t<Trans i18nKey=\"msal.errorComponent.authorityMismatch.message\">\n\t\t\t\t\tAn authority mismatch error occurred.\n\t\t\t\t</Trans>\n\t\t\t);\n\t\tcase 'server_error':\n\t\t\treturn (\n\t\t\t\t<Trans i18nKey=\"msal.errorComponent.serverError.message\">\n\t\t\t\t\tSorry, we're experiencing technical difficulties.\n\t\t\t\t</Trans>\n\t\t\t);\n\t\tdefault:\n\t\t\treturn (\n\t\t\t\t<Trans i18nKey=\"msal.errorComponent.genericError.message\">\n\t\t\t\t\tAn Error occurred authenticating via Msal.\n\t\t\t\t</Trans>\n\t\t\t);\n\t}\n}\n\nfunction getAfterSigninText(error: AuthError | null) {\n\tconst errorCode = error?.errorCode;\n\tswitch (errorCode) {\n\t\tcase 'invalid_grant':\n\t\t\treturn <Trans i18nKey=\"msal.errorComponent.authenticationError.afterSigninText\">again</Trans>;\n\t\tcase 'server_error':\n\t\t\treturn <Trans i18nKey=\"msal.errorComponent.serverError.afterSigninText\">later</Trans>;\n\t\tdefault:\n\t\t\treturn '';\n\t}\n}\n\nexport function MsalErrorComponent({error}: MsalAuthenticationResult) {\n\tconst {instance} = useMsal();\n\n\tconst handleSignin = () => {\n\t\tinstance.loginRedirect();\n\t};\n\n\tuseEffect(() => {\n\t\tif (error && error.errorCode === 'access_denied') {\n\t\t\t// this case occurs in several situations and it is better to not show any error message to the user (e.g. when the user cancels the reset password process)\n\t\t\tinstance.logoutRedirect();\n\t\t}\n\t}, [instance, error]);\n\n\tif (error?.errorCode === 'access_denied') {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<AuthErrorView\n\t\t\terrorMessage={getErrorMessage(error)}\n\t\t\tonSignin={handleSignin}\n\t\t\tafterSigninText={getAfterSigninText(error)}\n\t\t/>\n\t);\n}\n","import {InteractionType, type PublicClientApplication} from '@azure/msal-browser';\nimport {MsalAuthenticationTemplate, MsalProvider} from '@azure/msal-react';\nimport {useState} from 'react';\nimport {BrowserRouter, Route, Switch} from 'react-router-dom';\n\nimport {ModalContainer, Spinner} from '@deviceinsight/ng-ui-basic-components';\nimport {MessageBoxContainer, messageBoxDismissGroup, messageBoxWarn} from '@deviceinsight/ng-ui-components';\n\nimport {AuthorizationServersContextProvider} from 'contexts/authorizationServers/AuthorizationServersContextProvider';\nimport {GlobalResourcesContextProvider} from 'contexts/globalResources/GlobalResourcesContextProvider';\nimport {UserContextProvider} from 'contexts/user/UserContextProvider';\nimport AxiosErrorHandler from 'modules/axiosErrors/AxiosErrorHandler';\nimport Legals from 'modules/legals/Legals';\nimport MainPage from 'routes/MainPage';\nimport ProtectedRouteMsal from 'routes/ProtectedRouteMsal';\nimport I18nextNGUIProvider from './i18n/I18nextNGUIProvider';\nimport WelcomeModalContainer from './modules/welcome/WelcomeModalContainer';\nimport DiscardChangesModalContainer from './utils/DiscardChangesModalContainer';\nimport WhatsNewModalContainer from './utils/WhatsNewModalContainer';\nimport 'react-grid-layout/css/styles.css';\nimport 'react-resizable/css/styles.css';\nimport 'assets/styles.scss';\nimport 'styles/globals.scss';\nimport 'styles/utils.scss';\nimport 'styles/variables.scss';\nimport 'styles/main.scss';\nimport '@deviceinsight/ng-ui-components/style.css';\n\nimport {AfterRegisterMFADevice} from 'components/landingpages/AfterRegisterMFADevice';\nimport {AfterSignUp} from 'components/landingpages/AfterSignUp';\nimport {MsalErrorComponent} from 'utils/msalUtils/MsalErrorComponent';\nimport {buildMsalRedirectRequest} from 'utils/msalUtils/msalUtils';\nimport UIConfiguration from './customization/UIConfiguration';\nimport {Trans} from './i18n';\nimport {tokenRefresher} from './modules/users/TokenRefresher';\n\ntokenRefresher.setNotificationCallbacks({\n\tshowOfflineNotification: () => {\n\t\tmessageBoxWarn(\n\t\t\t<Trans i18nKey=\"tokenRefresher.offline\">You are currently offline</Trans>,\n\t\t\t{autoClose: false, closeOnClick: false, closeButton: false},\n\t\t\t'TOKEN_REFRESHER',\n\t\t);\n\t},\n\thideOfflineNotification: () => {\n\t\tmessageBoxDismissGroup('TOKEN_REFRESHER');\n\t},\n});\n\ntype Props = {msalInstance: PublicClientApplication; clientId: string};\n\ntype State = {message: string; callback: (status: boolean) => any} | null | undefined;\n\nfunction LoadingComponent() {\n\treturn <Spinner center />;\n}\n\nexport default function AppMsal({msalInstance, clientId}: Props) {\n\tconst [discardChangesModal, setDiscardChangesModal] = useState<State>(null);\n\n\tfunction userConfirmationFunction(message: string, callback: (status: boolean) => any) {\n\t\tsetDiscardChangesModal({message, callback});\n\t}\n\n\tfunction closeDiscardChangesModal(status: boolean) {\n\t\tif (discardChangesModal) {\n\t\t\tdiscardChangesModal.callback(status);\n\t\t}\n\n\t\tsetDiscardChangesModal(null);\n\t}\n\n\treturn (\n\t\t<BrowserRouter getUserConfirmation={userConfirmationFunction}>\n\t\t\t<Switch>\n\t\t\t\t<Route path=\"/aftersignup\" component={AfterSignUp} />\n\t\t\t\t<Route path=\"/afterregistermfadevice\" component={AfterRegisterMFADevice} />\n\t\t\t\t<Route path=\"/legals\" component={Legals} />\n\t\t\t\t<Route\n\t\t\t\t\trender={() => (\n\t\t\t\t\t\t<MsalProvider instance={msalInstance}>\n\t\t\t\t\t\t\t<MsalAuthenticationTemplate\n\t\t\t\t\t\t\t\tinteractionType={InteractionType.Redirect}\n\t\t\t\t\t\t\t\tauthenticationRequest={buildMsalRedirectRequest(clientId, undefined)}\n\t\t\t\t\t\t\t\terrorComponent={MsalErrorComponent}\n\t\t\t\t\t\t\t\tloadingComponent={LoadingComponent}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<UserContextProvider>\n\t\t\t\t\t\t\t\t\t<GlobalResourcesContextProvider>\n\t\t\t\t\t\t\t\t\t\t<I18nextNGUIProvider>\n\t\t\t\t\t\t\t\t\t\t\t<AuthorizationServersContextProvider>\n\t\t\t\t\t\t\t\t\t\t\t\t<Switch>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ProtectedRouteMsal component={MainPage} />\n\t\t\t\t\t\t\t\t\t\t\t\t</Switch>\n\t\t\t\t\t\t\t\t\t\t\t\t<WelcomeModalContainer />\n\t\t\t\t\t\t\t\t\t\t\t\t<MessageBoxContainer />\n\t\t\t\t\t\t\t\t\t\t\t\t<ModalContainer />\n\t\t\t\t\t\t\t\t\t\t\t\t{!UIConfiguration.isReleaseNotesHidden() && <WhatsNewModalContainer />}\n\t\t\t\t\t\t\t\t\t\t\t\t{discardChangesModal && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<DiscardChangesModalContainer\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tmessage={discardChangesModal.message}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclose={closeDiscardChangesModal}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t<AxiosErrorHandler />\n\t\t\t\t\t\t\t\t\t\t\t</AuthorizationServersContextProvider>\n\t\t\t\t\t\t\t\t\t\t</I18nextNGUIProvider>\n\t\t\t\t\t\t\t\t\t</GlobalResourcesContextProvider>\n\t\t\t\t\t\t\t\t</UserContextProvider>\n\t\t\t\t\t\t\t</MsalAuthenticationTemplate>\n\t\t\t\t\t\t</MsalProvider>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</Switch>\n\t\t</BrowserRouter>\n\t);\n}\n","import {msalClientId, msalInstance} from 'utils/msalUtils/msalGlobals';\nimport AppLegacy from './AppLegacy';\nimport AppMsal from './AppMsal';\nimport {isAzureB2cActive} from './utils/msalUtils/msalUtils';\n\nexport function App() {\n\tif (isAzureB2cActive()) {\n\t\treturn <AppMsal clientId={msalClientId()} msalInstance={msalInstance()} />;\n\t} else {\n\t\treturn <AppLegacy />;\n\t}\n}\n"],"names":["setupDayjs","dayjs","localizedFormat","advancedFormat","utc","timezone","initializeTenantSettingsFromConfiguration","setTitle","UiConfigurationApi","ThemeApi","setGlobalErrorMessageBoxOptions","customStyleConfiguration","StyleApi","loadUiConfigurationBlob","uiConfiguration","readUiConfigurationBlob","configureTenantConfigUrl","readUIConfigurations","configKey","setEnvironment","loadRuntimeEnv","merge","getEnv","readRuntimeEnv","axios","loadRuntimeSecretsAndUiSecretsBlobOnSigning","onSignin","readRuntimeSecrets","readUiSecretsBlob","validateUiConfiguration","useSecretsStore","getAxios","readUISecrets","createB2cAxiosInstance","UIConfiguration","params","qs","initAzureB2cAndAxios","axiosInstance","setup429Retry","setAxios","b2cConfig","fetchAzureB2cConfiguration","msalConfig","convertB2cConfigIntoMsalConfig","msalInstance","PublicClientApplication","event","EventType","account","initMsalGlobals","initAxiosMsal","initAxiosLegacy","initializeApp","initializeTranslation","Trans","useTranslation","i18n","initReactI18next","error","getBlankAuthorizationServer","AuthorizationServersContextProvider","children","editModalOpen","setEditModalOpen","useState","authorizationServer","setAuthorizationServer","openModal","closeModal","jsx","AuthorizationServersContext","fetchProperties","fetchPropertiesApi","properties","property","entityTarget","extendSearchFields","assetFields","assetGroupFields","userFields","userGroupFields","fields","key","type","field","tryFetchAssetGroupDefinitions","hasAuthorities","fetchAssetGroupDefinitions","tryFetchLocales","fetchLocales","tryFetchProperties","GlobalResourcesContextProvider","initialFetchingComplete","setInitialFetchingComplete","setProperties","assetGroupDefinitions","setAssetGroupDefinitions","locales","setLocales","reloadProperties","useCallback","reloadAssetGroupDefinitions","setGlobalAssetGroupDefinitions","setGlobalAssetGroupDefinitionsPromise","loadGlobalResources","responseArray","assetGroupDefinitionsPromise","resetGlobalResources","GlobalResourcesContext","UserContextProvider","principal","setPrincipal","INITIAL_PRINCIPAL","user","setUser","INITIAL_USER","authenticated","setAuthenticated","afterSignout","setAfterSignout","defaultSearchMode","setDefaultSearchMode","paginationSettings","setPaginationSettings","setAuthenticatedUser","setGlobalUserLocale","setGlobalUserAuthorities","useEffect","readAccountObject","resetAuthenticatedUser","INITIAL_PAGINATION_SETTINGS","writePaginationSettings","writePaginationSettingsApi","UserContext","AxiosErrorHandler","useContext","instance","useMsal","axiosErrors","setAxiosErrors","payloadErrorOpen","setPayloadErrorOpen","networkErrorOpen","setNetworkErrorOpen","authoritiesMissingErrorOpen","setAuthoritiesMissingErrorOpen","index","setIndex","signout","isAzureB2cActive","signoutMsal","signoutLegacy","setAxiosErrorsCallback","handleError","isAuthorizationError","isRateLimitError","messageBoxError","isAuthTokenRefreshError","isTimeoutError","isAuthoritiesMissingError","isPayloadError","isNetworkError","newIndex","EulaTag","eula","saveAs","CustomFooter","apiVersion","contents","isTestTenant","year","eulaRegExp","appVersion","getAppVersion","splitCustomFooter","part","domPurify","VersionTag","label","version","jsxs","DefaultFooter","guiVersion","gitShaShort","Footer","showApiVersion","setApiVersion","setEula","mountedRef","useMounted","locale","useLocale","getVersion","readEulaWithMeta","publicFooterContents","footerContents","Footer$1","customizable","useForceUpdateOnThemeChange","updateState","onThemeChange","flag","Logo","centered","linkToStartPage","history","useHistory","handleClick","getStartPage","url","logo","logoImage","Logo$1","LandingPage","Component","isLoading","success","tokenExpired","SpinnerContainer","Link","LandingPageContainer","search","token","changeEmail","LandingPageContainer$1","withRouter","validateEmail","values","isEmail","ForgotPasswordForm","onSubmit","showFeedback","feedbackType","feedbackMessage","t","email","setEmail","emailError","setEmailError","submitting","setSubmitting","isValid","handleChangeEmail","value","handleSubmit","TextInput","Button","ForgotPassword","setShowFeedback","setFeedbackType","setFeedbackMessage","triggerPasswordReset","PAGE_TYPE_IMPRINT","PAGE_TYPE_PRIVACY","Legals","React","location","pathParts","legalPage","readLegalPage","extHtml","pageType","ContentHeader","Legals$1","signinSuccess","autoSignin","emitSigninEvent","fetchPaginationSettings","readPaginationSettings","signin","password","authInfo","requestToken","storeAuthInfo","me","fetchMe","deleteAuthInfo","translateErrorCode","LoginPasswordInput","onChange","onBlur","placeholder","FieldDecorator","MINLENGTH_ERROR","DIGITS_ERROR","UPPERCASE_ERROR","LOWERCASE_ERROR","SPECIAL_CHARACTERS_ERROR","passwordMinLength","validatePasswordMinLength","validatePasswordIncludesDigits","validatePasswordUppercaseLetters","char","validatePasswordLowercaseLetters","validatePasswordSpecialCharacters","validatePassword","validateFn","nonNull","validateConfirmPasswordMatches","confirmPassword","PasswordPolicy","passwordErrors","classnames","Bubble","SetPasswordForm","tokenError","requestFailed","username","isSubmitting","control","getValues","useForm","submit","errors","e","Controller","Fragment","passwordConfirm","SetPassword","useLocation","setTokenError","setUserPassword","backendMessage","msg","isUrlAbsolute","CustomLoginPageElementsContextProvider","aboveForm","setAboveForm","getCustomLoginPageElements","belowForm","setBelowForm","belowLoginButton","setBelowLoginButton","nextToLoginButton","setNextToLoginButton","listener","position","element","registerCustomLoginPageElementsChange","unregisterCustomLoginPageElementsChange","CustomLoginPageElementsContext","LegalsLinks","CountDown","onDone","initialSeconds","seconds","setSeconds","startMs","intervalId","elapsedMs","SingleSignOn","authorizationServers","authServer","kebabCase","errorCodeTranslations","SigninForm","authenticating","authenticationFailed","authenticationErrorResponseCode","setAuthorizationServers","displayLegalLinks","setDisplayLegalLinks","usernameInputRef","useRef","passwordInputRef","cursor","fetchAuthorizationOptions","getErrorMessage","translation","rateLimitExceeded","setRateLimitExeeded","handleCountDownDone","usernamePlaceholder","extensions","storeOAuthCallbackUrl","callbackUrl","tryAutoSignin","setWaitingForAutoSignin","retrieveAuthInfo","doRedirect","err","redirectLocation","readRedirectLocation","Signin","waitingForAutoSignin","setAuthenticating","setAuthenticationFailed","setAuthenticationErrorResponseCode","Spinner","Header","_path","_extends","n","SvgIconStar","props","iconHistory","CurrentPageTitleContext","createContext","usePortalRoot","parentSelector","className","div","setDiv","parent","FloatingPanelPortal","rootNode","createPortal","reducer","state","action","useFadeAnimation","open","dispatch","useReducer","FloatingPanel","visible","onHide","animationState","ref","useOutsideClick","cx","SvgIconDragHandle","EditedNameInput","onCancel","onSave","removeTrailingSlash","FavoriteItem","id","title","isEdited","isActive","onEdit","onDelete","attributes","listeners","setNodeRef","setActivatorNodeRef","transform","transition","isOver","useSortable","style","CSS","editedTitle","setEditedTitle","handleEditClick","handleSave","handleCancel","hide","useFavorites","DragHandle","MultiMenu","VerticalMenuIcon","MultiMenuItem","Icon","Favorites","allFavorites","deleteFavorite","updateTitle","updateFavorites","createFavorite","cancelTitleEditing","loading","updating","pathname","editedId","setEditedId","handleCreate","handleUpdateTitle","handleCancelTitleEditing","isCurrentPageFavorite","favorite","VerticalSortContext","fetchFavorites","readFavorites","favorites","writeFavorites","FavoritesContext","withoutLocal","FavoritesProvider","setOpen","setAllFavorites","backendFavorites","setBackendFavorites","setLoading","setUpdating","currentPageTitle","promise","cancel","makeCancelable","newBackendFavorites","isEqual","updateFavoritesApi","newTitle","omit","nanoid10","handleHide","contextValue","HistoryPanel","historyItems","clearHistory","HistoryContext","date","formatTimestamp","STORAGE_KEY","MAX_ITEMS","getStorage","storageSerialized","getHistoryItems","accountNumber","addHistoryItem","historyItem","storage","newHistoryItems","clearHistoryItems","createHistoryItem","debounce","reactHistoryItemsSetter","item","HistoryProvider","setHistoryItems","Ux4iotConnectionState","connectionState","Ux4iotConnectionStateContext","WarningIcon","HeaderLinks","customHeaderElements","CustomHeaderElementsContext","showFavorites","showHistoryPanel","schema","useUserValidationSchema","formContext","zodResolver","transformUserToFormData","setStartpage","setCustomStartPage","successMessage","messageBoxSuccess","updateLocale","updateLocaleOfUser","updatedUser","emitUserProfileChange","che","createElement","FormProvider","iconGlobe","imgTriangleDown","StarIcon","userIcon","HeaderSearchContextSelect","options","expanded","setExpanded","outsideClickRef","handleOutsideClick","selectedOption","o","ex","option","translations","GlobalContextSearch","availableContexts","context","changeContext","searchConfig","submitQuery","query","GlobalSearchContext","Search","SearchResultSection","icon","items","getId","getName","getUrl","getAllUrl","focusedItem","NavigationEvent","useNavigationEventEmitter","eventEmitter","EventEmitter","emit","addListener","removeListener","getNextNonEmptyGroup","results","currentGroup","goBackward","groups","nextGroupIndex","group","getGroupSize","getIndexOnLeftOrRight","groupSize","useResultsKeyboardNavigation","navigationEventEmitter","setGroup","goToNextResult","nextGroup","goToPreviousResult","previousGroup","moveLeftOrRight","openItem","keyboardCallback","evt","keyToNavigationEvent","useKeyboardShortcut","FullSearchResultsPanel","searchInputRect","elementsIgnoredOnClickOutside","keyboardEventEmitter","root","noEntries","HasAuthorities","AssetSvg","asset","AssetGroupSvg","assetGroup","UserSvg","getNameFallbackFromHotpot","UserGroupSvg","userGroup","RoleSvg","role","MAX_ELEMENTS","PAGINATION_SETTINGS","searchAssetsWithAdditionalQuery","searchAssets","getSearchAssetListQueryFilteredByAllowedAssetTypes","useResources","fetchFn","authority","reloadTrigger","data","setData","total","setTotal","result","useFullSearch","setReloadTrigger","assets","assetGroups","searchAssetGroups","users","searchUsers","userGroups","searchUserGroups","roles","searchRoles","rt","GlobalFullSearch","resultsVisible","setResultsVisible","entries","useResizeObserver","inputQuery","setInputQuery","finalQuery","fullSearchResults","searchButtonRef","searchInputRef","handleFocus","handleChange","iconMagnifier","SearchModeSwitch","mode","onModeChange","HeaderSearch","searchMode","setSearchMode","HeaderSearch$1","ContextBar","ContextBarContext","findMatchingRoute","routes","pathSegments","route","routeSegment","findBestMatchingComponentRec","getComponent","currentContextAction","newContextAction","routeSegmentsCount","findContextActionComponent","segments","segment","findContextInfoComponent","ContextAction","ActionButtons","showToolbar","linkedToGatewayIcon","ContextInfoCrumbMain","ContextInfoCrumbStatus","MAXIMUM_ASSETGROUPS_TO_DISPLAY","AssetContextInfo","gateway","tooltip","AssetConnectionState","gatewayIcon","TagsDropdown","name","AssetGroupWithHierarchyBubble","assetTranslations","assetGroupTranslations","userTranslations","userGroupTranslations","rolesTranslations","notificationTemplatesTranslations","getTranslationsByContext","BubbleWrapper","getTotalElementsLabel","totalElements","totalElementsAccurate","SearchContextInfo","elements","customTranslations","infoElement","DefaultContextInfoPanel","contextInfo","ContextInfoContext","ContextInfoPanel","ContextInfoComponent","resolvePath","basePath","relativePath","startIndex","endIndex","getRouteLinks","level","rootRoutes","RouteApi","pathSegment","acc","r","path","transformRouteLinkId","getIconRouteLinkHtmlId","prefix","routeLink","getIconNavGroupHtmlId","navGroup","_path2","SvgIconHome","IconLight","IconDark","iconHtmlId","MainNaviLink","RequiredAuthoritiesInfo","MainNaviSubMenu","routeLinks","separator","classNames","MainNavi","customStartPageLink","setCustomStartPageLink","refreshCustomStartPageLink","getCustomStartPage","IconHome","getMainNaviLinks","links","availableNavGroups","navGroupRouteLinks","activeRouteLink","l","e1","e2","component","isNumericOrUuid","determineLevel","SubNavi","collapsed","setCollapsedState","COLLAPSED_KEY","setCollapsed","writeAccountObject","isSelectedClassName","iconSvg","currentSearchParams","linkSearchParams","Tooltip","AssetShadowKeyTypesContextProvider","shadowKeys","setShadowKeys","fetchKeys","keys","fetchShadowKeys","AssetShadowKeyTypesContext","hasNumber","myString","getStateByName","names","authorities","stateForName","adjustPageAuthorities","urlNames","AuthoritiesContextProvider","authoritiesVisible","setAuthoritiesVisible","pageAuthorities","setPageAuthorities","showAuthorities","addPageAuthorities","newPageAuthorities","AuthoritiesContext","ContextBarContextProvider","itemsMapRef","idGenRef","setItems","addItem","itemsMap","uniqueId","LiveValuesContext","connectionStatus","LiveValuesContextProvider","setConnectionStatus","BLOBOX_PATH","DEFAULT_COLUMNS","getDefaultColumns","getCustomAssetColumnDefs","defaultColumnDefs","getDefaultColumnDefs","TABLE_CONTEXT","column","moveConnectionColumnToTheRight","columns","connectionId","c","mergeColumns","allColumns","backendColumns","allColumnKeys","uniqBy","backendColumnKeys","additionalColumns","shadowColumnsFiltered","shadowColumns","getPropertyColumns","deletable","useInitialColumns","setBackendColumns","fetchBackendColumns","trigger","setTrigger","addAssetColumnDefinitionsChangedListener","removeAssetColumnDefinitionsChangedListener","setShadowColumns","assetShadowKeyTypes","filteredShadowColumns","setFilteredShadowColumns","useMemo","sortedColumns","selected","unselected","AssetTableColumnsContextProvider","assetProperties","useProperties","pickerVisible","setPickerVisible","initialColumns","localColumns","setLocalColumns","toggleColumn","synchronizeWithBackend","newColumns","resetColumns","setColumnsOrder","orderedKeys","col1","col2","AssetTableColumnsContext","isIE11","isMSEdge","fetchDocumentation","response","documentContent","doc","unescape","cancelablePromise","DocumentationIFrame","prevProps","fetching","InfoBox","DEFAULT_WIDTH","DEFAULT_HEIGHT","MIN_WIDTH","MIN_HEIGHT","DEFAULT_MODAL_TOP_MARGIN","DEFAULT_MODAL_RIGHT_MARGIN","HelpModal","widthDelta","setWidthDelta","top","setTop","left","setLeft","width","setWidth","height","setHeight","containerRef","handleResize","_event","_direction","_elementRef","delta","handleResizeStop","handleDragStop","_e","lastX","lastY","Draggable","Resizable","resizable","MARK_OPTIONS","Highlight","phrase","markInstanceRef","wrapperRef","node","markInstance","Mark","SearchBar","onPhraseChange","smallLupeIcon","dockIcon","undockIcon","TitleBar","viewMode","onSearchModeClick","onViewModeToggle","onCloseClick","lupeIcon","HelpPanel","searchbarOpen","setSearchbarOpen","setPhrase","isOpen","documentationUrl","close","toggleViewMode","HelpPanelContext","sidebarNode","wrapDocumentation","documentationNode","content","ReactDOM","fetchUserDocumentationEnabled","checkShowUserDocumentation","readShowUserDocumentation","appWrapperNode","HelpPanelProvider","isEnabled","setEnabled","setViewMode","setDocumentationUrl","getCurrentAuthTree","authTree","currentState","isEmpty","RequiredAuthoritiesPanel","queryParams","wrapChildrenIntoProviders","providers","providerComponent","restProviders","ContextProviders","pendingRequestsAll","pendingRequestsSingle","generateRequestKey","period","datapointKeys","slices","getOrCreateRequest","requestKey","cache","requestFactory","existingRequest","newRequest","DEFAULT_TREND_DATAPOINT_SETTINGS","transformTrendDatapointsToSubscribers","datapoints","datapoint","createDefaultPeriod","getMaxTimestampFromLiveValues","liveValues","maxTimestampsPerAsset","assetLiveValues","timestamps","ts","transformTrendDatapointToDatapointData","fetchAllSeriesDataFromBackend","trendDatapoints","onError","containerWidth","periodCopy","datapointsData","calculateDynamicSlices","d","fetchDatapointValues","fetchSingleSeriesDataFromBackend","trendDatapoint","createTrendDatapoint","hidden","defaultColors","color","Color","configuredDefaultPlotType","plotType","updateTrendDatapoints","datapointsWithAsset","newDatapoints","relevantDatapoints","dp","tdp","createSeriesOptions","valuesByKey","yAxisIndices","datapointValues","convertDatapointValuesToHighchartsData","translateDatapoint","convertDatapointValueFromBooleanToNumber","booleanValue","datatype","_ts","formatValue","getTooltipContents","datapointName","tooltipColor","timestamp","unit","description","ensureGhostPoint","chart","tooltipSeries","point","createThresholdTooltipEvents","thresholdName","originalFormatter","normalized","createThresholdPlotLines","thresholds","showThresholds","plotLinesOptions","commonPlotLineOptions","EMPTY_AXIS_OPTIONS","createYAxisOptions","combinedExtremesByUnitName","calculateCombinedAxisExtremesGroupedByUnitName","trendDatapointsWithAxis","createAxisOptions","calculateAxisExtremes","getAxisPropsBySeriesType","axisOptionsByUnit","combine","currentOptions","indices","axisOptions","existingAxisOptions","combineAxis","groupBy","unitName","calculateCombinedAxisExtremes","min","max","calculateAxisExtremesByValuesAndThresholds","extremesWithPaddings","extremes","newMin","newMax","dpValue","combinedExtremes","seriesExtremes","getChartConfig","updatePeriodRef","valuesByTrendDatapointKey","visibleTrendDatapoints","yAxis","_tooltip","getDatapointDescription","mergeCurrentTrendValuesWithLiveValues","currentValues","resultValues","seriesKey","liveValuesForSeriesKey","currentSeriesValues","transformLiveValuesToValuesByKey","liveValuesAssetUrn","assetDatapointToValues","liveValuesDatapointName","datapointValue","trendDatapointKey","getTrendDatapointKey","found","getLiveModeAvailable","start","toggleTrendDatapointHidden","fetchCompleteChartConfig","annotations","createAnnotations","td","newValuesByKey","updateLiveValuesChartConfig","newTrendDatapoints","chartConfig","newChartConfig","newFetchedValuesByTrendDatapointKey","liveModeEnabled","TrendAppContextProvider","useAssetTimezone","chartContainerRef","cancelFetchAllSeriesRef","cancelFetchSingleSeriesRef","fetchValuesErrorHandler","useDefaultFetchDatapointValuesErrorHandler","telemetryConfig","useLiveValues","MIN_PERIOD_LENGTH_IN_MS","updateDatapointsAndPeriod","datapointDescriptors","addTrendDatapoint","removeTrendDatapoint","assetUrn","reloadData","resetPeriod","changeTrendDatapointSettings","settings","changeDatapoint","toggleTrendDatapoint","liveValuesEmpty","tsStart","tsEnd","maxDate","millisToShift","periodVisibleBeforeAndAfterShift","useElementResizeDebouncedAction","TrendAppContext","CurrentPageTitleContextProvider","setCurrentPageTitle","prefetchRoles","fetchRoles","getRolesProviderState","CONTEXTS","getConfigByContext","push","getAssetsConfig","getAssetGroupsConfig","getUsersConfig","getUserGroupsConfig","getRolesConfig","extractContextFromPathname","match","getNextPathname","currentPathname","GlobalSearchContextProvider","setQuery","setContext","contexts","setContexts","userContexts","newContext","queryFromUrl","submitQueryForContext","nextPathname","nextSearchParams","Ux4iotProvider","initialConnectionState","setConnectionState","Ux4iotContextProvider","ux4iotGrantRequestFunction","globalContextProviders","GlobalContextProviders","contextProviders","setContextProviders","addGlobalContextProvider","contextProvider","p","ContextProvider","getTimezone","browserTimezone","GlobalAssetTimezoneContextProvider","setAsset","setType","GlobalAssetTimezoneContext","isDynamicallyImportedModuleError","PageError","imgWarning","getAppConfiguration","appName","validateAppConfiguration","NavRoute","childRoutes","ChildRoutesContainer","requiredAuthorities","getTitleSegments","browserTitleSegments","rest","titleSegments","newBrowserTitleSegments","uniqWith","newBrowserTitle","Route","ErrorBoundary","ChildRoutes","NavRoutes","PageAccessDenied","PureComponent","computedMatch","Switch","filteredRoutes","Redirect","PageNotFound","NavRoutes$1","CustomHeaderElementsContextProvider","ConfirmProvider","RolesContextProvider","ContextInfoContextProvider","LocizeUpdaterContextProvider","MainPage","redirectToOAuthCallbackUrl","redirect","redirectUrl","ProtectedRouteLegacy","redirectTo","hasBeenAuthenticated","setHasBeenAuthenticated","storeRedirectLocation","createClassOnDemand","ClassOrObject","createMultiBackend","backends","services","i18nextOptions","b","i","backendInstance","language","namespace","callback","backendsLen","readFromBackend","backendNum","backend","resolver","mergeTranslations","object","source","mergeWith","objectValue","sourceValue","TenantLocizeBackend","LocizeBackend","backendOptions","inContextEditingCredentials","projectId","apiKey","tenantUrl","mainUrl","tenant","main","languages","fallbackValue","lng","urlTemplate","interpolate","withLocale","WrappedComponent","initI18next","mainLocizeProject","tenantLocizeProject","optionsLocizeBackend","locationQueryParams","locizeEditorParam","printMissingTranslationKeys","additionalBackends","getAdditionalBackends","useAdditionalBackends","configI18Next","bc","completeInitOptions","resolve","setI18n","locizePlugin","storeAndRetrieveCiModeAndLanguage","ciModeActive","I18nextNGUIProvider","i18nextInitialized","languageLoading","I18nextNGUIProvider$1","wave","useEulaActions","useQueryParams","downloaded","setDownloaded","accept","refreshedUser","acceptEULA","updateMe","startPageUrl","decline","download","localizationCode","fallbackLocalizationCode","eulaWithMeta","searchParams","useHeightObserver","current","resizeObserver","calculateModalHeight","eulaHeight","welcomeBodyHeight","bottomAreaHeight","isEulaAccepted","WelcomeModalContainer","userProperties","readEULA","setReadEULA","showAtStart","setShowAtStart","tenantHasShowWelcomeModalProperty","displayWelcomeScreen","onSignout","welcomeBodyRef","eulaRef","bottomAreaRef","modalHeight","handleProceed","Modal","ButtonRow","iconDownload","Checkbox","DiscardChangesModalContainer","message","CHARS_TO_CHECK","CHARS_MAIN_VERSION","NOT_FOUND","_WhatsNewModalContainer","currentUser","currentWhatsNewVersion","isSubscribed","readReleaseNotesSubscription","translationAvailable","whatsNewVersion","mainVersion","showWelcomeModal","viewedVersions","readReleaseNotesVersionsViewed","show","versionsToSave","writeReleaseNotesVersionsViewed","writeReleaseNotesSubscription","tenantWhatsNewVersion","_user","autoSignIn","authInfoString","getStorageKey","WhatsNewModalContainer","WhatsNewModalContainer$1","withTranslation","tokenRefresher","messageBoxWarn","messageBoxDismissGroup","AppLegacy","discardChangesModal","setDiscardChangesModal","userConfirmationFunction","closeDiscardChangesModal","status","BrowserRouter","MessageBoxContainer","ModalContainer","useAuthenticatedSetup","setError","startPage","setStartPage","accounts","useAccount","canceled","authResult","buildMsalSilentRequest","msalClientId","ProtectedRouteMsal","AfterRegisterMFADevice","AfterSignUp","AuthErrorView","errorMessage","afterSigninText","getAfterSigninText","MsalErrorComponent","handleSignin","LoadingComponent","AppMsal","clientId","MsalProvider","MsalAuthenticationTemplate","InteractionType","buildMsalRedirectRequest","App"],"mappings":"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"}
|