@argusoft/medplat-product-management 1.0.2 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/{BrandsPage-CSA3meke.js → BrandsPage-BE3kn-8b.js} +77 -75
  2. package/dist/BrandsPage-BE3kn-8b.js.map +1 -0
  3. package/dist/{CategoriesPage-BrspzkJL.js → CategoriesPage-COqi3pMi.js} +71 -70
  4. package/dist/{CategoriesPage-BrspzkJL.js.map → CategoriesPage-COqi3pMi.js.map} +1 -1
  5. package/dist/{DashboardPage-CqaquOs2.js → DashboardPage-C_H1Jrey.js} +90 -89
  6. package/dist/DashboardPage-C_H1Jrey.js.map +1 -0
  7. package/dist/{FacilityPicker-Dv_H95WW.js → FacilityPicker-Diq2hnYg.js} +2 -2
  8. package/dist/{FacilityPicker-Dv_H95WW.js.map → FacilityPicker-Diq2hnYg.js.map} +1 -1
  9. package/dist/{InventoryPage-CPbzfDMR.js → InventoryPage-Bjpw6vTz.js} +106 -115
  10. package/dist/InventoryPage-Bjpw6vTz.js.map +1 -0
  11. package/dist/{MemberProfileCard-0vjO3Gzd.js → MemberProfileCard-BLUVRILO.js} +10 -9
  12. package/dist/MemberProfileCard-BLUVRILO.js.map +1 -0
  13. package/dist/{PaymentCreatePage-BYmDZAIB.js → PaymentCreatePage-B5VOgTx9.js} +173 -177
  14. package/dist/PaymentCreatePage-B5VOgTx9.js.map +1 -0
  15. package/dist/{PaymentsPage-BXPvKon-.js → PaymentsPage-DY6BclkN.js} +24 -23
  16. package/dist/{PaymentsPage-BXPvKon-.js.map → PaymentsPage-DY6BclkN.js.map} +1 -1
  17. package/dist/PickupCreatePage-CCSiyFQF.js +706 -0
  18. package/dist/PickupCreatePage-CCSiyFQF.js.map +1 -0
  19. package/dist/{PickupsPage-D66_Wta4.js → PickupsPage-DGi6T5Of.js} +83 -90
  20. package/dist/PickupsPage-DGi6T5Of.js.map +1 -0
  21. package/dist/PmGuard-C90yhpsN.js +592 -0
  22. package/dist/PmGuard-C90yhpsN.js.map +1 -0
  23. package/dist/{PmTable-B9970kPY.js → PmTable-BkK65bJQ.js} +98 -98
  24. package/dist/PmTable-BkK65bJQ.js.map +1 -0
  25. package/dist/{ProductEditPage-B8qFTCW9.js → ProductEditPage-CQj9egzW.js} +138 -137
  26. package/dist/ProductEditPage-CQj9egzW.js.map +1 -0
  27. package/dist/{ProductsPage-C7_r9cKn.js → ProductsPage-i8QVw_Jm.js} +65 -64
  28. package/dist/{ProductsPage-C7_r9cKn.js.map → ProductsPage-i8QVw_Jm.js.map} +1 -1
  29. package/dist/PurchaseCreatePage-Bp6bl9n8.js +591 -0
  30. package/dist/PurchaseCreatePage-Bp6bl9n8.js.map +1 -0
  31. package/dist/{PurchaseRequestDetailPage-C7aAwEqw.js → PurchaseRequestDetailPage-CNAqIFef.js} +216 -215
  32. package/dist/PurchaseRequestDetailPage-CNAqIFef.js.map +1 -0
  33. package/dist/{PurchaseRequestsPage-BwCkbpaX.js → PurchaseRequestsPage-BJqDlNrc.js} +57 -56
  34. package/dist/{PurchaseRequestsPage-BwCkbpaX.js.map → PurchaseRequestsPage-BJqDlNrc.js.map} +1 -1
  35. package/dist/{PurchasesPage-CvaZouVy.js → PurchasesPage-BQEToymQ.js} +76 -75
  36. package/dist/{PurchasesPage-CvaZouVy.js.map → PurchasesPage-BQEToymQ.js.map} +1 -1
  37. package/dist/{SaleCreatePage-DP1Qmltu.js → SaleCreatePage-DbfBK4PH.js} +149 -173
  38. package/dist/SaleCreatePage-DbfBK4PH.js.map +1 -0
  39. package/dist/{SalesPage-CO3cdYX5.js → SalesPage-CTBJMxZe.js} +50 -49
  40. package/dist/SalesPage-CTBJMxZe.js.map +1 -0
  41. package/dist/SettingsPage-CiwVmzM3.js +663 -0
  42. package/dist/SettingsPage-CiwVmzM3.js.map +1 -0
  43. package/dist/{StorageUnitsPage-B9Hr_RkW.js → StorageUnitsPage-BV7nK_iE.js} +57 -56
  44. package/dist/{StorageUnitsPage-B9Hr_RkW.js.map → StorageUnitsPage-BV7nK_iE.js.map} +1 -1
  45. package/dist/{TransactionsPage-HKIGwEZN.js → TransactionsPage-Cocn4901.js} +55 -54
  46. package/dist/TransactionsPage-Cocn4901.js.map +1 -0
  47. package/dist/TransferCreatePage-DbjcjuOg.js +316 -0
  48. package/dist/TransferCreatePage-DbjcjuOg.js.map +1 -0
  49. package/dist/TransfersPage-BFVF7Xvc.js +471 -0
  50. package/dist/TransfersPage-BFVF7Xvc.js.map +1 -0
  51. package/dist/VialsPage-BNzYTLVd.js +321 -0
  52. package/dist/VialsPage-BNzYTLVd.js.map +1 -0
  53. package/dist/index.js +652 -34
  54. package/dist/index.js.map +1 -1
  55. package/dist/settingsStore-KW217unV.js +417 -0
  56. package/dist/settingsStore-KW217unV.js.map +1 -0
  57. package/package.json +1 -1
  58. package/dist/BrandsPage-CSA3meke.js.map +0 -1
  59. package/dist/DashboardPage-CqaquOs2.js.map +0 -1
  60. package/dist/InventoryPage-CPbzfDMR.js.map +0 -1
  61. package/dist/MemberProfileCard-0vjO3Gzd.js.map +0 -1
  62. package/dist/PaymentCreatePage-BYmDZAIB.js.map +0 -1
  63. package/dist/PickupCreatePage-CMGwoAXj.js +0 -426
  64. package/dist/PickupCreatePage-CMGwoAXj.js.map +0 -1
  65. package/dist/PickupsPage-D66_Wta4.js.map +0 -1
  66. package/dist/PmTable-B9970kPY.js.map +0 -1
  67. package/dist/ProductEditPage-B8qFTCW9.js.map +0 -1
  68. package/dist/PurchaseCreatePage-CDfNDcKG.js +0 -627
  69. package/dist/PurchaseCreatePage-CDfNDcKG.js.map +0 -1
  70. package/dist/PurchaseRequestDetailPage-C7aAwEqw.js.map +0 -1
  71. package/dist/SaleCreatePage-DP1Qmltu.js.map +0 -1
  72. package/dist/SalesPage-CO3cdYX5.js.map +0 -1
  73. package/dist/SettingsPage-DvVRwSFw.js +0 -711
  74. package/dist/SettingsPage-DvVRwSFw.js.map +0 -1
  75. package/dist/TransactionsPage-HKIGwEZN.js.map +0 -1
  76. package/dist/TransferCreatePage-DMuZqQ3c.js +0 -363
  77. package/dist/TransferCreatePage-DMuZqQ3c.js.map +0 -1
  78. package/dist/TransfersPage-COIyouL4.js +0 -480
  79. package/dist/TransfersPage-COIyouL4.js.map +0 -1
  80. package/dist/VialsPage-BNPUwGCU.js +0 -922
  81. package/dist/VialsPage-BNPUwGCU.js.map +0 -1
  82. package/dist/currency-ClRLIEg2.js +0 -1372
  83. package/dist/currency-ClRLIEg2.js.map +0 -1
@@ -1,19 +1,20 @@
1
- import { C as e, a as t, i as ee, n, o as r, r as te, st as ne } from "./currency-ClRLIEg2.js";
2
- import { c as re, n as i, s as ie, t as ae } from "./PmTable-B9970kPY.js";
3
- import { m as a, n as o, t as s } from "./validation-Ba7puFIO.js";
4
- import { t as c } from "./useFieldErrors-hDG8ox_x.js";
5
- import { useState as l } from "react";
6
- import { jsx as u, jsxs as d } from "react/jsx-runtime";
7
- import { v4 as oe } from "uuid";
8
- import { Alert as se, Box as f, Button as p, Checkbox as ce, Chip as m, Dialog as h, DialogActions as g, DialogContent as _, DialogTitle as le, FormControlLabel as v, Skeleton as y, Stack as b, TableBody as x, TableCell as S, TableHead as ue, TableRow as C, TextField as w, Typography as T } from "@mui/material";
9
- import E from "@mui/icons-material/AddRounded";
10
- import D from "@mui/icons-material/RefreshRounded";
11
- import { showToast as O } from "@/common/toaster/toaster";
1
+ import { Q as e, m as t } from "./settingsStore-KW217unV.js";
2
+ import { c as n, n as r, s as i, t as a } from "./PmTable-BkK65bJQ.js";
3
+ import { m as o, n as s, t as ee } from "./validation-Ba7puFIO.js";
4
+ import { t as te } from "./useFieldErrors-hDG8ox_x.js";
5
+ import { a as ne, i as re, n as ie, r as ae, t as oe } from "./PmGuard-C90yhpsN.js";
6
+ import { useState as c } from "react";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { Alert as d, Box as f, Button as p, Checkbox as m, Chip as h, Dialog as g, DialogActions as _, DialogContent as v, DialogTitle as se, FormControlLabel as y, Skeleton as ce, Stack as b, TableBody as le, TableCell as x, TableHead as ue, TableRow as S, TextField as C, Typography as w } from "@mui/material";
9
+ import { showToast as T } from "@/common/toaster/toaster";
10
+ import { v4 as E } from "uuid";
11
+ import D from "@mui/icons-material/AddRounded";
12
+ import O from "@mui/icons-material/RefreshRounded";
12
13
  import k from "@/views/custom-components/CustomSwitch";
13
14
  import A from "@mui/icons-material/CategoryRounded";
14
15
  //#region src/views/CategoriesPage.jsx
15
16
  function j() {
16
- let j = t().has("update.manage.productManagement.category"), [M, N] = l([]), [P, F] = l(!1), [I, L] = l(""), [R, z] = l(!1), [B, V] = l(null), [H, U] = l(K()), [W, de] = l(!1), G = c();
17
+ let j = re().has("update.manage.productManagement.category"), [M, N] = c([]), [P, F] = c(!1), [I, L] = c(""), [R, z] = c(!1), [B, V] = c(null), [H, U] = c(K()), [W, de] = c(!1), G = te();
17
18
  function K() {
18
19
  return {
19
20
  id: "",
@@ -27,10 +28,10 @@ function j() {
27
28
  async function q() {
28
29
  F(!0), L("");
29
30
  try {
30
- N(await e(void 0, !0));
31
+ N(await t(void 0, !0));
31
32
  } catch (e) {
32
33
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to load categories";
33
- L(t), O({
34
+ L(t), T({
34
35
  message: t,
35
36
  type: "error"
36
37
  });
@@ -38,13 +39,13 @@ function j() {
38
39
  F(!1);
39
40
  }
40
41
  }
41
- ee("view.manage.productManagement.category", () => {
42
+ ae("view.manage.productManagement.category", () => {
42
43
  q();
43
44
  }, []);
44
45
  function J() {
45
46
  V(null), U({
46
47
  ...K(),
47
- id: oe()
48
+ id: E()
48
49
  }), G.reset(), L(""), z(!0);
49
50
  }
50
51
  function fe(e) {
@@ -57,71 +58,71 @@ function j() {
57
58
  isActive: e.isActive !== !1
58
59
  }), z(!0);
59
60
  }
60
- let Y = o(H.code, { required: !0 }), X = H.code.trim().toUpperCase(), pe = !Y && X && M.some((e) => e.id !== H.id && (e.code || "").toUpperCase() === X), Z = {
61
- name: a(H.name, "Name"),
61
+ let Y = s(H.code, { required: !0 }), X = H.code.trim().toUpperCase(), pe = !Y && X && M.some((e) => e.id !== H.id && (e.code || "").toUpperCase() === X), Z = {
62
+ name: o(H.name, "Name"),
62
63
  code: Y || (pe ? "Code is already in use — pick a different one." : "")
63
- }, Q = s(Z);
64
+ }, Q = ee(Z);
64
65
  async function me() {
65
66
  if (!Q) {
66
67
  G.markAllTouched(), L("Please fix the highlighted fields.");
67
68
  return;
68
69
  }
69
70
  try {
70
- await ne({
71
+ await e({
71
72
  id: H.id,
72
73
  name: H.name.trim(),
73
74
  code: H.code.trim().toUpperCase(),
74
75
  description: H.description || null,
75
76
  icon: H.icon || null,
76
77
  isActive: H.isActive
77
- }), O({
78
+ }), T({
78
79
  message: "Category saved.",
79
80
  type: "success"
80
81
  }), z(!1), await q();
81
82
  } catch (e) {
82
83
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to save category";
83
- L(t), O({
84
+ L(t), T({
84
85
  message: t,
85
86
  type: "error"
86
87
  });
87
88
  }
88
89
  }
89
90
  let $ = W ? M : M.filter((e) => e.isActive !== !1);
90
- return /* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(te, {}), /* @__PURE__ */ d(n, {
91
+ return /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(ie, {}), /* @__PURE__ */ u(oe, {
91
92
  perm: "view.manage.productManagement.category",
92
- children: [/* @__PURE__ */ d(r, {
93
+ children: [/* @__PURE__ */ u(ne, {
93
94
  title: "Product Categories",
94
95
  subtitle: "Groups of products with similar handling requirements.",
95
96
  chips: ["Catalog"],
96
- actions: /* @__PURE__ */ d(b, {
97
+ actions: /* @__PURE__ */ u(b, {
97
98
  direction: "row",
98
99
  spacing: 1,
99
- children: [/* @__PURE__ */ u(p, {
100
+ children: [/* @__PURE__ */ l(p, {
100
101
  variant: "outlined",
101
- startIcon: /* @__PURE__ */ u(D, {}),
102
+ startIcon: /* @__PURE__ */ l(O, {}),
102
103
  onClick: () => void q(),
103
104
  children: "Refresh"
104
- }), j ? /* @__PURE__ */ u(p, {
105
+ }), j ? /* @__PURE__ */ l(p, {
105
106
  variant: "contained",
106
- startIcon: /* @__PURE__ */ u(E, {}),
107
+ startIcon: /* @__PURE__ */ l(D, {}),
107
108
  onClick: J,
108
109
  children: "New Category"
109
110
  }) : null]
110
111
  }),
111
- children: [I ? /* @__PURE__ */ u(se, {
112
+ children: [I ? /* @__PURE__ */ l(d, {
112
113
  severity: "error",
113
114
  sx: { mb: 2 },
114
115
  children: I
115
- }) : null, /* @__PURE__ */ u(re, {
116
+ }) : null, /* @__PURE__ */ l(n, {
116
117
  eyebrow: "Master data",
117
118
  title: "Product categories",
118
119
  subtitle: P ? "Loading…" : `${$.length} ${$.length === 1 ? "category" : "categories"}`,
119
- actions: /* @__PURE__ */ u(v, {
120
- control: /* @__PURE__ */ u(k, {
120
+ actions: /* @__PURE__ */ l(y, {
121
+ control: /* @__PURE__ */ l(k, {
121
122
  checked: W,
122
123
  onChange: (e) => de(e.target.checked)
123
124
  }),
124
- label: /* @__PURE__ */ u(T, {
125
+ label: /* @__PURE__ */ l(w, {
125
126
  variant: "body2",
126
127
  sx: { fontWeight: 600 },
127
128
  children: "Show inactive"
@@ -132,33 +133,33 @@ function j() {
132
133
  ml: 0
133
134
  }
134
135
  }),
135
- children: /* @__PURE__ */ d(ie, { children: [/* @__PURE__ */ u(ue, { children: /* @__PURE__ */ d(C, { children: [
136
- /* @__PURE__ */ u(S, { children: "Code" }),
137
- /* @__PURE__ */ u(S, { children: "Name" }),
138
- /* @__PURE__ */ u(S, { children: "Description" }),
139
- /* @__PURE__ */ u(S, { children: "Status" }),
140
- /* @__PURE__ */ u(S, {
136
+ children: /* @__PURE__ */ u(i, { children: [/* @__PURE__ */ l(ue, { children: /* @__PURE__ */ u(S, { children: [
137
+ /* @__PURE__ */ l(x, { children: "Code" }),
138
+ /* @__PURE__ */ l(x, { children: "Name" }),
139
+ /* @__PURE__ */ l(x, { children: "Description" }),
140
+ /* @__PURE__ */ l(x, { children: "Status" }),
141
+ /* @__PURE__ */ l(x, {
141
142
  align: "right",
142
143
  children: "Action"
143
144
  })
144
- ] }) }), /* @__PURE__ */ u(x, { children: P ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ u(C, { children: Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ u(S, { children: /* @__PURE__ */ u(y, { height: 22 }) }, t)) }, t)) : $.length === 0 ? /* @__PURE__ */ u(ae, {
145
+ ] }) }), /* @__PURE__ */ l(le, { children: P ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ l(S, { children: Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ l(x, { children: /* @__PURE__ */ l(ce, { height: 22 }) }, t)) }, t)) : $.length === 0 ? /* @__PURE__ */ l(a, {
145
146
  colSpan: 5,
146
147
  icon: A,
147
148
  title: M.length === 0 ? "No categories yet" : "No active categories",
148
149
  hint: M.length === 0 ? "Categories control how products are managed. For example, vaccines need special configuration." : "Turn on “Show inactive” to see deactivated categories.",
149
- action: M.length === 0 && j ? /* @__PURE__ */ u(p, {
150
+ action: M.length === 0 && j ? /* @__PURE__ */ l(p, {
150
151
  variant: "contained",
151
152
  size: "small",
152
- startIcon: /* @__PURE__ */ u(E, {}),
153
+ startIcon: /* @__PURE__ */ l(D, {}),
153
154
  onClick: J,
154
155
  children: "Create first category"
155
156
  }) : null
156
- }) : $.map((e) => /* @__PURE__ */ d(C, {
157
+ }) : $.map((e) => /* @__PURE__ */ u(S, {
157
158
  hover: !0,
158
159
  children: [
159
- /* @__PURE__ */ u(S, {
160
+ /* @__PURE__ */ l(x, {
160
161
  sx: { maxWidth: 160 },
161
- children: /* @__PURE__ */ u(f, {
162
+ children: /* @__PURE__ */ l(f, {
162
163
  component: "span",
163
164
  sx: {
164
165
  display: "inline-block",
@@ -176,9 +177,9 @@ function j() {
176
177
  children: e.code
177
178
  })
178
179
  }),
179
- /* @__PURE__ */ u(S, {
180
+ /* @__PURE__ */ l(x, {
180
181
  sx: { maxWidth: 220 },
181
- children: /* @__PURE__ */ u(T, {
182
+ children: /* @__PURE__ */ l(w, {
182
183
  variant: "body2",
183
184
  sx: {
184
185
  fontWeight: 700,
@@ -187,9 +188,9 @@ function j() {
187
188
  children: e.name
188
189
  })
189
190
  }),
190
- /* @__PURE__ */ u(S, {
191
+ /* @__PURE__ */ l(x, {
191
192
  sx: { maxWidth: 360 },
192
- children: e.description ? /* @__PURE__ */ u(T, {
193
+ children: e.description ? /* @__PURE__ */ l(w, {
193
194
  variant: "caption",
194
195
  color: "text.secondary",
195
196
  sx: {
@@ -197,13 +198,13 @@ function j() {
197
198
  wordBreak: "break-word"
198
199
  },
199
200
  children: e.description
200
- }) : /* @__PURE__ */ u(T, {
201
+ }) : /* @__PURE__ */ l(w, {
201
202
  variant: "caption",
202
203
  color: "text.disabled",
203
204
  children: "—"
204
205
  })
205
206
  }),
206
- /* @__PURE__ */ u(S, { children: /* @__PURE__ */ u(m, {
207
+ /* @__PURE__ */ l(x, { children: /* @__PURE__ */ l(h, {
207
208
  size: "small",
208
209
  label: e.isActive ? "Active" : "Inactive",
209
210
  color: e.isActive ? "success" : "default",
@@ -214,9 +215,9 @@ function j() {
214
215
  height: 22
215
216
  }
216
217
  }) }),
217
- /* @__PURE__ */ u(S, {
218
+ /* @__PURE__ */ l(x, {
218
219
  align: "right",
219
- children: j ? /* @__PURE__ */ u(p, {
220
+ children: j ? /* @__PURE__ */ l(p, {
220
221
  size: "small",
221
222
  variant: "outlined",
222
223
  onClick: () => fe(e),
@@ -226,20 +227,20 @@ function j() {
226
227
  ]
227
228
  }, e.id)) })] })
228
229
  })]
229
- }), /* @__PURE__ */ d(h, {
230
+ }), /* @__PURE__ */ u(g, {
230
231
  open: R,
231
232
  onClose: () => z(!1),
232
233
  fullWidth: !0,
233
234
  maxWidth: "sm",
234
235
  children: [
235
- /* @__PURE__ */ u(le, { children: B ? "Edit Category" : "New Category" }),
236
- /* @__PURE__ */ u(_, {
236
+ /* @__PURE__ */ l(se, { children: B ? "Edit Category" : "New Category" }),
237
+ /* @__PURE__ */ l(v, {
237
238
  dividers: !0,
238
- children: /* @__PURE__ */ d(b, {
239
+ children: /* @__PURE__ */ u(b, {
239
240
  spacing: 2,
240
241
  sx: { pt: 1 },
241
242
  children: [
242
- /* @__PURE__ */ u(w, {
243
+ /* @__PURE__ */ l(C, {
243
244
  required: !0,
244
245
  label: "Name",
245
246
  size: "small",
@@ -253,13 +254,13 @@ function j() {
253
254
  onBlur: G.onBlur("name"),
254
255
  error: G.show("name") && !!Z.name,
255
256
  FormHelperTextProps: { component: "div" },
256
- helperText: /* @__PURE__ */ u(i, {
257
+ helperText: /* @__PURE__ */ l(r, {
257
258
  message: G.show("name") ? Z.name : "",
258
259
  value: H.name,
259
260
  max: 255
260
261
  })
261
262
  }),
262
- /* @__PURE__ */ u(w, {
263
+ /* @__PURE__ */ l(C, {
263
264
  required: !0,
264
265
  label: "Code (uppercase, A-Z, 0-9, _)",
265
266
  size: "small",
@@ -273,13 +274,13 @@ function j() {
273
274
  onBlur: G.onBlur("code"),
274
275
  error: G.show("code") && !!Z.code,
275
276
  FormHelperTextProps: { component: "div" },
276
- helperText: /* @__PURE__ */ u(i, {
277
+ helperText: /* @__PURE__ */ l(r, {
277
278
  message: G.show("code") ? Z.code : "Must be unique.",
278
279
  value: H.code,
279
280
  max: 100
280
281
  })
281
282
  }),
282
- /* @__PURE__ */ u(w, {
283
+ /* @__PURE__ */ l(C, {
283
284
  label: "Description (optional)",
284
285
  size: "small",
285
286
  multiline: !0,
@@ -292,13 +293,13 @@ function j() {
292
293
  description: e.target.value
293
294
  }),
294
295
  FormHelperTextProps: { component: "div" },
295
- helperText: /* @__PURE__ */ u(i, {
296
+ helperText: /* @__PURE__ */ l(r, {
296
297
  message: "",
297
298
  value: H.description,
298
299
  max: 500
299
300
  })
300
301
  }),
301
- /* @__PURE__ */ u(w, {
302
+ /* @__PURE__ */ l(C, {
302
303
  label: "Icon (optional)",
303
304
  size: "small",
304
305
  fullWidth: !0,
@@ -308,8 +309,8 @@ function j() {
308
309
  icon: e.target.value
309
310
  })
310
311
  }),
311
- /* @__PURE__ */ u(v, {
312
- control: /* @__PURE__ */ u(ce, {
312
+ /* @__PURE__ */ l(y, {
313
+ control: /* @__PURE__ */ l(m, {
313
314
  checked: H.isActive,
314
315
  onChange: (e) => U({
315
316
  ...H,
@@ -321,10 +322,10 @@ function j() {
321
322
  ]
322
323
  })
323
324
  }),
324
- /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(p, {
325
+ /* @__PURE__ */ u(_, { children: [/* @__PURE__ */ l(p, {
325
326
  onClick: () => z(!1),
326
327
  children: "Cancel"
327
- }), /* @__PURE__ */ u(p, {
328
+ }), /* @__PURE__ */ l(p, {
328
329
  variant: "contained",
329
330
  disabled: !Q,
330
331
  onClick: () => void me(),
@@ -337,4 +338,4 @@ function j() {
337
338
  //#endregion
338
339
  export { j as default };
339
340
 
340
- //# sourceMappingURL=CategoriesPage-BrspzkJL.js.map
341
+ //# sourceMappingURL=CategoriesPage-COqi3pMi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesPage-BrspzkJL.js","names":[],"sources":["../src/views/CategoriesPage.jsx"],"sourcesContent":["import { useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport CategoryRoundedIcon from '@mui/icons-material/CategoryRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport CustomSwitch from '@/views/custom-components/CustomSwitch';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport { PmEmptyRow, PmFieldHelp, PmTable, PmTableCard } from '@pm/components/PmTable';\nimport { getCategories, upsertCategory } from '@pm/services/pmApi';\nimport { isClean, validateCode, validateRequired } from '@pm/utils/validation';\nimport { useFieldErrors } from '@pm/utils/useFieldErrors';\n\nexport default function CategoriesPage() {\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.category');\n const [items, setItems] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [openDialog, setOpenDialog] = useState(false);\n const [editing, setEditing] = useState(null);\n const [form, setForm] = useState(emptyForm());\n // Default to active-only; the toggle above the table reveals inactive rows.\n const [showInactive, setShowInactive] = useState(false);\n const fieldErrors = useFieldErrors();\n\n function emptyForm() {\n return { id: '', name: '', code: '', description: '', icon: '', isActive: true };\n }\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const data = await getCategories(undefined, true);\n setItems(data);\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load categories';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.category', () => {\n void load();\n }, []);\n\n function openCreate() {\n setEditing(null);\n setForm({ ...emptyForm(), id: uuidv4() });\n fieldErrors.reset();\n setError('');\n setOpenDialog(true);\n }\n\n function openEdit(item) {\n setEditing(item);\n fieldErrors.reset();\n setError('');\n setForm({\n id: item.id,\n name: item.name ?? '',\n code: item.code ?? '',\n description: item.description ?? '',\n icon: item.icon ?? '',\n isActive: item.isActive !== false,\n });\n setOpenDialog(true);\n }\n\n const codeBase = validateCode(form.code, { required: true });\n const codeNorm = form.code.trim().toUpperCase();\n const codeClash = !codeBase\n && codeNorm\n && items.some((c) => c.id !== form.id && (c.code || '').toUpperCase() === codeNorm);\n const formErrors = {\n name: validateRequired(form.name, 'Name'),\n code: codeBase || (codeClash ? 'Code is already in use — pick a different one.' : ''),\n };\n const formIsValid = isClean(formErrors);\n\n async function save() {\n if (!formIsValid) {\n fieldErrors.markAllTouched();\n setError('Please fix the highlighted fields.');\n return;\n }\n try {\n await upsertCategory({\n id: form.id,\n name: form.name.trim(),\n code: form.code.trim().toUpperCase(),\n description: form.description || null,\n icon: form.icon || null,\n isActive: form.isActive,\n });\n showToast({ message: 'Category saved.', type: 'success' });\n setOpenDialog(false);\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to save category';\n setError(message);\n showToast({ message, type: 'error' });\n }\n }\n\n const visible = showInactive ? items : items.filter((c) => c.isActive !== false);\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.category'}>\n <PmPageShell\n title=\"Product Categories\"\n subtitle=\"Groups of products with similar handling requirements.\"\n chips={['Catalog']}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canWrite ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={openCreate}>New Category</Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Master data\"\n title=\"Product categories\"\n subtitle={loading ? 'Loading…' : `${visible.length} ${visible.length === 1 ? 'category' : 'categories'}`}\n actions={\n <FormControlLabel\n control={<CustomSwitch checked={showInactive}\n onChange={(e) => setShowInactive(e.target.checked)} />}\n label={<Typography variant=\"body2\" sx={{ fontWeight: 600 }}>Show inactive</Typography>}\n labelPlacement=\"start\"\n sx={{ mr: 0.5, ml: 0 }}\n />\n }\n >\n <PmTable>\n <TableHead>\n <TableRow>\n <TableCell>Code</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Description</TableCell>\n <TableCell>Status</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 4 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 5 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : visible.length === 0 ? (\n <PmEmptyRow\n colSpan={5}\n icon={CategoryRoundedIcon}\n title={items.length === 0 ? 'No categories yet' : 'No active categories'}\n hint={items.length === 0\n ? 'Categories control how products are managed. For example, vaccines need special configuration.'\n : 'Turn on “Show inactive” to see deactivated categories.'}\n action={items.length === 0 && canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />} onClick={openCreate}>\n Create first category\n </Button>\n ) : null}\n />\n ) : visible.map((c) => (\n <TableRow key={c.id} hover>\n <TableCell sx={{ maxWidth: 160 }}>\n <Box component=\"span\" sx={{\n display: 'inline-block', px: 0.85, py: 0.25, borderRadius: 1,\n bgcolor: 'grey.100', fontFamily: 'monospace', fontSize: '0.72rem', fontWeight: 800, letterSpacing: 0.4,\n maxWidth: '100%', wordBreak: 'break-all',\n }}>\n {c.code}\n </Box>\n </TableCell>\n <TableCell sx={{ maxWidth: 220 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, wordBreak: 'break-word' }}>{c.name}</Typography>\n </TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {c.description\n ? <Typography variant=\"caption\" color=\"text.secondary\"\n sx={{ display: 'block', wordBreak: 'break-word' }}>\n {c.description}\n </Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell>\n <Chip\n size=\"small\"\n label={c.isActive ? 'Active' : 'Inactive'}\n color={c.isActive ? 'success' : 'default'}\n variant={c.isActive ? 'filled' : 'outlined'}\n sx={{ fontWeight: 700, borderRadius: 1.5, height: 22 }}\n />\n </TableCell>\n <TableCell align=\"right\">\n {canWrite ? (\n <Button size=\"small\" variant=\"outlined\" onClick={() => openEdit(c)}>Edit</Button>\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n\n <Dialog open={openDialog} onClose={() => setOpenDialog(false)} fullWidth maxWidth=\"sm\">\n <DialogTitle>{editing ? 'Edit Category' : 'New Category'}</DialogTitle>\n <DialogContent dividers>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n required\n label=\"Name\" size=\"small\" fullWidth\n value={form.name}\n inputProps={{ maxLength: 255 }}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n onBlur={fieldErrors.onBlur('name')}\n error={fieldErrors.show('name') && !!formErrors.name}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message={fieldErrors.show('name') ? formErrors.name : ''} value={form.name} max={255} />}\n />\n <TextField\n required\n label=\"Code (uppercase, A-Z, 0-9, _)\"\n size=\"small\" fullWidth\n value={form.code}\n inputProps={{ maxLength: 100 }}\n onChange={(e) => setForm({ ...form, code: e.target.value.toUpperCase() })}\n onBlur={fieldErrors.onBlur('code')}\n error={fieldErrors.show('code') && !!formErrors.code}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message={fieldErrors.show('code') ? formErrors.code : 'Must be unique.'} value={form.code} max={100} />}\n />\n <TextField label=\"Description (optional)\" size=\"small\" multiline minRows={2} fullWidth value={form.description}\n inputProps={{ maxLength: 500 }}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message=\"\" value={form.description} max={500} />} />\n <TextField label=\"Icon (optional)\" size=\"small\" fullWidth value={form.icon}\n onChange={(e) => setForm({ ...form, icon: e.target.value })} />\n <FormControlLabel\n control={<Checkbox checked={form.isActive}\n onChange={(e) => setForm({ ...form, isActive: e.target.checked })} />}\n label=\"Active\" />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpenDialog(false)}>Cancel</Button>\n <Button variant=\"contained\" disabled={!formIsValid} onClick={() => void save()}>Save</Button>\n </DialogActions>\n </Dialog>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"CategoriesPage-COqi3pMi.js","names":[],"sources":["../src/views/CategoriesPage.jsx"],"sourcesContent":["import { useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControlLabel,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport CategoryRoundedIcon from '@mui/icons-material/CategoryRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport CustomSwitch from '@/views/custom-components/CustomSwitch';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport { PmEmptyRow, PmFieldHelp, PmTable, PmTableCard } from '@pm/components/PmTable';\nimport { getCategories, upsertCategory } from '@pm/services/pmApi';\nimport { isClean, validateCode, validateRequired } from '@pm/utils/validation';\nimport { useFieldErrors } from '@pm/utils/useFieldErrors';\n\nexport default function CategoriesPage() {\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.category');\n const [items, setItems] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [openDialog, setOpenDialog] = useState(false);\n const [editing, setEditing] = useState(null);\n const [form, setForm] = useState(emptyForm());\n // Default to active-only; the toggle above the table reveals inactive rows.\n const [showInactive, setShowInactive] = useState(false);\n const fieldErrors = useFieldErrors();\n\n function emptyForm() {\n return { id: '', name: '', code: '', description: '', icon: '', isActive: true };\n }\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const data = await getCategories(undefined, true);\n setItems(data);\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load categories';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.category', () => {\n void load();\n }, []);\n\n function openCreate() {\n setEditing(null);\n setForm({ ...emptyForm(), id: uuidv4() });\n fieldErrors.reset();\n setError('');\n setOpenDialog(true);\n }\n\n function openEdit(item) {\n setEditing(item);\n fieldErrors.reset();\n setError('');\n setForm({\n id: item.id,\n name: item.name ?? '',\n code: item.code ?? '',\n description: item.description ?? '',\n icon: item.icon ?? '',\n isActive: item.isActive !== false,\n });\n setOpenDialog(true);\n }\n\n const codeBase = validateCode(form.code, { required: true });\n const codeNorm = form.code.trim().toUpperCase();\n const codeClash = !codeBase\n && codeNorm\n && items.some((c) => c.id !== form.id && (c.code || '').toUpperCase() === codeNorm);\n const formErrors = {\n name: validateRequired(form.name, 'Name'),\n code: codeBase || (codeClash ? 'Code is already in use — pick a different one.' : ''),\n };\n const formIsValid = isClean(formErrors);\n\n async function save() {\n if (!formIsValid) {\n fieldErrors.markAllTouched();\n setError('Please fix the highlighted fields.');\n return;\n }\n try {\n await upsertCategory({\n id: form.id,\n name: form.name.trim(),\n code: form.code.trim().toUpperCase(),\n description: form.description || null,\n icon: form.icon || null,\n isActive: form.isActive,\n });\n showToast({ message: 'Category saved.', type: 'success' });\n setOpenDialog(false);\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to save category';\n setError(message);\n showToast({ message, type: 'error' });\n }\n }\n\n const visible = showInactive ? items : items.filter((c) => c.isActive !== false);\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.category'}>\n <PmPageShell\n title=\"Product Categories\"\n subtitle=\"Groups of products with similar handling requirements.\"\n chips={['Catalog']}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canWrite ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={openCreate}>New Category</Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Master data\"\n title=\"Product categories\"\n subtitle={loading ? 'Loading…' : `${visible.length} ${visible.length === 1 ? 'category' : 'categories'}`}\n actions={\n <FormControlLabel\n control={<CustomSwitch checked={showInactive}\n onChange={(e) => setShowInactive(e.target.checked)} />}\n label={<Typography variant=\"body2\" sx={{ fontWeight: 600 }}>Show inactive</Typography>}\n labelPlacement=\"start\"\n sx={{ mr: 0.5, ml: 0 }}\n />\n }\n >\n <PmTable>\n <TableHead>\n <TableRow>\n <TableCell>Code</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Description</TableCell>\n <TableCell>Status</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 4 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 5 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : visible.length === 0 ? (\n <PmEmptyRow\n colSpan={5}\n icon={CategoryRoundedIcon}\n title={items.length === 0 ? 'No categories yet' : 'No active categories'}\n hint={items.length === 0\n ? 'Categories control how products are managed. For example, vaccines need special configuration.'\n : 'Turn on “Show inactive” to see deactivated categories.'}\n action={items.length === 0 && canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />} onClick={openCreate}>\n Create first category\n </Button>\n ) : null}\n />\n ) : visible.map((c) => (\n <TableRow key={c.id} hover>\n <TableCell sx={{ maxWidth: 160 }}>\n <Box component=\"span\" sx={{\n display: 'inline-block', px: 0.85, py: 0.25, borderRadius: 1,\n bgcolor: 'grey.100', fontFamily: 'monospace', fontSize: '0.72rem', fontWeight: 800, letterSpacing: 0.4,\n maxWidth: '100%', wordBreak: 'break-all',\n }}>\n {c.code}\n </Box>\n </TableCell>\n <TableCell sx={{ maxWidth: 220 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, wordBreak: 'break-word' }}>{c.name}</Typography>\n </TableCell>\n <TableCell sx={{ maxWidth: 360 }}>\n {c.description\n ? <Typography variant=\"caption\" color=\"text.secondary\"\n sx={{ display: 'block', wordBreak: 'break-word' }}>\n {c.description}\n </Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell>\n <Chip\n size=\"small\"\n label={c.isActive ? 'Active' : 'Inactive'}\n color={c.isActive ? 'success' : 'default'}\n variant={c.isActive ? 'filled' : 'outlined'}\n sx={{ fontWeight: 700, borderRadius: 1.5, height: 22 }}\n />\n </TableCell>\n <TableCell align=\"right\">\n {canWrite ? (\n <Button size=\"small\" variant=\"outlined\" onClick={() => openEdit(c)}>Edit</Button>\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n\n <Dialog open={openDialog} onClose={() => setOpenDialog(false)} fullWidth maxWidth=\"sm\">\n <DialogTitle>{editing ? 'Edit Category' : 'New Category'}</DialogTitle>\n <DialogContent dividers>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <TextField\n required\n label=\"Name\" size=\"small\" fullWidth\n value={form.name}\n inputProps={{ maxLength: 255 }}\n onChange={(e) => setForm({ ...form, name: e.target.value })}\n onBlur={fieldErrors.onBlur('name')}\n error={fieldErrors.show('name') && !!formErrors.name}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message={fieldErrors.show('name') ? formErrors.name : ''} value={form.name} max={255} />}\n />\n <TextField\n required\n label=\"Code (uppercase, A-Z, 0-9, _)\"\n size=\"small\" fullWidth\n value={form.code}\n inputProps={{ maxLength: 100 }}\n onChange={(e) => setForm({ ...form, code: e.target.value.toUpperCase() })}\n onBlur={fieldErrors.onBlur('code')}\n error={fieldErrors.show('code') && !!formErrors.code}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message={fieldErrors.show('code') ? formErrors.code : 'Must be unique.'} value={form.code} max={100} />}\n />\n <TextField label=\"Description (optional)\" size=\"small\" multiline minRows={2} fullWidth value={form.description}\n inputProps={{ maxLength: 500 }}\n onChange={(e) => setForm({ ...form, description: e.target.value })}\n FormHelperTextProps={{ component: 'div' }}\n helperText={<PmFieldHelp message=\"\" value={form.description} max={500} />} />\n <TextField label=\"Icon (optional)\" size=\"small\" fullWidth value={form.icon}\n onChange={(e) => setForm({ ...form, icon: e.target.value })} />\n <FormControlLabel\n control={<Checkbox checked={form.isActive}\n onChange={(e) => setForm({ ...form, isActive: e.target.checked })} />}\n label=\"Active\" />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpenDialog(false)}>Cancel</Button>\n <Button variant=\"contained\" disabled={!formIsValid} onClick={() => void save()}>Save</Button>\n </DialogActions>\n </Dialog>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}