udp-react-enterprise-component-library 25.18.4-beta.70 → 25.18.4-beta.71

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.
Files changed (35) hide show
  1. package/dist/{AuthProvider-DeOuedJL.js → AuthProvider-BUi9oEtK.js} +2 -2
  2. package/dist/{AuthProvider-DeOuedJL.js.map → AuthProvider-BUi9oEtK.js.map} +1 -1
  3. package/dist/{Shell-DDMO_nHU.js → Shell--4lbPR7c.js} +7 -6
  4. package/dist/Shell--4lbPR7c.js.map +1 -0
  5. package/dist/{TenantProvider-Bmp6YdE2.js → TenantProvider-r35vfTMk.js} +12 -5
  6. package/dist/TenantProvider-r35vfTMk.js.map +1 -0
  7. package/dist/{UdpAppProvider-CR2R5W7e.js → UdpAppProvider-sZs_gHCc.js} +2 -2
  8. package/dist/{UdpAppProvider-CR2R5W7e.js.map → UdpAppProvider-sZs_gHCc.js.map} +1 -1
  9. package/dist/{UdpRoutes-C7Dmc6Pv.js → UdpRoutes-ClaIhJIi.js} +14 -5
  10. package/dist/UdpRoutes-ClaIhJIi.js.map +1 -0
  11. package/dist/index.js +8 -8
  12. package/dist/{menuUtilities-CZa7kUTV.js → menuUtilities-BIiFWeWA.js} +23 -2
  13. package/dist/menuUtilities-BIiFWeWA.js.map +1 -0
  14. package/dist/{profile-DsCMe9Hd.js → profile-grsbAKwd.js} +2 -2
  15. package/dist/{profile-DsCMe9Hd.js.map → profile-grsbAKwd.js.map} +1 -1
  16. package/dist/providers/index.js +1 -1
  17. package/dist/routes/index.js +1 -1
  18. package/dist/shell/index.js +1 -1
  19. package/dist/shell/ui/profile/index.js +1 -1
  20. package/dist/types/src/routes/UdpRoutes.d.ts.map +1 -1
  21. package/dist/types/src/shell/Shell.d.ts.map +1 -1
  22. package/dist/types/src/utilities/menus/MenuProvider.d.ts +1 -0
  23. package/dist/types/src/utilities/menus/MenuProvider.d.ts.map +1 -1
  24. package/dist/types/src/utilities/menus/menuUtilities.d.ts +1 -0
  25. package/dist/types/src/utilities/menus/menuUtilities.d.ts.map +1 -1
  26. package/dist/types/tsconfig.tsbuildinfo +1 -1
  27. package/dist/utilities/auth/index.js +2 -2
  28. package/dist/utilities/menus/index.js +2 -2
  29. package/dist/utilities/tenant/index.js +1 -1
  30. package/export-map.json +3 -2
  31. package/package.json +1 -1
  32. package/dist/Shell-DDMO_nHU.js.map +0 -1
  33. package/dist/TenantProvider-Bmp6YdE2.js.map +0 -1
  34. package/dist/UdpRoutes-C7Dmc6Pv.js.map +0 -1
  35. package/dist/menuUtilities-CZa7kUTV.js.map +0 -1
@@ -6,7 +6,7 @@ import { i as storeTenant, n as getStoredTenant } from "./UnitySessionStorage-C7
6
6
  import { t as useAxiosGet } from "./useAxiosGet-CRKIOaCC.js";
7
7
  import { t as CustomNavigationClient } from "./CustomNavigationClient-B-eTMjtK.js";
8
8
  import { r as useRouteRegistry } from "./routeRegistryStore-BmhhxWS1.js";
9
- import { t as TenantProvider } from "./TenantProvider-Bmp6YdE2.js";
9
+ import { t as TenantProvider } from "./TenantProvider-r35vfTMk.js";
10
10
  import { LoadingIndicator } from "./UI/loading/LoadingIndicator/index.js";
11
11
  import React, { useEffect, useReducer, useState } from "react";
12
12
  import { matchPath, useHistory } from "react-router-dom";
@@ -216,4 +216,4 @@ const AuthProvider = ({ children, doNotWaitForTenant = true }) => {
216
216
  //#endregion
217
217
  export { createUser as n, AuthProvider as t };
218
218
 
219
- //# sourceMappingURL=AuthProvider-DeOuedJL.js.map
219
+ //# sourceMappingURL=AuthProvider-BUi9oEtK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider-DeOuedJL.js","names":["useLocation"],"sources":["../src/utilities/auth/user.ts","../src/utilities/auth/UserProvider.jsx","../src/utilities/auth/AuthProvider.jsx"],"sourcesContent":["import { ConfigService } from '../../configService';\nimport { RoleIdEnums } from '../../enums/unitySystemEnums';\nimport { getStoredTenant } from '../storage/UnitySessionStorage';\n\nexport interface User {\n name: string | undefined;\n firstName: string | undefined;\n familyName: string | undefined;\n jobTitle: string | undefined;\n email: string | undefined;\n mobile: string | undefined;\n phone: string | undefined;\n id: string | undefined;\n location: string | undefined;\n aadId: string | undefined;\n accessToken: string | undefined;\n defaultTenantId: string | undefined;\n currentTenantId: string | undefined;\n tenantIds: Array<string> | undefined;\n roleIds: Array<string> | undefined;\n products: Array<object> | undefined;\n permissions: Array<object> | undefined;\n can: any | undefined;\n statusCode: number | undefined;\n unityId: string | undefined;\n additionalProperties: any | undefined;\n roleNames: Array<string> | undefined;\n isUnitySystemAdmin: boolean | undefined;\n}\n\n/**\n * Create a \"unified\" user object from MSAL account info and Univerus user data (in the future)\n */\nexport function createUser(userInfo: any): User {\n const tenantId: any =\n getStoredTenant() ||\n (userInfo?.defaultTenantId ??\n (userInfo?.tenantIds ? userInfo?.tenantIds[0] : ''));\n let userTenantPermissions: any = [];\n let userTenantRoles: any = [];\n let userTenantProducts: any = [];\n const currentUserTenantProperties = userInfo?.userTenantPropertiesView?.find(\n (propertyView: any) => propertyView?.tenantId === tenantId\n );\n userTenantPermissions = currentUserTenantProperties\n ? currentUserTenantProperties.permissions\n : [];\n userTenantRoles = currentUserTenantProperties\n ? currentUserTenantProperties.securityRoles\n : [];\n userTenantProducts = currentUserTenantProperties\n ? currentUserTenantProperties.products\n : [];\n\n let roleIds: any = userTenantRoles.map((role: any) => role.roleId) ?? [];\n\n return {\n name: userInfo?.displayName ?? '',\n firstName: userInfo?.givenName ?? '',\n familyName: userInfo?.surname ?? '',\n jobTitle: userInfo?.jobTitle ?? '',\n email: userInfo?.email ?? '',\n mobile: userInfo?.mobilePhone ?? '',\n phone: userInfo?.officePhone ?? '',\n id: userInfo?.userId ?? '',\n location: userInfo?.location ?? '',\n aadId: userInfo?.externalUUID ?? '',\n accessToken: userInfo?.accessToken ?? '',\n tenantIds: userInfo?.tenantIds ?? [],\n defaultTenantId: userInfo?.defaultTenantId ?? '',\n currentTenantId: ConfigService.config.UNITY_TENANT_ID\n ? ConfigService.config.UNITY_TENANT_ID\n : tenantId,\n roleIds: roleIds,\n products: userTenantProducts,\n permissions: userTenantPermissions,\n can:\n userTenantPermissions.reduce((can: any, permission: any) => {\n if (permission.value === 'false') {\n can[permission.name] = false;\n } else if (permission.value === 'true') {\n can[permission.name] = true;\n } else {\n can[permission.name] = permission.value;\n }\n return can;\n }, {}) ?? {},\n statusCode: userInfo?.statusCode ?? 200,\n unityId: userInfo?.userId ?? '',\n additionalProperties: userInfo?.additionalProperties ?? undefined,\n roleNames: userTenantRoles.map((role) => role.name) ?? [],\n isUnitySystemAdmin: !!roleIds.find(\n (id: string) => id === RoleIdEnums.Unity_System_Administrator\n )\n };\n}\n","import React, { useReducer, useEffect } from 'react';\nimport { UserContext, UserDispatchContext } from './internal';\nimport { createUser } from './user';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { useAccount } from '@azure/msal-react';\nimport { storeTenant, getStoredTenant } from '../storage/UnitySessionStorage';\nimport { useAxiosGet } from '../useAxiosGet';\nimport { TenantProvider } from '../tenant/TenantProvider';\nimport { acquireAccessToken } from './authActions';\nimport { ConfigService } from '../../configService';\nconst emptyUser = {\n name: '',\n firstName: '',\n familyName: '',\n jobTitle: '',\n email: '',\n mobile: '',\n phone: '',\n id: '',\n location: '',\n aadId: '',\n accessToken: '',\n defaultTenantId: '',\n currentTenantId: '',\n tenantIds: [],\n roleIds: [],\n products: [],\n permissions: [],\n can: {},\n statusCode: undefined,\n unityId: undefined,\n additionalProperties: undefined,\n roleNames: [],\n isUnitySystemAdmin: undefined\n};\n\nconst UserProvider = (props) => {\n const {\n children,\n setSessionExpiredModalOpen,\n setNonExistingUserModalOpen,\n setErrorMessage,\n isWhiteListed,\n doNotWaitForTenant = false,\n unityTenantId\n } = props;\n const activeAccount = useAccount();\n const idTokenClaims = activeAccount?.idTokenClaims;\n const sub = idTokenClaims?.sub;\n const shouldFetchUser = Boolean(activeAccount);\n\n //Get user info\n const [{ data: userInfo, error: userError }] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/unityuser`,\n {},\n !shouldFetchUser,\n false\n );\n\n useEffect(() => {\n if (userError) {\n setErrorMessage('Unable to get user details. Please try again.');\n setNonExistingUserModalOpen(true);\n }\n }, [setErrorMessage, setNonExistingUserModalOpen, userError]);\n\n // const [{ data: aadUserInfo }] = useAxiosGet(\n // ConfigService.securityV1ApiUrl,\n // `users/${sub}`,\n // {},\n // false,\n // false\n // );\n\n const [userState, dispatch] = useReducer((state, action) => {\n switch (action.type) {\n case 'SET_USER':\n state = {\n ...state,\n user: action.user\n };\n break;\n case 'CHANGE_TENANT':\n let userTenantPermissions = [];\n let userTenantRoles = [];\n let userTenantProducts = [];\n if (state.tenantIds) {\n const currentUserTenantProperties =\n userInfo.userTenantPropertiesView?.find(\n (propertyView) => propertyView?.tenantId === action.tenantId\n );\n userTenantPermissions = currentUserTenantProperties\n ? currentUserTenantProperties.permissions\n : [];\n userTenantRoles = currentUserTenantProperties\n ? currentUserTenantProperties.securityRoles\n : [];\n userTenantProducts = currentUserTenantProperties\n ? currentUserTenantProperties.products\n : [];\n }\n state = {\n user: {\n ...state,\n currentTenantId: action.tenantId,\n products: userTenantProducts,\n permissions: userTenantPermissions,\n roleIds: userTenantRoles.map((role) => role.roleId) ?? [],\n roleNames: userTenantRoles.map((role) => role.name) ?? []\n }\n };\n break;\n default:\n throw new Error(`Unknown action type ${action.type}`);\n }\n\n return state.user;\n }, emptyUser);\n\n useEffect(() => {\n if (userInfo?.userId) {\n const user = createUser({\n ...userInfo,\n displayName: idTokenClaims?.name,\n givenName: idTokenClaims?.given_name ?? idTokenClaims?.name,\n accessToken: activeAccount?.idToken ?? '',\n surname: idTokenClaims?.family_name\n });\n sessionStorage.setItem('user-id', userInfo?.userId);\n\n dispatch({ type: 'SET_USER', user });\n }\n }, [\n userInfo,\n idTokenClaims?.name,\n idTokenClaims?.given_name,\n idTokenClaims?.family_name,\n activeAccount?.idToken\n ]);\n\n useEffect(() => {\n if (!activeAccount) {\n dispatch({ type: 'SET_USER', user: emptyUser });\n }\n }, [activeAccount]);\n\n useEffect(() => {\n if (userInfo?.defaultTenantId) {\n if (!getStoredTenant()) {\n if (unityTenantId) {\n storeTenant(unityTenantId);\n } else {\n storeTenant(userInfo.defaultTenantId);\n }\n }\n }\n }, [userInfo]);\n\n return (\n <div>\n {!doNotWaitForTenant &&\n !userState?.currentTenantId &&\n !isWhiteListed ? (\n <LoadingIndicator />\n ) : (\n <UserContext.Provider value={userState}>\n <UserDispatchContext.Provider value={dispatch}>\n <TenantProvider>{children}</TenantProvider>\n </UserDispatchContext.Provider>\n </UserContext.Provider>\n )}\n </div>\n );\n};\n\nexport default UserProvider;\n","import React, { useEffect, useState } from 'react';\nimport {\n initSignInAuthProvider,\n getSignInAuthProvider,\n} from './signInAuthProvider';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { MsalProvider } from '@azure/msal-react';\nimport { useHistory } from 'react-router-dom';\nimport CustomNavigationClient from '../CustomNavigationClient';\nimport { useLocation } from 'react-use';\nimport UserProvider from './UserProvider';\nimport { useRouteRegistry } from '../../routes/routeRegistryStore';\nimport { matchPath } from 'react-router-dom';\n\nconst useIsRoutePublic = () => {\n const location = useLocation();\n const routeRegistry = useRouteRegistry();\n\n // 1. Get all registered route patterns\n const patterns = Object.keys(routeRegistry.routeMap);\n\n // 2. Find the matching pattern\n const matchingPattern = patterns.find(pattern =>\n matchPath(location.pathname, {\n path: pattern,\n exact: true,\n strict: false\n })\n );\n\n // 3. Return config or undefined if not found\n return matchingPattern\n ? routeRegistry.routeMap[matchingPattern]?.isPublic\n : undefined;\n}\nexport const AuthProvider = ({ children, doNotWaitForTenant = true }) => {\n const [msalInstance, setMsalInstance] = useState(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const [sessionExpiredModalOpen, setSessionExpiredModalOpen] = useState(false);\n const [nonExistingUserModalOpen, setNonExistingUserModalOpen] =\n useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const history = useHistory();\n const isRoutePublic = useIsRoutePublic();\n const resolvedIsPublic = isRoutePublic ?? true;\n useEffect(() => {\n const initialize = async () => {\n try {\n await initSignInAuthProvider();\n const authProvider = getSignInAuthProvider();\n const navigationClient = new CustomNavigationClient(history);\n authProvider.setNavigationClient(navigationClient);\n setMsalInstance(authProvider);\n setIsInitialized(true);\n } catch (error) {\n console.error('Failed to initialize AuthProvider:', error);\n // Handle initialization error, maybe show an error message\n }\n };\n initialize();\n }, [history]);\n\n if (!isInitialized) {\n return <LoadingIndicator />;\n }\n\n return (\n <MsalProvider instance={msalInstance}>\n <UserProvider\n sessionExpiredModalOpen={sessionExpiredModalOpen}\n setSessionExpiredModalOpen={setSessionExpiredModalOpen}\n setNonExistingUserModalOpen={setNonExistingUserModalOpen}\n setErrorMessage={setErrorMessage}\n isWhiteListed={resolvedIsPublic}\n doNotWaitForTenant={doNotWaitForTenant}\n >\n {children}\n </UserProvider>\n </MsalProvider>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AuthProvider-BUi9oEtK.js","names":["useLocation"],"sources":["../src/utilities/auth/user.ts","../src/utilities/auth/UserProvider.jsx","../src/utilities/auth/AuthProvider.jsx"],"sourcesContent":["import { ConfigService } from '../../configService';\nimport { RoleIdEnums } from '../../enums/unitySystemEnums';\nimport { getStoredTenant } from '../storage/UnitySessionStorage';\n\nexport interface User {\n name: string | undefined;\n firstName: string | undefined;\n familyName: string | undefined;\n jobTitle: string | undefined;\n email: string | undefined;\n mobile: string | undefined;\n phone: string | undefined;\n id: string | undefined;\n location: string | undefined;\n aadId: string | undefined;\n accessToken: string | undefined;\n defaultTenantId: string | undefined;\n currentTenantId: string | undefined;\n tenantIds: Array<string> | undefined;\n roleIds: Array<string> | undefined;\n products: Array<object> | undefined;\n permissions: Array<object> | undefined;\n can: any | undefined;\n statusCode: number | undefined;\n unityId: string | undefined;\n additionalProperties: any | undefined;\n roleNames: Array<string> | undefined;\n isUnitySystemAdmin: boolean | undefined;\n}\n\n/**\n * Create a \"unified\" user object from MSAL account info and Univerus user data (in the future)\n */\nexport function createUser(userInfo: any): User {\n const tenantId: any =\n getStoredTenant() ||\n (userInfo?.defaultTenantId ??\n (userInfo?.tenantIds ? userInfo?.tenantIds[0] : ''));\n let userTenantPermissions: any = [];\n let userTenantRoles: any = [];\n let userTenantProducts: any = [];\n const currentUserTenantProperties = userInfo?.userTenantPropertiesView?.find(\n (propertyView: any) => propertyView?.tenantId === tenantId\n );\n userTenantPermissions = currentUserTenantProperties\n ? currentUserTenantProperties.permissions\n : [];\n userTenantRoles = currentUserTenantProperties\n ? currentUserTenantProperties.securityRoles\n : [];\n userTenantProducts = currentUserTenantProperties\n ? currentUserTenantProperties.products\n : [];\n\n let roleIds: any = userTenantRoles.map((role: any) => role.roleId) ?? [];\n\n return {\n name: userInfo?.displayName ?? '',\n firstName: userInfo?.givenName ?? '',\n familyName: userInfo?.surname ?? '',\n jobTitle: userInfo?.jobTitle ?? '',\n email: userInfo?.email ?? '',\n mobile: userInfo?.mobilePhone ?? '',\n phone: userInfo?.officePhone ?? '',\n id: userInfo?.userId ?? '',\n location: userInfo?.location ?? '',\n aadId: userInfo?.externalUUID ?? '',\n accessToken: userInfo?.accessToken ?? '',\n tenantIds: userInfo?.tenantIds ?? [],\n defaultTenantId: userInfo?.defaultTenantId ?? '',\n currentTenantId: ConfigService.config.UNITY_TENANT_ID\n ? ConfigService.config.UNITY_TENANT_ID\n : tenantId,\n roleIds: roleIds,\n products: userTenantProducts,\n permissions: userTenantPermissions,\n can:\n userTenantPermissions.reduce((can: any, permission: any) => {\n if (permission.value === 'false') {\n can[permission.name] = false;\n } else if (permission.value === 'true') {\n can[permission.name] = true;\n } else {\n can[permission.name] = permission.value;\n }\n return can;\n }, {}) ?? {},\n statusCode: userInfo?.statusCode ?? 200,\n unityId: userInfo?.userId ?? '',\n additionalProperties: userInfo?.additionalProperties ?? undefined,\n roleNames: userTenantRoles.map((role) => role.name) ?? [],\n isUnitySystemAdmin: !!roleIds.find(\n (id: string) => id === RoleIdEnums.Unity_System_Administrator\n )\n };\n}\n","import React, { useReducer, useEffect } from 'react';\nimport { UserContext, UserDispatchContext } from './internal';\nimport { createUser } from './user';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { useAccount } from '@azure/msal-react';\nimport { storeTenant, getStoredTenant } from '../storage/UnitySessionStorage';\nimport { useAxiosGet } from '../useAxiosGet';\nimport { TenantProvider } from '../tenant/TenantProvider';\nimport { acquireAccessToken } from './authActions';\nimport { ConfigService } from '../../configService';\nconst emptyUser = {\n name: '',\n firstName: '',\n familyName: '',\n jobTitle: '',\n email: '',\n mobile: '',\n phone: '',\n id: '',\n location: '',\n aadId: '',\n accessToken: '',\n defaultTenantId: '',\n currentTenantId: '',\n tenantIds: [],\n roleIds: [],\n products: [],\n permissions: [],\n can: {},\n statusCode: undefined,\n unityId: undefined,\n additionalProperties: undefined,\n roleNames: [],\n isUnitySystemAdmin: undefined\n};\n\nconst UserProvider = (props) => {\n const {\n children,\n setSessionExpiredModalOpen,\n setNonExistingUserModalOpen,\n setErrorMessage,\n isWhiteListed,\n doNotWaitForTenant = false,\n unityTenantId\n } = props;\n const activeAccount = useAccount();\n const idTokenClaims = activeAccount?.idTokenClaims;\n const sub = idTokenClaims?.sub;\n const shouldFetchUser = Boolean(activeAccount);\n\n //Get user info\n const [{ data: userInfo, error: userError }] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/unityuser`,\n {},\n !shouldFetchUser,\n false\n );\n\n useEffect(() => {\n if (userError) {\n setErrorMessage('Unable to get user details. Please try again.');\n setNonExistingUserModalOpen(true);\n }\n }, [setErrorMessage, setNonExistingUserModalOpen, userError]);\n\n // const [{ data: aadUserInfo }] = useAxiosGet(\n // ConfigService.securityV1ApiUrl,\n // `users/${sub}`,\n // {},\n // false,\n // false\n // );\n\n const [userState, dispatch] = useReducer((state, action) => {\n switch (action.type) {\n case 'SET_USER':\n state = {\n ...state,\n user: action.user\n };\n break;\n case 'CHANGE_TENANT':\n let userTenantPermissions = [];\n let userTenantRoles = [];\n let userTenantProducts = [];\n if (state.tenantIds) {\n const currentUserTenantProperties =\n userInfo.userTenantPropertiesView?.find(\n (propertyView) => propertyView?.tenantId === action.tenantId\n );\n userTenantPermissions = currentUserTenantProperties\n ? currentUserTenantProperties.permissions\n : [];\n userTenantRoles = currentUserTenantProperties\n ? currentUserTenantProperties.securityRoles\n : [];\n userTenantProducts = currentUserTenantProperties\n ? currentUserTenantProperties.products\n : [];\n }\n state = {\n user: {\n ...state,\n currentTenantId: action.tenantId,\n products: userTenantProducts,\n permissions: userTenantPermissions,\n roleIds: userTenantRoles.map((role) => role.roleId) ?? [],\n roleNames: userTenantRoles.map((role) => role.name) ?? []\n }\n };\n break;\n default:\n throw new Error(`Unknown action type ${action.type}`);\n }\n\n return state.user;\n }, emptyUser);\n\n useEffect(() => {\n if (userInfo?.userId) {\n const user = createUser({\n ...userInfo,\n displayName: idTokenClaims?.name,\n givenName: idTokenClaims?.given_name ?? idTokenClaims?.name,\n accessToken: activeAccount?.idToken ?? '',\n surname: idTokenClaims?.family_name\n });\n sessionStorage.setItem('user-id', userInfo?.userId);\n\n dispatch({ type: 'SET_USER', user });\n }\n }, [\n userInfo,\n idTokenClaims?.name,\n idTokenClaims?.given_name,\n idTokenClaims?.family_name,\n activeAccount?.idToken\n ]);\n\n useEffect(() => {\n if (!activeAccount) {\n dispatch({ type: 'SET_USER', user: emptyUser });\n }\n }, [activeAccount]);\n\n useEffect(() => {\n if (userInfo?.defaultTenantId) {\n if (!getStoredTenant()) {\n if (unityTenantId) {\n storeTenant(unityTenantId);\n } else {\n storeTenant(userInfo.defaultTenantId);\n }\n }\n }\n }, [userInfo]);\n\n return (\n <div>\n {!doNotWaitForTenant &&\n !userState?.currentTenantId &&\n !isWhiteListed ? (\n <LoadingIndicator />\n ) : (\n <UserContext.Provider value={userState}>\n <UserDispatchContext.Provider value={dispatch}>\n <TenantProvider>{children}</TenantProvider>\n </UserDispatchContext.Provider>\n </UserContext.Provider>\n )}\n </div>\n );\n};\n\nexport default UserProvider;\n","import React, { useEffect, useState } from 'react';\nimport {\n initSignInAuthProvider,\n getSignInAuthProvider,\n} from './signInAuthProvider';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { MsalProvider } from '@azure/msal-react';\nimport { useHistory } from 'react-router-dom';\nimport CustomNavigationClient from '../CustomNavigationClient';\nimport { useLocation } from 'react-use';\nimport UserProvider from './UserProvider';\nimport { useRouteRegistry } from '../../routes/routeRegistryStore';\nimport { matchPath } from 'react-router-dom';\n\nconst useIsRoutePublic = () => {\n const location = useLocation();\n const routeRegistry = useRouteRegistry();\n\n // 1. Get all registered route patterns\n const patterns = Object.keys(routeRegistry.routeMap);\n\n // 2. Find the matching pattern\n const matchingPattern = patterns.find(pattern =>\n matchPath(location.pathname, {\n path: pattern,\n exact: true,\n strict: false\n })\n );\n\n // 3. Return config or undefined if not found\n return matchingPattern\n ? routeRegistry.routeMap[matchingPattern]?.isPublic\n : undefined;\n}\nexport const AuthProvider = ({ children, doNotWaitForTenant = true }) => {\n const [msalInstance, setMsalInstance] = useState(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const [sessionExpiredModalOpen, setSessionExpiredModalOpen] = useState(false);\n const [nonExistingUserModalOpen, setNonExistingUserModalOpen] =\n useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const history = useHistory();\n const isRoutePublic = useIsRoutePublic();\n const resolvedIsPublic = isRoutePublic ?? true;\n useEffect(() => {\n const initialize = async () => {\n try {\n await initSignInAuthProvider();\n const authProvider = getSignInAuthProvider();\n const navigationClient = new CustomNavigationClient(history);\n authProvider.setNavigationClient(navigationClient);\n setMsalInstance(authProvider);\n setIsInitialized(true);\n } catch (error) {\n console.error('Failed to initialize AuthProvider:', error);\n // Handle initialization error, maybe show an error message\n }\n };\n initialize();\n }, [history]);\n\n if (!isInitialized) {\n return <LoadingIndicator />;\n }\n\n return (\n <MsalProvider instance={msalInstance}>\n <UserProvider\n sessionExpiredModalOpen={sessionExpiredModalOpen}\n setSessionExpiredModalOpen={setSessionExpiredModalOpen}\n setNonExistingUserModalOpen={setNonExistingUserModalOpen}\n setErrorMessage={setErrorMessage}\n isWhiteListed={resolvedIsPublic}\n doNotWaitForTenant={doNotWaitForTenant}\n >\n {children}\n </UserProvider>\n </MsalProvider>\n );\n};\n"],"mappings":"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"}
@@ -6,14 +6,14 @@ import { n as useBuildEnvironment } from "./useBuildEnvironment-DsBqfGwR.js";
6
6
  import { t as UtilitySideBar } from "./UtilitySideBar-VhHVhVUj.js";
7
7
  import { t as PageActionWrapper } from "./PageActionWrapper-BXBLPsC2.js";
8
8
  import { r as useRouteRegistry } from "./routeRegistryStore-BmhhxWS1.js";
9
- import { t as getMenuItemsRecursively } from "./menuUtilities-CZa7kUTV.js";
10
- import { s as useMenuContext } from "./TenantProvider-Bmp6YdE2.js";
11
- import { t as UdpRoutes } from "./UdpRoutes-C7Dmc6Pv.js";
9
+ import { n as getMenuItemsRecursively, t as findHomeRouteSlug } from "./menuUtilities-BIiFWeWA.js";
10
+ import { s as useMenuContext } from "./TenantProvider-r35vfTMk.js";
11
+ import { t as UdpRoutes } from "./UdpRoutes-ClaIhJIi.js";
12
12
  import { c as NavigationSidebar, t as SiteHeader } from "./SiteHeader-BhJJmO1u.js";
13
13
  import { t as FUIAppSwitcher } from "./FUIAppSwitcher-C6xv_T7_.js";
14
14
  import { t as ActionProvider } from "./ActionProvider-CEt8Z5bT.js";
15
15
  import { t as ChatBotProvider } from "./ChatBotProvider-C7FFww7I.js";
16
- import { t as UserProfileMenuWrapper } from "./profile-DsCMe9Hd.js";
16
+ import { t as UserProfileMenuWrapper } from "./profile-grsbAKwd.js";
17
17
  import { UtilityBar } from "./UI/utilityDisplay/index.js";
18
18
  import React, { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "react";
19
19
  import { Drawer, makeStyles, useMediaQuery, useTheme } from "@material-ui/core";
@@ -115,6 +115,7 @@ const Shell = (props) => {
115
115
  leftMenu,
116
116
  menuContext
117
117
  ]);
118
+ const homeRoute = useMemo(() => leftMenu?.length ? findHomeRouteSlug(leftMenu) : menuContext?.homeRoute, [leftMenu, menuContext]);
118
119
  const resolvedAppSelectorMenus = appSelectorMenus ?? menuContext?.appSelectorMenus;
119
120
  const providedLanguages = languages ?? menuContext?.languages;
120
121
  const resolvedLanguages = Array.isArray(providedLanguages) ? providedLanguages : [];
@@ -230,7 +231,7 @@ const Shell = (props) => {
230
231
  expandedSecondary: panelExpandedSecondary,
231
232
  setExpanded: setPanelExpanded,
232
233
  setExpandedSecondary: setPanelExpandedSecondary
233
- }), /* @__PURE__ */ React.createElement(PageActionWrapper, null, /* @__PURE__ */ React.createElement(Suspense, { fallback: /* @__PURE__ */ React.createElement(PageLoading, null) }, /* @__PURE__ */ React.createElement(Switch$1, null, children, /* @__PURE__ */ React.createElement(UdpRoutes, null))))), /* @__PURE__ */ React.createElement(Drawer, {
234
+ }), /* @__PURE__ */ React.createElement(PageActionWrapper, null, /* @__PURE__ */ React.createElement(Suspense, { fallback: /* @__PURE__ */ React.createElement(PageLoading, null) }, /* @__PURE__ */ React.createElement(Switch$1, null, children, /* @__PURE__ */ React.createElement(UdpRoutes, { homeRoute }))))), /* @__PURE__ */ React.createElement(Drawer, {
234
235
  variant: "temporary",
235
236
  anchor: "left",
236
237
  open: appSwitcherDesktop,
@@ -317,4 +318,4 @@ Shell.propTypes = {
317
318
  //#endregion
318
319
  export { Shell as t };
319
320
 
320
- //# sourceMappingURL=Shell-DDMO_nHU.js.map
321
+ //# sourceMappingURL=Shell--4lbPR7c.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Shell--4lbPR7c.js","names":["Switch"],"sources":["../src/shell/useShellVisibility.js","../src/shell/Shell.jsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { useShellStore, useSetInitialShellVisibility } from '../stores/shellStore';\n\n/**\n * Controls shell visibility based on layout flags, user presence, and route metadata.\n * Returns the effective hidden state that callers should use for rendering.\n */\nexport const useShellVisibility = ({ hideLayout, isPublicRoute, hasUser }) => {\n const { shellHidden, setShellHidden } = useShellStore();\n const shellHiddenBaselineRef = useRef();\n\n // Respect ?withoutShell on initial load\n useSetInitialShellVisibility();\n\n const syncShellHiddenWithRouteState = () => {\n const shouldForceHideShell = hideLayout || isPublicRoute || !hasUser;\n\n if (shouldForceHideShell) {\n if (shellHiddenBaselineRef.current === undefined) {\n shellHiddenBaselineRef.current = shellHidden;\n }\n if (!shellHidden) {\n setShellHidden(true);\n }\n } else if (shellHiddenBaselineRef.current !== undefined) {\n if (shellHidden !== shellHiddenBaselineRef.current) {\n setShellHidden(shellHiddenBaselineRef.current);\n } else {\n setShellHidden(false);\n }\n shellHiddenBaselineRef.current = undefined;\n } else if (shellHidden) {\n setShellHidden(false);\n }\n };\n\n useEffect(syncShellHiddenWithRouteState, [\n hideLayout,\n isPublicRoute,\n hasUser,\n setShellHidden,\n shellHidden\n ]);\n\n return shellHidden || hideLayout || isPublicRoute || !hasUser;\n};\n","import React, {\n useState,\n useEffect,\n useMemo,\n useCallback,\n Suspense\n} from 'react';\nimport { makeStyles, Drawer, useMediaQuery, useTheme } from '@material-ui/core';\nimport NavigationSidebar from './ui/NavigationSidebar';\nimport SiteHeader from './ui/SiteHeader';\nimport { UtilityBar } from '../UI/utilityDisplay/UtilityBar';\nimport { useTranslation } from 'react-i18next';\nimport FUIAppSwitcher from './ui/appSwitcher/FUIAppSwitcher';\nimport { getMenuItemsRecursively, findHomeRouteSlug } from '../utilities/menus/menuUtilities';\nimport clsx from 'clsx';\nimport { UtilitySideBar } from '../UI/utilityDisplay/UtilitySideBar';\nimport PropTypes from 'prop-types';\nimport { useUser } from '../utilities/auth/useUser';\nimport { ActionProvider } from '../utilities/provider/ActionProvider';\nimport { PageActionWrapper } from '../actions/PageActionWrapper';\nimport { useInquiryStore } from '../stores/inquiryStore';\nimport { useShellStore } from '../stores/shellStore';\n\nimport {\n useBuildEnvironment,\n APP_RIBBON_SPACE\n} from './ui/useBuildEnvironment';\nimport { ChatBotProvider } from '../utilities/chatBot/ChatBotProvider';\nimport { UserProfileMenuWrapper } from '../shell/ui/profile';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n//import { usePreloadPages } from '../hooks/usePreloadPages';\nimport { Switch } from 'react-router-dom';\nimport { UdpRoutes } from '../routes/UdpRoutes';\nimport { useRouteRegistry } from '../routes/routeRegistryStore';\nimport { useShellVisibility } from './useShellVisibility';\nimport { PageLoading } from '../UI';\n// load the page container module so its loaded when we need it\nvoid import('../page/PageContainer');\nconst MenuTypeEnums = {\n Left_Menu: 1,\n Application_Menu: 2,\n Builders_Menu: 3,\n Favorites_Menu: 4\n};\n\nconst useStyles = makeStyles(\n (theme) => ({\n '@global': {\n html: {\n minHeight: '100%'\n },\n 'html, body, #root': {\n display: 'flex',\n flexDirection: 'column'\n },\n 'body, #root': {\n flex: 1\n }\n },\n root: {\n flex: 1,\n minHeight: '100vh',\n display: 'grid',\n gridTemplateAreas: ['sidebar header', 'sidebar content']\n .map((line) => `\"${line}\"`)\n .join(' '),\n gridTemplateColumns: 'auto 1fr',\n gridTemplateRows: 'auto 1fr'\n },\n header: {\n gridArea: 'header'\n },\n sidebar: {\n gridArea: 'sidebar'\n },\n content: {\n gridArea: 'content',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n zIndex: 1,\n height: ({ appRibbonSpace }) => `calc(100vh - ${56 + appRibbonSpace}px)`,\n overflowY: 'auto'\n },\n paper: {\n width: '100%',\n [theme.breakpoints.up('sm')]: {\n width: (props) => props.drawerWidth || 520\n }\n }\n }),\n { name: 'Layout' }\n);\n\n/**\n * Core site layout common to all pages\n */\nexport const Shell = (props) => {\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n ribbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const {\n children,\n userAvatar = <UserProfileMenuWrapper />,\n appContent,\n leftMenu,\n appSelectorMenus,\n siteName,\n className,\n navRoot,\n hideToggle,\n useMockData,\n mockMenus,\n user: passedInUser,\n unityUrl,\n expander,\n sidebarTitle,\n navMenuHoverOn = false,\n secondExtended,\n toggleOne,\n toggleTwo,\n closePrimary,\n closeSecondary,\n panelExpanded,\n panelExpandedSecondary,\n setPanelExpanded = false,\n setPanelExpandedSecondary = false,\n breadCrumbAltLabelList = [],\n currentLocation,\n utilitySidebarResizable,\n utilitySidebarToggleOverride,\n onUtilitySidebarToggleExpandClick,\n hideLayout = false,\n getAccessToken,\n switcherData,\n selectedItem,\n switcherWidth,\n languages,\n projectSwitcherColor,\n getWidget,\n isValidWidget,\n appSwitcherHeader,\n hamburgerMenuAccessRole,\n hideLanguageSwitcher = false,\n subheader,\n hideHelpCenter = false,\n leftMenuLoading = false\n } = props;\n const contextUser = useUser();\n const user = passedInUser ?? contextUser;\n const { setGetWidget, setIsValidWidget } = useShellStore();\n const routeConfig = useRouteRegistry(\n (state) => state.routeMap[state.currentPath]\n );\n const isPublicRoute = routeConfig?.isPublic !== false;\n const [appSwitcherMobile, setAppSwitcherMobile] = useState(false);\n const [appSwitcherDesktop, setAppSwitcherDesktop] = useState(false);\n const { i18n } = useTranslation();\n const inquiryTitle = useInquiryStore((state) => state.title);\n\n //usePreloadPages();\n\n const menuContext = useMenuContext?.();\n const resolvedLeftMenu = useMemo(\n () => (leftMenuLoading ? [] : leftMenu ?? menuContext?.leftMenu),\n [leftMenuLoading, leftMenu, menuContext]\n );\n const homeRoute = useMemo(\n () => (leftMenu?.length ? findHomeRouteSlug(leftMenu) : menuContext?.homeRoute),\n [leftMenu, menuContext]\n );\n const resolvedAppSelectorMenus =\n appSelectorMenus ?? menuContext?.appSelectorMenus;\n const providedLanguages = languages ?? menuContext?.languages;\n const resolvedLanguages = Array.isArray(providedLanguages)\n ? providedLanguages\n : [];\n useEffect(() => {\n setGetWidget(getWidget);\n return () => setGetWidget(null);\n }, [getWidget, setGetWidget]);\n\n useEffect(() => {\n setIsValidWidget(isValidWidget);\n return () => setIsValidWidget(null);\n }, [isValidWidget, setIsValidWidget]);\n\n const effectiveShellHidden = useShellVisibility({\n hideLayout,\n isPublicRoute,\n hasUser: Boolean(user?.id)\n });\n\n const getMenuItems = useCallback(\n (menuTypeId, menus) => {\n if (!menus && !useMockData) {\n return [];\n }\n const menusToFilter = useMockData ? mockMenus : menus;\n\n const foundMenus = menusToFilter.filter(\n (menu) => menu.menuTypeId === menuTypeId && menu.active\n );\n\n if (foundMenus) {\n return foundMenus.reduce((menuItemInstanceStructureViews, menu) => {\n return [\n ...menuItemInstanceStructureViews,\n ...menu.menuItemInstanceStructureViews\n ];\n }, []);\n } else {\n return [];\n }\n },\n [useMockData, mockMenus]\n );\n\n const menus = useMemo(() => {\n const menuItems = getMenuItems(1, resolvedLeftMenu);\n return getMenuItemsRecursively(menuItems, true, user);\n }, [getMenuItems, user, resolvedLeftMenu]);\n\n const theme = useTheme();\n const mobile = useMediaQuery(theme.breakpoints.up('sm'));\n\n const handleAppSwitcher = (type, bool) => {\n if (type === 'mobile') {\n setAppSwitcherMobile(bool);\n } else {\n setAppSwitcherDesktop(bool);\n }\n };\n\n const builderMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Builders_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const favoriteMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Favorites_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const appMenu = useMemo(() => {\n const menuItems = getMenuItems(\n MenuTypeEnums.Application_Menu,\n resolvedAppSelectorMenus\n );\n return getMenuItemsRecursively(menuItems, true, user, getAccessToken);\n }, [getMenuItems, user, resolvedAppSelectorMenus, getAccessToken]);\n\n const hideAppMenu = useMemo(\n () =>\n !resolvedAppSelectorMenus ||\n (hamburgerMenuAccessRole &&\n !user?.roleNames.includes(hamburgerMenuAccessRole)),\n [user, resolvedAppSelectorMenus, hamburgerMenuAccessRole]\n );\n\n useEffect(() => {\n i18n.changeLanguage('en-US');\n }, [i18n]);\n\n return (\n <ChatBotProvider>\n <ActionProvider>\n <div className={classes.root}>\n {!effectiveShellHidden && (\n <SiteHeader\n className={classes.header}\n siteName={siteName}\n appContent={appContent}\n userAvatar={userAvatar}\n breadCrumbRoot={navRoot}\n setAppSwitcherOpen={(type, bool) => handleAppSwitcher(type, bool)}\n breadCrumbAltLabelList={breadCrumbAltLabelList}\n currentLocation={currentLocation}\n switcherData={switcherData}\n selectedItem={selectedItem}\n switcherWidth={switcherWidth}\n hideAppLaunch={hideAppMenu}\n languages={resolvedLanguages}\n hideLanguageSwitcher={hideLanguageSwitcher}\n backgroundColor={projectSwitcherColor}\n hideHelpCenter={hideHelpCenter}\n />\n )}\n\n <div style={{ display: 'flex' }} className={classes.sidebar}>\n {!effectiveShellHidden && mobile && (\n <NavigationSidebar\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n />\n )}\n {expander && (\n <div>\n <UtilitySideBar\n title={inquiryTitle || sidebarTitle}\n resizable={utilitySidebarResizable}\n utilitySidebarToggleOverride={utilitySidebarToggleOverride}\n onUtilitySidebarToggleExpandClick={\n onUtilitySidebarToggleExpandClick\n }\n sidebarHidden={effectiveShellHidden}\n {...props}\n />\n </div>\n )}\n </div>\n\n <div className={classes.content}>\n {!effectiveShellHidden && subheader}\n <UtilityBar\n className={clsx(className)}\n gutters={false}\n hideToggle={hideToggle}\n expander={expander}\n secondExtended={secondExtended}\n toggleOne={toggleOne}\n toggleTwo={toggleTwo}\n closePrimary={closePrimary}\n closeSecondary={closeSecondary}\n expanded={panelExpanded}\n expandedSecondary={panelExpandedSecondary}\n setExpanded={setPanelExpanded}\n setExpandedSecondary={setPanelExpandedSecondary}\n />\n\n <PageActionWrapper>\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {children}\n <UdpRoutes homeRoute={homeRoute} />\n </Switch>\n </Suspense>\n </PageActionWrapper>\n </div>\n <Drawer\n variant='temporary'\n anchor='left'\n open={appSwitcherDesktop}\n classes={\n !mobile\n ? {}\n : !resolvedAppSelectorMenus\n ? {}\n : { paper: classes.paper }\n }\n onClose={() => handleAppSwitcher('desktop', false)}\n >\n {mobile && resolvedAppSelectorMenus && (\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('desktop', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('desktop', false);\n })\n : appSwitcherHeader\n }\n />\n )}\n {(!mobile || (mobile && !resolvedAppSelectorMenus)) && (\n <NavigationSidebar\n toggle={false}\n className={classes.sidebar}\n data={menus}\n navMenuHoverOn={navMenuHoverOn}\n user={user}\n useGlobalState={true}\n />\n )}\n </Drawer>\n\n <Drawer\n variant='temporary'\n anchor='right'\n open={appSwitcherMobile}\n classes={{ paper: classes.paper }}\n onClose={() => handleAppSwitcher('mobile', false)}\n >\n <FUIAppSwitcher\n onClose={() => handleAppSwitcher('mobile', false)}\n favoriteMenu={favoriteMenu}\n builderMenu={builderMenu}\n appMenu={appMenu}\n unityUrl={unityUrl}\n user={user}\n header={\n appSwitcherHeader && typeof appSwitcherHeader === 'function'\n ? appSwitcherHeader(() => {\n handleAppSwitcher('mobile', false);\n })\n : appSwitcherHeader\n }\n />\n </Drawer>\n </div>\n </ActionProvider>\n </ChatBotProvider>\n );\n};\n\nShell.propTypes = {\n /**\n * The newest propTypes have been added but older ones are missing @todo: add missing propTypes for Shell.\n */\n\n /**\n * The array used to map for label and functions to list items.\n */\n switcherData: PropTypes.array,\n /**\n * The active label displayed.\n */\n selectedItem: PropTypes.string,\n /**\n * Provides a method set the selector width. Default is 100.\n */\n switcherWidth: PropTypes.number,\n /**\n * Children nodes\n */\n children: PropTypes.oneOfType([\n PropTypes.arrayOf(PropTypes.node),\n PropTypes.node\n ]).isRequired,\n\n /**\n * Name of site\n */\n siteName: PropTypes.string,\n\n /**\n * Component to render for the user Avatar\n */\n userAvatar: PropTypes.element,\n\n appContent: PropTypes.element,\n\n leftMenu: PropTypes.array,\n\n appSelectorMenus: PropTypes.array,\n\n className: PropTypes.object,\n\n navRoot: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.element,\n PropTypes.node\n ]),\n\n /**\n * Should the shell use mock data\n */\n useMockData: PropTypes.bool,\n\n mockMenus: PropTypes.array,\n\n unityUrl: PropTypes.string,\n\n expander: PropTypes.bool,\n\n sidebarTitle: PropTypes.string,\n\n navMenuHoverOn: PropTypes.bool,\n\n toggleOne: PropTypes.bool,\n\n toggleTwo: PropTypes.bool,\n\n closePrimary: PropTypes.bool,\n\n closeSecondary: PropTypes.bool,\n\n panelExpanded: PropTypes.bool,\n\n panelExpandedSecondary: PropTypes.bool,\n\n setPanelExpanded: PropTypes.func,\n\n setPanelExpandedSecondary: PropTypes.func,\n\n breadCrumbAltLabelList: PropTypes.array,\n\n currentLocation: PropTypes.object,\n\n utilitySidebarResizable: PropTypes.bool,\n\n utilitySidebarToggleOverride: PropTypes.bool,\n\n onUtilitySidebarToggleExpandClick: PropTypes.func,\n\n hideLayout: PropTypes.bool,\n\n languages: PropTypes.arrayOf(PropTypes.object),\n\n /**\n * Passes the background color on the project switcher (default: theme secondary)\n */\n projectSwitcherColor: PropTypes.string,\n getWidget: PropTypes.func,\n isValidWidget: PropTypes.func,\n currentTenant: PropTypes.object,\n hamburgerMenuAccessRole: PropTypes.string\n};\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import { r as UserDispatchContext, t as useUser } from "./useUser-GVq--Ecx.js";
5
5
  import { i as storeTenant } from "./UnitySessionStorage-C79WqHjc.js";
6
6
  import { t as useAxiosGet } from "./useAxiosGet-CRKIOaCC.js";
7
7
  import { t as FluentDialog } from "./FluentDialog-C5PIPKcM.js";
8
- import { n as getRouteRolesMapAndMenuActiveMap } from "./menuUtilities-CZa7kUTV.js";
8
+ import { r as getRouteRolesMapAndMenuActiveMap, t as findHomeRouteSlug } from "./menuUtilities-BIiFWeWA.js";
9
9
  import { LoadingIndicator } from "./UI/loading/LoadingIndicator/index.js";
10
10
  import { t as TenantContext } from "./tenantContext-DyvQ7XuF.js";
11
11
  import React, { createContext, forwardRef, useCallback, useContext, useEffect, useMemo } from "react";
@@ -40,11 +40,15 @@ const MenuProvider = ({ children }) => {
40
40
  const [{ data: leftMenu, loading: leftMenuLoading, error: leftMenuError }, refetchLeftMenu] = useAxiosGet(ConfigService.tenantV1ApiUrl, `menus?menuTypeId=1&productId=${ConfigService.config.UNITY_PRODUCT_ID}&tenantId=${currentTenantId}`, {}, !currentTenantId);
41
41
  const [{ data: appSelectorMenus, loading: appSelectorMenusLoading, error: appSelectorMenusError }, refetchAppSelectorMenus] = useAxiosGet(ConfigService.tenantV1ApiUrl, `menus?tenantId=${currentTenantId}&verticalId=${ConfigService.config.UNITY_VERTICAL_ID}&userId=${userId ?? ""}`, {}, !userId);
42
42
  const [{ data: languages, loading: languagesLoading, error: languagesError }, refetchLanguages] = useAxiosGet(ConfigService.tenantV1ApiUrl, `language`, {}, !userId);
43
- const { rolesMap, menuActiveMap } = useMemo(() => {
44
- if (Array.isArray(leftMenu) && leftMenu.length > 0) return buildRouteAndActiveMaps(leftMenu);
43
+ const { rolesMap, menuActiveMap, homeRoute } = useMemo(() => {
44
+ if (Array.isArray(leftMenu) && leftMenu.length > 0) return {
45
+ ...buildRouteAndActiveMaps(leftMenu),
46
+ homeRoute: findHomeRouteSlug(leftMenu)
47
+ };
45
48
  return {
46
49
  rolesMap: /* @__PURE__ */ new Map(),
47
- menuActiveMap: /* @__PURE__ */ new Map()
50
+ menuActiveMap: /* @__PURE__ */ new Map(),
51
+ homeRoute: null
48
52
  };
49
53
  }, [leftMenu]);
50
54
  const refetchAll = useCallback(() => {
@@ -72,6 +76,7 @@ const MenuProvider = ({ children }) => {
72
76
  languagesError,
73
77
  rolesMap,
74
78
  menuActiveMap,
79
+ homeRoute,
75
80
  refetchAll
76
81
  }), [
77
82
  leftMenu,
@@ -85,6 +90,7 @@ const MenuProvider = ({ children }) => {
85
90
  languagesError,
86
91
  rolesMap,
87
92
  menuActiveMap,
93
+ homeRoute,
88
94
  refetchAll
89
95
  ]);
90
96
  return /* @__PURE__ */ React.createElement(MenuContext.Provider, { value }, children);
@@ -96,6 +102,7 @@ const useMenuContext = () => {
96
102
  languagesLoading: false,
97
103
  rolesMap: /* @__PURE__ */ new Map(),
98
104
  menuActiveMap: /* @__PURE__ */ new Map(),
105
+ homeRoute: null,
99
106
  refetchAll: () => Promise.resolve([])
100
107
  };
101
108
  };
@@ -341,4 +348,4 @@ const TenantProvider = ({ children }) => {
341
348
  //#endregion
342
349
  export { TenantSelect as a, TenantAccessDialog as i, useLocalUserActions as n, MenuProvider as o, useUserActions as r, useMenuContext as s, TenantProvider as t };
343
350
 
344
- //# sourceMappingURL=TenantProvider-Bmp6YdE2.js.map
351
+ //# sourceMappingURL=TenantProvider-r35vfTMk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantProvider-r35vfTMk.js","names":[],"sources":["../src/utilities/menus/MenuProvider.tsx","../src/utilities/tenant/TenantSelect.tsx","../src/utilities/tenant/TenantAccessDialog.tsx","../src/utilities/auth/users.js","../src/utilities/tenant/TenantProvider.jsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n ReactNode\n} from 'react';\nimport { useUser } from '../auth/useUser';\nimport { useAxiosGet } from '../useAxiosGet';\nimport { ConfigService } from '../../configService';\nimport {\n getRouteRolesMapAndMenuActiveMap,\n findHomeRouteSlug\n} from './menuUtilities';\nimport type { AxiosError } from 'axios';\n\ntype LeftMenuResponse = unknown[];\ntype AppSelectorMenuResponse = unknown[];\ntype LanguagesResponse = unknown[];\n\ninterface MenuContextValue {\n leftMenu?: LeftMenuResponse;\n leftMenuLoading: boolean;\n leftMenuError?: AxiosError<unknown>;\n appSelectorMenus?: AppSelectorMenuResponse;\n appSelectorMenusLoading: boolean;\n appSelectorMenusError?: AxiosError<unknown>;\n languages?: LanguagesResponse;\n languagesLoading: boolean;\n languagesError?: AxiosError<unknown>;\n rolesMap: Map<string, string[]>;\n menuActiveMap: Map<string, boolean>;\n homeRoute: string | null;\n refetchAll: () => Promise<unknown[]>;\n}\n\ninterface MenuProviderProps {\n children?: ReactNode;\n}\n\nexport const MenuContext = createContext<MenuContextValue | null>(null);\n\ntype RefetchFn = (config?: unknown, options?: unknown) => Promise<unknown>;\n\ntype UseAxiosGetReturn<TData> = [\n {\n data?: TData;\n loading: boolean;\n error?: AxiosError<unknown>;\n },\n RefetchFn\n];\n\nconst buildRouteAndActiveMaps = (\n menu: LeftMenuResponse\n): { rolesMap: Map<string, string[]>; menuActiveMap: Map<string, boolean> } => {\n const rawResult = getRouteRolesMapAndMenuActiveMap(menu) as {\n rolesMap?: Map<unknown, unknown>;\n menuActiveMap?: Map<unknown, unknown>;\n };\n\n const rolesMap = new Map<string, string[]>();\n if (rawResult?.rolesMap instanceof Map) {\n rawResult.rolesMap.forEach((value, key) => {\n if (typeof key !== 'string') return;\n const normalizedKey = key;\n const normalizedValue = Array.isArray(value)\n ? value.map((roleId) => String(roleId))\n : [];\n rolesMap.set(normalizedKey, normalizedValue);\n });\n }\n\n const menuActiveMap = new Map<string, boolean>();\n if (rawResult?.menuActiveMap instanceof Map) {\n rawResult.menuActiveMap.forEach((value, key) => {\n if (typeof key !== 'string') return;\n menuActiveMap.set(key, Boolean(value));\n });\n }\n\n return { rolesMap, menuActiveMap };\n};\n\nexport const MenuProvider: React.FC<MenuProviderProps> = ({ children }) => {\n const user = useUser();\n\n const currentTenantId = user?.currentTenantId;\n const userId = user?.id;\n const [\n { data: leftMenu, loading: leftMenuLoading, error: leftMenuError },\n refetchLeftMenu\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus?menuTypeId=1&productId=${ConfigService.config.UNITY_PRODUCT_ID}&tenantId=${currentTenantId}`,\n {},\n !currentTenantId\n ) as UseAxiosGetReturn<LeftMenuResponse>;\n\n const [\n {\n data: appSelectorMenus,\n loading: appSelectorMenusLoading,\n error: appSelectorMenusError\n },\n refetchAppSelectorMenus\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus?tenantId=${currentTenantId}&verticalId=${\n ConfigService.config.UNITY_VERTICAL_ID\n }&userId=${userId ?? ''}`,\n {},\n !userId\n ) as UseAxiosGetReturn<AppSelectorMenuResponse>;\n\n const [\n { data: languages, loading: languagesLoading, error: languagesError },\n refetchLanguages\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `language`,\n {},\n !userId\n ) as UseAxiosGetReturn<LanguagesResponse>;\n\n const { rolesMap, menuActiveMap, homeRoute } = useMemo(() => {\n if (Array.isArray(leftMenu) && leftMenu.length > 0) {\n return {\n ...buildRouteAndActiveMaps(leftMenu),\n homeRoute: (\n findHomeRouteSlug as (menu: LeftMenuResponse) => string | null\n )(leftMenu)\n };\n }\n\n return {\n rolesMap: new Map<string, string[]>(),\n menuActiveMap: new Map<string, boolean>(),\n homeRoute: null\n };\n }, [leftMenu]);\n\n const refetchAll = useCallback(() => {\n const refetchPromises: Promise<unknown>[] = [];\n\n if (currentTenantId) {\n refetchPromises.push(refetchLeftMenu());\n }\n\n if (userId) {\n refetchPromises.push(refetchAppSelectorMenus());\n }\n\n refetchPromises.push(refetchLanguages());\n\n return Promise.all(refetchPromises);\n }, [\n currentTenantId,\n refetchAppSelectorMenus,\n refetchLanguages,\n refetchLeftMenu,\n userId\n ]);\n\n const value = useMemo<MenuContextValue>(\n () => ({\n leftMenu,\n leftMenuLoading,\n leftMenuError,\n appSelectorMenus,\n appSelectorMenusLoading,\n appSelectorMenusError,\n languages,\n languagesLoading,\n languagesError,\n rolesMap,\n menuActiveMap,\n homeRoute,\n refetchAll\n }),\n [\n leftMenu,\n leftMenuLoading,\n leftMenuError,\n appSelectorMenus,\n appSelectorMenusLoading,\n appSelectorMenusError,\n languages,\n languagesLoading,\n languagesError,\n rolesMap,\n menuActiveMap,\n homeRoute,\n refetchAll\n ]\n );\n\n return <MenuContext.Provider value={value}>{children}</MenuContext.Provider>;\n};\n\nexport const useMenuContext = (): MenuContextValue => {\n const context = useContext(MenuContext);\n return (\n context ?? {\n leftMenuLoading: false,\n appSelectorMenusLoading: false,\n languagesLoading: false,\n rolesMap: new Map<string, string[]>(),\n menuActiveMap: new Map<string, boolean>(),\n homeRoute: null,\n refetchAll: () => Promise.resolve([])\n }\n );\n};\n","import React, { forwardRef, useMemo, useCallback } from 'react';\nimport { Autocomplete, AutocompleteChangeReason } from '@material-ui/lab';\nimport { TextField, TextFieldProps } from '@material-ui/core';\nimport { Tenant } from '../types';\nimport { TenantTypeEnums } from '../../enums/unitySystemEnums'\n\ninterface TenantSelectProps {\n tenants?: Tenant[] | null;\n value: Tenant | null;\n onTenantChange?: (tenant: Tenant) => void;\n id?: string;\n label?: string;\n className?: string;\n disableClearable?: boolean;\n textFieldProps?: TextFieldProps;\n recordIdPrefix?: string;\n}\n\nconst sanitizeRecordId = (tenantName: string) =>\n tenantName.replace(/\\s+/g, '');\n\nexport const TenantSelect = forwardRef<HTMLDivElement, TenantSelectProps>(\n (props, ref) => {\n const {\n tenants,\n value,\n onTenantChange,\n id = 'tenant-select',\n label = 'Current Tenant',\n className,\n disableClearable = true,\n textFieldProps,\n recordIdPrefix = 'udpRecord-TenantSelect'\n } = props;\n\n const userTenantsContainsMultipleTypes =\n tenants.some((tenant) => tenant.tenantType == TenantTypeEnums.Tenant) &&\n tenants.some((tenant) => tenant.tenantType == TenantTypeEnums.Product);\n\n const sortTenantsByNameAlphacetically = (tenants ?: Tenant[]) => {\n const tenantProperty = \"tenantName\"\n tenants.sort((tenant, otherTenant) => {\n if (tenant[tenantProperty].toLowerCase() < otherTenant[tenantProperty].toLowerCase()) {\n return -1;\n } else if (tenant[tenantProperty].toLowerCase() > otherTenant[tenantProperty].toLowerCase()) {\n return 1;\n } else {\n return 0;\n }\n });\n };\n\n const groupTenantsByTypeAndFilter = useCallback( (tenants ?: Tenant[]) => {\n if (!userTenantsContainsMultipleTypes) {\n sortTenantsByNameAlphacetically(tenants);\n return tenants;\n }\n const clientTenants = tenants.filter(\n (tenant) => tenant.tenantType == TenantTypeEnums.Tenant\n );\n sortTenantsByNameAlphacetically(clientTenants);\n const productTenants = tenants.filter(\n (tenant) => tenant.tenantType == TenantTypeEnums.Product\n );\n sortTenantsByNameAlphacetically(productTenants);\n return clientTenants.concat(productTenants);\n },[userTenantsContainsMultipleTypes]);\n\n const options = useMemo(() => tenants ? groupTenantsByTypeAndFilter(tenants) : [], [tenants, groupTenantsByTypeAndFilter]);\n\n const handleChange = useCallback(\n (\n event: React.ChangeEvent<object>,\n newValue: Tenant | null,\n reason: AutocompleteChangeReason\n ) => {\n if (reason !== 'select-option' || !newValue) {\n return;\n }\n onTenantChange?.(newValue);\n },\n [onTenantChange]\n );\n\n return (\n <Autocomplete\n ref={ref}\n className={className}\n id={id}\n value={value}\n options={options}\n disableClearable={disableClearable}\n getOptionSelected={(option, selected) =>\n option?.tenantId === selected?.tenantId\n }\n getOptionLabel={(option) => option?.tenantName ?? ''}\n onChange={handleChange}\n groupBy={(option) =>\n userTenantsContainsMultipleTypes\n ? option.tenantType === TenantTypeEnums.Product\n ? 'Product'\n : 'Client'\n : null\n }\n renderInput={(params) => (\n <TextField\n {...params}\n label={label}\n variant='standard'\n {...textFieldProps}\n />\n )}\n renderOption={(option) => (\n <li\n style={{ width: '100%', height: '100%', listStyleType: 'none' }}\n // @ts-expect-error udpRecordId is used for automation tagging\n udprecordid={`${recordIdPrefix}-${sanitizeRecordId(\n option?.tenantName ?? ''\n )}`}\n >\n {option?.tenantName ?? ''}\n </li>\n )}\n />\n );\n }\n);\n\nTenantSelect.displayName = 'TenantSelect';\n","import React from 'react';\nimport { FluentDialog } from '../../UI/feedback/FluentDialog';\nimport { TenantSelect } from './TenantSelect';\nimport { Tenant } from '../types';\n\ninterface TenantAccessDialogProps {\n open: boolean;\n tenants: Tenant[];\n currentTenant: Tenant | null;\n onTenantChange: (tenant: Tenant) => void;\n productName?: string | null;\n}\n\nexport const TenantAccessDialog: React.FC<TenantAccessDialogProps> = ({\n tenants,\n onTenantChange,\n productName\n}) => {\n const message = productName\n ? `Your current tenant does not have access to ${productName}. Please select another tenant to continue.`\n : 'Your current tenant does not have access to this application. Please select another tenant to continue.';\n\n return (\n <FluentDialog\n open={true}\n title='Tenant Access Required'\n message={message}\n buttonOneHidden={true}\n buttonTwoHidden={true}\n disableEscapeKeyDown\n disableBackdropClick\n >\n <TenantSelect\n tenants={tenants}\n value={null}\n onTenantChange={onTenantChange}\n label='Available Tenants'\n id='tenant-access-dialog-select'\n disableClearable={false}\n recordIdPrefix='udpRecord-TenantAccessDialog'\n />\n </FluentDialog>\n );\n};\n","import { useContext, useCallback } from 'react';\nimport { UserDispatchContext } from './internal';\n\nexport function useUserActions() {\n const dispatch = useContext(UserDispatchContext);\n const setUser = useCallback(\n (user) => {\n dispatch({ type: 'SET_USER', user });\n },\n [dispatch]\n );\n\n const changeTenant = useCallback(\n (tenantId) => {\n dispatch({ type: 'CHANGE_TENANT', tenantId });\n },\n [dispatch]\n );\n\n return { setUser, changeTenant };\n}\n\nexport function useLocalUserActions() {\n const dispatch = useContext(UserDispatchContext);\n const setUser = useCallback(\n (user) => {\n dispatch({ type: 'SET_USER', user });\n },\n [dispatch]\n );\n\n const setAccessToken = useCallback(\n (accessToken) => {\n dispatch({ type: 'SET_ACCESS_TOKEN', accessToken });\n },\n [dispatch]\n );\n\n return { setUser, setAccessToken };\n}\n","import React, { useCallback, useMemo, useEffect } from 'react';\nimport { useUser } from '../auth/useUser';\nimport { useAxiosGet } from '../useAxiosGet';\nimport { TenantContext } from './tenantContext';\nimport { ConfigService } from '../../configService';\nimport { FluentDialog } from '../../UI/feedback/FluentDialog';\nimport { useAccount } from '@azure/msal-react';\nimport { MenuProvider } from '../menus/MenuProvider';\nimport { TenantAccessDialog } from './TenantAccessDialog';\nimport { storeTenant } from '../storage/UnitySessionStorage';\nimport { useUserActions } from '../auth/users';\nimport { TenantTypeEnums, UnityProducts } from '../../enums/unitySystemEnums';\nimport { useTenantStore } from '../../stores/tenantStore'; // <-- Imported for the sync hook\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\n\n/**\n * A hook to sync the derived active tenant with the Zustand store.\n * This is the \"necessary evil\" to keep the store updated.\n */\nconst useTenantStoreSync = (activeTenant) => {\n\n\n const setCurrentTenant = useTenantStore((state) => state.setCurrentTenant);\n\n useEffect(() => {\n if (!activeTenant?.tenantId) return;\n\n // Compare against the *current* store state at effect time (no subscription).\n const current = useTenantStore.getState().currentTenant;\n const theme = activeTenant?.theme ?? null;\n const name = activeTenant?.tenantName ?? null;\n const tenantType = activeTenant?.tenantType;\n\n if (\n current?.tenantId === activeTenant.tenantId &&\n current?.tenantType === tenantType &&\n (current?.name ?? null) === name &&\n (current?.theme ?? null) === theme\n ) {\n return;\n }\n\n setCurrentTenant({\n tenantId: activeTenant.tenantId,\n name,\n tenantType,\n theme,\n });\n // We intentionally depend on primitive fields only; object identity for\n // activeTenant is not stable.\n }, [activeTenant?.tenantId, activeTenant?.tenantName, activeTenant?.tenantType, activeTenant?.theme, setCurrentTenant]);\n};\n\n/**\n * This hook fetches all data and derives the correct tenant state.\n * It is pure and has no knowledge of Zustand.\n */\nconst useTenantData = (id, user) => {\n const activeAccount = useAccount();\n // --- Data Fetching ---\n const [{ data: tenants, loading: tenantsLoading }, refetchTenantsList] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/${id ?? ''}/unitytenants`,\n { skipTenantHeader: true },\n !id\n );\n\n const [{ data: selectedProduct, loading: productsLoading }] = useAxiosGet(\n ConfigService.tenantV2ApiUrl,\n `product/${ConfigService.config.UNITY_PRODUCT_ID}`,\n { skipTenantHeader: true},\n !activeAccount?.idToken\n );\n\n // --- State Derivation ---\n const unityProductIdString = ConfigService.config.UNITY_PRODUCT_ID;\n const unityProductId = unityProductIdString\n ? Number(unityProductIdString)\n : null;\n const shouldFilterByProduct =\n typeof unityProductId === 'number' && !Number.isNaN(unityProductId) && unityProductId !== UnityProducts.Unity;\n const hasTenantsData = Array.isArray(tenants);\n\n // When the selected product is marked as Unity default, product-type tenants (tenantType=2)\n // should always be allowed to access it.\n const isUnityDefaultProduct = selectedProduct?.isUnityDefault === true;\n\n const filteredTenantsList = useMemo(() => {\n if (!Array.isArray(tenants)) {\n return null;\n }\n if (!shouldFilterByProduct || unityProductId === null) {\n return tenants;\n }\n return tenants.filter((tenant) => {\n // Special access rule: Unity-default products are accessible by product tenants.\n if (isUnityDefaultProduct && tenant?.tenantType === TenantTypeEnums.Product) {\n return true;\n }\n return !!tenant?.products?.find(\n (product) => product?.productId === unityProductId\n );\n });\n }, [tenants, shouldFilterByProduct, unityProductId, isUnityDefaultProduct]);\n\n // This is the correctly derived tenant\n const activeTenant =\n user?.currentTenantId && Array.isArray(tenants)\n ? tenants.find((tenant) => tenant.tenantId === user.currentTenantId) ??\n null\n : null;\n\n // This is derived from the correct tenant\n const isProductTenant =\n activeTenant?.tenantType === TenantTypeEnums.Product;\n\n // --- Dialog Logic & Derived Flags ---\n\n const userHasLoaded = user?.statusCode === 200;\n\n const noTenantsAvailable =\n Array.isArray(tenants) && tenants.length === 0 && userHasLoaded;\n\n const hasFilteredTenants =\n Array.isArray(filteredTenantsList) && filteredTenantsList.length > 0;\n\n const currentTenantAllowed = !shouldFilterByProduct\n ? true\n : filteredTenantsList?.some(\n (tenant) => tenant.tenantId === user?.currentTenantId\n ) ?? false;\n\n const zeroTenantAccess =\n userHasLoaded &&\n shouldFilterByProduct &&\n Array.isArray(filteredTenantsList) &&\n filteredTenantsList.length === 0;\n\n const shouldShowTenantMismatchDialog =\n userHasLoaded &&\n shouldFilterByProduct &&\n hasFilteredTenants &&\n !currentTenantAllowed &&\n unityProductId !== UnityProducts.Unity;\n\n const allowedTenants = useMemo(\n () => (Array.isArray(filteredTenantsList) ? filteredTenantsList : []),\n [filteredTenantsList]\n );\n\n const selectedTenantForDialog = currentTenantAllowed\n ? activeTenant\n : allowedTenants[0] ?? null;\n\n // Return everything the Provider needs\n return {\n tenantsList: tenants ?? null,\n filteredTenantsList,\n activeTenant, // The correct tenant\n isProductTenant, // Derived from the correct tenant\n refresh: refetchTenantsList,\n noTenantsAvailable,\n zeroTenantAccess,\n shouldShowTenantMismatchDialog,\n allowedTenants,\n selectedTenantForDialog,\n unityProductName: selectedProduct?.productName,\n tenantsLoading,\n productsLoading,\n shouldFilterByProduct,\n hasTenantsData,\n hasProductsData: typeof selectedProduct === 'object' && selectedProduct !== null,\n };\n};\n\n\nexport const TenantProvider = ({ children }) => {\n const user = useUser();\n const activeAccount = useAccount();\n const id = user?.id;\n const { changeTenant } = useUserActions();\n\n // Call the main data hook to get the correct state\n const {\n tenantsList,\n filteredTenantsList,\n activeTenant, // This is the correct value\n isProductTenant,\n refresh,\n noTenantsAvailable,\n zeroTenantAccess,\n shouldShowTenantMismatchDialog,\n allowedTenants,\n selectedTenantForDialog,\n unityProductName,\n tenantsLoading,\n productsLoading,\n shouldFilterByProduct,\n hasTenantsData,\n hasProductsData,\n } = useTenantData(id, user);\n\n useTenantStoreSync(activeTenant);\n\n // Callback for changing the tenant (triggers API call)\n const handleTenantChange = useCallback(\n (tenant) => {\n if (!tenant) return;\n storeTenant(tenant.tenantId);\n changeTenant(tenant.tenantId); // This will cause `user` to update, re-running the hooks.\n },\n [changeTenant]\n );\n\n const userHasLoaded = user?.statusCode === 200;\n const shouldBlockForUser = Boolean(activeAccount) && !userHasLoaded;\n const shouldBlockForTenantData =\n Boolean(activeAccount) &&\n userHasLoaded &&\n (tenantsLoading || !hasTenantsData || (shouldFilterByProduct && (productsLoading || !hasProductsData)));\n\n if (shouldBlockForUser) {\n return <LoadingIndicator />;\n }\n\n if (shouldBlockForTenantData) {\n return <LoadingIndicator />;\n }\n\n // Render blocking dialog if user has no access\n if (noTenantsAvailable || zeroTenantAccess) {\n return (\n <FluentDialog\n title='No Access'\n message='Your user does not have access to any tenants. Please contact your support team.'\n open={true}\n buttonOneHidden={true}\n buttonTwoHidden={true}\n />\n );\n }\n if (shouldShowTenantMismatchDialog) {\n return (\n\n <TenantAccessDialog\n open={true}\n tenants={allowedTenants}\n currentTenant={selectedTenantForDialog}\n onTenantChange={handleTenantChange}\n productName={unityProductName}\n />\n );\n }\n\n // Provide the correct values to the Context\n return (\n <TenantContext.Provider\n value={{\n tenantsList,\n filteredTenantsList,\n activeTenant,\n isProductTenant,\n refresh,\n }}\n >\n <MenuProvider>\n {children}\n </MenuProvider>\n </TenantContext.Provider>\n );\n};\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { r as storeInitialTenant } from "./UnitySessionStorage-C79WqHjc.js";
4
4
  import { n as getRouteConfig, t as getCurrentRouteInitialized } from "./routeRegistryStore-BmhhxWS1.js";
5
5
  import { ThemeProvider } from "./utilities/theme/index.js";
6
6
  import { i as storeInitialPath } from "./LocalRedirectUrlStorage-D46ZyuMk.js";
7
- import { t as AuthProvider } from "./AuthProvider-DeOuedJL.js";
7
+ import { t as AuthProvider } from "./AuthProvider-BUi9oEtK.js";
8
8
  import React, { useEffect } from "react";
9
9
  import { SnackbarProvider } from "notistack";
10
10
  import { BrowserRouter } from "react-router-dom";
@@ -113,4 +113,4 @@ const UdpAppProvider = ({ children, snackbarProps, authProps, i18nOptions }) =>
113
113
  //#endregion
114
114
  export { getI18nInstance as n, initializeUnityI18n as r, UdpAppProvider as t };
115
115
 
116
- //# sourceMappingURL=UdpAppProvider-CR2R5W7e.js.map
116
+ //# sourceMappingURL=UdpAppProvider-sZs_gHCc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UdpAppProvider-CR2R5W7e.js","names":[],"sources":["../src/utilities/i18n/initializeI18n.js","../src/providers/UdpAppProvider.tsx"],"sourcesContent":["import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { apiMutate } from '../useAxiosMutate';\nimport { ConfigService } from '../../configService';\nimport { getRouteConfig, getCurrentRouteInitialized } from '../../routes/routeRegistryStore';\n\n/**\n * @typedef {Object} TenantTranslationItem\n * @property {string} label\n * @property {string} value\n */\n\n/**\n * @callback TranslationLoader\n * @param {string} language\n * @returns {Promise<Record<string, string>>}\n */\n\n/**\n * @typedef {Object} InitializeI18nOptions\n * @property {TranslationLoader} [loadTranslations]\n * @property {Partial<import('i18next').InitOptions>} [i18nConfig]\n * @property {string} [fallbackLanguage]\n */\n\nlet isInitialized = false;\n\n/**\n * Convert the API response into an i18next resource bundle.\n * @param {TenantTranslationItem[]} languageData\n * @returns {Record<string, string>}\n */\nconst buildTranslationMap = (languageData = []) => {\n return languageData.reduce((acc, item) => {\n if (item?.label) {\n acc[item.label] = item?.value ?? '';\n }\n return acc;\n }, /** @type {Record<string, string>} */ ({}));\n};\n\n/** @type {TranslationLoader} */\nconst defaultTranslationLoader = async (language) => {\n await ConfigService.waitForConfig?.();\n\n const routeConfig = getRouteConfig?.();\n const routeInitialized = getCurrentRouteInitialized?.();\n\n const shouldSkip =\n !routeInitialized ||\n (routeConfig?.isPublic && !routeConfig?.attemptSilentAuth);\n\n if (shouldSkip) {\n return {};\n }\n\n const response = await apiMutate(\n ConfigService.tenantV1ApiUrl,\n `translation/language/${language}`,\n { method: 'get' }\n );\n\n const languageData = Array.isArray(response?.data) ? response.data : [];\n return buildTranslationMap(languageData);\n};\n\n/**\n * Initializes the shared i18n instance used across UDP React applications.\n * Safe to call multiple times – initialization will only occur once per runtime.\n * @param {InitializeI18nOptions} [options]\n * @returns {import('i18next').i18n}\n */\nexport const initializeUnityI18n = (options = {}) => {\n if (isInitialized) {\n return i18n;\n }\n\n const fallbackLanguage = options.fallbackLanguage ?? 'en-US';\n const loadTranslations = options.loadTranslations ?? defaultTranslationLoader;\n\n /**\n * Lazy-load translations when the language changes.\n * @param {string} language\n */\n const handleLanguageChanged = async (language) => {\n if (i18n.hasResourceBundle(language, 'translation')) {\n return;\n }\n\n try {\n const bundle = await loadTranslations(language);\n i18n.addResourceBundle(language, 'translation', bundle, true, true);\n i18n.changeLanguage(language);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to load translations', error);\n }\n };\n\n i18n.on('languageChanged', handleLanguageChanged);\n\n i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n fallbackLng: fallbackLanguage,\n debug: false,\n detection: {\n order: ['queryString', 'cookie'],\n cache: ['cookie']\n },\n interpolation: {\n escapeValue: false\n },\n backend: {\n loadPath: ''\n },\n ...(options.i18nConfig ?? {})\n });\n\n isInitialized = true;\n return i18n;\n};\n\n/**\n * Convenience accessor for the shared i18n instance.\n * @returns {import('i18next').i18n}\n */\nexport const getI18nInstance = () => i18n;\n","import React, { ReactNode, useEffect } from 'react';\nimport { SnackbarProvider, SnackbarProviderProps } from 'notistack';\nimport { ThemeProvider } from '../utilities/theme';\nimport { AuthProvider } from '../utilities/auth/AuthProvider';\nimport {\n initializeUnityI18n,\n InitializeI18nOptions\n} from '../utilities/i18n/initializeI18n';\nimport { storeInitialPath } from '../utilities/redirect';\nimport { storeInitialTenant } from '../utilities/storage';\nimport { BrowserRouter } from 'react-router-dom';\n\nexport interface UdpAppProviderProps {\n children: ReactNode;\n /**\n * Props forwarded to the SnackbarProvider from notistack.\n */\n snackbarProps?: SnackbarProviderProps;\n /**\n * Props forwarded to the AuthProviderWrapper.\n */\n authProps?: {\n doNotWaitForTenant?: boolean;\n };\n /**\n * Optional configuration overrides for the shared i18n instance.\n */\n i18nOptions?: InitializeI18nOptions;\n}\n\n/**\n * Bundles the core UDP providers (theme, snackbar, auth) and ensures the shared\n * i18n instance is initialised exactly once. Intended to be rendered beneath a\n * react-router <Router /> so the auth provider has access to history.\n */\nexport const UdpAppProvider: React.FC<UdpAppProviderProps> = ({\n children,\n snackbarProps,\n authProps,\n i18nOptions\n}) => {\n useEffect(() => {\n initializeUnityI18n(i18nOptions);\n }, [i18nOptions]);\n storeInitialPath();\n storeInitialTenant();\n return (\n <AuthProvider {...authProps}>\n <ThemeProvider>\n <BrowserRouter>\n <SnackbarProvider maxSnack={3} {...snackbarProps}>\n {children}\n </SnackbarProvider>\n </BrowserRouter>\n </ThemeProvider>\n </AuthProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAI,gBAAgB;;;;;;AAOpB,MAAM,uBAAuB,eAAe,EAAE,KAAK;AACjD,QAAO,aAAa,QAAQ,KAAK,SAAS;AACxC,MAAI,MAAM,MACR,KAAI,KAAK,SAAS,MAAM,SAAS;AAEnC,SAAO;IACiC,EAAE,CAAE;;;AAIhD,MAAM,2BAA2B,OAAO,aAAa;AACnD,OAAM,cAAc,iBAAiB;CAErC,MAAM,cAAc,kBAAkB;AAOtC,KAHE,CAHuB,8BAA8B,IAIpD,aAAa,YAAY,CAAC,aAAa,kBAGxC,QAAO,EAAE;CAGX,MAAM,WAAW,MAAM,UACrB,cAAc,gBACd,wBAAwB,YACxB,EAAE,QAAQ,OAAO,CAClB;AAGD,QAAO,oBADc,MAAM,QAAQ,UAAU,KAAK,GAAG,SAAS,OAAO,EAAE,CAC/B;;;;;;;;AAS1C,MAAa,uBAAuB,UAAU,EAAE,KAAK;AACnD,KAAI,cACF,QAAO;CAGT,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,MAAM,mBAAmB,QAAQ,oBAAoB;;;;;CAMrD,MAAM,wBAAwB,OAAO,aAAa;AAChD,MAAI,KAAK,kBAAkB,UAAU,cAAc,CACjD;AAGF,MAAI;GACF,MAAM,SAAS,MAAM,iBAAiB,SAAS;AAC/C,QAAK,kBAAkB,UAAU,eAAe,QAAQ,MAAM,KAAK;AACnE,QAAK,eAAe,SAAS;WACtB,OAAO;AAEd,WAAQ,MAAM,+BAA+B,MAAM;;;AAIvD,MAAK,GAAG,mBAAmB,sBAAsB;AAEjD,MACG,IAAI,iBAAiB,CACrB,IAAI,iBAAiB,CACrB,KAAK;EACJ,aAAa;EACb,OAAO;EACP,WAAW;GACT,OAAO,CAAC,eAAe,SAAS;GAChC,OAAO,CAAC,SAAS;GAClB;EACD,eAAe,EACb,aAAa,OACd;EACD,SAAS,EACP,UAAU,IACX;EACD,GAAI,QAAQ,cAAc,EAAE;EAC7B,CAAC;AAEJ,iBAAgB;AAChB,QAAO;;;;;;AAOT,MAAa,wBAAwB;;;;;;;;AC9FrC,MAAa,kBAAiD,EAC5D,UACA,eACA,WACA,kBACI;AACJ,iBAAgB;AACd,sBAAoB,YAAY;IAC/B,CAAC,YAAY,CAAC;AACjB,mBAAkB;AAClB,qBAAoB;AACpB,QACE,sBAAA,cAAC,cAAiB,WAChB,sBAAA,cAAC,eAAA,MACC,sBAAA,cAAC,eAAA,MACC,sBAAA,cAAC,kBAAD;EAAkB,UAAU;EAAG,GAAI;EAEhB,EADhB,SACgB,CACL,CACF,CACH"}
1
+ {"version":3,"file":"UdpAppProvider-sZs_gHCc.js","names":[],"sources":["../src/utilities/i18n/initializeI18n.js","../src/providers/UdpAppProvider.tsx"],"sourcesContent":["import i18n from 'i18next';\nimport { initReactI18next } from 'react-i18next';\nimport LanguageDetector from 'i18next-browser-languagedetector';\nimport { apiMutate } from '../useAxiosMutate';\nimport { ConfigService } from '../../configService';\nimport { getRouteConfig, getCurrentRouteInitialized } from '../../routes/routeRegistryStore';\n\n/**\n * @typedef {Object} TenantTranslationItem\n * @property {string} label\n * @property {string} value\n */\n\n/**\n * @callback TranslationLoader\n * @param {string} language\n * @returns {Promise<Record<string, string>>}\n */\n\n/**\n * @typedef {Object} InitializeI18nOptions\n * @property {TranslationLoader} [loadTranslations]\n * @property {Partial<import('i18next').InitOptions>} [i18nConfig]\n * @property {string} [fallbackLanguage]\n */\n\nlet isInitialized = false;\n\n/**\n * Convert the API response into an i18next resource bundle.\n * @param {TenantTranslationItem[]} languageData\n * @returns {Record<string, string>}\n */\nconst buildTranslationMap = (languageData = []) => {\n return languageData.reduce((acc, item) => {\n if (item?.label) {\n acc[item.label] = item?.value ?? '';\n }\n return acc;\n }, /** @type {Record<string, string>} */ ({}));\n};\n\n/** @type {TranslationLoader} */\nconst defaultTranslationLoader = async (language) => {\n await ConfigService.waitForConfig?.();\n\n const routeConfig = getRouteConfig?.();\n const routeInitialized = getCurrentRouteInitialized?.();\n\n const shouldSkip =\n !routeInitialized ||\n (routeConfig?.isPublic && !routeConfig?.attemptSilentAuth);\n\n if (shouldSkip) {\n return {};\n }\n\n const response = await apiMutate(\n ConfigService.tenantV1ApiUrl,\n `translation/language/${language}`,\n { method: 'get' }\n );\n\n const languageData = Array.isArray(response?.data) ? response.data : [];\n return buildTranslationMap(languageData);\n};\n\n/**\n * Initializes the shared i18n instance used across UDP React applications.\n * Safe to call multiple times – initialization will only occur once per runtime.\n * @param {InitializeI18nOptions} [options]\n * @returns {import('i18next').i18n}\n */\nexport const initializeUnityI18n = (options = {}) => {\n if (isInitialized) {\n return i18n;\n }\n\n const fallbackLanguage = options.fallbackLanguage ?? 'en-US';\n const loadTranslations = options.loadTranslations ?? defaultTranslationLoader;\n\n /**\n * Lazy-load translations when the language changes.\n * @param {string} language\n */\n const handleLanguageChanged = async (language) => {\n if (i18n.hasResourceBundle(language, 'translation')) {\n return;\n }\n\n try {\n const bundle = await loadTranslations(language);\n i18n.addResourceBundle(language, 'translation', bundle, true, true);\n i18n.changeLanguage(language);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.error('Failed to load translations', error);\n }\n };\n\n i18n.on('languageChanged', handleLanguageChanged);\n\n i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n fallbackLng: fallbackLanguage,\n debug: false,\n detection: {\n order: ['queryString', 'cookie'],\n cache: ['cookie']\n },\n interpolation: {\n escapeValue: false\n },\n backend: {\n loadPath: ''\n },\n ...(options.i18nConfig ?? {})\n });\n\n isInitialized = true;\n return i18n;\n};\n\n/**\n * Convenience accessor for the shared i18n instance.\n * @returns {import('i18next').i18n}\n */\nexport const getI18nInstance = () => i18n;\n","import React, { ReactNode, useEffect } from 'react';\nimport { SnackbarProvider, SnackbarProviderProps } from 'notistack';\nimport { ThemeProvider } from '../utilities/theme';\nimport { AuthProvider } from '../utilities/auth/AuthProvider';\nimport {\n initializeUnityI18n,\n InitializeI18nOptions\n} from '../utilities/i18n/initializeI18n';\nimport { storeInitialPath } from '../utilities/redirect';\nimport { storeInitialTenant } from '../utilities/storage';\nimport { BrowserRouter } from 'react-router-dom';\n\nexport interface UdpAppProviderProps {\n children: ReactNode;\n /**\n * Props forwarded to the SnackbarProvider from notistack.\n */\n snackbarProps?: SnackbarProviderProps;\n /**\n * Props forwarded to the AuthProviderWrapper.\n */\n authProps?: {\n doNotWaitForTenant?: boolean;\n };\n /**\n * Optional configuration overrides for the shared i18n instance.\n */\n i18nOptions?: InitializeI18nOptions;\n}\n\n/**\n * Bundles the core UDP providers (theme, snackbar, auth) and ensures the shared\n * i18n instance is initialised exactly once. Intended to be rendered beneath a\n * react-router <Router /> so the auth provider has access to history.\n */\nexport const UdpAppProvider: React.FC<UdpAppProviderProps> = ({\n children,\n snackbarProps,\n authProps,\n i18nOptions\n}) => {\n useEffect(() => {\n initializeUnityI18n(i18nOptions);\n }, [i18nOptions]);\n storeInitialPath();\n storeInitialTenant();\n return (\n <AuthProvider {...authProps}>\n <ThemeProvider>\n <BrowserRouter>\n <SnackbarProvider maxSnack={3} {...snackbarProps}>\n {children}\n </SnackbarProvider>\n </BrowserRouter>\n </ThemeProvider>\n </AuthProvider>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,IAAI,gBAAgB;;;;;;AAOpB,MAAM,uBAAuB,eAAe,EAAE,KAAK;AACjD,QAAO,aAAa,QAAQ,KAAK,SAAS;AACxC,MAAI,MAAM,MACR,KAAI,KAAK,SAAS,MAAM,SAAS;AAEnC,SAAO;IACiC,EAAE,CAAE;;;AAIhD,MAAM,2BAA2B,OAAO,aAAa;AACnD,OAAM,cAAc,iBAAiB;CAErC,MAAM,cAAc,kBAAkB;AAOtC,KAHE,CAHuB,8BAA8B,IAIpD,aAAa,YAAY,CAAC,aAAa,kBAGxC,QAAO,EAAE;CAGX,MAAM,WAAW,MAAM,UACrB,cAAc,gBACd,wBAAwB,YACxB,EAAE,QAAQ,OAAO,CAClB;AAGD,QAAO,oBADc,MAAM,QAAQ,UAAU,KAAK,GAAG,SAAS,OAAO,EAAE,CAC/B;;;;;;;;AAS1C,MAAa,uBAAuB,UAAU,EAAE,KAAK;AACnD,KAAI,cACF,QAAO;CAGT,MAAM,mBAAmB,QAAQ,oBAAoB;CACrD,MAAM,mBAAmB,QAAQ,oBAAoB;;;;;CAMrD,MAAM,wBAAwB,OAAO,aAAa;AAChD,MAAI,KAAK,kBAAkB,UAAU,cAAc,CACjD;AAGF,MAAI;GACF,MAAM,SAAS,MAAM,iBAAiB,SAAS;AAC/C,QAAK,kBAAkB,UAAU,eAAe,QAAQ,MAAM,KAAK;AACnE,QAAK,eAAe,SAAS;WACtB,OAAO;AAEd,WAAQ,MAAM,+BAA+B,MAAM;;;AAIvD,MAAK,GAAG,mBAAmB,sBAAsB;AAEjD,MACG,IAAI,iBAAiB,CACrB,IAAI,iBAAiB,CACrB,KAAK;EACJ,aAAa;EACb,OAAO;EACP,WAAW;GACT,OAAO,CAAC,eAAe,SAAS;GAChC,OAAO,CAAC,SAAS;GAClB;EACD,eAAe,EACb,aAAa,OACd;EACD,SAAS,EACP,UAAU,IACX;EACD,GAAI,QAAQ,cAAc,EAAE;EAC7B,CAAC;AAEJ,iBAAgB;AAChB,QAAO;;;;;;AAOT,MAAa,wBAAwB;;;;;;;;AC9FrC,MAAa,kBAAiD,EAC5D,UACA,eACA,WACA,kBACI;AACJ,iBAAgB;AACd,sBAAoB,YAAY;IAC/B,CAAC,YAAY,CAAC;AACjB,mBAAkB;AAClB,qBAAoB;AACpB,QACE,sBAAA,cAAC,cAAiB,WAChB,sBAAA,cAAC,eAAA,MACC,sBAAA,cAAC,eAAA,MACC,sBAAA,cAAC,kBAAD;EAAkB,UAAU;EAAG,GAAI;EAEhB,EADhB,SACgB,CACL,CACF,CACH"}
@@ -7,14 +7,14 @@ import { t as useIsUnityAuthenticated } from "./useIsUnityAuthenticated-BspO6YQz
7
7
  import { r as useRouteRegistry } from "./routeRegistryStore-BmhhxWS1.js";
8
8
  import { useTheme } from "./utilities/theme/index.js";
9
9
  import { t as PageForbiddenRoute } from "./PageForbiddenRoute-LzOoMfuJ.js";
10
- import { s as useMenuContext } from "./TenantProvider-Bmp6YdE2.js";
10
+ import { s as useMenuContext } from "./TenantProvider-r35vfTMk.js";
11
11
  import { LoadingIndicator } from "./UI/loading/LoadingIndicator/index.js";
12
12
  import { o as storeRedirectPath } from "./LocalRedirectUrlStorage-D46ZyuMk.js";
13
13
  import { t as PasswordResetRedirect$1 } from "./PasswordResetRedirect-BuWVcybJ.js";
14
14
  import { t as useTenant } from "./useTenant-DryxTalu.js";
15
15
  import React, { Suspense, lazy, useEffect, useMemo } from "react";
16
16
  import { InteractionType } from "@azure/msal-browser";
17
- import { Route, Switch, useLocation } from "react-router-dom";
17
+ import { Redirect, Route, Switch, useLocation } from "react-router-dom";
18
18
  import { useTranslation } from "react-i18next";
19
19
  import { MsalAuthenticationTemplate } from "@azure/msal-react";
20
20
  //#region src/routes/useRegisterRoute.ts
@@ -150,8 +150,17 @@ const PageContainer = lazy(() => import("./page/PageContainer/index.js").then((m
150
150
  const Reports = lazy(() => import("./Reports-Dl7UfyPu.js").then((n) => n.t));
151
151
  const Inquiry = lazy(() => import("./Inquiry-BK7AvAqh.js").then((module) => ({ default: module.Inquiry })));
152
152
  const UdpRoutes = (props) => {
153
- const { ...other } = props;
154
- return /* @__PURE__ */ React.createElement(Suspense, { fallback: /* @__PURE__ */ React.createElement(PageLoading, null) }, /* @__PURE__ */ React.createElement(Switch, null, /* @__PURE__ */ React.createElement(PrivateRoute, {
153
+ const { homeRoute, ...other } = props;
154
+ const { leftMenuLoading } = useMenuContext();
155
+ return /* @__PURE__ */ React.createElement(Suspense, { fallback: /* @__PURE__ */ React.createElement(PageLoading, null) }, /* @__PURE__ */ React.createElement(Switch, null, homeRoute && /* @__PURE__ */ React.createElement(Redirect, {
156
+ exact: true,
157
+ from: "/",
158
+ to: homeRoute
159
+ }), leftMenuLoading && /* @__PURE__ */ React.createElement(Route, {
160
+ exact: true,
161
+ path: "/",
162
+ component: PageLoading
163
+ }), /* @__PURE__ */ React.createElement(PrivateRoute, {
155
164
  path: "/virtual/:id",
156
165
  render: (props) => /* @__PURE__ */ React.createElement(VirtualBrowser, {
157
166
  ...props,
@@ -221,4 +230,4 @@ const UdpRoutes = (props) => {
221
230
  //#endregion
222
231
  export { PublicRoute as n, PrivateRoute as r, UdpRoutes as t };
223
232
 
224
- //# sourceMappingURL=UdpRoutes-C7Dmc6Pv.js.map
233
+ //# sourceMappingURL=UdpRoutes-ClaIhJIi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UdpRoutes-ClaIhJIi.js","names":["PasswordResetRedirect"],"sources":["../src/routes/useRegisterRoute.ts","../src/routes/PrivateRoute.tsx","../src/routes/PublicRoute.tsx","../src/routes/UdpRoutes.jsx"],"sourcesContent":["import { useEffect } from 'react';\nimport type { Location } from 'history';\nimport { useLocation } from 'react-router-dom';\nimport { useRouteRegistry } from './routeRegistryStore';\n\ninterface UseRegisterRouteOptions {\n isPublic: boolean;\n attemptSilentAuth?: boolean;\n}\n\n/**\n * Registers the current route in the registry and keeps the current path in sync.\n * Returns the current location so callers can reuse it without calling useLocation again.\n */\nexport const useRegisterRoute = ({\n isPublic,\n attemptSilentAuth\n}: UseRegisterRouteOptions): Location => {\n const location = useLocation();\n const registerRoute = useRouteRegistry((state) => state.registerRoute);\n const setPath = useRouteRegistry((state) => state.setPath);\n\n const syncRouteRegistration = () => {\n const path = location.pathname;\n setPath(path);\n registerRoute(path, {\n isPublic,\n ...(attemptSilentAuth !== undefined ? { attemptSilentAuth } : {})\n });\n };\n\n useEffect(syncRouteRegistration, [\n attemptSilentAuth,\n isPublic,\n location.pathname,\n registerRoute,\n setPath\n ]);\n\n return location;\n};\n","import React, { useMemo } from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useTheme } from '../utilities/theme';\nimport { useTranslation } from 'react-i18next';\nimport type { RedirectRequest } from '@azure/msal-browser';\nimport { InteractionType } from '@azure/msal-browser';\nimport { MsalAuthenticationTemplate } from '@azure/msal-react';\nimport { useIsUnityAuthenticated } from '../utilities/auth/useIsUnityAuthenticated';\nimport { useUser } from '../utilities/auth/useUser';\nimport { PageForbiddenRoute } from './components/PageForbiddenRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\nimport { useRegisterRoute } from './useRegisterRoute';\nimport { LoadingIndicator } from '../UI/loading/LoadingIndicator';\nimport { PasswordResetRedirect } from './components/PasswordResetRedirect';\nimport { getLoginRequest } from '../utilities/auth/signInAuthProvider';\nimport { useTenant } from '../utilities/tenant';\nimport { storeRedirectPath } from '../utilities/redirect/LocalRedirectUrlStorage';\n\n/**\n * Route guard for protected pages.\n *\n * - Triggers login redirect when the user is not authenticated.\n * - Blocks rendering until user/tenant/theme are initialized after login.\n * - Enforces tenant membership, menu activation, and role-based access.\n */\nexport interface PrivateRouteProps extends RouteProps {\n /**\n * Optional map of pathname -> required role IDs.\n * If a path is present and has roles, the user must have at least one.\n */\n rolesMap?: Map<string, string[]>;\n /**\n * Optional map of pathname -> menu active status.\n * If a path is present and inactive, access is denied.\n */\n menuActiveMap?: Map<string, boolean>;\n}\n\nexport const PrivateRoute = ({\n rolesMap: propRolesMap,\n menuActiveMap: propMenuActiveMap,\n ...routeProps\n}: PrivateRouteProps) => {\n const location = useRegisterRoute({ isPublic: false });\n const isAuthenticated = useIsUnityAuthenticated();\n const user = useUser();\n const tenant = useTenant();\n const theme = useTheme();\n const { t } = useTranslation();\n const menuContext = useMenuContext?.();\n const rolesMap = menuContext?.rolesMap ?? propRolesMap;\n const menuActiveMap = menuContext?.menuActiveMap ?? propMenuActiveMap;\n const userRoles = useMemo(() => {\n return Array.isArray(user?.roleIds) ? user.roleIds : [];\n }, [user]);\n\n const userHasAccessToTenant = useMemo(() => {\n if (user?.tenantIds?.includes(user.currentTenantId)) {\n return true;\n }\n return false;\n }, [user]);\n\n const userHasRoles = useMemo(() => {\n if (rolesMap?.size > 0) {\n if (!rolesMap.has(routeProps.location?.pathname)) {\n return false;\n }\n const routeRoles = rolesMap.get(routeProps.location?.pathname);\n if (!routeRoles?.length) {\n return true;\n }\n return routeRoles.some((element) => userRoles.includes(element));\n }\n return true;\n }, [userRoles, rolesMap, routeProps.location?.pathname]);\n\n const menuIsActive = useMemo(() => {\n if (\n menuActiveMap?.size > 0 &&\n menuActiveMap.has(routeProps.location?.pathname)\n ) {\n return menuActiveMap.get(routeProps.location?.pathname);\n }\n }, [menuActiveMap, routeProps.location?.pathname]);\n\n const activeTenant = tenant?.activeTenant ?? null;\n const isUserInitialized = Boolean(user?.id);\n const isTenantInitialized = Boolean(activeTenant?.tenantId);\n const isThemeInitialized = Boolean(theme?.isInitialized);\n\n const shouldWaitForProtectedContext =\n isAuthenticated && (!isUserInitialized || !isTenantInitialized);\n const shouldWaitForTheme = isAuthenticated && !isThemeInitialized;\n if (shouldWaitForProtectedContext || shouldWaitForTheme) {\n return <LoadingIndicator />;\n }\n\n if (!isAuthenticated) {\n storeRedirectPath(location.pathname, location.search);\n let loginRequest: RedirectRequest | null = null;\n try {\n loginRequest = getLoginRequest();\n } catch {\n loginRequest = null;\n }\n\n if (!loginRequest) {\n return <LoadingIndicator />;\n }\n\n return (\n <MsalAuthenticationTemplate\n interactionType={InteractionType.Redirect}\n authenticationRequest={loginRequest}\n loadingComponent={() => <LoadingIndicator />}\n errorComponent={(props) => <PasswordResetRedirect {...props} />}\n >\n <Route {...routeProps} />\n </MsalAuthenticationTemplate>\n );\n }\n\n if (!userHasAccessToTenant && user?.statusCode === 200) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have access to this tenant. Please select a different Tenant.'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (rolesMap?.has(routeProps.location?.pathname) && !menuIsActive) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'Trying to access inactive menu. Please check your menu configurations'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (!user?.isUnitySystemAdmin && rolesMap?.size > 0 && !userHasRoles) {\n return (\n <Route\n path='*'\n render={() => (\n <PageForbiddenRoute\n message={t(\n 'You do not have the required roles to access this page. Please contact an administrator to get access'\n )}\n showButton={false}\n />\n )}\n />\n );\n }\n\n if (user?.statusCode === 200) {\n return <Route {...routeProps} />;\n }\n\n return <LoadingIndicator />;\n};\n","import React from 'react';\nimport { Route, RouteProps } from 'react-router-dom';\nimport { useRegisterRoute } from './useRegisterRoute';\n\n/**\n * Route that is always treated as public.\n * Useful for pages that should bypass auth gating and shell blocking.\n */\nexport interface PublicRouteProps extends RouteProps {\n /**\n * When true, allows public pages to attempt silent auth for downstream calls.\n */\n attemptSilentAuth?: boolean;\n}\n\nexport const PublicRoute = ({\n attemptSilentAuth = false,\n ...props\n}: PublicRouteProps) => {\n useRegisterRoute({ isPublic: true, attemptSilentAuth });\n\n // Returns the actual Route component so it works inside Switch (v5) or as a direct route\n return <Route {...props} />;\n};\n","import React, { Suspense, lazy } from 'react';\nimport { Route, Switch, Redirect } from 'react-router-dom';\nimport { PrivateRoute } from './PrivateRoute';\nimport { UdpPageEnums } from '../enums/pageEnums';\nimport { ConfigService } from '../configService';\nimport { PageLoading } from '../UI/feedback/PageLoading';\nimport { PublicRoute } from './PublicRoute';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\n\n// Lazy load route components\nconst VirtualBrowser = lazy(() =>\n import('../maintenanceEngine/virtualBrowser/VirtualBrowser')\n);\nconst MenuPage = lazy(() => import('../menuPage/MenuPage'));\nconst UdpPublicForm = lazy(() => import('../udp/pages/UdpFormsPublicForm'));\nconst WorkflowContainer = lazy(() => import('../workflow/WorkflowContainer'));\nconst PasswordResetRedirect = lazy(() =>\n import('./components/PasswordResetRedirect')\n);\nconst MyExportsPage = lazy(() => import('../udp/export/MyExportsPage'));\nconst PageNotFoundRoute = lazy(() => import('./components/PageNotFoundRoute'));\nconst UdpMaintenanceConfigPage = lazy(() =>\n import('../udp/pages/UdpMaintenanceConfigPage')\n);\nconst UdpMaintenanceEnginePage = lazy(() =>\n import('../udp/pages/UdpMaintenanceEnginePage')\n);\nconst AadCallback = lazy(() => import('../utilities/auth/AadCallback'));\n\nconst UdpTransactionsPage = lazy(() =>\n import('../udp/pages/UdpTransactionsPage')\n);\n\nconst UdpTransactionTypesPage = lazy(() =>\n import('../udp/pages/UdpTransactionTypesPage')\n);\n\nconst PageContainer = lazy(() =>\n import('../page/PageContainer').then((module) => ({\n default: module.PageContainer\n }))\n);\n\nconst Reports = lazy(() => import('../reports/Reports'));\n\nconst Inquiry = lazy(() =>\n import('../inquiry/Inquiry').then((module) => ({ default: module.Inquiry }))\n);\n\nexport const UdpRoutes = (props) => {\n const { homeRoute, ...other } = props;\n const { leftMenuLoading } = useMenuContext();\n return (\n <Suspense fallback={<PageLoading />}>\n <Switch>\n {homeRoute && <Redirect exact from='/' to={homeRoute} />}\n {leftMenuLoading && <Route exact path='/' component={PageLoading} />}\n <PrivateRoute\n path='/virtual/:id'\n render={(props) => <VirtualBrowser {...props} {...other} />}\n />\n <PrivateRoute\n path='/menupage/:id'\n render={(props) => <MenuPage {...props} {...other} />}\n />\n\n <PublicRoute\n path={`/page/${UdpPageEnums.Udp_Forms_Renderer_Page_Public}`}\n render={(props) => <UdpPublicForm {...props} {...other} />}\n />\n <PublicRoute\n path={`/passwordresetsuccess`}\n render={(props) => <PasswordResetRedirect props={props} />}\n />\n <PrivateRoute\n path='/workflowtask/:id'\n render={(props) => <WorkflowContainer {...props} {...other} />}\n />\n <PrivateRoute\n path='/myexports'\n render={(props) => (\n <MyExportsPage\n productId={ConfigService.config.UNITY_PRODUCT_ID}\n {...props}\n {...other}\n />\n )}\n />\n <PrivateRoute\n path='/crudbrowser'\n render={(props) => <UdpMaintenanceEnginePage {...props} />}\n />\n <PrivateRoute\n path='/tablebrowser'\n render={(props) => <UdpMaintenanceConfigPage {...props} />}\n />\n\n <Route path='/aad_callback' component={AadCallback} />\n <PrivateRoute\n path='/transactionsPage'\n render={(props) => <UdpTransactionsPage {...props} />}\n />\n <PrivateRoute\n path='/transactionTypesPage'\n render={(props) => <UdpTransactionTypesPage {...props} />}\n />\n <PrivateRoute path='/reports/:id' exact component={Reports} />\n <PrivateRoute\n path='/inquiry/:id'\n render={(props) => <Inquiry {...props} />}\n />\n <PrivateRoute\n path='/page/:id'\n render={(props) => <PageContainer fromMenu={true} {...props} />}\n />\n <PrivateRoute path='*' component={PageNotFoundRoute} />\n </Switch>\n </Suspense>\n );\n};\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -149,9 +149,9 @@ import { n as corporateColorsHint, r as productCategoryColors, t as corporateCol
149
149
  import { ThemeProvider, useSystemColor, useTheme } from "./utilities/theme/index.js";
150
150
  import { t as PageStatus } from "./PageStatus-C-kVMouE.js";
151
151
  import { t as PageForbiddenRoute } from "./PageForbiddenRoute-LzOoMfuJ.js";
152
- import { n as getRouteRolesMapAndMenuActiveMap, t as getMenuItemsRecursively } from "./menuUtilities-CZa7kUTV.js";
153
- import { n as useLocalUserActions, o as MenuProvider, r as useUserActions, s as useMenuContext } from "./TenantProvider-Bmp6YdE2.js";
154
- import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "./UdpRoutes-C7Dmc6Pv.js";
152
+ import { n as getMenuItemsRecursively, r as getRouteRolesMapAndMenuActiveMap, t as findHomeRouteSlug } from "./menuUtilities-BIiFWeWA.js";
153
+ import { n as useLocalUserActions, o as MenuProvider, r as useUserActions, s as useMenuContext } from "./TenantProvider-r35vfTMk.js";
154
+ import { n as PublicRoute, r as PrivateRoute, t as UdpRoutes } from "./UdpRoutes-ClaIhJIi.js";
155
155
  import { LoadingIndicator } from "./UI/loading/LoadingIndicator/index.js";
156
156
  import { a as storePath, i as storeInitialPath, n as getStoredPath, o as storeRedirectPath, r as storeCurrentPath, t as clearStoredPath } from "./LocalRedirectUrlStorage-D46ZyuMk.js";
157
157
  import { t as PasswordResetRedirect } from "./PasswordResetRedirect-BuWVcybJ.js";
@@ -166,11 +166,11 @@ import { i as InquiryHeaderTitleTarget, n as InquiryHeaderControlTarget, r as In
166
166
  import { n as useCurrentPageReturnTo, r as useIsAuthed, t as useAuthedUser } from "./useAuthedUser-117rOeGZ.js";
167
167
  import { t as useDefaultFormValues } from "./useDefaultFormValues-DEhrc770.js";
168
168
  import { t as ActionProvider } from "./ActionProvider-CEt8Z5bT.js";
169
- import { n as FluentProfileMenuCard } from "./profile-DsCMe9Hd.js";
169
+ import { n as FluentProfileMenuCard } from "./profile-grsbAKwd.js";
170
170
  import { n as getStoredExternalPath, r as storeExternalPath, t as clearStoredExternalPath } from "./ExternalRedirectUrlStorage-B80_V9pU.js";
171
- import { n as createUser, t as AuthProvider } from "./AuthProvider-DeOuedJL.js";
171
+ import { n as createUser, t as AuthProvider } from "./AuthProvider-BUi9oEtK.js";
172
172
  import { AuthProviderWrapper, useAccessToken, useSingleLogout } from "./utilities/auth/index.js";
173
- import { t as Shell } from "./Shell-DDMO_nHU.js";
173
+ import { t as Shell } from "./Shell--4lbPR7c.js";
174
174
  import { UdpStepper } from "./UI/stepper/index.js";
175
175
  import { n as FluentSimpleTab, t as FluentSimpleTabs } from "./FluentSimpleTabs-DESD8CK6.js";
176
176
  import { PAHAdditionalTitleComponent, UtilityTabHeader } from "./UI/utilityDisplay/utilityHeader/index.js";
@@ -310,7 +310,7 @@ import { n as FieldType, t as FieldArrayCard } from "./FieldArrayCard-Bna7N7_E.j
310
310
  import { n as ApprovalIcon, t as RejectIcon } from "./RejectIcon-Cvqx_oPs.js";
311
311
  import { t as MyExportsPage } from "./MyExportsPage-BroILsIj.js";
312
312
  import { UdpAccordion, UdpAutocomplete, UdpAvatar, UdpBadge, UdpButton, UdpCard, UdpCheckbox, UdpChip, UdpCompoundButton, UdpContainerQuery, UdpContainerQueryGrid, UdpCounterBadge, UdpDateInput, UdpDatePicker, UdpDateTimeInput, UdpDialog, UdpDivider, UdpDrawer, UdpDropdown, UdpDurationInput, UdpFlexbox, UdpIcon, UdpIconButton, UdpIconGrid, UdpImage, UdpLink, UdpList, UdpListItem, UdpMenu, UdpMessageBar, UdpPopover, UdpPrimaryActionHeader, UdpProgressBar, UdpRadioGroup, UdpSearchInput, UdpSlider, UdpSpinner, UdpSwatchPicker, UdpSwitch, UdpTablist, UdpText, UdpTextInput, UdpTextarea, UdpTimeInput, UdpToggleButton, UdpTooltip, UdpTree, UdpTreeContext, UdpTreeItem, UdpVerticalSpacer } from "./UI/fluent-web-components/index.js";
313
- import { n as getI18nInstance, r as initializeUnityI18n, t as UdpAppProvider } from "./UdpAppProvider-CR2R5W7e.js";
313
+ import { n as getI18nInstance, r as initializeUnityI18n, t as UdpAppProvider } from "./UdpAppProvider-sZs_gHCc.js";
314
314
  import { t as UdpMaintenanceConfigPage } from "./UdpMaintenanceConfigPage-DzqJeImf.js";
315
315
  import "./errorBoundary/index.js";
316
316
  import { UdpPagesLazy, UdpPagesLoaders } from "./udp/pages/UdpPagesLazy/index.js";
@@ -1597,6 +1597,6 @@ const TransactionAttachmentPdfStitcher = (props) => {
1597
1597
  })));
1598
1598
  };
1599
1599
  //#endregion
1600
- export { ADUserTypeEnums, Accordion, AccountFlags, ActionContext, ActionDispatchContext, ActionForm, ActionModal, ActionPanelPlacement, ActionProvider, ActionSideSheet, ActionSpeedDial, ActionSplitScreen, ActionSummaryCard, ActionSummaryHeader, ActionSummaryListContainer, ActionSummaryListItem, ActionSummaryPopover, ActionWrapper, ActionsRenderer, AddUser, AddressListItem, Adornment, AgTable, AgTableButtons, AlertContainer, AlertFlag, AmChart, AmbientAlert, AmbientAutoComplete, AmbientCard, AmbientCardButton, AmbientCardTitle, AmbientDateRangeSelector, AmbientGridTemplate, AmbientList, AmbientListItem, AmbientPopoverMenuItem, AmbientProjectSwitcher, AmbientSingleDateSelector, AmbientSplitStatCard, AmbientStepper, AmbientSummaryListHeader, AmbientTextField, AmbientToast, AmbientToggleButton, AmbientToggleButtonGroup, AmbientTokenButton, AmbientVisualizationCard, AmbientVisualizer, ApiMethodInstanceUdpGrid, AppMenu, AppMenuItem, AppMenuItemComponent, ApprovalIcon, Attachments, AuthProvider, AuthProviderWrapper, AutoCompletePropertyWidget_exports as AutoCompletePropertyWidget, AvatarAlphabet, BackwardsCompatibleGrid, BarChartWidget_exports as BarChartWidget, BaseSideSheet, BioCard, Block, BooleanPropertyWidget_exports as BooleanPropertyWidget, Box, BreadCrumbMenu, BubbleWidget_exports as BubbleWidget, CardList, CardinalityTypeEnums, ChatContainer, ChatMessage, CheckboxGroup, CheckboxList, ChipAlphabet, CircleGaugeWidget, CircularProgress, CkRichEditor, ClickOpenEnums, ClientSideUdpGrid, ColorKey, CompactCard, CompactDataList, CompactDataListItem, ConfigService, ContainerTypeEnums, ContentContainer, Controls, CoreLayoutFloorplan, CrudForm, CustomMenuPage, DateField, DatePropertyWidget_exports as DatePropertyWidget, DateTimeField, DateTimePropertyWidget_exports as DateTimePropertyWidget, DateTrendWidget_exports as DateTrendWidget, DensePlotWidget_exports as DensePlotWidget, DeviceTypeEnums, DiffChecker, Directory, DirectoryListItem, Divider, DonutChartWidget_exports as DonutChartWidget, DragDropFileUpload, DraggableSidebarTemplate, DynamicContainerWithMenu, EMPTY_GUID, Ellipse, EmptyStateDisplay, EntityAttributeEnums, EntityHeader, ExecuteApiDialog, ExpandRenderer, ExportSidesheet, ExtenderToggle, Field, FieldArrayCard, FieldType, FileUpload, FileViewer, FilterOperators, FilterSearch, FlagBlock, FloatPropertyWidget_exports as FloatPropertyWidget, FluentActivity, FluentActivityRow, FluentButton, FluentCard, FluentCardActions, FluentCardContent, FluentCardHeader, FluentCardText, FluentCheckbox, FluentColorPicker, FluentCompoundButton, FluentDataTable, FluentDatePicker, FluentDateTimePicker, FluentDialog, FluentIcon, FluentIconButton, FluentImageMap, FluentLink, FluentListElement, FluentListItem, FluentMap, FluentMenuListButton, FluentMenuListItem, FluentProfileMenuCard, FluentRadio, FluentRadioGroup, FluentScrollLoadAutocompleteMenu, FluentSearchField, FluentSelectGroupMenu, FluentSelectMenu, FluentSideNav, FluentSimpleSelect, FluentSimpleTab, FluentSimpleTabs, FluentTabPanel, FluentTabUtility, FluentTagField, FluentTagFieldComponent, FluentTextField, FluentTextFieldAutoComplete, FluentTextFieldComponent, FluentTimePicker, FluentTimeline, FluentToggle, FluentUploadButton, FluentUploadIconButton, Form, FormButtons, FormControl, FormControlLabel, FormError, FormHeader, FormSpy, FormSubHeader, FullScreenControl, GaugeWidget, GeoMap, GraphCard, Grid, GridActionBar, GridEnums, GridExcelStyleEnums, GridGroup, GridGroupingHeader, GridGroupingSidebar, GridRow, GridSidebarContainer, GridStateTypeEnums, GridUnit, HeaderExpander, HeaderLayout, IconButtonWithTooltip, IconKey, IconRenderer, IframeContainer, ImageLayer, ImportDataFromFileMapping, IndicatorChip, InfoCard, InputAdornment, InputFieldType, Inquiry, InquiryAdvancedSearch, InquiryAdvancedSearchForm, InquiryContainer, InquiryDashboard, InquiryHeaderControl, InquiryHeaderControlTarget, InquiryHeaderSecondary, InquiryHeaderSecondaryAlert, InquiryHeaderSecondaryAlertTarget, InquiryHeaderSecondaryTarget, InquiryHeaderTitle, InquiryHeaderTitleTarget, InquiryNodeControls, InquirySearchContainer, InquirySearchDatasource, InquirySearchTable, InquiryTreeMenu, InquiryTreeMenuItem, InquiryWrapper, InsightRenderer, IntegerPropertyWidget_exports as IntegerPropertyWidget, ItemDescription, ItemsWidgetCard, JobStatusIdMapping, JobTypeIdMapping, KeyValueTextField, Layers, LayoutUnit, LicenseKey, LineAndSparklinesWidget_exports as LineAndSparklinesWidget, LineGraphWidget_exports as LineGraphWidget, LinearProgress, Link, ListCard, ListElement, ListSearch, LoadingIndicator, LogicalSearchOperatorEnums, LoginForm, LookupTypeEnums, LookupTypeIdEnums, MAX_FILE_SIZE_MB, Map, MapFilterBar, MapLayout, MapSheet, MenuItemEnums, MenuProvider, MenuTypeEnums, MttMainTimeline, MttSummary, MttTimeline, MultilineTextPropertyWidget_exports as MultilineTextPropertyWidget, MyExportsPage, NavLink, NestParent, NestWrapper, NestedGrid, NewsCard, NodeActionEnums, NodeActionTriggerEnums, NodeColumnHeader, NodeDetails, NodeGroupOutlierEnums, NodeGroupTypeEnums, NodeList, NodeLoader, Note, Notes, NotesScreen, NotificationElement, NumericPropertyWidget_exports as NumericPropertyWidget, OpenPage, OutlookCallback, OutlookIntegrationBanner, OutlookIntegrationCallbackPage, OutlookIntegrationSideSheet, PAHAdditionalRightComponent, PAHAdditionalTitleComponent, PAHExport, PDFViewer, Page, PageContainer, PageContent, PageForbiddenRoute, PageHeader, PageLoading, PageNotFoundRoute, PageRenderer, PageSectionHeader, PageSectionSpacer, PageStatus, PageSubHeaderAction, PageSubHeaderActionsTarget, PanelPositionEnums, ParamsMappingForm, PasswordResetRedirect, PaymentForm, PaymentMethodTypeEnum, PaymentReversalForm, PaymentTenderTypeEnum, PaymentVendorFactoryEnum, PopoverCard, PowerBIReport, PrimaryActionButton, PrimaryActionHeader, PrivateRoute, ProductEnums, ProductNameEnums, ProgressBarWidget_exports as ProgressBarWidget, Prompt, PropertyField, PropertyFields, PropertyTypeEnum, PublicRoute, QuickViewCard, RecentlyLoadedNodesTable, RecentlyLoadedNodesWidget_exports as RecentlyLoadedNodesWidget, Redirect, RejectIcon, RemindersScreen, RemindersWidget_exports as RemindersWidget, RequiredFieldsMappingForm, RoleIdEnums, RoleNameEnums, RoleTypeEnums, Route, SapFlexibleTemplate, SearchGroupingType, SearchMethodUdpGrid, SearchOperators, SearchServiceDatasource, SearchSortDirection, SearchValueType, SelectGroupMenu, SelectPropertyWidget_exports as SelectPropertyWidget, ServerSideUdpGrid, SeverityTypeEnums, Shell, ShellDropdown, SideBarTemplate, SideSheet, SideSheetHeader, SiteHeaderRightComponent, SiteHeaderRightComponentTarget, SparklineWidget_exports as SparklineWidget, SparsePlotWidget_exports as SparsePlotWidget, SplitScreenTypeEnums, StandardTitle, Statistic, StatusCellRenderer, StatusChip, StatusLineItem, Sticky, StylizedTitle, SubHeaderAction, SubHeaderActionsTarget, SubmitButton, SummaryBlock, SupportCaseSideSheet, SvgIcon, Switch, TableColumnDefs, TableContainer, TeleportSource, TenantTypeEnums, TestFullStencilPage, TestStencilWrappedComponentsPage, TextPropertyWidget_exports as TextPropertyWidget, ThemeProvider, TicketCard, TileDisplay, TileLayer, TimeField, TimeLine, TimePropertyWidget_exports as TimePropertyWidget, TimelineCalendar, TimelinePreloaderNode, ToggleSection, Token, TokenGroupItem, ToolBarButton, TransactionActionTypeEnums, TransactionAttachmentPdfStitcher, TransactionEventTypeEnums, TransactionUiActionTypeEnums, TreeViewModeEnums, TrimForAvatar, Typography, UdpAccordion, UdpAdvancedSearchBuilder, UdpAppProvider, UdpAutocomplete, UdpAvatar, UdpBadge, UdpBarChart, UdpButton, UdpCalendar, UdpCalendarDayView, UdpCalendarMonthView, UdpCalendarWeekView, UdpCalendarYearView, UdpCard, UdpCheckbox, UdpChip, UdpCompoundButton, UdpContainerQuery, UdpContainerQueryGrid, UdpCounterBadge, UdpCrudFormFields, UdpDateInput, UdpDatePicker, UdpDateRangeSelector, UdpDateSelector, UdpDateTimeInput, UdpDetailList, UdpDetailListItem, UdpDialog, UdpDivider, UdpDonutChart, UdpDrawer, UdpDropdown, UdpDurationInput, UdpEnums, UdpFlexbox, UdpFormRenderer, UdpFormsBuilderPage, UdpFormsListPage, UdpFormsSubmissionGrid, UdpFormsSubmissionGridManagerPage, UdpFormsSubmissionGridResponderPage, UdpGridTemplate, UdpIcon, UdpIconButton, UdpIconGrid, UdpImage, UdpKeywordEnums, UdpKpiCard, UdpKpiCards, UdpLineChart, UdpLink, UdpList, UdpListItem, UdpMaintenanceConfigPage, UdpMaintenanceEnginePage, UdpMap, UdpMapComponent, UdpMapToolbar, UdpMenu, UdpMessageBar, UdpPageEnums, UdpPages, UdpPagesLazy, UdpPagesLoaders, UdpPopover, UdpPrimaryActionHeader, UdpPrivateForm, UdpProgressBar, UdpPublicForm, UdpRadioGroup, UdpReminderFiledForType, UdpRoutes, UdpSearchEnums, UdpSearchInput, UdpSlider, UdpSpinner, UdpStepper, UdpSwatchPicker, UdpSwitch, UdpTabPanel, UdpTabUtility, UdpTablist, UdpTabs, UdpText, UdpTextInput, UdpTextarea, UdpTimeInput, UdpTimeSelector, UdpTimeline, UdpTimelineConnector, UdpTimelineContent, UdpTimelineDot, UdpTimelineItem, UdpTimelineSeparator, UdpToggleButton, UdpTooltip, UdpTransactionActionEnums, UdpTransactionEmailForm, UdpTransactionTypesPage, UdpTransactionsPage, UdpTree, UdpTreeContext, UdpTreeItem, UdpVerticalSpacer, UnityFluentIcon, UnityIcon, UnityProducts, UserContext, UserDispatchContext, UserForm, UserFormFields, UtilityBar, UtilityBarInport, UtilityBarInportTarget, UtilityTabHeader, VectorLayer, VerticalEnums, VisibilityTypeEnums, WidgetCard, WorkOrderCard, WorkflowContainer, ZoomControl, acquireAccessToken, allowedExtensions, apiMutate, apiResponseArrayToOptions, arrayMutators, camelToPascalCaseWithSpace, checkAndAuthenticate, checkNodeIsHidden, clearGridState, clearStoredExternalPath, clearStoredPath, clearStoredTenant, collapseAllNodes, colors, constructBusinessObjectArrFromTree, constructDynamicNodeGroups, constructDynamicNodeGroups2, constructPreloadedTree, constructStaticNodeGroups, corporateColors, corporateColorsHint, createTimeline, createUser, csvStrToArray, csvStrToArrayOfObjects, defaultColumnActionsDef, deleteGridState, deleteNode, deleteNodeAndChildren, disconnect, ensureOutlookStatusLoaded, evaluateRule, exchangeAuthorizationCode, executeQueryAdHoc, executeQueryInstance, executeQueryInstanceWithApiMethodInstance, executeQueryWithParameters, expandAllNodes, findAllParentIds, findLastNode, findNodeById, findNodeByIdAndLabel, findNodesByIdAndLabel, findTermByType, fluentLibraryIcons, formatBytes, mttFunctions_exports as formatDataWithTimelineCategoryNameOrderedByDate, formatDateToLocaleString, formatTreeLabel, formatTreeMenuItem, generatePath, getAccessToken, getAllChildrenNodesToDelete, getApiAccessScope, getApiMethodIdByPath, getAuthorizeUrl, getBaseMethod, getCommonEntityName, getDisplayDetails, getDisplayName, getEntityAttributes, getFieldValuesForProperties, getFullyQualifiedName, getGridState, getHeaderTitle, getI18nInstance, getIconFromName, getLazyLoadChildrenArr, getLoginRequest, getMenuItemsRecursively, getMergedConfig, getNodeIdForRightBorder, getOrderedDynamicGroups, getOutlookRedirectUri, getOutlookStatus, getPathObject, getPathParametersObj, getPrimaryKeyValues, getPropertiesForFieldValues, getPropertyMappingList, getPropertyMappingObj, getRatio, getRouteRolesMapAndMenuActiveMap, getSanitizedName, getSearchIdentifiers, getSearchObject, getSearchValueString, getSignInAuthProvider, getStatus, getStoredExternalPath, getStoredPath, getStoredTenant, getSuccessAction, getTokenRequest, getUnityIconFromName, greyScale, handleResponseErrors, initSignInAuthProvider, initializeUnityI18n, isOutlookConnected, loginRedirect, makeDynamicGroupStructures, makeDynamicTreeStructure, makeTreeStaticGroupStructure, makeTreeStructure, mapNodeGroupChildren, mapNodeObjValuesToSearchParameters, mapRule, mapRuleData, matchPath, onFirstDataRendered, parseSearchParamsIntoFilterObjects, pluralize, processCatalogObjectKeysInOrder, processItemForDynamicNodeGroups, processItemForStaticNodeGroup, processObjIndex, processObjectToTree, processOrderedTreeData, processReferences, productCategoryColors, refreshOutlookStatus, removeWhiteSpace, resetOutlookStatus, saveGridState, searchForMatchingNode, searchTree, sendMail, setOutlookDisconnected, storeCurrentPath, storeExternalPath, storeInitialPath, storeInitialTenant, storePath, storeRedirectPath, storeTenant, subscribeOutlookStatus, toLowerFirstChar, toTitleCase, toUpperFirstChar, toUtcDate, toggleHeader, transformMenuPageTree, trimStringAfter, unityIcons, updateTreeIds, useAccessToken, useActionState, useActions, useAgGridApi, useAllTeleporters, useApiCatalog, useAuthedUser, useAxiosGet, useAxiosGetQuery, useAxiosMutate, useCatalogStore, useControlZoom, useConvertFilterModelToSearchFilters, useCrudActions, useCurrentPageReturnTo, useDateLocale, useDefaultFormValues, useDynamicListCalculation, useExport, useField, useFieldChangeListener, useFluentIcon, useForm, useFormState, useGridClear, useGridFormat, useHandleAction, useHandleAxiosSnackbar, useHistory, useIsAuthed, useIsUnityAuthenticated, useItemSubCard, useLocalUserActions, useLocation, useLoginAction, useLogoutAction, useLookupsStore, useMenuContext, useNoticeUpdate, useOutlook, usePageContext, useParams, usePosition, useProductVersion, usePromotedLookupMethods, usePromotedMethodEntity, useQueryExecutors, useQuickFilter, useRouteMatch, useScreenControl, useSearchFilterParamsMap, useServerSideDatasource, useSetInitialShellVisibility, useSetLocationState, useShellStore, useSingleLogout, useStyles, useSystemColor, useTenant, useTenantStore, useTheme, useTypeScale, useUdpExport, useUdpWebSocket, useUser, useUserActions, useWorkflowStore, verticalPrimary, verticalSecondary, whitelistedPaths, withRouter };
1600
+ export { ADUserTypeEnums, Accordion, AccountFlags, ActionContext, ActionDispatchContext, ActionForm, ActionModal, ActionPanelPlacement, ActionProvider, ActionSideSheet, ActionSpeedDial, ActionSplitScreen, ActionSummaryCard, ActionSummaryHeader, ActionSummaryListContainer, ActionSummaryListItem, ActionSummaryPopover, ActionWrapper, ActionsRenderer, AddUser, AddressListItem, Adornment, AgTable, AgTableButtons, AlertContainer, AlertFlag, AmChart, AmbientAlert, AmbientAutoComplete, AmbientCard, AmbientCardButton, AmbientCardTitle, AmbientDateRangeSelector, AmbientGridTemplate, AmbientList, AmbientListItem, AmbientPopoverMenuItem, AmbientProjectSwitcher, AmbientSingleDateSelector, AmbientSplitStatCard, AmbientStepper, AmbientSummaryListHeader, AmbientTextField, AmbientToast, AmbientToggleButton, AmbientToggleButtonGroup, AmbientTokenButton, AmbientVisualizationCard, AmbientVisualizer, ApiMethodInstanceUdpGrid, AppMenu, AppMenuItem, AppMenuItemComponent, ApprovalIcon, Attachments, AuthProvider, AuthProviderWrapper, AutoCompletePropertyWidget_exports as AutoCompletePropertyWidget, AvatarAlphabet, BackwardsCompatibleGrid, BarChartWidget_exports as BarChartWidget, BaseSideSheet, BioCard, Block, BooleanPropertyWidget_exports as BooleanPropertyWidget, Box, BreadCrumbMenu, BubbleWidget_exports as BubbleWidget, CardList, CardinalityTypeEnums, ChatContainer, ChatMessage, CheckboxGroup, CheckboxList, ChipAlphabet, CircleGaugeWidget, CircularProgress, CkRichEditor, ClickOpenEnums, ClientSideUdpGrid, ColorKey, CompactCard, CompactDataList, CompactDataListItem, ConfigService, ContainerTypeEnums, ContentContainer, Controls, CoreLayoutFloorplan, CrudForm, CustomMenuPage, DateField, DatePropertyWidget_exports as DatePropertyWidget, DateTimeField, DateTimePropertyWidget_exports as DateTimePropertyWidget, DateTrendWidget_exports as DateTrendWidget, DensePlotWidget_exports as DensePlotWidget, DeviceTypeEnums, DiffChecker, Directory, DirectoryListItem, Divider, DonutChartWidget_exports as DonutChartWidget, DragDropFileUpload, DraggableSidebarTemplate, DynamicContainerWithMenu, EMPTY_GUID, Ellipse, EmptyStateDisplay, EntityAttributeEnums, EntityHeader, ExecuteApiDialog, ExpandRenderer, ExportSidesheet, ExtenderToggle, Field, FieldArrayCard, FieldType, FileUpload, FileViewer, FilterOperators, FilterSearch, FlagBlock, FloatPropertyWidget_exports as FloatPropertyWidget, FluentActivity, FluentActivityRow, FluentButton, FluentCard, FluentCardActions, FluentCardContent, FluentCardHeader, FluentCardText, FluentCheckbox, FluentColorPicker, FluentCompoundButton, FluentDataTable, FluentDatePicker, FluentDateTimePicker, FluentDialog, FluentIcon, FluentIconButton, FluentImageMap, FluentLink, FluentListElement, FluentListItem, FluentMap, FluentMenuListButton, FluentMenuListItem, FluentProfileMenuCard, FluentRadio, FluentRadioGroup, FluentScrollLoadAutocompleteMenu, FluentSearchField, FluentSelectGroupMenu, FluentSelectMenu, FluentSideNav, FluentSimpleSelect, FluentSimpleTab, FluentSimpleTabs, FluentTabPanel, FluentTabUtility, FluentTagField, FluentTagFieldComponent, FluentTextField, FluentTextFieldAutoComplete, FluentTextFieldComponent, FluentTimePicker, FluentTimeline, FluentToggle, FluentUploadButton, FluentUploadIconButton, Form, FormButtons, FormControl, FormControlLabel, FormError, FormHeader, FormSpy, FormSubHeader, FullScreenControl, GaugeWidget, GeoMap, GraphCard, Grid, GridActionBar, GridEnums, GridExcelStyleEnums, GridGroup, GridGroupingHeader, GridGroupingSidebar, GridRow, GridSidebarContainer, GridStateTypeEnums, GridUnit, HeaderExpander, HeaderLayout, IconButtonWithTooltip, IconKey, IconRenderer, IframeContainer, ImageLayer, ImportDataFromFileMapping, IndicatorChip, InfoCard, InputAdornment, InputFieldType, Inquiry, InquiryAdvancedSearch, InquiryAdvancedSearchForm, InquiryContainer, InquiryDashboard, InquiryHeaderControl, InquiryHeaderControlTarget, InquiryHeaderSecondary, InquiryHeaderSecondaryAlert, InquiryHeaderSecondaryAlertTarget, InquiryHeaderSecondaryTarget, InquiryHeaderTitle, InquiryHeaderTitleTarget, InquiryNodeControls, InquirySearchContainer, InquirySearchDatasource, InquirySearchTable, InquiryTreeMenu, InquiryTreeMenuItem, InquiryWrapper, InsightRenderer, IntegerPropertyWidget_exports as IntegerPropertyWidget, ItemDescription, ItemsWidgetCard, JobStatusIdMapping, JobTypeIdMapping, KeyValueTextField, Layers, LayoutUnit, LicenseKey, LineAndSparklinesWidget_exports as LineAndSparklinesWidget, LineGraphWidget_exports as LineGraphWidget, LinearProgress, Link, ListCard, ListElement, ListSearch, LoadingIndicator, LogicalSearchOperatorEnums, LoginForm, LookupTypeEnums, LookupTypeIdEnums, MAX_FILE_SIZE_MB, Map, MapFilterBar, MapLayout, MapSheet, MenuItemEnums, MenuProvider, MenuTypeEnums, MttMainTimeline, MttSummary, MttTimeline, MultilineTextPropertyWidget_exports as MultilineTextPropertyWidget, MyExportsPage, NavLink, NestParent, NestWrapper, NestedGrid, NewsCard, NodeActionEnums, NodeActionTriggerEnums, NodeColumnHeader, NodeDetails, NodeGroupOutlierEnums, NodeGroupTypeEnums, NodeList, NodeLoader, Note, Notes, NotesScreen, NotificationElement, NumericPropertyWidget_exports as NumericPropertyWidget, OpenPage, OutlookCallback, OutlookIntegrationBanner, OutlookIntegrationCallbackPage, OutlookIntegrationSideSheet, PAHAdditionalRightComponent, PAHAdditionalTitleComponent, PAHExport, PDFViewer, Page, PageContainer, PageContent, PageForbiddenRoute, PageHeader, PageLoading, PageNotFoundRoute, PageRenderer, PageSectionHeader, PageSectionSpacer, PageStatus, PageSubHeaderAction, PageSubHeaderActionsTarget, PanelPositionEnums, ParamsMappingForm, PasswordResetRedirect, PaymentForm, PaymentMethodTypeEnum, PaymentReversalForm, PaymentTenderTypeEnum, PaymentVendorFactoryEnum, PopoverCard, PowerBIReport, PrimaryActionButton, PrimaryActionHeader, PrivateRoute, ProductEnums, ProductNameEnums, ProgressBarWidget_exports as ProgressBarWidget, Prompt, PropertyField, PropertyFields, PropertyTypeEnum, PublicRoute, QuickViewCard, RecentlyLoadedNodesTable, RecentlyLoadedNodesWidget_exports as RecentlyLoadedNodesWidget, Redirect, RejectIcon, RemindersScreen, RemindersWidget_exports as RemindersWidget, RequiredFieldsMappingForm, RoleIdEnums, RoleNameEnums, RoleTypeEnums, Route, SapFlexibleTemplate, SearchGroupingType, SearchMethodUdpGrid, SearchOperators, SearchServiceDatasource, SearchSortDirection, SearchValueType, SelectGroupMenu, SelectPropertyWidget_exports as SelectPropertyWidget, ServerSideUdpGrid, SeverityTypeEnums, Shell, ShellDropdown, SideBarTemplate, SideSheet, SideSheetHeader, SiteHeaderRightComponent, SiteHeaderRightComponentTarget, SparklineWidget_exports as SparklineWidget, SparsePlotWidget_exports as SparsePlotWidget, SplitScreenTypeEnums, StandardTitle, Statistic, StatusCellRenderer, StatusChip, StatusLineItem, Sticky, StylizedTitle, SubHeaderAction, SubHeaderActionsTarget, SubmitButton, SummaryBlock, SupportCaseSideSheet, SvgIcon, Switch, TableColumnDefs, TableContainer, TeleportSource, TenantTypeEnums, TestFullStencilPage, TestStencilWrappedComponentsPage, TextPropertyWidget_exports as TextPropertyWidget, ThemeProvider, TicketCard, TileDisplay, TileLayer, TimeField, TimeLine, TimePropertyWidget_exports as TimePropertyWidget, TimelineCalendar, TimelinePreloaderNode, ToggleSection, Token, TokenGroupItem, ToolBarButton, TransactionActionTypeEnums, TransactionAttachmentPdfStitcher, TransactionEventTypeEnums, TransactionUiActionTypeEnums, TreeViewModeEnums, TrimForAvatar, Typography, UdpAccordion, UdpAdvancedSearchBuilder, UdpAppProvider, UdpAutocomplete, UdpAvatar, UdpBadge, UdpBarChart, UdpButton, UdpCalendar, UdpCalendarDayView, UdpCalendarMonthView, UdpCalendarWeekView, UdpCalendarYearView, UdpCard, UdpCheckbox, UdpChip, UdpCompoundButton, UdpContainerQuery, UdpContainerQueryGrid, UdpCounterBadge, UdpCrudFormFields, UdpDateInput, UdpDatePicker, UdpDateRangeSelector, UdpDateSelector, UdpDateTimeInput, UdpDetailList, UdpDetailListItem, UdpDialog, UdpDivider, UdpDonutChart, UdpDrawer, UdpDropdown, UdpDurationInput, UdpEnums, UdpFlexbox, UdpFormRenderer, UdpFormsBuilderPage, UdpFormsListPage, UdpFormsSubmissionGrid, UdpFormsSubmissionGridManagerPage, UdpFormsSubmissionGridResponderPage, UdpGridTemplate, UdpIcon, UdpIconButton, UdpIconGrid, UdpImage, UdpKeywordEnums, UdpKpiCard, UdpKpiCards, UdpLineChart, UdpLink, UdpList, UdpListItem, UdpMaintenanceConfigPage, UdpMaintenanceEnginePage, UdpMap, UdpMapComponent, UdpMapToolbar, UdpMenu, UdpMessageBar, UdpPageEnums, UdpPages, UdpPagesLazy, UdpPagesLoaders, UdpPopover, UdpPrimaryActionHeader, UdpPrivateForm, UdpProgressBar, UdpPublicForm, UdpRadioGroup, UdpReminderFiledForType, UdpRoutes, UdpSearchEnums, UdpSearchInput, UdpSlider, UdpSpinner, UdpStepper, UdpSwatchPicker, UdpSwitch, UdpTabPanel, UdpTabUtility, UdpTablist, UdpTabs, UdpText, UdpTextInput, UdpTextarea, UdpTimeInput, UdpTimeSelector, UdpTimeline, UdpTimelineConnector, UdpTimelineContent, UdpTimelineDot, UdpTimelineItem, UdpTimelineSeparator, UdpToggleButton, UdpTooltip, UdpTransactionActionEnums, UdpTransactionEmailForm, UdpTransactionTypesPage, UdpTransactionsPage, UdpTree, UdpTreeContext, UdpTreeItem, UdpVerticalSpacer, UnityFluentIcon, UnityIcon, UnityProducts, UserContext, UserDispatchContext, UserForm, UserFormFields, UtilityBar, UtilityBarInport, UtilityBarInportTarget, UtilityTabHeader, VectorLayer, VerticalEnums, VisibilityTypeEnums, WidgetCard, WorkOrderCard, WorkflowContainer, ZoomControl, acquireAccessToken, allowedExtensions, apiMutate, apiResponseArrayToOptions, arrayMutators, camelToPascalCaseWithSpace, checkAndAuthenticate, checkNodeIsHidden, clearGridState, clearStoredExternalPath, clearStoredPath, clearStoredTenant, collapseAllNodes, colors, constructBusinessObjectArrFromTree, constructDynamicNodeGroups, constructDynamicNodeGroups2, constructPreloadedTree, constructStaticNodeGroups, corporateColors, corporateColorsHint, createTimeline, createUser, csvStrToArray, csvStrToArrayOfObjects, defaultColumnActionsDef, deleteGridState, deleteNode, deleteNodeAndChildren, disconnect, ensureOutlookStatusLoaded, evaluateRule, exchangeAuthorizationCode, executeQueryAdHoc, executeQueryInstance, executeQueryInstanceWithApiMethodInstance, executeQueryWithParameters, expandAllNodes, findAllParentIds, findHomeRouteSlug, findLastNode, findNodeById, findNodeByIdAndLabel, findNodesByIdAndLabel, findTermByType, fluentLibraryIcons, formatBytes, mttFunctions_exports as formatDataWithTimelineCategoryNameOrderedByDate, formatDateToLocaleString, formatTreeLabel, formatTreeMenuItem, generatePath, getAccessToken, getAllChildrenNodesToDelete, getApiAccessScope, getApiMethodIdByPath, getAuthorizeUrl, getBaseMethod, getCommonEntityName, getDisplayDetails, getDisplayName, getEntityAttributes, getFieldValuesForProperties, getFullyQualifiedName, getGridState, getHeaderTitle, getI18nInstance, getIconFromName, getLazyLoadChildrenArr, getLoginRequest, getMenuItemsRecursively, getMergedConfig, getNodeIdForRightBorder, getOrderedDynamicGroups, getOutlookRedirectUri, getOutlookStatus, getPathObject, getPathParametersObj, getPrimaryKeyValues, getPropertiesForFieldValues, getPropertyMappingList, getPropertyMappingObj, getRatio, getRouteRolesMapAndMenuActiveMap, getSanitizedName, getSearchIdentifiers, getSearchObject, getSearchValueString, getSignInAuthProvider, getStatus, getStoredExternalPath, getStoredPath, getStoredTenant, getSuccessAction, getTokenRequest, getUnityIconFromName, greyScale, handleResponseErrors, initSignInAuthProvider, initializeUnityI18n, isOutlookConnected, loginRedirect, makeDynamicGroupStructures, makeDynamicTreeStructure, makeTreeStaticGroupStructure, makeTreeStructure, mapNodeGroupChildren, mapNodeObjValuesToSearchParameters, mapRule, mapRuleData, matchPath, onFirstDataRendered, parseSearchParamsIntoFilterObjects, pluralize, processCatalogObjectKeysInOrder, processItemForDynamicNodeGroups, processItemForStaticNodeGroup, processObjIndex, processObjectToTree, processOrderedTreeData, processReferences, productCategoryColors, refreshOutlookStatus, removeWhiteSpace, resetOutlookStatus, saveGridState, searchForMatchingNode, searchTree, sendMail, setOutlookDisconnected, storeCurrentPath, storeExternalPath, storeInitialPath, storeInitialTenant, storePath, storeRedirectPath, storeTenant, subscribeOutlookStatus, toLowerFirstChar, toTitleCase, toUpperFirstChar, toUtcDate, toggleHeader, transformMenuPageTree, trimStringAfter, unityIcons, updateTreeIds, useAccessToken, useActionState, useActions, useAgGridApi, useAllTeleporters, useApiCatalog, useAuthedUser, useAxiosGet, useAxiosGetQuery, useAxiosMutate, useCatalogStore, useControlZoom, useConvertFilterModelToSearchFilters, useCrudActions, useCurrentPageReturnTo, useDateLocale, useDefaultFormValues, useDynamicListCalculation, useExport, useField, useFieldChangeListener, useFluentIcon, useForm, useFormState, useGridClear, useGridFormat, useHandleAction, useHandleAxiosSnackbar, useHistory, useIsAuthed, useIsUnityAuthenticated, useItemSubCard, useLocalUserActions, useLocation, useLoginAction, useLogoutAction, useLookupsStore, useMenuContext, useNoticeUpdate, useOutlook, usePageContext, useParams, usePosition, useProductVersion, usePromotedLookupMethods, usePromotedMethodEntity, useQueryExecutors, useQuickFilter, useRouteMatch, useScreenControl, useSearchFilterParamsMap, useServerSideDatasource, useSetInitialShellVisibility, useSetLocationState, useShellStore, useSingleLogout, useStyles, useSystemColor, useTenant, useTenantStore, useTheme, useTypeScale, useUdpExport, useUdpWebSocket, useUser, useUserActions, useWorkflowStore, verticalPrimary, verticalSecondary, whitelistedPaths, withRouter };
1601
1601
 
1602
1602
  //# sourceMappingURL=index.js.map