@argusoft/medplat-product-management 1.0.5 → 1.0.7

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 (99) hide show
  1. package/dist/{BrandsPage-CjL0bBk0.js → BrandsPage-CdqGFmGf.js} +57 -58
  2. package/dist/BrandsPage-CdqGFmGf.js.map +1 -0
  3. package/dist/CategoriesPage-DJM0Nalw.js +392 -0
  4. package/dist/CategoriesPage-DJM0Nalw.js.map +1 -0
  5. package/dist/{DashboardPage-C_H1Jrey.js → DashboardPage-BASkXr00.js} +14 -14
  6. package/dist/{DashboardPage-C_H1Jrey.js.map → DashboardPage-BASkXr00.js.map} +1 -1
  7. package/dist/{FacilityPicker-Diq2hnYg.js → FacilityPicker-jV-qXp1k.js} +8 -6
  8. package/dist/{FacilityPicker-Diq2hnYg.js.map → FacilityPicker-jV-qXp1k.js.map} +1 -1
  9. package/dist/InventoryPage-CTdq6txa.js +658 -0
  10. package/dist/InventoryPage-CTdq6txa.js.map +1 -0
  11. package/dist/{MemberProfileCard-BLUVRILO.js → MemberProfileCard-DwWda-tS.js} +3 -3
  12. package/dist/{MemberProfileCard-BLUVRILO.js.map → MemberProfileCard-DwWda-tS.js.map} +1 -1
  13. package/dist/{PaymentCreatePage-mvUFdr7u.js → PaymentCreatePage-B3bP-K01.js} +137 -138
  14. package/dist/PaymentCreatePage-B3bP-K01.js.map +1 -0
  15. package/dist/{PaymentsPage-DY6BclkN.js → PaymentsPage-Dh8bqXVE.js} +42 -43
  16. package/dist/PaymentsPage-Dh8bqXVE.js.map +1 -0
  17. package/dist/PickupBatchLinesEditor-B2fLx1lU.js +116 -0
  18. package/dist/PickupBatchLinesEditor-B2fLx1lU.js.map +1 -0
  19. package/dist/{PickupCreatePage-CCSiyFQF.js → PickupCreatePage-BeYhR45k.js} +301 -257
  20. package/dist/PickupCreatePage-BeYhR45k.js.map +1 -0
  21. package/dist/PickupsPage-C6lBtAoQ.js +814 -0
  22. package/dist/PickupsPage-C6lBtAoQ.js.map +1 -0
  23. package/dist/{PmGuard-C90yhpsN.js → PmGuard-DrIl1sHL.js} +3 -3
  24. package/dist/{PmGuard-C90yhpsN.js.map → PmGuard-DrIl1sHL.js.map} +1 -1
  25. package/dist/PmTable-BSV_bMJZ.js +545 -0
  26. package/dist/PmTable-BSV_bMJZ.js.map +1 -0
  27. package/dist/ProductEditPage-DZTUH95T.js +1295 -0
  28. package/dist/ProductEditPage-DZTUH95T.js.map +1 -0
  29. package/dist/{ProductsPage-i8QVw_Jm.js → ProductsPage-CqOsah4_.js} +61 -64
  30. package/dist/ProductsPage-CqOsah4_.js.map +1 -0
  31. package/dist/{PurchaseCreatePage-73Q_xY7S.js → PurchaseCreatePage-D6os7srp.js} +210 -153
  32. package/dist/PurchaseCreatePage-D6os7srp.js.map +1 -0
  33. package/dist/PurchaseRequestDetailPage-DErqGKiq.js +1544 -0
  34. package/dist/PurchaseRequestDetailPage-DErqGKiq.js.map +1 -0
  35. package/dist/PurchaseRequestsPage-CHBoRzzH.js +280 -0
  36. package/dist/PurchaseRequestsPage-CHBoRzzH.js.map +1 -0
  37. package/dist/{PurchasesPage-BQEToymQ.js → PurchasesPage-C-2K7wH6.js} +40 -41
  38. package/dist/PurchasesPage-C-2K7wH6.js.map +1 -0
  39. package/dist/SaleCreatePage-DB3_UEgy.js +543 -0
  40. package/dist/SaleCreatePage-DB3_UEgy.js.map +1 -0
  41. package/dist/{SalesPage-CTBJMxZe.js → SalesPage-BhBGG426.js} +89 -90
  42. package/dist/SalesPage-BhBGG426.js.map +1 -0
  43. package/dist/SettingsPage-CBUu9DZK.js +746 -0
  44. package/dist/SettingsPage-CBUu9DZK.js.map +1 -0
  45. package/dist/StorageUnitsPage-oe0lXLd1.js +719 -0
  46. package/dist/StorageUnitsPage-oe0lXLd1.js.map +1 -0
  47. package/dist/{TransactionsPage-Cocn4901.js → TransactionsPage-7dRZpZOD.js} +107 -82
  48. package/dist/TransactionsPage-7dRZpZOD.js.map +1 -0
  49. package/dist/{TransferCreatePage-DbjcjuOg.js → TransferCreatePage-DtkAlP9l.js} +73 -74
  50. package/dist/TransferCreatePage-DtkAlP9l.js.map +1 -0
  51. package/dist/{TransfersPage-BFVF7Xvc.js → TransfersPage-BaEjbvnj.js} +67 -68
  52. package/dist/TransfersPage-BaEjbvnj.js.map +1 -0
  53. package/dist/{VialsPage-hZmS5xPt.js → VialsPage-vo9Of9oC.js} +83 -84
  54. package/dist/VialsPage-vo9Of9oC.js.map +1 -0
  55. package/dist/constants-ClZJY2x1.js +405 -0
  56. package/dist/constants-ClZJY2x1.js.map +1 -0
  57. package/dist/index.js +582 -391
  58. package/dist/index.js.map +1 -1
  59. package/dist/{settingsStore-KW217unV.js → settingsStore-BlA2GIhl.js} +91 -57
  60. package/dist/settingsStore-BlA2GIhl.js.map +1 -0
  61. package/dist/{validation-BkUPqrdA.js → validation-B6Kl5Xf9.js} +23 -22
  62. package/dist/validation-B6Kl5Xf9.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/BrandsPage-CjL0bBk0.js.map +0 -1
  65. package/dist/CategoriesPage-CLcAUEvh.js +0 -342
  66. package/dist/CategoriesPage-CLcAUEvh.js.map +0 -1
  67. package/dist/InventoryPage-C1ho56CY.js +0 -508
  68. package/dist/InventoryPage-C1ho56CY.js.map +0 -1
  69. package/dist/PaymentCreatePage-mvUFdr7u.js.map +0 -1
  70. package/dist/PaymentsPage-DY6BclkN.js.map +0 -1
  71. package/dist/PickupCreatePage-CCSiyFQF.js.map +0 -1
  72. package/dist/PickupsPage-DGi6T5Of.js +0 -604
  73. package/dist/PickupsPage-DGi6T5Of.js.map +0 -1
  74. package/dist/PmTable-BkK65bJQ.js +0 -375
  75. package/dist/PmTable-BkK65bJQ.js.map +0 -1
  76. package/dist/ProductEditPage-CIQKtw2Z.js +0 -650
  77. package/dist/ProductEditPage-CIQKtw2Z.js.map +0 -1
  78. package/dist/ProductsPage-i8QVw_Jm.js.map +0 -1
  79. package/dist/PurchaseCreatePage-73Q_xY7S.js.map +0 -1
  80. package/dist/PurchaseRequestDetailPage-BR20EKBJ.js +0 -588
  81. package/dist/PurchaseRequestDetailPage-BR20EKBJ.js.map +0 -1
  82. package/dist/PurchaseRequestsPage-BJqDlNrc.js +0 -266
  83. package/dist/PurchaseRequestsPage-BJqDlNrc.js.map +0 -1
  84. package/dist/PurchasesPage-BQEToymQ.js.map +0 -1
  85. package/dist/SaleCreatePage-BVThnWsk.js +0 -523
  86. package/dist/SaleCreatePage-BVThnWsk.js.map +0 -1
  87. package/dist/SalesPage-CTBJMxZe.js.map +0 -1
  88. package/dist/SettingsPage-CiwVmzM3.js +0 -663
  89. package/dist/SettingsPage-CiwVmzM3.js.map +0 -1
  90. package/dist/StorageUnitsPage--ECPMVhB.js +0 -471
  91. package/dist/StorageUnitsPage--ECPMVhB.js.map +0 -1
  92. package/dist/TransactionsPage-Cocn4901.js.map +0 -1
  93. package/dist/TransferCreatePage-DbjcjuOg.js.map +0 -1
  94. package/dist/TransfersPage-BFVF7Xvc.js.map +0 -1
  95. package/dist/VialsPage-hZmS5xPt.js.map +0 -1
  96. package/dist/constants-5ZCZo-Zm.js +0 -257
  97. package/dist/constants-5ZCZo-Zm.js.map +0 -1
  98. package/dist/settingsStore-KW217unV.js.map +0 -1
  99. package/dist/validation-BkUPqrdA.js.map +0 -1
@@ -1,20 +1,19 @@
1
- import { Z as e, p as t, r as n } from "./settingsStore-KW217unV.js";
2
- import { c as r, n as i, s as a, t as ee } from "./PmTable-BkK65bJQ.js";
3
- import { i as te, m as o, t as s } from "./validation-BkUPqrdA.js";
4
- import { t as c } from "./useFieldErrors-hDG8ox_x.js";
5
- import { a as ne, i as re, n as ie, r as ae, t as l } from "./PmGuard-C90yhpsN.js";
1
+ import { g as e, ot as t, r as n } from "./settingsStore-BlA2GIhl.js";
2
+ import { c as ee, l as r, n as i, s as te, t as a } from "./PmTable-BSV_bMJZ.js";
3
+ import { i as ne, m as o, t as re } from "./validation-B6Kl5Xf9.js";
4
+ import { t as s } from "./useFieldErrors-hDG8ox_x.js";
5
+ import { a as c, i as l, n as ie, r as ae, t as oe } from "./PmGuard-DrIl1sHL.js";
6
6
  import { useState as u } from "react";
7
7
  import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
- import { Alert as oe, Box as p, Button as m, Checkbox as se, Chip as ce, Dialog as le, DialogActions as ue, DialogContent as h, DialogTitle as de, FormControlLabel as g, InputAdornment as fe, Skeleton as _, Stack as v, TableBody as y, TableCell as b, TableHead as pe, TableRow as x, TextField as S, Typography as C } from "@mui/material";
9
- import { showToast as w } from "@/common/toaster/toaster";
10
- import { findCountry as me, validatePhoneForCountry as he } from "@/common/constants/countries";
11
- import { v4 as ge } from "uuid";
12
- import T from "@mui/icons-material/AddRounded";
13
- import E from "@mui/icons-material/RefreshRounded";
14
- import D from "@mui/icons-material/SellRounded";
15
- import O from "@/views/custom-components/CustomSwitch";
8
+ import { Alert as se, Box as p, Button as m, Checkbox as h, Chip as ce, Dialog as le, DialogActions as ue, DialogContent as de, DialogTitle as fe, FormControlLabel as g, InputAdornment as pe, Skeleton as _, Stack as v, TableBody as y, TableCell as b, TableHead as me, TableRow as x, TextField as S, Typography as C } from "@mui/material";
9
+ import { findCountry as he, validatePhoneForCountry as ge } from "@/common/constants/countries";
10
+ import { v4 as _e } from "uuid";
11
+ import w from "@mui/icons-material/AddRounded";
12
+ import T from "@mui/icons-material/RefreshRounded";
13
+ import E from "@mui/icons-material/SellRounded";
14
+ import D from "@/views/custom-components/CustomSwitch";
16
15
  //#region src/views/BrandsPage.jsx
17
- function k(e) {
16
+ function O(e) {
18
17
  if (!e) return {
19
18
  phone: "",
20
19
  email: ""
@@ -32,12 +31,12 @@ function k(e) {
32
31
  };
33
32
  }
34
33
  }
35
- function A({ phone: e, email: t }) {
34
+ function k({ phone: e, email: t }) {
36
35
  let n = {};
37
36
  return e?.trim() && (n.phone = e.trim()), t?.trim() && (n.email = t.trim()), Object.keys(n).length ? JSON.stringify(n) : null;
38
37
  }
39
- function j() {
40
- let j = re().has("update.manage.productManagement.brand"), M = me(n()?.countryCode), [N, P] = u([]), [F, I] = u(!1), [L, R] = u(""), [_e, z] = u(!1), [B, V] = u(null), [H, ve] = u(!1), [U, W] = u(K()), G = c();
38
+ function A() {
39
+ let A = l().has("update.manage.productManagement.brand"), j = n(), M = he(j?.countryCode), [N, P] = u([]), [F, I] = u(!1), [L, R] = u(""), [ve, z] = u(!1), [B, V] = u(null), [H, ye] = u(!1), [U, W] = u(K()), G = s();
41
40
  function K() {
42
41
  return {
43
42
  id: "",
@@ -51,11 +50,11 @@ function j() {
51
50
  async function q() {
52
51
  I(!0), R("");
53
52
  try {
54
- let e = await t(void 0, !0);
55
- P(e);
53
+ let t = await e(void 0, !0);
54
+ P(t);
56
55
  } catch (e) {
57
56
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to load brands";
58
- R(t), w({
57
+ R(t), r({
59
58
  message: t,
60
59
  type: "error"
61
60
  });
@@ -69,11 +68,11 @@ function j() {
69
68
  function J() {
70
69
  V(null), W({
71
70
  ...K(),
72
- id: ge()
71
+ id: _e()
73
72
  }), G.reset(), R(""), z(!0);
74
73
  }
75
- function ye(e) {
76
- let { phone: t, email: n } = k(e.contactInfo);
74
+ function be(e) {
75
+ let { phone: t, email: n } = O(e.contactInfo);
77
76
  V(e), G.reset(), R(""), W({
78
77
  id: e.id,
79
78
  name: e.name ?? "",
@@ -83,43 +82,43 @@ function j() {
83
82
  isActive: e.isActive !== !1
84
83
  }), z(!0);
85
84
  }
86
- let Y = o(U.manufacturerCode, "Manufacturer code"), X = U.manufacturerCode.trim().toUpperCase(), be = !Y && X && N.some((e) => e.id !== U.id && (e.manufacturerCode || "").toUpperCase() === X), Z = {
85
+ let Y = o(U.manufacturerCode, "Manufacturer code"), X = U.manufacturerCode.trim().toUpperCase(), xe = !Y && X && N.some((e) => e.id !== U.id && (e.manufacturerCode || "").toUpperCase() === X), Z = {
87
86
  name: o(U.name, "Name"),
88
- manufacturerCode: Y || (be ? "Code is already in use — edit it manually to make it unique." : ""),
89
- contactPhone: he(U.contactPhone, M),
90
- contactEmail: te(U.contactEmail)
91
- }, Q = s(Z);
92
- async function xe() {
87
+ manufacturerCode: Y || (xe ? "Code is already in use — edit it manually to make it unique." : ""),
88
+ contactPhone: ge(U.contactPhone, M),
89
+ contactEmail: ne(U.contactEmail)
90
+ }, Q = re(Z);
91
+ async function Se() {
93
92
  if (!Q) {
94
93
  G.markAllTouched(), R("Please fix the highlighted fields.");
95
94
  return;
96
95
  }
97
96
  try {
98
- await e({
97
+ await t({
99
98
  id: U.id,
100
99
  name: U.name.trim(),
101
100
  manufacturerCode: U.manufacturerCode.trim().toUpperCase(),
102
- contactInfo: A({
101
+ contactInfo: k({
103
102
  phone: U.contactPhone,
104
103
  email: U.contactEmail
105
104
  }),
106
105
  isActive: U.isActive
107
- }), w({
106
+ }), r({
108
107
  message: "Brand saved.",
109
108
  type: "success"
110
109
  }), z(!1), await q();
111
110
  } catch (e) {
112
111
  let t = e?.response?.data?.message ?? e?.message ?? "Failed to save brand";
113
- R(t), w({
112
+ R(t), r({
114
113
  message: t,
115
114
  type: "error"
116
115
  });
117
116
  }
118
117
  }
119
118
  let $ = H ? N : N.filter((e) => e.isActive !== !1);
120
- return /* @__PURE__ */ f(p, { children: [/* @__PURE__ */ d(ie, {}), /* @__PURE__ */ f(l, {
119
+ return /* @__PURE__ */ f(p, { children: [/* @__PURE__ */ d(ie, {}), /* @__PURE__ */ f(oe, {
121
120
  perm: "view.manage.productManagement.brand",
122
- children: [/* @__PURE__ */ f(ne, {
121
+ children: [/* @__PURE__ */ f(c, {
123
122
  title: "Brands",
124
123
  subtitle: "The manufacturer or supplier of each product.",
125
124
  chips: ["Catalog"],
@@ -128,28 +127,28 @@ function j() {
128
127
  spacing: 1,
129
128
  children: [/* @__PURE__ */ d(m, {
130
129
  variant: "outlined",
131
- startIcon: /* @__PURE__ */ d(E, {}),
130
+ startIcon: /* @__PURE__ */ d(T, {}),
132
131
  onClick: () => void q(),
133
132
  children: "Refresh"
134
- }), j ? /* @__PURE__ */ d(m, {
133
+ }), A ? /* @__PURE__ */ d(m, {
135
134
  variant: "contained",
136
- startIcon: /* @__PURE__ */ d(T, {}),
135
+ startIcon: /* @__PURE__ */ d(w, {}),
137
136
  onClick: J,
138
137
  children: "New Brand"
139
138
  }) : null]
140
139
  }),
141
- children: [L ? /* @__PURE__ */ d(oe, {
140
+ children: [L ? /* @__PURE__ */ d(se, {
142
141
  severity: "error",
143
142
  sx: { mb: 2 },
144
143
  children: L
145
- }) : null, /* @__PURE__ */ d(r, {
144
+ }) : null, /* @__PURE__ */ d(ee, {
146
145
  eyebrow: "Master data",
147
146
  title: "Brands",
148
147
  subtitle: F ? "Loading…" : `${$.length} ${$.length === 1 ? "brand" : "brands"}`,
149
148
  actions: /* @__PURE__ */ d(g, {
150
- control: /* @__PURE__ */ d(O, {
149
+ control: /* @__PURE__ */ d(D, {
151
150
  checked: H,
152
- onChange: (e) => ve(e.target.checked)
151
+ onChange: (e) => ye(e.target.checked)
153
152
  }),
154
153
  label: /* @__PURE__ */ d(C, {
155
154
  variant: "body2",
@@ -162,7 +161,7 @@ function j() {
162
161
  ml: 0
163
162
  }
164
163
  }),
165
- children: /* @__PURE__ */ f(a, { children: [/* @__PURE__ */ d(pe, { children: /* @__PURE__ */ f(x, { children: [
164
+ children: /* @__PURE__ */ f(te, { children: [/* @__PURE__ */ d(me, { children: /* @__PURE__ */ f(x, { children: [
166
165
  /* @__PURE__ */ d(b, { children: "Name" }),
167
166
  /* @__PURE__ */ d(b, { children: "Manufacturer Code" }),
168
167
  /* @__PURE__ */ d(b, { children: "Contact" }),
@@ -171,20 +170,20 @@ function j() {
171
170
  align: "right",
172
171
  children: "Action"
173
172
  })
174
- ] }) }), /* @__PURE__ */ d(y, { children: F ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ d(x, { children: Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ d(b, { children: /* @__PURE__ */ d(_, { height: 22 }) }, t)) }, t)) : $.length === 0 ? /* @__PURE__ */ d(ee, {
173
+ ] }) }), /* @__PURE__ */ d(y, { children: F ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ d(x, { children: Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ d(b, { children: /* @__PURE__ */ d(_, { height: 22 }) }, t)) }, t)) : $.length === 0 ? /* @__PURE__ */ d(a, {
175
174
  colSpan: 5,
176
- icon: D,
175
+ icon: E,
177
176
  title: N.length === 0 ? "No brands yet" : "No active brands",
178
177
  hint: N.length === 0 ? "Add manufacturers so you can link them to your products." : "Turn on “Show inactive” to see deactivated brands.",
179
- action: N.length === 0 && j ? /* @__PURE__ */ d(m, {
178
+ action: N.length === 0 && A ? /* @__PURE__ */ d(m, {
180
179
  variant: "contained",
181
180
  size: "small",
182
- startIcon: /* @__PURE__ */ d(T, {}),
181
+ startIcon: /* @__PURE__ */ d(w, {}),
183
182
  onClick: J,
184
183
  children: "Create first brand"
185
184
  }) : null
186
185
  }) : $.map((e) => {
187
- let { phone: t, email: n } = k(e.contactInfo);
186
+ let { phone: t, email: n } = O(e.contactInfo);
188
187
  return /* @__PURE__ */ f(x, {
189
188
  hover: !0,
190
189
  children: [
@@ -247,10 +246,10 @@ function j() {
247
246
  }) }),
248
247
  /* @__PURE__ */ d(b, {
249
248
  align: "right",
250
- children: j ? /* @__PURE__ */ d(m, {
249
+ children: A ? /* @__PURE__ */ d(m, {
251
250
  size: "small",
252
251
  variant: "outlined",
253
- onClick: () => ye(e),
252
+ onClick: () => be(e),
254
253
  children: "Edit"
255
254
  }) : null
256
255
  })
@@ -259,13 +258,13 @@ function j() {
259
258
  }) })] })
260
259
  })]
261
260
  }), /* @__PURE__ */ f(le, {
262
- open: _e,
261
+ open: ve,
263
262
  onClose: () => z(!1),
264
263
  fullWidth: !0,
265
264
  maxWidth: "sm",
266
265
  children: [
267
- /* @__PURE__ */ d(de, { children: B ? "Edit Brand" : "New Brand" }),
268
- /* @__PURE__ */ d(h, {
266
+ /* @__PURE__ */ d(fe, { children: B ? "Edit Brand" : "New Brand" }),
267
+ /* @__PURE__ */ d(de, {
269
268
  dividers: !0,
270
269
  children: /* @__PURE__ */ f(v, {
271
270
  spacing: 2,
@@ -329,7 +328,7 @@ function j() {
329
328
  onBlur: G.onBlur("contactPhone"),
330
329
  error: G.show("contactPhone") && !!Z.contactPhone,
331
330
  helperText: G.show("contactPhone") && Z.contactPhone ? Z.contactPhone : M ? `Format for ${M.name}: ${M.phoneCode} followed by ${M.phoneMin}${M.phoneMin === M.phoneMax ? "" : `–${M.phoneMax}`} digits.` : "Local number, digits only.",
332
- InputProps: M ? { startAdornment: /* @__PURE__ */ d(fe, {
331
+ InputProps: M ? { startAdornment: /* @__PURE__ */ d(pe, {
333
332
  position: "start",
334
333
  children: /* @__PURE__ */ d(p, {
335
334
  component: "span",
@@ -357,7 +356,7 @@ function j() {
357
356
  helperText: G.show("contactEmail") ? Z.contactEmail : ""
358
357
  }),
359
358
  /* @__PURE__ */ d(g, {
360
- control: /* @__PURE__ */ d(se, {
359
+ control: /* @__PURE__ */ d(h, {
361
360
  checked: U.isActive,
362
361
  onChange: (e) => W({
363
362
  ...U,
@@ -375,7 +374,7 @@ function j() {
375
374
  }), /* @__PURE__ */ d(m, {
376
375
  variant: "contained",
377
376
  disabled: !Q,
378
- onClick: () => void xe(),
377
+ onClick: () => void Se(),
379
378
  children: "Save"
380
379
  })] })
381
380
  ]
@@ -383,6 +382,6 @@ function j() {
383
382
  })] });
384
383
  }
385
384
  //#endregion
386
- export { j as default };
385
+ export { A as default };
387
386
 
388
- //# sourceMappingURL=BrandsPage-CjL0bBk0.js.map
387
+ //# sourceMappingURL=BrandsPage-CdqGFmGf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrandsPage-CdqGFmGf.js","names":[],"sources":["../src/views/BrandsPage.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 InputAdornment,\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 SellRoundedIcon from '@mui/icons-material/SellRounded';\nimport { showToast } from '@pm/utils/pmToast';\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 { getBrands, upsertBrand } from '@pm/services/pmApi';\nimport { isClean, validateEmail, validateRequired } from '@pm/utils/validation';\nimport { findCountry, validatePhoneForCountry } from '@/common/constants/countries';\nimport { usePmSettings } from '@pm/utils/settingsStore';\nimport { useFieldErrors } from '@pm/utils/useFieldErrors';\n\n// Backend stores contact_info as a JSON-encoded string. We keep the discrete\n// fields here so the UI is form-friendly, and only ever round-trip the JSON.\nfunction parseContactInfo(raw) {\n if (!raw) return { phone: '', email: '' };\n try {\n const obj = JSON.parse(raw);\n return {\n phone: typeof obj?.phone === 'string' ? obj.phone : '',\n email: typeof obj?.email === 'string' ? obj.email : '',\n };\n } catch {\n return { phone: '', email: '' };\n }\n}\n\nfunction serializeContactInfo({ phone, email }) {\n const out = {};\n if (phone?.trim()) out.phone = phone.trim();\n if (email?.trim()) out.email = email.trim();\n return Object.keys(out).length ? JSON.stringify(out) : null;\n}\n\nexport default function BrandsPage() {\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.brand');\n const settings = usePmSettings();\n const country = findCountry(settings?.countryCode);\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 // Default to active-only; the toggle above the table reveals inactive rows.\n const [showInactive, setShowInactive] = useState(false);\n const [form, setForm] = useState(emptyForm());\n const fieldErrors = useFieldErrors();\n\n function emptyForm() {\n return {\n id: '',\n name: '',\n manufacturerCode: '',\n contactPhone: '',\n contactEmail: '',\n isActive: true,\n };\n }\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const data = await getBrands(undefined, true);\n setItems(data);\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load brands';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.brand', () => {\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 const { phone, email } = parseContactInfo(item.contactInfo);\n setEditing(item);\n fieldErrors.reset();\n setError('');\n setForm({\n id: item.id,\n name: item.name ?? '',\n manufacturerCode: item.manufacturerCode ?? '',\n contactPhone: phone,\n contactEmail: email,\n isActive: item.isActive !== false,\n });\n setOpenDialog(true);\n }\n\n const mfrCodeBase = validateRequired(form.manufacturerCode, 'Manufacturer code');\n const mfrNorm = form.manufacturerCode.trim().toUpperCase();\n const mfrClash = !mfrCodeBase\n && mfrNorm\n && items.some((b) => b.id !== form.id && (b.manufacturerCode || '').toUpperCase() === mfrNorm);\n const formErrors = {\n name: validateRequired(form.name, 'Name'),\n manufacturerCode: mfrCodeBase || (mfrClash ? 'Code is already in use — edit it manually to make it unique.' : ''),\n contactPhone: validatePhoneForCountry(form.contactPhone, country),\n contactEmail: validateEmail(form.contactEmail),\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 upsertBrand({\n id: form.id,\n name: form.name.trim(),\n manufacturerCode: form.manufacturerCode.trim().toUpperCase(),\n contactInfo: serializeContactInfo({\n phone: form.contactPhone,\n email: form.contactEmail,\n }),\n isActive: form.isActive,\n });\n showToast({ message: 'Brand saved.', type: 'success' });\n setOpenDialog(false);\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to save brand';\n setError(message);\n showToast({ message, type: 'error' });\n }\n }\n\n const visible = showInactive ? items : items.filter((b) => b.isActive !== false);\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.brand'}>\n <PmPageShell\n title=\"Brands\"\n subtitle=\"The manufacturer or supplier of each product.\"\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 Brand</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=\"Brands\"\n subtitle={loading ? 'Loading…' : `${visible.length} ${visible.length === 1 ? 'brand' : 'brands'}`}\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>Name</TableCell>\n <TableCell>Manufacturer Code</TableCell>\n <TableCell>Contact</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={SellRoundedIcon}\n title={items.length === 0 ? 'No brands yet' : 'No active brands'}\n hint={items.length === 0\n ? 'Add manufacturers so you can link them to your products.'\n : 'Turn on “Show inactive” to see deactivated brands.'}\n action={items.length === 0 && canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />} onClick={openCreate}>\n Create first brand\n </Button>\n ) : null}\n />\n ) : visible.map((b) => {\n const { phone, email } = parseContactInfo(b.contactInfo);\n return (\n <TableRow key={b.id} hover>\n <TableCell sx={{ maxWidth: 240 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, wordBreak: 'break-word' }}>{b.name}</Typography>\n </TableCell>\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,\n maxWidth: '100%', wordBreak: 'break-all',\n }}>\n {b.manufacturerCode}\n </Box>\n </TableCell>\n <TableCell>\n {phone || email ? (\n <Stack spacing={0.25}>\n {phone ? <Typography variant=\"caption\" sx={{ fontWeight: 600 }}>{phone}</Typography> : null}\n {email ? <Typography variant=\"caption\" color=\"text.secondary\">{email}</Typography> : null}\n </Stack>\n ) : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell>\n <Chip\n size=\"small\"\n label={b.isActive ? 'Active' : 'Inactive'}\n color={b.isActive ? 'success' : 'default'}\n variant={b.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(b)}>Edit</Button>\n ) : null}\n </TableCell>\n </TableRow>\n );\n })}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n\n <Dialog open={openDialog} onClose={() => setOpenDialog(false)} fullWidth maxWidth=\"sm\">\n <DialogTitle>{editing ? 'Edit Brand' : 'New Brand'}</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) => {\n const nextName = e.target.value;\n // Auto-derive manufacturer code from initials of every word — but\n // only on create (when editing an existing brand we never overwrite\n // a code the user has already curated).\n const initialsFromName = nextName\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => w[0])\n .join('')\n .toUpperCase();\n setForm((f) => ({\n ...f,\n name: nextName,\n manufacturerCode: editing ? f.manufacturerCode : initialsFromName,\n }));\n }}\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=\"Manufacturer code\" size=\"small\" fullWidth\n value={form.manufacturerCode}\n inputProps={{ maxLength: 100 }}\n onChange={(e) => setForm({ ...form, manufacturerCode: e.target.value.toUpperCase() })}\n onBlur={fieldErrors.onBlur('manufacturerCode')}\n error={fieldErrors.show('manufacturerCode') && !!formErrors.manufacturerCode}\n FormHelperTextProps={{ component: 'div' }}\n helperText={\n <PmFieldHelp\n message={fieldErrors.show('manufacturerCode') && formErrors.manufacturerCode\n ? formErrors.manufacturerCode\n : 'Auto-generated from the name as initials. Edit if needed to make it unique.'}\n value={form.manufacturerCode}\n max={100}\n />\n }\n />\n <TextField\n label=\"Contact Number\"\n size=\"small\"\n fullWidth\n type=\"tel\"\n placeholder={country\n ? (country.phoneMin === country.phoneMax\n ? `${country.phoneMin}-digit local number`\n : `${country.phoneMin}–${country.phoneMax} digit local number`)\n : 'Local number'}\n value={form.contactPhone}\n // Keep only digits and spaces — the dial code lives in the\n // adornment, not in the value.\n onChange={(e) => setForm({ ...form, contactPhone: e.target.value.replace(/[^\\d\\s]/g, '') })}\n onBlur={fieldErrors.onBlur('contactPhone')}\n error={fieldErrors.show('contactPhone') && !!formErrors.contactPhone}\n helperText={\n fieldErrors.show('contactPhone') && formErrors.contactPhone\n ? formErrors.contactPhone\n : country\n ? `Format for ${country.name}: ${country.phoneCode} followed by ${country.phoneMin}${country.phoneMin === country.phoneMax ? '' : `–${country.phoneMax}`} digits.`\n : 'Local number, digits only.'\n }\n InputProps={country ? {\n startAdornment: (\n <InputAdornment position=\"start\">\n <Box component=\"span\" sx={{ fontWeight: 700, color: 'text.secondary' }}>{country.phoneCode}</Box>\n </InputAdornment>\n ),\n } : undefined}\n />\n <TextField\n label=\"Email\"\n size=\"small\"\n fullWidth\n type=\"email\"\n placeholder=\"e.g. contact@manufacturer.example\"\n value={form.contactEmail}\n onChange={(e) => setForm({ ...form, contactEmail: e.target.value })}\n onBlur={fieldErrors.onBlur('contactEmail')}\n error={fieldErrors.show('contactEmail') && !!formErrors.contactEmail}\n helperText={fieldErrors.show('contactEmail') ? formErrors.contactEmail : ''}\n />\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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"}