@erpsquad/common 1.10.24 → 1.10.25
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/{apiHelper-YfmCaxm2.js → ERPUIProvider-CrB9KZsT.js} +61 -48
- package/dist/chunks/ERPUIProvider-CrB9KZsT.js.map +1 -0
- package/dist/chunks/{apiHelper-5ZV2nDef.esm.js → ERPUIProvider-D4NsKF7q.esm.js} +62 -49
- package/dist/chunks/ERPUIProvider-D4NsKF7q.esm.js.map +1 -0
- package/dist/chunks/{actionCreator-voIBps7Q.esm.js → actionCreator-BAILdRTa.esm.js} +2 -2
- package/dist/chunks/{actionCreator-voIBps7Q.esm.js.map → actionCreator-BAILdRTa.esm.js.map} +1 -1
- package/dist/chunks/{actionCreator-P8dFlHV6.js → actionCreator-CQvKspmp.js} +2 -2
- package/dist/chunks/{actionCreator-P8dFlHV6.js.map → actionCreator-CQvKspmp.js.map} +1 -1
- package/dist/chunks/{android-12-switch-CKgLjgON.esm.js → android-12-switch-B1V8Mdoy.esm.js} +10 -10
- package/dist/chunks/{android-12-switch-CKgLjgON.esm.js.map → android-12-switch-B1V8Mdoy.esm.js.map} +1 -1
- package/dist/chunks/{android-12-switch-skUWjY_v.js → android-12-switch-iAmzX2gj.js} +10 -10
- package/dist/chunks/{android-12-switch-skUWjY_v.js.map → android-12-switch-iAmzX2gj.js.map} +1 -1
- package/dist/chunks/{appbar-Cn0j_jYL.js → appbar-D6v-YliE.js} +4 -4
- package/dist/chunks/{appbar-Cn0j_jYL.js.map → appbar-D6v-YliE.js.map} +1 -1
- package/dist/chunks/{appbar-BJnWfKbV.esm.js → appbar-fEKefSEI.esm.js} +4 -4
- package/dist/chunks/{appbar-BJnWfKbV.esm.js.map → appbar-fEKefSEI.esm.js.map} +1 -1
- package/dist/chunks/{common-DMEKZWbV.esm.js → common-CnMuPSgy.esm.js} +2 -1
- package/dist/chunks/{common-DMEKZWbV.esm.js.map → common-CnMuPSgy.esm.js.map} +1 -1
- package/dist/chunks/{common-B2dL8ZW6.js → common-DiZBInYB.js} +2 -1
- package/dist/chunks/{common-B2dL8ZW6.js.map → common-DiZBInYB.js.map} +1 -1
- package/dist/chunks/{custom-editor-D0rhYTTV.js → custom-editor-BrhoUYdE.js} +2 -2
- package/dist/chunks/{custom-editor-D0rhYTTV.js.map → custom-editor-BrhoUYdE.js.map} +1 -1
- package/dist/chunks/{custom-editor-BcVZsuni.esm.js → custom-editor-CDesXJOD.esm.js} +2 -2
- package/dist/chunks/{custom-editor-BcVZsuni.esm.js.map → custom-editor-CDesXJOD.esm.js.map} +1 -1
- package/dist/chunks/{default-data-Bkg9tRHr.js → default-data-BT7rMux6.js} +12 -12
- package/dist/chunks/{default-data-Bkg9tRHr.js.map → default-data-BT7rMux6.js.map} +1 -1
- package/dist/chunks/{default-data-DRkQfhCi.esm.js → default-data-oRrC02zr.esm.js} +12 -12
- package/dist/chunks/{default-data-DRkQfhCi.esm.js.map → default-data-oRrC02zr.esm.js.map} +1 -1
- package/dist/chunks/{form-builder-conversion-CLVSz4Zu.js → form-builder-conversion-5H7D0hVp.js} +2 -2
- package/dist/chunks/{form-builder-conversion-CLVSz4Zu.js.map → form-builder-conversion-5H7D0hVp.js.map} +1 -1
- package/dist/chunks/{form-builder-conversion-DPgJqCQ_.esm.js → form-builder-conversion-BwDuDJ-X.esm.js} +2 -2
- package/dist/chunks/{form-builder-conversion-DPgJqCQ_.esm.js.map → form-builder-conversion-BwDuDJ-X.esm.js.map} +1 -1
- package/dist/chunks/{form-builder-deconversion-DUT3hEGI.esm.js → form-builder-deconversion-B-2fkPNG.esm.js} +3 -3
- package/dist/chunks/{form-builder-deconversion-DUT3hEGI.esm.js.map → form-builder-deconversion-B-2fkPNG.esm.js.map} +1 -1
- package/dist/chunks/{form-builder-deconversion-DM9J4Yl8.js → form-builder-deconversion-CBwoLSBg.js} +3 -3
- package/dist/chunks/{form-builder-deconversion-DM9J4Yl8.js.map → form-builder-deconversion-CBwoLSBg.js.map} +1 -1
- package/dist/chunks/{fullScreen-DfFeN4Jw.esm.js → fullScreen-B7t6N37V.esm.js} +2 -2
- package/dist/chunks/{fullScreen-DfFeN4Jw.esm.js.map → fullScreen-B7t6N37V.esm.js.map} +1 -1
- package/dist/chunks/{fullScreen-B6YoHNI0.js → fullScreen-bWxDzWnS.js} +2 -2
- package/dist/chunks/{fullScreen-B6YoHNI0.js.map → fullScreen-bWxDzWnS.js.map} +1 -1
- package/dist/chunks/{languageContext-C0IfVXd6.js → languageContext-Dc-IgAEQ.js} +3 -3
- package/dist/chunks/{languageContext-C0IfVXd6.js.map → languageContext-Dc-IgAEQ.js.map} +1 -1
- package/dist/chunks/{languageContext-CUI59OnI.esm.js → languageContext-EvruPI4i.esm.js} +3 -3
- package/dist/chunks/{languageContext-CUI59OnI.esm.js.map → languageContext-EvruPI4i.esm.js.map} +1 -1
- package/dist/chunks/{migration-utils-D-9-VA86.esm.js → migration-utils-CEY5cPxm.esm.js} +61 -44
- package/dist/chunks/migration-utils-CEY5cPxm.esm.js.map +1 -0
- package/dist/chunks/{migration-utils-Bxds-psK.js → migration-utils-nmxjTyJE.js} +61 -44
- package/dist/chunks/migration-utils-nmxjTyJE.js.map +1 -0
- package/dist/chunks/{page-context-BG7UpJiv.esm.js → page-context-Cfc_2QVL.esm.js} +4 -4
- package/dist/chunks/page-context-Cfc_2QVL.esm.js.map +1 -0
- package/dist/chunks/{page-context-B-0cNWoa.js → page-context-DaqBerFa.js} +4 -4
- package/dist/chunks/page-context-DaqBerFa.js.map +1 -0
- package/dist/chunks/{reducer-Cuwiryn_.js → reducer-7GjSCUVb.js} +2 -2
- package/dist/chunks/{reducer-Cuwiryn_.js.map → reducer-7GjSCUVb.js.map} +1 -1
- package/dist/chunks/{reducer-D_JPGt1Y.esm.js → reducer-CZRNLb87.esm.js} +2 -2
- package/dist/chunks/{reducer-D_JPGt1Y.esm.js.map → reducer-CZRNLb87.esm.js.map} +1 -1
- package/dist/chunks/{shareSlice-DI6_UPCh.js → shareSlice-Cvu_KDva.js} +2 -2
- package/dist/chunks/{shareSlice-DI6_UPCh.js.map → shareSlice-Cvu_KDva.js.map} +1 -1
- package/dist/chunks/{shareSlice-DMrBQKgP.esm.js → shareSlice-euR_TjzN.esm.js} +2 -2
- package/dist/chunks/{shareSlice-DMrBQKgP.esm.js.map → shareSlice-euR_TjzN.esm.js.map} +1 -1
- package/dist/chunks/{sidebar-DoFAl7ou.js → sidebar-By5UAoF9.js} +4 -4
- package/dist/chunks/{sidebar-DoFAl7ou.js.map → sidebar-By5UAoF9.js.map} +1 -1
- package/dist/chunks/{sidebar-djdFYyr7.esm.js → sidebar-D1m9wO0D.esm.js} +4 -4
- package/dist/chunks/{sidebar-djdFYyr7.esm.js.map → sidebar-D1m9wO0D.esm.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-C1rbIa2b.js → sidebarScreen-Cjomg91b.js} +5 -5
- package/dist/chunks/{sidebarScreen-C1rbIa2b.js.map → sidebarScreen-Cjomg91b.js.map} +1 -1
- package/dist/chunks/{sidebarScreen-CfN-ptZ_.esm.js → sidebarScreen-Cl_ofemY.esm.js} +5 -5
- package/dist/chunks/{sidebarScreen-CfN-ptZ_.esm.js.map → sidebarScreen-Cl_ofemY.esm.js.map} +1 -1
- package/dist/chunks/{store-BhiVVV8I.js → store-CzlB6v7r.js} +3 -3
- package/dist/chunks/{store-BhiVVV8I.js.map → store-CzlB6v7r.js.map} +1 -1
- package/dist/chunks/{store-Br89XceL.esm.js → store-DP59wikr.esm.js} +3 -3
- package/dist/chunks/{store-Br89XceL.esm.js.map → store-DP59wikr.esm.js.map} +1 -1
- package/dist/chunks/{translations-DVyOW8jq.js → translations-CJg8TTyD.js} +2 -2
- package/dist/chunks/{translations-DVyOW8jq.js.map → translations-CJg8TTyD.js.map} +1 -1
- package/dist/chunks/{translations-DdmKMXfq.esm.js → translations-Ce-dESd2.esm.js} +2 -2
- package/dist/chunks/{translations-DdmKMXfq.esm.js.map → translations-Ce-dESd2.esm.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-DX8jbxE5.js → uom-field-wrapper-BxTvhAet.js} +21 -19
- package/dist/chunks/{uom-field-wrapper-DX8jbxE5.js.map → uom-field-wrapper-BxTvhAet.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-CIlNmr8q.esm.js → uom-field-wrapper-D-qbttkm.esm.js} +16 -14
- package/dist/chunks/{uom-field-wrapper-CIlNmr8q.esm.js.map → uom-field-wrapper-D-qbttkm.esm.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-jzXMXidb.js → useAccountSetting-C8elrC5R.js} +3 -3
- package/dist/chunks/{useAccountSetting-jzXMXidb.js.map → useAccountSetting-C8elrC5R.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-ChvhLNww.esm.js → useAccountSetting-lLzhLq50.esm.js} +3 -3
- package/dist/chunks/{useAccountSetting-ChvhLNww.esm.js.map → useAccountSetting-lLzhLq50.esm.js.map} +1 -1
- package/dist/chunks/{useAuth-Bgbk1EVk.esm.js → useAuth-BLMBjfAV.esm.js} +2 -2
- package/dist/chunks/{useAuth-Bgbk1EVk.esm.js.map → useAuth-BLMBjfAV.esm.js.map} +1 -1
- package/dist/chunks/{useAuth-ChQOSfij.js → useAuth-DkZpOvrQ.js} +2 -2
- package/dist/chunks/{useAuth-ChQOSfij.js.map → useAuth-DkZpOvrQ.js.map} +1 -1
- package/dist/chunks/{useLangauge-C4uJpw2D.js → useLangauge-BIXFbbDo.js} +2 -2
- package/dist/chunks/{useLangauge-C4uJpw2D.js.map → useLangauge-BIXFbbDo.js.map} +1 -1
- package/dist/chunks/{useLangauge-BYAnFSUW.esm.js → useLangauge-BtIw2mfN.esm.js} +2 -2
- package/dist/chunks/{useLangauge-BYAnFSUW.esm.js.map → useLangauge-BtIw2mfN.esm.js.map} +1 -1
- package/dist/chunks/{useReduxIntegration-BwvsiyBq.js → useReduxIntegration-BaZ9dXj6.js} +5 -5
- package/dist/chunks/{useReduxIntegration-BwvsiyBq.js.map → useReduxIntegration-BaZ9dXj6.js.map} +1 -1
- package/dist/chunks/{useReduxIntegration-DvxRtJuE.esm.js → useReduxIntegration-DUiiK2sU.esm.js} +4 -4
- package/dist/chunks/{useReduxIntegration-DvxRtJuE.esm.js.map → useReduxIntegration-DUiiK2sU.esm.js.map} +1 -1
- package/dist/components/index.esm.js +9 -9
- package/dist/components/index.js +11 -11
- package/dist/contexts/index.esm.js +3 -3
- package/dist/contexts/index.js +3 -3
- package/dist/contexts/permission-context.d.ts +1 -1
- package/dist/hooks/apiHelper.d.ts +1 -0
- package/dist/hooks/index.esm.js +6 -5
- package/dist/hooks/index.js +9 -8
- package/dist/hooks/index.js.map +1 -1
- package/dist/index.esm.js +35 -34
- package/dist/index.js +30 -29
- package/dist/index.js.map +1 -1
- package/dist/layout/index.esm.js +2 -2
- package/dist/layout/index.js +2 -2
- package/dist/redux/index.esm.js +4 -4
- package/dist/redux/index.js +4 -4
- package/dist/src/contexts/permission-context.d.ts +1 -1
- package/dist/src/hooks/apiHelper.d.ts +1 -0
- package/dist/src/utils/api.d.ts +3 -0
- package/dist/utils/api.d.ts +3 -0
- package/dist/utils/index.esm.js +7 -7
- package/dist/utils/index.js +6 -6
- package/dist/views/index.esm.js +8 -8
- package/dist/views/index.js +7 -7
- package/package.json +1 -1
- package/dist/chunks/apiHelper-5ZV2nDef.esm.js.map +0 -1
- package/dist/chunks/apiHelper-YfmCaxm2.js.map +0 -1
- package/dist/chunks/migration-utils-Bxds-psK.js.map +0 -1
- package/dist/chunks/migration-utils-D-9-VA86.esm.js.map +0 -1
- package/dist/chunks/page-context-B-0cNWoa.js.map +0 -1
- package/dist/chunks/page-context-BG7UpJiv.esm.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"migration-utils-D-9-VA86.esm.js","sources":["../../src/utils/i18n.ts","../../src/utils/country.ts","../../src/utils/dateValidation.tsx","../../src/utils/fileSize.ts","../../src/utils/menu-filter.ts","../../node_modules/react-side-effect/lib/index.js","../../node_modules/react-fast-compare/index.js","../../node_modules/react-helmet/es/Helmet.js","../../src/utils/metaComponent.tsx","../../src/utils/migration-utils.ts"],"sourcesContent":["import i18n from \"i18next\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport i18nBackend from \"i18next-http-backend\";\r\n\r\nimport { resource } from \"../constants/resource-lang\";\r\nimport { DEFAULT_LANG } from \"../constants/all-language\";\r\n\r\ni18n\r\n .use(i18nBackend)\r\n .use(initReactI18next)\r\n .init({\r\n fallbackLng: \"en\", \r\n lng: DEFAULT_LANG,\r\n \r\n // fallbackLng: {\r\n // 'ar': ['en'], \r\n // 'es': ['en'], \r\n // 'default': ['en']\r\n // },\r\n \r\n fallbackNS: false, // Don't fallback to other namespaces\r\n \r\n \r\n returnNull: false,\r\n returnEmptyString: false,\r\n\r\n interpolation: {\r\n escapeValue: false,\r\n },\r\n debug: false, // Make sure this is false\r\n saveMissing: false,\r\n missingKeyHandler: false, // Explicitly disable\r\n missingKeyNoValueFallbackToKey: true,\r\n\r\n \r\n \r\n // resources: resource,\r\n resources: {},\r\n\r\n // debug: process.env.NODE_ENV === 'development',\r\n\r\n saveMissingTo: 'fallback',\r\n \r\n keySeparator: '.',\r\n nsSeparator: ':',\r\n });\r\n\r\nexport default i18n;","export const getCountry = (code: string) => {\r\n const regionNames = new Intl.DisplayNames([\"en\"], { type: \"region\" });\r\n return regionNames.of(code);\r\n};\r\n","//eslint-disable @typescript-eslint/no-explicit-any\r\nimport * as Yup from 'yup';\r\nimport dayjs from 'dayjs';\r\n\r\n// Types for configuration\r\nexport interface DateValidationOptions {\r\n allowPast?: boolean;\r\n allowToday?: boolean;\r\n allowFuture?: boolean;\r\n requiredMessage?: string;\r\n pastDateMessage?: string;\r\n futureDateMessage?: string;\r\n todayNotAllowedMessage?: string;\r\n invalidDateMessage?: string;\r\n checkTime?: boolean;\r\n pastTimeMessage?: string;\r\n}\r\n\r\n// Default messages\r\nconst DEFAULT_MESSAGES = {\r\n required: 'Date is required',\r\n invalidDate: 'Date must be a valid date',\r\n pastDate: 'Date cannot be in the past',\r\n futureDate: 'Future dates are not allowed',\r\n todayNotAllowed: \"Today's date is not allowed\",\r\n pastTime: 'Time cannot be in the past for today\\'s date'\r\n};\r\n\r\n/**\r\n * Core date transformation function\r\n * Handles dayjs objects, Date objects, and string dates\r\n */\r\nconst transformDate = (value: any, originalValue: any) => {\r\n if (dayjs.isDayjs(originalValue)) {\r\n return originalValue.toDate();\r\n }\r\n if (originalValue instanceof Date) {\r\n return originalValue;\r\n }\r\n if (typeof originalValue === 'string' && originalValue) {\r\n return dayjs(originalValue).toDate();\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Global date validation function with full customization\r\n * @param options Configuration options for date validation\r\n * @returns Yup validation schema\r\n */\r\nexport const createDateValidation = (options: DateValidationOptions = {}) => {\r\n const {\r\n allowPast = false,\r\n allowToday = true,\r\n allowFuture = true,\r\n requiredMessage = DEFAULT_MESSAGES.required,\r\n pastDateMessage = DEFAULT_MESSAGES.pastDate,\r\n futureDateMessage = DEFAULT_MESSAGES.futureDate,\r\n todayNotAllowedMessage = DEFAULT_MESSAGES.todayNotAllowed,\r\n invalidDateMessage = DEFAULT_MESSAGES.invalidDate,\r\n checkTime = false,\r\n pastTimeMessage = DEFAULT_MESSAGES.pastTime\r\n } = options;\r\n\r\n return Yup.mixed()\r\n .transform(transformDate)\r\n .typeError(invalidDateMessage)\r\n .required(requiredMessage)\r\n .test('date-validation', function(value) {\r\n if (!value) return false;\r\n \r\n const now = dayjs();\r\n const selectedDateTime = dayjs(value);\r\n const today = dayjs().startOf('day');\r\n const selectedDate = dayjs(value).startOf('day');\r\n \r\n // Past date validation\r\n if (selectedDate.isBefore(today) && !allowPast) {\r\n return this.createError({ message: pastDateMessage });\r\n }\r\n \r\n // Today validation\r\n if (selectedDate.isSame(today)) {\r\n if (!allowToday) {\r\n return this.createError({ message: todayNotAllowedMessage });\r\n }\r\n \r\n // Time validation for today\r\n if (checkTime && selectedDateTime.isBefore(now)) {\r\n return this.createError({ message: pastTimeMessage });\r\n }\r\n }\r\n \r\n // Future date validation\r\n if (selectedDate.isAfter(today) && !allowFuture) {\r\n return this.createError({ message: futureDateMessage });\r\n }\r\n \r\n return true;\r\n });\r\n};\r\n\r\n/**\r\n * Quick preset validation functions for common use cases\r\n */\r\n\r\n// 1. Standard date validation (today + future allowed)\r\nexport const dateValidation = (requiredMessage?: string, options: DateValidationOptions = {}) => \r\n createDateValidation({\r\n allowPast: false,\r\n allowToday: true,\r\n allowFuture: true,\r\n ...options,\r\n requiredMessage\r\n });\r\n\r\n// 2. Future dates only (excluding today)\r\nexport const futureDateValidation = (requiredMessage?: string) => \r\n createDateValidation({\r\n allowPast: false,\r\n allowToday: false,\r\n allowFuture: true,\r\n requiredMessage,\r\n pastDateMessage: 'Please select a future date'\r\n });\r\n\r\n// 3. Any date allowed (for historical records)\r\nexport const anyDateValidation = (requiredMessage?: string) => \r\n createDateValidation({\r\n allowPast: true,\r\n allowToday: true,\r\n allowFuture: true,\r\n requiredMessage\r\n });\r\n\r\n// 4. Past dates only (for completed events)\r\nexport const pastDateValidation = (requiredMessage?: string) => \r\n createDateValidation({\r\n allowPast: true,\r\n allowToday: true,\r\n allowFuture: false,\r\n requiredMessage,\r\n futureDateMessage: 'Future dates are not allowed'\r\n });\r\n\r\n// 5. Date with time validation\r\nexport const dateTimeValidation = (requiredMessage?: string) => \r\n createDateValidation({\r\n allowPast: false,\r\n allowToday: true,\r\n allowFuture: true,\r\n checkTime: true,\r\n requiredMessage\r\n });\r\n\r\n// 6. Business days only (Monday to Friday, future dates)\r\nexport const businessDateValidation = (requiredMessage?: string) => {\r\n return createDateValidation({\r\n allowPast: false,\r\n allowToday: true,\r\n allowFuture: true,\r\n requiredMessage\r\n }).test('business-day', 'Please select a business day (Monday to Friday)', function(value) {\r\n if (!value) return false;\r\n \r\n const dayOfWeek = dayjs(value).day();\r\n return dayOfWeek >= 1 && dayOfWeek <= 5; // Monday = 1, Friday = 5\r\n });\r\n};\r\n\r\n// 7. Date range validation (between two dates)\r\nexport const dateRangeValidation = (\r\n minDate: dayjs.Dayjs | Date | string,\r\n maxDate: dayjs.Dayjs | Date | string,\r\n requiredMessage?: string\r\n) => {\r\n return Yup.mixed()\r\n .transform(transformDate)\r\n .typeError(DEFAULT_MESSAGES.invalidDate)\r\n .required(requiredMessage || DEFAULT_MESSAGES.required)\r\n .test('date-range', function(value) {\r\n if (!value) return false;\r\n \r\n const selected = dayjs(value);\r\n const min = dayjs(minDate);\r\n const max = dayjs(maxDate);\r\n \r\n if (selected.isBefore(min)) {\r\n return this.createError({\r\n message: `Date must be after ${min.format('MMM DD, YYYY')}`\r\n });\r\n }\r\n \r\n if (selected.isAfter(max)) {\r\n return this.createError({\r\n message: `Date must be before ${max.format('MMM DD, YYYY')}`\r\n });\r\n }\r\n \r\n return true;\r\n });\r\n};\r\n\r\n/**\r\n * Utility function to create custom validation messages\r\n */\r\nexport const createCustomMessages = (overrides: Partial<typeof DEFAULT_MESSAGES>) => ({\r\n ...DEFAULT_MESSAGES,\r\n ...overrides\r\n});\r\n\r\n/**\r\n * Helper function for conditional date validation\r\n * Example: Date required only if another field has a specific value\r\n */\r\nexport const conditionalDateValidation = (\r\n condition: (formValues: any) => boolean,\r\n validationSchema: any,\r\n) => {\r\n return Yup.mixed().when('$root', {\r\n is: condition,\r\n then: validationSchema,\r\n otherwise: Yup.mixed().notRequired()\r\n });\r\n};\r\n\r\n// Export commonly used validation presets\r\nexport const COMMON_DATE_VALIDATIONS = {\r\n // Rental/Order dates\r\n rental: (msg?: string) => dateValidation(msg || 'Rental date is required'),\r\n\r\n};\r\n\r\n/**\r\n * Usage Examples:\r\n * \r\n * // Basic usage with custom required message\r\n * date: dateValidation('Please select a valid date')\r\n * \r\n * // Full customization\r\n * date: createDateValidation({\r\n * allowPast: false,\r\n * allowToday: true,\r\n * allowFuture: true,\r\n * requiredMessage: 'Date is required',\r\n * pastDateMessage: 'Cannot select past dates'\r\n * })\r\n * \r\n * // Preset validations\r\n * rentalDate: COMMON_DATE_VALIDATIONS.rental('Rental date is required')\r\n * bookingDate: COMMON_DATE_VALIDATIONS.booking()\r\n * \r\n * // Date range\r\n * eventDate: dateRangeValidation(\r\n * dayjs().add(1, 'day'),\r\n * dayjs().add(1, 'year'),\r\n * 'Event date is required'\r\n * )\r\n */","const fileSize = (size: number) => {\r\n let sizeCategory;\r\n const absSize = Math.abs(size);\r\n\r\n switch (true) {\r\n case absSize < 1024:\r\n sizeCategory = `${(size / 1024).toFixed(2)} Byte`;\r\n break;\r\n case absSize >= 1024 && absSize < 1024 * 1024:\r\n sizeCategory = `${(size / 1024).toFixed(2)} KB`;\r\n break;\r\n case absSize >= 1024 * 1024 && absSize < 1024 * 1024 * 1024:\r\n sizeCategory = `${(size / (1024 * 1024)).toFixed(2)} MB`;\r\n break;\r\n default:\r\n sizeCategory = `${(size / (1024 * 1024 * 1024)).toFixed(2)} GB`;\r\n }\r\n\r\n return sizeCategory;\r\n};\r\n\r\nexport { fileSize };\r\nexport default fileSize;\r\n","// types.ts - Type definitions for better type safety\r\nexport interface SubModule {\r\n sub_module_name: string;\r\n}\r\n\r\nexport interface ModuleAccess {\r\n module_name: string;\r\n sub_modules?: SubModule[];\r\n}\r\n\r\nexport interface UserData {\r\n module_access?: ModuleAccess[];\r\n}\r\n\r\nexport interface MenuItem {\r\n bacSubModuleName?: string | string[];\r\n submenu?: MenuItem[];\r\n [key: string]: any;\r\n}\r\n\r\nexport interface Permission {\r\n [key: string]: any;\r\n}\r\n\r\n// storageUtils.ts - Centralized storage access\r\nexport class StorageUtils {\r\n /**\r\n * Retrieves and parses user data from localStorage\r\n * @returns Parsed user data or null if not found\r\n */\r\n static getUserData(): UserData | null {\r\n try {\r\n const userData = localStorage.getItem(\"_u_data\");\r\n return userData ? JSON.parse(userData) : null;\r\n } catch (error) {\r\n console.error(\"Error parsing user data:\", error);\r\n return null;\r\n }\r\n }\r\n\r\n /**\r\n * Retrieves and parses role permissions from localStorage\r\n * @returns Parsed permissions object\r\n */\r\n static getRolePermissions(): Permission {\r\n try {\r\n const permissions = localStorage.getItem(\"role-permission\");\r\n return permissions ? JSON.parse(permissions) : {};\r\n } catch (error) {\r\n console.error(\"Error parsing role permissions:\", error);\r\n return {};\r\n }\r\n }\r\n}\r\n\r\n// moduleAccessService.ts - Business logic for module access\r\nexport class ModuleAccessService {\r\n /**\r\n * Filters modules by allowed module names and adds dashboard sub-module\r\n * @param moduleNames - Array of allowed module names\r\n * @param userData - User data containing module access\r\n * @returns Filtered modules with dashboard added\r\n */\r\n static getAccessibleSubModules(\r\n moduleNames: string[],\r\n userData: UserData | null,\r\n permissions: Permission\r\n ): ModuleAccess[] {\r\n if (!userData?.module_access) {\r\n return [];\r\n }\r\n\r\n return userData.module_access\r\n .filter((module) => moduleNames.includes(module.module_name))\r\n .map((module) => { \r\n if(module.module_name === \"hrms\"){\r\n return {\r\n ...module,\r\n // sub_modules: [\r\n // ...(module.sub_modules || []),\r\n // { sub_module_name: \"dashboard\" }\r\n // ]\r\n sub_modules: [\r\n ...(module.sub_modules || []).flatMap((subModule) => {\r\n const lastPart = subModule.sub_module_name.split(\"/\").pop() || \"\";\r\n const permissionEntry = permissions[lastPart];\r\n\r\n const childSubModules: SubModule[] = [];\r\n if (permissionEntry) {\r\n const allOperations: string[] = Object.values(permissionEntry)\r\n .flat()\r\n .map((p: any) => p.identity?.operation)\r\n // .filter((op: string) => op && !op.startsWith(\":\"));\r\n allOperations.forEach((op: string) => {\r\n childSubModules.push({\r\n sub_module_name: `${subModule.sub_module_name}/${op}`,\r\n });\r\n });\r\n }\r\n\r\n return [subModule, ...childSubModules];\r\n }),\r\n { sub_module_name: \"dashboard\" },\r\n ],\r\n }\r\n } else {\r\n return {\r\n ...module,\r\n sub_modules: [\r\n ...(module.sub_modules || []),\r\n { sub_module_name: \"dashboard\" }\r\n ]\r\n }\r\n }\r\n }\r\n );\r\n }\r\n\r\n /**\r\n * Extracts unique sub-module names from modules\r\n * @param modules - Array of module access objects\r\n * @returns Set of unique sub-module names\r\n */\r\n static extractSubModuleNames(modules: ModuleAccess[]): Set<string> {\r\n return new Set(\r\n modules.flatMap((module) => \r\n (module.sub_modules || []).map((subModule) => subModule.sub_module_name)\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * Matches sub-module names with permission keys\r\n * @param subModuleNames - Set of sub-module names\r\n * @param permissions - Permission object\r\n * @returns Set of matching sub-module names\r\n */\r\n static getMatchingSubModules(\r\n subModuleNames: Set<string>,\r\n permissions: Permission\r\n ): Set<string> {\r\n const permissionKeys = Object.keys(permissions);\r\n const _hrmsPermissionKeys = permissionKeys?.map(v => v.replace(/(\\/-p.*$|-p$)/i, \"\"))\r\n const matchingModules = Array.from(subModuleNames).filter((subModuleName) => {\r\n const segments = subModuleName.split(\"/\");\r\n \r\n if(segments[0] === \"hrms\"){\r\n // Find the segment that exactly matches a permission key\r\n const matchedKeyIndex = segments.findIndex((segment) =>\r\n _hrmsPermissionKeys.includes(segment)\r\n );\r\n \r\n if (matchedKeyIndex === -1) return false;\r\n\r\n const matchedKey = segments[matchedKeyIndex]; // e.g. \"payslips\"\r\n const childSegment = segments[matchedKeyIndex + 1]; // e.g. \"payslips/generate\" or undefined\r\n\r\n // No child segment → top-level module access is enough\r\n if (!childSegment) return true;\r\n\r\n const permissionEntry = permissions[matchedKey];\r\n if (!permissionEntry) return false;\r\n\r\n // Collect all operations across r, w, d\r\n const allOperations = Object.values(permissionEntry)\r\n .flat()\r\n .map((p: any) => p.identity?.operation);\r\n\r\n return allOperations.some(\r\n (op) =>\r\n op === childSegment || // exact: \"generate\" === \"generate\"\r\n op === \":nop\" || // wildcard: list operation\r\n op === \":param\" // wildcard: single resource operation\r\n );\r\n }else {\r\n const lastPart = subModuleName.split(\"/\").pop() || \"\";\r\n return permissionKeys.some((permKey) => permKey.startsWith(lastPart));\r\n }\r\n });\r\n\r\n return new Set(matchingModules);\r\n }\r\n}\r\n\r\n// menuFilterService.ts - Menu filtering logic\r\nexport class MenuFilterService {\r\n private static checkSubModuleAccess(\r\n bacSubModuleName: string | string[] | undefined,\r\n accessibleSubModules: Set<string>\r\n ): boolean {\r\n if (!bacSubModuleName) return false;\r\n\r\n if (Array.isArray(bacSubModuleName)) {\r\n return bacSubModuleName.some((name) => accessibleSubModules.has(name));\r\n }\r\n\r\n return accessibleSubModules.has(bacSubModuleName);\r\n }\r\n\r\n private static filterHrmsSubmenu(\r\n menu: MenuItem[],\r\n accessibleSubModules: Set<string>\r\n ): MenuItem[] {\r\n return menu\r\n .map((item) => {\r\n if (item.submenu && item.submenu.length > 0) {\r\n const filteredSubmenu = this.filterHrmsSubmenu(item.submenu, accessibleSubModules);\r\n const hasValidSubModule = this.checkSubModuleAccess(item.bacSubModuleName, accessibleSubModules);\r\n\r\n if (filteredSubmenu.length > 0 || hasValidSubModule) {\r\n return { ...item, submenu: filteredSubmenu };\r\n }\r\n return null;\r\n }\r\n // Leaf node\r\n return this.checkSubModuleAccess(item.bacSubModuleName, accessibleSubModules) ? item : null;\r\n })\r\n .filter((item): item is MenuItem => item !== null);\r\n }\r\n\r\n /**\r\n * Recursively filters menu items based on accessible sub-modules\r\n * @param menu - Array of menu items\r\n * @param accessibleSubModules - Set of accessible sub-module names\r\n * @returns Filtered menu array\r\n */\r\n static filterMenuByAccess(\r\n menu: MenuItem[],\r\n accessibleSubModules: Set<string>\r\n ): MenuItem[] {\r\n return menu.filter((item) => {\r\n const hasValidSubModule =\r\n item.bacSubModuleName && !Array.isArray(item.bacSubModuleName)\r\n ? accessibleSubModules.has(item.bacSubModuleName)\r\n : false;\r\n let hasValidSubmenu = false;\r\n if (item.submenu && item.submenu.length > 0) {\r\n // 👇 HRMS children → new logic; everything else → recurse with old logic\r\n item.submenu = item.submenu.some((child) =>\r\n typeof child.bacSubModuleName === 'string'\r\n ? child.bacSubModuleName.startsWith('hrms/')\r\n : Array.isArray(child.bacSubModuleName)\r\n ? child.bacSubModuleName.some((n) => n.startsWith('hrms/'))\r\n : false\r\n )\r\n ? this.filterHrmsSubmenu(item.submenu, accessibleSubModules)\r\n : this.filterMenuByAccess(item.submenu, accessibleSubModules);\r\n\r\n hasValidSubmenu = item.submenu.length > 0;\r\n }\r\n\r\n return hasValidSubModule || hasValidSubmenu;\r\n });\r\n // return menu.filter((item) => {\r\n // // const hasValidSubModule = \r\n // // item.bacSubModuleName && accessibleSubModules.has(item.bacSubModuleName);\r\n // const hasValidSubModule = Array.isArray(item.bacSubModuleName)\r\n // ? item.bacSubModuleName.some((name) => accessibleSubModules.has(name))\r\n // : item.bacSubModuleName\r\n // ? accessibleSubModules.has(item.bacSubModuleName)\r\n // : false;\r\n // let hasValidSubmenu = false;\r\n // if (item.submenu && item.submenu.length > 0) {\r\n // item.submenu = this.filterMenuByAccess(item.submenu, accessibleSubModules);\r\n // hasValidSubmenu = item.submenu.length > 0;\r\n // }\r\n // return hasValidSubModule || hasValidSubmenu;\r\n // });\r\n // return menu\r\n // .map((item) => {\r\n // // If item has a submenu, recursively filter it first\r\n // if (item.submenu && item.submenu.length > 0) {\r\n // const filteredSubmenu = this.filterMenuByAccess(item.submenu, accessibleSubModules);\r\n\r\n // // Check if the item itself has a valid bacSubModuleName\r\n // const hasValidSubModule = this.checkSubModuleAccess(item.bacSubModuleName, accessibleSubModules);\r\n\r\n // // Keep item if:\r\n // // 1. It has valid filtered children\r\n // // 2. OR it has its own valid access AND no submenu children blocked it\r\n // if (filteredSubmenu.length > 0 || hasValidSubModule) {\r\n // return { ...item, submenu: filteredSubmenu };\r\n // }\r\n\r\n // return null; // drop item entirely\r\n // }\r\n\r\n // // Leaf node — just check its own bacSubModuleName\r\n // const hasValidSubModule = this.checkSubModuleAccess(item.bacSubModuleName, accessibleSubModules);\r\n // return hasValidSubModule ? item : null;\r\n // })\r\n // .filter((item): item is MenuItem => item !== null);\r\n }\r\n}\r\n\r\n// menuFilter.ts - Main filter orchestrator\r\nexport class MenuFilter {\r\n /**\r\n * Filters menu based on user permissions and module access\r\n * @param menu - Menu items to filter\r\n * @param allowedModules - Array of allowed module names\r\n * @returns Filtered menu items\r\n */\r\n static filterByModuleAccess(\r\n menu: MenuItem[],\r\n allowedModules: string[]\r\n ): MenuItem[] {\r\n // Retrieve user data and permissions\r\n const userData = StorageUtils.getUserData();\r\n const permissions = StorageUtils.getRolePermissions();\r\n \r\n // Get accessible sub-modules\r\n const accessibleModules = ModuleAccessService.getAccessibleSubModules(\r\n allowedModules,\r\n userData,\r\n permissions\r\n );\r\n // Extract sub-module names\r\n const subModuleNames = ModuleAccessService.extractSubModuleNames(\r\n accessibleModules\r\n );\r\n\r\n // Match with permissions\r\n const matchingSubModules = ModuleAccessService.getMatchingSubModules(\r\n subModuleNames,\r\n permissions\r\n );\r\n // Filter menu\r\n return MenuFilterService.filterMenuByAccess(menu, matchingSubModules);\r\n }\r\n}\r\n\r\n// Usage example in your module\r\n// manufacturing.ts\r\n// import { MenuFilter } from './menuFilter';\r\n// import { MenuItem } from './types';\r\n\r\n// export const getFilteredManufacturingMenu = (\r\n// menuData: MenuItem[]\r\n// ): MenuItem[] => {\r\n// const allowedModules = [\"manufacturing\", \"inventory\", \"sales\"];\r\n// return MenuFilter.filterByModuleAccess(menuData, allowedModules);\r\n// };\r\n\r\n// // sales.ts\r\n// export const getFilteredSalesMenu = (\r\n// menuData: MenuItem[]\r\n// ): MenuItem[] => {\r\n// const allowedModules = [\"sales\", \"inventory\"];\r\n// return MenuFilter.filterByModuleAccess(menuData, allowedModules);\r\n// };\r\n\r\n// // Generic usage with dynamic modules\r\n// export const getFilteredMenu = (\r\n// menuData: MenuItem[],\r\n// allowedModules: string[]\r\n// ): MenuItem[] => {\r\n// return MenuFilter.filterByModuleAccess(menuData, allowedModules);\r\n// };","'use strict';\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar React = require('react');\nvar React__default = _interopDefault(React);\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n\n var mountedInstances = [];\n var state;\n\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n\n var SideEffect =\n /*#__PURE__*/\n function (_PureComponent) {\n _inheritsLoose(SideEffect, _PureComponent);\n\n function SideEffect() {\n return _PureComponent.apply(this, arguments) || this;\n }\n\n // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n SideEffect.peek = function peek() {\n return state;\n };\n\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n\n var _proto = SideEffect.prototype;\n\n _proto.UNSAFE_componentWillMount = function UNSAFE_componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n\n _proto.render = function render() {\n return React__default.createElement(WrappedComponent, this.props);\n };\n\n return SideEffect;\n }(React.PureComponent);\n\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n\n return SideEffect;\n };\n}\n\nmodule.exports = withSideEffect;\n","/* global Map:readonly, Set:readonly, ArrayBuffer:readonly */\n\nvar hasElementType = typeof Element !== 'undefined';\nvar hasMap = typeof Map === 'function';\nvar hasSet = typeof Set === 'function';\nvar hasArrayBuffer = typeof ArrayBuffer === 'function' && !!ArrayBuffer.isView;\n\n// Note: We **don't** need `envHasBigInt64Array` in fde es6/index.js\n\nfunction equal(a, b) {\n // START: fast-deep-equal es6/index.js 3.1.3\n if (a === b) return true;\n\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n if (a.constructor !== b.constructor) return false;\n\n var length, i, keys;\n if (Array.isArray(a)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (!equal(a[i], b[i])) return false;\n return true;\n }\n\n // START: Modifications:\n // 1. Extra `has<Type> &&` helpers in initial condition allow es6 code\n // to co-exist with es5.\n // 2. Replace `for of` with es5 compliant iteration using `for`.\n // Basically, take:\n //\n // ```js\n // for (i of a.entries())\n // if (!b.has(i[0])) return false;\n // ```\n //\n // ... and convert to:\n //\n // ```js\n // it = a.entries();\n // while (!(i = it.next()).done)\n // if (!b.has(i.value[0])) return false;\n // ```\n //\n // **Note**: `i` access switches to `i.value`.\n var it;\n if (hasMap && (a instanceof Map) && (b instanceof Map)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!equal(i.value[1], b.get(i.value[0]))) return false;\n return true;\n }\n\n if (hasSet && (a instanceof Set) && (b instanceof Set)) {\n if (a.size !== b.size) return false;\n it = a.entries();\n while (!(i = it.next()).done)\n if (!b.has(i.value[0])) return false;\n return true;\n }\n // END: Modifications\n\n if (hasArrayBuffer && ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;)\n if (a[i] !== b[i]) return false;\n return true;\n }\n\n if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n // START: Modifications:\n // Apply guards for `Object.create(null)` handling. See:\n // - https://github.com/FormidableLabs/react-fast-compare/issues/64\n // - https://github.com/epoberezkin/fast-deep-equal/issues/49\n if (a.valueOf !== Object.prototype.valueOf && typeof a.valueOf === 'function' && typeof b.valueOf === 'function') return a.valueOf() === b.valueOf();\n if (a.toString !== Object.prototype.toString && typeof a.toString === 'function' && typeof b.toString === 'function') return a.toString() === b.toString();\n // END: Modifications\n\n keys = Object.keys(a);\n length = keys.length;\n if (length !== Object.keys(b).length) return false;\n\n for (i = length; i-- !== 0;)\n if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n // END: fast-deep-equal\n\n // START: react-fast-compare\n // custom handling for DOM elements\n if (hasElementType && a instanceof Element) return false;\n\n // custom handling for React/Preact\n for (i = length; i-- !== 0;) {\n if ((keys[i] === '_owner' || keys[i] === '__v' || keys[i] === '__o') && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n\n continue;\n }\n\n // all other properties should be traversed as usual\n if (!equal(a[keys[i]], b[keys[i]])) return false;\n }\n // END: react-fast-compare\n\n // START: fast-deep-equal\n return true;\n }\n\n return a !== a && b !== b;\n}\n// end fast-deep-equal\n\nmodule.exports = function isEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (((error.message || '').match(/stack|recursion/i))) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('react-fast-compare cannot handle circular refs');\n return false;\n }\n // some other error. we should definitely know about these\n throw error;\n }\n};\n","import PropTypes from 'prop-types';\nimport withSideEffect from 'react-side-effect';\nimport isEqual from 'react-fast-compare';\nimport React from 'react';\nimport objectAssign from 'object-assign';\n\nvar ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\n\nvar TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\n\nvar VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\n\nvar TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\",\n TARGET: \"target\"\n};\n\nvar REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n class: \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\n\nvar HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\n\nvar HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\n\nvar SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\n\nvar HELMET_ATTRIBUTE = \"data-react-helmet\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n};\n\nvar createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\n\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n};\n\nvar inherits = function (subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar objectWithoutProperties = function (obj, keys) {\n var target = {};\n\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n\n return target;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (encode === false) {\n return String(str);\n }\n\n return String(str).replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\n};\n\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, HELMET_PROPS.TITLE_TEMPLATE);\n\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return Array.isArray(innermostTitle) ? innermostTitle.join(\"\") : innermostTitle;\n });\n }\n\n var innermostDefaultTitle = getInnermostProperty(propsList, HELMET_PROPS.DEFAULT_TITLE);\n\n return innermostTitle || innermostDefaultTitle || undefined;\n};\n\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\n\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\n\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n\n return innermostBaseTag;\n }, []);\n};\n\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n }\n // Special case for innerHTML which doesn't work lowercased\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === TAG_PROPERTIES.INNER_HTML || attributeKey === TAG_PROPERTIES.CSS_TEXT || attributeKey === TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n\n var value = tag[primaryAttributeKey].toLowerCase();\n\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n });\n\n // Update seen tags with tags from this instance\n var keys = Object.keys(instanceSeenTags);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = objectAssign({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n\n approvedSeenTags[attributeKey] = tagUnion;\n }\n\n return approvedTags;\n }, []).reverse();\n};\n\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n\n return null;\n};\n\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([TAG_PROPERTIES.HREF, TAG_PROPERTIES.TARGET], propsList),\n bodyAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(TAG_NAMES.LINK, [TAG_PROPERTIES.REL, TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(TAG_NAMES.META, [TAG_PROPERTIES.NAME, TAG_PROPERTIES.CHARSET, TAG_PROPERTIES.HTTPEQUIV, TAG_PROPERTIES.PROPERTY, TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(TAG_NAMES.NOSCRIPT, [TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(TAG_NAMES.SCRIPT, [TAG_PROPERTIES.SRC, TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(TAG_NAMES.STYLE, [TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\n\nvar rafPolyfill = function () {\n var clock = Date.now();\n\n return function (callback) {\n var currentTime = Date.now();\n\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\n\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\n\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame && window.requestAnimationFrame.bind(window) || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\n\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\n\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\n\nvar _helmetCallback = null;\n\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\n\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n\n updateAttributes(TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(TAG_NAMES.HTML, htmlAttributes);\n\n updateTitle(title, titleAttributes);\n\n var tagUpdates = {\n baseTag: updateTags(TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(TAG_NAMES.STYLE, styleTags)\n };\n\n var addedTags = {};\n var removedTags = {};\n\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n\n\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n\n cb && cb();\n\n onChangeClientState(newState, addedTags, removedTags);\n};\n\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\n\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n\n updateAttributes(TAG_NAMES.TITLE, attributes);\n};\n\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n\n if (!elementTag) {\n return;\n }\n\n var helmetAttributeString = elementTag.getAttribute(HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n\n var indexToSave = attributesToRemove.indexOf(attribute);\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\n\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n\n newElement.setAttribute(HELMET_ATTRIBUTE, \"true\");\n\n // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\n\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\n\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\" : \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\";\n};\n\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === TAG_PROPERTIES.INNER_HTML || attribute === TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n\n var isSelfClosing = SELF_CLOSING_TAGS.indexOf(type) === -1;\n\n return str + \"<\" + type + \" \" + HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"</\" + type + \">\");\n }, \"\");\n};\n\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\n\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return Object.keys(props).reduce(function (obj, key) {\n obj[HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\n\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps;\n\n // assigning into an array to define toString function on it\n var initProps = (_initProps = {\n key: title\n }, _initProps[HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n\n return [React.createElement(TAG_NAMES.TITLE, props, title)];\n};\n\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[HELMET_ATTRIBUTE] = true, _mappedTag);\n\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = REACT_TAG_MAP[attribute] || attribute;\n\n if (mappedAttribute === TAG_PROPERTIES.INNER_HTML || mappedAttribute === TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = { __html: content };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n\n return React.createElement(type, mappedTag);\n });\n};\n\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n case ATTRIBUTE_NAMES.BODY:\n case ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\n\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(TAG_NAMES.TITLE, { title: title, titleAttributes: titleAttributes }, encode)\n };\n};\n\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n\n return _temp = _class = function (_React$Component) {\n inherits(HelmetWrapper, _React$Component);\n\n function HelmetWrapper() {\n classCallCheck(this, HelmetWrapper);\n return possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !isEqual(this.props, nextProps);\n };\n\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n\n switch (child.type) {\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n\n case TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _babelHelpers$extends;\n\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n\n return _extends({}, arrayTypeChildren, (_babelHelpers$extends = {}, _babelHelpers$extends[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _babelHelpers$extends));\n };\n\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _babelHelpers$extends2, _babelHelpers$extends3;\n\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n\n switch (child.type) {\n case TAG_NAMES.TITLE:\n return _extends({}, newProps, (_babelHelpers$extends2 = {}, _babelHelpers$extends2[child.type] = nestedChildren, _babelHelpers$extends2.titleAttributes = _extends({}, newChildProps), _babelHelpers$extends2));\n\n case TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n\n case TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n\n return _extends({}, newProps, (_babelHelpers$extends3 = {}, _babelHelpers$extends3[child.type] = _extends({}, newChildProps), _babelHelpers$extends3));\n };\n\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _babelHelpers$extends4;\n\n newFlattenedProps = _extends({}, newFlattenedProps, (_babelHelpers$extends4 = {}, _babelHelpers$extends4[arrayChildName] = arrayTypeChildren[arrayChildName], _babelHelpers$extends4));\n });\n\n return newFlattenedProps;\n };\n\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return warn(\"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.\");\n }\n\n return warn(\"Only elements types \" + VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``}</\" + child.type + \"> ) Refer to our API for more information.\");\n }\n }\n\n return true;\n };\n\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n\n var arrayTypeChildren = {};\n\n React.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = objectWithoutProperties(_child$props, [\"children\"]);\n\n var newChildProps = convertReactPropstoHtmlAttributes(childProps);\n\n _this2.warnOnInvalidChildren(child, nestedChildren);\n\n switch (child.type) {\n case TAG_NAMES.LINK:\n case TAG_NAMES.META:\n case TAG_NAMES.NOSCRIPT:\n case TAG_NAMES.SCRIPT:\n case TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = objectWithoutProperties(_props, [\"children\"]);\n\n var newProps = _extends({}, props);\n\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n\n return React.createElement(Component, newProps);\n };\n\n createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n\n\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \"<img src='http://mysite.com/js/test.js'\"}]\n * @param {Function} onChangeClientState: \"(newState) => console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set$$1(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(React.Component), _class.propTypes = {\n base: PropTypes.object,\n bodyAttributes: PropTypes.object,\n children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),\n defaultTitle: PropTypes.string,\n defer: PropTypes.bool,\n encodeSpecialCharacters: PropTypes.bool,\n htmlAttributes: PropTypes.object,\n link: PropTypes.arrayOf(PropTypes.object),\n meta: PropTypes.arrayOf(PropTypes.object),\n noscript: PropTypes.arrayOf(PropTypes.object),\n onChangeClientState: PropTypes.func,\n script: PropTypes.arrayOf(PropTypes.object),\n style: PropTypes.arrayOf(PropTypes.object),\n title: PropTypes.string,\n titleAttributes: PropTypes.object,\n titleTemplate: PropTypes.string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = mapStateOnServer({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n\n return mappedState;\n }, _temp;\n};\n\nvar NullComponent = function NullComponent() {\n return null;\n};\n\nvar HelmetSideEffects = withSideEffect(reducePropsToState, handleClientStateChange, mapStateOnServer)(NullComponent);\n\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\n\nexport default HelmetExport;\nexport { HelmetExport as Helmet };\n","import { Helmet } from \"react-helmet\";\r\nimport propTypes from \"prop-types\";\r\n\r\nconst MetaComponent = (props: any) => {\r\n const canonicalURL = props.location\r\n ? `${props.location.protocol}//${props.location.host}${window.location.pathname}`\r\n : \"\";\r\n\r\n return (\r\n <Helmet>\r\n <title>{props.title}</title>\r\n <meta name=\"description\" content={props.description} />\r\n <meta name=\"keywords\" content={props.keywords} />\r\n {props.location && <link rel=\"canonical\" href={`${canonicalURL}`} />}\r\n\r\n {/* {props.schema && <JsonLd data={props.schema} />} */}\r\n </Helmet>\r\n );\r\n};\r\n\r\nconst JsonLd = ({ data }: any) => {\r\n return data.map((schema: any, index: number) => {\r\n return (\r\n <script\r\n key={index}\r\n type=\"application/ld+json\"\r\n dangerouslySetInnerHTML={{ __html: JSON.stringify(schema) }}\r\n />\r\n );\r\n });\r\n};\r\n\r\nMetaComponent.propTypes = {\r\n title: propTypes.string,\r\n keywords: propTypes.string,\r\n description: propTypes.string,\r\n image: propTypes.string,\r\n schema: propTypes.arrayOf(propTypes.object),\r\n location: propTypes.object,\r\n};\r\n\r\nJsonLd.propTypes = {\r\n data: propTypes.arrayOf(propTypes.object),\r\n};\r\n\r\nexport { MetaComponent };\r\nexport default MetaComponent;\r\n","\r\n\r\nimport { generateRouteWithId } from \"./route-utils\";\r\n\r\n\r\nexport const migrateToPathWithId = (redirectionLink: string, idField: string = 'id') => {\r\n return {\r\n redirectionPathWithId: `${redirectionLink}/:id`,\r\n idField\r\n };\r\n};\r\n\r\n\r\nexport const migrateRoutesToUseParams = (routes: Record<string, string>): Record<string, string> => {\r\n const updatedRoutes: Record<string, string> = { ...routes };\r\n \r\n Object.keys(updatedRoutes).forEach(key => {\r\n if (\r\n key.startsWith('VIEW_') || \r\n key.startsWith('EDIT_') || \r\n key.startsWith('DETAIL_') ||\r\n key.includes('_VIEW_') || \r\n key.includes('_EDIT_') || \r\n key.includes('_DETAIL_')\r\n ) {\r\n if (!updatedRoutes[key].includes(':')) {\r\n updatedRoutes[key] = `${updatedRoutes[key]}/:id`;\r\n }\r\n }\r\n });\r\n \r\n return updatedRoutes;\r\n};\r\n\r\nexport const createParameterizedNavigationHandler = (\r\n navigate: (path: string) => void,\r\n basePath: string,\r\n idExtractor: (row: any) => string | number = (row) => row.id\r\n) => {\r\n return (row: any) => {\r\n const id = idExtractor(row);\r\n navigate(generateRouteWithId(basePath, id));\r\n };\r\n};\r\n\r\n\r\nexport const updateTableConfigForParameterizedNavigation = (\r\n tableConfig: any,\r\n pathWithIdField: string,\r\n idField: string = 'id'\r\n) => {\r\n const { ...rest } = tableConfig;\r\n \r\n return {\r\n ...rest,\r\n redirectionPathWithId: pathWithIdField,\r\n idField\r\n };\r\n}; "],"names":["_interopDefault","require$$0","reducePropsToState","mapStateOnServer","SideEffect","encodeSpecialCharacters","getTitleFromPropsList","getOnChangeClientState","getAttributesFromPropsList","getBaseTagFromPropsList","getTagsFromPropsList","keys","i","attributeKey","getInnermostProperty","cafPolyfill","warn","handleClientStateChange","commitTagChanges","flattenArray","updateTitle","updateAttributes","updateTags","generateElementAttributesAsString","generateTitleAsString","generateTagsAsString","convertElementAttributestoReactProps","convertReactPropstoHtmlAttributes","generateTitleAsReactComponent","React","generateTagsAsReactComponent","getMethodsForTag","Helmet","isEqual","canUseDOM","NullComponent","withSideEffect","jsx","propTypes"],"mappings":"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","x_google_ignoreList":[5,6,7]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-context-B-0cNWoa.js","sources":["../../src/utils/format-permissions.ts","../../src/contexts/permission-context.tsx","../../src/components/loaders/erp-loader.tsx","../../src/contexts/page-context.tsx"],"sourcesContent":["import { formatLabel } from \"./format-text\";\r\n\r\nexport interface HrmsPermissionNode {\r\n canView?: boolean; // r + :nop\r\n canViewById?: boolean; // r + :param (plain)\r\n canAdd?: boolean; // w\r\n canEdit?: boolean; // u / e + :param (plain)\r\n canDelete?: boolean; // d\r\n /**\r\n * Dynamic action map for any compound operation path.\r\n * Key = camelCase of the named segments extracted from the operation.\r\n *\r\n * Examples:\r\n * \":param/status\" → actions.status\r\n * \":param/send\" → actions.send\r\n * \":param/contracts/:param_id\" → actions.contracts\r\n * \":param/documents/:param_id/verify\" → actions.documentsVerify\r\n * \"public/welcome/:param/reject\" → stored on sub-node \"publicWelcome\".actions.reject\r\n * \"public/welcome/:param/accept\" → stored on sub-node \"publicWelcome\".actions.accept\r\n */\r\n actions?: Record<string, boolean>;\r\n [subRoute: string]: HrmsPermissionNode | boolean | Record<string, boolean> | undefined;\r\n}\r\n\r\nexport type HrmsPermissionTree = Record<string, HrmsPermissionNode>;\r\n\r\n// ─── Constants ────────────────────────────────────────────────────────────────\r\n\r\n// Only process entries belonging to this module\r\nconst ALLOWED_MODULES = ['hrms'] as const;\r\n\r\n// Maps BE short keys → FE permission flags for plain CRUD operations.\r\n// Only `:nop` and `:param` (no action suffix) are handled here.\r\n// Compound operations (with named action segments) bypass this map and go to node.actions.\r\nconst HRMS_CRUD_FLAG_MAP: Record<string, Record<':nop' | ':param', keyof HrmsPermissionNode>> = {\r\n r: { ':nop': 'canView', ':param': 'canViewById' },\r\n w: { ':nop': 'canAdd', ':param': 'canAdd' },\r\n u: { ':nop': 'canEdit', ':param': 'canEdit' },\r\n d: { ':nop': 'canDelete', ':param': 'canDelete' },\r\n e: { ':nop': 'canEdit', ':param': 'canEdit' },\r\n};\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n/** \"active-loans\" → \"activeloans\", \"my-approvals\" → \"myapprovals\" */\r\nfunction toCamelCase(str: string): string {\r\n return str\r\n .replace(/[^a-zA-Z0-9\\s-]/g, ' ')\r\n .split(/[-\\s]+/)\r\n .filter(Boolean)\r\n .join('');\r\n}\r\n\r\n/**\r\n * Joins multiple camelCase parts into a single camelCase string.\r\n * [\"documents\", \"verify\"] → \"documentsVerify\"\r\n * [\"public\", \"welcome\"] → \"publicWelcome\"\r\n */\r\nfunction joinCamelParts(parts: string[]): string {\r\n return parts\r\n .map((p, i) => i === 0 ? p : p.charAt(0).toUpperCase() + p.slice(1))\r\n .join('');\r\n}\r\n\r\n/**\r\n * Checks whether a path segment is a parameter placeholder.\r\n * Matches \":param\", \":id\", \":param_id\", \":nop\", etc.\r\n */\r\nfunction isParamSegment(seg: string): boolean {\r\n return seg.startsWith(':');\r\n}\r\n\r\n// ─── Operation Resolver ───────────────────────────────────────────────────────\r\n\r\ninterface ResolvedOperation {\r\n /**\r\n * camelCase key of the named sub-route (null = write to root node).\r\n * e.g. \"active-loans\" → \"activeloans\"\r\n * \"public/welcome\" → \"publicWelcome\"\r\n */\r\n subRoute: string | null;\r\n\r\n /**\r\n * camelCase key of the specific action within the node (null = plain CRUD).\r\n * Populated when named segments appear *after* a param segment.\r\n * e.g. \":param/status\" → \"status\"\r\n * \":param/documents/:param_id/verify\" → \"documentsVerify\"\r\n * \"public/welcome/:param/reject\" → \"reject\" (sub-route = \"publicWelcome\")\r\n */\r\n action: string | null;\r\n\r\n /**\r\n * Whether a :param placeholder exists anywhere in the operation.\r\n * Determines canView vs canViewById for plain CRUD sub-route access.\r\n */\r\n hasParam: boolean;\r\n}\r\n\r\n/**\r\n * Generic operation parser — no hardcoded action names.\r\n *\r\n * Algorithm:\r\n * 1. Split operation by \"/\".\r\n * 2. Walk segments left-to-right, collecting:\r\n * - \"leading named\" segments (before the first param) → subRoute\r\n * - \"trailing named\" segments (after the first param) → action\r\n * 3. A pure \":nop\" / \":param\" operation has no named segments → plain CRUD.\r\n */\r\nfunction resolveOperation(operation: string): ResolvedOperation {\r\n if (!operation || operation === ':nop') {\r\n return { subRoute: null, action: null, hasParam: false };\r\n }\r\n\r\n const segments = operation.split('/');\r\n const leadingNamed: string[] = []; // named segs before first param\r\n const trailingNamed: string[] = []; // named segs after first param\r\n let passedParam = false;\r\n let hasParam = false;\r\n\r\n for (const seg of segments) {\r\n if (isParamSegment(seg)) {\r\n passedParam = true;\r\n hasParam = true;\r\n } else {\r\n const part = toCamelCase(seg);\r\n if (part) {\r\n if (!passedParam) {\r\n leadingNamed.push(part);\r\n } else {\r\n trailingNamed.push(part);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Pure :param (no named segments at all) → plain CRUD\r\n if (leadingNamed.length === 0 && trailingNamed.length === 0) {\r\n return { subRoute: null, action: null, hasParam };\r\n }\r\n\r\n const subRoute = leadingNamed.length > 0\r\n ? joinCamelParts(leadingNamed)\r\n : null;\r\n\r\n const action = trailingNamed.length > 0\r\n ? joinCamelParts(trailingNamed)\r\n : null;\r\n\r\n return { subRoute, action, hasParam };\r\n}\r\n\r\n// ─── Tree Builder ─────────────────────────────────────────────────────────────\r\n\r\nexport function buildHrmsPermissionTree(raw: Record<string, any>): HrmsPermissionTree {\r\n const tree: HrmsPermissionTree = {};\r\n if(!raw){\r\n return tree;\r\n }\r\n for (const [rawModuleKey, crudBlock] of Object.entries(raw)) {\r\n\r\n // ── Step 1: normalise raw key → camelCase module name ──────────────────\r\n // \"loan-allotments\" → \"loanAllotments\"\r\n const formattedModule = formatLabel(\r\n rawModuleKey\r\n .split('/')[0] // strip path suffix e.g. \"/-p\"\r\n .replace(/p$/gi, \"\") // strip trailing p\r\n .replace(/-p-/gi, \"-\") // strip -p- infix\r\n .replace(/-+$/g, \"\") // clean leftover trailing dashes\r\n ).replace(/[^a-zA-Z0-9]/gi, \"\"); // strip non-alphanumeric\r\n\r\n // ── Step 2: split on capital letters ──────────────────────────────────\r\n // \"loanAllotments\" → moduleKey: \"loanAllotments\", moduleSubName: \"\"\r\n // \"loanAllotmentsMy\"→ moduleKey: \"loanAllotments\", moduleSubName: \"My\"\r\n const parts = formattedModule.split(/(?=[A-Z])/);\r\n const moduleKey = parts.slice(0, 2).join(\"\");\r\n const moduleSubName = parts.slice(2).join(\"\");\r\n\r\n if (!tree[moduleKey]) tree[moduleKey] = {};\r\n if (!crudBlock || typeof crudBlock !== 'object') continue;\r\n\r\n for (const [shortKey, entries] of Object.entries(crudBlock)) {\r\n const flagMap = HRMS_CRUD_FLAG_MAP[shortKey];\r\n if (!flagMap) continue;\r\n\r\n const list: any[] = Array.isArray(entries)\r\n ? entries\r\n : [{ ...entries, identity: null }];\r\n\r\n for (const entry of list) {\r\n // ── Filter: only process hrms module entries ────────────────────\r\n const entryModule = entry?.identity?.module;\r\n if (entryModule && !ALLOWED_MODULES.includes(entryModule)) continue;\r\n\r\n const operation = entry?.identity?.operation ?? ':nop';\r\n\r\n // ── Step 3: parse operation generically ────────────────────────\r\n const { subRoute, action, hasParam } = resolveOperation(operation);\r\n\r\n // ── Step 4: resolve target node ────────────────────────────────\r\n let targetNode: HrmsPermissionNode;\r\n\r\n if (moduleSubName) {\r\n if (!(tree[moduleKey] as any)[moduleSubName]) {\r\n (tree[moduleKey] as any)[moduleSubName] = {} as HrmsPermissionNode;\r\n }\r\n const subNameNode = (tree[moduleKey] as any)[moduleSubName] as any;\r\n\r\n // ── FIX: if operation also has a subRoute, nest inside moduleSubName ──\r\n if (subRoute) {\r\n const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);\r\n if (!subNameNode[subKey]) subNameNode[subKey] = {} as HrmsPermissionNode;\r\n targetNode = subNameNode[subKey] as HrmsPermissionNode;\r\n } else {\r\n targetNode = subNameNode;\r\n }\r\n\r\n } else if (subRoute) {\r\n const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);\r\n if (!(tree[moduleKey] as any)[subKey]) {\r\n (tree[moduleKey] as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n targetNode = (tree[moduleKey] as any)[subKey] as HrmsPermissionNode;\r\n\r\n } else {\r\n targetNode = tree[moduleKey];\r\n }\r\n\r\n // ── Step 5: write permission into target node ───────────────────\r\n if (action) {\r\n // Compound operation with a named action suffix → generic actions map.\r\n // No flag enumeration needed — the action name IS the key.\r\n // e.g. \":param/status\" → node.actions.status\r\n // e.g. \":param/documents/:param_id/verify\" → node.actions.documentsVerify\r\n // e.g. \"public/welcome/:param/reject\" → subNode.actions.reject\r\n if (!targetNode.actions) targetNode.actions = {};\r\n targetNode.actions[action] = true;\r\n\r\n } else {\r\n // Plain CRUD operation → map to well-known flag\r\n const opKey: ':nop' | ':param' = hasParam ? ':param' : ':nop';\r\n const flag = flagMap[opKey];\r\n if (!flag) continue;\r\n targetNode[flag] = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return tree;\r\n}\r\n","/* eslint-disable react-refresh/only-export-components */\r\nimport React, { createContext, useEffect, useMemo, ReactNode, useState } from \"react\";\r\nimport { formatLabel } from \"../utils/format-text\";\r\nimport { useAppSelector } from \"../redux/hooks\";\r\nimport { buildHrmsPermissionTree } from \"../utils/format-permissions\";\r\n\r\n// Define the types for permissions\r\ntype PermissionActions = \"canEdit\" | \"canView\" | \"canAdd\" | \"canDelete\" | \"canAddForOthers\";\r\ntype SubModulePermissions = Partial<Record<PermissionActions, boolean>>;\r\ntype ModulePermissions = SubModulePermissions & Record<string, SubModulePermissions>;\r\n\r\nexport interface PermissionsContextType {\r\n [module: string]: ModulePermissions;\r\n}\r\n\r\ninterface PermissionsProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Create a context with a default value\r\nexport const PermissionsContext = createContext<PermissionsContextType | null>(null);\r\n\r\nconst ROLE_PERMISSION_STORAGE_KEY = \"role-permission\";\r\nconst parseStoredPermissions = (rawValue: string | null): Record<string, any> => {\r\n if (!rawValue) {\r\n return {};\r\n }\r\n\r\n try {\r\n const parsedPermissions = JSON.parse(rawValue);\r\n return parsedPermissions;\r\n } catch (error) {\r\n localStorage.removeItem(ROLE_PERMISSION_STORAGE_KEY);\r\n return {};\r\n }\r\n};\r\n\r\nexport const PermissionsProvider: React.FC<PermissionsProviderProps> = ({ children }) => {\r\n const { setIsPermissionLoaded = false } = useAppSelector(\r\n (store) => store.roles ?? {}\r\n );\r\n\r\n const [storagePermission, setStoragePermission] = useState<string | null>(() => {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n return window.localStorage.getItem(ROLE_PERMISSION_STORAGE_KEY);\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n\r\n const syncPermissions = () => {\r\n const latestPermission = window.localStorage.getItem(ROLE_PERMISSION_STORAGE_KEY);\r\n setStoragePermission(latestPermission);\r\n };\r\n\r\n const handleStorageChange = (event: StorageEvent) => {\r\n if (!event.key || event.key === ROLE_PERMISSION_STORAGE_KEY) {\r\n syncPermissions();\r\n }\r\n };\r\n\r\n syncPermissions();\r\n window.addEventListener(\"storage\", handleStorageChange);\r\n window.addEventListener(\"role-permission-changed\", syncPermissions);\r\n\r\n return () => {\r\n window.removeEventListener(\"storage\", handleStorageChange);\r\n window.removeEventListener(\"role-permission-changed\", syncPermissions);\r\n };\r\n }, []);\r\n\r\n const permissions: Record<string, any> = useMemo(() => {\r\n return parseStoredPermissions(storagePermission);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [setIsPermissionLoaded, storagePermission]);\r\n \r\n const computedPermissions = useMemo(() => {\r\n return buildHrmsPermissionTree(permissions);\r\n }, [permissions]);\r\n\r\n return (\r\n <PermissionsContext.Provider value={computedPermissions}>\r\n {children}\r\n </PermissionsContext.Provider>\r\n );\r\n};\r\n","import React from \"react\"\r\nimport { Box, CircularProgress, CircularProgressProps } from '@mui/material';\r\nimport { styled } from '@mui/material/styles';\r\n\r\nconst Loader = styled(CircularProgress)(({theme})=>({\r\n color: theme.palette?.theme?.primary[500]||\"#1976d2\"\r\n}))\r\n\r\nconst ErpLoader = (props:CircularProgressProps) => {\r\n\treturn <Box position=\"fixed\" left='50%' top=\"50%\">\r\n <Loader size={50} {...props}/>\r\n </Box>\r\n};\r\n\r\nexport { ErpLoader };\r\nexport default ErpLoader;\r\n","/* eslint-disable react-refresh/only-export-components */\r\n/* eslint-disable no-mixed-spaces-and-tabs */\r\n\r\nimport React, { createContext, useCallback, useEffect, useMemo, useState, useRef } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n\tgetV1FilterResource,\r\n\tgetV1FormBuilder,\r\n\tgetV1FormBuilderSchemaFieldsName,\r\n\tgetV1PagesResource,\r\n\tpatchV1PagesPageId\r\n} from '../api-client/api.system-feature/api';\r\nimport { IResources, routeToColumnsMap, routeToResourceMap } from '../constants/route-page-map'; // Removed - should be passed as props or configured by consuming app\r\nimport { getToken } from '../utils/common';\r\nimport { removeIdStaticIdsFromMongoObject } from '../utils/common';\r\nimport { RuleGroupType } from 'react-querybuilder';\r\nimport { MaterialTableColumnProps } from '../components/material-table/material-table';\r\nimport _ from 'lodash';\r\nimport { formatLabel } from '../utils/format-text';\r\nimport ErpLoader from '../components/loaders/erp-loader';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useAuth } from '../hooks/useAuth';\r\n// import { usePermissions } from '../hooks/use-permissions';\r\n\r\n/* Interfaces and types */\r\nexport type ViewType = 'Table' | 'Grid' | 'Kanban' | 'Calendar' | 'Gantt' | '';\r\n\r\ninterface SchemaFields {\r\n\tselect: string;\r\n\talias: string;\r\n\ttype: string;\r\n\tfilter_type?: string;\r\n\tfilter_name?: string;\r\n\trequired?: boolean;\r\n\tisOrderAllowed?: boolean;\r\n\tisDefault?: boolean;\r\n\tisFilterAllowed?: boolean;\r\n\tlabel?: string;\r\n\tkey: string;\r\n\taccessorKey?: string;\r\n\tjoinKey?: string;\r\n\tenum?: string | string[];\r\n}\r\nexport interface SavedViewType {\r\n\tlabel: ViewType;\r\n\tposition: number;\r\n}\r\nexport interface PageState {\r\n\t_id: string | number;\r\n\tname: string;\r\n\tpage_size: number;\r\n\tcolumn_order: string[];\r\n\tvisible_columns: MaterialTableColumnProps[];\r\n\tviews: SavedViewType[];\r\n\tactive_view: ViewType;\r\n\tfilters: RuleGroupType;\r\n\tfilterQueryString: string;\r\n\tsort: Record<any, any> | null;\r\n\tsearch: string;\r\n\tenabled_views: ViewType[];\r\n\tisShared: boolean;\r\n\tcolumn_sizes: Record<string, number>;\r\n}\r\n\r\nexport interface GeneratedColumnsState {\r\n\tcolumns: MaterialTableColumnProps[];\r\n\torderKeys: string[];\r\n}\r\n\r\nexport const initialFilter: RuleGroupType = { combinator: 'and', rules: [] };\r\n\r\ninterface PageContextValue {\r\n\tpageTemplateId: string;\r\n\tactivePage: PageState;\r\n\tupdatePageInfo: (updates: Partial<PageState>) => void;\r\n\tloading: boolean;\r\n\tisSaving: boolean;\r\n\terror: string | null;\r\n\tpages: any[];\r\n\tsavePages: () => void;\r\n\tsetActivePage: (data: any) => void;\r\n\tsetPages: React.Dispatch<any>;\r\n\tschemaFields: SchemaFields[];\r\n\tinitializeColumns: (columns: MaterialTableColumnProps[]) => void;\r\n\tgeneratedColumns: GeneratedColumnsState;\r\n\tsharedPages: any[];\r\n\tupdateGeneratedColumns: (updates: Partial<GeneratedColumnsState>) => void;\r\n\tformData: Record<string, any>\r\n\tsetFormData: (data: Record<string, any>) => void\r\n}\r\n\r\nexport const defaultPageState: PageState = {\r\n\t_id: '',\r\n\tname: '',\r\n\tpage_size: 10,\r\n\tcolumn_order: ['id'],\r\n\tvisible_columns: [],\r\n\tviews: [],\r\n\tactive_view: '',\r\n\tfilters: initialFilter,\r\n\tfilterQueryString: '',\r\n\tsort: null,\r\n\tsearch: '',\r\n\tenabled_views: ['Table', 'Grid', 'Kanban', 'Calendar', 'Gantt'],\r\n\tisShared: false,\r\n\tcolumn_sizes: {}\r\n};\r\ninterface PageProviderProps {\r\n\tchildren: React.ReactNode;\r\n\trouteToColumnsMap?: Record<string, any>;\r\n\trouteToResourceMap?: Record<string, any>;\r\n}\r\n\r\nconst UpdatePageInfo = () => { };\r\nconst UpdateGeneratedColumns = () => { };\r\n\r\nexport const PageContext = createContext<PageContextValue>({\r\n\tpageTemplateId: '',\r\n\tactivePage: defaultPageState,\r\n\tupdatePageInfo: UpdatePageInfo,\r\n\tloading: false,\r\n\tisSaving: false,\r\n\terror: null,\r\n\tpages: [],\r\n\tsharedPages: [],\r\n\tsavePages: () => { },\r\n\tsetActivePage: () => { },\r\n\tsetPages: () => { },\r\n\tschemaFields: [],\r\n\tinitializeColumns: () => { },\r\n\tgeneratedColumns: { columns: [], orderKeys: [] },\r\n\tupdateGeneratedColumns: UpdateGeneratedColumns,\r\n});\r\n\r\nfunction mergeArraysKeepingOrder(array1: string[], array2: string[]): string[] {\r\n\t// Create a Set from the first array for efficient lookups\r\n\tconst array1Set = new Set(array1);\r\n\r\n\t// Filter the second array to find elements not in the first array\r\n\tconst elementsToAdd = array2.filter((item) => !array1Set.has(item));\r\n\r\n\t// Combine the original first array with the new elements\r\n\treturn [...array1, ...elementsToAdd];\r\n}\r\n\r\nconst generateColumnSchema = (\r\n\tdefaultColumns: MaterialTableColumnProps[],\r\n\tschemaFields: SchemaFields[],\r\n\tcolumnOrders: string[],\r\n\tdColumns?: any[],\r\n\tt?: any\r\n): { columns: MaterialTableColumnProps[]; orderKeys: string[] } => {\r\n\ttry {\r\n\t\t// if (dColumns && dColumns?.length) {\r\n\t\t// \tdefaultColumns = defaultColumns.map((column) => {\r\n\t\t// \t\tconst f = dColumns.find((c) => c.accessorKey == column.accessorKey);\r\n\t\t// \t\treturn f || column\r\n\t\t// \t})\r\n\t\t// }\r\n\t\tif (dColumns && dColumns?.length) {\r\n\t\t\tdefaultColumns = defaultColumns.map((column) => {\r\n\t\t\t\tconst f = dColumns.find((c) => c.accessorKey == column.accessorKey);\r\n\t\t\t\tconst merged = f ? { ...column, ...f } : column;\r\n\t\t\t\treturn merged\r\n\t\t\t})\r\n\t\t}\r\n\t\tlet orderKeys = columnOrders.length\r\n\t\t\t? columnOrders\r\n\t\t\t: (defaultColumns.map((column) => column.accessorKey) as string[]);\r\n\t\tconst getAccesorKeyViaField = (field: SchemaFields) =>\r\n\t\t\t(field.type === 'object' || field?.join) ? `${field.alias}.${field.accessorKey}` : field.key;\r\n\r\n\t\t// Clean up schema fields by removing \"__replaceKey\" from the keys\r\n\t\tconst updatedFields = schemaFields.map((field) => ({\r\n\t\t\t...field,\r\n\t\t\tkey: field.key.replace('__replaceKey', '')\r\n\t\t})).filter((field) => !field.is_inner_join);\r\n\r\n\t\tconst uniqueFields = _.differenceWith(\r\n\t\t\tupdatedFields,\r\n\t\t\tupdatedFields,\r\n\t\t\t(fieldA, fieldB) => fieldA.key === fieldB?.joinKey\r\n\t\t);\r\n\r\n\t\t// Find fields in schemaFields but not in defaultColumns based on accessorKey\r\n\t\tconst unmatchedFields = _.differenceWith(\r\n\t\t\tuniqueFields,\r\n\t\t\tdefaultColumns,\r\n\t\t\t(field, column) => getAccesorKeyViaField(field) === column.accessorKey\r\n\t\t);\r\n\r\n\t\t// Map unique fields to MaterialTableColumn structure\r\n\t\tconst additionalColumns: MaterialTableColumnProps[] = unmatchedFields.map(\r\n\t\t\t(field) => ({\r\n\t\t\t\theader: t ? formatLabel(t(field?.label)?.replace('_data', '') || '') : formatLabel(field?.label?.replace('_data', '') || ''),\r\n\t\t\t\taccessorKey: getAccesorKeyViaField(field),\r\n\t\t\t\tvisible: false,\r\n\t\t\t\ttype: field?.enum ? 'status' : field.type,\r\n\t\t\t\t...(field.type === 'array' && { typeArrayAccessorKey: field.accessorKey || '' }),\r\n\t\t\t\tenableSorting: (field.type === 'array' || field.type === 'object' || field?.join) ? false : true,\r\n\t\t\t\t...(field?.type === 'boolean' ? {\r\n\t\t\t\t\ttypeBooleanLabels: field?.values?.length ? _.mapValues(_.keyBy(\r\n\t\t\t\t\t\tfield?.values.map(item => ({\r\n\t\t\t\t\t\t\tkey: item.name,\r\n\t\t\t\t\t\t\tvalue: item.label\r\n\t\t\t\t\t\t})),\r\n\t\t\t\t\t\t'key'\r\n\t\t\t\t\t), 'value') : { 0: \"Inactive\", 1: \"Active\", false: \"Inactive\", true: \"Active\" }\r\n\t\t\t\t} : {})\r\n\t\t\t})\r\n\t\t);\r\n\r\n\t\tconst updatedDefaultColumns = defaultColumns?.map((column) => {\r\n\t\t\tconst field = schemaFields.find((field) => getAccesorKeyViaField(field) === column.accessorKey);\r\n\t\t\treturn {\r\n\t\t\t\t...column,\r\n\t\t\t\t...((field?.type === 'object' || field?.joinKey || column.enableSorting === false) ? { enableSorting: false } : {})\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// Combine default columns and additional columns\r\n\t\tconst columns = [...updatedDefaultColumns, ...additionalColumns];\r\n\r\n\t\t// Generate an array of column keys for ordering\r\n\t\tconst nOrderKeys = columns.map((column) => column.accessorKey) as string[];\r\n\r\n\t\torderKeys = mergeArraysKeepingOrder(orderKeys, nOrderKeys);\r\n\r\n\t\treturn { columns, orderKeys };\r\n\t} catch (error) {\r\n\t\treturn {\r\n\t\t\tcolumns: defaultColumns,\r\n\t\t\torderKeys: defaultColumns.map((column) => column.accessorKey) as string[]\r\n\t\t};\r\n\t}\r\n};\r\n\r\nexport const PageProvider: React.FC<PageProviderProps> = ({ children, routeToColumnsMap: customRouteToColumnsMap, routeToResourceMap: customRouteToResourceMap }) => {\r\n\tconsole.log(\"🚀 ~ PageProvider ~ customRouteToResourceMap:\", customRouteToResourceMap)\r\n\tconsole.log(\"🚀 ~ PageProvider ~ customRouteToColumnsMap:\", customRouteToColumnsMap)\r\n\tconst location = useLocation();\r\n\tconst [activePage, setActivePageData] = useState<PageState>(defaultPageState);\r\n\t// const permissions=usePermissions();\r\n\tconst [schemaFields, setSchemaFields] = useState<SchemaFields[]>([]);\r\n\tconst [loading, setLoading] = useState<boolean>(true);\r\n\tconst [isSaving, setIsSaving] = useState<boolean>(false);\r\n\tconst [error, setError] = useState<string | null>(null);\r\n\tconst [pages, setPages] = useState<any>([]);\r\n\tconst [sharedPages, setSharedPages] = useState<any>([]);\r\n\tconst [isChanged, setIsChanged] = useState<boolean>(false);\r\n\tconst [pageTemplateId, setPageTemplateId] = useState<string>('');\r\n\tconst [isInitialLoad, setIsInitialLoad] = useState<boolean>(true);\r\n\tconst [isCreatePage, setIsCreatePage] = useState<boolean>(false);\r\n\tconst [formData, setFormData] = useState<any>({});\r\n\tconst [generatedColumns, setGeneratedColumns] = useState<{\r\n\t\tcolumns: MaterialTableColumnProps[];\r\n\t\torderKeys: string[];\r\n\t}>({ columns: [], orderKeys: [] });\r\n\tconst { user } = useAuth()\r\n\t// Add ref to track current pathname for race condition prevention\r\n\tconst currentPathnameRef = useRef<string>(location.pathname);\r\n\tconst curPathName = useMemo(() => location.pathname, [location.pathname])\r\n\r\n\t// Get current page's default columns and resources\r\n\tconst defaultColumns: any[] = useMemo(() => {\r\n\t\tconst columns = (customRouteToColumnsMap?.[curPathName] || routeToColumnsMap[curPathName])?.defaultColumns || [];\r\n\t\treturn columns;\r\n\t}, [curPathName, customRouteToColumnsMap]);\r\n\r\n\tconst resources: IResources = useMemo(() => {\r\n\t\tconst resource = customRouteToResourceMap?.[curPathName] || routeToResourceMap[curPathName] || null;\r\n\t\treturn resource;\r\n\t}, [curPathName, customRouteToResourceMap]);\r\n\r\n\t//Translation\r\n\tconst { t } = useTranslation()\r\n\r\n\t// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars\r\n\tconst initializeColumns = (columns: MaterialTableColumnProps[]) => {\r\n\t\t//! Remove the function if not needed\r\n\t};\r\n\r\n\t// Fetch page-related information from API\r\n\tconst fetchPageData = useCallback(\r\n\t\tasync (currentPath: string, currentDefaultColumns: any[], currentResources: IResources) => {\r\n\t\t\tconsole.log('PageContext: Entering fetchPageData', { currentPath, currentDefaultColumnsLength: currentDefaultColumns?.length, hasResources: !!currentResources });\r\n\r\n\t\t\t// Check if this request is still valid (pathname hasn't changed)\r\n\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\tconsole.log('Aborting fetchPageData - pathname changed', { ref: currentPathnameRef.current, current: currentPath });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsetLoading(true);\r\n\t\t\tsetError(null);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconsole.log('PageContext: Resources Check:', { currentDefaultColumns, currentResources });\r\n\t\t\t\tif (currentDefaultColumns.length && currentResources) {\r\n\t\t\t\t\tconst { pageResource = '', fieldResource = '', formResource = '' } = currentResources;\r\n\r\n\t\t\t\t\tconsole.log('PageContext: Pathname:', currentPath);\r\n\t\t\t\t\tconsole.log('PageContext: Default Columns:', currentDefaultColumns);\r\n\t\t\t\t\tconsole.log('PageContext: Resources:', currentResources);\r\n\r\n\t\t\t\t\t// Double-check pathname hasn't changed before making API calls\r\n\t\t\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst [pageResponse, fieldResponse, formResponse] = await Promise.all([\r\n\t\t\t\t\t\tpageResource ? getV1PagesResource({ ...getToken(), resource: pageResource }) : Promise.resolve(null),\r\n\r\n\t\t\t\t\t\tgetV1FormBuilderSchemaFieldsName({\r\n\t\t\t\t\t\t\tname: fieldResource,\r\n\t\t\t\t\t\t\t...getToken(),\r\n\t\t\t\t\t\t\tskip: 0,\r\n\t\t\t\t\t\t\tlimit: 999\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t\tgetV1FormBuilder({\r\n\t\t\t\t\t\t\t...getToken(),\r\n\t\t\t\t\t\t\tfilters: `(resource.eq=${formResource}&company_id.eq=${user?.company_id})`,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t]);\r\n\r\n\t\t\t\t\tconsole.log('PageContext: API Responses:', { pageResponse, fieldResponse, formResponse });\r\n\r\n\t\t\t\t\t// Final check - ensure pathname still matches\r\n\t\t\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\t\t\tconsole.log('Aborting fetchPageData - pathname changed after API call');\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst fields = fieldResponse?.data?.fields?.map(f => ({ ...f, label: !f?.label?.trim() ? formatLabel(f.key) : f.label }));\r\n\r\n\t\t\t\t\tconst gColumns = generateColumnSchema(currentDefaultColumns, fields, [], [], t);\r\n\t\t\t\t\tconsole.log('PageContext: Generated Columns:', gColumns);\r\n\r\n\t\t\t\t\tconst pages =\r\n\t\t\t\t\t\tpageResponse?.data?.pages?.map((p) => ({\r\n\t\t\t\t\t\t\t...defaultPageState,\r\n\t\t\t\t\t\t\t...p,\r\n\t\t\t\t\t\t\tvisible_columns: generateColumnSchema(\r\n\t\t\t\t\t\t\t\tp.visible_columns?.length ? p.visible_columns : currentDefaultColumns,\r\n\t\t\t\t\t\t\t\tfields,\r\n\t\t\t\t\t\t\t\tp.column_order || [],\r\n\t\t\t\t\t\t\t\tcurrentDefaultColumns,\r\n\t\t\t\t\t\t\t\tt\r\n\t\t\t\t\t\t\t).columns,\r\n\t\t\t\t\t\t\tcolumn_order: mergeArraysKeepingOrder(\r\n\t\t\t\t\t\t\t\tp.column_order || [],\r\n\t\t\t\t\t\t\t\t_.uniq(gColumns.orderKeys)\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t})) || [];\r\n\t\t\t\t\tconst sharedPages =\r\n\t\t\t\t\t\tpageResponse?.data?.shared_pages?.map((sPages) => ({\r\n\t\t\t\t\t\t\t...sPages.details,\r\n\t\t\t\t\t\t\tisShared: true,\r\n\t\t\t\t\t\t\towner: sPages.owner,\r\n\t\t\t\t\t\t\t_id: sPages.id\r\n\t\t\t\t\t\t})) || [];\r\n\r\n\t\t\t\t\tconst uPages = [...pages, ...sharedPages];\r\n\r\n\t\t\t\t\t// Only update state if we're still on the same path\r\n\t\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\t\tawait Promise.all([\r\n\t\t\t\t\t\t\tsetSchemaFields(fields),\r\n\t\t\t\t\t\t\tsetGeneratedColumns(gColumns),\r\n\t\t\t\t\t\t\tsetPageTemplateId(pageResponse?.data?._id),\r\n\t\t\t\t\t\t\tsetSharedPages(sharedPages),\r\n\t\t\t\t\t\t\tsetPages(uPages || []),\r\n\t\t\t\t\t\t\tsetFormData(formResponse?.data?.form?.[0] || {}),\r\n\t\t\t\t\t\t\tsetActivePageData((prev) => ({\r\n\t\t\t\t\t\t\t\t...prev,\r\n\t\t\t\t\t\t\t\t...(pages?.[0] || {}) // Merge API response with current state\r\n\t\t\t\t\t\t\t}))\r\n\t\t\t\t\t\t]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\t// Only set error if we're still on the same path\r\n\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\tsetError('Failed to load page data');\r\n\t\t\t\t}\r\n\t\t\t} finally {\r\n\t\t\t\t// Only update loading state if we're still on the same path\r\n\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t\t}, 1000);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t//eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t[] // Remove dependencies to prevent stale closures\r\n\t);\r\n\r\n\t// Update page state dynamically\r\n\tconst updatePageInfo = (updates: Partial<PageState>) => {\r\n\t\tsetActivePageData((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\t...updates\r\n\t\t}));\r\n\t\t!isInitialLoad && setIsChanged(true)\r\n\t\tsetIsInitialLoad(false)\r\n\t};\r\n\r\n\t// Update columns state dynamically\r\n\tconst updateGeneratedColumns = (updates: Partial<GeneratedColumnsState>) => {\r\n\t\tsetGeneratedColumns((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\t...updates\r\n\t\t}));\r\n\t};\r\n\r\n\tconst setActivePage = (page: PageState) => {\r\n\t\tconst uPages = pages.map((p) =>\r\n\t\t\tp._id == activePage?._id ? activePage : p\r\n\t\t);\r\n\t\tsetPages(uPages);\r\n\t\tsetActivePageData(page);\r\n\t};\r\n\r\n\tconst savePages = async () => {\r\n\t\tsetError(null);\r\n\t\tsetIsSaving(true);\r\n\t\tawait addOrDeletePage()\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetIsSaving(false);\r\n\t\t}, 1000);\r\n\t};\r\n\tconst fetchSavedFilters = async (): Promise<void> => {\r\n\r\n\t\tawait getV1FilterResource({ ...getToken(), resource: resources?.pageResource || resources?.fieldResource })\r\n\r\n\t};\r\n\r\n\tconst addOrDeletePage = async (restPages?: any[]) => {\r\n\t\ttry {\r\n\t\t\tconst filteredPages = restPages?.length ? restPages : pages.filter((page) => !page.isShared);\r\n\t\t\tconst uPages = filteredPages.map((p) =>\r\n\t\t\t\t(p._id == activePage?._id && activePage.name == p.name) ? activePage : p\r\n\t\t\t);\r\n\t\t\tconst sanitizedPages = removeIdStaticIdsFromMongoObject(uPages);\r\n\r\n\t\t\tconst response = await patchV1PagesPageId({\r\n\t\t\t\t...getToken(),\r\n\t\t\t\t...{ page_id: pageTemplateId, pages: sanitizedPages }\r\n\t\t\t});\r\n\t\t\tif (response.status_code === 200) {\r\n\t\t\t\tconst updatedPages = response?.data?.pages || [];\r\n\t\t\t\tsetPages(updatedPages);\r\n\t\t\t\tfetchSavedFilters();\r\n\t\t\t\tsetActivePageData((prev) => ({\r\n\t\t\t\t\t...prev,\r\n\t\t\t\t\t...(updatedPages.find((p) => p.name == prev.name) || {})\r\n\t\t\t\t}));\r\n\t\t\t\tsetIsChanged(false);\r\n\t\t\t\tsetIsCreatePage(false);\r\n\t\t\t\tsetFormData(response?.data?.form?.[0] || {});\r\n\t\t\t\tconst msg = restPages?.length ? t('pages.msg.delete') : t('pages.msg.save')\r\n\t\t\t\tenqueueSnackbar(msg);\r\n\t\t\t}\r\n\t\t\treturn response\r\n\t\t} catch (err) {\r\n\t\t\tsetError('Failed to save page data');\r\n\t\t}\r\n\t}\r\n\r\n\tconst deletePage = async (pages: string) => {\r\n\t\taddOrDeletePage(pages);\r\n\t}\r\n\r\n\t// Handle pathname changes\r\n\tuseEffect(() => {\r\n\t\t// Update the ref immediately\r\n\t\tcurrentPathnameRef.current = curPathName;\r\n\r\n\t\t// Reset state for new page\r\n\t\tsetLoading(true);\r\n\t\tsetIsSaving(false);\r\n\t\tsetActivePageData(defaultPageState);\r\n\t\tsetIsChanged(false);\r\n\t\tsetIsInitialLoad(true);\r\n\r\n\t\t// Clear previous data to prevent showing stale data\r\n\t\tsetSchemaFields([]);\r\n\t\tsetGeneratedColumns({ columns: [], orderKeys: [] });\r\n\t\tsetPages([]);\r\n\t\tsetSharedPages([]);\r\n\t\tsetPageTemplateId('');\r\n\t\tsetError(null);\r\n\r\n\t\t// Fetch data for new page with current values\r\n\t\tconsole.log('PageContext: useEffect Triggered', { curPathName, defaultColumnsLength: defaultColumns?.length, hasResources: !!resources });\r\n\t\tfetchPageData(curPathName, defaultColumns, resources);\r\n\r\n\t\treturn () => { setLoading(true) }\r\n\t\t//eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [curPathName, JSON.stringify(defaultColumns), JSON.stringify(resources)]); // Remove other dependencies to prevent issues\r\n\r\n\r\n\t// Removed loading check to prevent blank page during loading\r\n\tif ((loading || curPathName != currentPathnameRef.current) && resources) {\r\n\t\treturn <ErpLoader />; // Show loader before rendering anything else\r\n\t}\r\n\r\n\tif ((loading || curPathName != currentPathnameRef.current) && resources) {\r\n\t\treturn <ErpLoader />; // Show loader before rendering anything else\r\n\t}\r\n\r\n\treturn (\r\n\t\t<PageContext.Provider\r\n\t\t\tvalue={{\r\n\t\t\t\tpageTemplateId,\r\n\t\t\t\tactivePage,\r\n\t\t\t\tpages,\r\n\t\t\t\tsharedPages,\r\n\t\t\t\tschemaFields,\r\n\t\t\t\tsetPages,\r\n\t\t\t\tupdatePageInfo,\r\n\t\t\t\tsavePages,\r\n\t\t\t\tsetActivePage,\r\n\t\t\t\tisSaving,\r\n\t\t\t\tloading,\r\n\t\t\t\terror,\r\n\t\t\t\tinitializeColumns,\r\n\t\t\t\tgeneratedColumns,\r\n\t\t\t\tupdateGeneratedColumns,\r\n\t\t\t\tisChanged,\r\n\t\t\t\tdeletePage,\r\n\t\t\t\tisCreatePage,\r\n\t\t\t\tsetIsCreatePage,\r\n\t\t\t\taddOrDeletePage,\r\n\t\t\t\tsetIsChanged,\r\n\t\t\t\tformData\r\n\t\t\t}}>\r\n\t\t\t{children}\r\n\t\t</PageContext.Provider>\r\n\t);\r\n};\r\n"],"names":["formatLabel","createContext","useAppSelector","useState","useEffect","useMemo","styled","CircularProgress","jsx","Box","field","useLocation","useAuth","useRef","routeToColumnsMap","routeToResourceMap","useTranslation","useCallback","getV1PagesResource","getToken","getV1FormBuilderSchemaFieldsName","getV1FormBuilder","_a","pages","sharedPages","getV1FilterResource","removeIdStaticIdsFromMongoObject","patchV1PagesPageId","enqueueSnackbar"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"page-context-BG7UpJiv.esm.js","sources":["../../src/utils/format-permissions.ts","../../src/contexts/permission-context.tsx","../../src/components/loaders/erp-loader.tsx","../../src/contexts/page-context.tsx"],"sourcesContent":["import { formatLabel } from \"./format-text\";\r\n\r\nexport interface HrmsPermissionNode {\r\n canView?: boolean; // r + :nop\r\n canViewById?: boolean; // r + :param (plain)\r\n canAdd?: boolean; // w\r\n canEdit?: boolean; // u / e + :param (plain)\r\n canDelete?: boolean; // d\r\n /**\r\n * Dynamic action map for any compound operation path.\r\n * Key = camelCase of the named segments extracted from the operation.\r\n *\r\n * Examples:\r\n * \":param/status\" → actions.status\r\n * \":param/send\" → actions.send\r\n * \":param/contracts/:param_id\" → actions.contracts\r\n * \":param/documents/:param_id/verify\" → actions.documentsVerify\r\n * \"public/welcome/:param/reject\" → stored on sub-node \"publicWelcome\".actions.reject\r\n * \"public/welcome/:param/accept\" → stored on sub-node \"publicWelcome\".actions.accept\r\n */\r\n actions?: Record<string, boolean>;\r\n [subRoute: string]: HrmsPermissionNode | boolean | Record<string, boolean> | undefined;\r\n}\r\n\r\nexport type HrmsPermissionTree = Record<string, HrmsPermissionNode>;\r\n\r\n// ─── Constants ────────────────────────────────────────────────────────────────\r\n\r\n// Only process entries belonging to this module\r\nconst ALLOWED_MODULES = ['hrms'] as const;\r\n\r\n// Maps BE short keys → FE permission flags for plain CRUD operations.\r\n// Only `:nop` and `:param` (no action suffix) are handled here.\r\n// Compound operations (with named action segments) bypass this map and go to node.actions.\r\nconst HRMS_CRUD_FLAG_MAP: Record<string, Record<':nop' | ':param', keyof HrmsPermissionNode>> = {\r\n r: { ':nop': 'canView', ':param': 'canViewById' },\r\n w: { ':nop': 'canAdd', ':param': 'canAdd' },\r\n u: { ':nop': 'canEdit', ':param': 'canEdit' },\r\n d: { ':nop': 'canDelete', ':param': 'canDelete' },\r\n e: { ':nop': 'canEdit', ':param': 'canEdit' },\r\n};\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\n/** \"active-loans\" → \"activeloans\", \"my-approvals\" → \"myapprovals\" */\r\nfunction toCamelCase(str: string): string {\r\n return str\r\n .replace(/[^a-zA-Z0-9\\s-]/g, ' ')\r\n .split(/[-\\s]+/)\r\n .filter(Boolean)\r\n .join('');\r\n}\r\n\r\n/**\r\n * Joins multiple camelCase parts into a single camelCase string.\r\n * [\"documents\", \"verify\"] → \"documentsVerify\"\r\n * [\"public\", \"welcome\"] → \"publicWelcome\"\r\n */\r\nfunction joinCamelParts(parts: string[]): string {\r\n return parts\r\n .map((p, i) => i === 0 ? p : p.charAt(0).toUpperCase() + p.slice(1))\r\n .join('');\r\n}\r\n\r\n/**\r\n * Checks whether a path segment is a parameter placeholder.\r\n * Matches \":param\", \":id\", \":param_id\", \":nop\", etc.\r\n */\r\nfunction isParamSegment(seg: string): boolean {\r\n return seg.startsWith(':');\r\n}\r\n\r\n// ─── Operation Resolver ───────────────────────────────────────────────────────\r\n\r\ninterface ResolvedOperation {\r\n /**\r\n * camelCase key of the named sub-route (null = write to root node).\r\n * e.g. \"active-loans\" → \"activeloans\"\r\n * \"public/welcome\" → \"publicWelcome\"\r\n */\r\n subRoute: string | null;\r\n\r\n /**\r\n * camelCase key of the specific action within the node (null = plain CRUD).\r\n * Populated when named segments appear *after* a param segment.\r\n * e.g. \":param/status\" → \"status\"\r\n * \":param/documents/:param_id/verify\" → \"documentsVerify\"\r\n * \"public/welcome/:param/reject\" → \"reject\" (sub-route = \"publicWelcome\")\r\n */\r\n action: string | null;\r\n\r\n /**\r\n * Whether a :param placeholder exists anywhere in the operation.\r\n * Determines canView vs canViewById for plain CRUD sub-route access.\r\n */\r\n hasParam: boolean;\r\n}\r\n\r\n/**\r\n * Generic operation parser — no hardcoded action names.\r\n *\r\n * Algorithm:\r\n * 1. Split operation by \"/\".\r\n * 2. Walk segments left-to-right, collecting:\r\n * - \"leading named\" segments (before the first param) → subRoute\r\n * - \"trailing named\" segments (after the first param) → action\r\n * 3. A pure \":nop\" / \":param\" operation has no named segments → plain CRUD.\r\n */\r\nfunction resolveOperation(operation: string): ResolvedOperation {\r\n if (!operation || operation === ':nop') {\r\n return { subRoute: null, action: null, hasParam: false };\r\n }\r\n\r\n const segments = operation.split('/');\r\n const leadingNamed: string[] = []; // named segs before first param\r\n const trailingNamed: string[] = []; // named segs after first param\r\n let passedParam = false;\r\n let hasParam = false;\r\n\r\n for (const seg of segments) {\r\n if (isParamSegment(seg)) {\r\n passedParam = true;\r\n hasParam = true;\r\n } else {\r\n const part = toCamelCase(seg);\r\n if (part) {\r\n if (!passedParam) {\r\n leadingNamed.push(part);\r\n } else {\r\n trailingNamed.push(part);\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Pure :param (no named segments at all) → plain CRUD\r\n if (leadingNamed.length === 0 && trailingNamed.length === 0) {\r\n return { subRoute: null, action: null, hasParam };\r\n }\r\n\r\n const subRoute = leadingNamed.length > 0\r\n ? joinCamelParts(leadingNamed)\r\n : null;\r\n\r\n const action = trailingNamed.length > 0\r\n ? joinCamelParts(trailingNamed)\r\n : null;\r\n\r\n return { subRoute, action, hasParam };\r\n}\r\n\r\n// ─── Tree Builder ─────────────────────────────────────────────────────────────\r\n\r\nexport function buildHrmsPermissionTree(raw: Record<string, any>): HrmsPermissionTree {\r\n const tree: HrmsPermissionTree = {};\r\n if(!raw){\r\n return tree;\r\n }\r\n for (const [rawModuleKey, crudBlock] of Object.entries(raw)) {\r\n\r\n // ── Step 1: normalise raw key → camelCase module name ──────────────────\r\n // \"loan-allotments\" → \"loanAllotments\"\r\n const formattedModule = formatLabel(\r\n rawModuleKey\r\n .split('/')[0] // strip path suffix e.g. \"/-p\"\r\n .replace(/p$/gi, \"\") // strip trailing p\r\n .replace(/-p-/gi, \"-\") // strip -p- infix\r\n .replace(/-+$/g, \"\") // clean leftover trailing dashes\r\n ).replace(/[^a-zA-Z0-9]/gi, \"\"); // strip non-alphanumeric\r\n\r\n // ── Step 2: split on capital letters ──────────────────────────────────\r\n // \"loanAllotments\" → moduleKey: \"loanAllotments\", moduleSubName: \"\"\r\n // \"loanAllotmentsMy\"→ moduleKey: \"loanAllotments\", moduleSubName: \"My\"\r\n const parts = formattedModule.split(/(?=[A-Z])/);\r\n const moduleKey = parts.slice(0, 2).join(\"\");\r\n const moduleSubName = parts.slice(2).join(\"\");\r\n\r\n if (!tree[moduleKey]) tree[moduleKey] = {};\r\n if (!crudBlock || typeof crudBlock !== 'object') continue;\r\n\r\n for (const [shortKey, entries] of Object.entries(crudBlock)) {\r\n const flagMap = HRMS_CRUD_FLAG_MAP[shortKey];\r\n if (!flagMap) continue;\r\n\r\n const list: any[] = Array.isArray(entries)\r\n ? entries\r\n : [{ ...entries, identity: null }];\r\n\r\n for (const entry of list) {\r\n // ── Filter: only process hrms module entries ────────────────────\r\n const entryModule = entry?.identity?.module;\r\n if (entryModule && !ALLOWED_MODULES.includes(entryModule)) continue;\r\n\r\n const operation = entry?.identity?.operation ?? ':nop';\r\n\r\n // ── Step 3: parse operation generically ────────────────────────\r\n const { subRoute, action, hasParam } = resolveOperation(operation);\r\n\r\n // ── Step 4: resolve target node ────────────────────────────────\r\n let targetNode: HrmsPermissionNode;\r\n\r\n if (moduleSubName) {\r\n if (!(tree[moduleKey] as any)[moduleSubName]) {\r\n (tree[moduleKey] as any)[moduleSubName] = {} as HrmsPermissionNode;\r\n }\r\n const subNameNode = (tree[moduleKey] as any)[moduleSubName] as any;\r\n\r\n // ── FIX: if operation also has a subRoute, nest inside moduleSubName ──\r\n if (subRoute) {\r\n const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);\r\n if (!subNameNode[subKey]) subNameNode[subKey] = {} as HrmsPermissionNode;\r\n targetNode = subNameNode[subKey] as HrmsPermissionNode;\r\n } else {\r\n targetNode = subNameNode;\r\n }\r\n\r\n } else if (subRoute) {\r\n const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);\r\n if (!(tree[moduleKey] as any)[subKey]) {\r\n (tree[moduleKey] as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n targetNode = (tree[moduleKey] as any)[subKey] as HrmsPermissionNode;\r\n\r\n } else {\r\n targetNode = tree[moduleKey];\r\n }\r\n\r\n // ── Step 5: write permission into target node ───────────────────\r\n if (action) {\r\n // Compound operation with a named action suffix → generic actions map.\r\n // No flag enumeration needed — the action name IS the key.\r\n // e.g. \":param/status\" → node.actions.status\r\n // e.g. \":param/documents/:param_id/verify\" → node.actions.documentsVerify\r\n // e.g. \"public/welcome/:param/reject\" → subNode.actions.reject\r\n if (!targetNode.actions) targetNode.actions = {};\r\n targetNode.actions[action] = true;\r\n\r\n } else {\r\n // Plain CRUD operation → map to well-known flag\r\n const opKey: ':nop' | ':param' = hasParam ? ':param' : ':nop';\r\n const flag = flagMap[opKey];\r\n if (!flag) continue;\r\n targetNode[flag] = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return tree;\r\n}\r\n","/* eslint-disable react-refresh/only-export-components */\r\nimport React, { createContext, useEffect, useMemo, ReactNode, useState } from \"react\";\r\nimport { formatLabel } from \"../utils/format-text\";\r\nimport { useAppSelector } from \"../redux/hooks\";\r\nimport { buildHrmsPermissionTree } from \"../utils/format-permissions\";\r\n\r\n// Define the types for permissions\r\ntype PermissionActions = \"canEdit\" | \"canView\" | \"canAdd\" | \"canDelete\" | \"canAddForOthers\";\r\ntype SubModulePermissions = Partial<Record<PermissionActions, boolean>>;\r\ntype ModulePermissions = SubModulePermissions & Record<string, SubModulePermissions>;\r\n\r\nexport interface PermissionsContextType {\r\n [module: string]: ModulePermissions;\r\n}\r\n\r\ninterface PermissionsProviderProps {\r\n children: ReactNode;\r\n}\r\n\r\n// Create a context with a default value\r\nexport const PermissionsContext = createContext<PermissionsContextType | null>(null);\r\n\r\nconst ROLE_PERMISSION_STORAGE_KEY = \"role-permission\";\r\nconst parseStoredPermissions = (rawValue: string | null): Record<string, any> => {\r\n if (!rawValue) {\r\n return {};\r\n }\r\n\r\n try {\r\n const parsedPermissions = JSON.parse(rawValue);\r\n return parsedPermissions;\r\n } catch (error) {\r\n localStorage.removeItem(ROLE_PERMISSION_STORAGE_KEY);\r\n return {};\r\n }\r\n};\r\n\r\nexport const PermissionsProvider: React.FC<PermissionsProviderProps> = ({ children }) => {\r\n const { setIsPermissionLoaded = false } = useAppSelector(\r\n (store) => store.roles ?? {}\r\n );\r\n\r\n const [storagePermission, setStoragePermission] = useState<string | null>(() => {\r\n if (typeof window === \"undefined\") {\r\n return null;\r\n }\r\n return window.localStorage.getItem(ROLE_PERMISSION_STORAGE_KEY);\r\n });\r\n\r\n useEffect(() => {\r\n if (typeof window === \"undefined\") {\r\n return;\r\n }\r\n\r\n const syncPermissions = () => {\r\n const latestPermission = window.localStorage.getItem(ROLE_PERMISSION_STORAGE_KEY);\r\n setStoragePermission(latestPermission);\r\n };\r\n\r\n const handleStorageChange = (event: StorageEvent) => {\r\n if (!event.key || event.key === ROLE_PERMISSION_STORAGE_KEY) {\r\n syncPermissions();\r\n }\r\n };\r\n\r\n syncPermissions();\r\n window.addEventListener(\"storage\", handleStorageChange);\r\n window.addEventListener(\"role-permission-changed\", syncPermissions);\r\n\r\n return () => {\r\n window.removeEventListener(\"storage\", handleStorageChange);\r\n window.removeEventListener(\"role-permission-changed\", syncPermissions);\r\n };\r\n }, []);\r\n\r\n const permissions: Record<string, any> = useMemo(() => {\r\n return parseStoredPermissions(storagePermission);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [setIsPermissionLoaded, storagePermission]);\r\n \r\n const computedPermissions = useMemo(() => {\r\n return buildHrmsPermissionTree(permissions);\r\n }, [permissions]);\r\n\r\n return (\r\n <PermissionsContext.Provider value={computedPermissions}>\r\n {children}\r\n </PermissionsContext.Provider>\r\n );\r\n};\r\n","import React from \"react\"\r\nimport { Box, CircularProgress, CircularProgressProps } from '@mui/material';\r\nimport { styled } from '@mui/material/styles';\r\n\r\nconst Loader = styled(CircularProgress)(({theme})=>({\r\n color: theme.palette?.theme?.primary[500]||\"#1976d2\"\r\n}))\r\n\r\nconst ErpLoader = (props:CircularProgressProps) => {\r\n\treturn <Box position=\"fixed\" left='50%' top=\"50%\">\r\n <Loader size={50} {...props}/>\r\n </Box>\r\n};\r\n\r\nexport { ErpLoader };\r\nexport default ErpLoader;\r\n","/* eslint-disable react-refresh/only-export-components */\r\n/* eslint-disable no-mixed-spaces-and-tabs */\r\n\r\nimport React, { createContext, useCallback, useEffect, useMemo, useState, useRef } from 'react';\r\nimport { useLocation } from 'react-router-dom';\r\nimport {\r\n\tgetV1FilterResource,\r\n\tgetV1FormBuilder,\r\n\tgetV1FormBuilderSchemaFieldsName,\r\n\tgetV1PagesResource,\r\n\tpatchV1PagesPageId\r\n} from '../api-client/api.system-feature/api';\r\nimport { IResources, routeToColumnsMap, routeToResourceMap } from '../constants/route-page-map'; // Removed - should be passed as props or configured by consuming app\r\nimport { getToken } from '../utils/common';\r\nimport { removeIdStaticIdsFromMongoObject } from '../utils/common';\r\nimport { RuleGroupType } from 'react-querybuilder';\r\nimport { MaterialTableColumnProps } from '../components/material-table/material-table';\r\nimport _ from 'lodash';\r\nimport { formatLabel } from '../utils/format-text';\r\nimport ErpLoader from '../components/loaders/erp-loader';\r\nimport { enqueueSnackbar } from 'notistack';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useAuth } from '../hooks/useAuth';\r\n// import { usePermissions } from '../hooks/use-permissions';\r\n\r\n/* Interfaces and types */\r\nexport type ViewType = 'Table' | 'Grid' | 'Kanban' | 'Calendar' | 'Gantt' | '';\r\n\r\ninterface SchemaFields {\r\n\tselect: string;\r\n\talias: string;\r\n\ttype: string;\r\n\tfilter_type?: string;\r\n\tfilter_name?: string;\r\n\trequired?: boolean;\r\n\tisOrderAllowed?: boolean;\r\n\tisDefault?: boolean;\r\n\tisFilterAllowed?: boolean;\r\n\tlabel?: string;\r\n\tkey: string;\r\n\taccessorKey?: string;\r\n\tjoinKey?: string;\r\n\tenum?: string | string[];\r\n}\r\nexport interface SavedViewType {\r\n\tlabel: ViewType;\r\n\tposition: number;\r\n}\r\nexport interface PageState {\r\n\t_id: string | number;\r\n\tname: string;\r\n\tpage_size: number;\r\n\tcolumn_order: string[];\r\n\tvisible_columns: MaterialTableColumnProps[];\r\n\tviews: SavedViewType[];\r\n\tactive_view: ViewType;\r\n\tfilters: RuleGroupType;\r\n\tfilterQueryString: string;\r\n\tsort: Record<any, any> | null;\r\n\tsearch: string;\r\n\tenabled_views: ViewType[];\r\n\tisShared: boolean;\r\n\tcolumn_sizes: Record<string, number>;\r\n}\r\n\r\nexport interface GeneratedColumnsState {\r\n\tcolumns: MaterialTableColumnProps[];\r\n\torderKeys: string[];\r\n}\r\n\r\nexport const initialFilter: RuleGroupType = { combinator: 'and', rules: [] };\r\n\r\ninterface PageContextValue {\r\n\tpageTemplateId: string;\r\n\tactivePage: PageState;\r\n\tupdatePageInfo: (updates: Partial<PageState>) => void;\r\n\tloading: boolean;\r\n\tisSaving: boolean;\r\n\terror: string | null;\r\n\tpages: any[];\r\n\tsavePages: () => void;\r\n\tsetActivePage: (data: any) => void;\r\n\tsetPages: React.Dispatch<any>;\r\n\tschemaFields: SchemaFields[];\r\n\tinitializeColumns: (columns: MaterialTableColumnProps[]) => void;\r\n\tgeneratedColumns: GeneratedColumnsState;\r\n\tsharedPages: any[];\r\n\tupdateGeneratedColumns: (updates: Partial<GeneratedColumnsState>) => void;\r\n\tformData: Record<string, any>\r\n\tsetFormData: (data: Record<string, any>) => void\r\n}\r\n\r\nexport const defaultPageState: PageState = {\r\n\t_id: '',\r\n\tname: '',\r\n\tpage_size: 10,\r\n\tcolumn_order: ['id'],\r\n\tvisible_columns: [],\r\n\tviews: [],\r\n\tactive_view: '',\r\n\tfilters: initialFilter,\r\n\tfilterQueryString: '',\r\n\tsort: null,\r\n\tsearch: '',\r\n\tenabled_views: ['Table', 'Grid', 'Kanban', 'Calendar', 'Gantt'],\r\n\tisShared: false,\r\n\tcolumn_sizes: {}\r\n};\r\ninterface PageProviderProps {\r\n\tchildren: React.ReactNode;\r\n\trouteToColumnsMap?: Record<string, any>;\r\n\trouteToResourceMap?: Record<string, any>;\r\n}\r\n\r\nconst UpdatePageInfo = () => { };\r\nconst UpdateGeneratedColumns = () => { };\r\n\r\nexport const PageContext = createContext<PageContextValue>({\r\n\tpageTemplateId: '',\r\n\tactivePage: defaultPageState,\r\n\tupdatePageInfo: UpdatePageInfo,\r\n\tloading: false,\r\n\tisSaving: false,\r\n\terror: null,\r\n\tpages: [],\r\n\tsharedPages: [],\r\n\tsavePages: () => { },\r\n\tsetActivePage: () => { },\r\n\tsetPages: () => { },\r\n\tschemaFields: [],\r\n\tinitializeColumns: () => { },\r\n\tgeneratedColumns: { columns: [], orderKeys: [] },\r\n\tupdateGeneratedColumns: UpdateGeneratedColumns,\r\n});\r\n\r\nfunction mergeArraysKeepingOrder(array1: string[], array2: string[]): string[] {\r\n\t// Create a Set from the first array for efficient lookups\r\n\tconst array1Set = new Set(array1);\r\n\r\n\t// Filter the second array to find elements not in the first array\r\n\tconst elementsToAdd = array2.filter((item) => !array1Set.has(item));\r\n\r\n\t// Combine the original first array with the new elements\r\n\treturn [...array1, ...elementsToAdd];\r\n}\r\n\r\nconst generateColumnSchema = (\r\n\tdefaultColumns: MaterialTableColumnProps[],\r\n\tschemaFields: SchemaFields[],\r\n\tcolumnOrders: string[],\r\n\tdColumns?: any[],\r\n\tt?: any\r\n): { columns: MaterialTableColumnProps[]; orderKeys: string[] } => {\r\n\ttry {\r\n\t\t// if (dColumns && dColumns?.length) {\r\n\t\t// \tdefaultColumns = defaultColumns.map((column) => {\r\n\t\t// \t\tconst f = dColumns.find((c) => c.accessorKey == column.accessorKey);\r\n\t\t// \t\treturn f || column\r\n\t\t// \t})\r\n\t\t// }\r\n\t\tif (dColumns && dColumns?.length) {\r\n\t\t\tdefaultColumns = defaultColumns.map((column) => {\r\n\t\t\t\tconst f = dColumns.find((c) => c.accessorKey == column.accessorKey);\r\n\t\t\t\tconst merged = f ? { ...column, ...f } : column;\r\n\t\t\t\treturn merged\r\n\t\t\t})\r\n\t\t}\r\n\t\tlet orderKeys = columnOrders.length\r\n\t\t\t? columnOrders\r\n\t\t\t: (defaultColumns.map((column) => column.accessorKey) as string[]);\r\n\t\tconst getAccesorKeyViaField = (field: SchemaFields) =>\r\n\t\t\t(field.type === 'object' || field?.join) ? `${field.alias}.${field.accessorKey}` : field.key;\r\n\r\n\t\t// Clean up schema fields by removing \"__replaceKey\" from the keys\r\n\t\tconst updatedFields = schemaFields.map((field) => ({\r\n\t\t\t...field,\r\n\t\t\tkey: field.key.replace('__replaceKey', '')\r\n\t\t})).filter((field) => !field.is_inner_join);\r\n\r\n\t\tconst uniqueFields = _.differenceWith(\r\n\t\t\tupdatedFields,\r\n\t\t\tupdatedFields,\r\n\t\t\t(fieldA, fieldB) => fieldA.key === fieldB?.joinKey\r\n\t\t);\r\n\r\n\t\t// Find fields in schemaFields but not in defaultColumns based on accessorKey\r\n\t\tconst unmatchedFields = _.differenceWith(\r\n\t\t\tuniqueFields,\r\n\t\t\tdefaultColumns,\r\n\t\t\t(field, column) => getAccesorKeyViaField(field) === column.accessorKey\r\n\t\t);\r\n\r\n\t\t// Map unique fields to MaterialTableColumn structure\r\n\t\tconst additionalColumns: MaterialTableColumnProps[] = unmatchedFields.map(\r\n\t\t\t(field) => ({\r\n\t\t\t\theader: t ? formatLabel(t(field?.label)?.replace('_data', '') || '') : formatLabel(field?.label?.replace('_data', '') || ''),\r\n\t\t\t\taccessorKey: getAccesorKeyViaField(field),\r\n\t\t\t\tvisible: false,\r\n\t\t\t\ttype: field?.enum ? 'status' : field.type,\r\n\t\t\t\t...(field.type === 'array' && { typeArrayAccessorKey: field.accessorKey || '' }),\r\n\t\t\t\tenableSorting: (field.type === 'array' || field.type === 'object' || field?.join) ? false : true,\r\n\t\t\t\t...(field?.type === 'boolean' ? {\r\n\t\t\t\t\ttypeBooleanLabels: field?.values?.length ? _.mapValues(_.keyBy(\r\n\t\t\t\t\t\tfield?.values.map(item => ({\r\n\t\t\t\t\t\t\tkey: item.name,\r\n\t\t\t\t\t\t\tvalue: item.label\r\n\t\t\t\t\t\t})),\r\n\t\t\t\t\t\t'key'\r\n\t\t\t\t\t), 'value') : { 0: \"Inactive\", 1: \"Active\", false: \"Inactive\", true: \"Active\" }\r\n\t\t\t\t} : {})\r\n\t\t\t})\r\n\t\t);\r\n\r\n\t\tconst updatedDefaultColumns = defaultColumns?.map((column) => {\r\n\t\t\tconst field = schemaFields.find((field) => getAccesorKeyViaField(field) === column.accessorKey);\r\n\t\t\treturn {\r\n\t\t\t\t...column,\r\n\t\t\t\t...((field?.type === 'object' || field?.joinKey || column.enableSorting === false) ? { enableSorting: false } : {})\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// Combine default columns and additional columns\r\n\t\tconst columns = [...updatedDefaultColumns, ...additionalColumns];\r\n\r\n\t\t// Generate an array of column keys for ordering\r\n\t\tconst nOrderKeys = columns.map((column) => column.accessorKey) as string[];\r\n\r\n\t\torderKeys = mergeArraysKeepingOrder(orderKeys, nOrderKeys);\r\n\r\n\t\treturn { columns, orderKeys };\r\n\t} catch (error) {\r\n\t\treturn {\r\n\t\t\tcolumns: defaultColumns,\r\n\t\t\torderKeys: defaultColumns.map((column) => column.accessorKey) as string[]\r\n\t\t};\r\n\t}\r\n};\r\n\r\nexport const PageProvider: React.FC<PageProviderProps> = ({ children, routeToColumnsMap: customRouteToColumnsMap, routeToResourceMap: customRouteToResourceMap }) => {\r\n\tconsole.log(\"🚀 ~ PageProvider ~ customRouteToResourceMap:\", customRouteToResourceMap)\r\n\tconsole.log(\"🚀 ~ PageProvider ~ customRouteToColumnsMap:\", customRouteToColumnsMap)\r\n\tconst location = useLocation();\r\n\tconst [activePage, setActivePageData] = useState<PageState>(defaultPageState);\r\n\t// const permissions=usePermissions();\r\n\tconst [schemaFields, setSchemaFields] = useState<SchemaFields[]>([]);\r\n\tconst [loading, setLoading] = useState<boolean>(true);\r\n\tconst [isSaving, setIsSaving] = useState<boolean>(false);\r\n\tconst [error, setError] = useState<string | null>(null);\r\n\tconst [pages, setPages] = useState<any>([]);\r\n\tconst [sharedPages, setSharedPages] = useState<any>([]);\r\n\tconst [isChanged, setIsChanged] = useState<boolean>(false);\r\n\tconst [pageTemplateId, setPageTemplateId] = useState<string>('');\r\n\tconst [isInitialLoad, setIsInitialLoad] = useState<boolean>(true);\r\n\tconst [isCreatePage, setIsCreatePage] = useState<boolean>(false);\r\n\tconst [formData, setFormData] = useState<any>({});\r\n\tconst [generatedColumns, setGeneratedColumns] = useState<{\r\n\t\tcolumns: MaterialTableColumnProps[];\r\n\t\torderKeys: string[];\r\n\t}>({ columns: [], orderKeys: [] });\r\n\tconst { user } = useAuth()\r\n\t// Add ref to track current pathname for race condition prevention\r\n\tconst currentPathnameRef = useRef<string>(location.pathname);\r\n\tconst curPathName = useMemo(() => location.pathname, [location.pathname])\r\n\r\n\t// Get current page's default columns and resources\r\n\tconst defaultColumns: any[] = useMemo(() => {\r\n\t\tconst columns = (customRouteToColumnsMap?.[curPathName] || routeToColumnsMap[curPathName])?.defaultColumns || [];\r\n\t\treturn columns;\r\n\t}, [curPathName, customRouteToColumnsMap]);\r\n\r\n\tconst resources: IResources = useMemo(() => {\r\n\t\tconst resource = customRouteToResourceMap?.[curPathName] || routeToResourceMap[curPathName] || null;\r\n\t\treturn resource;\r\n\t}, [curPathName, customRouteToResourceMap]);\r\n\r\n\t//Translation\r\n\tconst { t } = useTranslation()\r\n\r\n\t// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars\r\n\tconst initializeColumns = (columns: MaterialTableColumnProps[]) => {\r\n\t\t//! Remove the function if not needed\r\n\t};\r\n\r\n\t// Fetch page-related information from API\r\n\tconst fetchPageData = useCallback(\r\n\t\tasync (currentPath: string, currentDefaultColumns: any[], currentResources: IResources) => {\r\n\t\t\tconsole.log('PageContext: Entering fetchPageData', { currentPath, currentDefaultColumnsLength: currentDefaultColumns?.length, hasResources: !!currentResources });\r\n\r\n\t\t\t// Check if this request is still valid (pathname hasn't changed)\r\n\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\tconsole.log('Aborting fetchPageData - pathname changed', { ref: currentPathnameRef.current, current: currentPath });\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tsetLoading(true);\r\n\t\t\tsetError(null);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconsole.log('PageContext: Resources Check:', { currentDefaultColumns, currentResources });\r\n\t\t\t\tif (currentDefaultColumns.length && currentResources) {\r\n\t\t\t\t\tconst { pageResource = '', fieldResource = '', formResource = '' } = currentResources;\r\n\r\n\t\t\t\t\tconsole.log('PageContext: Pathname:', currentPath);\r\n\t\t\t\t\tconsole.log('PageContext: Default Columns:', currentDefaultColumns);\r\n\t\t\t\t\tconsole.log('PageContext: Resources:', currentResources);\r\n\r\n\t\t\t\t\t// Double-check pathname hasn't changed before making API calls\r\n\t\t\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst [pageResponse, fieldResponse, formResponse] = await Promise.all([\r\n\t\t\t\t\t\tpageResource ? getV1PagesResource({ ...getToken(), resource: pageResource }) : Promise.resolve(null),\r\n\r\n\t\t\t\t\t\tgetV1FormBuilderSchemaFieldsName({\r\n\t\t\t\t\t\t\tname: fieldResource,\r\n\t\t\t\t\t\t\t...getToken(),\r\n\t\t\t\t\t\t\tskip: 0,\r\n\t\t\t\t\t\t\tlimit: 999\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t\tgetV1FormBuilder({\r\n\t\t\t\t\t\t\t...getToken(),\r\n\t\t\t\t\t\t\tfilters: `(resource.eq=${formResource}&company_id.eq=${user?.company_id})`,\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t]);\r\n\r\n\t\t\t\t\tconsole.log('PageContext: API Responses:', { pageResponse, fieldResponse, formResponse });\r\n\r\n\t\t\t\t\t// Final check - ensure pathname still matches\r\n\t\t\t\t\tif (currentPathnameRef.current !== currentPath) {\r\n\t\t\t\t\t\tconsole.log('Aborting fetchPageData - pathname changed after API call');\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst fields = fieldResponse?.data?.fields?.map(f => ({ ...f, label: !f?.label?.trim() ? formatLabel(f.key) : f.label }));\r\n\r\n\t\t\t\t\tconst gColumns = generateColumnSchema(currentDefaultColumns, fields, [], [], t);\r\n\t\t\t\t\tconsole.log('PageContext: Generated Columns:', gColumns);\r\n\r\n\t\t\t\t\tconst pages =\r\n\t\t\t\t\t\tpageResponse?.data?.pages?.map((p) => ({\r\n\t\t\t\t\t\t\t...defaultPageState,\r\n\t\t\t\t\t\t\t...p,\r\n\t\t\t\t\t\t\tvisible_columns: generateColumnSchema(\r\n\t\t\t\t\t\t\t\tp.visible_columns?.length ? p.visible_columns : currentDefaultColumns,\r\n\t\t\t\t\t\t\t\tfields,\r\n\t\t\t\t\t\t\t\tp.column_order || [],\r\n\t\t\t\t\t\t\t\tcurrentDefaultColumns,\r\n\t\t\t\t\t\t\t\tt\r\n\t\t\t\t\t\t\t).columns,\r\n\t\t\t\t\t\t\tcolumn_order: mergeArraysKeepingOrder(\r\n\t\t\t\t\t\t\t\tp.column_order || [],\r\n\t\t\t\t\t\t\t\t_.uniq(gColumns.orderKeys)\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t})) || [];\r\n\t\t\t\t\tconst sharedPages =\r\n\t\t\t\t\t\tpageResponse?.data?.shared_pages?.map((sPages) => ({\r\n\t\t\t\t\t\t\t...sPages.details,\r\n\t\t\t\t\t\t\tisShared: true,\r\n\t\t\t\t\t\t\towner: sPages.owner,\r\n\t\t\t\t\t\t\t_id: sPages.id\r\n\t\t\t\t\t\t})) || [];\r\n\r\n\t\t\t\t\tconst uPages = [...pages, ...sharedPages];\r\n\r\n\t\t\t\t\t// Only update state if we're still on the same path\r\n\t\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\t\tawait Promise.all([\r\n\t\t\t\t\t\t\tsetSchemaFields(fields),\r\n\t\t\t\t\t\t\tsetGeneratedColumns(gColumns),\r\n\t\t\t\t\t\t\tsetPageTemplateId(pageResponse?.data?._id),\r\n\t\t\t\t\t\t\tsetSharedPages(sharedPages),\r\n\t\t\t\t\t\t\tsetPages(uPages || []),\r\n\t\t\t\t\t\t\tsetFormData(formResponse?.data?.form?.[0] || {}),\r\n\t\t\t\t\t\t\tsetActivePageData((prev) => ({\r\n\t\t\t\t\t\t\t\t...prev,\r\n\t\t\t\t\t\t\t\t...(pages?.[0] || {}) // Merge API response with current state\r\n\t\t\t\t\t\t\t}))\r\n\t\t\t\t\t\t]);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} catch (err) {\r\n\t\t\t\t// Only set error if we're still on the same path\r\n\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\tsetError('Failed to load page data');\r\n\t\t\t\t}\r\n\t\t\t} finally {\r\n\t\t\t\t// Only update loading state if we're still on the same path\r\n\t\t\t\tif (currentPathnameRef.current === currentPath) {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tsetLoading(false);\r\n\t\t\t\t\t}, 1000);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t},\r\n\t\t//eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t\t[] // Remove dependencies to prevent stale closures\r\n\t);\r\n\r\n\t// Update page state dynamically\r\n\tconst updatePageInfo = (updates: Partial<PageState>) => {\r\n\t\tsetActivePageData((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\t...updates\r\n\t\t}));\r\n\t\t!isInitialLoad && setIsChanged(true)\r\n\t\tsetIsInitialLoad(false)\r\n\t};\r\n\r\n\t// Update columns state dynamically\r\n\tconst updateGeneratedColumns = (updates: Partial<GeneratedColumnsState>) => {\r\n\t\tsetGeneratedColumns((prev) => ({\r\n\t\t\t...prev,\r\n\t\t\t...updates\r\n\t\t}));\r\n\t};\r\n\r\n\tconst setActivePage = (page: PageState) => {\r\n\t\tconst uPages = pages.map((p) =>\r\n\t\t\tp._id == activePage?._id ? activePage : p\r\n\t\t);\r\n\t\tsetPages(uPages);\r\n\t\tsetActivePageData(page);\r\n\t};\r\n\r\n\tconst savePages = async () => {\r\n\t\tsetError(null);\r\n\t\tsetIsSaving(true);\r\n\t\tawait addOrDeletePage()\r\n\t\tsetTimeout(() => {\r\n\t\t\tsetIsSaving(false);\r\n\t\t}, 1000);\r\n\t};\r\n\tconst fetchSavedFilters = async (): Promise<void> => {\r\n\r\n\t\tawait getV1FilterResource({ ...getToken(), resource: resources?.pageResource || resources?.fieldResource })\r\n\r\n\t};\r\n\r\n\tconst addOrDeletePage = async (restPages?: any[]) => {\r\n\t\ttry {\r\n\t\t\tconst filteredPages = restPages?.length ? restPages : pages.filter((page) => !page.isShared);\r\n\t\t\tconst uPages = filteredPages.map((p) =>\r\n\t\t\t\t(p._id == activePage?._id && activePage.name == p.name) ? activePage : p\r\n\t\t\t);\r\n\t\t\tconst sanitizedPages = removeIdStaticIdsFromMongoObject(uPages);\r\n\r\n\t\t\tconst response = await patchV1PagesPageId({\r\n\t\t\t\t...getToken(),\r\n\t\t\t\t...{ page_id: pageTemplateId, pages: sanitizedPages }\r\n\t\t\t});\r\n\t\t\tif (response.status_code === 200) {\r\n\t\t\t\tconst updatedPages = response?.data?.pages || [];\r\n\t\t\t\tsetPages(updatedPages);\r\n\t\t\t\tfetchSavedFilters();\r\n\t\t\t\tsetActivePageData((prev) => ({\r\n\t\t\t\t\t...prev,\r\n\t\t\t\t\t...(updatedPages.find((p) => p.name == prev.name) || {})\r\n\t\t\t\t}));\r\n\t\t\t\tsetIsChanged(false);\r\n\t\t\t\tsetIsCreatePage(false);\r\n\t\t\t\tsetFormData(response?.data?.form?.[0] || {});\r\n\t\t\t\tconst msg = restPages?.length ? t('pages.msg.delete') : t('pages.msg.save')\r\n\t\t\t\tenqueueSnackbar(msg);\r\n\t\t\t}\r\n\t\t\treturn response\r\n\t\t} catch (err) {\r\n\t\t\tsetError('Failed to save page data');\r\n\t\t}\r\n\t}\r\n\r\n\tconst deletePage = async (pages: string) => {\r\n\t\taddOrDeletePage(pages);\r\n\t}\r\n\r\n\t// Handle pathname changes\r\n\tuseEffect(() => {\r\n\t\t// Update the ref immediately\r\n\t\tcurrentPathnameRef.current = curPathName;\r\n\r\n\t\t// Reset state for new page\r\n\t\tsetLoading(true);\r\n\t\tsetIsSaving(false);\r\n\t\tsetActivePageData(defaultPageState);\r\n\t\tsetIsChanged(false);\r\n\t\tsetIsInitialLoad(true);\r\n\r\n\t\t// Clear previous data to prevent showing stale data\r\n\t\tsetSchemaFields([]);\r\n\t\tsetGeneratedColumns({ columns: [], orderKeys: [] });\r\n\t\tsetPages([]);\r\n\t\tsetSharedPages([]);\r\n\t\tsetPageTemplateId('');\r\n\t\tsetError(null);\r\n\r\n\t\t// Fetch data for new page with current values\r\n\t\tconsole.log('PageContext: useEffect Triggered', { curPathName, defaultColumnsLength: defaultColumns?.length, hasResources: !!resources });\r\n\t\tfetchPageData(curPathName, defaultColumns, resources);\r\n\r\n\t\treturn () => { setLoading(true) }\r\n\t\t//eslint-disable-next-line react-hooks/exhaustive-deps\r\n\t}, [curPathName, JSON.stringify(defaultColumns), JSON.stringify(resources)]); // Remove other dependencies to prevent issues\r\n\r\n\r\n\t// Removed loading check to prevent blank page during loading\r\n\tif ((loading || curPathName != currentPathnameRef.current) && resources) {\r\n\t\treturn <ErpLoader />; // Show loader before rendering anything else\r\n\t}\r\n\r\n\tif ((loading || curPathName != currentPathnameRef.current) && resources) {\r\n\t\treturn <ErpLoader />; // Show loader before rendering anything else\r\n\t}\r\n\r\n\treturn (\r\n\t\t<PageContext.Provider\r\n\t\t\tvalue={{\r\n\t\t\t\tpageTemplateId,\r\n\t\t\t\tactivePage,\r\n\t\t\t\tpages,\r\n\t\t\t\tsharedPages,\r\n\t\t\t\tschemaFields,\r\n\t\t\t\tsetPages,\r\n\t\t\t\tupdatePageInfo,\r\n\t\t\t\tsavePages,\r\n\t\t\t\tsetActivePage,\r\n\t\t\t\tisSaving,\r\n\t\t\t\tloading,\r\n\t\t\t\terror,\r\n\t\t\t\tinitializeColumns,\r\n\t\t\t\tgeneratedColumns,\r\n\t\t\t\tupdateGeneratedColumns,\r\n\t\t\t\tisChanged,\r\n\t\t\t\tdeletePage,\r\n\t\t\t\tisCreatePage,\r\n\t\t\t\tsetIsCreatePage,\r\n\t\t\t\taddOrDeletePage,\r\n\t\t\t\tsetIsChanged,\r\n\t\t\t\tformData\r\n\t\t\t}}>\r\n\t\t\t{children}\r\n\t\t</PageContext.Provider>\r\n\t);\r\n};\r\n"],"names":["jsx","field","_a","pages","sharedPages"],"mappings":"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"}
|