udp-react-enterprise-component-library 25.18.1-beta.51 → 25.18.1-beta.53

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 (36) hide show
  1. package/dist/{AuthProvider-V_6y6_xj.js → AuthProvider-C8qG0V63.js} +2 -2
  2. package/dist/{AuthProvider-V_6y6_xj.js.map → AuthProvider-C8qG0V63.js.map} +1 -1
  3. package/dist/{Shell-DunAQ9XC.js → Shell-B6Qxi2hZ.js} +2 -2
  4. package/dist/{Shell-DunAQ9XC.js.map → Shell-B6Qxi2hZ.js.map} +1 -1
  5. package/dist/{TenantProvider-B_fwoUi4.js → TenantProvider-CCrrxyiD.js} +4 -3
  6. package/dist/TenantProvider-CCrrxyiD.js.map +1 -0
  7. package/dist/UI/forms/index.js +1 -1
  8. package/dist/UI/index.js +1 -1
  9. package/dist/{UdpAppProvider-D7D0F8VO.js → UdpAppProvider-BuJv7P-y.js} +3 -3
  10. package/dist/{UdpAppProvider-D7D0F8VO.js.map → UdpAppProvider-BuJv7P-y.js.map} +1 -1
  11. package/dist/{auth-Bq7vHax4.js → auth-DZmqyrT1.js} +2 -2
  12. package/dist/{auth-Bq7vHax4.js.map → auth-DZmqyrT1.js.map} +1 -1
  13. package/dist/{forms-Eqr3TUUl.js → forms-KpO4nIfl.js} +4 -2
  14. package/dist/{forms-Eqr3TUUl.js.map → forms-KpO4nIfl.js.map} +1 -1
  15. package/dist/index.js +8 -8
  16. package/dist/{profile-hGhjTafH.js → profile-BA_cbWI8.js} +3 -3
  17. package/dist/{profile-hGhjTafH.js.map → profile-BA_cbWI8.js.map} +1 -1
  18. package/dist/providers/index.js +1 -1
  19. package/dist/shell/index.js +1 -1
  20. package/dist/shell/ui/profile/index.js +1 -1
  21. package/dist/tenantStore-CFYu7ndZ.js.map +1 -1
  22. package/dist/{theme-Bb8h8tjE.js → theme-_CEHumbt.js} +3 -3
  23. package/dist/theme-_CEHumbt.js.map +1 -0
  24. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts +2 -1
  25. package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts.map +1 -1
  26. package/dist/types/src/stores/tenantStore.d.ts +1 -0
  27. package/dist/types/src/stores/tenantStore.d.ts.map +1 -1
  28. package/dist/types/src/utilities/tenant/TenantProvider.d.ts.map +1 -1
  29. package/dist/types/tsconfig.tsbuildinfo +1 -1
  30. package/dist/utilities/auth/index.js +3 -3
  31. package/dist/utilities/tenant/index.js +1 -1
  32. package/dist/utilities/theme/index.js +1 -1
  33. package/export-map.json +1 -1
  34. package/package.json +1 -1
  35. package/dist/TenantProvider-B_fwoUi4.js.map +0 -1
  36. package/dist/theme-Bb8h8tjE.js.map +0 -1
@@ -4,7 +4,7 @@ import { i as storeTenant, n as getStoredTenant } from "./UnitySessionStorage-CU
4
4
  import { n as UserContext, r as UserDispatchContext } from "./useUser-wpHGo6jU.js";
5
5
  import { w as RoleIdEnums } from "./unitySystemEnums-CZDCsD5t.js";
6
6
  import { t as useAxiosGet } from "./useAxiosGet-CYnt6Hd0.js";
7
- import { t as TenantProvider } from "./TenantProvider-B_fwoUi4.js";
7
+ import { t as TenantProvider } from "./TenantProvider-CCrrxyiD.js";
8
8
  import { t as LoadingIndicator } from "./LoadingIndicator-BBIwYBt5.js";
9
9
  import { t as CustomNavigationClient_default } from "./CustomNavigationClient-CwXe-ZC7.js";
10
10
  import { t as PasswordResetRedirect } from "./PasswordResetRedirect-DDOsXDPA.js";
@@ -216,4 +216,4 @@ const AuthProvider = ({ children, doNotWaitForTenant = true }) => {
216
216
 
217
217
  //#endregion
218
218
  export { createUser as n, AuthProvider as t };
219
- //# sourceMappingURL=AuthProvider-V_6y6_xj.js.map
219
+ //# sourceMappingURL=AuthProvider-C8qG0V63.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider-V_6y6_xj.js","names":["tenantId: any","userTenantPermissions: any","userTenantRoles: any","userTenantProducts: any","roleIds: any","useLocation","CustomNavigationClient","UserProvider"],"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\n //Get user info\n const [{ data: userInfo, error: userError }] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/unityuser`,\n {},\n false,\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 (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, useMemo, useState } from 'react';\nimport {\n initSignInAuthProvider,\n getSignInAuthProvider,\n getLoginRequest,\n} from './signInAuthProvider';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { whitelistedPaths } from './whitelistedPaths';\nimport { InteractionType } from '@azure/msal-browser';\nimport {\n MsalProvider,\n MsalAuthenticationTemplate,\n} from '@azure/msal-react';\nimport { useHistory } from 'react-router-dom';\nimport CustomNavigationClient from '../CustomNavigationClient';\nimport { useLocation } from 'react-use';\nimport UserProvider from './UserProvider';\nimport { PasswordResetRedirect } from '../../routes/components/PasswordResetRedirect';\n\nexport const AuthProvider = ({ children, doNotWaitForTenant = true }) => {\n const [msalInstance, setMsalInstance] = useState(null);\n const [loginRequestInstance, setLoginRequestInstance] = useState(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const history = useHistory();\n const location = useLocation();\n\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 setLoginRequestInstance(getLoginRequest());\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 const [sessionExpiredModalOpen, setSessionExpiredModalOpen] = useState(false);\n const [nonExistingUserModalOpen, setNonExistingUserModalOpen] =\n useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const isWhiteListed = useMemo(() => {\n const url = location.pathname;\n return whitelistedPaths.includes(url ?? '');\n }, [location]);\n\n if (!isInitialized) {\n return <LoadingIndicator />;\n }\n\n if (isWhiteListed) {\n return <MsalProvider instance={msalInstance}>{children}</MsalProvider>;\n }\n\n return (\n <MsalProvider instance={msalInstance}>\n <MsalAuthenticationTemplate\n interactionType={InteractionType.Redirect}\n authenticationRequest={loginRequestInstance}\n loadingComponent={() => <LoadingIndicator />}\n errorComponent={(props) => <PasswordResetRedirect {...props} />}\n >\n <UserProvider\n sessionExpiredModalOpen={sessionExpiredModalOpen}\n setSessionExpiredModalOpen={setSessionExpiredModalOpen}\n setNonExistingUserModalOpen={setNonExistingUserModalOpen}\n setErrorMessage={setErrorMessage}\n isWhiteListed={isWhiteListed}\n doNotWaitForTenant={doNotWaitForTenant}\n >\n {children}\n </UserProvider>\n </MsalAuthenticationTemplate>\n </MsalProvider>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"AuthProvider-C8qG0V63.js","names":["tenantId: any","userTenantPermissions: any","userTenantRoles: any","userTenantProducts: any","roleIds: any","useLocation","CustomNavigationClient","UserProvider"],"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\n //Get user info\n const [{ data: userInfo, error: userError }] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/unityuser`,\n {},\n false,\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 (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, useMemo, useState } from 'react';\nimport {\n initSignInAuthProvider,\n getSignInAuthProvider,\n getLoginRequest,\n} from './signInAuthProvider';\nimport { LoadingIndicator } from '../../UI/loading/LoadingIndicator';\nimport { whitelistedPaths } from './whitelistedPaths';\nimport { InteractionType } from '@azure/msal-browser';\nimport {\n MsalProvider,\n MsalAuthenticationTemplate,\n} from '@azure/msal-react';\nimport { useHistory } from 'react-router-dom';\nimport CustomNavigationClient from '../CustomNavigationClient';\nimport { useLocation } from 'react-use';\nimport UserProvider from './UserProvider';\nimport { PasswordResetRedirect } from '../../routes/components/PasswordResetRedirect';\n\nexport const AuthProvider = ({ children, doNotWaitForTenant = true }) => {\n const [msalInstance, setMsalInstance] = useState(null);\n const [loginRequestInstance, setLoginRequestInstance] = useState(null);\n const [isInitialized, setIsInitialized] = useState(false);\n\n const history = useHistory();\n const location = useLocation();\n\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 setLoginRequestInstance(getLoginRequest());\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 const [sessionExpiredModalOpen, setSessionExpiredModalOpen] = useState(false);\n const [nonExistingUserModalOpen, setNonExistingUserModalOpen] =\n useState(false);\n const [errorMessage, setErrorMessage] = useState('');\n\n const isWhiteListed = useMemo(() => {\n const url = location.pathname;\n return whitelistedPaths.includes(url ?? '');\n }, [location]);\n\n if (!isInitialized) {\n return <LoadingIndicator />;\n }\n\n if (isWhiteListed) {\n return <MsalProvider instance={msalInstance}>{children}</MsalProvider>;\n }\n\n return (\n <MsalProvider instance={msalInstance}>\n <MsalAuthenticationTemplate\n interactionType={InteractionType.Redirect}\n authenticationRequest={loginRequestInstance}\n loadingComponent={() => <LoadingIndicator />}\n errorComponent={(props) => <PasswordResetRedirect {...props} />}\n >\n <UserProvider\n sessionExpiredModalOpen={sessionExpiredModalOpen}\n setSessionExpiredModalOpen={setSessionExpiredModalOpen}\n setNonExistingUserModalOpen={setNonExistingUserModalOpen}\n setErrorMessage={setErrorMessage}\n isWhiteListed={isWhiteListed}\n doNotWaitForTenant={doNotWaitForTenant}\n >\n {children}\n </UserProvider>\n </MsalAuthenticationTemplate>\n </MsalProvider>\n );\n};\n"],"mappings":"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"}
@@ -14,7 +14,7 @@ import { t as UtilityBar } from "./utilityDisplay-DtdjV7V1.js";
14
14
  import { t as FUIAppSwitcher_default } from "./FUIAppSwitcher-LKwANZkK.js";
15
15
  import { t as ActionProvider } from "./ActionProvider-DGzli-X1.js";
16
16
  import { t as ChatBotProvider } from "./ChatBotProvider-CmrKYl2I.js";
17
- import { t as UserProfileMenuWrapper } from "./profile-hGhjTafH.js";
17
+ import { t as UserProfileMenuWrapper } from "./profile-BA_cbWI8.js";
18
18
  import { t as LoadingIndicator } from "./LoadingIndicator-BBIwYBt5.js";
19
19
  import React, { Suspense, useCallback, useEffect, useMemo, useState } from "react";
20
20
  import { Drawer, makeStyles, useMediaQuery, useTheme } from "@material-ui/core";
@@ -286,4 +286,4 @@ Shell.propTypes = {
286
286
 
287
287
  //#endregion
288
288
  export { Shell as t };
289
- //# sourceMappingURL=Shell-DunAQ9XC.js.map
289
+ //# sourceMappingURL=Shell-B6Qxi2hZ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Shell-DunAQ9XC.js","names":["menus","Switch","SiteHeader","NavigationSidebar","FUIAppSwitcher"],"sources":["../src/shell/Shell.jsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback, Suspense } 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 } 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 {\n useSetInitialShellVisibility,\n useShellStore\n} from '../stores/shellStore';\n\nimport { useBuildEnvironment, APP_RIBBON_SPACE } from './ui/useBuildEnvironment';\nimport { ChatBotProvider } from '../utilities/chatBot/ChatBotProvider';\nimport { UserProfileMenuWrapper } from '../shell/ui/profile';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\nimport { LoadingIndicator } from '../UI/loading/LoadingIndicator';\nimport { useTenant } from '../utilities/tenant';\nimport { BrowserRouter, Switch} from 'react-router-dom';\n//import { usePreloadPages } from '../hooks/usePreloadPages';\nimport { PageLoading } from '../UI';\nimport { UdpRoutes } from '../routes';\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\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n ribbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const {\n children,\n useNewRoutes,\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 = true,\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 } = props;\n const contextUser = useUser();\n const user = passedInUser ?? contextUser;\n const { setGetWidget, setIsValidWidget, shellHidden } = useShellStore();\n const [appSwitcherMobile, setAppSwitcherMobile] = useState(false);\n const [appSwitcherDesktop, setAppSwitcherDesktop] = useState(false);\n const { i18n } = useTranslation();\n const inquiryTitle = useInquiryStore((state) => state.title);\n useSetInitialShellVisibility();\n const tenant = useTenant();\n const activeTenant = tenant?.activeTenant ?? null;\n\n //usePreloadPages();\n\n const menuContext = useMenuContext?.();\n const resolvedLeftMenu = leftMenu ?? menuContext?.leftMenu;\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 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 const isUserInitialized = Boolean(user?.id);\n const isTenantInitialized = Boolean(activeTenant?.tenantId);\n const isThemeInitialized = Boolean(theme?.isInitialized);\n\n if (!isUserInitialized || !isTenantInitialized || !isThemeInitialized) {\n return <LoadingIndicator />;\n }\n let enrichedChildren = children;\n if(useNewRoutes)\n enrichedChildren = <Suspense fallback={<PageLoading />}>\n <Switch>{children}<UdpRoutes/></Switch></Suspense>;\n if (hideLayout) {\n return <div>{enrichedChildren}</div>;\n }\n return (\n <ChatBotProvider>\n <ActionProvider>\n <div className={classes.root}>\n {!shellHidden && (\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 {!shellHidden && 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={shellHidden}\n {...props}\n />\n </div>\n )}\n </div>\n\n <div className={classes.content}>\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>{subheader}{enrichedChildren}</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={appSwitcherHeader}\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={appSwitcherHeader}\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([PropTypes.string, PropTypes.element, PropTypes.node]),\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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"}
1
+ {"version":3,"file":"Shell-B6Qxi2hZ.js","names":["menus","Switch","SiteHeader","NavigationSidebar","FUIAppSwitcher"],"sources":["../src/shell/Shell.jsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback, Suspense } 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 } 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 {\n useSetInitialShellVisibility,\n useShellStore\n} from '../stores/shellStore';\n\nimport { useBuildEnvironment, APP_RIBBON_SPACE } from './ui/useBuildEnvironment';\nimport { ChatBotProvider } from '../utilities/chatBot/ChatBotProvider';\nimport { UserProfileMenuWrapper } from '../shell/ui/profile';\nimport { useMenuContext } from '../utilities/menus/MenuProvider';\nimport { LoadingIndicator } from '../UI/loading/LoadingIndicator';\nimport { useTenant } from '../utilities/tenant';\nimport { BrowserRouter, Switch} from 'react-router-dom';\n//import { usePreloadPages } from '../hooks/usePreloadPages';\nimport { PageLoading } from '../UI';\nimport { UdpRoutes } from '../routes';\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\n const buildEnv = useBuildEnvironment();\n const classes = useStyles({\n ...props,\n ribbonSpace: buildEnv ? APP_RIBBON_SPACE : 0\n });\n const {\n children,\n useNewRoutes,\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 = true,\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 } = props;\n const contextUser = useUser();\n const user = passedInUser ?? contextUser;\n const { setGetWidget, setIsValidWidget, shellHidden } = useShellStore();\n const [appSwitcherMobile, setAppSwitcherMobile] = useState(false);\n const [appSwitcherDesktop, setAppSwitcherDesktop] = useState(false);\n const { i18n } = useTranslation();\n const inquiryTitle = useInquiryStore((state) => state.title);\n useSetInitialShellVisibility();\n const tenant = useTenant();\n const activeTenant = tenant?.activeTenant ?? null;\n\n //usePreloadPages();\n\n const menuContext = useMenuContext?.();\n const resolvedLeftMenu = leftMenu ?? menuContext?.leftMenu;\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 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 const isUserInitialized = Boolean(user?.id);\n const isTenantInitialized = Boolean(activeTenant?.tenantId);\n const isThemeInitialized = Boolean(theme?.isInitialized);\n\n if (!isUserInitialized || !isTenantInitialized || !isThemeInitialized) {\n return <LoadingIndicator />;\n }\n let enrichedChildren = children;\n if(useNewRoutes)\n enrichedChildren = <Suspense fallback={<PageLoading />}>\n <Switch>{children}<UdpRoutes/></Switch></Suspense>;\n if (hideLayout) {\n return <div>{enrichedChildren}</div>;\n }\n return (\n <ChatBotProvider>\n <ActionProvider>\n <div className={classes.root}>\n {!shellHidden && (\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 {!shellHidden && 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={shellHidden}\n {...props}\n />\n </div>\n )}\n </div>\n\n <div className={classes.content}>\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>{subheader}{enrichedChildren}</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={appSwitcherHeader}\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={appSwitcherHeader}\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([PropTypes.string, PropTypes.element, PropTypes.node]),\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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"}
@@ -120,10 +120,11 @@ const useTenantStoreSync = (activeTenant) => {
120
120
  setCurrentTenant: state.setCurrentTenant
121
121
  }));
122
122
  useEffect(() => {
123
- if (activeTenant && (storeTenantValue?.tenantId !== activeTenant.tenantId || storeTenantValue?.name !== activeTenant.tenantName || storeTenantValue?.tenantType !== activeTenant.tenantType)) setCurrentTenant({
123
+ if (activeTenant && (storeTenantValue?.tenantId !== activeTenant.tenantId || storeTenantValue?.name !== activeTenant.tenantName || storeTenantValue?.tenantType !== activeTenant.tenantType || storeTenantValue?.theme !== activeTenant.theme)) setCurrentTenant({
124
124
  tenantId: activeTenant.tenantId,
125
125
  name: activeTenant.tenantName,
126
- tenantType: activeTenant.tenantType
126
+ tenantType: activeTenant.tenantType,
127
+ theme: activeTenant?.theme ?? null
127
128
  });
128
129
  }, [
129
130
  activeTenant,
@@ -220,4 +221,4 @@ const TenantProvider = ({ children }) => {
220
221
 
221
222
  //#endregion
222
223
  export { useUserActions as a, useLocalUserActions as i, TenantAccessDialog as n, TenantSelect as r, TenantProvider as t };
223
- //# sourceMappingURL=TenantProvider-B_fwoUi4.js.map
224
+ //# sourceMappingURL=TenantProvider-CCrrxyiD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantProvider-CCrrxyiD.js","names":["TenantAccessDialog: React.FC<TenantAccessDialogProps>"],"sources":["../src/utilities/auth/users.js","../src/utilities/tenant/TenantSelect.tsx","../src/utilities/tenant/TenantAccessDialog.tsx","../src/utilities/tenant/TenantProvider.jsx"],"sourcesContent":["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, { forwardRef, useMemo, useCallback } from 'react';\nimport { Autocomplete, AutocompleteChangeReason } from '@material-ui/lab';\nimport { TextField, TextFieldProps } from '@material-ui/core';\nimport { Tenant } from '../types';\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 options = useMemo(() => tenants ?? [], [tenants]);\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 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%' }}\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 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\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 const {\n currentTenant: storeTenantValue,\n setCurrentTenant,\n } = useTenantStore((state) => ({\n currentTenant: state.currentTenant,\n setCurrentTenant: state.setCurrentTenant,\n }));\n\n // This effect syncs our correct activeTenant to the Zustand store.\n // This fixes the \"side-effect in render\" bug from the original code.\n useEffect(() => {\n if (\n activeTenant &&\n (storeTenantValue?.tenantId !== activeTenant.tenantId ||\n storeTenantValue?.name !== activeTenant.tenantName ||\n storeTenantValue?.tenantType !== activeTenant.tenantType ||\n storeTenantValue?.theme !== activeTenant.theme)\n ) {\n setCurrentTenant({\n tenantId: activeTenant.tenantId,\n name: activeTenant.tenantName,\n tenantType: activeTenant.tenantType,\n theme: activeTenant?.theme ?? null,\n });\n }\n }, [activeTenant, storeTenantValue, 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 // --- Data Fetching ---\n const [{ data: tenants }, refetchTenantsList] = useAxiosGet(\n ConfigService.securityV1ApiUrl,\n `users/${id ?? ''}/unitytenants`,\n {},\n !id\n );\n\n const [{ data: products }] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `products`,\n {},\n !id\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\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 tenant?.products?.find(\n (product) => product?.productId === unityProductId\n )\n );\n }, [tenants, shouldFilterByProduct, unityProductId]);\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 const unityProductName = useMemo(() => {\n if (!shouldFilterByProduct || unityProductId === null) {\n return null;\n }\n if (!Array.isArray(products)) {\n return null;\n }\n return (\n products.find(\n (product) => product?.productId === unityProductId\n )?.name ?? null\n );\n }, [products, shouldFilterByProduct, unityProductId]);\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,\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 } = 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 // 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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"}
@@ -1,5 +1,5 @@
1
1
  import { n as UdpCrudFormFields, t as CrudForm } from "../../CrudForm-C9xMnPoA.js";
2
- import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../../forms-Eqr3TUUl.js";
2
+ import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../../forms-KpO4nIfl.js";
3
3
  import { t as VirtualForm } from "../../VirtualForm-Cw3gjug-.js";
4
4
 
5
5
  export { CrudForm, LoginForm, PaymentReversalForm, UdpCrudFormFields, UdpTransactionEmailForm, VirtualForm };
package/dist/UI/index.js CHANGED
@@ -38,7 +38,7 @@ import { t as FormControl } from "../FormControl-CkybPp4U.js";
38
38
  import { t as IndicatorChip } from "../IndicatorChip-Dmaib9uq.js";
39
39
  import { t as InputAdornment } from "../InputAdornment-CLuALIhc.js";
40
40
  import { n as UdpCrudFormFields, t as CrudForm } from "../CrudForm-C9xMnPoA.js";
41
- import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../forms-Eqr3TUUl.js";
41
+ import { n as PaymentReversalForm, r as LoginForm, t as UdpTransactionEmailForm } from "../forms-KpO4nIfl.js";
42
42
  import { t as Box } from "../Box-Colr5GEl.js";
43
43
  import { t as Grid } from "../Grid-D1-yWIw5.js";
44
44
  import { t as VirtualForm } from "../VirtualForm-Cw3gjug-.js";
@@ -2,8 +2,8 @@ import { t as ConfigService } from "./configService-C4uoG3wj.js";
2
2
  import { r as storeInitialTenant } from "./UnitySessionStorage-CUDx9YWR.js";
3
3
  import { t as apiMutate } from "./useAxiosMutate-DeqKSi5z.js";
4
4
  import { i as storeInitialPath } from "./LocalRedirectUrlStorage-Bxz8TI-X.js";
5
- import { t as AuthProvider } from "./AuthProvider-V_6y6_xj.js";
6
- import { n as ThemeProvider } from "./theme-Bb8h8tjE.js";
5
+ import { t as AuthProvider } from "./AuthProvider-C8qG0V63.js";
6
+ import { n as ThemeProvider } from "./theme-_CEHumbt.js";
7
7
  import React, { useEffect } from "react";
8
8
  import { SnackbarProvider } from "notistack";
9
9
  import { BrowserRouter } from "react-router-dom";
@@ -112,4 +112,4 @@ const UdpAppProvider = ({ children, snackbarProps, authProps, i18nOptions }) =>
112
112
 
113
113
  //#endregion
114
114
  export { getI18nInstance as n, initializeUnityI18n as r, UdpAppProvider as t };
115
- //# sourceMappingURL=UdpAppProvider-D7D0F8VO.js.map
115
+ //# sourceMappingURL=UdpAppProvider-BuJv7P-y.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UdpAppProvider-D7D0F8VO.js","names":["UdpAppProvider: React.FC<UdpAppProviderProps>"],"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';\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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,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;CACrC,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;;;;;;;;;ACjFrC,MAAaA,kBAAiD,EAC5D,UACA,eACA,WACA,kBACI;AACJ,iBAAgB;AACd,sBAAoB,YAAY;IAC/B,CAAC,YAAY,CAAC;AACjB,mBAAkB;AAClB,qBAAoB;AACpB,QACE,oCAAC,cAAiB,WAChB,oCAAC,qBACC,oCAAC,qBACC,oCAAC;EAAiB,UAAU;EAAG,GAAI;IAChC,SACgB,CACL,CACF,CACH"}
1
+ {"version":3,"file":"UdpAppProvider-BuJv7P-y.js","names":["UdpAppProvider: React.FC<UdpAppProviderProps>"],"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';\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 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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,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;CACrC,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;;;;;;;;;ACjFrC,MAAaA,kBAAiD,EAC5D,UACA,eACA,WACA,kBACI;AACJ,iBAAgB;AACd,sBAAoB,YAAY;IAC/B,CAAC,YAAY,CAAC;AACjB,mBAAkB;AAClB,qBAAoB;AACpB,QACE,oCAAC,cAAiB,WAChB,oCAAC,qBACC,oCAAC,qBACC,oCAAC;EAAiB,UAAU;EAAG,GAAI;IAChC,SACgB,CACL,CACF,CACH"}
@@ -2,7 +2,7 @@ import { a as acquireAccessToken, c as useLogoutAction } from "./apiHelpers-WIR8
2
2
  import { t as clearStoredTenant } from "./UnitySessionStorage-CUDx9YWR.js";
3
3
  import { t as clearStoredPath } from "./LocalRedirectUrlStorage-Bxz8TI-X.js";
4
4
  import { t as clearStoredExternalPath } from "./ExternalRedirectUrlStorage-BM-nmI4x.js";
5
- import { t as AuthProvider } from "./AuthProvider-V_6y6_xj.js";
5
+ import { t as AuthProvider } from "./AuthProvider-C8qG0V63.js";
6
6
  import React, { useState } from "react";
7
7
 
8
8
  //#region src/utilities/auth/AuthProviderWrapper.jsx
@@ -35,4 +35,4 @@ const useAccessToken = () => {
35
35
 
36
36
  //#endregion
37
37
  export { useSingleLogout as n, AuthProviderWrapper as r, useAccessToken as t };
38
- //# sourceMappingURL=auth-Bq7vHax4.js.map
38
+ //# sourceMappingURL=auth-DZmqyrT1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-Bq7vHax4.js","names":["useSingleLogout: () => () => void"],"sources":["../src/utilities/auth/AuthProviderWrapper.jsx","../src/utilities/auth/useSingleLogout.ts","../src/utilities/auth/useAccessToken.js"],"sourcesContent":["import React from 'react';\n// import { LocalAuthProvider } from './LocalAuthProvider';\nimport { AuthProvider } from './AuthProvider';\n\nexport const AuthProviderWrapper = props => {\n const { children } = props;\n\n return <AuthProvider {...props}> {children}</AuthProvider>\n\n};\n","import 'react';\nimport { clearStoredPath } from '../redirect/LocalRedirectUrlStorage';\nimport { clearStoredExternalPath } from '../redirect/ExternalRedirectUrlStorage';\nimport {clearStoredTenant} from '../storage/UnitySessionStorage'\nimport {useLogoutAction} from './authActions';\n\nexport const useSingleLogout: () => () => void = () => {\n const logout = useLogoutAction();\n return () => {\n clearStoredPath();\n clearStoredExternalPath();\n clearStoredTenant();\n logout()\n }\n\n};\n","import { useState } from 'react';\nimport { acquireAccessToken } from './authActions';\n\nexport const useAccessToken = () => {\n const [accessToken, setAccessToken] = useState(null);\n\n acquireAccessToken().then((token) => {\n if (accessToken !== token) {\n setAccessToken(token);\n }\n });\n\n return accessToken;\n};\n"],"mappings":";;;;;;;;AAIA,MAAa,uBAAsB,UAAS;CAC1C,MAAM,EAAE,aAAa;AAErB,QAAO,oCAAC,cAAiB,OAAO,KAAE,SAAwB;;;;;ACD5D,MAAaA,wBAA0C;CACrD,MAAM,SAAS,iBAAiB;AAChC,cAAa;AACX,mBAAiB;AACjB,2BAAyB;AACzB,qBAAmB;AACnB,UAAQ;;;;;;ACTZ,MAAa,uBAAuB;CAClC,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;AAEpD,qBAAoB,CAAC,MAAM,UAAU;AACnC,MAAI,gBAAgB,MAClB,gBAAe,MAAM;GAEvB;AAEF,QAAO"}
1
+ {"version":3,"file":"auth-DZmqyrT1.js","names":["useSingleLogout: () => () => void"],"sources":["../src/utilities/auth/AuthProviderWrapper.jsx","../src/utilities/auth/useSingleLogout.ts","../src/utilities/auth/useAccessToken.js"],"sourcesContent":["import React from 'react';\n// import { LocalAuthProvider } from './LocalAuthProvider';\nimport { AuthProvider } from './AuthProvider';\n\nexport const AuthProviderWrapper = props => {\n const { children } = props;\n\n return <AuthProvider {...props}> {children}</AuthProvider>\n\n};\n","import 'react';\nimport { clearStoredPath } from '../redirect/LocalRedirectUrlStorage';\nimport { clearStoredExternalPath } from '../redirect/ExternalRedirectUrlStorage';\nimport {clearStoredTenant} from '../storage/UnitySessionStorage'\nimport {useLogoutAction} from './authActions';\n\nexport const useSingleLogout: () => () => void = () => {\n const logout = useLogoutAction();\n return () => {\n clearStoredPath();\n clearStoredExternalPath();\n clearStoredTenant();\n logout()\n }\n\n};\n","import { useState } from 'react';\nimport { acquireAccessToken } from './authActions';\n\nexport const useAccessToken = () => {\n const [accessToken, setAccessToken] = useState(null);\n\n acquireAccessToken().then((token) => {\n if (accessToken !== token) {\n setAccessToken(token);\n }\n });\n\n return accessToken;\n};\n"],"mappings":";;;;;;;;AAIA,MAAa,uBAAsB,UAAS;CAC1C,MAAM,EAAE,aAAa;AAErB,QAAO,oCAAC,cAAiB,OAAO,KAAE,SAAwB;;;;;ACD5D,MAAaA,wBAA0C;CACrD,MAAM,SAAS,iBAAiB;AAChC,cAAa;AACX,mBAAiB;AACjB,2BAAyB;AACzB,qBAAmB;AACnB,UAAQ;;;;;;ACTZ,MAAa,uBAAuB;CAClC,MAAM,CAAC,aAAa,kBAAkB,SAAS,KAAK;AAEpD,qBAAoB,CAAC,MAAM,UAAU;AACnC,MAAI,gBAAgB,MAClB,gBAAe,MAAM;GAEvB;AAEF,QAAO"}
@@ -432,7 +432,7 @@ const PaymentReversalForm = ({ id, paymentData, onSubmitCompleted }) => {
432
432
 
433
433
  //#endregion
434
434
  //#region src/UI/forms/UdpTransactionEmailForm.jsx
435
- const UdpTransactionEmailForm = ({ existingTransactionAttachments, toOptions, ccOptions, toLabelFunction, ccLabelFunction, attachmentsLabelFunction }) => {
435
+ const UdpTransactionEmailForm = ({ existingTransactionAttachments, toOptions, ccOptions, toLabelFunction, ccLabelFunction, attachmentsLabelFunction, groupBy }) => {
436
436
  const i18n = useTranslation().t;
437
437
  const form = useForm();
438
438
  const handleOnBodyChange = useCallback((value) => {
@@ -446,6 +446,7 @@ const UdpTransactionEmailForm = ({ existingTransactionAttachments, toOptions, cc
446
446
  isMultiple: true,
447
447
  options: toOptions,
448
448
  getOptionLabelFunction: toLabelFunction,
449
+ groupBy,
449
450
  label: i18n("To"),
450
451
  required: true
451
452
  }), /* @__PURE__ */ React.createElement(Field, {
@@ -456,6 +457,7 @@ const UdpTransactionEmailForm = ({ existingTransactionAttachments, toOptions, cc
456
457
  isMultiple: true,
457
458
  options: ccOptions,
458
459
  getOptionLabelFunction: ccLabelFunction,
460
+ groupBy,
459
461
  label: i18n("Cc")
460
462
  }), /* @__PURE__ */ React.createElement(Field, {
461
463
  component: AmbientAutoComplete,
@@ -481,4 +483,4 @@ const UdpTransactionEmailForm = ({ existingTransactionAttachments, toOptions, cc
481
483
 
482
484
  //#endregion
483
485
  export { PaymentReversalForm as n, LoginForm as r, UdpTransactionEmailForm as t };
484
- //# sourceMappingURL=forms-Eqr3TUUl.js.map
486
+ //# sourceMappingURL=forms-KpO4nIfl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forms-Eqr3TUUl.js","names":["useStyles","Box","LinearProgress","Typography","Grid","FormControl"],"sources":["../src/UI/forms/LoginForm.jsx","../src/UI/forms/PaymentReversalForm.jsx","../src/UI/forms/UdpTransactionEmailForm.jsx"],"sourcesContent":["import React from 'react';\nimport {\n TextField,\n Paper,\n Typography,\n makeStyles,\n LinearProgress,\n useTheme\n} from '@material-ui/core';\nimport { LayoutUnit } from '../../layout/LayoutUnit';\nimport { Form, FormButtons, SubmitButton, Field } from '../../utilities/form';\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme.spacing(8)\n },\n loginWindow: {\n position: 'relative',\n flex: 1,\n padding: theme.spacing(3),\n width: 390\n },\n underline: {\n '&::after': {\n borderColor: 'black'\n }\n },\n label: {\n color: 'black'\n },\n logo: {\n width: 150\n },\n error: {\n color: theme.palette.error.main\n }\n}));\n\nexport const LoginForm = (props) => {\n const { onSubmit, logo, usernameLabel, passwordLabel, error, loading } =\n props;\n const classes = useStyles();\n const theme = useTheme();\n\n return (\n <div className={classes.root}>\n <Form onSubmit={onSubmit}>\n <Paper className={classes.loginWindow}>\n <Typography variant='h5' gutterBottom>\n Login\n </Typography>\n {error && (\n <Typography variant='body1' className={classes.error}>\n Your username or password is invalid\n </Typography>\n )}\n <Field\n component={TextField}\n margin='normal'\n type='email'\n name='username'\n InputProps={{\n classes: {\n underline: classes.underline\n }\n }}\n InputLabelProps={{\n focused: true,\n shrink: true,\n style: { color: theme.palette.grey[500] }\n }}\n label={usernameLabel || 'Sign in name'}\n fullWidth\n size='small'\n variant='standard'\n validate={(value) => {\n if (!value?.length) {\n return 'Please enter your sign in name';\n }\n }}\n />\n <Field\n component={TextField}\n margin='normal'\n type='password'\n name='password'\n InputProps={{\n classes: {\n underline: classes.underline\n }\n }}\n InputLabelProps={{\n focused: true,\n shrink: true,\n style: { color: theme.palette.grey[500] }\n }}\n label={passwordLabel || 'Password'}\n fullWidth\n size='small'\n variant='standard'\n validate={(value) => {\n if (!value?.length) {\n return 'Please enter your password';\n }\n }}\n />\n\n <FormButtons style={{ justifyContent: 'flex-end', marginBottom: 0 }}>\n <SubmitButton\n variant='contained'\n disablePristine={false}\n style={{\n margin: 0,\n backgroundColor: theme.palette.grey[800],\n color: '#fff'\n }}\n >\n Sign In\n </SubmitButton>\n </FormButtons>\n {logo && (\n <div>\n <img className={classes.logo} src={logo} alt='Unity' />\n </div>\n )}\n <LayoutUnit unit='xxs' />\n </Paper>\n {loading && <LinearProgress />}\n </Form>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { format } from 'date-fns';\nimport { FluentCardText } from '../surfaces/cards/fluentCards/FluentCardText';\nimport { IndicatorChip } from '../utilityDisplay/IndicatorChip';\nimport { makeStyles, Divider, FormControlLabel } from '@material-ui/core';\nimport { Box } from '../Box';\nimport { AmbientCard } from '../surfaces/cards/AmbientCard';\nimport { Typography } from '../dataDisplay/typography/Typography';\nimport { Grid } from '../Grid';\nimport { ListElement } from '../mapLayout/ui/ListCard';\nimport { useTranslation } from 'react-i18next';\nimport { FluentCheckbox } from '../inputs/checkbox/FluentCheckbox';\nimport { FormControl } from '../utilityDisplay/FormControl';\nimport { Field } from '../../utilities/form/Field';\nimport { FluentTextField } from '../inputs/textField/FluentTextField';\nimport { Form } from '../../utilities/form/Form';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { LinearProgress } from '../loading/LinearProgress';\nimport { ConfigService } from '../../configService';\n\nconst useStyles = makeStyles((theme) => ({\n formControlHalf: {\n width: '40%'\n },\n formControl: {\n width: '100%'\n },\n formControlMargin: {\n width: '100%',\n marginTop: '5px'\n },\n formControlCheck: {\n width: '100%',\n marginTop: '5px',\n marginLeft: '3px'\n },\n submitControl: {\n marginTop: '35px'\n },\n assetTypeLabel: {\n top: theme.spacing(-0.7)\n },\n labelText: {\n color: 'rgba(0, 0, 0)',\n fontSize: '0.875rem'\n },\n main: {\n flexGrow: 1,\n padding: '0 24px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n },\n appIcon: {\n width: 24,\n height: 24,\n color: theme.palette.text.primary\n },\n arrowIcon: {\n width: 12,\n height: 12\n },\n linkTitle: {\n marginRight: theme.spacing(1)\n },\n formControlGeneral: {\n width: '100%',\n marginLeft: '5px',\n marginTop: '5px'\n },\n cardNumber: {\n width: '60%'\n },\n accordion: {\n width: '100%',\n margin: '0px',\n padding: '0px',\n boxShadow: 'none',\n backgroundColor: 'inherit',\n '&:before': {\n display: 'none'\n },\n '&$expanded': {\n margin: '0px'\n }\n },\n accordionSummary: {\n padding: '0px',\n paddingLeft: '5px',\n margin: '0px',\n minHeight: '0px',\n backgroundColor: 'inherit',\n flexDirection: 'row-reverse',\n '&$expanded': {\n margin: '0px',\n padding: '0px',\n minHeight: '0px'\n }\n },\n expanded: {\n margin: '0px',\n paddingLeft: '5px'\n },\n content: {\n margin: 0,\n backgroundColor: 'inherit',\n '&$expanded': {\n margin: 0\n }\n },\n accordionDetails: {\n padding: '0px',\n display: 'block',\n margin: '0px'\n },\n cardContent: {\n backgroundColor: '#FAFAFA'\n },\n listItem: {\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '0.875rem'\n },\n listItemDetail: {\n display: 'flex',\n justifyContent: 'flex-end'\n },\n listItemAccordion: {\n paddingTop: '3px',\n paddingBottom: '3px',\n paddingLeft: '0px'\n },\n divider: {\n margin: '0px 12px'\n },\n dividerBold: {\n margin: '0px 12px',\n backgroundColor: 'black'\n },\n itemCheckbox: {\n padding: '0px'\n },\n itemDescription: {\n color: 'grey'\n },\n list: {\n backgroundColor: '#FFF'\n },\n dropdown: {\n marginTop: theme.spacing(-1),\n backgroundColor: '#FFF'\n },\n locationDropDown: {\n margin: theme.spacing(0),\n marginTop: theme.spacing(-0.5),\n fontSize: '0.75rem'\n },\n box: {\n display: 'flex',\n justifyContent: 'space-around',\n flexDirection: 'row',\n paddingBottom: '15px',\n gap: '10px',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n flexWrap: 'wrap',\n alignItems: 'flex-start'\n }\n }\n}));\n\nconst PAYMENT_APPROVED = 1;\nconst PAYMENT_DENIED = 43;\nconst RESULT_SUCCESS = 200;\nconst RESULT_FAILURE = 401;\n\nexport const PaymentReversalForm = ({ id, paymentData, onSubmitCompleted }) => {\n const classes = useStyles();\n const { t } = useTranslation();\n\n const [loading, setLoading] = useState(true);\n const [paymentTransaction, setPaymentTransaction] = useState(undefined);\n\n /**\n * API call to get the payment transaction details\n */\n const getPaymentTransaction = useCallback(\n async (payload) => {\n if (!payload) {\n return null;\n }\n\n return apiMutate(\n ConfigService.pgV1ApiUrl,\n `PaymentTransaction/search`,\n {\n method: 'POST',\n data: payload\n },\n {}\n );\n },\n []\n );\n\n /**\n * API call to get the account information by account number\n */\n const reverseTransactionExecute = useCallback(\n async (transactionID) => {\n if (!transactionID) {\n return null;\n }\n\n return apiMutate(\n ConfigService.pgV1ApiUrl,\n `PaymentTransaction/${transactionID}`,\n {\n method: 'DELETE',\n },\n {}\n );\n },\n []\n );\n\n /**\n * submitAccountDetailsForm\n * @param {*} formData\n * @return {*}\n */\n const handleSubmitPaymentReversal = (values) => {\n // const data = {\n // amountToReverse: values.amountToReverse,\n // isSendCustomerPaymentConfirmation:\n // values.isSendCustomerPaymentConfirmation\n // };\n\n if (!paymentData?.transactionId) {\n return;\n }\n\n reverseTransactionExecute(paymentData?.transactionId)\n .then(() => {\n onSubmitCompleted && onSubmitCompleted({ transactionId: paymentData?.transactionId, error: false });\n })\n .catch((error) => {\n onSubmitCompleted && onSubmitCompleted({ transactionId: paymentData?.transactionId, error });\n });\n }\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n setLoading(true);\n const response = await getPaymentTransaction({\n eagerLoad: true,\n pageNumber: 1,\n pageSize: 20,\n filterElements: [\n {\n searchField: 'transactionId',\n searchValue: paymentData?.transactionId,\n searchOperator: '=',\n },\n ],\n orderElements: [],\n });\n\n if (response?.data) {\n setPaymentTransaction(response?.data?.pageList?.[0]);\n }\n\n } catch (err) {\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n if (paymentData?.transactionId) {\n fetchData();\n }\n }, [getPaymentTransaction, paymentData]);\n\n const statusText = useMemo(() => {\n return (paymentTransaction?.responseCode === PAYMENT_APPROVED && paymentTransaction?.paymentResultID === RESULT_SUCCESS) ? 'Approved' :\n (paymentTransaction?.responseCode === PAYMENT_DENIED && paymentTransaction?.paymentResultID === RESULT_FAILURE) ? 'Declined' : 'Undetermined';\n }, [paymentTransaction]);\n\n const statusCode = useMemo(() => {\n return (paymentTransaction?.responseCode === PAYMENT_APPROVED && paymentTransaction?.paymentResultID === RESULT_SUCCESS) ? 'ok':\n (paymentTransaction?.responseCode === PAYMENT_DENIED && paymentTransaction?.paymentResultID === RESULT_FAILURE) ? 'error' : 'warning';\n }, [paymentTransaction]);\n\n return (\n <Box>\n {loading && (\n <Box sx={{ width: '100%' }}>\n <LinearProgress />\n </Box>\n )}\n <Box className={classes.box}>\n <FluentCardText title='Value' description={`$${paymentData?.amount}`} />\n <FluentCardText\n title='Status'\n description={\n <IndicatorChip\n text={statusText}\n status={statusCode}\n />\n }\n />\n </Box>\n <AmbientCard fullWidth={true}>\n <Typography\n variant='subtitle2'\n style={{ marginTop: '0px', marginBottom: '10px' }}\n >\n {t('Payment Details')}\n </Typography>\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('Transaction ID'), paymentData?.transactionId || t('N/A')],\n [t('Date/Time'), paymentData?.transactionDate ? format(new Date(paymentData?.transactionDate), 'EEE, MMM d, yyyy') : t('N/A')],\n [t('Processor'), paymentData?.paymentSourceName || t('No Information found')],\n [t('Response Code'), paymentData?.authorizationNumber || t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('Customer Name'), paymentTransaction?.reference3 || t('N/A')],\n [t('Type'), paymentData?.tender || t('N/A')],\n [t('Card Holder Name'), t('N/A')],\n [t('CC Number'), paymentData?.cardLast4 || t('N/A')],\n [t('Company'), paymentTransaction?.applicationClient?.name || t('N/A')],\n [t('Expiration Date'), paymentData?.date || t('N/A')],\n [t('AVS'), t('N/A')],\n [t('Status'),paymentData?.authorizationNumber ? 'Approved' : 'Declined'],\n [t('Confirmation'), paymentData?.authorizationNumber || t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('First Attempt Date'), paymentData?.date || t('N/A')],\n [t('Initial Transaction'), paymentData?.date || t('N/A')],\n [t('Next Attempt Date'), paymentData?.date || t('N/A')],\n [t('Retry Count'), t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Form\n id={id}\n onSubmit={handleSubmitPaymentReversal}\n render={({ handleSubmit, form, values }) => {\n return (\n <>\n <FormControl className={classes.formControl}>\n <Field\n component={FluentTextField}\n ComponentProps={{\n label: t('Amount to Reverse'),\n variant: 'outlined',\n margin: 'normal',\n size: 'small',\n disabled: false,\n fullWidth: true,\n autoComplete: 'off',\n inputProps: {\n maxLength: 256,\n autocomplete: 'off'\n }\n }}\n name='amountToReverse'\n initialValue={paymentData?.amount}\n onChange={() => {}}\n required={true}\n />\n </FormControl>\n\n <FormControl className={classes.formControlGeneral}>\n <FormControlLabel\n control={\n <Field\n component={FluentCheckbox}\n name='isSendCustomerPaymentConfirmation'\n type='checkbox'\n defaultValue={false}\n required={false}\n onChange={() => {}}\n // @ts-ignore\n size='small'\n />\n }\n label={t('Send Customer Payment Confirmation')}\n />\n </FormControl>\n </>\n );\n }}\n />\n </AmbientCard>\n </Box>\n );\n};\n","import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Field } from '../../utilities/form';\nimport { CkRichEditor } from '../inputs/richEditors';\nimport { AmbientAutoComplete, AmbientTextField } from '../inputs/textField';\nimport { useForm } from '../../utilities/form';\nimport { LayoutUnit } from '../../layout';\n\nexport const UdpTransactionEmailForm = ({\n existingTransactionAttachments,\n toOptions,\n ccOptions,\n toLabelFunction,\n ccLabelFunction,\n attachmentsLabelFunction\n}) => {\n const i18n = useTranslation().t;\n const form = useForm();\n\n const handleOnBodyChange = useCallback(\n (value) => {\n form.change('body', value);\n },\n [form]\n );\n\n return (\n <>\n <Field\n component={AmbientAutoComplete}\n name='to'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={toOptions}\n getOptionLabelFunction={toLabelFunction}\n label={i18n('To')}\n required={true}\n />\n <Field\n component={AmbientAutoComplete}\n name='cc'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={ccOptions}\n getOptionLabelFunction={ccLabelFunction}\n label={i18n('Cc')}\n />\n <Field\n component={AmbientAutoComplete}\n name='attachments'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={existingTransactionAttachments}\n getOptionLabelFunction={attachmentsLabelFunction}\n label={i18n('Attachments')}\n />\n <Field\n component={AmbientTextField}\n name='subject'\n margin='normal'\n variant='outlined'\n label={i18n('Subject')}\n required={true}\n />\n <LayoutUnit unit='nudge' />\n <CkRichEditor name='body' handleChange={handleOnBodyChange} />\n </>\n );\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"forms-KpO4nIfl.js","names":["useStyles","Box","LinearProgress","Typography","Grid","FormControl"],"sources":["../src/UI/forms/LoginForm.jsx","../src/UI/forms/PaymentReversalForm.jsx","../src/UI/forms/UdpTransactionEmailForm.jsx"],"sourcesContent":["import React from 'react';\nimport {\n TextField,\n Paper,\n Typography,\n makeStyles,\n LinearProgress,\n useTheme\n} from '@material-ui/core';\nimport { LayoutUnit } from '../../layout/LayoutUnit';\nimport { Form, FormButtons, SubmitButton, Field } from '../../utilities/form';\nconst useStyles = makeStyles((theme) => ({\n root: {\n display: 'flex',\n justifyContent: 'center',\n marginTop: theme.spacing(8)\n },\n loginWindow: {\n position: 'relative',\n flex: 1,\n padding: theme.spacing(3),\n width: 390\n },\n underline: {\n '&::after': {\n borderColor: 'black'\n }\n },\n label: {\n color: 'black'\n },\n logo: {\n width: 150\n },\n error: {\n color: theme.palette.error.main\n }\n}));\n\nexport const LoginForm = (props) => {\n const { onSubmit, logo, usernameLabel, passwordLabel, error, loading } =\n props;\n const classes = useStyles();\n const theme = useTheme();\n\n return (\n <div className={classes.root}>\n <Form onSubmit={onSubmit}>\n <Paper className={classes.loginWindow}>\n <Typography variant='h5' gutterBottom>\n Login\n </Typography>\n {error && (\n <Typography variant='body1' className={classes.error}>\n Your username or password is invalid\n </Typography>\n )}\n <Field\n component={TextField}\n margin='normal'\n type='email'\n name='username'\n InputProps={{\n classes: {\n underline: classes.underline\n }\n }}\n InputLabelProps={{\n focused: true,\n shrink: true,\n style: { color: theme.palette.grey[500] }\n }}\n label={usernameLabel || 'Sign in name'}\n fullWidth\n size='small'\n variant='standard'\n validate={(value) => {\n if (!value?.length) {\n return 'Please enter your sign in name';\n }\n }}\n />\n <Field\n component={TextField}\n margin='normal'\n type='password'\n name='password'\n InputProps={{\n classes: {\n underline: classes.underline\n }\n }}\n InputLabelProps={{\n focused: true,\n shrink: true,\n style: { color: theme.palette.grey[500] }\n }}\n label={passwordLabel || 'Password'}\n fullWidth\n size='small'\n variant='standard'\n validate={(value) => {\n if (!value?.length) {\n return 'Please enter your password';\n }\n }}\n />\n\n <FormButtons style={{ justifyContent: 'flex-end', marginBottom: 0 }}>\n <SubmitButton\n variant='contained'\n disablePristine={false}\n style={{\n margin: 0,\n backgroundColor: theme.palette.grey[800],\n color: '#fff'\n }}\n >\n Sign In\n </SubmitButton>\n </FormButtons>\n {logo && (\n <div>\n <img className={classes.logo} src={logo} alt='Unity' />\n </div>\n )}\n <LayoutUnit unit='xxs' />\n </Paper>\n {loading && <LinearProgress />}\n </Form>\n </div>\n );\n};\n","import React, { useState, useEffect, useCallback, useMemo } from 'react';\nimport { format } from 'date-fns';\nimport { FluentCardText } from '../surfaces/cards/fluentCards/FluentCardText';\nimport { IndicatorChip } from '../utilityDisplay/IndicatorChip';\nimport { makeStyles, Divider, FormControlLabel } from '@material-ui/core';\nimport { Box } from '../Box';\nimport { AmbientCard } from '../surfaces/cards/AmbientCard';\nimport { Typography } from '../dataDisplay/typography/Typography';\nimport { Grid } from '../Grid';\nimport { ListElement } from '../mapLayout/ui/ListCard';\nimport { useTranslation } from 'react-i18next';\nimport { FluentCheckbox } from '../inputs/checkbox/FluentCheckbox';\nimport { FormControl } from '../utilityDisplay/FormControl';\nimport { Field } from '../../utilities/form/Field';\nimport { FluentTextField } from '../inputs/textField/FluentTextField';\nimport { Form } from '../../utilities/form/Form';\nimport { apiMutate } from '../../utilities/useAxiosMutate';\nimport { LinearProgress } from '../loading/LinearProgress';\nimport { ConfigService } from '../../configService';\n\nconst useStyles = makeStyles((theme) => ({\n formControlHalf: {\n width: '40%'\n },\n formControl: {\n width: '100%'\n },\n formControlMargin: {\n width: '100%',\n marginTop: '5px'\n },\n formControlCheck: {\n width: '100%',\n marginTop: '5px',\n marginLeft: '3px'\n },\n submitControl: {\n marginTop: '35px'\n },\n assetTypeLabel: {\n top: theme.spacing(-0.7)\n },\n labelText: {\n color: 'rgba(0, 0, 0)',\n fontSize: '0.875rem'\n },\n main: {\n flexGrow: 1,\n padding: '0 24px',\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center'\n },\n appIcon: {\n width: 24,\n height: 24,\n color: theme.palette.text.primary\n },\n arrowIcon: {\n width: 12,\n height: 12\n },\n linkTitle: {\n marginRight: theme.spacing(1)\n },\n formControlGeneral: {\n width: '100%',\n marginLeft: '5px',\n marginTop: '5px'\n },\n cardNumber: {\n width: '60%'\n },\n accordion: {\n width: '100%',\n margin: '0px',\n padding: '0px',\n boxShadow: 'none',\n backgroundColor: 'inherit',\n '&:before': {\n display: 'none'\n },\n '&$expanded': {\n margin: '0px'\n }\n },\n accordionSummary: {\n padding: '0px',\n paddingLeft: '5px',\n margin: '0px',\n minHeight: '0px',\n backgroundColor: 'inherit',\n flexDirection: 'row-reverse',\n '&$expanded': {\n margin: '0px',\n padding: '0px',\n minHeight: '0px'\n }\n },\n expanded: {\n margin: '0px',\n paddingLeft: '5px'\n },\n content: {\n margin: 0,\n backgroundColor: 'inherit',\n '&$expanded': {\n margin: 0\n }\n },\n accordionDetails: {\n padding: '0px',\n display: 'block',\n margin: '0px'\n },\n cardContent: {\n backgroundColor: '#FAFAFA'\n },\n listItem: {\n paddingTop: '3px',\n paddingBottom: '3px',\n fontSize: '0.875rem'\n },\n listItemDetail: {\n display: 'flex',\n justifyContent: 'flex-end'\n },\n listItemAccordion: {\n paddingTop: '3px',\n paddingBottom: '3px',\n paddingLeft: '0px'\n },\n divider: {\n margin: '0px 12px'\n },\n dividerBold: {\n margin: '0px 12px',\n backgroundColor: 'black'\n },\n itemCheckbox: {\n padding: '0px'\n },\n itemDescription: {\n color: 'grey'\n },\n list: {\n backgroundColor: '#FFF'\n },\n dropdown: {\n marginTop: theme.spacing(-1),\n backgroundColor: '#FFF'\n },\n locationDropDown: {\n margin: theme.spacing(0),\n marginTop: theme.spacing(-0.5),\n fontSize: '0.75rem'\n },\n box: {\n display: 'flex',\n justifyContent: 'space-around',\n flexDirection: 'row',\n paddingBottom: '15px',\n gap: '10px',\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n flexWrap: 'wrap',\n alignItems: 'flex-start'\n }\n }\n}));\n\nconst PAYMENT_APPROVED = 1;\nconst PAYMENT_DENIED = 43;\nconst RESULT_SUCCESS = 200;\nconst RESULT_FAILURE = 401;\n\nexport const PaymentReversalForm = ({ id, paymentData, onSubmitCompleted }) => {\n const classes = useStyles();\n const { t } = useTranslation();\n\n const [loading, setLoading] = useState(true);\n const [paymentTransaction, setPaymentTransaction] = useState(undefined);\n\n /**\n * API call to get the payment transaction details\n */\n const getPaymentTransaction = useCallback(\n async (payload) => {\n if (!payload) {\n return null;\n }\n\n return apiMutate(\n ConfigService.pgV1ApiUrl,\n `PaymentTransaction/search`,\n {\n method: 'POST',\n data: payload\n },\n {}\n );\n },\n []\n );\n\n /**\n * API call to get the account information by account number\n */\n const reverseTransactionExecute = useCallback(\n async (transactionID) => {\n if (!transactionID) {\n return null;\n }\n\n return apiMutate(\n ConfigService.pgV1ApiUrl,\n `PaymentTransaction/${transactionID}`,\n {\n method: 'DELETE',\n },\n {}\n );\n },\n []\n );\n\n /**\n * submitAccountDetailsForm\n * @param {*} formData\n * @return {*}\n */\n const handleSubmitPaymentReversal = (values) => {\n // const data = {\n // amountToReverse: values.amountToReverse,\n // isSendCustomerPaymentConfirmation:\n // values.isSendCustomerPaymentConfirmation\n // };\n\n if (!paymentData?.transactionId) {\n return;\n }\n\n reverseTransactionExecute(paymentData?.transactionId)\n .then(() => {\n onSubmitCompleted && onSubmitCompleted({ transactionId: paymentData?.transactionId, error: false });\n })\n .catch((error) => {\n onSubmitCompleted && onSubmitCompleted({ transactionId: paymentData?.transactionId, error });\n });\n }\n\n useEffect(() => {\n const fetchData = async () => {\n try {\n setLoading(true);\n const response = await getPaymentTransaction({\n eagerLoad: true,\n pageNumber: 1,\n pageSize: 20,\n filterElements: [\n {\n searchField: 'transactionId',\n searchValue: paymentData?.transactionId,\n searchOperator: '=',\n },\n ],\n orderElements: [],\n });\n\n if (response?.data) {\n setPaymentTransaction(response?.data?.pageList?.[0]);\n }\n\n } catch (err) {\n console.error(err);\n } finally {\n setLoading(false);\n }\n };\n\n if (paymentData?.transactionId) {\n fetchData();\n }\n }, [getPaymentTransaction, paymentData]);\n\n const statusText = useMemo(() => {\n return (paymentTransaction?.responseCode === PAYMENT_APPROVED && paymentTransaction?.paymentResultID === RESULT_SUCCESS) ? 'Approved' :\n (paymentTransaction?.responseCode === PAYMENT_DENIED && paymentTransaction?.paymentResultID === RESULT_FAILURE) ? 'Declined' : 'Undetermined';\n }, [paymentTransaction]);\n\n const statusCode = useMemo(() => {\n return (paymentTransaction?.responseCode === PAYMENT_APPROVED && paymentTransaction?.paymentResultID === RESULT_SUCCESS) ? 'ok':\n (paymentTransaction?.responseCode === PAYMENT_DENIED && paymentTransaction?.paymentResultID === RESULT_FAILURE) ? 'error' : 'warning';\n }, [paymentTransaction]);\n\n return (\n <Box>\n {loading && (\n <Box sx={{ width: '100%' }}>\n <LinearProgress />\n </Box>\n )}\n <Box className={classes.box}>\n <FluentCardText title='Value' description={`$${paymentData?.amount}`} />\n <FluentCardText\n title='Status'\n description={\n <IndicatorChip\n text={statusText}\n status={statusCode}\n />\n }\n />\n </Box>\n <AmbientCard fullWidth={true}>\n <Typography\n variant='subtitle2'\n style={{ marginTop: '0px', marginBottom: '10px' }}\n >\n {t('Payment Details')}\n </Typography>\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('Transaction ID'), paymentData?.transactionId || t('N/A')],\n [t('Date/Time'), paymentData?.transactionDate ? format(new Date(paymentData?.transactionDate), 'EEE, MMM d, yyyy') : t('N/A')],\n [t('Processor'), paymentData?.paymentSourceName || t('No Information found')],\n [t('Response Code'), paymentData?.authorizationNumber || t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('Customer Name'), paymentTransaction?.reference3 || t('N/A')],\n [t('Type'), paymentData?.tender || t('N/A')],\n [t('Card Holder Name'), t('N/A')],\n [t('CC Number'), paymentData?.cardLast4 || t('N/A')],\n [t('Company'), paymentTransaction?.applicationClient?.name || t('N/A')],\n [t('Expiration Date'), paymentData?.date || t('N/A')],\n [t('AVS'), t('N/A')],\n [t('Status'),paymentData?.authorizationNumber ? 'Approved' : 'Declined'],\n [t('Confirmation'), paymentData?.authorizationNumber || t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Box display='flex' flexDirection='column'>\n <Grid container spacing={1}>\n {[\n [t('First Attempt Date'), paymentData?.date || t('N/A')],\n [t('Initial Transaction'), paymentData?.date || t('N/A')],\n [t('Next Attempt Date'), paymentData?.date || t('N/A')],\n [t('Retry Count'), t('N/A')]\n ].map(([k, v]) => (\n <Grid item xs={12} sm={6}>\n {/* @ts-ignore */}\n <ListElement subject={k} value={v} hideDivider={true} />\n </Grid>\n ))}\n </Grid>\n </Box>\n\n <Divider style={{ marginTop: '10px', marginBottom: '10px' }} />\n\n <Form\n id={id}\n onSubmit={handleSubmitPaymentReversal}\n render={({ handleSubmit, form, values }) => {\n return (\n <>\n <FormControl className={classes.formControl}>\n <Field\n component={FluentTextField}\n ComponentProps={{\n label: t('Amount to Reverse'),\n variant: 'outlined',\n margin: 'normal',\n size: 'small',\n disabled: false,\n fullWidth: true,\n autoComplete: 'off',\n inputProps: {\n maxLength: 256,\n autocomplete: 'off'\n }\n }}\n name='amountToReverse'\n initialValue={paymentData?.amount}\n onChange={() => {}}\n required={true}\n />\n </FormControl>\n\n <FormControl className={classes.formControlGeneral}>\n <FormControlLabel\n control={\n <Field\n component={FluentCheckbox}\n name='isSendCustomerPaymentConfirmation'\n type='checkbox'\n defaultValue={false}\n required={false}\n onChange={() => {}}\n // @ts-ignore\n size='small'\n />\n }\n label={t('Send Customer Payment Confirmation')}\n />\n </FormControl>\n </>\n );\n }}\n />\n </AmbientCard>\n </Box>\n );\n};\n","import React, { useCallback } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Field } from '../../utilities/form';\nimport { CkRichEditor } from '../inputs/richEditors';\nimport { AmbientAutoComplete, AmbientTextField } from '../inputs/textField';\nimport { useForm } from '../../utilities/form';\nimport { LayoutUnit } from '../../layout';\n\nexport const UdpTransactionEmailForm = ({\n existingTransactionAttachments,\n toOptions,\n ccOptions,\n toLabelFunction,\n ccLabelFunction,\n attachmentsLabelFunction,\n groupBy\n}) => {\n const i18n = useTranslation().t;\n const form = useForm();\n\n const handleOnBodyChange = useCallback(\n (value) => {\n form.change('body', value);\n },\n [form]\n );\n\n return (\n <>\n <Field\n component={AmbientAutoComplete}\n name='to'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={toOptions}\n getOptionLabelFunction={toLabelFunction}\n groupBy={groupBy}\n label={i18n('To')}\n required={true}\n />\n <Field\n component={AmbientAutoComplete}\n name='cc'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={ccOptions}\n getOptionLabelFunction={ccLabelFunction}\n groupBy={groupBy}\n label={i18n('Cc')}\n />\n <Field\n component={AmbientAutoComplete}\n name='attachments'\n margin='normal'\n variant='outlined'\n isMultiple={true}\n options={existingTransactionAttachments}\n getOptionLabelFunction={attachmentsLabelFunction}\n label={i18n('Attachments')}\n />\n <Field\n component={AmbientTextField}\n name='subject'\n margin='normal'\n variant='outlined'\n label={i18n('Subject')}\n required={true}\n />\n <LayoutUnit unit='nudge' />\n <CkRichEditor name='body' handleChange={handleOnBodyChange} />\n </>\n );\n};\n"],"mappings":"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"}