udp-react-enterprise-component-library 25.18.1-beta.63 → 25.18.1-beta.65
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/AgTable-B2xTzAm2.js.map +1 -1
- package/dist/AmChart-CTixft8X.js.map +1 -1
- package/dist/{AuthProvider-C8qG0V63.js → AuthProvider-J79EBNDc.js} +2 -2
- package/dist/AuthProvider-J79EBNDc.js.map +1 -0
- package/dist/DashboardWidget-CsOrr74H.js.map +1 -1
- package/dist/Field-Cda5rJe2.js.map +1 -1
- package/dist/Form-DbOA5j38.js.map +1 -1
- package/dist/FormButtons-BTCO-pzW.js.map +1 -1
- package/dist/LayoutUnit-D4jJvonh.js.map +1 -1
- package/dist/{MenuProvider-BuTAUs0Z.js → MenuProvider-BqEZve2y.js} +2 -2
- package/dist/MenuProvider-BqEZve2y.js.map +1 -0
- package/dist/NumberOperator-p4HsHHx3.js.map +1 -1
- package/dist/PAHAdditionalRightComponent-DMOU9Mho.js.map +1 -1
- package/dist/PDFViewer-B4nJKbIy.js.map +1 -1
- package/dist/PageContext-BpOBJHpb.js.map +1 -1
- package/dist/PaymentForm-DFJrSIy8.js.map +1 -1
- package/dist/PrimaryActionHeader-DBJpROPu.js.map +1 -1
- package/dist/SearchOperator-D9838PIe.js.map +1 -1
- package/dist/SearchUtilities-DUW0kaw_.js.map +1 -1
- package/dist/{Shell-a2L-cKzs.js → Shell-BE_Aq6W2.js} +5 -5
- package/dist/{Shell-a2L-cKzs.js.map → Shell-BE_Aq6W2.js.map} +1 -1
- package/dist/{TenantProvider-CCrrxyiD.js → TenantProvider-BeFMHYP8.js} +2 -2
- package/dist/TenantProvider-BeFMHYP8.js.map +1 -0
- package/dist/{UdpAppProvider-BuJv7P-y.js → UdpAppProvider-DXgzyeHZ.js} +2 -2
- package/dist/UdpAppProvider-DXgzyeHZ.js.map +1 -0
- package/dist/UdpBarChart-D2bfgm7n.js.map +1 -1
- package/dist/UdpMapToolbar-B410Zi_h.js.map +1 -1
- package/dist/{UdpTransactionsPage-CDyNjmyo.js → UdpTransactionsPage-B1Ia9x62.js} +12 -10
- package/dist/UdpTransactionsPage-B1Ia9x62.js.map +1 -0
- package/dist/UnityIconLibrary-CjIwzfjv.js.map +1 -1
- package/dist/actionSummary-D0CwyTXJ.js.map +1 -1
- package/dist/advancedSearchBuilder-7ixhIwLW.js.map +1 -1
- package/dist/aggridHelpers-BvrSzjdD.js.map +1 -1
- package/dist/apiHelpers-WIR8pqy0.js.map +1 -1
- package/dist/{auth-DZmqyrT1.js → auth-BWJ4-JF-.js} +2 -2
- package/dist/auth-BWJ4-JF-.js.map +1 -0
- package/dist/catalogStore-DP2GxpTJ.js.map +1 -1
- package/dist/charts-pX01x8rO.js.map +1 -1
- package/dist/form-Dj1zVw6K.js.map +1 -1
- package/dist/hooks-BNndjGer.js.map +1 -1
- package/dist/index.js +10 -10
- package/dist/lookupsStore-DPI8oD9R.js.map +1 -1
- package/dist/maps-BgmvNpkU.js.map +1 -1
- package/dist/{menuUtilities-Da5uVIJ8.js → menuUtilities-BOnqojY6.js} +12 -10
- package/dist/menuUtilities-BOnqojY6.js.map +1 -0
- package/dist/newGrid-zmtQXU5G.js.map +1 -1
- package/dist/{profile-BA_cbWI8.js → profile-7BieC5qc.js} +3 -3
- package/dist/profile-7BieC5qc.js.map +1 -0
- package/dist/providers/index.js +1 -1
- package/dist/routes/index.js +1 -1
- package/dist/{routes-DM7kVvCm.js → routes-DafRlYVQ.js} +11 -9
- package/dist/routes-DafRlYVQ.js.map +1 -0
- package/dist/shell/index.js +1 -1
- package/dist/shell/ui/profile/index.js +1 -1
- package/dist/shellStore-C8zfPsZ-.js.map +1 -1
- package/dist/stepper-BaIo_Rol.js.map +1 -1
- package/dist/teleporterStore-CjUFtATo.js.map +1 -1
- package/dist/tenantStore-CFYu7ndZ.js.map +1 -1
- package/dist/types/src/routes/PrivateRoute.d.ts.map +1 -1
- package/dist/types/src/udp/pages/UdpTransactionsPage/sidesheets/AttachmentTransaction.d.ts.map +1 -1
- package/dist/types/src/utilities/menus/menuUtilities.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/dist/udp/pages/UdpPages/index.js +1 -1
- package/dist/udp/pages/UdpTransactionsPage/index.js +1 -1
- package/dist/useAuthedUser-Bhr7Yhlg.js.map +1 -1
- package/dist/useQueryExecutors-DuuHrj2M.js.map +1 -1
- package/dist/useUser-wpHGo6jU.js.map +1 -1
- package/dist/utilities/auth/index.js +3 -3
- package/dist/utilities/menus/index.js +1 -1
- package/dist/utilities/tenant/index.js +1 -1
- package/dist/workflowStore-CCoN5uHd.js.map +1 -1
- package/export-map.json +1 -1
- package/package.json +1 -1
- package/dist/AuthProvider-C8qG0V63.js.map +0 -1
- package/dist/MenuProvider-BuTAUs0Z.js.map +0 -1
- package/dist/TenantProvider-CCrrxyiD.js.map +0 -1
- package/dist/UdpAppProvider-BuJv7P-y.js.map +0 -1
- package/dist/UdpTransactionsPage-CDyNjmyo.js.map +0 -1
- package/dist/auth-DZmqyrT1.js.map +0 -1
- package/dist/menuUtilities-Da5uVIJ8.js.map +0 -1
- package/dist/profile-BA_cbWI8.js.map +0 -1
- package/dist/routes-DM7kVvCm.js.map +0 -1
|
@@ -19,7 +19,7 @@ import { t as UdpFormsBuilderPage_exports } from "../../../UdpFormsBuilderPage-B
|
|
|
19
19
|
import { t as UdpImportFromFileMappingPage_exports } from "../../../UdpImportFromFileMappingPage-Dti79T9x.js";
|
|
20
20
|
import { t as UdpAuditEvents_exports } from "../../../UdpAuditEvents-C5p1KgV0.js";
|
|
21
21
|
import { t as UdpTransactionTypesPage_exports } from "../../../UdpTransactionTypesPage-CWA-n7y0.js";
|
|
22
|
-
import { t as UdpTransactionsPage_exports } from "../../../UdpTransactionsPage-
|
|
22
|
+
import { t as UdpTransactionsPage_exports } from "../../../UdpTransactionsPage-B1Ia9x62.js";
|
|
23
23
|
|
|
24
24
|
//#region src/udp/pages/UdpPages/index.ts
|
|
25
25
|
const UdpPages = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthedUser-Bhr7Yhlg.js","names":[
|
|
1
|
+
{"version":3,"file":"useAuthedUser-Bhr7Yhlg.js","names":[],"sources":["../src/utilities/auth/useAuthedUser.ts"],"sourcesContent":["import { useLocation } from 'react-router-dom';\nimport { useUser } from './useUser';\nimport { User } from './user';\nimport { useIsAuthenticated, useMsal } from '@azure/msal-react';\n//import { getStoredAccessToken } from '../storage/UnitySessionStorage';\n\n/**\n * Hook that provides a returnTo string for the current location\n */\nexport function useCurrentPageReturnTo(): { pathname: string; search: string; hash: string } {\n const { pathname, search, hash } = useLocation();\n // Avoid shorthand to satisfy isolatedDeclarations\n return { pathname: String(pathname), search: String(search), hash: String(hash) };\n}\n\nexport const useIsAuthed: () => boolean = () => {\n const isAADAuthenticated = useIsAuthenticated();\n return isAADAuthenticated;\n}\n\n/**\n * Hook used on routes that require a logged in user to ensure that the user is logged in\n * @see {@link useUser}\n */\nexport const useAuthedUser: () => User | null = () => {\n const { inProgress } = useMsal();\n const isAuthenticated = useIsAuthed();\n const user = useUser();\n //const login = useLoginAction();\n\n if (\n isAuthenticated ||\n (inProgress)\n ) {\n return user;\n }\n else{\n return null;\n }\n // else {\n // login();\n // return null;\n // }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,yBAA6E;CAC3F,MAAM,EAAE,UAAU,QAAQ,SAAS,aAAa;AAEhD,QAAO;EAAE,UAAU,OAAO,SAAS;EAAE,QAAQ,OAAO,OAAO;EAAE,MAAM,OAAO,KAAK;EAAE;;AAGnF,MAAa,oBAAmC;AAE9C,QAD2B,oBAAoB;;;;;;AAQjD,MAAa,sBAAyC;CACpD,MAAM,EAAE,eAAe,SAAS;CAChC,MAAM,kBAAkB,aAAa;CACrC,MAAM,OAAO,SAAS;AAGtB,KACE,mBACC,WAED,QAAO;KAGP,QAAO"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueryExecutors-DuuHrj2M.js","names":["getMappedSearchResults: (\n lookups: LookupCollection,\n searchResults: QueryResult\n ) => QueryResult","updatedItem: Record<string, any>","resultData: QueryResult","promises: Array<Promise<any>>","lookups: LookupCollection","lookupApiMethodId","response","lookupConfig","executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups","executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups","executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups"],"sources":["../src/hooks/useQueryExecutors.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useLookupsStore } from '../stores/lookupsStore';\nimport {\n executeQueryInstance,\n executeQueryWithParameters,\n executeQueryInstanceWithApiMethodInstance,\n executeQueryAdHoc\n} from '../udp/utilities/methodUtils';\nimport { handleResponseErrors } from '../utilities/apiHelpers';\nimport ApiMethodInstance from '../models/ApiMethodInstance';\nimport Lookup from '../models/Lookup';\nimport QueryResult from '../models/QueryResult';\nimport { cloneDeep } from 'lodash';\n\n/**\n * value - id of lookup\n * lookupKeyName - used to find the correct lookup key/value pair\n * lookupValueName - the value in which to replace the target value\n */\ninterface LookupConfig {\n value: string;\n lookupKeyName: string | null | undefined;\n lookupValueName: string | null | undefined;\n}\ninterface LookupCollection {\n [field: string]: Lookup;\n}\n\ntype ExecuteInstanceAndMapLookups = (\n queryParams: any,\n apiMethodInstanceId: string | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined,\n urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteInstanceWithObjectAndMapLookups = (\n queryParams: any,\n apiMethodInstance: ApiMethodInstance | null | undefined | any,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined,\n urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteAdHocAndMapLookups = (\n searchObject: any,\n apiMethodId: string | null | undefined,\n lookupsMap: Record<string, LookupConfig> | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined\n) => Promise<any>;\n\nexport interface UseQueryExecutorsReturn {\n executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups;\n executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups;\n executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups;\n getCleanData: (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => any;\n getLookup: (lookupId: string) => any;\n}\n\nexport const useQueryExecutors = (): UseQueryExecutorsReturn => {\n const { lookupApiMethodId, lookupsDataMap, setLookupsDataMap } =\n useLookupsStore();\n\n const getLookupById = useCallback(\n (lookupId: string) => {\n if (!lookupsDataMap || !lookupId) {\n return null;\n }\n return lookupsDataMap[lookupId];\n },\n [lookupsDataMap]\n );\n\n const getMappedSearchResults: (\n lookups: LookupCollection,\n searchResults: QueryResult\n ) => QueryResult = (\n lookups = {},\n searchResults = {\n pageList: [],\n countable: false,\n total: 0,\n eagerLoad: false,\n aggregateResults: [],\n aliasMap: [],\n lookupsMap: []\n }\n ) => {\n const mapLookup = (item: Record<string, any>) => {\n const updatedItem: Record<string, any> = { ...item };\n\n Object.keys(lookups).forEach((attribute) => {\n const lookup = lookups[attribute];\n const propertyValue = (item as any)[attribute];\n\n if (propertyValue !== null && propertyValue !== undefined) {\n const matchingLookupRow = lookup?.data?.find((row) => {\n if (lookup.keyName && row[lookup.keyName]) {\n return (\n row[lookup.keyName].toString() === propertyValue.toString()\n );\n }\n return false;\n });\n\n if (matchingLookupRow && lookup.valueName) {\n updatedItem[attribute] = matchingLookupRow[lookup.valueName];\n }\n }\n });\n\n return updatedItem;\n };\n const updatedPageList = searchResults.pageList.map(mapLookup);\n const updatedAggregateResults =\n searchResults?.aggregateResults?.map?.(mapLookup);\n\n return {\n ...searchResults,\n pageList: updatedPageList,\n aggregateResults: updatedAggregateResults\n };\n };\n\n const processQueryResponseWithLookups = useCallback(\n async (\n lookupApiMethodId: string,\n response: any,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined,\n lookupDataMap: object | null | undefined\n ) => {\n let resultData: QueryResult = new QueryResult();\n let lookupsMap = {};\n if (response?.status === 200) {\n lookupsMap = lookupDataMap || response?.data?.lookupsMap || {};\n resultData = response.data;\n } else {\n showSnackbars && handleResponseErrors('Could not retrieve query data');\n return null;\n }\n\n // Keys are a list of Entity Properties\n const promises: Array<Promise<any>> = [];\n const lookups: LookupCollection = {};\n\n Object.keys(lookupsMap).forEach((key: string) => {\n const lookupConfig = lookupsMap[key];\n if (lookupConfig?.value) {\n const existingLookup =\n !replaceCache && getLookupById(lookupConfig.value);\n const lookupQueryData = { id: lookupConfig.value };\n\n if (!existingLookup) {\n promises.push(\n executeQueryWithParameters(\n { data: lookupQueryData },\n lookupApiMethodId\n )\n .then((response) => {\n if (response?.status === 200 && response?.data) {\n const lookupConfig = lookupsMap[key];\n lookups[key] = {\n data: response.data.data,\n keyName:\n lookupConfig.lookupKeyName || response.data.keyName,\n valueName:\n lookupConfig.lookupValueName || response.data.valueName,\n businessObjectKey: response.data.businessObjectKey\n };\n setLookupsDataMap(\n { [response.data.id]: response.data },\n replaceCache\n );\n }\n })\n .catch((e) => e)\n );\n } else {\n lookups[key] = {\n data: existingLookup.data,\n keyName: lookupConfig.lookupKeyName || existingLookup.keyName,\n valueName:\n lookupConfig.lookupValueName || existingLookup.valueName,\n businessObjectKey: existingLookup.businessObjectKey\n };\n }\n }\n });\n\n await Promise.all(promises);\n\n resultData = getMappedSearchResults(lookups, resultData);\n return resultData;\n },\n [getLookupById]\n );\n\n const executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups = useCallback(\n async (\n searchObject: any = {},\n apiMethodId: string | null | undefined,\n lookupsMap: Record<string, LookupConfig> | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryAdHoc(searchObject || {}, apiMethodId);\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n lookupsMap\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups = useCallback(\n async (\n queryParams: any = {},\n apiMethodInstanceId: string | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false,\n urlQueryParams: string = ''\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n // return null;\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryInstance(\n { data: queryParams || {} },\n apiMethodInstanceId,\n urlQueryParams\n );\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n null\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups = useCallback(\n async (\n queryParams: any = {},\n apiMethodInstance: ApiMethodInstance | null | undefined | any,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false,\n urlQueryParams: string = ''\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n // return null;\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryInstanceWithApiMethodInstance(\n {\n data: { queryParams: queryParams || {}, apiMethodInstance }\n },\n urlQueryParams\n );\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n null\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const getLookup = useCallback(\n (lookupId: string) => {\n const cachedLookup = getLookupById(lookupId);\n if (cachedLookup) {\n return cachedLookup;\n }\n if (lookupApiMethodId) {\n const lookupQueryData = { id: lookupId };\n executeQueryWithParameters({ data: lookupQueryData }, lookupApiMethodId)\n .then((response) => {\n if (response?.status === 200 && response?.data) {\n return response;\n }\n })\n .catch((e) => e);\n }\n return null;\n },\n [lookupApiMethodId, getLookupById]\n );\n\n const getCleanData = useCallback(\n (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => {\n // Un-Map lookup data\n let cleanData = cloneDeep(data);\n if (lookupsMap && cleanData) {\n Object.keys(lookupsMap).forEach((attribute) => {\n const lookupConfig = (lookupsMap as Record<string, LookupConfig>)[attribute];\n const lookup = getLookup(lookupConfig.value);\n\n if (Array.isArray(cleanData)) {\n // Data is an array of rows.\n cleanData.forEach((row, index) => {\n let currentValue = row[attribute];\n let temp = lookup?.data?.find(\n (item) => item[lookup.valueName] === currentValue\n );\n if (temp != null)\n cleanData[index][attribute] = temp[lookup.keyName];\n });\n } else if (cleanData[attribute]) {\n // Data is a single row\n let currentValue = cleanData[attribute];\n let temp = lookup.data.find(\n (item) => item[lookup.valueName] === currentValue\n );\n if (temp != null) cleanData[attribute] = temp[lookup.keyName];\n }\n });\n }\n return cleanData;\n },\n [getLookup]\n );\n\n return {\n executeQueryInstanceAndMapLookups: executeQueryInstanceAndMapLookups,\n executeQueryInstanceWithObjectAndMapLookups: executeQueryInstanceWithObjectAndMapLookups,\n executeQueryAdHocAndMapLookups: executeQueryAdHocAndMapLookups,\n getCleanData: getCleanData,\n getLookup: getLookup\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useQueryExecutors-DuuHrj2M.js","names":["lookupApiMethodId","response","lookupConfig"],"sources":["../src/hooks/useQueryExecutors.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useLookupsStore } from '../stores/lookupsStore';\nimport {\n executeQueryInstance,\n executeQueryWithParameters,\n executeQueryInstanceWithApiMethodInstance,\n executeQueryAdHoc\n} from '../udp/utilities/methodUtils';\nimport { handleResponseErrors } from '../utilities/apiHelpers';\nimport ApiMethodInstance from '../models/ApiMethodInstance';\nimport Lookup from '../models/Lookup';\nimport QueryResult from '../models/QueryResult';\nimport { cloneDeep } from 'lodash';\n\n/**\n * value - id of lookup\n * lookupKeyName - used to find the correct lookup key/value pair\n * lookupValueName - the value in which to replace the target value\n */\ninterface LookupConfig {\n value: string;\n lookupKeyName: string | null | undefined;\n lookupValueName: string | null | undefined;\n}\ninterface LookupCollection {\n [field: string]: Lookup;\n}\n\ntype ExecuteInstanceAndMapLookups = (\n queryParams: any,\n apiMethodInstanceId: string | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined,\n urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteInstanceWithObjectAndMapLookups = (\n queryParams: any,\n apiMethodInstance: ApiMethodInstance | null | undefined | any,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined,\n urlQueryParams?: string\n) => Promise<any>;\n\ntype ExecuteAdHocAndMapLookups = (\n searchObject: any,\n apiMethodId: string | null | undefined,\n lookupsMap: Record<string, LookupConfig> | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars?: boolean | null | undefined\n) => Promise<any>;\n\nexport interface UseQueryExecutorsReturn {\n executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups;\n executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups;\n executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups;\n getCleanData: (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => any;\n getLookup: (lookupId: string) => any;\n}\n\nexport const useQueryExecutors = (): UseQueryExecutorsReturn => {\n const { lookupApiMethodId, lookupsDataMap, setLookupsDataMap } =\n useLookupsStore();\n\n const getLookupById = useCallback(\n (lookupId: string) => {\n if (!lookupsDataMap || !lookupId) {\n return null;\n }\n return lookupsDataMap[lookupId];\n },\n [lookupsDataMap]\n );\n\n const getMappedSearchResults: (\n lookups: LookupCollection,\n searchResults: QueryResult\n ) => QueryResult = (\n lookups = {},\n searchResults = {\n pageList: [],\n countable: false,\n total: 0,\n eagerLoad: false,\n aggregateResults: [],\n aliasMap: [],\n lookupsMap: []\n }\n ) => {\n const mapLookup = (item: Record<string, any>) => {\n const updatedItem: Record<string, any> = { ...item };\n\n Object.keys(lookups).forEach((attribute) => {\n const lookup = lookups[attribute];\n const propertyValue = (item as any)[attribute];\n\n if (propertyValue !== null && propertyValue !== undefined) {\n const matchingLookupRow = lookup?.data?.find((row) => {\n if (lookup.keyName && row[lookup.keyName]) {\n return (\n row[lookup.keyName].toString() === propertyValue.toString()\n );\n }\n return false;\n });\n\n if (matchingLookupRow && lookup.valueName) {\n updatedItem[attribute] = matchingLookupRow[lookup.valueName];\n }\n }\n });\n\n return updatedItem;\n };\n const updatedPageList = searchResults.pageList.map(mapLookup);\n const updatedAggregateResults =\n searchResults?.aggregateResults?.map?.(mapLookup);\n\n return {\n ...searchResults,\n pageList: updatedPageList,\n aggregateResults: updatedAggregateResults\n };\n };\n\n const processQueryResponseWithLookups = useCallback(\n async (\n lookupApiMethodId: string,\n response: any,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined,\n lookupDataMap: object | null | undefined\n ) => {\n let resultData: QueryResult = new QueryResult();\n let lookupsMap = {};\n if (response?.status === 200) {\n lookupsMap = lookupDataMap || response?.data?.lookupsMap || {};\n resultData = response.data;\n } else {\n showSnackbars && handleResponseErrors('Could not retrieve query data');\n return null;\n }\n\n // Keys are a list of Entity Properties\n const promises: Array<Promise<any>> = [];\n const lookups: LookupCollection = {};\n\n Object.keys(lookupsMap).forEach((key: string) => {\n const lookupConfig = lookupsMap[key];\n if (lookupConfig?.value) {\n const existingLookup =\n !replaceCache && getLookupById(lookupConfig.value);\n const lookupQueryData = { id: lookupConfig.value };\n\n if (!existingLookup) {\n promises.push(\n executeQueryWithParameters(\n { data: lookupQueryData },\n lookupApiMethodId\n )\n .then((response) => {\n if (response?.status === 200 && response?.data) {\n const lookupConfig = lookupsMap[key];\n lookups[key] = {\n data: response.data.data,\n keyName:\n lookupConfig.lookupKeyName || response.data.keyName,\n valueName:\n lookupConfig.lookupValueName || response.data.valueName,\n businessObjectKey: response.data.businessObjectKey\n };\n setLookupsDataMap(\n { [response.data.id]: response.data },\n replaceCache\n );\n }\n })\n .catch((e) => e)\n );\n } else {\n lookups[key] = {\n data: existingLookup.data,\n keyName: lookupConfig.lookupKeyName || existingLookup.keyName,\n valueName:\n lookupConfig.lookupValueName || existingLookup.valueName,\n businessObjectKey: existingLookup.businessObjectKey\n };\n }\n }\n });\n\n await Promise.all(promises);\n\n resultData = getMappedSearchResults(lookups, resultData);\n return resultData;\n },\n [getLookupById]\n );\n\n const executeQueryAdHocAndMapLookups: ExecuteAdHocAndMapLookups = useCallback(\n async (\n searchObject: any = {},\n apiMethodId: string | null | undefined,\n lookupsMap: Record<string, LookupConfig> | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryAdHoc(searchObject || {}, apiMethodId);\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n lookupsMap\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const executeQueryInstanceAndMapLookups: ExecuteInstanceAndMapLookups = useCallback(\n async (\n queryParams: any = {},\n apiMethodInstanceId: string | null | undefined,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false,\n urlQueryParams: string = ''\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n // return null;\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryInstance(\n { data: queryParams || {} },\n apiMethodInstanceId,\n urlQueryParams\n );\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n null\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const executeQueryInstanceWithObjectAndMapLookups: ExecuteInstanceWithObjectAndMapLookups = useCallback(\n async (\n queryParams: any = {},\n apiMethodInstance: ApiMethodInstance | null | undefined | any,\n replaceCache: boolean | null | undefined,\n showSnackbars: boolean | null | undefined = false,\n urlQueryParams: string = ''\n ) => {\n if (!lookupApiMethodId) {\n console.info('Udp Lookup Api Method Id NOT Set');\n // return null;\n }\n console.info('Udp Lookup Api Method Id IS Set');\n\n const response = await executeQueryInstanceWithApiMethodInstance(\n {\n data: { queryParams: queryParams || {}, apiMethodInstance }\n },\n urlQueryParams\n );\n\n if (lookupApiMethodId) {\n return await processQueryResponseWithLookups(\n lookupApiMethodId,\n response,\n replaceCache,\n showSnackbars,\n null\n );\n }\n return response?.data;\n },\n [lookupApiMethodId, processQueryResponseWithLookups]\n );\n\n const getLookup = useCallback(\n (lookupId: string) => {\n const cachedLookup = getLookupById(lookupId);\n if (cachedLookup) {\n return cachedLookup;\n }\n if (lookupApiMethodId) {\n const lookupQueryData = { id: lookupId };\n executeQueryWithParameters({ data: lookupQueryData }, lookupApiMethodId)\n .then((response) => {\n if (response?.status === 200 && response?.data) {\n return response;\n }\n })\n .catch((e) => e);\n }\n return null;\n },\n [lookupApiMethodId, getLookupById]\n );\n\n const getCleanData = useCallback(\n (data: any, lookupsMap: Record<string, LookupConfig> | null | undefined) => {\n // Un-Map lookup data\n let cleanData = cloneDeep(data);\n if (lookupsMap && cleanData) {\n Object.keys(lookupsMap).forEach((attribute) => {\n const lookupConfig = (lookupsMap as Record<string, LookupConfig>)[attribute];\n const lookup = getLookup(lookupConfig.value);\n\n if (Array.isArray(cleanData)) {\n // Data is an array of rows.\n cleanData.forEach((row, index) => {\n let currentValue = row[attribute];\n let temp = lookup?.data?.find(\n (item) => item[lookup.valueName] === currentValue\n );\n if (temp != null)\n cleanData[index][attribute] = temp[lookup.keyName];\n });\n } else if (cleanData[attribute]) {\n // Data is a single row\n let currentValue = cleanData[attribute];\n let temp = lookup.data.find(\n (item) => item[lookup.valueName] === currentValue\n );\n if (temp != null) cleanData[attribute] = temp[lookup.keyName];\n }\n });\n }\n return cleanData;\n },\n [getLookup]\n );\n\n return {\n executeQueryInstanceAndMapLookups: executeQueryInstanceAndMapLookups,\n executeQueryInstanceWithObjectAndMapLookups: executeQueryInstanceWithObjectAndMapLookups,\n executeQueryAdHocAndMapLookups: executeQueryAdHocAndMapLookups,\n getCleanData: getCleanData,\n getLookup: getLookup\n };\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUser-wpHGo6jU.js","names":[
|
|
1
|
+
{"version":3,"file":"useUser-wpHGo6jU.js","names":[],"sources":["../src/utilities/auth/internal.ts","../src/utilities/auth/useUser.ts"],"sourcesContent":["import { createContext } from 'react';\nimport { User } from './user';\n\nexport type UserAction = { type: 'SET_USER' };\nexport type AccessTokenAction = { type: 'SET_ACCESS_TOKEN' };\nexport type Dispatch = (action: UserAction | AccessTokenAction) => void;\nexport const UserContext: React.Context<User | null> = createContext<User | null>(null);\nexport const UserDispatchContext: React.Context<Dispatch | null> = createContext<Dispatch | null>(null);\n","import { useContext } from 'react';\nimport { UserContext } from './internal';\nimport { User } from './user';\n\n/**\n * Get the current User object (or null if not logged in)\n *\n * Does not redirect to login\n * @see {@link useAuthedUser}\n */\nexport function useUser(): User | null {\n return useContext(UserContext);\n}\n"],"mappings":";;;AAMA,MAAa,cAA0C,cAA2B,KAAK;AACvF,MAAa,sBAAsD,cAA+B,KAAK;;;;;;;;;;ACGvG,SAAgB,UAAuB;AACrC,QAAO,WAAW,YAAY"}
|
|
@@ -2,8 +2,8 @@ import { a as acquireAccessToken, c as useLogoutAction, d as getLoginRequest, f
|
|
|
2
2
|
import { n as UserContext, r as UserDispatchContext, t as useUser } from "../../useUser-wpHGo6jU.js";
|
|
3
3
|
import { t as useIsUnityAuthenticated } from "../../useIsUnityAuthenticated-Cc_l9meR.js";
|
|
4
4
|
import { n as useCurrentPageReturnTo, r as useIsAuthed, t as useAuthedUser } from "../../useAuthedUser-Bhr7Yhlg.js";
|
|
5
|
-
import { a as useUserActions, i as useLocalUserActions } from "../../TenantProvider-
|
|
6
|
-
import { n as createUser, t as AuthProvider } from "../../AuthProvider-
|
|
7
|
-
import { n as useSingleLogout, r as AuthProviderWrapper, t as useAccessToken } from "../../auth-
|
|
5
|
+
import { a as useUserActions, i as useLocalUserActions } from "../../TenantProvider-BeFMHYP8.js";
|
|
6
|
+
import { n as createUser, t as AuthProvider } from "../../AuthProvider-J79EBNDc.js";
|
|
7
|
+
import { n as useSingleLogout, r as AuthProviderWrapper, t as useAccessToken } from "../../auth-BWJ4-JF-.js";
|
|
8
8
|
|
|
9
9
|
export { AuthProvider, AuthProviderWrapper, UserContext, UserDispatchContext, acquireAccessToken, createUser, getApiAccessScope, getLoginRequest, getSignInAuthProvider, getTokenRequest, initSignInAuthProvider, loginRedirect, useAccessToken, useAuthedUser, useCurrentPageReturnTo, useIsAuthed, useIsUnityAuthenticated, useLocalUserActions, useLoginAction, useLogoutAction, useSingleLogout, useUser, useUserActions, whitelistedPaths };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as getRouteRolesMapAndMenuActiveMap, t as getMenuItemsRecursively } from "../../menuUtilities-
|
|
1
|
+
import { n as getRouteRolesMapAndMenuActiveMap, t as getMenuItemsRecursively } from "../../menuUtilities-BOnqojY6.js";
|
|
2
2
|
import { t as redirectToLinkOnClick } from "../../redirectToLink-CLI8MGFd.js";
|
|
3
3
|
|
|
4
4
|
export { getMenuItemsRecursively, getRouteRolesMapAndMenuActiveMap, redirectToLinkOnClick };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as TenantContext } from "../../tenantContext-BpVIZ4sz.js";
|
|
2
2
|
import { t as useTenant } from "../../useTenant-CGaZEBEJ.js";
|
|
3
|
-
import { n as TenantAccessDialog, r as TenantSelect, t as TenantProvider } from "../../TenantProvider-
|
|
3
|
+
import { n as TenantAccessDialog, r as TenantSelect, t as TenantProvider } from "../../TenantProvider-BeFMHYP8.js";
|
|
4
4
|
|
|
5
5
|
export { TenantAccessDialog, TenantContext, TenantProvider, TenantSelect, useTenant };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflowStore-CCoN5uHd.js","names":[
|
|
1
|
+
{"version":3,"file":"workflowStore-CCoN5uHd.js","names":[],"sources":["../src/stores/workflowStore.ts"],"sourcesContent":["import { create } from 'zustand';\nimport { devtools } from 'zustand/middleware';\n\ninterface PageDataMap {\n [pageId: string]: Object | null | undefined;\n}\n\ninterface TaskDataMap {\n [taskId: string]: PageDataMap;\n}\n\ninterface WorkflowState {\n title: string | null | undefined;\n setWorkflowToolbarTitle: (title: string) => void;\n taskDataMap: TaskDataMap | null | undefined;\n updateTaskDataMap: (taskId: string, pageId: string, data: Object) => void;\n setTaskDataMap: (taskId: string, data: PageDataMap) => void;\n}\n\nexport const useWorkflowStore: () => WorkflowState = create<WorkflowState>()(\n devtools((set) => ({\n title: '',\n setWorkflowToolbarTitle: (title) => set((state) => ({ title: title })),\n taskDataMap: {},\n updateTaskDataMap: (taskId, pageId, data) =>\n set((state) => {\n const updatedTaskDataMap = { ...state.taskDataMap };\n if (updatedTaskDataMap[taskId]) {\n if (updatedTaskDataMap[taskId][pageId]) {\n updatedTaskDataMap[taskId][pageId] = data;\n } else {\n updatedTaskDataMap[taskId] = {\n [pageId]: data\n };\n }\n } else {\n updatedTaskDataMap[taskId] = {\n [pageId]: data\n };\n }\n return {\n taskDataMap: updatedTaskDataMap\n };\n }),\n setTaskDataMap: (taskId, data) =>\n set((state) => {\n const updatedTaskDataMap = { ...state.taskDataMap };\n updatedTaskDataMap[taskId] = data;\n return {\n taskDataMap: updatedTaskDataMap\n };\n })\n }))\n);\n"],"mappings":";;;;AAmBA,MAAa,mBAAwC,QAAuB,CAC1E,UAAU,SAAS;CACjB,OAAO;CACP,0BAA0B,UAAU,KAAK,WAAW,EAAS,OAAO,EAAE;CACtE,aAAa,EAAE;CACf,oBAAoB,QAAQ,QAAQ,SAClC,KAAK,UAAU;EACb,MAAM,qBAAqB,EAAE,GAAG,MAAM,aAAa;AACnD,MAAI,mBAAmB,QACrB,KAAI,mBAAmB,QAAQ,QAC7B,oBAAmB,QAAQ,UAAU;MAErC,oBAAmB,UAAU,GAC1B,SAAS,MACX;MAGH,oBAAmB,UAAU,GAC1B,SAAS,MACX;AAEH,SAAO,EACL,aAAa,oBACd;GACD;CACJ,iBAAiB,QAAQ,SACvB,KAAK,UAAU;EACb,MAAM,qBAAqB,EAAE,GAAG,MAAM,aAAa;AACnD,qBAAmB,UAAU;AAC7B,SAAO,EACL,aAAa,oBACd;GACD;CACL,EAAE,CACJ"}
|
package/export-map.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "udp-react-enterprise-component-library",
|
|
3
|
-
"version": "25.18.1-beta.
|
|
3
|
+
"version": "25.18.1-beta.65",
|
|
4
4
|
"description": "React-based UI component library implementing Fluent UI design for Univerus internal projects",
|
|
5
5
|
"author": "Univerus",
|
|
6
6
|
"license": "MIT",
|
|
@@ -1 +0,0 @@
|
|
|
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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MenuProvider-BuTAUs0Z.js","names":["MenuProvider: React.FC<MenuProviderProps>","refetchPromises: Promise<unknown>[]"],"sources":["../src/utilities/menus/MenuProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useContext,\n useMemo,\n ReactNode\n} from 'react';\nimport { useUser } from '../auth/useUser';\nimport { useAxiosGet } from '../useAxiosGet';\nimport { ConfigService } from '../../configService';\nimport { getRouteRolesMapAndMenuActiveMap } from './menuUtilities';\nimport type { AxiosError } from 'axios';\n\ntype LeftMenuResponse = unknown[];\ntype AppSelectorMenuResponse = unknown[];\ntype LanguagesResponse = unknown[];\n\ninterface MenuContextValue {\n leftMenu?: LeftMenuResponse;\n leftMenuLoading: boolean;\n leftMenuError?: AxiosError<unknown>;\n appSelectorMenus?: AppSelectorMenuResponse;\n appSelectorMenusLoading: boolean;\n appSelectorMenusError?: AxiosError<unknown>;\n languages?: LanguagesResponse;\n languagesLoading: boolean;\n languagesError?: AxiosError<unknown>;\n rolesMap: Map<string, string[]>;\n menuActiveMap: Map<string, boolean>;\n refetchAll: () => Promise<unknown[]>;\n}\n\ninterface MenuProviderProps {\n children?: ReactNode;\n}\n\nexport const MenuContext = createContext<MenuContextValue | null>(null);\n\ntype RefetchFn = (config?: unknown, options?: unknown) => Promise<unknown>;\n\ntype UseAxiosGetReturn<TData> = [\n {\n data?: TData;\n loading: boolean;\n error?: AxiosError<unknown>;\n },\n RefetchFn\n];\n\nconst buildRouteAndActiveMaps = (\n menu: LeftMenuResponse\n): { rolesMap: Map<string, string[]>; menuActiveMap: Map<string, boolean> } => {\n const rawResult = getRouteRolesMapAndMenuActiveMap(menu) as {\n rolesMap?: Map<unknown, unknown>;\n menuActiveMap?: Map<unknown, unknown>;\n };\n\n const rolesMap = new Map<string, string[]>();\n if (rawResult?.rolesMap instanceof Map) {\n rawResult.rolesMap.forEach((value, key) => {\n if (typeof key !== 'string') return;\n const normalizedKey = key;\n const normalizedValue = Array.isArray(value)\n ? value.map((roleId) => String(roleId))\n : [];\n rolesMap.set(normalizedKey, normalizedValue);\n });\n }\n\n const menuActiveMap = new Map<string, boolean>();\n if (rawResult?.menuActiveMap instanceof Map) {\n rawResult.menuActiveMap.forEach((value, key) => {\n if (typeof key !== 'string') return;\n menuActiveMap.set(key, Boolean(value));\n });\n }\n\n return { rolesMap, menuActiveMap };\n};\n\nexport const MenuProvider: React.FC<MenuProviderProps> = ({ children }) => {\n const user = useUser();\n\n const currentTenantId = user?.currentTenantId;\n const userId = user?.id;\n const [\n { data: leftMenu, loading: leftMenuLoading, error: leftMenuError },\n refetchLeftMenu\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus?menuTypeId=1&productId=${ConfigService.config.UNITY_PRODUCT_ID}&tenantId=${currentTenantId}`,\n {},\n !currentTenantId\n ) as UseAxiosGetReturn<LeftMenuResponse>;\n\n const [\n {\n data: appSelectorMenus,\n loading: appSelectorMenusLoading,\n error: appSelectorMenusError\n },\n refetchAppSelectorMenus\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `menus?tenantId=${currentTenantId}&verticalId=${ConfigService.config.UNITY_VERTICAL_ID}&userId=${userId ?? ''}`,\n {},\n !userId\n ) as UseAxiosGetReturn<AppSelectorMenuResponse>;\n\n const [\n { data: languages, loading: languagesLoading, error: languagesError },\n refetchLanguages\n ] = useAxiosGet(\n ConfigService.tenantV1ApiUrl,\n `language`,\n {},\n false\n ) as UseAxiosGetReturn<LanguagesResponse>;\n\n const { rolesMap, menuActiveMap } = useMemo(() => {\n if (Array.isArray(leftMenu) && leftMenu.length > 0) {\n return buildRouteAndActiveMaps(leftMenu);\n }\n\n return {\n rolesMap: new Map<string, string[]>(),\n menuActiveMap: new Map<string, boolean>()\n };\n }, [leftMenu]);\n\n const refetchAll = useCallback(() => {\n const refetchPromises: Promise<unknown>[] = [];\n\n if (currentTenantId) {\n refetchPromises.push(refetchLeftMenu());\n }\n\n if (userId) {\n refetchPromises.push(refetchAppSelectorMenus());\n }\n\n refetchPromises.push(refetchLanguages());\n\n return Promise.all(refetchPromises);\n }, [\n currentTenantId,\n refetchAppSelectorMenus,\n refetchLanguages,\n refetchLeftMenu,\n userId\n ]);\n\n const value = useMemo<MenuContextValue>(\n () => ({\n leftMenu,\n leftMenuLoading,\n leftMenuError,\n appSelectorMenus,\n appSelectorMenusLoading,\n appSelectorMenusError,\n languages,\n languagesLoading,\n languagesError,\n rolesMap,\n menuActiveMap,\n refetchAll\n }),\n [\n leftMenu,\n leftMenuLoading,\n leftMenuError,\n appSelectorMenus,\n appSelectorMenusLoading,\n appSelectorMenusError,\n languages,\n languagesLoading,\n languagesError,\n rolesMap,\n menuActiveMap,\n refetchAll\n ]\n );\n\n return <MenuContext.Provider value={value}>{children}</MenuContext.Provider>;\n};\n\nexport const useMenuContext = (): MenuContextValue => {\n const context = useContext(MenuContext);\n if (!context) {\n throw new Error('useMenuContext must be used within a MenuProvider');\n }\n return context;\n};\n"],"mappings":";;;;;;;AAoCA,MAAa,cAAc,cAAuC,KAAK;AAavE,MAAM,2BACJ,SAC6E;CAC7E,MAAM,YAAY,iCAAiC,KAAK;CAKxD,MAAM,2BAAW,IAAI,KAAuB;AAC5C,KAAI,WAAW,oBAAoB,IACjC,WAAU,SAAS,SAAS,OAAO,QAAQ;AACzC,MAAI,OAAO,QAAQ,SAAU;EAC7B,MAAM,gBAAgB;EACtB,MAAM,kBAAkB,MAAM,QAAQ,MAAM,GACxC,MAAM,KAAK,WAAW,OAAO,OAAO,CAAC,GACrC,EAAE;AACN,WAAS,IAAI,eAAe,gBAAgB;GAC5C;CAGJ,MAAM,gCAAgB,IAAI,KAAsB;AAChD,KAAI,WAAW,yBAAyB,IACtC,WAAU,cAAc,SAAS,OAAO,QAAQ;AAC9C,MAAI,OAAO,QAAQ,SAAU;AAC7B,gBAAc,IAAI,KAAK,QAAQ,MAAM,CAAC;GACtC;AAGJ,QAAO;EAAE;EAAU;EAAe;;AAGpC,MAAaA,gBAA6C,EAAE,eAAe;CACzE,MAAM,OAAO,SAAS;CAEtB,MAAM,kBAAkB,MAAM;CAC9B,MAAM,SAAS,MAAM;CACrB,MAAM,CACJ,EAAE,MAAM,UAAU,SAAS,iBAAiB,OAAO,iBACnD,mBACE,YACF,cAAc,gBACd,gCAAgC,cAAc,OAAO,iBAAiB,YAAY,mBAClF,EAAE,EACF,CAAC,gBACF;CAED,MAAM,CACJ,EACE,MAAM,kBACN,SAAS,yBACT,OAAO,yBAET,2BACE,YACF,cAAc,gBACd,kBAAkB,gBAAgB,cAAc,cAAc,OAAO,kBAAkB,UAAU,UAAU,MAC3G,EAAE,EACF,CAAC,OACF;CAED,MAAM,CACJ,EAAE,MAAM,WAAW,SAAS,kBAAkB,OAAO,kBACrD,oBACE,YACF,cAAc,gBACd,YACA,EAAE,EACF,MACD;CAED,MAAM,EAAE,UAAU,kBAAkB,cAAc;AAChD,MAAI,MAAM,QAAQ,SAAS,IAAI,SAAS,SAAS,EAC/C,QAAO,wBAAwB,SAAS;AAG1C,SAAO;GACL,0BAAU,IAAI,KAAuB;GACrC,+BAAe,IAAI,KAAsB;GAC1C;IACA,CAAC,SAAS,CAAC;CAEd,MAAM,aAAa,kBAAkB;EACnC,MAAMC,kBAAsC,EAAE;AAE9C,MAAI,gBACF,iBAAgB,KAAK,iBAAiB,CAAC;AAGzC,MAAI,OACF,iBAAgB,KAAK,yBAAyB,CAAC;AAGjD,kBAAgB,KAAK,kBAAkB,CAAC;AAExC,SAAO,QAAQ,IAAI,gBAAgB;IAClC;EACD;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,QAAQ,eACL;EACL;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QAAO,oCAAC,YAAY,YAAgB,SAAQ,SAAgC;;AAG9E,MAAa,uBAAyC;CACpD,MAAM,UAAU,WAAW,YAAY;AACvC,KAAI,CAAC,QACH,OAAM,IAAI,MAAM,oDAAoD;AAEtE,QAAO"}
|
|
@@ -1 +0,0 @@
|
|
|
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":";;;;;;;;;;;;;;;AAGA,SAAgB,iBAAiB;CAC/B,MAAM,WAAW,WAAW,oBAAoB;AAehD,QAAO;EAAE,SAdO,aACb,SAAS;AACR,YAAS;IAAE,MAAM;IAAY;IAAM,CAAC;KAEtC,CAAC,SAAS,CACX;EASiB,cAPG,aAClB,aAAa;AACZ,YAAS;IAAE,MAAM;IAAiB;IAAU,CAAC;KAE/C,CAAC,SAAS,CACX;EAE+B;;AAGlC,SAAgB,sBAAsB;CACpC,MAAM,WAAW,WAAW,oBAAoB;AAehD,QAAO;EAAE,SAdO,aACb,SAAS;AACR,YAAS;IAAE,MAAM;IAAY;IAAM,CAAC;KAEtC,CAAC,SAAS,CACX;EASiB,gBAPK,aACpB,gBAAgB;AACf,YAAS;IAAE,MAAM;IAAoB;IAAa,CAAC;KAErD,CAAC,SAAS,CACX;EAEiC;;;;;ACrBpC,MAAM,oBAAoB,eACxB,WAAW,QAAQ,QAAQ,GAAG;AAEhC,MAAa,eAAe,YACzB,OAAO,QAAQ;CACd,MAAM,EACJ,SACA,OACA,gBACA,KAAK,iBACL,QAAQ,kBACR,WACA,mBAAmB,MACnB,gBACA,iBAAiB,6BACf;CAEJ,MAAM,UAAU,cAAc,WAAW,EAAE,EAAE,CAAC,QAAQ,CAAC;CAEvD,MAAM,eAAe,aAEjB,OACA,UACA,WACG;AACH,MAAI,WAAW,mBAAmB,CAAC,SACjC;AAEF,mBAAiB,SAAS;IAE5B,CAAC,eAAe,CACjB;AAED,QACE,oCAAC;EACM;EACM;EACP;EACG;EACE;EACS;EAClB,oBAAoB,QAAQ,aAC1B,QAAQ,aAAa,UAAU;EAEjC,iBAAiB,WAAW,QAAQ,cAAc;EAClD,UAAU;EACV,cAAc,WACZ,oCAAC;GACC,GAAI;GACG;GACP,SAAQ;GACR,GAAI;IACJ;EAEJ,eAAe,WACb,oCAAC;GACC,OAAO;IAAE,OAAO;IAAQ,QAAQ;IAAQ;GAExC,aAAa,GAAG,eAAe,GAAG,iBAChC,QAAQ,cAAc,GACvB;KAEA,QAAQ,cAAc,GACpB;GAEP;EAGP;AAED,aAAa,cAAc;;;;AC1E3B,MAAaA,sBAAyD,EACpE,SACA,gBACA,kBACI;CACJ,MAAM,UAAU,cACZ,+CAA+C,YAAY,+CAC3D;AAEJ,QACE,oCAAC;EACC,MAAM;EACN,OAAM;EACG;EACT,iBAAiB;EACjB,iBAAiB;EACjB;EACA;IAEA,oCAAC;EACU;EACT,OAAO;EACS;EAChB,OAAM;EACN,IAAG;EACH,kBAAkB;EAClB,gBAAe;GACf,CACW;;;;;;;;;ACvBnB,MAAM,sBAAsB,iBAAiB;CAC3C,MAAM,EACJ,eAAe,kBACf,qBACE,gBAAgB,WAAW;EAC7B,eAAe,MAAM;EACrB,kBAAkB,MAAM;EACzB,EAAE;AAIH,iBAAgB;AACd,MACE,iBACC,kBAAkB,aAAa,aAAa,YAC3C,kBAAkB,SAAS,aAAa,cACxC,kBAAkB,eAAe,aAAa,cAC9C,kBAAkB,UAAU,aAAa,OAE3C,kBAAiB;GACf,UAAU,aAAa;GACvB,MAAM,aAAa;GACnB,YAAY,aAAa;GACzB,OAAO,cAAc,SAAS;GAC/B,CAAC;IAEH;EAAC;EAAc;EAAkB;EAAiB,CAAC;;;;;;AAOxD,MAAM,iBAAiB,IAAI,SAAS;CAElC,MAAM,CAAC,EAAE,MAAM,WAAW,sBAAsB,YAC9C,cAAc,kBACd,SAAS,MAAM,GAAG,gBAClB,EAAE,EACF,CAAC,GACF;CAED,MAAM,CAAC,EAAE,MAAM,cAAc,YAC3B,cAAc,gBACd,YACA,EAAE,EACF,CAAC,GACF;CAGD,MAAM,uBAAuB,cAAc,OAAO;CAClD,MAAM,iBAAiB,uBACnB,OAAO,qBAAqB,GAC5B;CACJ,MAAM,wBACJ,OAAO,mBAAmB,YAAY,CAAC,OAAO,MAAM,eAAe,IAAI,mBAAmB,cAAc;CAE1G,MAAM,sBAAsB,cAAc;AACxC,MAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAET,MAAI,CAAC,yBAAyB,mBAAmB,KAC/C,QAAO;AAET,SAAO,QAAQ,QAAQ,WACrB,QAAQ,UAAU,MACf,YAAY,SAAS,cAAc,eACrC,CACF;IACA;EAAC;EAAS;EAAuB;EAAe,CAAC;CAGpD,MAAM,eACJ,MAAM,mBAAmB,MAAM,QAAQ,QAAQ,GAC3C,QAAQ,MAAM,WAAW,OAAO,aAAa,KAAK,gBAAgB,IAClE,OACA;CAGN,MAAM,kBACJ,cAAc,eAAe,gBAAgB;CAG/C,MAAM,mBAAmB,cAAc;AACrC,MAAI,CAAC,yBAAyB,mBAAmB,KAC/C,QAAO;AAET,MAAI,CAAC,MAAM,QAAQ,SAAS,CAC1B,QAAO;AAET,SACE,SAAS,MACN,YAAY,SAAS,cAAc,eACrC,EAAE,QAAQ;IAEZ;EAAC;EAAU;EAAuB;EAAe,CAAC;CAErD,MAAM,gBAAgB,MAAM,eAAe;CAE3C,MAAM,qBACJ,MAAM,QAAQ,QAAQ,IAAI,QAAQ,WAAW,KAAK;CAEpD,MAAM,qBACJ,MAAM,QAAQ,oBAAoB,IAAI,oBAAoB,SAAS;CAErE,MAAM,uBAAuB,CAAC,wBAC1B,OACA,qBAAqB,MAClB,WAAW,OAAO,aAAa,MAAM,gBACvC,IAAI;CAET,MAAM,mBACJ,iBACA,yBACA,MAAM,QAAQ,oBAAoB,IAClC,oBAAoB,WAAW;CAEjC,MAAM,iCACJ,iBACA,yBACA,sBACA,CAAC,wBACD,mBAAmB,cAAc;CAEnC,MAAM,iBAAiB,cACd,MAAM,QAAQ,oBAAoB,GAAG,sBAAsB,EAAE,EACpE,CAAC,oBAAoB,CACtB;CAED,MAAM,0BAA0B,uBAC5B,eACA,eAAe,MAAM;AAGzB,QAAO;EACL,aAAa,WAAW;EACxB;EACA;EACA;EACA,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACD;;AAIH,MAAa,kBAAkB,EAAE,eAAe;CAC9C,MAAM,OAAO,SAAS;AACA,aAAY;CAClC,MAAM,KAAK,MAAM;CACjB,MAAM,EAAE,iBAAiB,gBAAgB;CAGzC,MAAM,EACJ,aACA,qBACA,cACA,iBACA,SACA,oBACA,kBACA,gCACA,gBACA,yBACA,qBACE,cAAc,IAAI,KAAK;AAE3B,oBAAmB,aAAa;CAGhC,MAAM,qBAAqB,aACxB,WAAW;AACV,MAAI,CAAC,OAAQ;AACb,cAAY,OAAO,SAAS;AAC5B,eAAa,OAAO,SAAS;IAE/B,CAAC,aAAa,CACf;AAGD,KAAI,sBAAsB,iBACxB,QACE,oCAAC;EACC,OAAM;EACN,SAAQ;EACR,MAAM;EACN,iBAAiB;EACjB,iBAAiB;GACjB;AAGN,KAAI,+BACF,QAEI,oCAAC;EACC,MAAM;EACN,SAAS;EACT,eAAe;EACf,gBAAgB;EAChB,aAAa;GACb;AAKR,QACE,oCAAC,cAAc,YACb,OAAO;EACL;EACA;EACA;EACA;EACA;EACD,IAED,oCAAC,oBACE,SACY,CACQ"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|