@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.
- package/dist/{BrandsPage-NSvaMXWg.js → BrandsPage-CjL0bBk0.js} +80 -78
- package/dist/{BrandsPage-NSvaMXWg.js.map → BrandsPage-CjL0bBk0.js.map} +1 -1
- package/dist/{CategoriesPage-aZBZrDOi.js → CategoriesPage-CLcAUEvh.js} +72 -70
- package/dist/{CategoriesPage-aZBZrDOi.js.map → CategoriesPage-CLcAUEvh.js.map} +1 -1
- package/dist/{DashboardPage-DjwlOhrd.js → DashboardPage-C_H1Jrey.js} +91 -90
- package/dist/{DashboardPage-DjwlOhrd.js.map → DashboardPage-C_H1Jrey.js.map} +1 -1
- package/dist/{FacilityPicker-Chh-ZaR0.js → FacilityPicker-Diq2hnYg.js} +2 -2
- package/dist/{FacilityPicker-Chh-ZaR0.js.map → FacilityPicker-Diq2hnYg.js.map} +1 -1
- package/dist/{InventoryPage-cy76UsMp.js → InventoryPage-C1ho56CY.js} +113 -112
- package/dist/{InventoryPage-cy76UsMp.js.map → InventoryPage-C1ho56CY.js.map} +1 -1
- package/dist/{MemberProfileCard-CinPt09F.js → MemberProfileCard-BLUVRILO.js} +6 -5
- package/dist/{MemberProfileCard-CinPt09F.js.map → MemberProfileCard-BLUVRILO.js.map} +1 -1
- package/dist/{PaymentCreatePage-BJe3LyFF.js → PaymentCreatePage-mvUFdr7u.js} +125 -124
- package/dist/{PaymentCreatePage-BJe3LyFF.js.map → PaymentCreatePage-mvUFdr7u.js.map} +1 -1
- package/dist/{PaymentsPage-DxHoKksN.js → PaymentsPage-DY6BclkN.js} +21 -20
- package/dist/{PaymentsPage-DxHoKksN.js.map → PaymentsPage-DY6BclkN.js.map} +1 -1
- package/dist/{PickupCreatePage-Cq8zJ62Y.js → PickupCreatePage-CCSiyFQF.js} +63 -62
- package/dist/{PickupCreatePage-Cq8zJ62Y.js.map → PickupCreatePage-CCSiyFQF.js.map} +1 -1
- package/dist/{PickupsPage-BOygBQAb.js → PickupsPage-DGi6T5Of.js} +42 -41
- package/dist/{PickupsPage-BOygBQAb.js.map → PickupsPage-DGi6T5Of.js.map} +1 -1
- package/dist/PmGuard-C90yhpsN.js +592 -0
- package/dist/PmGuard-C90yhpsN.js.map +1 -0
- package/dist/{PmTable-CCpaJEA_.js → PmTable-BkK65bJQ.js} +96 -96
- package/dist/{PmTable-CCpaJEA_.js.map → PmTable-BkK65bJQ.js.map} +1 -1
- package/dist/{ProductEditPage-DmdHO-fS.js → ProductEditPage-CIQKtw2Z.js} +130 -129
- package/dist/{ProductEditPage-DmdHO-fS.js.map → ProductEditPage-CIQKtw2Z.js.map} +1 -1
- package/dist/{ProductsPage-BglMe8EM.js → ProductsPage-i8QVw_Jm.js} +64 -63
- package/dist/{ProductsPage-BglMe8EM.js.map → ProductsPage-i8QVw_Jm.js.map} +1 -1
- package/dist/{PurchaseCreatePage-1tYk41RS.js → PurchaseCreatePage-73Q_xY7S.js} +120 -119
- package/dist/{PurchaseCreatePage-1tYk41RS.js.map → PurchaseCreatePage-73Q_xY7S.js.map} +1 -1
- package/dist/{PurchaseRequestDetailPage-BYLx3aBI.js → PurchaseRequestDetailPage-BR20EKBJ.js} +217 -215
- package/dist/{PurchaseRequestDetailPage-BYLx3aBI.js.map → PurchaseRequestDetailPage-BR20EKBJ.js.map} +1 -1
- package/dist/{PurchaseRequestsPage-D2yorc4s.js → PurchaseRequestsPage-BJqDlNrc.js} +57 -56
- package/dist/{PurchaseRequestsPage-D2yorc4s.js.map → PurchaseRequestsPage-BJqDlNrc.js.map} +1 -1
- package/dist/{PurchasesPage-CanQTjlw.js → PurchasesPage-BQEToymQ.js} +76 -75
- package/dist/{PurchasesPage-CanQTjlw.js.map → PurchasesPage-BQEToymQ.js.map} +1 -1
- package/dist/{SaleCreatePage-DxFvPvju.js → SaleCreatePage-BVThnWsk.js} +89 -88
- package/dist/{SaleCreatePage-DxFvPvju.js.map → SaleCreatePage-BVThnWsk.js.map} +1 -1
- package/dist/{SalesPage-CPMrdr5-.js → SalesPage-CTBJMxZe.js} +46 -45
- package/dist/{SalesPage-CPMrdr5-.js.map → SalesPage-CTBJMxZe.js.map} +1 -1
- package/dist/{SettingsPage-CEy922rW.js → SettingsPage-CiwVmzM3.js} +47 -46
- package/dist/{SettingsPage-CEy922rW.js.map → SettingsPage-CiwVmzM3.js.map} +1 -1
- package/dist/{StorageUnitsPage-DfLT6xC_.js → StorageUnitsPage--ECPMVhB.js} +55 -54
- package/dist/{StorageUnitsPage-DfLT6xC_.js.map → StorageUnitsPage--ECPMVhB.js.map} +1 -1
- package/dist/{TransactionsPage-KFUJ4O5g.js → TransactionsPage-Cocn4901.js} +54 -53
- package/dist/{TransactionsPage-KFUJ4O5g.js.map → TransactionsPage-Cocn4901.js.map} +1 -1
- package/dist/{TransferCreatePage-k1tsRGB3.js → TransferCreatePage-DbjcjuOg.js} +74 -73
- package/dist/{TransferCreatePage-k1tsRGB3.js.map → TransferCreatePage-DbjcjuOg.js.map} +1 -1
- package/dist/{TransfersPage-CDafSVO9.js → TransfersPage-BFVF7Xvc.js} +108 -107
- package/dist/{TransfersPage-CDafSVO9.js.map → TransfersPage-BFVF7Xvc.js.map} +1 -1
- package/dist/VialsPage-hZmS5xPt.js +321 -0
- package/dist/VialsPage-hZmS5xPt.js.map +1 -0
- package/dist/format-UOyOu75i.js.map +1 -1
- package/dist/index.js +652 -34
- package/dist/index.js.map +1 -1
- package/dist/settingsStore-KW217unV.js +417 -0
- package/dist/settingsStore-KW217unV.js.map +1 -0
- package/dist/{validation-Ba7puFIO.js → validation-BkUPqrdA.js} +11 -12
- package/dist/{validation-Ba7puFIO.js.map → validation-BkUPqrdA.js.map} +1 -1
- package/package.json +1 -1
- package/dist/VialsPage-DPsYFgaQ.js +0 -897
- package/dist/VialsPage-DPsYFgaQ.js.map +0 -1
- package/dist/currency-bVQ7aEk2.js +0 -1007
- package/dist/currency-bVQ7aEk2.js.map +0 -1
|
@@ -1,19 +1,20 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as
|
|
3
|
-
import { m as
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { Alert as
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
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 =
|
|
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
|
-
|
|
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),
|
|
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
|
-
|
|
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:
|
|
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 =
|
|
61
|
-
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 =
|
|
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
|
|
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
|
-
}),
|
|
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),
|
|
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__ */
|
|
92
|
+
return /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(ie, {}), /* @__PURE__ */ u(oe, {
|
|
91
93
|
perm: "view.manage.productManagement.category",
|
|
92
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
98
|
+
actions: /* @__PURE__ */ u(b, {
|
|
97
99
|
direction: "row",
|
|
98
100
|
spacing: 1,
|
|
99
|
-
children: [/* @__PURE__ */
|
|
101
|
+
children: [/* @__PURE__ */ l(p, {
|
|
100
102
|
variant: "outlined",
|
|
101
|
-
startIcon: /* @__PURE__ */
|
|
103
|
+
startIcon: /* @__PURE__ */ l(O, {}),
|
|
102
104
|
onClick: () => void q(),
|
|
103
105
|
children: "Refresh"
|
|
104
|
-
}), j ? /* @__PURE__ */
|
|
106
|
+
}), j ? /* @__PURE__ */ l(p, {
|
|
105
107
|
variant: "contained",
|
|
106
|
-
startIcon: /* @__PURE__ */
|
|
108
|
+
startIcon: /* @__PURE__ */ l(D, {}),
|
|
107
109
|
onClick: J,
|
|
108
110
|
children: "New Category"
|
|
109
111
|
}) : null]
|
|
110
112
|
}),
|
|
111
|
-
children: [I ? /* @__PURE__ */
|
|
113
|
+
children: [I ? /* @__PURE__ */ l(d, {
|
|
112
114
|
severity: "error",
|
|
113
115
|
sx: { mb: 2 },
|
|
114
116
|
children: I
|
|
115
|
-
}) : null, /* @__PURE__ */
|
|
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__ */
|
|
120
|
-
control: /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
/* @__PURE__ */
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
-
/* @__PURE__ */
|
|
140
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
151
|
+
action: M.length === 0 && j ? /* @__PURE__ */ l(p, {
|
|
150
152
|
variant: "contained",
|
|
151
153
|
size: "small",
|
|
152
|
-
startIcon: /* @__PURE__ */
|
|
154
|
+
startIcon: /* @__PURE__ */ l(D, {}),
|
|
153
155
|
onClick: J,
|
|
154
156
|
children: "Create first category"
|
|
155
157
|
}) : null
|
|
156
|
-
}) : $.map((e) => /* @__PURE__ */
|
|
158
|
+
}) : $.map((e) => /* @__PURE__ */ u(S, {
|
|
157
159
|
hover: !0,
|
|
158
160
|
children: [
|
|
159
|
-
/* @__PURE__ */
|
|
161
|
+
/* @__PURE__ */ l(x, {
|
|
160
162
|
sx: { maxWidth: 160 },
|
|
161
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
181
|
+
/* @__PURE__ */ l(x, {
|
|
180
182
|
sx: { maxWidth: 220 },
|
|
181
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
192
|
+
/* @__PURE__ */ l(x, {
|
|
191
193
|
sx: { maxWidth: 360 },
|
|
192
|
-
children: e.description ? /* @__PURE__ */
|
|
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__ */
|
|
202
|
+
}) : /* @__PURE__ */ l(w, {
|
|
201
203
|
variant: "caption",
|
|
202
204
|
color: "text.disabled",
|
|
203
205
|
children: "—"
|
|
204
206
|
})
|
|
205
207
|
}),
|
|
206
|
-
/* @__PURE__ */
|
|
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__ */
|
|
219
|
+
/* @__PURE__ */ l(x, {
|
|
218
220
|
align: "right",
|
|
219
|
-
children: j ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
236
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ l(se, { children: B ? "Edit Category" : "New Category" }),
|
|
238
|
+
/* @__PURE__ */ l(v, {
|
|
237
239
|
dividers: !0,
|
|
238
|
-
children: /* @__PURE__ */
|
|
240
|
+
children: /* @__PURE__ */ u(b, {
|
|
239
241
|
spacing: 2,
|
|
240
242
|
sx: { pt: 1 },
|
|
241
243
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
297
|
+
helperText: /* @__PURE__ */ l(r, {
|
|
296
298
|
message: "",
|
|
297
299
|
value: H.description,
|
|
298
300
|
max: 500
|
|
299
301
|
})
|
|
300
302
|
}),
|
|
301
|
-
/* @__PURE__ */
|
|
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__ */
|
|
312
|
-
control: /* @__PURE__ */
|
|
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__ */
|
|
326
|
+
/* @__PURE__ */ u(_, { children: [/* @__PURE__ */ l(p, {
|
|
325
327
|
onClick: () => z(!1),
|
|
326
328
|
children: "Cancel"
|
|
327
|
-
}), /* @__PURE__ */
|
|
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-
|
|
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":";;;;;;;;;;;;;;;AAoCA,SAAwB,IAAiB;CAEvC,IAAM,IADQ,GACG,CAAA,CAAM,IAAI,0CAA0C,GAC/D,CAAC,GAAO,KAAY,EAAS,CAAC,CAAC,GAC/B,CAAC,GAAS,KAAc,EAAS,EAAK,GACtC,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAY,KAAiB,EAAS,EAAK,GAC5C,CAAC,GAAS,KAAc,EAAS,IAAI,GACrC,CAAC,GAAM,KAAW,EAAS,EAAU,CAAC,GAEtC,CAAC,GAAc,MAAmB,EAAS,EAAK,GAChD,IAAc,GAAe;CAEnC,SAAS,IAAY;EACnB,OAAO;GAAE,IAAI;GAAI,MAAM;GAAI,MAAM;GAAI,aAAa;GAAI,MAAM;GAAI,UAAU;EAAK;CACjF;CAEA,eAAe,IAAO;EAEpB,AADA,EAAW,EAAI,GACf,EAAS,EAAE;EACX,IAAI;GACF,IAAM,IAAO,MAAM,EAAc,KAAA,GAAW,EAAI;GAChD,EAAS,CAAI;EACf,SAAS,GAAK;GACZ,IAAM,IAAU,GAAK,UAAU,MAAM,WAAW,GAAK,WAAW;GAEhE,AADA,EAAS,CAAO,GAChB,EAAU;IAAE;IAAS,MAAM;GAAQ,CAAC;EACtC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,GAAsB,gDAAgD;EACpE,EAAU;CACZ,GAAG,CAAC,CAAC;CAEL,SAAS,IAAa;EAKpB,AAJA,EAAW,IAAI,GACf,EAAQ;GAAE,GAAG,EAAU;GAAG,IAAI,EAAO;EAAE,CAAC,GACxC,EAAY,MAAM,GAClB,EAAS,EAAE,GACX,EAAc,EAAI;CACpB;CAEA,SAAS,GAAS,GAAM;EAYtB,AAXA,EAAW,CAAI,GACf,EAAY,MAAM,GAClB,EAAS,EAAE,GACX,EAAQ;GACN,IAAI,EAAK;GACT,MAAM,EAAK,QAAQ;GACnB,MAAM,EAAK,QAAQ;GACnB,aAAa,EAAK,eAAe;GACjC,MAAM,EAAK,QAAQ;GACnB,UAAU,EAAK,aAAa;EAC9B,CAAC,GACD,EAAc,EAAI;CACpB;CAEA,IAAM,IAAW,EAAa,EAAK,MAAM,EAAE,UAAU,GAAK,CAAC,GACrD,IAAW,EAAK,KAAK,KAAK,CAAC,CAAC,YAAY,GACxC,KAAY,CAAC,KACd,KACA,EAAM,MAAM,MAAM,EAAE,OAAO,EAAK,OAAO,EAAE,QAAQ,GAAA,CAAI,YAAY,MAAM,CAAQ,GAC9E,IAAa;EACjB,MAAM,EAAiB,EAAK,MAAM,MAAM;EACxC,MAAM,MAAa,KAAY,mDAAmD;CACpF,GACM,IAAc,GAAQ,CAAU;CAEtC,eAAe,KAAO;EACpB,IAAI,CAAC,GAAa;GAEhB,AADA,EAAY,eAAe,GAC3B,EAAS,oCAAoC;GAC7C;EACF;EACA,IAAI;GAWF,AAVA,MAAM,EAAe;IACnB,IAAI,EAAK;IACT,MAAM,EAAK,KAAK,KAAK;IACrB,MAAM,EAAK,KAAK,KAAK,CAAC,CAAC,YAAY;IACnC,aAAa,EAAK,eAAe;IACjC,MAAM,EAAK,QAAQ;IACnB,UAAU,EAAK;GACjB,CAAC,GACD,EAAU;IAAE,SAAS;IAAmB,MAAM;GAAU,CAAC,GACzD,EAAc,EAAK,GACnB,MAAM,EAAK;EACb,SAAS,GAAK;GACZ,IAAM,IAAU,GAAK,UAAU,MAAM,WAAW,GAAK,WAAW;GAEhE,AADA,EAAS,CAAO,GAChB,EAAU;IAAE;IAAS,MAAM;GAAQ,CAAC;EACtC;CACF;CAEA,IAAM,IAAU,IAAe,IAAQ,EAAM,QAAQ,MAAM,EAAE,aAAa,EAAK;CAE/E,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,IAAD,CAAQ,CAAA,GACR,kBAAC,IAAD;EAAS,MAAM;YAAf,CACA,kBAAC,IAAD;GACE,OAAM;GACN,UAAS;GACT,OAAO,CAAC,SAAS;GACjB,SACE,kBAAC,GAAD;IAAO,WAAU;IAAM,SAAS;cAAhC,CACE,kBAAC,GAAD;KAAQ,SAAQ;KAAW,WAAW,kBAAC,GAAD,CAAqB,CAAA;KAAG,eAAe,KAAK,EAAK;eAAG;IAAe,CAAA,GACxG,IACC,kBAAC,GAAD;KAAQ,SAAQ;KAAY,WAAW,kBAAC,GAAD,CAAiB,CAAA;KAAG,SAAS;eAAY;IAAoB,CAAA,IAClG,IACC;;aAVX,CAaG,IAAQ,kBAAC,GAAD;IAAO,UAAS;IAAQ,IAAI,EAAE,IAAI,EAAE;cAAI;GAAa,CAAA,IAAI,MAElE,kBAAC,GAAD;IACE,SAAQ;IACR,OAAM;IACN,UAAU,IAAU,aAAa,GAAG,EAAQ,OAAO,GAAG,EAAQ,WAAW,IAAI,aAAa;IAC1F,SACE,kBAAC,GAAD;KACE,SAAS,kBAAC,GAAD;MAAc,SAAS;MAC9B,WAAW,MAAM,GAAgB,EAAE,OAAO,OAAO;KAAI,CAAA;KACvD,OAAO,kBAAC,GAAD;MAAY,SAAQ;MAAQ,IAAI,EAAE,YAAY,IAAI;gBAAG;KAAyB,CAAA;KACrF,gBAAe;KACf,IAAI;MAAE,IAAI;MAAK,IAAI;KAAE;IACtB,CAAA;cAGH,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,IAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;KAC1B,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;KAC1B,kBAAC,GAAD,EAAA,UAAW,cAAsB,CAAA;KACjC,kBAAC,GAAD,EAAA,UAAW,SAAiB,CAAA;KAC5B,kBAAC,GAAD;MAAW,OAAM;gBAAQ;KAAiB,CAAA;IAClC,EAAA,CAAA,EACD,CAAA,GACX,kBAAC,IAAD,EAAA,UACG,IACC,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,MAChC,kBAAC,GAAD,EAAA,UACG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,GAAI,MAClC,kBAAC,GAAD,EAAA,UAAmB,kBAAC,IAAD,EAAU,QAAQ,GAAK,CAAA,EAAY,GAAtC,CAAsC,CACvD,EACO,GAJK,CAIL,CACX,IACC,EAAQ,WAAW,IACrB,kBAAC,GAAD;KACE,SAAS;KACT,MAAM;KACN,OAAO,EAAM,WAAW,IAAI,sBAAsB;KAClD,MAAM,EAAM,WAAW,IACnB,mGACA;KACJ,QAAQ,EAAM,WAAW,KAAK,IAC5B,kBAAC,GAAD;MAAQ,SAAQ;MAAY,MAAK;MAAQ,WAAW,kBAAC,GAAD,CAAiB,CAAA;MAAG,SAAS;gBAAY;KAErF,CAAA,IACN;IACL,CAAA,IACC,EAAQ,KAAK,MACf,kBAAC,GAAD;KAAqB,OAAA;eAArB;MACE,kBAAC,GAAD;OAAW,IAAI,EAAE,UAAU,IAAI;iBAC7B,kBAAC,GAAD;QAAK,WAAU;QAAO,IAAI;SACxB,SAAS;SAAgB,IAAI;SAAM,IAAI;SAAM,cAAc;SAC3D,SAAS;SAAY,YAAY;SAAa,UAAU;SAAW,YAAY;SAAK,eAAe;SACnG,UAAU;SAAQ,WAAW;QAC/B;kBACG,EAAE;OACA,CAAA;MACI,CAAA;MACX,kBAAC,GAAD;OAAW,IAAI,EAAE,UAAU,IAAI;iBAC7B,kBAAC,GAAD;QAAY,SAAQ;QAAQ,IAAI;SAAE,YAAY;SAAK,WAAW;QAAa;kBAAI,EAAE;OAAiB,CAAA;MACzF,CAAA;MACX,kBAAC,GAAD;OAAW,IAAI,EAAE,UAAU,IAAI;iBAC5B,EAAE,cACC,kBAAC,GAAD;QAAY,SAAQ;QAAU,OAAM;QAClC,IAAI;SAAE,SAAS;SAAS,WAAW;QAAa;kBAC/C,EAAE;OACO,CAAA,IACZ,kBAAC,GAAD;QAAY,SAAQ;QAAU,OAAM;kBAAgB;OAAa,CAAA;MAC5D,CAAA;MACX,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OACE,MAAK;OACL,OAAO,EAAE,WAAW,WAAW;OAC/B,OAAO,EAAE,WAAW,YAAY;OAChC,SAAS,EAAE,WAAW,WAAW;OACjC,IAAI;QAAE,YAAY;QAAK,cAAc;QAAK,QAAQ;OAAG;MACtD,CAAA,EACQ,CAAA;MACX,kBAAC,GAAD;OAAW,OAAM;iBACd,IACC,kBAAC,GAAD;QAAQ,MAAK;QAAQ,SAAQ;QAAW,eAAe,GAAS,CAAC;kBAAG;OAAY,CAAA,IAC9E;MACK,CAAA;KACH;OAnCK,EAAE,EAmCP,CACX,EACQ,CAAA,CACJ,EAAA,CAAA;GACE,CAAA,CACF;MAEb,kBAAC,GAAD;GAAQ,MAAM;GAAY,eAAe,EAAc,EAAK;GAAG,WAAA;GAAU,UAAS;aAAlF;IACE,kBAAC,IAAD,EAAA,UAAc,IAAU,kBAAkB,eAA4B,CAAA;IACtE,kBAAC,GAAD;KAAe,UAAA;eACb,kBAAC,GAAD;MAAO,SAAS;MAAG,IAAI,EAAE,IAAI,EAAE;gBAA/B;OACE,kBAAC,GAAD;QACE,UAAA;QACA,OAAM;QAAO,MAAK;QAAQ,WAAA;QAC1B,OAAO,EAAK;QACZ,YAAY,EAAE,WAAW,IAAI;QAC7B,WAAW,MAAM,EAAQ;SAAE,GAAG;SAAM,MAAM,EAAE,OAAO;QAAM,CAAC;QAC1D,QAAQ,EAAY,OAAO,MAAM;QACjC,OAAO,EAAY,KAAK,MAAM,KAAK,CAAC,CAAC,EAAW;QAChD,qBAAqB,EAAE,WAAW,MAAM;QACxC,YAAY,kBAAC,GAAD;SAAa,SAAS,EAAY,KAAK,MAAM,IAAI,EAAW,OAAO;SAAI,OAAO,EAAK;SAAM,KAAK;QAAM,CAAA;OACjH,CAAA;OACD,kBAAC,GAAD;QACE,UAAA;QACA,OAAM;QACN,MAAK;QAAQ,WAAA;QACb,OAAO,EAAK;QACZ,YAAY,EAAE,WAAW,IAAI;QAC7B,WAAW,MAAM,EAAQ;SAAE,GAAG;SAAM,MAAM,EAAE,OAAO,MAAM,YAAY;QAAE,CAAC;QACxE,QAAQ,EAAY,OAAO,MAAM;QACjC,OAAO,EAAY,KAAK,MAAM,KAAK,CAAC,CAAC,EAAW;QAChD,qBAAqB,EAAE,WAAW,MAAM;QACxC,YAAY,kBAAC,GAAD;SAAa,SAAS,EAAY,KAAK,MAAM,IAAI,EAAW,OAAO;SAAmB,OAAO,EAAK;SAAM,KAAK;QAAM,CAAA;OAChI,CAAA;OACD,kBAAC,GAAD;QAAW,OAAM;QAAyB,MAAK;QAAQ,WAAA;QAAU,SAAS;QAAG,WAAA;QAAU,OAAO,EAAK;QACjG,YAAY,EAAE,WAAW,IAAI;QAC7B,WAAW,MAAM,EAAQ;SAAE,GAAG;SAAM,aAAa,EAAE,OAAO;QAAM,CAAC;QACjE,qBAAqB,EAAE,WAAW,MAAM;QACxC,YAAY,kBAAC,GAAD;SAAa,SAAQ;SAAG,OAAO,EAAK;SAAa,KAAK;QAAM,CAAA;OAAI,CAAA;OAC9E,kBAAC,GAAD;QAAW,OAAM;QAAkB,MAAK;QAAQ,WAAA;QAAU,OAAO,EAAK;QACpE,WAAW,MAAM,EAAQ;SAAE,GAAG;SAAM,MAAM,EAAE,OAAO;QAAM,CAAC;OAAI,CAAA;OAChE,kBAAC,GAAD;QACE,SAAS,kBAAC,GAAD;SAAU,SAAS,EAAK;SAC/B,WAAW,MAAM,EAAQ;UAAE,GAAG;UAAM,UAAU,EAAE,OAAO;SAAQ,CAAC;QAAI,CAAA;QACtE,OAAM;OAAU,CAAA;MACb;;IACM,CAAA;IACf,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KAAQ,eAAe,EAAc,EAAK;eAAG;IAAc,CAAA,GAC3D,kBAAC,GAAD;KAAQ,SAAQ;KAAY,UAAU,CAAC;KAAa,eAAe,KAAK,GAAK;eAAG;IAAY,CAAA,CAC/E,EAAA,CAAA;GACT;IACC;GACN,EAAA,CAAA;AAET"}
|