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.
- package/dist/{AuthProvider-V_6y6_xj.js → AuthProvider-C8qG0V63.js} +2 -2
- package/dist/{AuthProvider-V_6y6_xj.js.map → AuthProvider-C8qG0V63.js.map} +1 -1
- package/dist/{Shell-DunAQ9XC.js → Shell-B6Qxi2hZ.js} +2 -2
- package/dist/{Shell-DunAQ9XC.js.map → Shell-B6Qxi2hZ.js.map} +1 -1
- package/dist/{TenantProvider-B_fwoUi4.js → TenantProvider-CCrrxyiD.js} +4 -3
- package/dist/TenantProvider-CCrrxyiD.js.map +1 -0
- package/dist/UI/forms/index.js +1 -1
- package/dist/UI/index.js +1 -1
- package/dist/{UdpAppProvider-D7D0F8VO.js → UdpAppProvider-BuJv7P-y.js} +3 -3
- package/dist/{UdpAppProvider-D7D0F8VO.js.map → UdpAppProvider-BuJv7P-y.js.map} +1 -1
- package/dist/{auth-Bq7vHax4.js → auth-DZmqyrT1.js} +2 -2
- package/dist/{auth-Bq7vHax4.js.map → auth-DZmqyrT1.js.map} +1 -1
- package/dist/{forms-Eqr3TUUl.js → forms-KpO4nIfl.js} +4 -2
- package/dist/{forms-Eqr3TUUl.js.map → forms-KpO4nIfl.js.map} +1 -1
- package/dist/index.js +8 -8
- package/dist/{profile-hGhjTafH.js → profile-BA_cbWI8.js} +3 -3
- package/dist/{profile-hGhjTafH.js.map → profile-BA_cbWI8.js.map} +1 -1
- package/dist/providers/index.js +1 -1
- package/dist/shell/index.js +1 -1
- package/dist/shell/ui/profile/index.js +1 -1
- package/dist/tenantStore-CFYu7ndZ.js.map +1 -1
- package/dist/{theme-Bb8h8tjE.js → theme-_CEHumbt.js} +3 -3
- package/dist/theme-_CEHumbt.js.map +1 -0
- package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts +2 -1
- package/dist/types/src/UI/forms/UdpTransactionEmailForm.d.ts.map +1 -1
- package/dist/types/src/stores/tenantStore.d.ts +1 -0
- package/dist/types/src/stores/tenantStore.d.ts.map +1 -1
- package/dist/types/src/utilities/tenant/TenantProvider.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/utilities/auth/index.js +3 -3
- package/dist/utilities/tenant/index.js +1 -1
- package/dist/utilities/theme/index.js +1 -1
- package/export-map.json +1 -1
- package/package.json +1 -1
- package/dist/TenantProvider-B_fwoUi4.js.map +0 -1
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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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"}
|
package/dist/UI/forms/index.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
6
|
-
import { n as ThemeProvider } from "./theme-
|
|
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-
|
|
115
|
+
//# sourceMappingURL=UdpAppProvider-BuJv7P-y.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UdpAppProvider-
|
|
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-
|
|
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-
|
|
38
|
+
//# sourceMappingURL=auth-DZmqyrT1.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth-
|
|
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-
|
|
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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"}
|