@erpsquad/common 1.10.48 → 1.10.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{ERPUIProvider-8mElUzct.esm.js → ERPUIProvider-Cl_IkhGu.esm.js} +3 -3
- package/dist/chunks/{ERPUIProvider-8mElUzct.esm.js.map → ERPUIProvider-Cl_IkhGu.esm.js.map} +1 -1
- package/dist/chunks/{ERPUIProvider-DUddcKKd.js → ERPUIProvider-Ct7W7gdB.js} +3 -3
- package/dist/chunks/{ERPUIProvider-DUddcKKd.js.map → ERPUIProvider-Ct7W7gdB.js.map} +1 -1
- package/dist/chunks/{android-12-switch-DZIVs27n.esm.js → android-12-switch-DmaKDjy9.esm.js} +7 -7
- package/dist/chunks/{android-12-switch-DZIVs27n.esm.js.map → android-12-switch-DmaKDjy9.esm.js.map} +1 -1
- package/dist/chunks/{android-12-switch-BGI79wfm.js → android-12-switch-tTXttXiR.js} +7 -7
- package/dist/chunks/{android-12-switch-BGI79wfm.js.map → android-12-switch-tTXttXiR.js.map} +1 -1
- package/dist/chunks/{default-data-C-SQMwzL.js → default-data-Bo4DtFav.js} +4 -4
- package/dist/chunks/{default-data-C-SQMwzL.js.map → default-data-Bo4DtFav.js.map} +1 -1
- package/dist/chunks/{default-data-CwonfBNr.esm.js → default-data-hAAa_ozi.esm.js} +4 -4
- package/dist/chunks/{default-data-CwonfBNr.esm.js.map → default-data-hAAa_ozi.esm.js.map} +1 -1
- package/dist/chunks/{page-context-EoVDp9wP.js → page-context-B4zx0GZ5.js} +31 -20
- package/dist/chunks/page-context-B4zx0GZ5.js.map +1 -0
- package/dist/chunks/{page-context-Clevzuyw.esm.js → page-context-_PTfsRfz.esm.js} +31 -20
- package/dist/chunks/page-context-_PTfsRfz.esm.js.map +1 -0
- package/dist/chunks/{uom-field-wrapper-DJQKkyw5.esm.js → uom-field-wrapper-GedeGXeU.esm.js} +5 -5
- package/dist/chunks/{uom-field-wrapper-DJQKkyw5.esm.js.map → uom-field-wrapper-GedeGXeU.esm.js.map} +1 -1
- package/dist/chunks/{uom-field-wrapper-B4lf_fHb.js → uom-field-wrapper-OljClTZe.js} +5 -5
- package/dist/chunks/{uom-field-wrapper-B4lf_fHb.js.map → uom-field-wrapper-OljClTZe.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-B52DoZdU.esm.js → useAccountSetting-B9iSkd0R.esm.js} +2 -2
- package/dist/chunks/{useAccountSetting-B52DoZdU.esm.js.map → useAccountSetting-B9iSkd0R.esm.js.map} +1 -1
- package/dist/chunks/{useAccountSetting-DKYF0ha6.js → useAccountSetting-DLSuTSbZ.js} +2 -2
- package/dist/chunks/{useAccountSetting-DKYF0ha6.js.map → useAccountSetting-DLSuTSbZ.js.map} +1 -1
- package/dist/chunks/{useAdditionalDiscountAutoCalc-BXvF0pCQ.js → useAdditionalDiscountAutoCalc-BM8q5jHy.js} +2 -2
- package/dist/chunks/{useAdditionalDiscountAutoCalc-BXvF0pCQ.js.map → useAdditionalDiscountAutoCalc-BM8q5jHy.js.map} +1 -1
- package/dist/chunks/{useAdditionalDiscountAutoCalc-Br4A8SBr.esm.js → useAdditionalDiscountAutoCalc-CMSSqS9h.esm.js} +2 -2
- package/dist/chunks/{useAdditionalDiscountAutoCalc-Br4A8SBr.esm.js.map → useAdditionalDiscountAutoCalc-CMSSqS9h.esm.js.map} +1 -1
- package/dist/components/index.esm.js +4 -4
- package/dist/components/index.js +4 -4
- package/dist/contexts/index.esm.js +1 -1
- package/dist/contexts/index.js +1 -1
- package/dist/hooks/index.esm.js +3 -3
- package/dist/hooks/index.js +3 -3
- package/dist/index.esm.js +7 -7
- package/dist/index.js +7 -7
- package/dist/views/index.esm.js +3 -3
- package/dist/views/index.js +2 -2
- package/package.json +1 -1
- package/dist/chunks/page-context-Clevzuyw.esm.js.map +0 -1
- package/dist/chunks/page-context-EoVDp9wP.js.map +0 -1
|
@@ -63,7 +63,7 @@ function resolveOperation(operation) {
|
|
|
63
63
|
return { subRoute, action, hasParam, hasTrailingParam };
|
|
64
64
|
}
|
|
65
65
|
function buildHrmsPermissionTree(raw) {
|
|
66
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
66
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
67
67
|
const tree = {};
|
|
68
68
|
if (!raw) {
|
|
69
69
|
return tree;
|
|
@@ -76,15 +76,23 @@ function buildHrmsPermissionTree(raw) {
|
|
|
76
76
|
const parts = formattedModule.split(/(?=[A-Z])/);
|
|
77
77
|
const moduleKey = parts.slice(0, 2).join("");
|
|
78
78
|
const moduleSubName = parts.slice(2).join("");
|
|
79
|
-
if (!tree[moduleKey]) tree[moduleKey] = {};
|
|
80
79
|
if (!crudBlock || typeof crudBlock !== "object") continue;
|
|
80
|
+
const modulesInBlock = /* @__PURE__ */ new Set();
|
|
81
|
+
for (const [, blockEntries] of Object.entries(crudBlock)) {
|
|
82
|
+
const blockList = Array.isArray(blockEntries) ? blockEntries : [blockEntries];
|
|
83
|
+
for (const blockEntry of blockList) {
|
|
84
|
+
const em = (_a = blockEntry == null ? void 0 : blockEntry.identity) == null ? void 0 : _a.module;
|
|
85
|
+
if (em && ALLOWED_MODULES.includes(em)) modulesInBlock.add(em);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const hasMultipleModules = modulesInBlock.size > 1;
|
|
81
89
|
const subResourceActions = /* @__PURE__ */ new Set();
|
|
82
90
|
for (const [, subEntries] of Object.entries(crudBlock)) {
|
|
83
91
|
const subList = Array.isArray(subEntries) ? subEntries : [{ ...subEntries, identity: null }];
|
|
84
92
|
for (const subEntry of subList) {
|
|
85
|
-
const em = (
|
|
93
|
+
const em = (_b = subEntry == null ? void 0 : subEntry.identity) == null ? void 0 : _b.module;
|
|
86
94
|
if (em && !ALLOWED_MODULES.includes(em)) continue;
|
|
87
|
-
const op = ((
|
|
95
|
+
const op = ((_c = subEntry == null ? void 0 : subEntry.identity) == null ? void 0 : _c.operation) ?? ":nop";
|
|
88
96
|
const { action, hasTrailingParam } = resolveOperation(op);
|
|
89
97
|
if (action && hasTrailingParam) subResourceActions.add(action);
|
|
90
98
|
}
|
|
@@ -94,16 +102,19 @@ function buildHrmsPermissionTree(raw) {
|
|
|
94
102
|
if (!flagMap) continue;
|
|
95
103
|
const list = Array.isArray(entries) ? entries : [{ ...entries, identity: null }];
|
|
96
104
|
for (const entry of list) {
|
|
97
|
-
const entryModule = (
|
|
105
|
+
const entryModule = (_d = entry == null ? void 0 : entry.identity) == null ? void 0 : _d.module;
|
|
98
106
|
if (entryModule && !ALLOWED_MODULES.includes(entryModule)) continue;
|
|
99
|
-
const operation = ((
|
|
107
|
+
const operation = ((_e = entry == null ? void 0 : entry.identity) == null ? void 0 : _e.operation) ?? ":nop";
|
|
100
108
|
const { subRoute, action, hasParam, hasTrailingParam } = resolveOperation(operation);
|
|
109
|
+
const effectiveModuleKey = hasMultipleModules && entryModule ? common.formatLabel(entryModule).replace(/[^a-zA-Z0-9]/gi, "") + moduleKey : moduleKey;
|
|
110
|
+
if (!tree[effectiveModuleKey]) tree[effectiveModuleKey] = {};
|
|
101
111
|
let targetNode;
|
|
112
|
+
const baseNode = tree[effectiveModuleKey];
|
|
102
113
|
if (moduleSubName) {
|
|
103
|
-
if (!
|
|
104
|
-
|
|
114
|
+
if (!baseNode[moduleSubName]) {
|
|
115
|
+
baseNode[moduleSubName] = {};
|
|
105
116
|
}
|
|
106
|
-
const subNameNode =
|
|
117
|
+
const subNameNode = baseNode[moduleSubName];
|
|
107
118
|
if (subRoute) {
|
|
108
119
|
const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);
|
|
109
120
|
if (!subNameNode[subKey]) subNameNode[subKey] = {};
|
|
@@ -113,12 +124,12 @@ function buildHrmsPermissionTree(raw) {
|
|
|
113
124
|
}
|
|
114
125
|
} else if (subRoute) {
|
|
115
126
|
const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);
|
|
116
|
-
if (!
|
|
117
|
-
|
|
127
|
+
if (!baseNode[subKey]) {
|
|
128
|
+
baseNode[subKey] = {};
|
|
118
129
|
}
|
|
119
|
-
targetNode =
|
|
130
|
+
targetNode = baseNode[subKey];
|
|
120
131
|
} else {
|
|
121
|
-
targetNode =
|
|
132
|
+
targetNode = baseNode;
|
|
122
133
|
}
|
|
123
134
|
if (action) {
|
|
124
135
|
if (subResourceActions.has(action)) {
|
|
@@ -132,17 +143,17 @@ function buildHrmsPermissionTree(raw) {
|
|
|
132
143
|
if (flag) subNode[flag] = true;
|
|
133
144
|
if (shortKey === "r") {
|
|
134
145
|
if (hasTrailingParam) {
|
|
135
|
-
if (Array.isArray((
|
|
146
|
+
if (Array.isArray((_f = entry == null ? void 0 : entry.attributes) == null ? void 0 : _f.not_allowed)) {
|
|
136
147
|
subNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
137
148
|
}
|
|
138
|
-
if (Array.isArray((
|
|
149
|
+
if (Array.isArray((_g = entry == null ? void 0 : entry.filters) == null ? void 0 : _g.not_allowed)) {
|
|
139
150
|
subNode.notAllowedFilters = entry.filters.not_allowed;
|
|
140
151
|
}
|
|
141
152
|
} else {
|
|
142
|
-
if (Array.isArray((
|
|
153
|
+
if (Array.isArray((_h = entry == null ? void 0 : entry.attributes) == null ? void 0 : _h.not_allowed) && !subNode.notAllowedAttributes) {
|
|
143
154
|
subNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
144
155
|
}
|
|
145
|
-
if (Array.isArray((
|
|
156
|
+
if (Array.isArray((_i = entry == null ? void 0 : entry.filters) == null ? void 0 : _i.not_allowed) && !subNode.notAllowedFilters) {
|
|
146
157
|
subNode.notAllowedFilters = entry.filters.not_allowed;
|
|
147
158
|
}
|
|
148
159
|
}
|
|
@@ -158,12 +169,12 @@ function buildHrmsPermissionTree(raw) {
|
|
|
158
169
|
targetNode[flag] = true;
|
|
159
170
|
if (shortKey === "r") {
|
|
160
171
|
const isParamRead = hasParam && !action;
|
|
161
|
-
if (Array.isArray((
|
|
172
|
+
if (Array.isArray((_j = entry == null ? void 0 : entry.attributes) == null ? void 0 : _j.not_allowed)) {
|
|
162
173
|
if (isParamRead || !targetNode.notAllowedAttributes) {
|
|
163
174
|
targetNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
164
175
|
}
|
|
165
176
|
}
|
|
166
|
-
if (Array.isArray((
|
|
177
|
+
if (Array.isArray((_k = entry == null ? void 0 : entry.filters) == null ? void 0 : _k.not_allowed)) {
|
|
167
178
|
if (isParamRead || !targetNode.notAllowedFilters) {
|
|
168
179
|
targetNode.notAllowedFilters = entry.filters.not_allowed;
|
|
169
180
|
}
|
|
@@ -613,4 +624,4 @@ exports.PermissionsContext = PermissionsContext;
|
|
|
613
624
|
exports.PermissionsProvider = PermissionsProvider;
|
|
614
625
|
exports.defaultPageState = defaultPageState;
|
|
615
626
|
exports.initialFilter = initialFilter;
|
|
616
|
-
//# sourceMappingURL=page-context-
|
|
627
|
+
//# sourceMappingURL=page-context-B4zx0GZ5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-context-B4zx0GZ5.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 * Field names the current user is NOT allowed to see on this resource.\r\n * Populated from the `r + :param` entry's `attributes.not_allowed` array.\r\n * Falls back to the `r + :nop` entry when no :param entry exists (old format).\r\n */\r\n notAllowedAttributes?: string[];\r\n /**\r\n * Filter keys the current user is NOT allowed to apply on this resource.\r\n * Populated from the `r + :param` entry's `filters.not_allowed` array.\r\n * Falls back to the `r + :nop` entry when no :param entry exists (old format).\r\n */\r\n notAllowedFilters?: string[];\r\n /**\r\n * Dynamic action map for compound operations that are NOT nested sub-resources.\r\n * Key = camelCase of the named segments extracted from the operation.\r\n *\r\n * Examples (standalone actions — no /:paramId sibling):\r\n * \":param/status\" → actions.status\r\n * \":param/send\" → actions.send\r\n * \":param/documents/:param_id/verify\" → actions.documentsVerify\r\n * \"public/welcome/:param/reject\" → sub-node \"publicWelcome\".actions.reject\r\n *\r\n * Sub-resources (operations that ALSO have a /:paramId variant) get their own\r\n * HrmsPermissionNode instead of a key in actions:\r\n * \":param/response\" + \":param/response/:paramId\" → response.canView / canAdd / canViewById / canEdit / canDelete\r\n */\r\n actions?: Record<string, boolean>;\r\n [subRoute: string]: HrmsPermissionNode | boolean | Record<string, boolean> | string[] | 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', 'inventory', 'sales', 'rental', 'manufacturing', 'purchase', 'accounts-and-finance', 'rbac', 'user', 'erp-common'] 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 * Whether the operation ends with a param segment that follows trailing named segments.\r\n * true → \":param/response/:paramId\" (sub-resource by-ID operation)\r\n * false → \":param/response\" (sub-resource list/create)\r\n * false → \":param/analyze\" (standalone action)\r\n * Used by the pre-scan to identify sub-resource action names.\r\n */\r\n hasTrailingParam: 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, hasTrailingParam: 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 // true when the operation ends with a param that follows trailing named segs,\r\n // e.g. \":param/response/:paramId\" — signals a sub-resource by-ID access.\r\n const lastSegment = segments[segments.length - 1];\r\n const hasTrailingParam = trailingNamed.length > 0 && isParamSegment(lastSegment);\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, hasTrailingParam: false };\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, hasTrailingParam };\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 (!crudBlock || typeof crudBlock !== 'object') continue;\r\n\r\n // ── Pre-scan: detect if multiple modules share this resource block ─────\r\n // When they do, each entry will be keyed as {Module}{ResourceKey} instead\r\n // of the plain {ResourceKey} so same-identifier entries don't collide.\r\n const modulesInBlock = new Set<string>();\r\n for (const [, blockEntries] of Object.entries(crudBlock)) {\r\n const blockList: any[] = Array.isArray(blockEntries) ? blockEntries : [blockEntries];\r\n for (const blockEntry of blockList) {\r\n const em = blockEntry?.identity?.module;\r\n if (em && ALLOWED_MODULES.includes(em as any)) modulesInBlock.add(em);\r\n }\r\n }\r\n const hasMultipleModules = modulesInBlock.size > 1;\r\n\r\n // ── Pre-scan: find action names that are sub-resources ────────────────\r\n // An action name is a sub-resource when at least one operation ends with\r\n // \":param/<name>/:paramId\" — i.e. hasTrailingParam is true.\r\n // Those get their own HrmsPermissionNode with full CRUD flags instead of\r\n // a single boolean entry in the parent's `actions` map.\r\n const subResourceActions = new Set<string>();\r\n for (const [, subEntries] of Object.entries(crudBlock)) {\r\n const subList: any[] = Array.isArray(subEntries)\r\n ? subEntries\r\n : [{ ...(subEntries as any), identity: null }];\r\n for (const subEntry of subList) {\r\n const em = subEntry?.identity?.module;\r\n if (em && !ALLOWED_MODULES.includes(em)) continue;\r\n const op = subEntry?.identity?.operation ?? ':nop';\r\n const { action, hasTrailingParam } = resolveOperation(op);\r\n if (action && hasTrailingParam) subResourceActions.add(action);\r\n }\r\n }\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, hasTrailingParam } = resolveOperation(operation);\r\n\r\n // ── Determine effective tree key ───────────────────────────────\r\n // When multiple backend modules share this resource block, prefix the\r\n // key with the module name so their entries don't collide.\r\n // e.g. \"purchase\" + \"DeliveryOrders\" → \"PurchaseDeliveryOrders\"\r\n const effectiveModuleKey = (hasMultipleModules && entryModule)\r\n ? formatLabel(entryModule).replace(/[^a-zA-Z0-9]/gi, '') + moduleKey\r\n : moduleKey;\r\n\r\n if (!tree[effectiveModuleKey]) tree[effectiveModuleKey] = {};\r\n\r\n // ── Step 4: resolve target node ────────────────────────────────\r\n let targetNode: HrmsPermissionNode;\r\n const baseNode = tree[effectiveModuleKey];\r\n\r\n if (moduleSubName) {\r\n if (!(baseNode as any)[moduleSubName]) {\r\n (baseNode as any)[moduleSubName] = {} as HrmsPermissionNode;\r\n }\r\n const subNameNode = (baseNode as any)[moduleSubName] as any;\r\n\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 (!(baseNode as any)[subKey]) {\r\n (baseNode as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n targetNode = (baseNode as any)[subKey] as HrmsPermissionNode;\r\n\r\n } else {\r\n targetNode = baseNode;\r\n }\r\n\r\n // ── Step 5: write permission into target node ───────────────────\r\n if (action) {\r\n if (subResourceActions.has(action)) {\r\n // Sub-resource: create its own CRUD node rather than a boolean in actions.\r\n // \":param/response\" → response.canView / canAdd (hasTrailingParam=false → ':nop')\r\n // \":param/response/:paramId\" → response.canViewById / canEdit / canDelete (':param')\r\n const subKey = action.charAt(0).toLowerCase() + action.slice(1);\r\n if (!(targetNode as any)[subKey]) {\r\n (targetNode as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n const subNode = (targetNode as any)[subKey] as HrmsPermissionNode;\r\n\r\n const opKey: ':nop' | ':param' = hasTrailingParam ? ':param' : ':nop';\r\n const flag = flagMap[opKey];\r\n if (flag) subNode[flag] = true;\r\n\r\n if (shortKey === 'r') {\r\n if (hasTrailingParam) {\r\n // by-ID read — override with most-specific restrictions\r\n if (Array.isArray(entry?.attributes?.not_allowed)) {\r\n subNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed)) {\r\n subNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n } else {\r\n // list read — set only if not already set by a by-ID read\r\n if (Array.isArray(entry?.attributes?.not_allowed) && !subNode.notAllowedAttributes) {\r\n subNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed) && !subNode.notAllowedFilters) {\r\n subNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n // Standalone action → generic boolean in the actions map.\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\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 // Extract field-level restrictions from 'r' entries.\r\n // :param entries (canViewById) take priority over :nop (canView) because\r\n // detail views use the :param operation and have the most specific restrictions.\r\n if (shortKey === 'r') {\r\n const isParamRead = hasParam && !action;\r\n if (Array.isArray(entry?.attributes?.not_allowed)) {\r\n if (isParamRead || !targetNode.notAllowedAttributes) {\r\n targetNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed)) {\r\n if (isParamRead || !targetNode.notAllowedFilters) {\r\n targetNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n }\r\n }\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\" | \"canViewById\";\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\tcustomRouteToResourceMap?: Record<string, any>;\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 ? { ...f, ...column, type: f.type ?? column.type } : 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\tcustomRouteToResourceMap\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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"}
|
|
@@ -62,7 +62,7 @@ function resolveOperation(operation) {
|
|
|
62
62
|
return { subRoute, action, hasParam, hasTrailingParam };
|
|
63
63
|
}
|
|
64
64
|
function buildHrmsPermissionTree(raw) {
|
|
65
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
65
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
|
|
66
66
|
const tree = {};
|
|
67
67
|
if (!raw) {
|
|
68
68
|
return tree;
|
|
@@ -75,15 +75,23 @@ function buildHrmsPermissionTree(raw) {
|
|
|
75
75
|
const parts = formattedModule.split(/(?=[A-Z])/);
|
|
76
76
|
const moduleKey = parts.slice(0, 2).join("");
|
|
77
77
|
const moduleSubName = parts.slice(2).join("");
|
|
78
|
-
if (!tree[moduleKey]) tree[moduleKey] = {};
|
|
79
78
|
if (!crudBlock || typeof crudBlock !== "object") continue;
|
|
79
|
+
const modulesInBlock = /* @__PURE__ */ new Set();
|
|
80
|
+
for (const [, blockEntries] of Object.entries(crudBlock)) {
|
|
81
|
+
const blockList = Array.isArray(blockEntries) ? blockEntries : [blockEntries];
|
|
82
|
+
for (const blockEntry of blockList) {
|
|
83
|
+
const em = (_a = blockEntry == null ? void 0 : blockEntry.identity) == null ? void 0 : _a.module;
|
|
84
|
+
if (em && ALLOWED_MODULES.includes(em)) modulesInBlock.add(em);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const hasMultipleModules = modulesInBlock.size > 1;
|
|
80
88
|
const subResourceActions = /* @__PURE__ */ new Set();
|
|
81
89
|
for (const [, subEntries] of Object.entries(crudBlock)) {
|
|
82
90
|
const subList = Array.isArray(subEntries) ? subEntries : [{ ...subEntries, identity: null }];
|
|
83
91
|
for (const subEntry of subList) {
|
|
84
|
-
const em = (
|
|
92
|
+
const em = (_b = subEntry == null ? void 0 : subEntry.identity) == null ? void 0 : _b.module;
|
|
85
93
|
if (em && !ALLOWED_MODULES.includes(em)) continue;
|
|
86
|
-
const op = ((
|
|
94
|
+
const op = ((_c = subEntry == null ? void 0 : subEntry.identity) == null ? void 0 : _c.operation) ?? ":nop";
|
|
87
95
|
const { action, hasTrailingParam } = resolveOperation(op);
|
|
88
96
|
if (action && hasTrailingParam) subResourceActions.add(action);
|
|
89
97
|
}
|
|
@@ -93,16 +101,19 @@ function buildHrmsPermissionTree(raw) {
|
|
|
93
101
|
if (!flagMap) continue;
|
|
94
102
|
const list = Array.isArray(entries) ? entries : [{ ...entries, identity: null }];
|
|
95
103
|
for (const entry of list) {
|
|
96
|
-
const entryModule = (
|
|
104
|
+
const entryModule = (_d = entry == null ? void 0 : entry.identity) == null ? void 0 : _d.module;
|
|
97
105
|
if (entryModule && !ALLOWED_MODULES.includes(entryModule)) continue;
|
|
98
|
-
const operation = ((
|
|
106
|
+
const operation = ((_e = entry == null ? void 0 : entry.identity) == null ? void 0 : _e.operation) ?? ":nop";
|
|
99
107
|
const { subRoute, action, hasParam, hasTrailingParam } = resolveOperation(operation);
|
|
108
|
+
const effectiveModuleKey = hasMultipleModules && entryModule ? formatLabel(entryModule).replace(/[^a-zA-Z0-9]/gi, "") + moduleKey : moduleKey;
|
|
109
|
+
if (!tree[effectiveModuleKey]) tree[effectiveModuleKey] = {};
|
|
100
110
|
let targetNode;
|
|
111
|
+
const baseNode = tree[effectiveModuleKey];
|
|
101
112
|
if (moduleSubName) {
|
|
102
|
-
if (!
|
|
103
|
-
|
|
113
|
+
if (!baseNode[moduleSubName]) {
|
|
114
|
+
baseNode[moduleSubName] = {};
|
|
104
115
|
}
|
|
105
|
-
const subNameNode =
|
|
116
|
+
const subNameNode = baseNode[moduleSubName];
|
|
106
117
|
if (subRoute) {
|
|
107
118
|
const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);
|
|
108
119
|
if (!subNameNode[subKey]) subNameNode[subKey] = {};
|
|
@@ -112,12 +123,12 @@ function buildHrmsPermissionTree(raw) {
|
|
|
112
123
|
}
|
|
113
124
|
} else if (subRoute) {
|
|
114
125
|
const subKey = subRoute.charAt(0).toLowerCase() + subRoute.slice(1);
|
|
115
|
-
if (!
|
|
116
|
-
|
|
126
|
+
if (!baseNode[subKey]) {
|
|
127
|
+
baseNode[subKey] = {};
|
|
117
128
|
}
|
|
118
|
-
targetNode =
|
|
129
|
+
targetNode = baseNode[subKey];
|
|
119
130
|
} else {
|
|
120
|
-
targetNode =
|
|
131
|
+
targetNode = baseNode;
|
|
121
132
|
}
|
|
122
133
|
if (action) {
|
|
123
134
|
if (subResourceActions.has(action)) {
|
|
@@ -131,17 +142,17 @@ function buildHrmsPermissionTree(raw) {
|
|
|
131
142
|
if (flag) subNode[flag] = true;
|
|
132
143
|
if (shortKey === "r") {
|
|
133
144
|
if (hasTrailingParam) {
|
|
134
|
-
if (Array.isArray((
|
|
145
|
+
if (Array.isArray((_f = entry == null ? void 0 : entry.attributes) == null ? void 0 : _f.not_allowed)) {
|
|
135
146
|
subNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
136
147
|
}
|
|
137
|
-
if (Array.isArray((
|
|
148
|
+
if (Array.isArray((_g = entry == null ? void 0 : entry.filters) == null ? void 0 : _g.not_allowed)) {
|
|
138
149
|
subNode.notAllowedFilters = entry.filters.not_allowed;
|
|
139
150
|
}
|
|
140
151
|
} else {
|
|
141
|
-
if (Array.isArray((
|
|
152
|
+
if (Array.isArray((_h = entry == null ? void 0 : entry.attributes) == null ? void 0 : _h.not_allowed) && !subNode.notAllowedAttributes) {
|
|
142
153
|
subNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
143
154
|
}
|
|
144
|
-
if (Array.isArray((
|
|
155
|
+
if (Array.isArray((_i = entry == null ? void 0 : entry.filters) == null ? void 0 : _i.not_allowed) && !subNode.notAllowedFilters) {
|
|
145
156
|
subNode.notAllowedFilters = entry.filters.not_allowed;
|
|
146
157
|
}
|
|
147
158
|
}
|
|
@@ -157,12 +168,12 @@ function buildHrmsPermissionTree(raw) {
|
|
|
157
168
|
targetNode[flag] = true;
|
|
158
169
|
if (shortKey === "r") {
|
|
159
170
|
const isParamRead = hasParam && !action;
|
|
160
|
-
if (Array.isArray((
|
|
171
|
+
if (Array.isArray((_j = entry == null ? void 0 : entry.attributes) == null ? void 0 : _j.not_allowed)) {
|
|
161
172
|
if (isParamRead || !targetNode.notAllowedAttributes) {
|
|
162
173
|
targetNode.notAllowedAttributes = entry.attributes.not_allowed;
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
|
-
if (Array.isArray((
|
|
176
|
+
if (Array.isArray((_k = entry == null ? void 0 : entry.filters) == null ? void 0 : _k.not_allowed)) {
|
|
166
177
|
if (isParamRead || !targetNode.notAllowedFilters) {
|
|
167
178
|
targetNode.notAllowedFilters = entry.filters.not_allowed;
|
|
168
179
|
}
|
|
@@ -614,4 +625,4 @@ export {
|
|
|
614
625
|
defaultPageState as d,
|
|
615
626
|
initialFilter as i
|
|
616
627
|
};
|
|
617
|
-
//# sourceMappingURL=page-context-
|
|
628
|
+
//# sourceMappingURL=page-context-_PTfsRfz.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-context-_PTfsRfz.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 * Field names the current user is NOT allowed to see on this resource.\r\n * Populated from the `r + :param` entry's `attributes.not_allowed` array.\r\n * Falls back to the `r + :nop` entry when no :param entry exists (old format).\r\n */\r\n notAllowedAttributes?: string[];\r\n /**\r\n * Filter keys the current user is NOT allowed to apply on this resource.\r\n * Populated from the `r + :param` entry's `filters.not_allowed` array.\r\n * Falls back to the `r + :nop` entry when no :param entry exists (old format).\r\n */\r\n notAllowedFilters?: string[];\r\n /**\r\n * Dynamic action map for compound operations that are NOT nested sub-resources.\r\n * Key = camelCase of the named segments extracted from the operation.\r\n *\r\n * Examples (standalone actions — no /:paramId sibling):\r\n * \":param/status\" → actions.status\r\n * \":param/send\" → actions.send\r\n * \":param/documents/:param_id/verify\" → actions.documentsVerify\r\n * \"public/welcome/:param/reject\" → sub-node \"publicWelcome\".actions.reject\r\n *\r\n * Sub-resources (operations that ALSO have a /:paramId variant) get their own\r\n * HrmsPermissionNode instead of a key in actions:\r\n * \":param/response\" + \":param/response/:paramId\" → response.canView / canAdd / canViewById / canEdit / canDelete\r\n */\r\n actions?: Record<string, boolean>;\r\n [subRoute: string]: HrmsPermissionNode | boolean | Record<string, boolean> | string[] | 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', 'inventory', 'sales', 'rental', 'manufacturing', 'purchase', 'accounts-and-finance', 'rbac', 'user', 'erp-common'] 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 * Whether the operation ends with a param segment that follows trailing named segments.\r\n * true → \":param/response/:paramId\" (sub-resource by-ID operation)\r\n * false → \":param/response\" (sub-resource list/create)\r\n * false → \":param/analyze\" (standalone action)\r\n * Used by the pre-scan to identify sub-resource action names.\r\n */\r\n hasTrailingParam: 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, hasTrailingParam: 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 // true when the operation ends with a param that follows trailing named segs,\r\n // e.g. \":param/response/:paramId\" — signals a sub-resource by-ID access.\r\n const lastSegment = segments[segments.length - 1];\r\n const hasTrailingParam = trailingNamed.length > 0 && isParamSegment(lastSegment);\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, hasTrailingParam: false };\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, hasTrailingParam };\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 (!crudBlock || typeof crudBlock !== 'object') continue;\r\n\r\n // ── Pre-scan: detect if multiple modules share this resource block ─────\r\n // When they do, each entry will be keyed as {Module}{ResourceKey} instead\r\n // of the plain {ResourceKey} so same-identifier entries don't collide.\r\n const modulesInBlock = new Set<string>();\r\n for (const [, blockEntries] of Object.entries(crudBlock)) {\r\n const blockList: any[] = Array.isArray(blockEntries) ? blockEntries : [blockEntries];\r\n for (const blockEntry of blockList) {\r\n const em = blockEntry?.identity?.module;\r\n if (em && ALLOWED_MODULES.includes(em as any)) modulesInBlock.add(em);\r\n }\r\n }\r\n const hasMultipleModules = modulesInBlock.size > 1;\r\n\r\n // ── Pre-scan: find action names that are sub-resources ────────────────\r\n // An action name is a sub-resource when at least one operation ends with\r\n // \":param/<name>/:paramId\" — i.e. hasTrailingParam is true.\r\n // Those get their own HrmsPermissionNode with full CRUD flags instead of\r\n // a single boolean entry in the parent's `actions` map.\r\n const subResourceActions = new Set<string>();\r\n for (const [, subEntries] of Object.entries(crudBlock)) {\r\n const subList: any[] = Array.isArray(subEntries)\r\n ? subEntries\r\n : [{ ...(subEntries as any), identity: null }];\r\n for (const subEntry of subList) {\r\n const em = subEntry?.identity?.module;\r\n if (em && !ALLOWED_MODULES.includes(em)) continue;\r\n const op = subEntry?.identity?.operation ?? ':nop';\r\n const { action, hasTrailingParam } = resolveOperation(op);\r\n if (action && hasTrailingParam) subResourceActions.add(action);\r\n }\r\n }\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, hasTrailingParam } = resolveOperation(operation);\r\n\r\n // ── Determine effective tree key ───────────────────────────────\r\n // When multiple backend modules share this resource block, prefix the\r\n // key with the module name so their entries don't collide.\r\n // e.g. \"purchase\" + \"DeliveryOrders\" → \"PurchaseDeliveryOrders\"\r\n const effectiveModuleKey = (hasMultipleModules && entryModule)\r\n ? formatLabel(entryModule).replace(/[^a-zA-Z0-9]/gi, '') + moduleKey\r\n : moduleKey;\r\n\r\n if (!tree[effectiveModuleKey]) tree[effectiveModuleKey] = {};\r\n\r\n // ── Step 4: resolve target node ────────────────────────────────\r\n let targetNode: HrmsPermissionNode;\r\n const baseNode = tree[effectiveModuleKey];\r\n\r\n if (moduleSubName) {\r\n if (!(baseNode as any)[moduleSubName]) {\r\n (baseNode as any)[moduleSubName] = {} as HrmsPermissionNode;\r\n }\r\n const subNameNode = (baseNode as any)[moduleSubName] as any;\r\n\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 (!(baseNode as any)[subKey]) {\r\n (baseNode as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n targetNode = (baseNode as any)[subKey] as HrmsPermissionNode;\r\n\r\n } else {\r\n targetNode = baseNode;\r\n }\r\n\r\n // ── Step 5: write permission into target node ───────────────────\r\n if (action) {\r\n if (subResourceActions.has(action)) {\r\n // Sub-resource: create its own CRUD node rather than a boolean in actions.\r\n // \":param/response\" → response.canView / canAdd (hasTrailingParam=false → ':nop')\r\n // \":param/response/:paramId\" → response.canViewById / canEdit / canDelete (':param')\r\n const subKey = action.charAt(0).toLowerCase() + action.slice(1);\r\n if (!(targetNode as any)[subKey]) {\r\n (targetNode as any)[subKey] = {} as HrmsPermissionNode;\r\n }\r\n const subNode = (targetNode as any)[subKey] as HrmsPermissionNode;\r\n\r\n const opKey: ':nop' | ':param' = hasTrailingParam ? ':param' : ':nop';\r\n const flag = flagMap[opKey];\r\n if (flag) subNode[flag] = true;\r\n\r\n if (shortKey === 'r') {\r\n if (hasTrailingParam) {\r\n // by-ID read — override with most-specific restrictions\r\n if (Array.isArray(entry?.attributes?.not_allowed)) {\r\n subNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed)) {\r\n subNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n } else {\r\n // list read — set only if not already set by a by-ID read\r\n if (Array.isArray(entry?.attributes?.not_allowed) && !subNode.notAllowedAttributes) {\r\n subNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed) && !subNode.notAllowedFilters) {\r\n subNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n // Standalone action → generic boolean in the actions map.\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\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 // Extract field-level restrictions from 'r' entries.\r\n // :param entries (canViewById) take priority over :nop (canView) because\r\n // detail views use the :param operation and have the most specific restrictions.\r\n if (shortKey === 'r') {\r\n const isParamRead = hasParam && !action;\r\n if (Array.isArray(entry?.attributes?.not_allowed)) {\r\n if (isParamRead || !targetNode.notAllowedAttributes) {\r\n targetNode.notAllowedAttributes = entry.attributes.not_allowed;\r\n }\r\n }\r\n if (Array.isArray(entry?.filters?.not_allowed)) {\r\n if (isParamRead || !targetNode.notAllowedFilters) {\r\n targetNode.notAllowedFilters = entry.filters.not_allowed;\r\n }\r\n }\r\n }\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\" | \"canViewById\";\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\tcustomRouteToResourceMap?: Record<string, any>;\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 ? { ...f, ...column, type: f.type ?? column.type } : 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\tcustomRouteToResourceMap\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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"}
|
|
@@ -2,7 +2,7 @@ import { j as jsxRuntimeExports } from "./jsx-runtime-ClFauRgV.esm.js";
|
|
|
2
2
|
import { useFieldArray, Controller, useForm, useFormContext } from "react-hook-form";
|
|
3
3
|
import { P as PropTypes, e as _objectWithoutPropertiesLoose, _ as _extends$1, g as generateUtilityClass, j as capitalize, u as useDefaultProps, k as interopRequireDefaultExports, y as lighten_1, z as darken_1, f as alpha_1 } from "./identifier-0SZUhw_A.esm.js";
|
|
4
4
|
import { i as default_1$3, T as Typography, e as useForkRef, o as ownerWindow, d as useEnhancedEffect, h as debounce, p as isMuiElement, u as useAuth, q as useControlled, r as requireCreateSvgIcon } from "./useAuth-Cc85zx55.esm.js";
|
|
5
|
-
import { ar as default_1$4, x as DynamicSelect, i as DateTimePicker, D as DatePicker$1, as as useThemeProps, A as Accordion$1, a9 as Select, C as Checkbox$1, g as ChipOrPlaceholder$1, j as DropdownButton, ag as TitleDropdownButton, U as HeaderCard, ae as TabBar, at as default_1$5, a8 as SearchableSelect, au as Chip$1, af as TimePicker, ak as UploadMedia, a4 as PhoneInput, _ as ModalLoader, Z as MaterialTable, v as DynamicSearchSelect, n as DynamicDate, E as DynamicTime, f as ChipGenerator, l as DynamicCheckBox, N as Footer, G as Fallback, av as IconButton$1, aw as TabContext, ax as TabList, ay as Tab, az as TabPanel, aA as default_1$9, a as ActionBar, aB as SwitchBase } from "./android-12-switch-
|
|
5
|
+
import { ar as default_1$4, x as DynamicSelect, i as DateTimePicker, D as DatePicker$1, as as useThemeProps, A as Accordion$1, a9 as Select, C as Checkbox$1, g as ChipOrPlaceholder$1, j as DropdownButton, ag as TitleDropdownButton, U as HeaderCard, ae as TabBar, at as default_1$5, a8 as SearchableSelect, au as Chip$1, af as TimePicker, ak as UploadMedia, a4 as PhoneInput, _ as ModalLoader, Z as MaterialTable, v as DynamicSearchSelect, n as DynamicDate, E as DynamicTime, f as ChipGenerator, l as DynamicCheckBox, N as Footer, G as Fallback, av as IconButton$1, aw as TabContext, ax as TabList, ay as Tab, az as TabPanel, aA as default_1$9, a as ActionBar, aB as SwitchBase } from "./android-12-switch-DmaKDjy9.esm.js";
|
|
6
6
|
import { D as DynamicInput, E as Typography$1, b as Avatar, G as o, M as Modal, B as Button, c as ConfirmPopUp, f as Box$1, d as Toast, u as useTheme$1, S as SearchBar, I as resolveComponentProps, J as mergeSlotProps, K as appendOwnerState, P as Paper$1, o as chainPropTypes, h as ButtonBase$1, y as default_1$6, T as TextField$1, e as Tooltip$1, F as default_1$7, x as default_1$8, N as Menu$2, O as MenuItem$1, q as useRtl, z as List$1, v as ListItem, Q as ListItemText$1, U as refType } from "./appbar-hgvnXu2W.esm.js";
|
|
7
7
|
import * as React from "react";
|
|
8
8
|
import React__default, { useState, lazy, useMemo, useRef, useEffect, useCallback, useLayoutEffect, useContext, createElement, createContext, cloneElement } from "react";
|
|
@@ -27,7 +27,7 @@ import { C as Chip, M as Menu, t as transformTableColumns, b as formateValueByTy
|
|
|
27
27
|
import { M as MoreIcon, t as Filter, f as Close$1, c as ArrowUpDown, r as RecgtangleIcon, C as CheckBoxIcon$1, T as Trash, i as Export, s as Calendar$1, E as Edit, a as ArrowDown } from "./trash-UdiORwWn.esm.js";
|
|
28
28
|
import { enqueueSnackbar, useSnackbar, SnackbarProvider } from "notistack";
|
|
29
29
|
import { useDispatch } from "react-redux";
|
|
30
|
-
import { a as apiHelper, c as useGenericDataFetcher, b as useAppTranslations } from "./ERPUIProvider-
|
|
30
|
+
import { a as apiHelper, c as useGenericDataFetcher, b as useAppTranslations } from "./ERPUIProvider-Cl_IkhGu.esm.js";
|
|
31
31
|
import Board from "@asseinfo/react-kanban";
|
|
32
32
|
import { a as calculateEntries } from "./translations-DVs6ljbG.esm.js";
|
|
33
33
|
import FullCalendar from "@fullcalendar/react";
|
|
@@ -42,7 +42,7 @@ import { E as Eye, a as EyeOff } from "./tick-wc8bi2Fu.esm.js";
|
|
|
42
42
|
import ReactFlagsSelect from "react-flags-select";
|
|
43
43
|
import { useParams, useLocation, useNavigate } from "react-router-dom";
|
|
44
44
|
import { g as getEntityId, R as RANGE, a as handleCompareDateRangeSync, h as handleCompareDateRange } from "./navigation-utils-ChG-fDRf.esm.js";
|
|
45
|
-
import { E as ErpLoader } from "./page-context-
|
|
45
|
+
import { E as ErpLoader } from "./page-context-_PTfsRfz.esm.js";
|
|
46
46
|
import { Gantt, ViewMode } from "gantt-task-react";
|
|
47
47
|
import { DateRange, Calendar } from "react-date-range";
|
|
48
48
|
import { v as viewTypes } from "./action-bar-BsXTcYpL.esm.js";
|
|
@@ -52,7 +52,7 @@ import { createPortal } from "react-dom";
|
|
|
52
52
|
import { C as Collapse$1 } from "./sidebar-Cl655S49.esm.js";
|
|
53
53
|
import { useMaterialReactTable, MaterialReactTable } from "material-react-table";
|
|
54
54
|
import _$1 from "lodash";
|
|
55
|
-
import { f as usePages, b as useDeepMemo, a as useApi } from "./useAccountSetting-
|
|
55
|
+
import { f as usePages, b as useDeepMemo, a as useApi } from "./useAccountSetting-B9iSkd0R.esm.js";
|
|
56
56
|
import { P as PathnameDocument } from "./modules-Dw3Ho8Qj.esm.js";
|
|
57
57
|
import { f as PathnameRental, b as PathnameCrm, e as PathnamePurchase, d as PathnameManufacturing, c as PathnameInventory, a as PathnameAccounting } from "./pathname.rental-VYOFVGX6.esm.js";
|
|
58
58
|
import { a as PathnameUsers } from "./route-page-map-BIYKqEps.esm.js";
|
|
@@ -16192,4 +16192,4 @@ export {
|
|
|
16192
16192
|
DynamicDateTime as y,
|
|
16193
16193
|
DynamicLayoutWrapper as z
|
|
16194
16194
|
};
|
|
16195
|
-
//# sourceMappingURL=uom-field-wrapper-
|
|
16195
|
+
//# sourceMappingURL=uom-field-wrapper-GedeGXeU.esm.js.map
|