@erpsquad/common 1.10.48 → 1.10.50
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/chunks/{ERPUIProvider-8mElUzct.esm.js → ERPUIProvider-Cl_IkhGu.esm.js} +3 -3
- package/dist/chunks/{ERPUIProvider-8mElUzct.esm.js.map → ERPUIProvider-Cl_IkhGu.esm.js.map} +1 -1
- package/dist/chunks/{ERPUIProvider-DUddcKKd.js → ERPUIProvider-Ct7W7gdB.js} +3 -3
- package/dist/chunks/{ERPUIProvider-DUddcKKd.js.map → ERPUIProvider-Ct7W7gdB.js.map} +1 -1
- package/dist/chunks/{android-12-switch-DZIVs27n.esm.js → android-12-switch-C54QA5wF.esm.js} +17 -11
- package/dist/chunks/{android-12-switch-DZIVs27n.esm.js.map → android-12-switch-C54QA5wF.esm.js.map} +1 -1
- package/dist/chunks/{android-12-switch-BGI79wfm.js → android-12-switch-Djjm2vTz.js} +17 -11
- package/dist/chunks/{android-12-switch-BGI79wfm.js.map → android-12-switch-Djjm2vTz.js.map} +1 -1
- package/dist/chunks/{default-data-CwonfBNr.esm.js → default-data-CdxNaeR_.esm.js} +4 -4
- package/dist/chunks/{default-data-CwonfBNr.esm.js.map → default-data-CdxNaeR_.esm.js.map} +1 -1
- package/dist/chunks/{default-data-C-SQMwzL.js → default-data-DMwLPcgS.js} +4 -4
- package/dist/chunks/{default-data-C-SQMwzL.js.map → default-data-DMwLPcgS.js.map} +1 -1
- package/dist/chunks/{page-context-EoVDp9wP.js → page-context-B4zx0GZ5.js} +31 -20
- package/dist/chunks/page-context-B4zx0GZ5.js.map +1 -0
- package/dist/chunks/{page-context-Clevzuyw.esm.js → page-context-_PTfsRfz.esm.js} +31 -20
- package/dist/chunks/page-context-_PTfsRfz.esm.js.map +1 -0
- package/dist/chunks/{uom-field-wrapper-B4lf_fHb.js → uom-field-wrapper-CH15YmR7.js} +5 -5
- package/dist/chunks/{uom-field-wrapper-B4lf_fHb.js.map → uom-field-wrapper-CH15YmR7.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-DJQKkyw5.esm.js → uom-field-wrapper-T8Ot7tIb.esm.js} +5 -5
- package/dist/chunks/{uom-field-wrapper-DJQKkyw5.esm.js.map → uom-field-wrapper-T8Ot7tIb.esm.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-B52DoZdU.esm.js → useAccountSetting-B9iSkd0R.esm.js} +2 -2
- package/dist/chunks/{useAccountSetting-B52DoZdU.esm.js.map → useAccountSetting-B9iSkd0R.esm.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-DKYF0ha6.js → useAccountSetting-DLSuTSbZ.js} +2 -2
- package/dist/chunks/{useAccountSetting-DKYF0ha6.js.map → useAccountSetting-DLSuTSbZ.js.map} +1 -1
- package/dist/chunks/{useAdditionalDiscountAutoCalc-BXvF0pCQ.js → useAdditionalDiscountAutoCalc-BM8q5jHy.js} +2 -2
- package/dist/chunks/{useAdditionalDiscountAutoCalc-BXvF0pCQ.js.map → useAdditionalDiscountAutoCalc-BM8q5jHy.js.map} +1 -1
- package/dist/chunks/{useAdditionalDiscountAutoCalc-Br4A8SBr.esm.js → useAdditionalDiscountAutoCalc-CMSSqS9h.esm.js} +2 -2
- package/dist/chunks/{useAdditionalDiscountAutoCalc-Br4A8SBr.esm.js.map → useAdditionalDiscountAutoCalc-CMSSqS9h.esm.js.map} +1 -1
- package/dist/components/index.esm.js +4 -4
- package/dist/components/index.js +4 -4
- package/dist/contexts/index.esm.js +1 -1
- package/dist/contexts/index.js +1 -1
- package/dist/hooks/index.esm.js +3 -3
- package/dist/hooks/index.js +3 -3
- package/dist/index.esm.js +7 -7
- package/dist/index.js +7 -7
- package/dist/views/index.esm.js +3 -3
- package/dist/views/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunks/page-context-Clevzuyw.esm.js.map +0 -1
- package/dist/chunks/page-context-EoVDp9wP.js.map +0 -1
|
@@ -4,14 +4,14 @@ import { l as loadModuleTranslations } from "./translations-DVs6ljbG.esm.js";
|
|
|
4
4
|
import { m as modules } from "./modules-Dw3Ho8Qj.esm.js";
|
|
5
5
|
import { u as useAuth, a as AuthProvider } from "./useAuth-Cc85zx55.esm.js";
|
|
6
6
|
import { useDispatch, Provider } from "react-redux";
|
|
7
|
-
import { f as usePages } from "./useAccountSetting-
|
|
7
|
+
import { f as usePages } from "./useAccountSetting-B9iSkd0R.esm.js";
|
|
8
8
|
import { useLocation, BrowserRouter } from "react-router-dom";
|
|
9
9
|
import { j as jsxRuntimeExports } from "./jsx-runtime-ClFauRgV.esm.js";
|
|
10
10
|
import { useSnackbar, enqueueSnackbar, SnackbarProvider } from "notistack";
|
|
11
11
|
import { c as createLibraryStore } from "./store-DY2m64HU.esm.js";
|
|
12
12
|
import { M as MUIThemeWrapper, c as createDarkTheme, a as createLightTheme } from "./theme-impl-BPCaapgh.esm.js";
|
|
13
13
|
import { a as LanguageProvider } from "./languageContext-DvTW1NGX.esm.js";
|
|
14
|
-
import { c as PermissionsProvider } from "./page-context-
|
|
14
|
+
import { c as PermissionsProvider } from "./page-context-_PTfsRfz.esm.js";
|
|
15
15
|
import { i as initializeApiConfig } from "./api-config-GOys-syK.esm.js";
|
|
16
16
|
import { a$ as initializeApiBaseUrls, z as extendApiConfigurations } from "./common-KSaUU42L.esm.js";
|
|
17
17
|
import { s as setModuleRoutes } from "./module-routes-config-CCkZEtfg.esm.js";
|
|
@@ -301,4 +301,4 @@ export {
|
|
|
301
301
|
useSnackbarRef as d,
|
|
302
302
|
useERPUI as u
|
|
303
303
|
};
|
|
304
|
-
//# sourceMappingURL=ERPUIProvider-
|
|
304
|
+
//# sourceMappingURL=ERPUIProvider-Cl_IkhGu.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ERPUIProvider-8mElUzct.esm.js","sources":["../../src/hooks/use-translations.ts","../../src/hooks/useDataFetcher.tsx","../../src/hooks/apiHelper.ts","../../src/components/providers/ERPUIProvider.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\n// import { useLocation } from 'react-router-dom'\r\nimport { getI18n, useTranslation } from 'react-i18next'\r\nimport { loadModuleTranslations } from '../utils/translations'\r\nimport modules from '../constants/modules'\r\nimport { useAuth } from './useAuth'\r\n\r\n// Global state to prevent duplicate calls across all hook instances\r\nlet globalLastLoadedModules = ''\r\nlet globalIsLoading = false\r\nlet globalInitialLoad = false\r\n\r\nexport const useAppTranslations = () => {\r\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\r\n\tconst location = window.location\r\n\tconst i18nInstance = getI18n()\r\n\tconst { user, loading } = useAuth()\r\n\tconst { t } = useTranslation()\r\n\r\n\tuseEffect(() => {\r\n\t\tconst erpModules = modules(t)\r\n\t\tconst currentPath = location.pathname.toLowerCase()\r\n\t\tif(user?.id && !loading) {\r\n\t\r\n\t\t\tconst matchedModule = erpModules.find(\r\n\t\t\t\t(mod) =>\r\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\r\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\r\n\t\t\t)\r\n\t\r\n\t\t\tlet modulesToLoad: string[] = []\r\n\t\r\n\t\t\tif (matchedModule?.translationModule) {\r\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\r\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\r\n\t\t\t\tmodulesToLoad = ['common']\r\n\t\t\t}\r\n\t\r\n\t\t\tif (modulesToLoad.length > 0) {\r\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\r\n\t\r\n\t\t\t\t// Skip if same modules are already loaded or currently loading\r\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\r\n\t\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\tglobalIsLoading = true\r\n\t\t\t\tglobalLastLoadedModules = moduleKey\r\n\t\t\t\tsetIsLoading(true)\r\n\t\r\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\r\n\t\t\t\t\tglobalIsLoading = false\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// No modules to load, but still need to handle initial load state\r\n\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location.pathname, t, user, loading])\r\n\r\n\treturn { isLoading }\r\n};\r\n\r\nexport default useAppTranslations;\r\n","import { useCallback, useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePages } from './use-pages';\r\nimport { useLocation } from 'react-router-dom';\r\ninterface FilterParams {\r\n\tskip: number;\r\n\tlimit: number;\r\n\tsearch?: string;\r\n\tselect?: string;\r\n\torder?: string;\r\n\tfilters?: string;\r\n}\r\n\r\ninterface ActivePage {\r\n\tsort?: { id: string; desc: boolean };\r\n\tfilterQueryString?: string;\r\n\tsearch?: string;\r\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\r\n}\r\n\r\nconst useGenericDataFetcher = (\r\n\tcols?: ActivePage,\r\n\tpagination: { skip: number; limit: number },\r\n\tfetchAction: (filters: FilterParams) => void,\r\n\tcustomeFilter: any = '',\r\n\tcustomDeps?: any[],\r\n\tshowCreatedBy: boolean = true,\r\n\tcustomFields?: any = []\r\n) => {\r\n\tconst { activePage } = usePages();\r\n\tconst dispatch = useDispatch();\r\n\tconst location = useLocation();\r\n\r\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\r\n\r\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\r\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath !== location?.pathname) {\r\n\t\t\tsetTrackedPath(location?.pathname);\r\n\t\t\tsetTrackedColumns([]);\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\r\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\r\n\t\t\t\tsetTrackedColumns(sourceColumns);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath, sourceColumns]);\r\n\r\n\tconst getProcessedFilters = useCallback(() => {\r\n\t\tconst { filterQueryString } = activePage || {};\r\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\r\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\r\n\t\tlet filters = customeFilter;\r\n\r\n\t\tif (extraQueryString) {\r\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\r\n\t\t} else if (filters) {\r\n\t\t\tfilters = `(${filters})`;\r\n\t\t}\r\n\r\n\t\treturn filters || undefined;\r\n\t\t//eslint-disable-next-line\r\n\t}, [activePage.filterQueryString, customeFilter]);\r\n\r\n\tconst fetchData = useCallback(() => {\r\n\t\tif (!fetchAction) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { sort = null, search } = activePage;\r\n\r\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\r\n\r\n\t\tconst filters = getProcessedFilters();\r\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\r\n\r\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\r\n\t\t\t?.map((item) =>\r\n\t\t\t\titem.accessorKey?.includes(\".\")\r\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\r\n\t\t\t\t\t: item.accessorKey\r\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\r\n\t\tconst payload: FilterParams = {\r\n\t\t\tskip: activePage?.skip || pagination?.skip,\r\n\t\t\tlimit: pagination.limit,\r\n\t\t\tsearch,\r\n\t\t\tselect: selectPayload,\r\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t...(filters && { filters }),\r\n\t\t};\r\n\r\n\t\tdispatch(fetchAction(payload));\r\n\t\t//eslint-disable-next-line\r\n\t}, [\r\n\t\ttrackedColumns,\r\n\t\tactivePage.sort,\r\n\t\tactivePage.filterQueryString,\r\n\t\tactivePage.search,\r\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\r\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\r\n\t\t// here would make fetchData identity change twice per pagination click,\r\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\r\n\t\tactivePage?.skip,\r\n\t\tpagination?.limit,\r\n\t\tdispatch,\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t...(customDeps || []),\r\n\t]);\r\n\r\n\r\n\r\n\treturn fetchData;\r\n};\r\n\r\nexport default useGenericDataFetcher;\r\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\r\n\r\ntype ApiResponse = {\r\n meta?: {\r\n requestStatus?: string;\r\n };\r\n error?: {\r\n message?: string;\r\n };\r\n payload?: any\r\n};\r\n\r\ntype Callback = () => void;\r\n\r\nlet globalEnqueueSnackbar: any = null;\r\n\r\nexport const useSnackbarRef = (): void => {\r\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\r\n globalEnqueueSnackbar = snackbarHook;\r\n};\r\n\r\nexport function apiHelper(\r\n res: ApiResponse,\r\n callBack?: Callback,\r\n enqueueSnackbarOverride?: any\r\n): void {\r\n if (res?.meta?.requestStatus === \"rejected\") {\r\n const errorMessage = (() => {\r\n try {\r\n const msg = res.error?.message || res?.payload?.message;\r\n return msg ? JSON.parse(msg) : null;\r\n } catch {\r\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\r\n }\r\n })();\r\n\r\n const rawError = errorMessage?.message;\r\n let message = \"Something went wrong\";\r\n\r\n if (typeof rawError === \"string\") {\r\n message = rawError.replace(\"Error:\", \"\").trim();\r\n } else if (rawError && typeof rawError === \"object\") {\r\n message = (rawError as any).message || JSON.stringify(rawError);\r\n } else if (rawError) {\r\n message = String(rawError);\r\n }\r\n\r\n const snackbar = typeof enqueueSnackbarOverride === 'function'\r\n ? enqueueSnackbarOverride\r\n : (globalEnqueueSnackbar || enqueueSnackbar);\r\n\r\n if (typeof snackbar === \"function\") {\r\n snackbar(message, { variant: \"error\" });\r\n }\r\n return;\r\n }\r\n\r\n if (callBack) {\r\n if (typeof callBack === \"function\") {\r\n try {\r\n callBack();\r\n } catch (err) {\r\n console.error(\"[apiHelper] callBack threw an error:\", err);\r\n }\r\n } else {\r\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\r\n }\r\n }\r\n}\r\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport CssBaseline from '@mui/material/CssBaseline';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\r\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\r\nimport { AuthProvider } from '../../contexts/AuthContext';\r\nimport { LanguageProvider } from '../../contexts/languageContext';\r\nimport { PageProvider } from '../../contexts/page-context';\r\nimport { PermissionsProvider } from '../../contexts/permission-context';\r\nimport MUIThemeWrapper from '../../theme/themeWrapper';\r\nimport Loader from '../loader';\r\nimport useAppTranslations from '../../hooks/use-translations';\r\nimport '../../utils/i18n';\r\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\r\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\r\nimport { setModuleRoutes } from '../../utils/module-routes-config';\r\nimport { useSnackbarRef } from '../../hooks/apiHelper';\r\n\r\nconst SnackbarRefTracker: React.FC = () => {\r\n useSnackbarRef();\r\n return null;\r\n};\r\n\r\n\r\n// Context for library configuration\r\ninterface ERPUIContextValue {\r\n useRedux: boolean;\r\n apiClient?: ApiClientConfig;\r\n theme?: any;\r\n themeMode: 'light' | 'dark';\r\n direction: 'ltr' | 'rtl';\r\n primaryColor?: Color;\r\n}\r\n\r\nconst ERPUIContext = createContext<ERPUIContextValue>({\r\n useRedux: false,\r\n themeMode: 'light',\r\n direction: 'ltr',\r\n});\r\n\r\nexport const useERPUI = () => useContext(ERPUIContext);\r\n\r\n// Provider props interface\r\ninterface ERPUIProviderProps {\r\n children: ReactNode;\r\n\r\n // Redux configuration\r\n useRedux?: boolean;\r\n reduxStore?: any;\r\n apiClient?: ApiClientConfig;\r\n additionalReducers?: Record<string, any>;\r\n\r\n // Theme configuration\r\n theme?: any;\r\n themeMode?: 'light' | 'dark';\r\n primaryColor?: Color;\r\n direction?: 'ltr' | 'rtl';\r\n\r\n // Context providers configuration\r\n enableAuth?: boolean;\r\n enableLanguage?: boolean;\r\n enablePages?: boolean;\r\n enablePermissions?: boolean;\r\n enableRouter?: boolean;\r\n enableSnackbar?: boolean;\r\n\r\n // Other configuration\r\n enableCssBaseline?: boolean;\r\n snackbarConfig?: {\r\n maxSnack?: number;\r\n anchorOrigin?: {\r\n vertical: 'top' | 'bottom';\r\n horizontal: 'left' | 'center' | 'right';\r\n };\r\n autoHideDuration?: number;\r\n };\r\n\r\n // API configuration\r\n apiConfig?: ApiConfig;\r\n\r\n // Additional API configurations to extend the shared apiConfigurations map\r\n additionalApiConfigurations?: Record<string, any>;\r\n\r\n // Module routes override — allows MFE apps to inject their own full route set\r\n // so the header module dropdown can match routes correctly.\r\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\r\n moduleRoutes?: Record<string, string[]>;\r\n\r\n // Route maps\r\n routeToColumnsMap?: Record<string, any>;\r\n routeToResourceMap?: Record<string, any>;\r\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\r\n}\r\n\r\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\r\n children,\r\n\r\n // Redux props\r\n useRedux = false,\r\n reduxStore,\r\n apiClient,\r\n additionalReducers = {},\r\n\r\n // Theme props\r\n theme: customTheme,\r\n themeMode = 'light',\r\n primaryColor,\r\n direction = 'ltr',\r\n\r\n // Context providers configuration\r\n enableAuth = true,\r\n enableLanguage = true,\r\n enablePages = true,\r\n enablePermissions = true,\r\n enableRouter = false, // Default false since consuming app usually provides router\r\n enableSnackbar = true,\r\n\r\n // Other props\r\n enableCssBaseline = true,\r\n snackbarConfig = {\r\n maxSnack: 3,\r\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\r\n autoHideDuration: 5000,\r\n },\r\n\r\n // API configuration\r\n apiConfig: providedApiConfig,\r\n additionalApiConfigurations,\r\n moduleRoutes,\r\n routeToColumnsMap,\r\n routeToResourceMap,\r\n publicRoutes = [], // Default empty array for public routes in AuthProvider \r\n}) => {\r\n console.log(\"additionalApiConfigurations...........\", additionalApiConfigurations)\r\n\r\n // Initialize API configuration synchronously before first render\r\n // This prevents \"API configuration not initialized\" errors when components\r\n // try to use the API during initial render\r\n const isInitialized = React.useRef(false);\r\n\r\n if (providedApiConfig && !isInitialized.current) {\r\n try {\r\n initializeApiConfig(providedApiConfig);\r\n initializeApiBaseUrls();\r\n if (additionalApiConfigurations) {\r\n extendApiConfigurations(additionalApiConfigurations);\r\n }\r\n // Inject MFE-provided module routes so the header can resolve modules\r\n if (moduleRoutes) {\r\n setModuleRoutes(moduleRoutes);\r\n }\r\n isInitialized.current = true;\r\n } catch (error) {\r\n console.error('Failed to initialize API configuration:', error);\r\n }\r\n }\r\n // const { isLoading } = useAppTranslations();\r\n // if (isLoading) {\r\n // return <Loader />;\r\n // }\r\n // Create or use provided Redux store\r\n const store = React.useMemo(() => {\r\n if (!useRedux) return null;\r\n\r\n if (reduxStore) {\r\n return reduxStore;\r\n }\r\n\r\n return createLibraryStore(additionalReducers, apiClient);\r\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\r\n\r\n // Create theme\r\n const theme = React.useMemo(() => {\r\n if (customTheme) {\r\n return customTheme;\r\n }\r\n\r\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\r\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\r\n return generatedTheme;\r\n }, [customTheme, themeMode, primaryColor, direction]);\r\n\r\n // Context value\r\n const contextValue: ERPUIContextValue = {\r\n useRedux,\r\n apiClient,\r\n theme,\r\n themeMode,\r\n direction,\r\n primaryColor,\r\n };\r\n\r\n // Build provider tree from inside out\r\n let content = (\r\n <ERPUIContext.Provider value={contextValue}>\r\n {/* <ThemeProvider theme={theme}>\r\n {enableCssBaseline && <CssBaseline />} */}\r\n {/* <Suspense fallback={<Loader />}> */}\r\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\r\n {children}\r\n </MUIThemeWrapper>\r\n {/* </Suspense> */}\r\n {/* </ThemeProvider> */}\r\n </ERPUIContext.Provider>\r\n );\r\n\r\n // Wrap with snackbar provider if enabled\r\n if (enableSnackbar) {\r\n content = (\r\n <SnackbarProvider {...snackbarConfig}>\r\n <SnackbarRefTracker />\r\n {content}\r\n </SnackbarProvider>\r\n );\r\n }\r\n\r\n // Wrap with page provider if enabled\r\n // if (enablePages) {\r\n // content = (\r\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\r\n // {content}\r\n // </PageProvider>\r\n // );\r\n // }\r\n\r\n // Wrap with permissions provider if enabled\r\n if (enablePermissions) {\r\n content = (\r\n <PermissionsProvider>\r\n {content}\r\n </PermissionsProvider>\r\n );\r\n }\r\n\r\n // Wrap with language provider if enabled\r\n if (enableLanguage) {\r\n content = (\r\n <LanguageProvider>\r\n {content}\r\n </LanguageProvider>\r\n );\r\n }\r\n\r\n // Wrap with auth provider if enabled\r\n if (enableAuth) {\r\n content = (\r\n <AuthProvider publicRoutes={publicRoutes}>\r\n {content}\r\n </AuthProvider>\r\n );\r\n }\r\n\r\n // Wrap with router if enabled\r\n if (enableRouter) {\r\n content = (\r\n <BrowserRouter>\r\n {content}\r\n </BrowserRouter>\r\n );\r\n }\r\n\r\n // Wrap with Redux provider if enabled\r\n if (useRedux && store) {\r\n content = (\r\n <ReduxProvider store={store}>\r\n {content}\r\n </ReduxProvider>\r\n );\r\n }\r\n\r\n return content;\r\n};\r\n\r\nexport default ERPUIProvider;"],"names":["_a","React","jsx","jsxs","ReduxProvider"],"mappings":";;;;;;;;;;;;;;;;;AAQA,IAAI,0BAA0B;AAC9B,IAAI,kBAAkB;AACtB,IAAI,oBAAoB;AAEjB,MAAM,qBAAqB,MAAM;AACvC,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,iBAAiB;AAC5D,QAAM,WAAW,OAAO;AACxB,QAAM,eAAe,QAAA;AACrB,QAAM,EAAE,MAAM,QAAA,IAAY,QAAA;AAC1B,QAAM,EAAE,EAAA,IAAM,eAAA;AAEd,YAAU,MAAM;AACf,UAAM,aAAa,QAAQ,CAAC;AAC5B,UAAM,cAAc,SAAS,SAAS,YAAA;AACtC,SAAG,6BAAM,OAAM,CAAC,SAAS;AAExB,YAAM,gBAAgB,WAAW;AAAA,QAChC,CAAC,QAAA;;AACA,qBAAI,KAAK,YAAA,MAAkB,iBAC3B,SAAI,oBAAJ,mBAAqB,KAAK,CAAC,UAAkB,YAAY,WAAW,MAAM,aAAa;AAAA;AAAA,MAAC;AAG1F,UAAI,gBAA0B,CAAA;AAE9B,UAAI,+CAAe,mBAAmB;AACrC,wBAAgB,CAAC,GAAG,cAAc,mBAAmB,QAAQ;AAAA,MAC9D,WAAW,CAAC,iBAAiB,gBAAgB,cAAc;AAC1D,wBAAgB,CAAC,QAAQ;AAAA,MAC1B;AAEA,UAAI,cAAc,SAAS,GAAG;AAC7B,cAAM,YAAY,CAAC,GAAG,aAAa,EAAE,KAAA,EAAO,KAAK,GAAG;AAGpD,YAAI,4BAA4B,aAAa,iBAAiB;AAC7D,cAAI,mBAAmB;AACtB,yBAAa,KAAK;AAClB,gCAAoB;AAAA,UACrB;AACA;AAAA,QACD;AAEA,0BAAkB;AAClB,kCAA0B;AAC1B,qBAAa,IAAI;AAEjB,+BAAuB,eAAe,YAAY,EAAE,QAAQ,MAAM;AACjE,4BAAkB;AAClB,uBAAa,KAAK;AAClB,8BAAoB;AAAA,QACrB,CAAC;AAAA,MACF,OAAO;AAEN,YAAI,mBAAmB;AACtB,uBAAa,KAAK;AAClB,8BAAoB;AAAA,QACrB;AAAA,MACD;AAAA,IACD;AAAA,EACD,GAAG,CAAC,SAAS,UAAU,GAAG,MAAM,OAAO,CAAC;AAExC,SAAO,EAAE,UAAA;AACV;AClDA,MAAM,wBAAwB,CAC7B,MACA,YACA,aACA,gBAAqB,IACrB,YACA,gBAAyB,MACzB,eAAqB,CAAA,MACjB;AACJ,QAAM,EAAE,WAAA,IAAe,SAAA;AACvB,QAAM,WAAW,YAAA;AACjB,QAAM,WAAW,YAAA;AAEjB,QAAM,gBAAgB,MAAM,QAAQ,IAAI,IAAI,6BAAM,OAAO,CAAC,QAAa,IAAI,WAAW,yCAAY;AAElG,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAgB,CAAA,CAAE;AAE9D,YAAU,MAAM;AACf,QAAI,iBAAgB,qCAAU,WAAU;AACvC,qBAAe,qCAAU,QAAQ;AACjC,wBAAkB,CAAA,CAAE;AAAA,IACrB;AAAA,EACD,GAAG,CAAC,qCAAU,UAAU,WAAW,CAAC;AAEpC,YAAU,MAAM;AACf,QAAI,iBAAgB,qCAAU,cAAY,+CAAe,UAAS,GAAG;AACpE,UAAI,KAAK,UAAU,cAAc,MAAM,KAAK,UAAU,aAAa,GAAG;AACrE,0BAAkB,aAAa;AAAA,MAChC;AAAA,IACD;AAAA,EACD,GAAG,CAAC,qCAAU,UAAU,aAAa,aAAa,CAAC;AAEnD,QAAM,sBAAsB,YAAY,MAAM;AAC7C,UAAM,EAAE,sBAAsB,cAAc,CAAA;AAC5C,UAAM,eAAc,uDAAmB,WAAW,SAAS,QAAO;AAClE,UAAM,mBAAmB,YAAY,SAAS,IAAI,WAAW,KAAK;AAClE,QAAI,UAAU;AAEd,QAAI,kBAAkB;AACrB,gBAAU,UAAU,IAAI,OAAO,GAAG,gBAAgB,MAAM,IAAI,gBAAgB;AAAA,IAC7E,WAAW,SAAS;AACnB,gBAAU,IAAI,OAAO;AAAA,IACtB;AAEA,WAAO,WAAW;AAAA,EAEnB,GAAG,CAAC,WAAW,mBAAmB,aAAa,CAAC;AAEhD,QAAM,YAAY,YAAY,MAAM;AACnC,QAAI,CAAC,aAAa;AACjB;AAAA,IACD;AACA,UAAM,EAAE,OAAO,MAAM,OAAA,IAAW;AAEhC,QAAI,CAAC,kBAAkB,eAAe,WAAW,EAAG;AAEpD,UAAM,UAAU,oBAAA;AAChB,UAAM,iBAAiB,iDAAgB,OAAO,CAAC,OAAO,GAAG;AAEzD,UAAM,iBAAgB,iDAAgB,UAAS,IAAI,IAAI,iDACpD;AAAA,MAAI,CAAC,SAAA;;AACN,2BAAK,gBAAL,mBAAkB,SAAS,QACxB,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC,IAC7B,KAAK;AAAA;AAAA,KACR,GAAG,gBAAgB,gCAAgC,EAAE,IAAG,6CAAc,UAAS,IAAI,6CAAc,KAAK,IAAI,KAAK,EAAE,MAAM;AACzH,UAAM,UAAwB;AAAA,MAC7B,OAAM,yCAAY,UAAQ,yCAAY;AAAA,MACtC,OAAO,WAAW;AAAA,MAClB;AAAA,MACA,QAAQ;AAAA,MACR,GAAI,QAAQ,EAAE,OAAO,GAAG,KAAK,EAAE,IAAI,KAAK,OAAO,KAAK,CAAC,GAAA;AAAA,MACrD,GAAI,WAAW,EAAE,QAAA;AAAA,IAAQ;AAG1B,aAAS,YAAY,OAAO,CAAC;AAAA,EAE9B,GAAG;AAAA,IACF;AAAA,IACA,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA,IAKX,yCAAY;AAAA,IACZ,yCAAY;AAAA,IACZ;AAAA;AAAA,IAEA,GAAI,cAAc,CAAA;AAAA,EAAC,CACnB;AAID,SAAO;AACR;ACtGA,IAAI,wBAA6B;AAE1B,MAAM,iBAAiB,MAAY;AACxC,QAAM,EAAE,iBAAiB,aAAA,IAAiB,YAAA;AAC1C,0BAAwB;AAC1B;AAEO,SAAS,UACd,KACA,UACA,yBACM;;AACN,QAAI,gCAAK,SAAL,mBAAW,mBAAkB,YAAY;AAC3C,UAAM,gBAAgB,MAAM;;AAC1B,UAAI;AACF,cAAM,QAAMA,MAAA,IAAI,UAAJ,gBAAAA,IAAW,cAAW,gCAAK,YAAL,mBAAc;AAChD,eAAO,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,MACjC,QAAQ;AACN,eAAO,EAAE,WAAS,SAAI,UAAJ,mBAAW,cAAW,gCAAK,YAAL,mBAAc,YAAW,uBAAA;AAAA,MACnE;AAAA,IACF,GAAA;AAEA,UAAM,WAAW,6CAAc;AAC/B,QAAI,UAAU;AAEd,QAAI,OAAO,aAAa,UAAU;AAChC,gBAAU,SAAS,QAAQ,UAAU,EAAE,EAAE,KAAA;AAAA,IAC3C,WAAW,YAAY,OAAO,aAAa,UAAU;AACnD,gBAAW,SAAiB,WAAW,KAAK,UAAU,QAAQ;AAAA,IAChE,WAAW,UAAU;AACnB,gBAAU,OAAO,QAAQ;AAAA,IAC3B;AAEA,UAAM,WAAW,OAAO,4BAA4B,aAChD,0BACC,yBAAyB;AAE9B,QAAI,OAAO,aAAa,YAAY;AAClC,eAAS,SAAS,EAAE,SAAS,QAAA,CAAS;AAAA,IACxC;AACA;AAAA,EACF;AAEA,MAAI,UAAU;AACZ,QAAI,OAAO,aAAa,YAAY;AAClC,UAAI;AACF,iBAAA;AAAA,MACF,SAAS,KAAK;AACZ,gBAAQ,MAAM,wCAAwC,GAAG;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,cAAQ,KAAK,oDAAoD,OAAO,QAAQ;AAAA,IAClF;AAAA,EACF;AACF;AC/CA,MAAM,qBAA+B,MAAM;AACzC,iBAAA;AACA,SAAO;AACT;AAaA,MAAM,eAAe,cAAiC;AAAA,EACpD,UAAU;AAAA,EACV,WAAW;AAAA,EACX,WAAW;AACb,CAAC;AAEM,MAAM,WAAW,MAAM,WAAW,YAAY;AAsD9C,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA;AAAA,EAGA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,qBAAqB,CAAA;AAAA;AAAA,EAGrB,OAAO;AAAA,EACP,YAAY;AAAA,EACZ;AAAA,EACA,YAAY;AAAA;AAAA,EAGZ,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,oBAAoB;AAAA,EACpB,eAAe;AAAA;AAAA,EACf,iBAAiB;AAAA;AAAA,EAGjB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,cAAc,EAAE,UAAU,OAAO,YAAY,QAAA;AAAA,IAC7C,kBAAkB;AAAA,EAAA;AAAA;AAAA,EAIpB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe,CAAA;AAAA;AACjB,MAAM;AACJ,UAAQ,IAAI,0CAA0C,2BAA2B;AAKjF,QAAM,gBAAgBC,eAAM,OAAO,KAAK;AAExC,MAAI,qBAAqB,CAAC,cAAc,SAAS;AAC/C,QAAI;AACF,0BAAoB,iBAAiB;AACrC,4BAAA;AACA,UAAI,6BAA6B;AAC/B,gCAAwB,2BAA2B;AAAA,MACrD;AAEA,UAAI,cAAc;AAChB,wBAAgB,YAAY;AAAA,MAC9B;AACA,oBAAc,UAAU;AAAA,IAC1B,SAAS,OAAO;AACd,cAAQ,MAAM,2CAA2C,KAAK;AAAA,IAChE;AAAA,EACF;AAMA,QAAM,QAAQA,eAAM,QAAQ,MAAM;AAChC,QAAI,CAAC,SAAU,QAAO;AAEtB,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,WAAO,mBAAmB,oBAAoB,SAAS;AAAA,EACzD,GAAG,CAAC,UAAU,YAAY,oBAAoB,SAAS,CAAC;AAGxD,QAAM,QAAQA,eAAM,QAAQ,MAAM;AAChC,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,cAAc,SAAS,kBAAkB;AAC9D,UAAM,EAAE,OAAO,eAAA,IAAmB,aAAa,cAAc,SAAS;AACtE,WAAO;AAAA,EACT,GAAG,CAAC,aAAa,WAAW,cAAc,SAAS,CAAC;AAGpD,QAAM,eAAkC;AAAA,IACtC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAIF,MAAI,UACFC,kCAAAA,IAAC,aAAa,UAAb,EAAsB,OAAO,cAI5B,UAAAA,kCAAAA,IAAC,iBAAA,EAAgB,OAAc,mBAC5B,SAAA,CACH,GAGF;AAIF,MAAI,gBAAgB;AAClB,cACEC,kCAAAA,KAAC,kBAAA,EAAkB,GAAG,gBACpB,UAAA;AAAA,MAAAD,kCAAAA,IAAC,oBAAA,EAAmB;AAAA,MACnB;AAAA,IAAA,GACH;AAAA,EAEJ;AAYA,MAAI,mBAAmB;AACrB,cACEA,kCAAAA,IAAC,uBACE,UAAA,QAAA,CACH;AAAA,EAEJ;AAGA,MAAI,gBAAgB;AAClB,cACEA,kCAAAA,IAAC,oBACE,UAAA,QAAA,CACH;AAAA,EAEJ;AAGA,MAAI,YAAY;AACd,cACEA,kCAAAA,IAAC,cAAA,EAAa,cACX,UAAA,SACH;AAAA,EAEJ;AAGA,MAAI,cAAc;AAChB,cACEA,kCAAAA,IAAC,iBACE,UAAA,QAAA,CACH;AAAA,EAEJ;AAGA,MAAI,YAAY,OAAO;AACrB,cACEA,kCAAAA,IAACE,UAAA,EAAc,OACZ,UAAA,SACH;AAAA,EAEJ;AAEA,SAAO;AACT;"}
|
|
1
|
+
{"version":3,"file":"ERPUIProvider-Cl_IkhGu.esm.js","sources":["../../src/hooks/use-translations.ts","../../src/hooks/useDataFetcher.tsx","../../src/hooks/apiHelper.ts","../../src/components/providers/ERPUIProvider.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\n// import { useLocation } from 'react-router-dom'\r\nimport { getI18n, useTranslation } from 'react-i18next'\r\nimport { loadModuleTranslations } from '../utils/translations'\r\nimport modules from '../constants/modules'\r\nimport { useAuth } from './useAuth'\r\n\r\n// Global state to prevent duplicate calls across all hook instances\r\nlet globalLastLoadedModules = ''\r\nlet globalIsLoading = false\r\nlet globalInitialLoad = false\r\n\r\nexport const useAppTranslations = () => {\r\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\r\n\tconst location = window.location\r\n\tconst i18nInstance = getI18n()\r\n\tconst { user, loading } = useAuth()\r\n\tconst { t } = useTranslation()\r\n\r\n\tuseEffect(() => {\r\n\t\tconst erpModules = modules(t)\r\n\t\tconst currentPath = location.pathname.toLowerCase()\r\n\t\tif(user?.id && !loading) {\r\n\t\r\n\t\t\tconst matchedModule = erpModules.find(\r\n\t\t\t\t(mod) =>\r\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\r\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\r\n\t\t\t)\r\n\t\r\n\t\t\tlet modulesToLoad: string[] = []\r\n\t\r\n\t\t\tif (matchedModule?.translationModule) {\r\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\r\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\r\n\t\t\t\tmodulesToLoad = ['common']\r\n\t\t\t}\r\n\t\r\n\t\t\tif (modulesToLoad.length > 0) {\r\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\r\n\t\r\n\t\t\t\t// Skip if same modules are already loaded or currently loading\r\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\r\n\t\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\tglobalIsLoading = true\r\n\t\t\t\tglobalLastLoadedModules = moduleKey\r\n\t\t\t\tsetIsLoading(true)\r\n\t\r\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\r\n\t\t\t\t\tglobalIsLoading = false\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// No modules to load, but still need to handle initial load state\r\n\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location.pathname, t, user, loading])\r\n\r\n\treturn { isLoading }\r\n};\r\n\r\nexport default useAppTranslations;\r\n","import { useCallback, useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePages } from './use-pages';\r\nimport { useLocation } from 'react-router-dom';\r\ninterface FilterParams {\r\n\tskip: number;\r\n\tlimit: number;\r\n\tsearch?: string;\r\n\tselect?: string;\r\n\torder?: string;\r\n\tfilters?: string;\r\n}\r\n\r\ninterface ActivePage {\r\n\tsort?: { id: string; desc: boolean };\r\n\tfilterQueryString?: string;\r\n\tsearch?: string;\r\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\r\n}\r\n\r\nconst useGenericDataFetcher = (\r\n\tcols?: ActivePage,\r\n\tpagination: { skip: number; limit: number },\r\n\tfetchAction: (filters: FilterParams) => void,\r\n\tcustomeFilter: any = '',\r\n\tcustomDeps?: any[],\r\n\tshowCreatedBy: boolean = true,\r\n\tcustomFields?: any = []\r\n) => {\r\n\tconst { activePage } = usePages();\r\n\tconst dispatch = useDispatch();\r\n\tconst location = useLocation();\r\n\r\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\r\n\r\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\r\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath !== location?.pathname) {\r\n\t\t\tsetTrackedPath(location?.pathname);\r\n\t\t\tsetTrackedColumns([]);\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\r\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\r\n\t\t\t\tsetTrackedColumns(sourceColumns);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath, sourceColumns]);\r\n\r\n\tconst getProcessedFilters = useCallback(() => {\r\n\t\tconst { filterQueryString } = activePage || {};\r\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\r\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\r\n\t\tlet filters = customeFilter;\r\n\r\n\t\tif (extraQueryString) {\r\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\r\n\t\t} else if (filters) {\r\n\t\t\tfilters = `(${filters})`;\r\n\t\t}\r\n\r\n\t\treturn filters || undefined;\r\n\t\t//eslint-disable-next-line\r\n\t}, [activePage.filterQueryString, customeFilter]);\r\n\r\n\tconst fetchData = useCallback(() => {\r\n\t\tif (!fetchAction) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { sort = null, search } = activePage;\r\n\r\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\r\n\r\n\t\tconst filters = getProcessedFilters();\r\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\r\n\r\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\r\n\t\t\t?.map((item) =>\r\n\t\t\t\titem.accessorKey?.includes(\".\")\r\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\r\n\t\t\t\t\t: item.accessorKey\r\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\r\n\t\tconst payload: FilterParams = {\r\n\t\t\tskip: activePage?.skip || pagination?.skip,\r\n\t\t\tlimit: pagination.limit,\r\n\t\t\tsearch,\r\n\t\t\tselect: selectPayload,\r\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t...(filters && { filters }),\r\n\t\t};\r\n\r\n\t\tdispatch(fetchAction(payload));\r\n\t\t//eslint-disable-next-line\r\n\t}, [\r\n\t\ttrackedColumns,\r\n\t\tactivePage.sort,\r\n\t\tactivePage.filterQueryString,\r\n\t\tactivePage.search,\r\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\r\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\r\n\t\t// here would make fetchData identity change twice per pagination click,\r\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\r\n\t\tactivePage?.skip,\r\n\t\tpagination?.limit,\r\n\t\tdispatch,\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t...(customDeps || []),\r\n\t]);\r\n\r\n\r\n\r\n\treturn fetchData;\r\n};\r\n\r\nexport default useGenericDataFetcher;\r\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\r\n\r\ntype ApiResponse = {\r\n meta?: {\r\n requestStatus?: string;\r\n };\r\n error?: {\r\n message?: string;\r\n };\r\n payload?: any\r\n};\r\n\r\ntype Callback = () => void;\r\n\r\nlet globalEnqueueSnackbar: any = null;\r\n\r\nexport const useSnackbarRef = (): void => {\r\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\r\n globalEnqueueSnackbar = snackbarHook;\r\n};\r\n\r\nexport function apiHelper(\r\n res: ApiResponse,\r\n callBack?: Callback,\r\n enqueueSnackbarOverride?: any\r\n): void {\r\n if (res?.meta?.requestStatus === \"rejected\") {\r\n const errorMessage = (() => {\r\n try {\r\n const msg = res.error?.message || res?.payload?.message;\r\n return msg ? JSON.parse(msg) : null;\r\n } catch {\r\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\r\n }\r\n })();\r\n\r\n const rawError = errorMessage?.message;\r\n let message = \"Something went wrong\";\r\n\r\n if (typeof rawError === \"string\") {\r\n message = rawError.replace(\"Error:\", \"\").trim();\r\n } else if (rawError && typeof rawError === \"object\") {\r\n message = (rawError as any).message || JSON.stringify(rawError);\r\n } else if (rawError) {\r\n message = String(rawError);\r\n }\r\n\r\n const snackbar = typeof enqueueSnackbarOverride === 'function'\r\n ? enqueueSnackbarOverride\r\n : (globalEnqueueSnackbar || enqueueSnackbar);\r\n\r\n if (typeof snackbar === \"function\") {\r\n snackbar(message, { variant: \"error\" });\r\n }\r\n return;\r\n }\r\n\r\n if (callBack) {\r\n if (typeof callBack === \"function\") {\r\n try {\r\n callBack();\r\n } catch (err) {\r\n console.error(\"[apiHelper] callBack threw an error:\", err);\r\n }\r\n } else {\r\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\r\n }\r\n }\r\n}\r\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport CssBaseline from '@mui/material/CssBaseline';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\r\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\r\nimport { AuthProvider } from '../../contexts/AuthContext';\r\nimport { LanguageProvider } from '../../contexts/languageContext';\r\nimport { PageProvider } from '../../contexts/page-context';\r\nimport { PermissionsProvider } from '../../contexts/permission-context';\r\nimport MUIThemeWrapper from '../../theme/themeWrapper';\r\nimport Loader from '../loader';\r\nimport useAppTranslations from '../../hooks/use-translations';\r\nimport '../../utils/i18n';\r\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\r\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\r\nimport { setModuleRoutes } from '../../utils/module-routes-config';\r\nimport { useSnackbarRef } from '../../hooks/apiHelper';\r\n\r\nconst SnackbarRefTracker: React.FC = () => {\r\n useSnackbarRef();\r\n return null;\r\n};\r\n\r\n\r\n// Context for library configuration\r\ninterface ERPUIContextValue {\r\n useRedux: boolean;\r\n apiClient?: ApiClientConfig;\r\n theme?: any;\r\n themeMode: 'light' | 'dark';\r\n direction: 'ltr' | 'rtl';\r\n primaryColor?: Color;\r\n}\r\n\r\nconst ERPUIContext = createContext<ERPUIContextValue>({\r\n useRedux: false,\r\n themeMode: 'light',\r\n direction: 'ltr',\r\n});\r\n\r\nexport const useERPUI = () => useContext(ERPUIContext);\r\n\r\n// Provider props interface\r\ninterface ERPUIProviderProps {\r\n children: ReactNode;\r\n\r\n // Redux configuration\r\n useRedux?: boolean;\r\n reduxStore?: any;\r\n apiClient?: ApiClientConfig;\r\n additionalReducers?: Record<string, any>;\r\n\r\n // Theme configuration\r\n theme?: any;\r\n themeMode?: 'light' | 'dark';\r\n primaryColor?: Color;\r\n direction?: 'ltr' | 'rtl';\r\n\r\n // Context providers configuration\r\n enableAuth?: boolean;\r\n enableLanguage?: boolean;\r\n enablePages?: boolean;\r\n enablePermissions?: boolean;\r\n enableRouter?: boolean;\r\n enableSnackbar?: boolean;\r\n\r\n // Other configuration\r\n enableCssBaseline?: boolean;\r\n snackbarConfig?: {\r\n maxSnack?: number;\r\n anchorOrigin?: {\r\n vertical: 'top' | 'bottom';\r\n horizontal: 'left' | 'center' | 'right';\r\n };\r\n autoHideDuration?: number;\r\n };\r\n\r\n // API configuration\r\n apiConfig?: ApiConfig;\r\n\r\n // Additional API configurations to extend the shared apiConfigurations map\r\n additionalApiConfigurations?: Record<string, any>;\r\n\r\n // Module routes override — allows MFE apps to inject their own full route set\r\n // so the header module dropdown can match routes correctly.\r\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\r\n moduleRoutes?: Record<string, string[]>;\r\n\r\n // Route maps\r\n routeToColumnsMap?: Record<string, any>;\r\n routeToResourceMap?: Record<string, any>;\r\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\r\n}\r\n\r\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\r\n children,\r\n\r\n // Redux props\r\n useRedux = false,\r\n reduxStore,\r\n apiClient,\r\n additionalReducers = {},\r\n\r\n // Theme props\r\n theme: customTheme,\r\n themeMode = 'light',\r\n primaryColor,\r\n direction = 'ltr',\r\n\r\n // Context providers configuration\r\n enableAuth = true,\r\n enableLanguage = true,\r\n enablePages = true,\r\n enablePermissions = true,\r\n enableRouter = false, // Default false since consuming app usually provides router\r\n enableSnackbar = true,\r\n\r\n // Other props\r\n enableCssBaseline = true,\r\n snackbarConfig = {\r\n maxSnack: 3,\r\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\r\n autoHideDuration: 5000,\r\n },\r\n\r\n // API configuration\r\n apiConfig: providedApiConfig,\r\n additionalApiConfigurations,\r\n moduleRoutes,\r\n routeToColumnsMap,\r\n routeToResourceMap,\r\n publicRoutes = [], // Default empty array for public routes in AuthProvider \r\n}) => {\r\n console.log(\"additionalApiConfigurations...........\", additionalApiConfigurations)\r\n\r\n // Initialize API configuration synchronously before first render\r\n // This prevents \"API configuration not initialized\" errors when components\r\n // try to use the API during initial render\r\n const isInitialized = React.useRef(false);\r\n\r\n if (providedApiConfig && !isInitialized.current) {\r\n try {\r\n initializeApiConfig(providedApiConfig);\r\n initializeApiBaseUrls();\r\n if (additionalApiConfigurations) {\r\n extendApiConfigurations(additionalApiConfigurations);\r\n }\r\n // Inject MFE-provided module routes so the header can resolve modules\r\n if (moduleRoutes) {\r\n setModuleRoutes(moduleRoutes);\r\n }\r\n isInitialized.current = true;\r\n } catch (error) {\r\n console.error('Failed to initialize API configuration:', error);\r\n }\r\n }\r\n // const { isLoading } = useAppTranslations();\r\n // if (isLoading) {\r\n // return <Loader />;\r\n // }\r\n // Create or use provided Redux store\r\n const store = React.useMemo(() => {\r\n if (!useRedux) return null;\r\n\r\n if (reduxStore) {\r\n return reduxStore;\r\n }\r\n\r\n return createLibraryStore(additionalReducers, apiClient);\r\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\r\n\r\n // Create theme\r\n const theme = React.useMemo(() => {\r\n if (customTheme) {\r\n return customTheme;\r\n }\r\n\r\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\r\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\r\n return generatedTheme;\r\n }, [customTheme, themeMode, primaryColor, direction]);\r\n\r\n // Context value\r\n const contextValue: ERPUIContextValue = {\r\n useRedux,\r\n apiClient,\r\n theme,\r\n themeMode,\r\n direction,\r\n primaryColor,\r\n };\r\n\r\n // Build provider tree from inside out\r\n let content = (\r\n <ERPUIContext.Provider value={contextValue}>\r\n {/* <ThemeProvider theme={theme}>\r\n {enableCssBaseline && <CssBaseline />} */}\r\n {/* <Suspense fallback={<Loader />}> */}\r\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\r\n {children}\r\n </MUIThemeWrapper>\r\n {/* </Suspense> */}\r\n {/* </ThemeProvider> */}\r\n </ERPUIContext.Provider>\r\n );\r\n\r\n // Wrap with snackbar provider if enabled\r\n if (enableSnackbar) {\r\n content = (\r\n <SnackbarProvider {...snackbarConfig}>\r\n <SnackbarRefTracker />\r\n {content}\r\n </SnackbarProvider>\r\n );\r\n }\r\n\r\n // Wrap with page provider if enabled\r\n // if (enablePages) {\r\n // content = (\r\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\r\n // {content}\r\n // </PageProvider>\r\n // );\r\n // }\r\n\r\n // Wrap with permissions provider if enabled\r\n if (enablePermissions) {\r\n content = (\r\n <PermissionsProvider>\r\n {content}\r\n </PermissionsProvider>\r\n );\r\n }\r\n\r\n // Wrap with language provider if enabled\r\n if (enableLanguage) {\r\n content = (\r\n <LanguageProvider>\r\n {content}\r\n </LanguageProvider>\r\n );\r\n }\r\n\r\n // Wrap with auth provider if enabled\r\n if (enableAuth) {\r\n content = (\r\n <AuthProvider publicRoutes={publicRoutes}>\r\n {content}\r\n </AuthProvider>\r\n );\r\n }\r\n\r\n // Wrap with router if enabled\r\n if (enableRouter) {\r\n content = (\r\n <BrowserRouter>\r\n {content}\r\n </BrowserRouter>\r\n );\r\n }\r\n\r\n // Wrap with Redux provider if enabled\r\n if (useRedux && store) {\r\n content = (\r\n <ReduxProvider store={store}>\r\n {content}\r\n </ReduxProvider>\r\n );\r\n }\r\n\r\n return content;\r\n};\r\n\r\nexport default ERPUIProvider;"],"names":["_a","React","jsx","jsxs","ReduxProvider"],"mappings":"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"}
|
|
@@ -5,14 +5,14 @@ const translations = require("./translations-CtAAqKt_.js");
|
|
|
5
5
|
const modules = require("./modules-BhfBbUJy.js");
|
|
6
6
|
const useAuth = require("./useAuth-BxOLRIR3.js");
|
|
7
7
|
const reactRedux = require("react-redux");
|
|
8
|
-
const useAccountSetting = require("./useAccountSetting-
|
|
8
|
+
const useAccountSetting = require("./useAccountSetting-DLSuTSbZ.js");
|
|
9
9
|
const reactRouterDom = require("react-router-dom");
|
|
10
10
|
const jsxRuntime = require("./jsx-runtime-B6vEU3CM.js");
|
|
11
11
|
const notistack = require("notistack");
|
|
12
12
|
const store = require("./store-B6aznScx.js");
|
|
13
13
|
const themeImpl = require("./theme-impl-VqZAJjv7.js");
|
|
14
14
|
const languageContext = require("./languageContext-Dw4OL1Wm.js");
|
|
15
|
-
const pageContext = require("./page-context-
|
|
15
|
+
const pageContext = require("./page-context-B4zx0GZ5.js");
|
|
16
16
|
const apiConfig = require("./api-config-DXwDMFn-.js");
|
|
17
17
|
const common = require("./common-mZRiR8Bu.js");
|
|
18
18
|
const moduleRoutesConfig = require("./module-routes-config-B8IucBuj.js");
|
|
@@ -300,4 +300,4 @@ exports.useAppTranslations = useAppTranslations;
|
|
|
300
300
|
exports.useERPUI = useERPUI;
|
|
301
301
|
exports.useGenericDataFetcher = useGenericDataFetcher;
|
|
302
302
|
exports.useSnackbarRef = useSnackbarRef;
|
|
303
|
-
//# sourceMappingURL=ERPUIProvider-
|
|
303
|
+
//# sourceMappingURL=ERPUIProvider-Ct7W7gdB.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ERPUIProvider-DUddcKKd.js","sources":["../../src/hooks/use-translations.ts","../../src/hooks/useDataFetcher.tsx","../../src/hooks/apiHelper.ts","../../src/components/providers/ERPUIProvider.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\n// import { useLocation } from 'react-router-dom'\r\nimport { getI18n, useTranslation } from 'react-i18next'\r\nimport { loadModuleTranslations } from '../utils/translations'\r\nimport modules from '../constants/modules'\r\nimport { useAuth } from './useAuth'\r\n\r\n// Global state to prevent duplicate calls across all hook instances\r\nlet globalLastLoadedModules = ''\r\nlet globalIsLoading = false\r\nlet globalInitialLoad = false\r\n\r\nexport const useAppTranslations = () => {\r\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\r\n\tconst location = window.location\r\n\tconst i18nInstance = getI18n()\r\n\tconst { user, loading } = useAuth()\r\n\tconst { t } = useTranslation()\r\n\r\n\tuseEffect(() => {\r\n\t\tconst erpModules = modules(t)\r\n\t\tconst currentPath = location.pathname.toLowerCase()\r\n\t\tif(user?.id && !loading) {\r\n\t\r\n\t\t\tconst matchedModule = erpModules.find(\r\n\t\t\t\t(mod) =>\r\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\r\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\r\n\t\t\t)\r\n\t\r\n\t\t\tlet modulesToLoad: string[] = []\r\n\t\r\n\t\t\tif (matchedModule?.translationModule) {\r\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\r\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\r\n\t\t\t\tmodulesToLoad = ['common']\r\n\t\t\t}\r\n\t\r\n\t\t\tif (modulesToLoad.length > 0) {\r\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\r\n\t\r\n\t\t\t\t// Skip if same modules are already loaded or currently loading\r\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\r\n\t\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\tglobalIsLoading = true\r\n\t\t\t\tglobalLastLoadedModules = moduleKey\r\n\t\t\t\tsetIsLoading(true)\r\n\t\r\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\r\n\t\t\t\t\tglobalIsLoading = false\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// No modules to load, but still need to handle initial load state\r\n\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location.pathname, t, user, loading])\r\n\r\n\treturn { isLoading }\r\n};\r\n\r\nexport default useAppTranslations;\r\n","import { useCallback, useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePages } from './use-pages';\r\nimport { useLocation } from 'react-router-dom';\r\ninterface FilterParams {\r\n\tskip: number;\r\n\tlimit: number;\r\n\tsearch?: string;\r\n\tselect?: string;\r\n\torder?: string;\r\n\tfilters?: string;\r\n}\r\n\r\ninterface ActivePage {\r\n\tsort?: { id: string; desc: boolean };\r\n\tfilterQueryString?: string;\r\n\tsearch?: string;\r\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\r\n}\r\n\r\nconst useGenericDataFetcher = (\r\n\tcols?: ActivePage,\r\n\tpagination: { skip: number; limit: number },\r\n\tfetchAction: (filters: FilterParams) => void,\r\n\tcustomeFilter: any = '',\r\n\tcustomDeps?: any[],\r\n\tshowCreatedBy: boolean = true,\r\n\tcustomFields?: any = []\r\n) => {\r\n\tconst { activePage } = usePages();\r\n\tconst dispatch = useDispatch();\r\n\tconst location = useLocation();\r\n\r\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\r\n\r\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\r\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath !== location?.pathname) {\r\n\t\t\tsetTrackedPath(location?.pathname);\r\n\t\t\tsetTrackedColumns([]);\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\r\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\r\n\t\t\t\tsetTrackedColumns(sourceColumns);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath, sourceColumns]);\r\n\r\n\tconst getProcessedFilters = useCallback(() => {\r\n\t\tconst { filterQueryString } = activePage || {};\r\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\r\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\r\n\t\tlet filters = customeFilter;\r\n\r\n\t\tif (extraQueryString) {\r\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\r\n\t\t} else if (filters) {\r\n\t\t\tfilters = `(${filters})`;\r\n\t\t}\r\n\r\n\t\treturn filters || undefined;\r\n\t\t//eslint-disable-next-line\r\n\t}, [activePage.filterQueryString, customeFilter]);\r\n\r\n\tconst fetchData = useCallback(() => {\r\n\t\tif (!fetchAction) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { sort = null, search } = activePage;\r\n\r\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\r\n\r\n\t\tconst filters = getProcessedFilters();\r\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\r\n\r\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\r\n\t\t\t?.map((item) =>\r\n\t\t\t\titem.accessorKey?.includes(\".\")\r\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\r\n\t\t\t\t\t: item.accessorKey\r\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\r\n\t\tconst payload: FilterParams = {\r\n\t\t\tskip: activePage?.skip || pagination?.skip,\r\n\t\t\tlimit: pagination.limit,\r\n\t\t\tsearch,\r\n\t\t\tselect: selectPayload,\r\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t...(filters && { filters }),\r\n\t\t};\r\n\r\n\t\tdispatch(fetchAction(payload));\r\n\t\t//eslint-disable-next-line\r\n\t}, [\r\n\t\ttrackedColumns,\r\n\t\tactivePage.sort,\r\n\t\tactivePage.filterQueryString,\r\n\t\tactivePage.search,\r\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\r\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\r\n\t\t// here would make fetchData identity change twice per pagination click,\r\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\r\n\t\tactivePage?.skip,\r\n\t\tpagination?.limit,\r\n\t\tdispatch,\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t...(customDeps || []),\r\n\t]);\r\n\r\n\r\n\r\n\treturn fetchData;\r\n};\r\n\r\nexport default useGenericDataFetcher;\r\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\r\n\r\ntype ApiResponse = {\r\n meta?: {\r\n requestStatus?: string;\r\n };\r\n error?: {\r\n message?: string;\r\n };\r\n payload?: any\r\n};\r\n\r\ntype Callback = () => void;\r\n\r\nlet globalEnqueueSnackbar: any = null;\r\n\r\nexport const useSnackbarRef = (): void => {\r\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\r\n globalEnqueueSnackbar = snackbarHook;\r\n};\r\n\r\nexport function apiHelper(\r\n res: ApiResponse,\r\n callBack?: Callback,\r\n enqueueSnackbarOverride?: any\r\n): void {\r\n if (res?.meta?.requestStatus === \"rejected\") {\r\n const errorMessage = (() => {\r\n try {\r\n const msg = res.error?.message || res?.payload?.message;\r\n return msg ? JSON.parse(msg) : null;\r\n } catch {\r\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\r\n }\r\n })();\r\n\r\n const rawError = errorMessage?.message;\r\n let message = \"Something went wrong\";\r\n\r\n if (typeof rawError === \"string\") {\r\n message = rawError.replace(\"Error:\", \"\").trim();\r\n } else if (rawError && typeof rawError === \"object\") {\r\n message = (rawError as any).message || JSON.stringify(rawError);\r\n } else if (rawError) {\r\n message = String(rawError);\r\n }\r\n\r\n const snackbar = typeof enqueueSnackbarOverride === 'function'\r\n ? enqueueSnackbarOverride\r\n : (globalEnqueueSnackbar || enqueueSnackbar);\r\n\r\n if (typeof snackbar === \"function\") {\r\n snackbar(message, { variant: \"error\" });\r\n }\r\n return;\r\n }\r\n\r\n if (callBack) {\r\n if (typeof callBack === \"function\") {\r\n try {\r\n callBack();\r\n } catch (err) {\r\n console.error(\"[apiHelper] callBack threw an error:\", err);\r\n }\r\n } else {\r\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\r\n }\r\n }\r\n}\r\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport CssBaseline from '@mui/material/CssBaseline';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\r\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\r\nimport { AuthProvider } from '../../contexts/AuthContext';\r\nimport { LanguageProvider } from '../../contexts/languageContext';\r\nimport { PageProvider } from '../../contexts/page-context';\r\nimport { PermissionsProvider } from '../../contexts/permission-context';\r\nimport MUIThemeWrapper from '../../theme/themeWrapper';\r\nimport Loader from '../loader';\r\nimport useAppTranslations from '../../hooks/use-translations';\r\nimport '../../utils/i18n';\r\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\r\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\r\nimport { setModuleRoutes } from '../../utils/module-routes-config';\r\nimport { useSnackbarRef } from '../../hooks/apiHelper';\r\n\r\nconst SnackbarRefTracker: React.FC = () => {\r\n useSnackbarRef();\r\n return null;\r\n};\r\n\r\n\r\n// Context for library configuration\r\ninterface ERPUIContextValue {\r\n useRedux: boolean;\r\n apiClient?: ApiClientConfig;\r\n theme?: any;\r\n themeMode: 'light' | 'dark';\r\n direction: 'ltr' | 'rtl';\r\n primaryColor?: Color;\r\n}\r\n\r\nconst ERPUIContext = createContext<ERPUIContextValue>({\r\n useRedux: false,\r\n themeMode: 'light',\r\n direction: 'ltr',\r\n});\r\n\r\nexport const useERPUI = () => useContext(ERPUIContext);\r\n\r\n// Provider props interface\r\ninterface ERPUIProviderProps {\r\n children: ReactNode;\r\n\r\n // Redux configuration\r\n useRedux?: boolean;\r\n reduxStore?: any;\r\n apiClient?: ApiClientConfig;\r\n additionalReducers?: Record<string, any>;\r\n\r\n // Theme configuration\r\n theme?: any;\r\n themeMode?: 'light' | 'dark';\r\n primaryColor?: Color;\r\n direction?: 'ltr' | 'rtl';\r\n\r\n // Context providers configuration\r\n enableAuth?: boolean;\r\n enableLanguage?: boolean;\r\n enablePages?: boolean;\r\n enablePermissions?: boolean;\r\n enableRouter?: boolean;\r\n enableSnackbar?: boolean;\r\n\r\n // Other configuration\r\n enableCssBaseline?: boolean;\r\n snackbarConfig?: {\r\n maxSnack?: number;\r\n anchorOrigin?: {\r\n vertical: 'top' | 'bottom';\r\n horizontal: 'left' | 'center' | 'right';\r\n };\r\n autoHideDuration?: number;\r\n };\r\n\r\n // API configuration\r\n apiConfig?: ApiConfig;\r\n\r\n // Additional API configurations to extend the shared apiConfigurations map\r\n additionalApiConfigurations?: Record<string, any>;\r\n\r\n // Module routes override — allows MFE apps to inject their own full route set\r\n // so the header module dropdown can match routes correctly.\r\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\r\n moduleRoutes?: Record<string, string[]>;\r\n\r\n // Route maps\r\n routeToColumnsMap?: Record<string, any>;\r\n routeToResourceMap?: Record<string, any>;\r\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\r\n}\r\n\r\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\r\n children,\r\n\r\n // Redux props\r\n useRedux = false,\r\n reduxStore,\r\n apiClient,\r\n additionalReducers = {},\r\n\r\n // Theme props\r\n theme: customTheme,\r\n themeMode = 'light',\r\n primaryColor,\r\n direction = 'ltr',\r\n\r\n // Context providers configuration\r\n enableAuth = true,\r\n enableLanguage = true,\r\n enablePages = true,\r\n enablePermissions = true,\r\n enableRouter = false, // Default false since consuming app usually provides router\r\n enableSnackbar = true,\r\n\r\n // Other props\r\n enableCssBaseline = true,\r\n snackbarConfig = {\r\n maxSnack: 3,\r\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\r\n autoHideDuration: 5000,\r\n },\r\n\r\n // API configuration\r\n apiConfig: providedApiConfig,\r\n additionalApiConfigurations,\r\n moduleRoutes,\r\n routeToColumnsMap,\r\n routeToResourceMap,\r\n publicRoutes = [], // Default empty array for public routes in AuthProvider \r\n}) => {\r\n console.log(\"additionalApiConfigurations...........\", additionalApiConfigurations)\r\n\r\n // Initialize API configuration synchronously before first render\r\n // This prevents \"API configuration not initialized\" errors when components\r\n // try to use the API during initial render\r\n const isInitialized = React.useRef(false);\r\n\r\n if (providedApiConfig && !isInitialized.current) {\r\n try {\r\n initializeApiConfig(providedApiConfig);\r\n initializeApiBaseUrls();\r\n if (additionalApiConfigurations) {\r\n extendApiConfigurations(additionalApiConfigurations);\r\n }\r\n // Inject MFE-provided module routes so the header can resolve modules\r\n if (moduleRoutes) {\r\n setModuleRoutes(moduleRoutes);\r\n }\r\n isInitialized.current = true;\r\n } catch (error) {\r\n console.error('Failed to initialize API configuration:', error);\r\n }\r\n }\r\n // const { isLoading } = useAppTranslations();\r\n // if (isLoading) {\r\n // return <Loader />;\r\n // }\r\n // Create or use provided Redux store\r\n const store = React.useMemo(() => {\r\n if (!useRedux) return null;\r\n\r\n if (reduxStore) {\r\n return reduxStore;\r\n }\r\n\r\n return createLibraryStore(additionalReducers, apiClient);\r\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\r\n\r\n // Create theme\r\n const theme = React.useMemo(() => {\r\n if (customTheme) {\r\n return customTheme;\r\n }\r\n\r\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\r\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\r\n return generatedTheme;\r\n }, [customTheme, themeMode, primaryColor, direction]);\r\n\r\n // Context value\r\n const contextValue: ERPUIContextValue = {\r\n useRedux,\r\n apiClient,\r\n theme,\r\n themeMode,\r\n direction,\r\n primaryColor,\r\n };\r\n\r\n // Build provider tree from inside out\r\n let content = (\r\n <ERPUIContext.Provider value={contextValue}>\r\n {/* <ThemeProvider theme={theme}>\r\n {enableCssBaseline && <CssBaseline />} */}\r\n {/* <Suspense fallback={<Loader />}> */}\r\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\r\n {children}\r\n </MUIThemeWrapper>\r\n {/* </Suspense> */}\r\n {/* </ThemeProvider> */}\r\n </ERPUIContext.Provider>\r\n );\r\n\r\n // Wrap with snackbar provider if enabled\r\n if (enableSnackbar) {\r\n content = (\r\n <SnackbarProvider {...snackbarConfig}>\r\n <SnackbarRefTracker />\r\n {content}\r\n </SnackbarProvider>\r\n );\r\n }\r\n\r\n // Wrap with page provider if enabled\r\n // if (enablePages) {\r\n // content = (\r\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\r\n // {content}\r\n // </PageProvider>\r\n // );\r\n // }\r\n\r\n // Wrap with permissions provider if enabled\r\n if (enablePermissions) {\r\n content = (\r\n <PermissionsProvider>\r\n {content}\r\n </PermissionsProvider>\r\n );\r\n }\r\n\r\n // Wrap with language provider if enabled\r\n if (enableLanguage) {\r\n content = (\r\n <LanguageProvider>\r\n {content}\r\n </LanguageProvider>\r\n );\r\n }\r\n\r\n // Wrap with auth provider if enabled\r\n if (enableAuth) {\r\n content = (\r\n <AuthProvider publicRoutes={publicRoutes}>\r\n {content}\r\n </AuthProvider>\r\n );\r\n }\r\n\r\n // Wrap with router if enabled\r\n if (enableRouter) {\r\n content = (\r\n <BrowserRouter>\r\n {content}\r\n </BrowserRouter>\r\n );\r\n }\r\n\r\n // Wrap with Redux provider if enabled\r\n if (useRedux && store) {\r\n content = (\r\n <ReduxProvider store={store}>\r\n {content}\r\n </ReduxProvider>\r\n );\r\n }\r\n\r\n return content;\r\n};\r\n\r\nexport default ERPUIProvider;"],"names":["useState","getI18n","useAuth","useTranslation","useEffect","modules","loadModuleTranslations","usePages","useDispatch","useLocation","useCallback","useSnackbar","_a","enqueueSnackbar","createContext","useContext","initializeApiConfig","initializeApiBaseUrls","extendApiConfigurations","setModuleRoutes","store","createLibraryStore","createDarkTheme","createLightTheme","jsx","MUIThemeWrapper","jsxs","SnackbarProvider","PermissionsProvider","LanguageProvider","AuthProvider","BrowserRouter","ReduxProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ERPUIProvider-Ct7W7gdB.js","sources":["../../src/hooks/use-translations.ts","../../src/hooks/useDataFetcher.tsx","../../src/hooks/apiHelper.ts","../../src/components/providers/ERPUIProvider.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\r\n// import { useLocation } from 'react-router-dom'\r\nimport { getI18n, useTranslation } from 'react-i18next'\r\nimport { loadModuleTranslations } from '../utils/translations'\r\nimport modules from '../constants/modules'\r\nimport { useAuth } from './useAuth'\r\n\r\n// Global state to prevent duplicate calls across all hook instances\r\nlet globalLastLoadedModules = ''\r\nlet globalIsLoading = false\r\nlet globalInitialLoad = false\r\n\r\nexport const useAppTranslations = () => {\r\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\r\n\tconst location = window.location\r\n\tconst i18nInstance = getI18n()\r\n\tconst { user, loading } = useAuth()\r\n\tconst { t } = useTranslation()\r\n\r\n\tuseEffect(() => {\r\n\t\tconst erpModules = modules(t)\r\n\t\tconst currentPath = location.pathname.toLowerCase()\r\n\t\tif(user?.id && !loading) {\r\n\t\r\n\t\t\tconst matchedModule = erpModules.find(\r\n\t\t\t\t(mod) =>\r\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\r\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\r\n\t\t\t)\r\n\t\r\n\t\t\tlet modulesToLoad: string[] = []\r\n\t\r\n\t\t\tif (matchedModule?.translationModule) {\r\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\r\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\r\n\t\t\t\tmodulesToLoad = ['common']\r\n\t\t\t}\r\n\t\r\n\t\t\tif (modulesToLoad.length > 0) {\r\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\r\n\t\r\n\t\t\t\t// Skip if same modules are already loaded or currently loading\r\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\r\n\t\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn\r\n\t\t\t\t}\r\n\t\r\n\t\t\t\tglobalIsLoading = true\r\n\t\t\t\tglobalLastLoadedModules = moduleKey\r\n\t\t\t\tsetIsLoading(true)\r\n\t\r\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\r\n\t\t\t\t\tglobalIsLoading = false\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\t// No modules to load, but still need to handle initial load state\r\n\t\t\t\tif (globalInitialLoad) {\r\n\t\t\t\t\tsetIsLoading(false)\r\n\t\t\t\t\tglobalInitialLoad = false\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location.pathname, t, user, loading])\r\n\r\n\treturn { isLoading }\r\n};\r\n\r\nexport default useAppTranslations;\r\n","import { useCallback, useState, useEffect } from 'react';\r\nimport { useDispatch } from 'react-redux';\r\nimport { usePages } from './use-pages';\r\nimport { useLocation } from 'react-router-dom';\r\ninterface FilterParams {\r\n\tskip: number;\r\n\tlimit: number;\r\n\tsearch?: string;\r\n\tselect?: string;\r\n\torder?: string;\r\n\tfilters?: string;\r\n}\r\n\r\ninterface ActivePage {\r\n\tsort?: { id: string; desc: boolean };\r\n\tfilterQueryString?: string;\r\n\tsearch?: string;\r\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\r\n}\r\n\r\nconst useGenericDataFetcher = (\r\n\tcols?: ActivePage,\r\n\tpagination: { skip: number; limit: number },\r\n\tfetchAction: (filters: FilterParams) => void,\r\n\tcustomeFilter: any = '',\r\n\tcustomDeps?: any[],\r\n\tshowCreatedBy: boolean = true,\r\n\tcustomFields?: any = []\r\n) => {\r\n\tconst { activePage } = usePages();\r\n\tconst dispatch = useDispatch();\r\n\tconst location = useLocation();\r\n\r\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\r\n\r\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\r\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath !== location?.pathname) {\r\n\t\t\tsetTrackedPath(location?.pathname);\r\n\t\t\tsetTrackedColumns([]);\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath]);\r\n\r\n\tuseEffect(() => {\r\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\r\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\r\n\t\t\t\tsetTrackedColumns(sourceColumns);\r\n\t\t\t}\r\n\t\t}\r\n\t}, [location?.pathname, trackedPath, sourceColumns]);\r\n\r\n\tconst getProcessedFilters = useCallback(() => {\r\n\t\tconst { filterQueryString } = activePage || {};\r\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\r\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\r\n\t\tlet filters = customeFilter;\r\n\r\n\t\tif (extraQueryString) {\r\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\r\n\t\t} else if (filters) {\r\n\t\t\tfilters = `(${filters})`;\r\n\t\t}\r\n\r\n\t\treturn filters || undefined;\r\n\t\t//eslint-disable-next-line\r\n\t}, [activePage.filterQueryString, customeFilter]);\r\n\r\n\tconst fetchData = useCallback(() => {\r\n\t\tif (!fetchAction) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { sort = null, search } = activePage;\r\n\r\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\r\n\r\n\t\tconst filters = getProcessedFilters();\r\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\r\n\r\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\r\n\t\t\t?.map((item) =>\r\n\t\t\t\titem.accessorKey?.includes(\".\")\r\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\r\n\t\t\t\t\t: item.accessorKey\r\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\r\n\t\tconst payload: FilterParams = {\r\n\t\t\tskip: activePage?.skip || pagination?.skip,\r\n\t\t\tlimit: pagination.limit,\r\n\t\t\tsearch,\r\n\t\t\tselect: selectPayload,\r\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\r\n\t\t\t...(filters && { filters }),\r\n\t\t};\r\n\r\n\t\tdispatch(fetchAction(payload));\r\n\t\t//eslint-disable-next-line\r\n\t}, [\r\n\t\ttrackedColumns,\r\n\t\tactivePage.sort,\r\n\t\tactivePage.filterQueryString,\r\n\t\tactivePage.search,\r\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\r\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\r\n\t\t// here would make fetchData identity change twice per pagination click,\r\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\r\n\t\tactivePage?.skip,\r\n\t\tpagination?.limit,\r\n\t\tdispatch,\r\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t...(customDeps || []),\r\n\t]);\r\n\r\n\r\n\r\n\treturn fetchData;\r\n};\r\n\r\nexport default useGenericDataFetcher;\r\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\r\n\r\ntype ApiResponse = {\r\n meta?: {\r\n requestStatus?: string;\r\n };\r\n error?: {\r\n message?: string;\r\n };\r\n payload?: any\r\n};\r\n\r\ntype Callback = () => void;\r\n\r\nlet globalEnqueueSnackbar: any = null;\r\n\r\nexport const useSnackbarRef = (): void => {\r\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\r\n globalEnqueueSnackbar = snackbarHook;\r\n};\r\n\r\nexport function apiHelper(\r\n res: ApiResponse,\r\n callBack?: Callback,\r\n enqueueSnackbarOverride?: any\r\n): void {\r\n if (res?.meta?.requestStatus === \"rejected\") {\r\n const errorMessage = (() => {\r\n try {\r\n const msg = res.error?.message || res?.payload?.message;\r\n return msg ? JSON.parse(msg) : null;\r\n } catch {\r\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\r\n }\r\n })();\r\n\r\n const rawError = errorMessage?.message;\r\n let message = \"Something went wrong\";\r\n\r\n if (typeof rawError === \"string\") {\r\n message = rawError.replace(\"Error:\", \"\").trim();\r\n } else if (rawError && typeof rawError === \"object\") {\r\n message = (rawError as any).message || JSON.stringify(rawError);\r\n } else if (rawError) {\r\n message = String(rawError);\r\n }\r\n\r\n const snackbar = typeof enqueueSnackbarOverride === 'function'\r\n ? enqueueSnackbarOverride\r\n : (globalEnqueueSnackbar || enqueueSnackbar);\r\n\r\n if (typeof snackbar === \"function\") {\r\n snackbar(message, { variant: \"error\" });\r\n }\r\n return;\r\n }\r\n\r\n if (callBack) {\r\n if (typeof callBack === \"function\") {\r\n try {\r\n callBack();\r\n } catch (err) {\r\n console.error(\"[apiHelper] callBack threw an error:\", err);\r\n }\r\n } else {\r\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\r\n }\r\n }\r\n}\r\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\r\nimport { Provider as ReduxProvider } from 'react-redux';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport CssBaseline from '@mui/material/CssBaseline';\r\nimport { SnackbarProvider } from 'notistack';\r\nimport { BrowserRouter } from 'react-router-dom';\r\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\r\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\r\nimport { AuthProvider } from '../../contexts/AuthContext';\r\nimport { LanguageProvider } from '../../contexts/languageContext';\r\nimport { PageProvider } from '../../contexts/page-context';\r\nimport { PermissionsProvider } from '../../contexts/permission-context';\r\nimport MUIThemeWrapper from '../../theme/themeWrapper';\r\nimport Loader from '../loader';\r\nimport useAppTranslations from '../../hooks/use-translations';\r\nimport '../../utils/i18n';\r\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\r\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\r\nimport { setModuleRoutes } from '../../utils/module-routes-config';\r\nimport { useSnackbarRef } from '../../hooks/apiHelper';\r\n\r\nconst SnackbarRefTracker: React.FC = () => {\r\n useSnackbarRef();\r\n return null;\r\n};\r\n\r\n\r\n// Context for library configuration\r\ninterface ERPUIContextValue {\r\n useRedux: boolean;\r\n apiClient?: ApiClientConfig;\r\n theme?: any;\r\n themeMode: 'light' | 'dark';\r\n direction: 'ltr' | 'rtl';\r\n primaryColor?: Color;\r\n}\r\n\r\nconst ERPUIContext = createContext<ERPUIContextValue>({\r\n useRedux: false,\r\n themeMode: 'light',\r\n direction: 'ltr',\r\n});\r\n\r\nexport const useERPUI = () => useContext(ERPUIContext);\r\n\r\n// Provider props interface\r\ninterface ERPUIProviderProps {\r\n children: ReactNode;\r\n\r\n // Redux configuration\r\n useRedux?: boolean;\r\n reduxStore?: any;\r\n apiClient?: ApiClientConfig;\r\n additionalReducers?: Record<string, any>;\r\n\r\n // Theme configuration\r\n theme?: any;\r\n themeMode?: 'light' | 'dark';\r\n primaryColor?: Color;\r\n direction?: 'ltr' | 'rtl';\r\n\r\n // Context providers configuration\r\n enableAuth?: boolean;\r\n enableLanguage?: boolean;\r\n enablePages?: boolean;\r\n enablePermissions?: boolean;\r\n enableRouter?: boolean;\r\n enableSnackbar?: boolean;\r\n\r\n // Other configuration\r\n enableCssBaseline?: boolean;\r\n snackbarConfig?: {\r\n maxSnack?: number;\r\n anchorOrigin?: {\r\n vertical: 'top' | 'bottom';\r\n horizontal: 'left' | 'center' | 'right';\r\n };\r\n autoHideDuration?: number;\r\n };\r\n\r\n // API configuration\r\n apiConfig?: ApiConfig;\r\n\r\n // Additional API configurations to extend the shared apiConfigurations map\r\n additionalApiConfigurations?: Record<string, any>;\r\n\r\n // Module routes override — allows MFE apps to inject their own full route set\r\n // so the header module dropdown can match routes correctly.\r\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\r\n moduleRoutes?: Record<string, string[]>;\r\n\r\n // Route maps\r\n routeToColumnsMap?: Record<string, any>;\r\n routeToResourceMap?: Record<string, any>;\r\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\r\n}\r\n\r\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\r\n children,\r\n\r\n // Redux props\r\n useRedux = false,\r\n reduxStore,\r\n apiClient,\r\n additionalReducers = {},\r\n\r\n // Theme props\r\n theme: customTheme,\r\n themeMode = 'light',\r\n primaryColor,\r\n direction = 'ltr',\r\n\r\n // Context providers configuration\r\n enableAuth = true,\r\n enableLanguage = true,\r\n enablePages = true,\r\n enablePermissions = true,\r\n enableRouter = false, // Default false since consuming app usually provides router\r\n enableSnackbar = true,\r\n\r\n // Other props\r\n enableCssBaseline = true,\r\n snackbarConfig = {\r\n maxSnack: 3,\r\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\r\n autoHideDuration: 5000,\r\n },\r\n\r\n // API configuration\r\n apiConfig: providedApiConfig,\r\n additionalApiConfigurations,\r\n moduleRoutes,\r\n routeToColumnsMap,\r\n routeToResourceMap,\r\n publicRoutes = [], // Default empty array for public routes in AuthProvider \r\n}) => {\r\n console.log(\"additionalApiConfigurations...........\", additionalApiConfigurations)\r\n\r\n // Initialize API configuration synchronously before first render\r\n // This prevents \"API configuration not initialized\" errors when components\r\n // try to use the API during initial render\r\n const isInitialized = React.useRef(false);\r\n\r\n if (providedApiConfig && !isInitialized.current) {\r\n try {\r\n initializeApiConfig(providedApiConfig);\r\n initializeApiBaseUrls();\r\n if (additionalApiConfigurations) {\r\n extendApiConfigurations(additionalApiConfigurations);\r\n }\r\n // Inject MFE-provided module routes so the header can resolve modules\r\n if (moduleRoutes) {\r\n setModuleRoutes(moduleRoutes);\r\n }\r\n isInitialized.current = true;\r\n } catch (error) {\r\n console.error('Failed to initialize API configuration:', error);\r\n }\r\n }\r\n // const { isLoading } = useAppTranslations();\r\n // if (isLoading) {\r\n // return <Loader />;\r\n // }\r\n // Create or use provided Redux store\r\n const store = React.useMemo(() => {\r\n if (!useRedux) return null;\r\n\r\n if (reduxStore) {\r\n return reduxStore;\r\n }\r\n\r\n return createLibraryStore(additionalReducers, apiClient);\r\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\r\n\r\n // Create theme\r\n const theme = React.useMemo(() => {\r\n if (customTheme) {\r\n return customTheme;\r\n }\r\n\r\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\r\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\r\n return generatedTheme;\r\n }, [customTheme, themeMode, primaryColor, direction]);\r\n\r\n // Context value\r\n const contextValue: ERPUIContextValue = {\r\n useRedux,\r\n apiClient,\r\n theme,\r\n themeMode,\r\n direction,\r\n primaryColor,\r\n };\r\n\r\n // Build provider tree from inside out\r\n let content = (\r\n <ERPUIContext.Provider value={contextValue}>\r\n {/* <ThemeProvider theme={theme}>\r\n {enableCssBaseline && <CssBaseline />} */}\r\n {/* <Suspense fallback={<Loader />}> */}\r\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\r\n {children}\r\n </MUIThemeWrapper>\r\n {/* </Suspense> */}\r\n {/* </ThemeProvider> */}\r\n </ERPUIContext.Provider>\r\n );\r\n\r\n // Wrap with snackbar provider if enabled\r\n if (enableSnackbar) {\r\n content = (\r\n <SnackbarProvider {...snackbarConfig}>\r\n <SnackbarRefTracker />\r\n {content}\r\n </SnackbarProvider>\r\n );\r\n }\r\n\r\n // Wrap with page provider if enabled\r\n // if (enablePages) {\r\n // content = (\r\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\r\n // {content}\r\n // </PageProvider>\r\n // );\r\n // }\r\n\r\n // Wrap with permissions provider if enabled\r\n if (enablePermissions) {\r\n content = (\r\n <PermissionsProvider>\r\n {content}\r\n </PermissionsProvider>\r\n );\r\n }\r\n\r\n // Wrap with language provider if enabled\r\n if (enableLanguage) {\r\n content = (\r\n <LanguageProvider>\r\n {content}\r\n </LanguageProvider>\r\n );\r\n }\r\n\r\n // Wrap with auth provider if enabled\r\n if (enableAuth) {\r\n content = (\r\n <AuthProvider publicRoutes={publicRoutes}>\r\n {content}\r\n </AuthProvider>\r\n );\r\n }\r\n\r\n // Wrap with router if enabled\r\n if (enableRouter) {\r\n content = (\r\n <BrowserRouter>\r\n {content}\r\n </BrowserRouter>\r\n );\r\n }\r\n\r\n // Wrap with Redux provider if enabled\r\n if (useRedux && store) {\r\n content = (\r\n <ReduxProvider store={store}>\r\n {content}\r\n </ReduxProvider>\r\n );\r\n }\r\n\r\n return content;\r\n};\r\n\r\nexport default ERPUIProvider;"],"names":["useState","getI18n","useAuth","useTranslation","useEffect","modules","loadModuleTranslations","usePages","useDispatch","useLocation","useCallback","useSnackbar","_a","enqueueSnackbar","createContext","useContext","initializeApiConfig","initializeApiBaseUrls","extendApiConfigurations","setModuleRoutes","store","createLibraryStore","createDarkTheme","createLightTheme","jsx","MUIThemeWrapper","jsxs","SnackbarProvider","PermissionsProvider","LanguageProvider","AuthProvider","BrowserRouter","ReduxProvider"],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ import dayjs from "dayjs";
|
|
|
18
18
|
import { aX as formatText, A as fetchApi, p as checkUniqueFields, aa as getErrorMessage, aR as toFixedWithNumbers, ae as getFileName, M as formatAmount, Q as formatDate, W as formatLabel, S as SECTION_TYPES, aO as skuGenerator, aW as fetchOptions, at as getToken, b0 as postV1Designation, b1 as postV1DepartmentsTeams, b2 as postV1Departments, a1 as generateFields, a2 as generateQueryString, aG as postImportSheet, ak as getOperatorLabel, ab as getExcelExportTemplate, ao as getPdfExportTemplate, ac as getExcelTemplateGenerateTemplate, a3 as generateRandomId } from "./common-KSaUU42L.esm.js";
|
|
19
19
|
import _, { sortBy, debounce as debounce$2, flatMap } from "lodash";
|
|
20
20
|
import { Add as Add$1, Close, Upload, KeyboardArrowUp, KeyboardArrowDown as KeyboardArrowDown$1, Cancel, Share, Save as Save$1 } from "@mui/icons-material";
|
|
21
|
-
import { a as useApi, f as usePages, b as useDeepMemo, u as useAccountingSetting, d as useLocationFilter, g as usePermissions } from "./useAccountSetting-
|
|
21
|
+
import { a as useApi, f as usePages, b as useDeepMemo, u as useAccountingSetting, d as useLocationFilter, g as usePermissions } from "./useAccountSetting-B9iSkd0R.esm.js";
|
|
22
22
|
import { v as viewTypes } from "./action-bar-BsXTcYpL.esm.js";
|
|
23
23
|
import { QueryBuilder } from "react-querybuilder";
|
|
24
24
|
import { QueryBuilderMaterial } from "@react-querybuilder/material";
|
|
@@ -31,7 +31,7 @@ import { P as PathnameHrms, a as PathnameUsers, b0 as routeToResourceMap } from
|
|
|
31
31
|
import { useNavigate, useLocation, Link, Navigate } from "react-router-dom";
|
|
32
32
|
import { u as useAppDispatch, a as useAppSelector } from "./hooks-Cj9Yhy-E.esm.js";
|
|
33
33
|
import { useDropzone } from "react-dropzone";
|
|
34
|
-
import { i as initialFilter, d as defaultPageState } from "./page-context-
|
|
34
|
+
import { i as initialFilter, d as defaultPageState } from "./page-context-_PTfsRfz.esm.js";
|
|
35
35
|
import { S as Search$1 } from "./tick-wc8bi2Fu.esm.js";
|
|
36
36
|
import { useDispatch, useSelector } from "react-redux";
|
|
37
37
|
import { b as setSharedPage, w as getAllUserAndDepartmentDropdown, p as pinToDashboardList, z as sharePage } from "./reducer-BqCQLXEh.esm.js";
|
|
@@ -30488,7 +30488,6 @@ const DynamicDependentField = (props) => {
|
|
|
30488
30488
|
);
|
|
30489
30489
|
};
|
|
30490
30490
|
const DynamicDependentFieldContent = ({ control, watch, setValue, getFieldState: _getFieldState, formState: _formState, ...props }) => {
|
|
30491
|
-
console.log("🚀 ~ DynamicDependentFieldContent ~ props:", props);
|
|
30492
30491
|
const {
|
|
30493
30492
|
name,
|
|
30494
30493
|
filterFields = "company_id",
|
|
@@ -30497,7 +30496,6 @@ const DynamicDependentFieldContent = ({ control, watch, setValue, getFieldState:
|
|
|
30497
30496
|
enable_footer = true,
|
|
30498
30497
|
apiType
|
|
30499
30498
|
} = props;
|
|
30500
|
-
console.log("🚀 ~ DynamicDependentFieldContent ~ apiType:", apiType);
|
|
30501
30499
|
const entries = useMemo(
|
|
30502
30500
|
() => normaliseFilterFields(filterFields, filterKey),
|
|
30503
30501
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -37970,7 +37968,7 @@ const Filter = ({
|
|
|
37970
37968
|
}) => {
|
|
37971
37969
|
const location2 = useLocation();
|
|
37972
37970
|
const token = localStorage.getItem(auth.storageTokenKeyName);
|
|
37973
|
-
const { updatePageInfo, activePage, schemaFields, setActivePage } = usePages();
|
|
37971
|
+
const { updatePageInfo, activePage, schemaFields, setActivePage, customRouteToResourceMap } = usePages();
|
|
37974
37972
|
fields = isUseFields ? generateFields(fields) : schemaFields.length ? generateFields(schemaFields) : fields;
|
|
37975
37973
|
const [query, setQuery] = useState(initialQuery);
|
|
37976
37974
|
const [filteredSavedFilters, setFilteredSavedFilters] = useState(savedFilters ?? []);
|
|
@@ -37978,7 +37976,10 @@ const Filter = ({
|
|
|
37978
37976
|
const [openRenameFilter, setIsOpenRenameFilter] = useState(null);
|
|
37979
37977
|
const [errorMessage, setErrorMessage] = useState(null);
|
|
37980
37978
|
const { isRtl } = useLanguage();
|
|
37981
|
-
const resources = useMemo(() =>
|
|
37979
|
+
const resources = useMemo(() => {
|
|
37980
|
+
const mergedMap = { ...routeToResourceMap, ...customRouteToResourceMap };
|
|
37981
|
+
return mergedMap[location2.pathname] || null;
|
|
37982
|
+
}, [location2.pathname, customRouteToResourceMap]);
|
|
37982
37983
|
useEffect(() => {
|
|
37983
37984
|
savedFilters && setFilteredSavedFilters(savedFilters);
|
|
37984
37985
|
}, [savedFilters]);
|
|
@@ -39324,13 +39325,16 @@ const ActionBar = React__default.memo((props) => {
|
|
|
39324
39325
|
const { t } = useTranslation();
|
|
39325
39326
|
const theme = useTheme$3();
|
|
39326
39327
|
const isLgUp = useMediaQuery$1(theme.breakpoints.up("xl"));
|
|
39327
|
-
const { activePage, updatePageInfo, schemaFields, setActivePage } = usePages();
|
|
39328
|
+
const { activePage, updatePageInfo, schemaFields, setActivePage, customRouteToResourceMap } = usePages();
|
|
39328
39329
|
const { filters } = activePage;
|
|
39329
39330
|
const visibleTitleMenus = useMemo(
|
|
39330
39331
|
() => Array.isArray(titleMenus) ? titleMenus.filter((menu) => menu == null ? void 0 : menu.show) : [],
|
|
39331
39332
|
[titleMenus]
|
|
39332
39333
|
);
|
|
39333
|
-
const resources = useMemo(() =>
|
|
39334
|
+
const resources = useMemo(() => {
|
|
39335
|
+
const mergedMap = { ...routeToResourceMap, ...customRouteToResourceMap };
|
|
39336
|
+
return mergedMap[location2.pathname] || null;
|
|
39337
|
+
}, [location2.pathname, customRouteToResourceMap]);
|
|
39334
39338
|
const pageResourceName = resources == null ? void 0 : resources.pageResourceName;
|
|
39335
39339
|
useEffect(() => {
|
|
39336
39340
|
fetchSavedFilters();
|
|
@@ -39732,15 +39736,17 @@ const ActionBar = React__default.memo((props) => {
|
|
|
39732
39736
|
open: Boolean(rowAnchorEl),
|
|
39733
39737
|
onClose: handleActionsClose,
|
|
39734
39738
|
children: rowActionMenu == null ? void 0 : rowActionMenu.map((option) => {
|
|
39739
|
+
const effectiveModuleName = pageName || pageResourceName;
|
|
39735
39740
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
39736
39741
|
MenuItem,
|
|
39737
39742
|
{
|
|
39738
39743
|
onClick: () => {
|
|
39739
|
-
|
|
39744
|
+
if (!effectiveModuleName) return;
|
|
39745
|
+
option.handleAction(effectiveModuleName);
|
|
39740
39746
|
setRowAnchorEl(null);
|
|
39741
39747
|
},
|
|
39742
39748
|
sx: { alignItems: "center", gap: 0.5 },
|
|
39743
|
-
disabled: typeof option.disabled === "function" ? option.disabled() : Boolean(option.disabled),
|
|
39749
|
+
disabled: !effectiveModuleName || (typeof option.disabled === "function" ? option.disabled() : Boolean(option.disabled)),
|
|
39744
39750
|
children: [
|
|
39745
39751
|
option == null ? void 0 : option.icon,
|
|
39746
39752
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Typography, { type: "s4", color: "inherit", children: option.label })
|
|
@@ -41790,4 +41796,4 @@ export {
|
|
|
41790
41796
|
DynamicTable as y,
|
|
41791
41797
|
DynamicTagsInput as z
|
|
41792
41798
|
};
|
|
41793
|
-
//# sourceMappingURL=android-12-switch-
|
|
41799
|
+
//# sourceMappingURL=android-12-switch-C54QA5wF.esm.js.map
|