@erpsquad/common 1.10.29 → 1.10.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/chunks/{ERPUIProvider-CLg_Yo12.esm.js → ERPUIProvider-CIzXMsuV.esm.js} +8 -8
  2. package/dist/chunks/{ERPUIProvider-CLg_Yo12.esm.js.map → ERPUIProvider-CIzXMsuV.esm.js.map} +1 -1
  3. package/dist/chunks/{actionCreator-C8cLIOap.esm.js → actionCreator-BzPZv2rR.esm.js} +2 -2
  4. package/dist/chunks/{actionCreator-C8cLIOap.esm.js.map → actionCreator-BzPZv2rR.esm.js.map} +1 -1
  5. package/dist/chunks/{android-12-switch-DM9s0XTb.js → android-12-switch-BILQvv4G.js} +170 -5
  6. package/dist/chunks/android-12-switch-BILQvv4G.js.map +1 -0
  7. package/dist/chunks/{android-12-switch-eTZOAHAa.esm.js → android-12-switch-DpJE56Wi.esm.js} +212 -47
  8. package/dist/chunks/android-12-switch-DpJE56Wi.esm.js.map +1 -0
  9. package/dist/chunks/{appbar-DtROOKgm.esm.js → appbar-5rP5iXcS.esm.js} +4 -4
  10. package/dist/chunks/{appbar-DtROOKgm.esm.js.map → appbar-5rP5iXcS.esm.js.map} +1 -1
  11. package/dist/chunks/{common-Nn4SUfK7.esm.js → common-D59u5rE6.esm.js} +2 -2
  12. package/dist/chunks/{common-Nn4SUfK7.esm.js.map → common-D59u5rE6.esm.js.map} +1 -1
  13. package/dist/chunks/{custom-editor-B-mleFzm.esm.js → custom-editor-UhZu0Svw.esm.js} +2 -2
  14. package/dist/chunks/{custom-editor-B-mleFzm.esm.js.map → custom-editor-UhZu0Svw.esm.js.map} +1 -1
  15. package/dist/chunks/{default-data-BjzCfuoR.js → default-data-B2-JPE4u.js} +9 -11
  16. package/dist/chunks/{default-data-BjzCfuoR.js.map → default-data-B2-JPE4u.js.map} +1 -1
  17. package/dist/chunks/{default-data-C8B-fYa8.esm.js → default-data-DLCnpyaM.esm.js} +19 -21
  18. package/dist/chunks/{default-data-C8B-fYa8.esm.js.map → default-data-DLCnpyaM.esm.js.map} +1 -1
  19. package/dist/chunks/{form-builder-conversion-yi03Elpa.esm.js → form-builder-conversion-gLJCNqSQ.esm.js} +2 -2
  20. package/dist/chunks/{form-builder-conversion-yi03Elpa.esm.js.map → form-builder-conversion-gLJCNqSQ.esm.js.map} +1 -1
  21. package/dist/chunks/{form-builder-deconversion-CFtHF1hm.esm.js → form-builder-deconversion-DNGMsAEj.esm.js} +3 -3
  22. package/dist/chunks/{form-builder-deconversion-CFtHF1hm.esm.js.map → form-builder-deconversion-DNGMsAEj.esm.js.map} +1 -1
  23. package/dist/chunks/{fullScreen-Xv8AR914.esm.js → fullScreen-C8Qnoyrr.esm.js} +2 -2
  24. package/dist/chunks/{fullScreen-Xv8AR914.esm.js.map → fullScreen-C8Qnoyrr.esm.js.map} +1 -1
  25. package/dist/chunks/{languageContext-cweJTzn0.esm.js → languageContext-ffrxXJkr.esm.js} +3 -3
  26. package/dist/chunks/{languageContext-cweJTzn0.esm.js.map → languageContext-ffrxXJkr.esm.js.map} +1 -1
  27. package/dist/chunks/{migration-utils-llqrdBh8.esm.js → migration-utils-BJsX1G2n.esm.js} +2 -2
  28. package/dist/chunks/{migration-utils-llqrdBh8.esm.js.map → migration-utils-BJsX1G2n.esm.js.map} +1 -1
  29. package/dist/chunks/{page-context-BbQNncGA.esm.js → page-context-BlGcwtdZ.esm.js} +3 -3
  30. package/dist/chunks/{page-context-BbQNncGA.esm.js.map → page-context-BlGcwtdZ.esm.js.map} +1 -1
  31. package/dist/chunks/{reducer-DRkUwBHb.esm.js → reducer-D6_f0R4C.esm.js} +2 -2
  32. package/dist/chunks/{reducer-DRkUwBHb.esm.js.map → reducer-D6_f0R4C.esm.js.map} +1 -1
  33. package/dist/chunks/{shareSlice-H0nwzQZv.esm.js → shareSlice-Bxrgfv7o.esm.js} +2 -2
  34. package/dist/chunks/{shareSlice-H0nwzQZv.esm.js.map → shareSlice-Bxrgfv7o.esm.js.map} +1 -1
  35. package/dist/chunks/{sidebar-CdhW0PKj.esm.js → sidebar-n5_ky6G7.esm.js} +4 -4
  36. package/dist/chunks/{sidebar-CdhW0PKj.esm.js.map → sidebar-n5_ky6G7.esm.js.map} +1 -1
  37. package/dist/chunks/{sidebarScreen-DbfP32Xx.esm.js → sidebarScreen-BwkiIBud.esm.js} +5 -6
  38. package/dist/chunks/sidebarScreen-BwkiIBud.esm.js.map +1 -0
  39. package/dist/chunks/{sidebarScreen-figZp_Ln.js → sidebarScreen-Cm763s1P.js} +1 -2
  40. package/dist/chunks/sidebarScreen-Cm763s1P.js.map +1 -0
  41. package/dist/chunks/{store-C2XaFCA_.esm.js → store-OqHSsVaz.esm.js} +3 -3
  42. package/dist/chunks/{store-C2XaFCA_.esm.js.map → store-OqHSsVaz.esm.js.map} +1 -1
  43. package/dist/chunks/{translations-DJZgOpfH.esm.js → translations-GFvlFdi5.esm.js} +2 -2
  44. package/dist/chunks/{translations-DJZgOpfH.esm.js.map → translations-GFvlFdi5.esm.js.map} +1 -1
  45. package/dist/chunks/{uom-field-wrapper-DKN31prP.esm.js → uom-field-wrapper-CgYTONsG.esm.js} +33 -158
  46. package/dist/chunks/uom-field-wrapper-CgYTONsG.esm.js.map +1 -0
  47. package/dist/chunks/{uom-field-wrapper-NNhtGgqI.js → uom-field-wrapper-DoyshtE9.js} +2 -127
  48. package/dist/chunks/uom-field-wrapper-DoyshtE9.js.map +1 -0
  49. package/dist/chunks/{useAccountSetting-CAUDy8rg.esm.js → useAccountSetting-D1Ze8r-T.esm.js} +3 -3
  50. package/dist/chunks/{useAccountSetting-CAUDy8rg.esm.js.map → useAccountSetting-D1Ze8r-T.esm.js.map} +1 -1
  51. package/dist/chunks/{useAdditionalDiscountAutoCalc-DbyTG80U.esm.js → useAdditionalDiscountAutoCalc-PhSfzd5X.esm.js} +5 -5
  52. package/dist/chunks/{useAdditionalDiscountAutoCalc-DbyTG80U.esm.js.map → useAdditionalDiscountAutoCalc-PhSfzd5X.esm.js.map} +1 -1
  53. package/dist/chunks/{useAuth-BaUSGWbL.esm.js → useAuth-DhzbULWV.esm.js} +2 -2
  54. package/dist/chunks/{useAuth-BaUSGWbL.esm.js.map → useAuth-DhzbULWV.esm.js.map} +1 -1
  55. package/dist/chunks/{useLangauge-BUF4epYu.esm.js → useLangauge-CbMaEsdS.esm.js} +2 -2
  56. package/dist/chunks/{useLangauge-BUF4epYu.esm.js.map → useLangauge-CbMaEsdS.esm.js.map} +1 -1
  57. package/dist/components/index.esm.js +53 -53
  58. package/dist/components/index.js +4 -4
  59. package/dist/contexts/index.esm.js +3 -3
  60. package/dist/hooks/index.esm.js +5 -5
  61. package/dist/index.esm.js +90 -90
  62. package/dist/index.js +6 -6
  63. package/dist/layout/index.esm.js +2 -2
  64. package/dist/layout/index.js +1 -1
  65. package/dist/redux/index.esm.js +4 -4
  66. package/dist/utils/index.esm.js +7 -7
  67. package/dist/views/index.esm.js +9 -9
  68. package/dist/views/index.js +2 -2
  69. package/package.json +1 -1
  70. package/dist/chunks/android-12-switch-DM9s0XTb.js.map +0 -1
  71. package/dist/chunks/android-12-switch-eTZOAHAa.esm.js.map +0 -1
  72. package/dist/chunks/sidebarScreen-DbfP32Xx.esm.js.map +0 -1
  73. package/dist/chunks/sidebarScreen-figZp_Ln.js.map +0 -1
  74. package/dist/chunks/uom-field-wrapper-DKN31prP.esm.js.map +0 -1
  75. package/dist/chunks/uom-field-wrapper-NNhtGgqI.js.map +0 -1
@@ -1,19 +1,19 @@
1
1
  import React__default, { useState, useEffect, useCallback, useContext, createContext } from "react";
2
2
  import { getI18n, useTranslation } from "react-i18next";
3
- import { l as loadModuleTranslations } from "./translations-DJZgOpfH.esm.js";
3
+ import { l as loadModuleTranslations } from "./translations-GFvlFdi5.esm.js";
4
4
  import { m as modules } from "./modules-DIHbpV-p.esm.js";
5
- import { j as useAuth, a as AuthProvider } from "./useAuth-BaUSGWbL.esm.js";
5
+ import { j as useAuth, a as AuthProvider } from "./useAuth-DhzbULWV.esm.js";
6
6
  import { useDispatch, Provider } from "react-redux";
7
- import { f as usePages } from "./useAccountSetting-CAUDy8rg.esm.js";
7
+ import { f as usePages } from "./useAccountSetting-D1Ze8r-T.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
- import { c as createLibraryStore } from "./store-C2XaFCA_.esm.js";
11
+ import { c as createLibraryStore } from "./store-OqHSsVaz.esm.js";
12
12
  import { M as MUIThemeWrapper, c as createDarkTheme, a as createLightTheme } from "./theme-impl-pfACQIIj.esm.js";
13
- import { a as LanguageProvider } from "./languageContext-cweJTzn0.esm.js";
14
- import { c as PermissionsProvider } from "./page-context-BbQNncGA.esm.js";
13
+ import { a as LanguageProvider } from "./languageContext-ffrxXJkr.esm.js";
14
+ import { c as PermissionsProvider } from "./page-context-BlGcwtdZ.esm.js";
15
15
  import { i as initializeApiConfig } from "./api-config-GOys-syK.esm.js";
16
- import { az as initializeApiBaseUrls, z as extendApiConfigurations } from "./common-Nn4SUfK7.esm.js";
16
+ import { az as initializeApiBaseUrls, z as extendApiConfigurations } from "./common-D59u5rE6.esm.js";
17
17
  import { s as setModuleRoutes } from "./module-routes-config-CCkZEtfg.esm.js";
18
18
  let globalLastLoadedModules = "";
19
19
  let globalIsLoading = false;
@@ -301,4 +301,4 @@ export {
301
301
  useSnackbarRef as d,
302
302
  useAppTranslations as u
303
303
  };
304
- //# sourceMappingURL=ERPUIProvider-CLg_Yo12.esm.js.map
304
+ //# sourceMappingURL=ERPUIProvider-CIzXMsuV.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ERPUIProvider-CLg_Yo12.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'\n// import { useLocation } from 'react-router-dom'\nimport { getI18n, useTranslation } from 'react-i18next'\nimport { loadModuleTranslations } from '../utils/translations'\nimport modules from '../constants/modules'\nimport { useAuth } from './useAuth'\n\n// Global state to prevent duplicate calls across all hook instances\nlet globalLastLoadedModules = ''\nlet globalIsLoading = false\nlet globalInitialLoad = false\n\nexport const useAppTranslations = () => {\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\n\tconst location = window.location\n\tconst i18nInstance = getI18n()\n\tconst { user, loading } = useAuth()\n\tconst { t } = useTranslation()\n\n\tuseEffect(() => {\n\t\tconst erpModules = modules(t)\n\t\tconst currentPath = location.pathname.toLowerCase()\n\t\tif(user?.id && !loading) {\n\t\n\t\t\tconst matchedModule = erpModules.find(\n\t\t\t\t(mod) =>\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\n\t\t\t)\n\t\n\t\t\tlet modulesToLoad: string[] = []\n\t\n\t\t\tif (matchedModule?.translationModule) {\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\n\t\t\t\tmodulesToLoad = ['common']\n\t\t\t}\n\t\n\t\t\tif (modulesToLoad.length > 0) {\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\n\t\n\t\t\t\t// Skip if same modules are already loaded or currently loading\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\n\t\t\t\t\tif (globalInitialLoad) {\n\t\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\n\t\t\t\tglobalIsLoading = true\n\t\t\t\tglobalLastLoadedModules = moduleKey\n\t\t\t\tsetIsLoading(true)\n\t\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\n\t\t\t\t\tglobalIsLoading = false\n\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// No modules to load, but still need to handle initial load state\n\t\t\t\tif (globalInitialLoad) {\n\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [location.pathname, t, user, loading])\n\n\treturn { isLoading }\n};\n\nexport default useAppTranslations;\n","import { useCallback, useState, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { usePages } from './use-pages';\nimport { useLocation } from 'react-router-dom';\ninterface FilterParams {\n\tskip: number;\n\tlimit: number;\n\tsearch?: string;\n\tselect?: string;\n\torder?: string;\n\tfilters?: string;\n}\n\ninterface ActivePage {\n\tsort?: { id: string; desc: boolean };\n\tfilterQueryString?: string;\n\tsearch?: string;\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\n}\n\nconst useGenericDataFetcher = (\n\tcols?: ActivePage,\n\tpagination: { skip: number; limit: number },\n\tfetchAction: (filters: FilterParams) => void,\n\tcustomeFilter: any = '',\n\tcustomDeps?: any[],\n\tshowCreatedBy: boolean = true,\n\tcustomFields?: any = []\n) => {\n\tconst { activePage } = usePages();\n\tconst dispatch = useDispatch();\n\tconst location = useLocation();\n\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\n\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\n\n\tuseEffect(() => {\n\t\tif (trackedPath !== location?.pathname) {\n\t\t\tsetTrackedPath(location?.pathname);\n\t\t\tsetTrackedColumns([]);\n\t\t}\n\t}, [location?.pathname, trackedPath]);\n\n\tuseEffect(() => {\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\n\t\t\t\tsetTrackedColumns(sourceColumns);\n\t\t\t}\n\t\t}\n\t}, [location?.pathname, trackedPath, sourceColumns]);\n\n\tconst getProcessedFilters = useCallback(() => {\n\t\tconst { filterQueryString } = activePage || {};\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\n\t\tlet filters = customeFilter;\n\n\t\tif (extraQueryString) {\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\n\t\t} else if (filters) {\n\t\t\tfilters = `(${filters})`;\n\t\t}\n\n\t\treturn filters || undefined;\n\t\t//eslint-disable-next-line\n\t}, [activePage.filterQueryString, customeFilter]);\n\n\tconst fetchData = useCallback(() => {\n\t\tif (!fetchAction) {\n\t\t\treturn;\n\t\t}\n\t\tconst { sort = null, search } = activePage;\n\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\n\n\t\tconst filters = getProcessedFilters();\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\n\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\n\t\t\t?.map((item) =>\n\t\t\t\titem.accessorKey?.includes(\".\")\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\n\t\t\t\t\t: item.accessorKey\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\n\t\tconst payload: FilterParams = {\n\t\t\tskip: activePage?.skip || pagination?.skip,\n\t\t\tlimit: pagination.limit,\n\t\t\tsearch,\n\t\t\tselect: selectPayload,\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\n\t\t\t...(filters && { filters }),\n\t\t};\n\n\t\tdispatch(fetchAction(payload));\n\t\t//eslint-disable-next-line\n\t}, [\n\t\ttrackedColumns,\n\t\tactivePage.sort,\n\t\tactivePage.filterQueryString,\n\t\tactivePage.search,\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\n\t\t// here would make fetchData identity change twice per pagination click,\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\n\t\tactivePage?.skip,\n\t\tpagination?.limit,\n\t\tdispatch,\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t...(customDeps || []),\n\t]);\n\n\n\n\treturn fetchData;\n};\n\nexport default useGenericDataFetcher;\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\n\ntype ApiResponse = {\n meta?: {\n requestStatus?: string;\n };\n error?: {\n message?: string;\n };\n payload?: any\n};\n\ntype Callback = () => void;\n\nlet globalEnqueueSnackbar: any = null;\n\nexport const useSnackbarRef = (): void => {\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\n globalEnqueueSnackbar = snackbarHook;\n};\n\nexport function apiHelper(\n res: ApiResponse,\n callBack?: Callback,\n enqueueSnackbarOverride?: any\n): void {\n if (res?.meta?.requestStatus === \"rejected\") {\n const errorMessage = (() => {\n try {\n const msg = res.error?.message || res?.payload?.message;\n return msg ? JSON.parse(msg) : null;\n } catch {\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\n }\n })();\n\n const rawError = errorMessage?.message;\n let message = \"Something went wrong\";\n\n if (typeof rawError === \"string\") {\n message = rawError.replace(\"Error:\", \"\").trim();\n } else if (rawError && typeof rawError === \"object\") {\n message = (rawError as any).message || JSON.stringify(rawError);\n } else if (rawError) {\n message = String(rawError);\n }\n\n const snackbar = typeof enqueueSnackbarOverride === 'function'\n ? enqueueSnackbarOverride\n : (globalEnqueueSnackbar || enqueueSnackbar);\n\n if (typeof snackbar === \"function\") {\n snackbar(message, { variant: \"error\" });\n }\n return;\n }\n\n if (callBack) {\n if (typeof callBack === \"function\") {\n try {\n callBack();\n } catch (err) {\n console.error(\"[apiHelper] callBack threw an error:\", err);\n }\n } else {\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\n }\n }\n}\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { ThemeProvider } from '@mui/material/styles';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { SnackbarProvider } from 'notistack';\nimport { BrowserRouter } from 'react-router-dom';\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\nimport { AuthProvider } from '../../contexts/AuthContext';\nimport { LanguageProvider } from '../../contexts/languageContext';\nimport { PageProvider } from '../../contexts/page-context';\nimport { PermissionsProvider } from '../../contexts/permission-context';\nimport MUIThemeWrapper from '../../theme/themeWrapper';\nimport Loader from '../loader';\nimport useAppTranslations from '../../hooks/use-translations';\nimport '../../utils/i18n';\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\nimport { setModuleRoutes } from '../../utils/module-routes-config';\nimport { useSnackbarRef } from '../../hooks/apiHelper';\n\nconst SnackbarRefTracker: React.FC = () => {\n useSnackbarRef();\n return null;\n};\n\n\n// Context for library configuration\ninterface ERPUIContextValue {\n useRedux: boolean;\n apiClient?: ApiClientConfig;\n theme?: any;\n themeMode: 'light' | 'dark';\n direction: 'ltr' | 'rtl';\n primaryColor?: Color;\n}\n\nconst ERPUIContext = createContext<ERPUIContextValue>({\n useRedux: false,\n themeMode: 'light',\n direction: 'ltr',\n});\n\nexport const useERPUI = () => useContext(ERPUIContext);\n\n// Provider props interface\ninterface ERPUIProviderProps {\n children: ReactNode;\n\n // Redux configuration\n useRedux?: boolean;\n reduxStore?: any;\n apiClient?: ApiClientConfig;\n additionalReducers?: Record<string, any>;\n\n // Theme configuration\n theme?: any;\n themeMode?: 'light' | 'dark';\n primaryColor?: Color;\n direction?: 'ltr' | 'rtl';\n\n // Context providers configuration\n enableAuth?: boolean;\n enableLanguage?: boolean;\n enablePages?: boolean;\n enablePermissions?: boolean;\n enableRouter?: boolean;\n enableSnackbar?: boolean;\n\n // Other configuration\n enableCssBaseline?: boolean;\n snackbarConfig?: {\n maxSnack?: number;\n anchorOrigin?: {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n autoHideDuration?: number;\n };\n\n // API configuration\n apiConfig?: ApiConfig;\n\n // Additional API configurations to extend the shared apiConfigurations map\n additionalApiConfigurations?: Record<string, any>;\n\n // Module routes override — allows MFE apps to inject their own full route set\n // so the header module dropdown can match routes correctly.\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\n moduleRoutes?: Record<string, string[]>;\n\n // Route maps\n routeToColumnsMap?: Record<string, any>;\n routeToResourceMap?: Record<string, any>;\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\n}\n\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\n children,\n\n // Redux props\n useRedux = false,\n reduxStore,\n apiClient,\n additionalReducers = {},\n\n // Theme props\n theme: customTheme,\n themeMode = 'light',\n primaryColor,\n direction = 'ltr',\n\n // Context providers configuration\n enableAuth = true,\n enableLanguage = true,\n enablePages = true,\n enablePermissions = true,\n enableRouter = false, // Default false since consuming app usually provides router\n enableSnackbar = true,\n\n // Other props\n enableCssBaseline = true,\n snackbarConfig = {\n maxSnack: 3,\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\n autoHideDuration: 5000,\n },\n\n // API configuration\n apiConfig: providedApiConfig,\n additionalApiConfigurations,\n moduleRoutes,\n routeToColumnsMap,\n routeToResourceMap,\n publicRoutes = [], // Default empty array for public routes in AuthProvider \n}) => {\n console.log(\"additionalApiConfigurations...........\",additionalApiConfigurations)\n\n // Initialize API configuration synchronously before first render\n // This prevents \"API configuration not initialized\" errors when components\n // try to use the API during initial render\n const isInitialized = React.useRef(false);\n\n if (providedApiConfig && !isInitialized.current) {\n try {\n initializeApiConfig(providedApiConfig);\n initializeApiBaseUrls();\n if (additionalApiConfigurations) {\n extendApiConfigurations(additionalApiConfigurations);\n }\n // Inject MFE-provided module routes so the header can resolve modules\n if (moduleRoutes) {\n setModuleRoutes(moduleRoutes);\n }\n isInitialized.current = true;\n } catch (error) {\n console.error('Failed to initialize API configuration:', error);\n }\n }\n // const { isLoading } = useAppTranslations();\n // if (isLoading) {\n // return <Loader />;\n // }\n // Create or use provided Redux store\n const store = React.useMemo(() => {\n if (!useRedux) return null;\n\n if (reduxStore) {\n return reduxStore;\n }\n\n return createLibraryStore(additionalReducers, apiClient);\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\n\n // Create theme\n const theme = React.useMemo(() => {\n if (customTheme) {\n return customTheme;\n }\n\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\n return generatedTheme;\n }, [customTheme, themeMode, primaryColor, direction]);\n\n // Context value\n const contextValue: ERPUIContextValue = {\n useRedux,\n apiClient,\n theme,\n themeMode,\n direction,\n primaryColor,\n };\n\n // Build provider tree from inside out\n let content = (\n <ERPUIContext.Provider value={contextValue}>\n {/* <ThemeProvider theme={theme}>\n {enableCssBaseline && <CssBaseline />} */}\n {/* <Suspense fallback={<Loader />}> */}\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\n {children}\n </MUIThemeWrapper>\n {/* </Suspense> */}\n {/* </ThemeProvider> */}\n </ERPUIContext.Provider>\n );\n\n // Wrap with snackbar provider if enabled\n if (enableSnackbar) {\n content = (\n <SnackbarProvider {...snackbarConfig}>\n <SnackbarRefTracker />\n {content}\n </SnackbarProvider>\n );\n }\n\n // Wrap with page provider if enabled\n // if (enablePages) {\n // content = (\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\n // {content}\n // </PageProvider>\n // );\n // }\n\n // Wrap with permissions provider if enabled\n if (enablePermissions) {\n content = (\n <PermissionsProvider>\n {content}\n </PermissionsProvider>\n );\n }\n\n // Wrap with language provider if enabled\n if (enableLanguage) {\n content = (\n <LanguageProvider>\n {content}\n </LanguageProvider>\n );\n }\n\n // Wrap with auth provider if enabled\n if (enableAuth) {\n content = (\n <AuthProvider publicRoutes={publicRoutes}>\n {content}\n </AuthProvider>\n );\n }\n\n // Wrap with router if enabled\n if (enableRouter) {\n content = (\n <BrowserRouter>\n {content}\n </BrowserRouter>\n );\n }\n\n // Wrap with Redux provider if enabled\n if (useRedux && store) {\n content = (\n <ReduxProvider store={store}>\n {content}\n </ReduxProvider>\n );\n }\n\n return content;\n};\n\nexport default ERPUIProvider;"],"names":["_a","React","jsx","jsxs","ReduxProvider"],"mappings":"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"}
1
+ {"version":3,"file":"ERPUIProvider-CIzXMsuV.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'\n// import { useLocation } from 'react-router-dom'\nimport { getI18n, useTranslation } from 'react-i18next'\nimport { loadModuleTranslations } from '../utils/translations'\nimport modules from '../constants/modules'\nimport { useAuth } from './useAuth'\n\n// Global state to prevent duplicate calls across all hook instances\nlet globalLastLoadedModules = ''\nlet globalIsLoading = false\nlet globalInitialLoad = false\n\nexport const useAppTranslations = () => {\n\tconst [isLoading, setIsLoading] = useState(globalInitialLoad)\n\tconst location = window.location\n\tconst i18nInstance = getI18n()\n\tconst { user, loading } = useAuth()\n\tconst { t } = useTranslation()\n\n\tuseEffect(() => {\n\t\tconst erpModules = modules(t)\n\t\tconst currentPath = location.pathname.toLowerCase()\n\t\tif(user?.id && !loading) {\n\t\n\t\t\tconst matchedModule = erpModules.find(\n\t\t\t\t(mod) =>\n\t\t\t\t\tmod.link.toLowerCase() === currentPath ||\n\t\t\t\t\tmod.connectedRoutes?.some((route: string) => currentPath.startsWith(route.toLowerCase()))\n\t\t\t)\n\t\n\t\t\tlet modulesToLoad: string[] = []\n\t\n\t\t\tif (matchedModule?.translationModule) {\n\t\t\t\tmodulesToLoad = [...matchedModule.translationModule, 'common']\n\t\t\t} else if (!matchedModule && currentPath === '/dashboard') {\n\t\t\t\tmodulesToLoad = ['common']\n\t\t\t}\n\t\n\t\t\tif (modulesToLoad.length > 0) {\n\t\t\t\tconst moduleKey = [...modulesToLoad].sort().join(',')\n\t\n\t\t\t\t// Skip if same modules are already loaded or currently loading\n\t\t\t\tif (globalLastLoadedModules === moduleKey || globalIsLoading) {\n\t\t\t\t\tif (globalInitialLoad) {\n\t\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t\t}\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\n\t\t\t\tglobalIsLoading = true\n\t\t\t\tglobalLastLoadedModules = moduleKey\n\t\t\t\tsetIsLoading(true)\n\t\n\t\t\t\tloadModuleTranslations(modulesToLoad, i18nInstance).finally(() => {\n\t\t\t\t\tglobalIsLoading = false\n\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t// No modules to load, but still need to handle initial load state\n\t\t\t\tif (globalInitialLoad) {\n\t\t\t\t\tsetIsLoading(false)\n\t\t\t\t\tglobalInitialLoad = false\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [location.pathname, t, user, loading])\n\n\treturn { isLoading }\n};\n\nexport default useAppTranslations;\n","import { useCallback, useState, useEffect } from 'react';\nimport { useDispatch } from 'react-redux';\nimport { usePages } from './use-pages';\nimport { useLocation } from 'react-router-dom';\ninterface FilterParams {\n\tskip: number;\n\tlimit: number;\n\tsearch?: string;\n\tselect?: string;\n\torder?: string;\n\tfilters?: string;\n}\n\ninterface ActivePage {\n\tsort?: { id: string; desc: boolean };\n\tfilterQueryString?: string;\n\tsearch?: string;\n\tvisible_columns?: { visible: boolean; accessorKey: string }[];\n}\n\nconst useGenericDataFetcher = (\n\tcols?: ActivePage,\n\tpagination: { skip: number; limit: number },\n\tfetchAction: (filters: FilterParams) => void,\n\tcustomeFilter: any = '',\n\tcustomDeps?: any[],\n\tshowCreatedBy: boolean = true,\n\tcustomFields?: any = []\n) => {\n\tconst { activePage } = usePages();\n\tconst dispatch = useDispatch();\n\tconst location = useLocation();\n\n\tconst sourceColumns = Array.isArray(cols) ? cols?.filter((col: any) => col.visible) : activePage?.visible_columns;\n\n\tconst [trackedPath, setTrackedPath] = useState<string | null>(null);\n\tconst [trackedColumns, setTrackedColumns] = useState<any[]>([]);\n\n\tuseEffect(() => {\n\t\tif (trackedPath !== location?.pathname) {\n\t\t\tsetTrackedPath(location?.pathname);\n\t\t\tsetTrackedColumns([]);\n\t\t}\n\t}, [location?.pathname, trackedPath]);\n\n\tuseEffect(() => {\n\t\tif (trackedPath === location?.pathname && sourceColumns?.length > 0) {\n\t\t\tif (JSON.stringify(trackedColumns) !== JSON.stringify(sourceColumns)) {\n\t\t\t\tsetTrackedColumns(sourceColumns);\n\t\t\t}\n\t\t}\n\t}, [location?.pathname, trackedPath, sourceColumns]);\n\n\tconst getProcessedFilters = useCallback(() => {\n\t\tconst { filterQueryString } = activePage || {};\n\t\tconst queryString = filterQueryString?.replaceAll(/[()]/g, \"\") || '';\n\t\tconst extraQueryString = queryString.length ? `&${queryString}` : '';\n\t\tlet filters = customeFilter;\n\n\t\tif (extraQueryString) {\n\t\t\tfilters = filters ? `(${filters}${extraQueryString})` : `(${extraQueryString})`;\n\t\t} else if (filters) {\n\t\t\tfilters = `(${filters})`;\n\t\t}\n\n\t\treturn filters || undefined;\n\t\t//eslint-disable-next-line\n\t}, [activePage.filterQueryString, customeFilter]);\n\n\tconst fetchData = useCallback(() => {\n\t\tif (!fetchAction) {\n\t\t\treturn;\n\t\t}\n\t\tconst { sort = null, search } = activePage;\n\n\t\tif (!trackedColumns || trackedColumns.length === 0) return;\n\n\t\tconst filters = getProcessedFilters();\n\t\tconst visibleColumns = trackedColumns?.filter((vc) => vc.visible)\n\n\t\tconst selectPayload = visibleColumns?.length > 0 ? `[${visibleColumns\n\t\t\t?.map((item) =>\n\t\t\t\titem.accessorKey?.includes(\".\")\n\t\t\t\t\t? item.accessorKey.split(\".\")[0]\n\t\t\t\t\t: item.accessorKey\n\t\t\t)}${showCreatedBy ? ',created_at,created_by_data' : ''}${customFields?.length ? `,${customFields?.join(',')}` : ''}]` : undefined\n\t\tconst payload: FilterParams = {\n\t\t\tskip: activePage?.skip || pagination?.skip,\n\t\t\tlimit: pagination.limit,\n\t\t\tsearch,\n\t\t\tselect: selectPayload,\n\t\t\t...(sort && { order: `${sort.id}:${sort.desc ? -1 : 1}` }),\n\t\t\t...(filters && { filters }),\n\t\t};\n\n\t\tdispatch(fetchAction(payload));\n\t\t//eslint-disable-next-line\n\t}, [\n\t\ttrackedColumns,\n\t\tactivePage.sort,\n\t\tactivePage.filterQueryString,\n\t\tactivePage.search,\n\t\t// pagination?.skip intentionally omitted: the Pagination component already\n\t\t// mirrors skip into activePage.skip on pageNo change; including pagination.skip\n\t\t// here would make fetchData identity change twice per pagination click,\n\t\t// triggering the listing useEffect twice and causing duplicate API calls.\n\t\tactivePage?.skip,\n\t\tpagination?.limit,\n\t\tdispatch,\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t...(customDeps || []),\n\t]);\n\n\n\n\treturn fetchData;\n};\n\nexport default useGenericDataFetcher;\n","import { enqueueSnackbar, useSnackbar } from 'notistack';\n\ntype ApiResponse = {\n meta?: {\n requestStatus?: string;\n };\n error?: {\n message?: string;\n };\n payload?: any\n};\n\ntype Callback = () => void;\n\nlet globalEnqueueSnackbar: any = null;\n\nexport const useSnackbarRef = (): void => {\n const { enqueueSnackbar: snackbarHook } = useSnackbar();\n globalEnqueueSnackbar = snackbarHook;\n};\n\nexport function apiHelper(\n res: ApiResponse,\n callBack?: Callback,\n enqueueSnackbarOverride?: any\n): void {\n if (res?.meta?.requestStatus === \"rejected\") {\n const errorMessage = (() => {\n try {\n const msg = res.error?.message || res?.payload?.message;\n return msg ? JSON.parse(msg) : null;\n } catch {\n return { message: res.error?.message || res?.payload?.message || \"Something went wrong\" };\n }\n })();\n\n const rawError = errorMessage?.message;\n let message = \"Something went wrong\";\n\n if (typeof rawError === \"string\") {\n message = rawError.replace(\"Error:\", \"\").trim();\n } else if (rawError && typeof rawError === \"object\") {\n message = (rawError as any).message || JSON.stringify(rawError);\n } else if (rawError) {\n message = String(rawError);\n }\n\n const snackbar = typeof enqueueSnackbarOverride === 'function'\n ? enqueueSnackbarOverride\n : (globalEnqueueSnackbar || enqueueSnackbar);\n\n if (typeof snackbar === \"function\") {\n snackbar(message, { variant: \"error\" });\n }\n return;\n }\n\n if (callBack) {\n if (typeof callBack === \"function\") {\n try {\n callBack();\n } catch (err) {\n console.error(\"[apiHelper] callBack threw an error:\", err);\n }\n } else {\n console.warn(\"[apiHelper] Provided callBack is not a function:\", typeof callBack);\n }\n }\n}\n","import React, { createContext, useContext, ReactNode, Suspense } from 'react';\nimport { Provider as ReduxProvider } from 'react-redux';\nimport { ThemeProvider } from '@mui/material/styles';\nimport CssBaseline from '@mui/material/CssBaseline';\nimport { SnackbarProvider } from 'notistack';\nimport { BrowserRouter } from 'react-router-dom';\nimport { createLibraryStore, ApiClientConfig } from '../../redux';\nimport { createLightTheme, createDarkTheme, Color } from '../../theme';\nimport { AuthProvider } from '../../contexts/AuthContext';\nimport { LanguageProvider } from '../../contexts/languageContext';\nimport { PageProvider } from '../../contexts/page-context';\nimport { PermissionsProvider } from '../../contexts/permission-context';\nimport MUIThemeWrapper from '../../theme/themeWrapper';\nimport Loader from '../loader';\nimport useAppTranslations from '../../hooks/use-translations';\nimport '../../utils/i18n';\nimport { initializeApiConfig, ApiConfig } from '../../utils/api-config';\nimport { initializeApiBaseUrls, extendApiConfigurations } from '../../utils/api';\nimport { setModuleRoutes } from '../../utils/module-routes-config';\nimport { useSnackbarRef } from '../../hooks/apiHelper';\n\nconst SnackbarRefTracker: React.FC = () => {\n useSnackbarRef();\n return null;\n};\n\n\n// Context for library configuration\ninterface ERPUIContextValue {\n useRedux: boolean;\n apiClient?: ApiClientConfig;\n theme?: any;\n themeMode: 'light' | 'dark';\n direction: 'ltr' | 'rtl';\n primaryColor?: Color;\n}\n\nconst ERPUIContext = createContext<ERPUIContextValue>({\n useRedux: false,\n themeMode: 'light',\n direction: 'ltr',\n});\n\nexport const useERPUI = () => useContext(ERPUIContext);\n\n// Provider props interface\ninterface ERPUIProviderProps {\n children: ReactNode;\n\n // Redux configuration\n useRedux?: boolean;\n reduxStore?: any;\n apiClient?: ApiClientConfig;\n additionalReducers?: Record<string, any>;\n\n // Theme configuration\n theme?: any;\n themeMode?: 'light' | 'dark';\n primaryColor?: Color;\n direction?: 'ltr' | 'rtl';\n\n // Context providers configuration\n enableAuth?: boolean;\n enableLanguage?: boolean;\n enablePages?: boolean;\n enablePermissions?: boolean;\n enableRouter?: boolean;\n enableSnackbar?: boolean;\n\n // Other configuration\n enableCssBaseline?: boolean;\n snackbarConfig?: {\n maxSnack?: number;\n anchorOrigin?: {\n vertical: 'top' | 'bottom';\n horizontal: 'left' | 'center' | 'right';\n };\n autoHideDuration?: number;\n };\n\n // API configuration\n apiConfig?: ApiConfig;\n\n // Additional API configurations to extend the shared apiConfigurations map\n additionalApiConfigurations?: Record<string, any>;\n\n // Module routes override — allows MFE apps to inject their own full route set\n // so the header module dropdown can match routes correctly.\n // Example: { hrms: Object.values(PathnameHrms).map(p => Pathname.DASHBOARD_HRMS + p) }\n moduleRoutes?: Record<string, string[]>;\n\n // Route maps\n routeToColumnsMap?: Record<string, any>;\n routeToResourceMap?: Record<string, any>;\n publicRoutes?: string[]; // Optional prop to allow customization of public routes in AuthProvider\n}\n\nexport const ERPUIProvider: React.FC<ERPUIProviderProps> = ({\n children,\n\n // Redux props\n useRedux = false,\n reduxStore,\n apiClient,\n additionalReducers = {},\n\n // Theme props\n theme: customTheme,\n themeMode = 'light',\n primaryColor,\n direction = 'ltr',\n\n // Context providers configuration\n enableAuth = true,\n enableLanguage = true,\n enablePages = true,\n enablePermissions = true,\n enableRouter = false, // Default false since consuming app usually provides router\n enableSnackbar = true,\n\n // Other props\n enableCssBaseline = true,\n snackbarConfig = {\n maxSnack: 3,\n anchorOrigin: { vertical: 'top', horizontal: 'right' },\n autoHideDuration: 5000,\n },\n\n // API configuration\n apiConfig: providedApiConfig,\n additionalApiConfigurations,\n moduleRoutes,\n routeToColumnsMap,\n routeToResourceMap,\n publicRoutes = [], // Default empty array for public routes in AuthProvider \n}) => {\n console.log(\"additionalApiConfigurations...........\",additionalApiConfigurations)\n\n // Initialize API configuration synchronously before first render\n // This prevents \"API configuration not initialized\" errors when components\n // try to use the API during initial render\n const isInitialized = React.useRef(false);\n\n if (providedApiConfig && !isInitialized.current) {\n try {\n initializeApiConfig(providedApiConfig);\n initializeApiBaseUrls();\n if (additionalApiConfigurations) {\n extendApiConfigurations(additionalApiConfigurations);\n }\n // Inject MFE-provided module routes so the header can resolve modules\n if (moduleRoutes) {\n setModuleRoutes(moduleRoutes);\n }\n isInitialized.current = true;\n } catch (error) {\n console.error('Failed to initialize API configuration:', error);\n }\n }\n // const { isLoading } = useAppTranslations();\n // if (isLoading) {\n // return <Loader />;\n // }\n // Create or use provided Redux store\n const store = React.useMemo(() => {\n if (!useRedux) return null;\n\n if (reduxStore) {\n return reduxStore;\n }\n\n return createLibraryStore(additionalReducers, apiClient);\n }, [useRedux, reduxStore, additionalReducers, apiClient]);\n\n // Create theme\n const theme = React.useMemo(() => {\n if (customTheme) {\n return customTheme;\n }\n\n const themeCreator = themeMode === 'dark' ? createDarkTheme : createLightTheme;\n const { theme: generatedTheme } = themeCreator(primaryColor, direction);\n return generatedTheme;\n }, [customTheme, themeMode, primaryColor, direction]);\n\n // Context value\n const contextValue: ERPUIContextValue = {\n useRedux,\n apiClient,\n theme,\n themeMode,\n direction,\n primaryColor,\n };\n\n // Build provider tree from inside out\n let content = (\n <ERPUIContext.Provider value={contextValue}>\n {/* <ThemeProvider theme={theme}>\n {enableCssBaseline && <CssBaseline />} */}\n {/* <Suspense fallback={<Loader />}> */}\n <MUIThemeWrapper theme={theme} enableCssBaseline={enableCssBaseline}>\n {children}\n </MUIThemeWrapper>\n {/* </Suspense> */}\n {/* </ThemeProvider> */}\n </ERPUIContext.Provider>\n );\n\n // Wrap with snackbar provider if enabled\n if (enableSnackbar) {\n content = (\n <SnackbarProvider {...snackbarConfig}>\n <SnackbarRefTracker />\n {content}\n </SnackbarProvider>\n );\n }\n\n // Wrap with page provider if enabled\n // if (enablePages) {\n // content = (\n // <PageProvider routeToColumnsMap={routeToColumnsMap} routeToResourceMap={routeToResourceMap}>\n // {content}\n // </PageProvider>\n // );\n // }\n\n // Wrap with permissions provider if enabled\n if (enablePermissions) {\n content = (\n <PermissionsProvider>\n {content}\n </PermissionsProvider>\n );\n }\n\n // Wrap with language provider if enabled\n if (enableLanguage) {\n content = (\n <LanguageProvider>\n {content}\n </LanguageProvider>\n );\n }\n\n // Wrap with auth provider if enabled\n if (enableAuth) {\n content = (\n <AuthProvider publicRoutes={publicRoutes}>\n {content}\n </AuthProvider>\n );\n }\n\n // Wrap with router if enabled\n if (enableRouter) {\n content = (\n <BrowserRouter>\n {content}\n </BrowserRouter>\n );\n }\n\n // Wrap with Redux provider if enabled\n if (useRedux && store) {\n content = (\n <ReduxProvider store={store}>\n {content}\n </ReduxProvider>\n );\n }\n\n return content;\n};\n\nexport default ERPUIProvider;"],"names":["_a","React","jsx","jsxs","ReduxProvider"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { bh as postV1Parties, aS as getV1WarehouseLocation, K as getV1Currency, a2 as getV1InventoryItems } from "./api-BF3CyrPB.esm.js";
2
- import { aw as getToken } from "./common-Nn4SUfK7.esm.js";
2
+ import { aw as getToken } from "./common-D59u5rE6.esm.js";
3
3
  import { createAsyncThunk } from "@reduxjs/toolkit";
4
4
  import _ from "lodash";
5
5
  const createParties = createAsyncThunk(
@@ -76,4 +76,4 @@ export {
76
76
  getOptions as d,
77
77
  getCurrency as g
78
78
  };
79
- //# sourceMappingURL=actionCreator-C8cLIOap.esm.js.map
79
+ //# sourceMappingURL=actionCreator-BzPZv2rR.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"actionCreator-C8cLIOap.esm.js","sources":["../../src/redux/actionCreator.ts"],"sourcesContent":["import { getV1Currency, postV1Parties } from \"@/api-client/api.accounting/api\";\nimport { getV1InventoryItems, getV1WarehouseLocation } from \"@/api-client/api.inventory/api\";\nimport { LabelKeyFunction } from \"@/types\";\nimport { getToken } from \"@/utils\";\nimport { createAsyncThunk } from \"@reduxjs/toolkit\";\nimport _ from \"lodash\";\n\n// Stub implementation for Redux actions - consuming applications should provide their own implementation\nexport const createParties = createAsyncThunk(\n \"parties/create\",\n async (payload: any) => {\n const response = await postV1Parties({\n ...payload,\n ...getToken(),\n });\n return response;\n }\n);\nexport const getOptions = async (\n apiFunc: any,\n filters: any,\n dataKey: string,\n labelKey: string | LabelKeyFunction,\n valueKey?: any\n) => {\n const response = await apiFunc({\n ...filters,\n ...getToken(),\n });\n\n const options: any[] =\n response?.data?.[dataKey]?.map((d) => ({\n ...d,\n label: labelKey instanceof Function ? labelKey(d) : _.get(d, labelKey),\n value: valueKey ? _.get(d, valueKey, d.id) : d.id,\n })) || [];\n return options;\n};\n\nexport const getLocation = createAsyncThunk(\n \"location/fetch\",\n async (filter: any) => {\n const locationFilter = {\n ...filter,\n };\n const response = await getOptions(\n getV1WarehouseLocation,\n locationFilter,\n \"warehouseLocationList\",\n \"name\"\n );\n return response;\n }\n);\n\nexport const getItems = createAsyncThunk(\"item/fetch\", async (filter: any) => {\n const itemFilter = {\n ...filter,\n order: \"name:1\",\n // select:\"[id,name,type,unit_of_measurement,default_tax_id,vendor_informatio]\"\n };\n const response = await getOptions(\n getV1InventoryItems,\n itemFilter,\n \"inventoryItemsList\",\n \"name\"\n );\n return response;\n});\n\nexport const getCurrency = createAsyncThunk(\n \"currency/fetch\",\n async (filter: any) => {\n const currencyFiter = {\n ...filter,\n };\n const response = await getOptions(\n getV1Currency,\n currencyFiter,\n \"currencies\",\n \"currency_name\"\n );\n return response;\n }\n);"],"names":[],"mappings":";;;;AAQO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA,OAAO,YAAiB;AACtB,UAAM,WAAW,MAAM,cAAc;AAAA,MACnC,GAAG;AAAA,MACH,GAAG,SAAA;AAAA,IAAS,CACb;AACD,WAAO;AAAA,EACT;AACF;AACO,MAAM,aAAa,OACxB,SACA,SACA,SACA,UACA,aACG;;AACH,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG,SAAA;AAAA,EAAS,CACb;AAED,QAAM,YACJ,gDAAU,SAAV,mBAAiB,aAAjB,mBAA2B,IAAI,CAAC,OAAO;AAAA,IACrC,GAAG;AAAA,IACH,OAAO,oBAAoB,WAAW,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ;AAAA,IACrE,OAAO,WAAW,EAAE,IAAI,GAAG,UAAU,EAAE,EAAE,IAAI,EAAE;AAAA,EAAA,QAC1C,CAAA;AACT,SAAO;AACT;AAEO,MAAM,cAAc;AAAA,EACzB;AAAA,EACA,OAAO,WAAgB;AACrB,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,IAAA;AAEL,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACF;AAEO,MAAM,WAAW,iBAAiB,cAAc,OAAO,WAAgB;AAC5E,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,OAAO;AAAA;AAAA,EAAA;AAGT,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,SAAO;AACT,CAAC;AAEM,MAAM,cAAc;AAAA,EACzB;AAAA,EACA,OAAO,WAAgB;AACrB,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,IAAA;AAEL,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACF;"}
1
+ {"version":3,"file":"actionCreator-BzPZv2rR.esm.js","sources":["../../src/redux/actionCreator.ts"],"sourcesContent":["import { getV1Currency, postV1Parties } from \"@/api-client/api.accounting/api\";\nimport { getV1InventoryItems, getV1WarehouseLocation } from \"@/api-client/api.inventory/api\";\nimport { LabelKeyFunction } from \"@/types\";\nimport { getToken } from \"@/utils\";\nimport { createAsyncThunk } from \"@reduxjs/toolkit\";\nimport _ from \"lodash\";\n\n// Stub implementation for Redux actions - consuming applications should provide their own implementation\nexport const createParties = createAsyncThunk(\n \"parties/create\",\n async (payload: any) => {\n const response = await postV1Parties({\n ...payload,\n ...getToken(),\n });\n return response;\n }\n);\nexport const getOptions = async (\n apiFunc: any,\n filters: any,\n dataKey: string,\n labelKey: string | LabelKeyFunction,\n valueKey?: any\n) => {\n const response = await apiFunc({\n ...filters,\n ...getToken(),\n });\n\n const options: any[] =\n response?.data?.[dataKey]?.map((d) => ({\n ...d,\n label: labelKey instanceof Function ? labelKey(d) : _.get(d, labelKey),\n value: valueKey ? _.get(d, valueKey, d.id) : d.id,\n })) || [];\n return options;\n};\n\nexport const getLocation = createAsyncThunk(\n \"location/fetch\",\n async (filter: any) => {\n const locationFilter = {\n ...filter,\n };\n const response = await getOptions(\n getV1WarehouseLocation,\n locationFilter,\n \"warehouseLocationList\",\n \"name\"\n );\n return response;\n }\n);\n\nexport const getItems = createAsyncThunk(\"item/fetch\", async (filter: any) => {\n const itemFilter = {\n ...filter,\n order: \"name:1\",\n // select:\"[id,name,type,unit_of_measurement,default_tax_id,vendor_informatio]\"\n };\n const response = await getOptions(\n getV1InventoryItems,\n itemFilter,\n \"inventoryItemsList\",\n \"name\"\n );\n return response;\n});\n\nexport const getCurrency = createAsyncThunk(\n \"currency/fetch\",\n async (filter: any) => {\n const currencyFiter = {\n ...filter,\n };\n const response = await getOptions(\n getV1Currency,\n currencyFiter,\n \"currencies\",\n \"currency_name\"\n );\n return response;\n }\n);"],"names":[],"mappings":";;;;AAQO,MAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA,OAAO,YAAiB;AACtB,UAAM,WAAW,MAAM,cAAc;AAAA,MACnC,GAAG;AAAA,MACH,GAAG,SAAA;AAAA,IAAS,CACb;AACD,WAAO;AAAA,EACT;AACF;AACO,MAAM,aAAa,OACxB,SACA,SACA,SACA,UACA,aACG;;AACH,QAAM,WAAW,MAAM,QAAQ;AAAA,IAC7B,GAAG;AAAA,IACH,GAAG,SAAA;AAAA,EAAS,CACb;AAED,QAAM,YACJ,gDAAU,SAAV,mBAAiB,aAAjB,mBAA2B,IAAI,CAAC,OAAO;AAAA,IACrC,GAAG;AAAA,IACH,OAAO,oBAAoB,WAAW,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ;AAAA,IACrE,OAAO,WAAW,EAAE,IAAI,GAAG,UAAU,EAAE,EAAE,IAAI,EAAE;AAAA,EAAA,QAC1C,CAAA;AACT,SAAO;AACT;AAEO,MAAM,cAAc;AAAA,EACzB;AAAA,EACA,OAAO,WAAgB;AACrB,UAAM,iBAAiB;AAAA,MACrB,GAAG;AAAA,IAAA;AAEL,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACF;AAEO,MAAM,WAAW,iBAAiB,cAAc,OAAO,WAAgB;AAC5E,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,OAAO;AAAA;AAAA,EAAA;AAGT,QAAM,WAAW,MAAM;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEF,SAAO;AACT,CAAC;AAEM,MAAM,cAAc;AAAA,EACzB;AAAA,EACA,OAAO,WAAgB;AACrB,UAAM,gBAAgB;AAAA,MACpB,GAAG;AAAA,IAAA;AAEL,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEF,WAAO;AAAA,EACT;AACF;"}
@@ -28927,6 +28927,7 @@ function CustomerVendorModal({
28927
28927
  const [contactRows, setContactRows] = React$1.useState([]);
28928
28928
  const [isCreating, setIsCreating] = React$1.useState(false);
28929
28929
  const [selectedCompanyData, setSelectedCompanyData] = React$1.useState([]);
28930
+ const lastCheckedValues = React$1.useRef({});
28930
28931
  const {
28931
28932
  control,
28932
28933
  formState: { errors },
@@ -28937,7 +28938,8 @@ function CustomerVendorModal({
28937
28938
  resetField,
28938
28939
  reset,
28939
28940
  watch,
28940
- getFieldState
28941
+ getFieldState,
28942
+ setError
28941
28943
  } = reactHookForm.useForm({
28942
28944
  defaultValues: {
28943
28945
  status: true,
@@ -28975,6 +28977,39 @@ function CustomerVendorModal({
28975
28977
  control,
28976
28978
  name: `${PARTIES_FORM_ARRAY_NAME}.${PARTIES_FIELDS.EMAIL_IDS}`
28977
28979
  });
28980
+ const checkUniqueness = React$1.useCallback(async () => {
28981
+ const values = getValues();
28982
+ const formValues = values == null ? void 0 : values[PARTIES_FORM_ARRAY_NAME];
28983
+ const fieldsToCheck = ["crn", "email_ids", "company_name"];
28984
+ const allFields = ["crn", "email_ids", "contact_no", "company_name"];
28985
+ const nothingChanged = fieldsToCheck.every(
28986
+ (field) => lastCheckedValues.current[field] === (formValues == null ? void 0 : formValues[field])
28987
+ );
28988
+ if (nothingChanged) return true;
28989
+ const payload = {};
28990
+ allFields.forEach((field) => payload[field] = formValues == null ? void 0 : formValues[field]);
28991
+ const response = await common.checkUniqueFields(payload);
28992
+ let isUnique = true;
28993
+ for (const [field, exists] of Object.entries(response)) {
28994
+ if (exists) {
28995
+ setError(`${PARTIES_FORM_ARRAY_NAME}.${field}`, {
28996
+ type: "manual",
28997
+ message: `${field.replace(/_/g, " ").toLowerCase()} already exists`
28998
+ });
28999
+ isUnique = false;
29000
+ }
29001
+ }
29002
+ lastCheckedValues.current = { ...formValues };
29003
+ return isUnique;
29004
+ }, [getValues, setError]);
29005
+ const handleFieldBlur = React$1.useCallback(
29006
+ async (fieldName) => {
29007
+ const uniquenessFields = ["crn", "email_ids", "company_name"];
29008
+ if (!uniquenessFields.includes(fieldName)) return;
29009
+ await checkUniqueness();
29010
+ },
29011
+ [checkUniqueness]
29012
+ );
28978
29013
  const tableColumns = React$1.useCallback(
28979
29014
  (columns, tableRows) => {
28980
29015
  const phoneNumberCache = /* @__PURE__ */ new Map();
@@ -29181,6 +29216,8 @@ ${val}`;
29181
29216
  var _a, _b, _c, _d;
29182
29217
  const isValid = await trigger();
29183
29218
  if (!isValid) return;
29219
+ const isUnique = await checkUniqueness();
29220
+ if (!isUnique) return;
29184
29221
  const values = getValues();
29185
29222
  const formValues = values == null ? void 0 : values[PARTIES_FORM_ARRAY_NAME];
29186
29223
  let emailArray = [];
@@ -29375,7 +29412,8 @@ ${val}`;
29375
29412
  placeholder: t("common.party.fields.company_name_placeholder"),
29376
29413
  fieldArrayName: PARTIES_FORM_ARRAY_NAME,
29377
29414
  formControl: control,
29378
- required: true
29415
+ required: true,
29416
+ onBlur: () => handleFieldBlur(PARTIES_FIELDS.COMPANY_NAME)
29379
29417
  }
29380
29418
  ) }),
29381
29419
  /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(material.Grid, { item: true, xs: 12, sm: 6, children: /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
@@ -29397,7 +29435,8 @@ ${val}`;
29397
29435
  placeholder: t("common.party.fields.crn_placeholder"),
29398
29436
  fieldArrayName: PARTIES_FORM_ARRAY_NAME,
29399
29437
  formControl: control,
29400
- max: 10
29438
+ max: 10,
29439
+ onBlur: () => handleFieldBlur(PARTIES_FIELDS.CRN)
29401
29440
  }
29402
29441
  ) })
29403
29442
  ] }),
@@ -29421,7 +29460,8 @@ ${val}`;
29421
29460
  placeholder: t("common.party.fields.email_placeholder"),
29422
29461
  fieldArrayName: PARTIES_FORM_ARRAY_NAME,
29423
29462
  formControl: control,
29424
- required: true
29463
+ required: true,
29464
+ onBlur: () => handleFieldBlur(PARTIES_FIELDS.EMAIL_IDS)
29425
29465
  }
29426
29466
  ) }),
29427
29467
  /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(material.Grid, { item: true, xs: 12, sm: 6, children: /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
@@ -41372,6 +41412,129 @@ const ModuleTile = (props) => {
41372
41412
  /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(useAuth.Typography, { type: "s3", className: "module-label", children: props.module.label })
41373
41413
  ] }) });
41374
41414
  };
41415
+ const ProtectedRoute = ({
41416
+ module: module2,
41417
+ action,
41418
+ multiModule,
41419
+ complexPermissions,
41420
+ customPermissionCheck,
41421
+ redirectTo = "/403",
41422
+ showError = true,
41423
+ children
41424
+ }) => {
41425
+ const permissions = useAccountSetting.usePermissions();
41426
+ const hasPermission = React$1.useMemo(() => {
41427
+ if (!permissions) {
41428
+ return false;
41429
+ }
41430
+ if (customPermissionCheck) {
41431
+ return customPermissionCheck(permissions);
41432
+ }
41433
+ if (complexPermissions) {
41434
+ const { permissions: permList, operator = "AND" } = complexPermissions;
41435
+ const results = permList.map(({ module: mod, action: act }) => {
41436
+ const modulePerms = _.get(permissions, mod, {});
41437
+ return modulePerms[act] ?? false;
41438
+ });
41439
+ return operator === "AND" ? results.every(Boolean) : results.some(Boolean);
41440
+ }
41441
+ if (multiModule) {
41442
+ const { modules: modules2, action: act, operator = "OR" } = multiModule;
41443
+ const results = modules2.map((mod) => {
41444
+ const modulePerms = _.get(permissions, mod, {});
41445
+ return modulePerms[act] ?? false;
41446
+ });
41447
+ return operator === "AND" ? results.every(Boolean) : results.some(Boolean);
41448
+ }
41449
+ if (module2 && action) {
41450
+ const modulePerms = _.get(permissions, module2, {});
41451
+ return modulePerms[action] ?? false;
41452
+ }
41453
+ return false;
41454
+ }, [permissions, module2, action, multiModule, complexPermissions, customPermissionCheck]);
41455
+ const ErrorComponent = () => /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsxs(
41456
+ material.Box,
41457
+ {
41458
+ sx: {
41459
+ display: "flex",
41460
+ flexDirection: "column",
41461
+ justifyContent: "center",
41462
+ alignItems: "center",
41463
+ position: "absolute",
41464
+ top: "50%",
41465
+ left: "50%",
41466
+ transform: "translate(-50%, -50%)",
41467
+ // Fixed transform values
41468
+ gap: 2,
41469
+ textAlign: "center",
41470
+ p: 3
41471
+ },
41472
+ children: [
41473
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
41474
+ useAuth.Typography,
41475
+ {
41476
+ type: "h1",
41477
+ color: "theme.secondary.900",
41478
+ weight: "bold",
41479
+ sx: { fontSize: { xs: "4rem", sm: "6rem" } },
41480
+ children: "403"
41481
+ }
41482
+ ),
41483
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
41484
+ material.Divider,
41485
+ {
41486
+ flexItem: true
41487
+ }
41488
+ ),
41489
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
41490
+ useAuth.Typography,
41491
+ {
41492
+ type: "s3",
41493
+ color: "theme.secondary.900",
41494
+ weight: "medium",
41495
+ children: "Access Denied"
41496
+ }
41497
+ ),
41498
+ /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(
41499
+ useAuth.Typography,
41500
+ {
41501
+ type: "body2",
41502
+ color: "theme.secondary.700",
41503
+ weight: "regular",
41504
+ sx: { mt: 1, maxWidth: "300px" },
41505
+ children: "You don't have the required permissions to access this resource."
41506
+ }
41507
+ )
41508
+ ]
41509
+ }
41510
+ );
41511
+ if (!permissions || Object.keys(permissions).length === 0) {
41512
+ return null;
41513
+ }
41514
+ if (hasPermission) {
41515
+ return /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(jsxRuntime.jsxRuntimeExports.Fragment, { children });
41516
+ }
41517
+ return showError ? /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(ErrorComponent, {}) : /* @__PURE__ */ jsxRuntime.jsxRuntimeExports.jsx(reactRouterDom.Navigate, { to: redirectTo, replace: true });
41518
+ };
41519
+ const createPermissionConfig = {
41520
+ // Single module
41521
+ single: (module2, action) => ({
41522
+ module: module2,
41523
+ action
41524
+ }),
41525
+ // Multiple modules with same action
41526
+ multiModule: (modules2, action, operator = "OR") => ({
41527
+ multiModule: { modules: modules2, action, operator }
41528
+ }),
41529
+ // Complex permissions
41530
+ complex: (permissions, operator = "AND") => ({
41531
+ complexPermissions: { permissions, operator }
41532
+ }),
41533
+ // Custom function
41534
+ custom: (checkFn) => ({
41535
+ customPermissionCheck: checkFn
41536
+ })
41537
+ };
41375
41538
  const Android12Switch = material.styled(material.Switch)(({ theme }) => ({
41376
41539
  padding: 8,
41377
41540
  "& .MuiSwitch-track": {
@@ -41468,6 +41631,7 @@ exports.PageAction = PageAction;
41468
41631
  exports.PageNavigator = PageNavigator;
41469
41632
  exports.Pagination = Pagination;
41470
41633
  exports.PhoneInput = PhoneInput;
41634
+ exports.ProtectedRoute = ProtectedRoute;
41471
41635
  exports.Radio = Radio;
41472
41636
  exports.RemoveAction = RemoveAction;
41473
41637
  exports.RemoveGroupAction = RemoveGroupAction;
@@ -41493,7 +41657,8 @@ exports.UploadMedia = UploadMedia;
41493
41657
  exports.ValueEditor = ValueEditor;
41494
41658
  exports.ViewModal = ViewModal;
41495
41659
  exports.createApiThunk = createApiThunk;
41660
+ exports.createPermissionConfig = createPermissionConfig;
41496
41661
  exports.dynamicSelectAdd = dynamicSelectAdd;
41497
41662
  exports.useThemeProps = useThemeProps;
41498
41663
  exports.userRoles = userRoles;
41499
- //# sourceMappingURL=android-12-switch-DM9s0XTb.js.map
41664
+ //# sourceMappingURL=android-12-switch-BILQvv4G.js.map