@argusoft/medplat-product-management 1.0.3 → 1.0.5

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 (64) hide show
  1. package/dist/{BrandsPage-NSvaMXWg.js → BrandsPage-CjL0bBk0.js} +80 -78
  2. package/dist/{BrandsPage-NSvaMXWg.js.map → BrandsPage-CjL0bBk0.js.map} +1 -1
  3. package/dist/{CategoriesPage-aZBZrDOi.js → CategoriesPage-CLcAUEvh.js} +72 -70
  4. package/dist/{CategoriesPage-aZBZrDOi.js.map → CategoriesPage-CLcAUEvh.js.map} +1 -1
  5. package/dist/{DashboardPage-DjwlOhrd.js → DashboardPage-C_H1Jrey.js} +91 -90
  6. package/dist/{DashboardPage-DjwlOhrd.js.map → DashboardPage-C_H1Jrey.js.map} +1 -1
  7. package/dist/{FacilityPicker-Chh-ZaR0.js → FacilityPicker-Diq2hnYg.js} +2 -2
  8. package/dist/{FacilityPicker-Chh-ZaR0.js.map → FacilityPicker-Diq2hnYg.js.map} +1 -1
  9. package/dist/{InventoryPage-cy76UsMp.js → InventoryPage-C1ho56CY.js} +113 -112
  10. package/dist/{InventoryPage-cy76UsMp.js.map → InventoryPage-C1ho56CY.js.map} +1 -1
  11. package/dist/{MemberProfileCard-CinPt09F.js → MemberProfileCard-BLUVRILO.js} +6 -5
  12. package/dist/{MemberProfileCard-CinPt09F.js.map → MemberProfileCard-BLUVRILO.js.map} +1 -1
  13. package/dist/{PaymentCreatePage-BJe3LyFF.js → PaymentCreatePage-mvUFdr7u.js} +125 -124
  14. package/dist/{PaymentCreatePage-BJe3LyFF.js.map → PaymentCreatePage-mvUFdr7u.js.map} +1 -1
  15. package/dist/{PaymentsPage-DxHoKksN.js → PaymentsPage-DY6BclkN.js} +21 -20
  16. package/dist/{PaymentsPage-DxHoKksN.js.map → PaymentsPage-DY6BclkN.js.map} +1 -1
  17. package/dist/{PickupCreatePage-Cq8zJ62Y.js → PickupCreatePage-CCSiyFQF.js} +63 -62
  18. package/dist/{PickupCreatePage-Cq8zJ62Y.js.map → PickupCreatePage-CCSiyFQF.js.map} +1 -1
  19. package/dist/{PickupsPage-BOygBQAb.js → PickupsPage-DGi6T5Of.js} +42 -41
  20. package/dist/{PickupsPage-BOygBQAb.js.map → PickupsPage-DGi6T5Of.js.map} +1 -1
  21. package/dist/PmGuard-C90yhpsN.js +592 -0
  22. package/dist/PmGuard-C90yhpsN.js.map +1 -0
  23. package/dist/{PmTable-CCpaJEA_.js → PmTable-BkK65bJQ.js} +96 -96
  24. package/dist/{PmTable-CCpaJEA_.js.map → PmTable-BkK65bJQ.js.map} +1 -1
  25. package/dist/{ProductEditPage-DmdHO-fS.js → ProductEditPage-CIQKtw2Z.js} +130 -129
  26. package/dist/{ProductEditPage-DmdHO-fS.js.map → ProductEditPage-CIQKtw2Z.js.map} +1 -1
  27. package/dist/{ProductsPage-BglMe8EM.js → ProductsPage-i8QVw_Jm.js} +64 -63
  28. package/dist/{ProductsPage-BglMe8EM.js.map → ProductsPage-i8QVw_Jm.js.map} +1 -1
  29. package/dist/{PurchaseCreatePage-1tYk41RS.js → PurchaseCreatePage-73Q_xY7S.js} +120 -119
  30. package/dist/{PurchaseCreatePage-1tYk41RS.js.map → PurchaseCreatePage-73Q_xY7S.js.map} +1 -1
  31. package/dist/{PurchaseRequestDetailPage-BYLx3aBI.js → PurchaseRequestDetailPage-BR20EKBJ.js} +217 -215
  32. package/dist/{PurchaseRequestDetailPage-BYLx3aBI.js.map → PurchaseRequestDetailPage-BR20EKBJ.js.map} +1 -1
  33. package/dist/{PurchaseRequestsPage-D2yorc4s.js → PurchaseRequestsPage-BJqDlNrc.js} +57 -56
  34. package/dist/{PurchaseRequestsPage-D2yorc4s.js.map → PurchaseRequestsPage-BJqDlNrc.js.map} +1 -1
  35. package/dist/{PurchasesPage-CanQTjlw.js → PurchasesPage-BQEToymQ.js} +76 -75
  36. package/dist/{PurchasesPage-CanQTjlw.js.map → PurchasesPage-BQEToymQ.js.map} +1 -1
  37. package/dist/{SaleCreatePage-DxFvPvju.js → SaleCreatePage-BVThnWsk.js} +89 -88
  38. package/dist/{SaleCreatePage-DxFvPvju.js.map → SaleCreatePage-BVThnWsk.js.map} +1 -1
  39. package/dist/{SalesPage-CPMrdr5-.js → SalesPage-CTBJMxZe.js} +46 -45
  40. package/dist/{SalesPage-CPMrdr5-.js.map → SalesPage-CTBJMxZe.js.map} +1 -1
  41. package/dist/{SettingsPage-CEy922rW.js → SettingsPage-CiwVmzM3.js} +47 -46
  42. package/dist/{SettingsPage-CEy922rW.js.map → SettingsPage-CiwVmzM3.js.map} +1 -1
  43. package/dist/{StorageUnitsPage-DfLT6xC_.js → StorageUnitsPage--ECPMVhB.js} +55 -54
  44. package/dist/{StorageUnitsPage-DfLT6xC_.js.map → StorageUnitsPage--ECPMVhB.js.map} +1 -1
  45. package/dist/{TransactionsPage-KFUJ4O5g.js → TransactionsPage-Cocn4901.js} +54 -53
  46. package/dist/{TransactionsPage-KFUJ4O5g.js.map → TransactionsPage-Cocn4901.js.map} +1 -1
  47. package/dist/{TransferCreatePage-k1tsRGB3.js → TransferCreatePage-DbjcjuOg.js} +74 -73
  48. package/dist/{TransferCreatePage-k1tsRGB3.js.map → TransferCreatePage-DbjcjuOg.js.map} +1 -1
  49. package/dist/{TransfersPage-CDafSVO9.js → TransfersPage-BFVF7Xvc.js} +108 -107
  50. package/dist/{TransfersPage-CDafSVO9.js.map → TransfersPage-BFVF7Xvc.js.map} +1 -1
  51. package/dist/VialsPage-hZmS5xPt.js +321 -0
  52. package/dist/VialsPage-hZmS5xPt.js.map +1 -0
  53. package/dist/format-UOyOu75i.js.map +1 -1
  54. package/dist/index.js +652 -34
  55. package/dist/index.js.map +1 -1
  56. package/dist/settingsStore-KW217unV.js +417 -0
  57. package/dist/settingsStore-KW217unV.js.map +1 -0
  58. package/dist/{validation-Ba7puFIO.js → validation-BkUPqrdA.js} +11 -12
  59. package/dist/{validation-Ba7puFIO.js.map → validation-BkUPqrdA.js.map} +1 -1
  60. package/package.json +1 -1
  61. package/dist/VialsPage-DPsYFgaQ.js +0 -897
  62. package/dist/VialsPage-DPsYFgaQ.js.map +0 -1
  63. package/dist/currency-bVQ7aEk2.js +0 -1007
  64. package/dist/currency-bVQ7aEk2.js.map +0 -1
@@ -1,19 +1,20 @@
1
- import { a as e, b as t, i as ee, it as n, n as r, o as te, r as ne } from "./currency-bVQ7aEk2.js";
2
- import { c as re, n as i, s as ie, t as ae } from "./PmTable-CCpaJEA_.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-BkUPqrdA.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 = e().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,11 @@ function j() {
27
28
  async function q() {
28
29
  F(!0), L("");
29
30
  try {
30
- N(await t(void 0, !0));
31
+ let e = await t(void 0, !0);
32
+ N(e);
31
33
  } catch (e) {
32
34
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to load categories";
33
- L(t), O({
35
+ L(t), T({
34
36
  message: t,
35
37
  type: "error"
36
38
  });
@@ -38,13 +40,13 @@ function j() {
38
40
  F(!1);
39
41
  }
40
42
  }
41
- ee("view.manage.productManagement.category", () => {
43
+ ae("view.manage.productManagement.category", () => {
42
44
  q();
43
45
  }, []);
44
46
  function J() {
45
47
  V(null), U({
46
48
  ...K(),
47
- id: oe()
49
+ id: E()
48
50
  }), G.reset(), L(""), z(!0);
49
51
  }
50
52
  function fe(e) {
@@ -57,71 +59,71 @@ function j() {
57
59
  isActive: e.isActive !== !1
58
60
  }), z(!0);
59
61
  }
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"),
62
+ 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 = {
63
+ name: o(H.name, "Name"),
62
64
  code: Y || (pe ? "Code is already in use — pick a different one." : "")
63
- }, Q = s(Z);
65
+ }, Q = ee(Z);
64
66
  async function me() {
65
67
  if (!Q) {
66
68
  G.markAllTouched(), L("Please fix the highlighted fields.");
67
69
  return;
68
70
  }
69
71
  try {
70
- await n({
72
+ await e({
71
73
  id: H.id,
72
74
  name: H.name.trim(),
73
75
  code: H.code.trim().toUpperCase(),
74
76
  description: H.description || null,
75
77
  icon: H.icon || null,
76
78
  isActive: H.isActive
77
- }), O({
79
+ }), T({
78
80
  message: "Category saved.",
79
81
  type: "success"
80
82
  }), z(!1), await q();
81
83
  } catch (e) {
82
84
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to save category";
83
- L(t), O({
85
+ L(t), T({
84
86
  message: t,
85
87
  type: "error"
86
88
  });
87
89
  }
88
90
  }
89
91
  let $ = W ? M : M.filter((e) => e.isActive !== !1);
90
- return /* @__PURE__ */ d(f, { children: [/* @__PURE__ */ u(ne, {}), /* @__PURE__ */ d(r, {
92
+ return /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(ie, {}), /* @__PURE__ */ u(oe, {
91
93
  perm: "view.manage.productManagement.category",
92
- children: [/* @__PURE__ */ d(te, {
94
+ children: [/* @__PURE__ */ u(ne, {
93
95
  title: "Product Categories",
94
96
  subtitle: "Groups of products with similar handling requirements.",
95
97
  chips: ["Catalog"],
96
- actions: /* @__PURE__ */ d(b, {
98
+ actions: /* @__PURE__ */ u(b, {
97
99
  direction: "row",
98
100
  spacing: 1,
99
- children: [/* @__PURE__ */ u(p, {
101
+ children: [/* @__PURE__ */ l(p, {
100
102
  variant: "outlined",
101
- startIcon: /* @__PURE__ */ u(D, {}),
103
+ startIcon: /* @__PURE__ */ l(O, {}),
102
104
  onClick: () => void q(),
103
105
  children: "Refresh"
104
- }), j ? /* @__PURE__ */ u(p, {
106
+ }), j ? /* @__PURE__ */ l(p, {
105
107
  variant: "contained",
106
- startIcon: /* @__PURE__ */ u(E, {}),
108
+ startIcon: /* @__PURE__ */ l(D, {}),
107
109
  onClick: J,
108
110
  children: "New Category"
109
111
  }) : null]
110
112
  }),
111
- children: [I ? /* @__PURE__ */ u(se, {
113
+ children: [I ? /* @__PURE__ */ l(d, {
112
114
  severity: "error",
113
115
  sx: { mb: 2 },
114
116
  children: I
115
- }) : null, /* @__PURE__ */ u(re, {
117
+ }) : null, /* @__PURE__ */ l(n, {
116
118
  eyebrow: "Master data",
117
119
  title: "Product categories",
118
120
  subtitle: P ? "Loading…" : `${$.length} ${$.length === 1 ? "category" : "categories"}`,
119
- actions: /* @__PURE__ */ u(v, {
120
- control: /* @__PURE__ */ u(k, {
121
+ actions: /* @__PURE__ */ l(y, {
122
+ control: /* @__PURE__ */ l(k, {
121
123
  checked: W,
122
124
  onChange: (e) => de(e.target.checked)
123
125
  }),
124
- label: /* @__PURE__ */ u(T, {
126
+ label: /* @__PURE__ */ l(w, {
125
127
  variant: "body2",
126
128
  sx: { fontWeight: 600 },
127
129
  children: "Show inactive"
@@ -132,33 +134,33 @@ function j() {
132
134
  ml: 0
133
135
  }
134
136
  }),
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, {
137
+ children: /* @__PURE__ */ u(i, { children: [/* @__PURE__ */ l(ue, { children: /* @__PURE__ */ u(S, { children: [
138
+ /* @__PURE__ */ l(x, { children: "Code" }),
139
+ /* @__PURE__ */ l(x, { children: "Name" }),
140
+ /* @__PURE__ */ l(x, { children: "Description" }),
141
+ /* @__PURE__ */ l(x, { children: "Status" }),
142
+ /* @__PURE__ */ l(x, {
141
143
  align: "right",
142
144
  children: "Action"
143
145
  })
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, {
146
+ ] }) }), /* @__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
147
  colSpan: 5,
146
148
  icon: A,
147
149
  title: M.length === 0 ? "No categories yet" : "No active categories",
148
150
  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, {
151
+ action: M.length === 0 && j ? /* @__PURE__ */ l(p, {
150
152
  variant: "contained",
151
153
  size: "small",
152
- startIcon: /* @__PURE__ */ u(E, {}),
154
+ startIcon: /* @__PURE__ */ l(D, {}),
153
155
  onClick: J,
154
156
  children: "Create first category"
155
157
  }) : null
156
- }) : $.map((e) => /* @__PURE__ */ d(C, {
158
+ }) : $.map((e) => /* @__PURE__ */ u(S, {
157
159
  hover: !0,
158
160
  children: [
159
- /* @__PURE__ */ u(S, {
161
+ /* @__PURE__ */ l(x, {
160
162
  sx: { maxWidth: 160 },
161
- children: /* @__PURE__ */ u(f, {
163
+ children: /* @__PURE__ */ l(f, {
162
164
  component: "span",
163
165
  sx: {
164
166
  display: "inline-block",
@@ -176,9 +178,9 @@ function j() {
176
178
  children: e.code
177
179
  })
178
180
  }),
179
- /* @__PURE__ */ u(S, {
181
+ /* @__PURE__ */ l(x, {
180
182
  sx: { maxWidth: 220 },
181
- children: /* @__PURE__ */ u(T, {
183
+ children: /* @__PURE__ */ l(w, {
182
184
  variant: "body2",
183
185
  sx: {
184
186
  fontWeight: 700,
@@ -187,9 +189,9 @@ function j() {
187
189
  children: e.name
188
190
  })
189
191
  }),
190
- /* @__PURE__ */ u(S, {
192
+ /* @__PURE__ */ l(x, {
191
193
  sx: { maxWidth: 360 },
192
- children: e.description ? /* @__PURE__ */ u(T, {
194
+ children: e.description ? /* @__PURE__ */ l(w, {
193
195
  variant: "caption",
194
196
  color: "text.secondary",
195
197
  sx: {
@@ -197,13 +199,13 @@ function j() {
197
199
  wordBreak: "break-word"
198
200
  },
199
201
  children: e.description
200
- }) : /* @__PURE__ */ u(T, {
202
+ }) : /* @__PURE__ */ l(w, {
201
203
  variant: "caption",
202
204
  color: "text.disabled",
203
205
  children: "—"
204
206
  })
205
207
  }),
206
- /* @__PURE__ */ u(S, { children: /* @__PURE__ */ u(m, {
208
+ /* @__PURE__ */ l(x, { children: /* @__PURE__ */ l(h, {
207
209
  size: "small",
208
210
  label: e.isActive ? "Active" : "Inactive",
209
211
  color: e.isActive ? "success" : "default",
@@ -214,9 +216,9 @@ function j() {
214
216
  height: 22
215
217
  }
216
218
  }) }),
217
- /* @__PURE__ */ u(S, {
219
+ /* @__PURE__ */ l(x, {
218
220
  align: "right",
219
- children: j ? /* @__PURE__ */ u(p, {
221
+ children: j ? /* @__PURE__ */ l(p, {
220
222
  size: "small",
221
223
  variant: "outlined",
222
224
  onClick: () => fe(e),
@@ -226,20 +228,20 @@ function j() {
226
228
  ]
227
229
  }, e.id)) })] })
228
230
  })]
229
- }), /* @__PURE__ */ d(h, {
231
+ }), /* @__PURE__ */ u(g, {
230
232
  open: R,
231
233
  onClose: () => z(!1),
232
234
  fullWidth: !0,
233
235
  maxWidth: "sm",
234
236
  children: [
235
- /* @__PURE__ */ u(le, { children: B ? "Edit Category" : "New Category" }),
236
- /* @__PURE__ */ u(_, {
237
+ /* @__PURE__ */ l(se, { children: B ? "Edit Category" : "New Category" }),
238
+ /* @__PURE__ */ l(v, {
237
239
  dividers: !0,
238
- children: /* @__PURE__ */ d(b, {
240
+ children: /* @__PURE__ */ u(b, {
239
241
  spacing: 2,
240
242
  sx: { pt: 1 },
241
243
  children: [
242
- /* @__PURE__ */ u(w, {
244
+ /* @__PURE__ */ l(C, {
243
245
  required: !0,
244
246
  label: "Name",
245
247
  size: "small",
@@ -253,13 +255,13 @@ function j() {
253
255
  onBlur: G.onBlur("name"),
254
256
  error: G.show("name") && !!Z.name,
255
257
  FormHelperTextProps: { component: "div" },
256
- helperText: /* @__PURE__ */ u(i, {
258
+ helperText: /* @__PURE__ */ l(r, {
257
259
  message: G.show("name") ? Z.name : "",
258
260
  value: H.name,
259
261
  max: 255
260
262
  })
261
263
  }),
262
- /* @__PURE__ */ u(w, {
264
+ /* @__PURE__ */ l(C, {
263
265
  required: !0,
264
266
  label: "Code (uppercase, A-Z, 0-9, _)",
265
267
  size: "small",
@@ -273,13 +275,13 @@ function j() {
273
275
  onBlur: G.onBlur("code"),
274
276
  error: G.show("code") && !!Z.code,
275
277
  FormHelperTextProps: { component: "div" },
276
- helperText: /* @__PURE__ */ u(i, {
278
+ helperText: /* @__PURE__ */ l(r, {
277
279
  message: G.show("code") ? Z.code : "Must be unique.",
278
280
  value: H.code,
279
281
  max: 100
280
282
  })
281
283
  }),
282
- /* @__PURE__ */ u(w, {
284
+ /* @__PURE__ */ l(C, {
283
285
  label: "Description (optional)",
284
286
  size: "small",
285
287
  multiline: !0,
@@ -292,13 +294,13 @@ function j() {
292
294
  description: e.target.value
293
295
  }),
294
296
  FormHelperTextProps: { component: "div" },
295
- helperText: /* @__PURE__ */ u(i, {
297
+ helperText: /* @__PURE__ */ l(r, {
296
298
  message: "",
297
299
  value: H.description,
298
300
  max: 500
299
301
  })
300
302
  }),
301
- /* @__PURE__ */ u(w, {
303
+ /* @__PURE__ */ l(C, {
302
304
  label: "Icon (optional)",
303
305
  size: "small",
304
306
  fullWidth: !0,
@@ -308,8 +310,8 @@ function j() {
308
310
  icon: e.target.value
309
311
  })
310
312
  }),
311
- /* @__PURE__ */ u(v, {
312
- control: /* @__PURE__ */ u(ce, {
313
+ /* @__PURE__ */ l(y, {
314
+ control: /* @__PURE__ */ l(m, {
313
315
  checked: H.isActive,
314
316
  onChange: (e) => U({
315
317
  ...H,
@@ -321,10 +323,10 @@ function j() {
321
323
  ]
322
324
  })
323
325
  }),
324
- /* @__PURE__ */ d(g, { children: [/* @__PURE__ */ u(p, {
326
+ /* @__PURE__ */ u(_, { children: [/* @__PURE__ */ l(p, {
325
327
  onClick: () => z(!1),
326
328
  children: "Cancel"
327
- }), /* @__PURE__ */ u(p, {
329
+ }), /* @__PURE__ */ l(p, {
328
330
  variant: "contained",
329
331
  disabled: !Q,
330
332
  onClick: () => void me(),
@@ -337,4 +339,4 @@ function j() {
337
339
  //#endregion
338
340
  export { j as default };
339
341
 
340
- //# sourceMappingURL=CategoriesPage-aZBZrDOi.js.map
342
+ //# sourceMappingURL=CategoriesPage-CLcAUEvh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CategoriesPage-aZBZrDOi.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-CLcAUEvh.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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"}