@argusoft/medplat-product-management 1.0.2 → 1.0.3
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-CSA3meke.js → BrandsPage-NSvaMXWg.js} +76 -75
- package/dist/BrandsPage-NSvaMXWg.js.map +1 -0
- package/dist/{CategoriesPage-BrspzkJL.js → CategoriesPage-aZBZrDOi.js} +8 -8
- package/dist/{CategoriesPage-BrspzkJL.js.map → CategoriesPage-aZBZrDOi.js.map} +1 -1
- package/dist/{DashboardPage-CqaquOs2.js → DashboardPage-DjwlOhrd.js} +22 -22
- package/dist/DashboardPage-DjwlOhrd.js.map +1 -0
- package/dist/{FacilityPicker-Dv_H95WW.js → FacilityPicker-Chh-ZaR0.js} +2 -2
- package/dist/{FacilityPicker-Dv_H95WW.js.map → FacilityPicker-Chh-ZaR0.js.map} +1 -1
- package/dist/{InventoryPage-CPbzfDMR.js → InventoryPage-cy76UsMp.js} +109 -119
- package/dist/InventoryPage-cy76UsMp.js.map +1 -0
- package/dist/{MemberProfileCard-0vjO3Gzd.js → MemberProfileCard-CinPt09F.js} +6 -6
- package/dist/MemberProfileCard-CinPt09F.js.map +1 -0
- package/dist/{PaymentCreatePage-BYmDZAIB.js → PaymentCreatePage-BJe3LyFF.js} +148 -153
- package/dist/PaymentCreatePage-BJe3LyFF.js.map +1 -0
- package/dist/{PaymentsPage-BXPvKon-.js → PaymentsPage-DxHoKksN.js} +11 -11
- package/dist/{PaymentsPage-BXPvKon-.js.map → PaymentsPage-DxHoKksN.js.map} +1 -1
- package/dist/PickupCreatePage-Cq8zJ62Y.js +705 -0
- package/dist/PickupCreatePage-Cq8zJ62Y.js.map +1 -0
- package/dist/{PickupsPage-D66_Wta4.js → PickupsPage-BOygBQAb.js} +66 -74
- package/dist/PickupsPage-BOygBQAb.js.map +1 -0
- package/dist/{PmTable-B9970kPY.js → PmTable-CCpaJEA_.js} +4 -4
- package/dist/PmTable-CCpaJEA_.js.map +1 -0
- package/dist/{ProductEditPage-B8qFTCW9.js → ProductEditPage-DmdHO-fS.js} +109 -109
- package/dist/ProductEditPage-DmdHO-fS.js.map +1 -0
- package/dist/{ProductsPage-C7_r9cKn.js → ProductsPage-BglMe8EM.js} +6 -6
- package/dist/{ProductsPage-C7_r9cKn.js.map → ProductsPage-BglMe8EM.js.map} +1 -1
- package/dist/PurchaseCreatePage-1tYk41RS.js +590 -0
- package/dist/PurchaseCreatePage-1tYk41RS.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-C7aAwEqw.js → PurchaseRequestDetailPage-BYLx3aBI.js} +14 -14
- package/dist/PurchaseRequestDetailPage-BYLx3aBI.js.map +1 -0
- package/dist/{PurchaseRequestsPage-BwCkbpaX.js → PurchaseRequestsPage-D2yorc4s.js} +4 -4
- package/dist/{PurchaseRequestsPage-BwCkbpaX.js.map → PurchaseRequestsPage-D2yorc4s.js.map} +1 -1
- package/dist/{PurchasesPage-CvaZouVy.js → PurchasesPage-CanQTjlw.js} +3 -3
- package/dist/{PurchasesPage-CvaZouVy.js.map → PurchasesPage-CanQTjlw.js.map} +1 -1
- package/dist/{SaleCreatePage-DP1Qmltu.js → SaleCreatePage-DxFvPvju.js} +145 -170
- package/dist/SaleCreatePage-DxFvPvju.js.map +1 -0
- package/dist/{SalesPage-CO3cdYX5.js → SalesPage-CPMrdr5-.js} +12 -12
- package/dist/SalesPage-CPMrdr5-.js.map +1 -0
- package/dist/SettingsPage-CEy922rW.js +662 -0
- package/dist/SettingsPage-CEy922rW.js.map +1 -0
- package/dist/{StorageUnitsPage-B9Hr_RkW.js → StorageUnitsPage-DfLT6xC_.js} +13 -13
- package/dist/{StorageUnitsPage-B9Hr_RkW.js.map → StorageUnitsPage-DfLT6xC_.js.map} +1 -1
- package/dist/{TransactionsPage-HKIGwEZN.js → TransactionsPage-KFUJ4O5g.js} +4 -4
- package/dist/TransactionsPage-KFUJ4O5g.js.map +1 -0
- package/dist/TransferCreatePage-k1tsRGB3.js +315 -0
- package/dist/TransferCreatePage-k1tsRGB3.js.map +1 -0
- package/dist/TransfersPage-CDafSVO9.js +470 -0
- package/dist/TransfersPage-CDafSVO9.js.map +1 -0
- package/dist/VialsPage-DPsYFgaQ.js +897 -0
- package/dist/VialsPage-DPsYFgaQ.js.map +1 -0
- package/dist/{currency-ClRLIEg2.js → currency-bVQ7aEk2.js} +141 -506
- package/dist/currency-bVQ7aEk2.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/BrandsPage-CSA3meke.js.map +0 -1
- package/dist/DashboardPage-CqaquOs2.js.map +0 -1
- package/dist/InventoryPage-CPbzfDMR.js.map +0 -1
- package/dist/MemberProfileCard-0vjO3Gzd.js.map +0 -1
- package/dist/PaymentCreatePage-BYmDZAIB.js.map +0 -1
- package/dist/PickupCreatePage-CMGwoAXj.js +0 -426
- package/dist/PickupCreatePage-CMGwoAXj.js.map +0 -1
- package/dist/PickupsPage-D66_Wta4.js.map +0 -1
- package/dist/PmTable-B9970kPY.js.map +0 -1
- package/dist/ProductEditPage-B8qFTCW9.js.map +0 -1
- package/dist/PurchaseCreatePage-CDfNDcKG.js +0 -627
- package/dist/PurchaseCreatePage-CDfNDcKG.js.map +0 -1
- package/dist/PurchaseRequestDetailPage-C7aAwEqw.js.map +0 -1
- package/dist/SaleCreatePage-DP1Qmltu.js.map +0 -1
- package/dist/SalesPage-CO3cdYX5.js.map +0 -1
- package/dist/SettingsPage-DvVRwSFw.js +0 -711
- package/dist/SettingsPage-DvVRwSFw.js.map +0 -1
- package/dist/TransactionsPage-HKIGwEZN.js.map +0 -1
- package/dist/TransferCreatePage-DMuZqQ3c.js +0 -363
- package/dist/TransferCreatePage-DMuZqQ3c.js.map +0 -1
- package/dist/TransfersPage-COIyouL4.js +0 -480
- package/dist/TransfersPage-COIyouL4.js.map +0 -1
- package/dist/VialsPage-BNPUwGCU.js +0 -922
- package/dist/VialsPage-BNPUwGCU.js.map +0 -1
- package/dist/currency-ClRLIEg2.js.map +0 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as
|
|
3
|
-
import { m as
|
|
4
|
-
import { a as
|
|
5
|
-
import { a as
|
|
6
|
-
import { useMemo as
|
|
7
|
-
import { jsx as
|
|
8
|
-
import { v4 as
|
|
9
|
-
import { Alert as
|
|
1
|
+
import { M as e, Y as t, a as n, i as ee, n as r, nt as te, o as ne, r as re } from "./currency-bVQ7aEk2.js";
|
|
2
|
+
import { a as ie, c as i, o as a, s as ae, t as oe } from "./PmTable-CCpaJEA_.js";
|
|
3
|
+
import { m as o } from "./validation-Ba7puFIO.js";
|
|
4
|
+
import { a as s, i as c, t as se } from "./format-UOyOu75i.js";
|
|
5
|
+
import { a as l, p as u, t as d } from "./constants-5ZCZo-Zm.js";
|
|
6
|
+
import { useMemo as ce, useState as f } from "react";
|
|
7
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
8
|
+
import { v4 as h } from "uuid";
|
|
9
|
+
import { Alert as g, Box as _, Button as v, Chip as y, Dialog as le, DialogActions as ue, DialogContent as de, DialogTitle as fe, FormControl as pe, InputAdornment as me, InputLabel as he, LinearProgress as ge, MenuItem as b, Select as _e, Skeleton as ve, Stack as x, TableBody as ye, TableCell as S, TableHead as be, TableRow as C, TextField as w, Tooltip as T, Typography as E } from "@mui/material";
|
|
10
10
|
import D from "@mui/icons-material/RefreshRounded";
|
|
11
11
|
import { showToast as O } from "@/common/toaster/toaster";
|
|
12
12
|
import { alpha as k, useTheme as A } from "@mui/material/styles";
|
|
@@ -16,15 +16,15 @@ import N from "@mui/icons-material/LockOpenRounded";
|
|
|
16
16
|
import xe from "@mui/icons-material/SearchRounded";
|
|
17
17
|
//#region src/views/InventoryPage.jsx
|
|
18
18
|
function P(e) {
|
|
19
|
-
return e ? e.status === "EXPIRED" ? !0 :
|
|
19
|
+
return e ? e.status === "EXPIRED" ? !0 : c(e.expiryDate) : !1;
|
|
20
20
|
}
|
|
21
21
|
function F() {
|
|
22
|
-
let
|
|
22
|
+
let c = n().has("update.manage.productManagement.inventory"), [F, Se] = f([]), [I, L] = f(!1), [R, z] = f(""), [B, V] = f({
|
|
23
23
|
open: !1,
|
|
24
24
|
batch: null,
|
|
25
25
|
reason: "OTHER",
|
|
26
26
|
notes: ""
|
|
27
|
-
}), Ce = A(), [H, U] =
|
|
27
|
+
}), Ce = A(), [H, U] = f(""), [W, G] = f("ALL"), [K, q] = f(!1), [J, Y] = f(!1);
|
|
28
28
|
async function X() {
|
|
29
29
|
L(!0), z("");
|
|
30
30
|
try {
|
|
@@ -39,10 +39,10 @@ function F() {
|
|
|
39
39
|
L(!1);
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
-
|
|
42
|
+
ee("view.manage.productManagement.inventory", () => {
|
|
43
43
|
X();
|
|
44
44
|
}, []);
|
|
45
|
-
let Z =
|
|
45
|
+
let Z = ce(() => {
|
|
46
46
|
let e = H.trim().toLowerCase();
|
|
47
47
|
return F.filter((t) => !(e && !`${t.productName ?? ""} ${t.lotNumber ?? ""}`.toLowerCase().includes(e) || W !== "ALL" && t.status !== W || K && P(t) || J && !(Number(t.qtyRemaining ?? 0) > 0)));
|
|
48
48
|
}, [
|
|
@@ -58,7 +58,7 @@ function F() {
|
|
|
58
58
|
async function we() {
|
|
59
59
|
try {
|
|
60
60
|
await t({
|
|
61
|
-
id:
|
|
61
|
+
id: h(),
|
|
62
62
|
batchId: B.batch.id,
|
|
63
63
|
reason: B.reason,
|
|
64
64
|
notes: B.notes || null
|
|
@@ -80,8 +80,8 @@ function F() {
|
|
|
80
80
|
}
|
|
81
81
|
async function Te(e) {
|
|
82
82
|
try {
|
|
83
|
-
await
|
|
84
|
-
id:
|
|
83
|
+
await te({
|
|
84
|
+
id: h(),
|
|
85
85
|
batchId: e.id
|
|
86
86
|
}), O({
|
|
87
87
|
message: "Quarantine lifted.",
|
|
@@ -94,31 +94,31 @@ function F() {
|
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
}
|
|
97
|
-
return /* @__PURE__ */
|
|
97
|
+
return /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(re, {}), /* @__PURE__ */ m(r, {
|
|
98
98
|
perm: "view.manage.productManagement.inventory",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
99
|
+
children: [/* @__PURE__ */ m(ne, {
|
|
100
100
|
title: "Inventory",
|
|
101
101
|
subtitle: "Your stock batches. Click to see history or quarantine items if there's a problem.",
|
|
102
102
|
chips: ["Stock"],
|
|
103
|
-
actions: /* @__PURE__ */
|
|
103
|
+
actions: /* @__PURE__ */ p(x, {
|
|
104
104
|
direction: "row",
|
|
105
105
|
spacing: 1,
|
|
106
|
-
children: /* @__PURE__ */
|
|
106
|
+
children: /* @__PURE__ */ p(v, {
|
|
107
107
|
variant: "outlined",
|
|
108
|
-
startIcon: /* @__PURE__ */
|
|
108
|
+
startIcon: /* @__PURE__ */ p(D, {}),
|
|
109
109
|
onClick: () => void X(),
|
|
110
110
|
children: "Refresh"
|
|
111
111
|
})
|
|
112
112
|
}),
|
|
113
|
-
children: [R ? /* @__PURE__ */
|
|
113
|
+
children: [R ? /* @__PURE__ */ p(g, {
|
|
114
114
|
severity: "error",
|
|
115
115
|
sx: { mb: 2 },
|
|
116
116
|
children: R
|
|
117
|
-
}) : null, /* @__PURE__ */
|
|
117
|
+
}) : null, /* @__PURE__ */ m(i, {
|
|
118
118
|
eyebrow: "Stock on hand",
|
|
119
119
|
title: "Inventory batches",
|
|
120
120
|
subtitle: I ? "Loading…" : Q ? `${Z.length} of ${F.length} ${F.length === 1 ? "batch" : "batches"} match` : `${F.length} ${F.length === 1 ? "batch" : "batches"} visible`,
|
|
121
|
-
children: [/* @__PURE__ */
|
|
121
|
+
children: [/* @__PURE__ */ m(x, {
|
|
122
122
|
direction: {
|
|
123
123
|
xs: "column",
|
|
124
124
|
md: "row"
|
|
@@ -127,37 +127,37 @@ function F() {
|
|
|
127
127
|
sx: { mb: 2 },
|
|
128
128
|
alignItems: { md: "center" },
|
|
129
129
|
children: [
|
|
130
|
-
/* @__PURE__ */
|
|
130
|
+
/* @__PURE__ */ p(w, {
|
|
131
131
|
size: "small",
|
|
132
132
|
fullWidth: !0,
|
|
133
133
|
placeholder: "Search product or lot…",
|
|
134
134
|
value: H,
|
|
135
135
|
onChange: (e) => U(e.target.value),
|
|
136
|
-
InputProps: { startAdornment: /* @__PURE__ */
|
|
136
|
+
InputProps: { startAdornment: /* @__PURE__ */ p(me, {
|
|
137
137
|
position: "start",
|
|
138
|
-
children: /* @__PURE__ */
|
|
138
|
+
children: /* @__PURE__ */ p(xe, { fontSize: "small" })
|
|
139
139
|
}) },
|
|
140
140
|
sx: { maxWidth: { md: 360 } }
|
|
141
141
|
}),
|
|
142
|
-
/* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ m(pe, {
|
|
143
143
|
size: "small",
|
|
144
144
|
sx: { minWidth: 160 },
|
|
145
|
-
children: [/* @__PURE__ */
|
|
145
|
+
children: [/* @__PURE__ */ p(he, { children: "Status" }), /* @__PURE__ */ m(_e, {
|
|
146
146
|
label: "Status",
|
|
147
147
|
value: W,
|
|
148
148
|
onChange: (e) => {
|
|
149
149
|
let t = e.target.value;
|
|
150
150
|
G(t), t === "EXPIRED" && q(!1), t === "EXHAUSTED" && Y(!1);
|
|
151
151
|
},
|
|
152
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ p(b, {
|
|
153
153
|
value: "ALL",
|
|
154
154
|
children: "All statuses"
|
|
155
|
-
}),
|
|
155
|
+
}), d.map((e) => {
|
|
156
156
|
let t = e.value === "EXPIRED" && K || e.value === "EXHAUSTED" && J;
|
|
157
|
-
return /* @__PURE__ */
|
|
157
|
+
return /* @__PURE__ */ m(b, {
|
|
158
158
|
value: e.value,
|
|
159
159
|
disabled: t,
|
|
160
|
-
children: [e.label, t ? /* @__PURE__ */
|
|
160
|
+
children: [e.label, t ? /* @__PURE__ */ p(E, {
|
|
161
161
|
component: "span",
|
|
162
162
|
variant: "caption",
|
|
163
163
|
color: "text.disabled",
|
|
@@ -168,12 +168,12 @@ function F() {
|
|
|
168
168
|
})]
|
|
169
169
|
})]
|
|
170
170
|
}),
|
|
171
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ m(x, {
|
|
172
172
|
direction: "row",
|
|
173
173
|
spacing: 1,
|
|
174
174
|
useFlexGap: !0,
|
|
175
175
|
flexWrap: "wrap",
|
|
176
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ p(y, {
|
|
177
177
|
label: "Not yet expired",
|
|
178
178
|
size: "small",
|
|
179
179
|
disabled: W === "EXPIRED",
|
|
@@ -189,7 +189,7 @@ function F() {
|
|
|
189
189
|
fontWeight: 700,
|
|
190
190
|
borderRadius: 1.5
|
|
191
191
|
}
|
|
192
|
-
}), /* @__PURE__ */
|
|
192
|
+
}), /* @__PURE__ */ p(y, {
|
|
193
193
|
label: "Stock still left",
|
|
194
194
|
size: "small",
|
|
195
195
|
disabled: W === "EXHAUSTED",
|
|
@@ -207,37 +207,37 @@ function F() {
|
|
|
207
207
|
}
|
|
208
208
|
})]
|
|
209
209
|
}),
|
|
210
|
-
/* @__PURE__ */
|
|
211
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ p(_, { sx: { flexGrow: 1 } }),
|
|
211
|
+
/* @__PURE__ */ p(v, {
|
|
212
212
|
variant: "text",
|
|
213
213
|
onClick: $,
|
|
214
214
|
disabled: !Q,
|
|
215
215
|
children: "Clear"
|
|
216
216
|
})
|
|
217
217
|
]
|
|
218
|
-
}), /* @__PURE__ */
|
|
218
|
+
}), /* @__PURE__ */ m(ae, {
|
|
219
219
|
dense: !0,
|
|
220
|
-
children: [/* @__PURE__ */
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
223
|
-
/* @__PURE__ */
|
|
224
|
-
/* @__PURE__ */
|
|
225
|
-
/* @__PURE__ */
|
|
220
|
+
children: [/* @__PURE__ */ p(be, { children: /* @__PURE__ */ m(C, { children: [
|
|
221
|
+
/* @__PURE__ */ p(S, { children: "Product" }),
|
|
222
|
+
/* @__PURE__ */ p(S, { children: "Lot" }),
|
|
223
|
+
/* @__PURE__ */ p(S, { children: "Owner" }),
|
|
224
|
+
/* @__PURE__ */ p(S, { children: "Expiry" }),
|
|
225
|
+
/* @__PURE__ */ p(S, {
|
|
226
226
|
align: "right",
|
|
227
227
|
children: "Stock"
|
|
228
228
|
}),
|
|
229
|
-
/* @__PURE__ */
|
|
230
|
-
/* @__PURE__ */
|
|
231
|
-
/* @__PURE__ */
|
|
229
|
+
/* @__PURE__ */ p(S, { children: "Storage" }),
|
|
230
|
+
/* @__PURE__ */ p(S, { children: "Status" }),
|
|
231
|
+
/* @__PURE__ */ p(S, {
|
|
232
232
|
align: "right",
|
|
233
233
|
children: "Action"
|
|
234
234
|
})
|
|
235
|
-
] }) }), /* @__PURE__ */
|
|
235
|
+
] }) }), /* @__PURE__ */ p(ye, { children: I ? Array.from({ length: 5 }).map((e, t) => /* @__PURE__ */ p(C, { children: Array.from({ length: 8 }).map((e, t) => /* @__PURE__ */ p(S, { children: /* @__PURE__ */ p(ve, { height: 22 }) }, t)) }, t)) : Z.length === 0 ? /* @__PURE__ */ p(oe, {
|
|
236
236
|
colSpan: 8,
|
|
237
237
|
icon: j,
|
|
238
238
|
title: Q ? "No batches match your filters" : "No batches in stock",
|
|
239
239
|
hint: Q ? "Adjust your search or filters." : "Record a purchase to add stock.",
|
|
240
|
-
action: Q ? /* @__PURE__ */
|
|
240
|
+
action: Q ? /* @__PURE__ */ p(v, {
|
|
241
241
|
variant: "text",
|
|
242
242
|
size: "small",
|
|
243
243
|
onClick: $,
|
|
@@ -245,24 +245,24 @@ function F() {
|
|
|
245
245
|
}) : null
|
|
246
246
|
}) : Z.map((e) => {
|
|
247
247
|
let t = P(e), n = e.qtyPurchased > 0 ? e.qtyRemaining / e.qtyPurchased : 0;
|
|
248
|
-
return /* @__PURE__ */
|
|
248
|
+
return /* @__PURE__ */ m(C, {
|
|
249
249
|
hover: !0,
|
|
250
250
|
children: [
|
|
251
|
-
/* @__PURE__ */
|
|
251
|
+
/* @__PURE__ */ p(S, { children: /* @__PURE__ */ m(x, {
|
|
252
252
|
direction: "row",
|
|
253
253
|
alignItems: "baseline",
|
|
254
254
|
spacing: 1,
|
|
255
255
|
sx: { minWidth: 0 },
|
|
256
|
-
children: [/* @__PURE__ */
|
|
256
|
+
children: [/* @__PURE__ */ p(E, {
|
|
257
257
|
variant: "body2",
|
|
258
258
|
sx: {
|
|
259
259
|
fontWeight: 700,
|
|
260
260
|
lineHeight: 1.2
|
|
261
261
|
},
|
|
262
262
|
children: e.productName
|
|
263
|
-
}), /* @__PURE__ */
|
|
263
|
+
}), /* @__PURE__ */ p(ie, { id: e.serialId })]
|
|
264
264
|
}) }),
|
|
265
|
-
/* @__PURE__ */
|
|
265
|
+
/* @__PURE__ */ p(S, { children: e.lotNumber ? /* @__PURE__ */ p(_, {
|
|
266
266
|
component: "span",
|
|
267
267
|
sx: {
|
|
268
268
|
display: "inline-flex",
|
|
@@ -276,49 +276,49 @@ function F() {
|
|
|
276
276
|
fontWeight: 700
|
|
277
277
|
},
|
|
278
278
|
children: e.lotNumber
|
|
279
|
-
}) : /* @__PURE__ */
|
|
279
|
+
}) : /* @__PURE__ */ p(E, {
|
|
280
280
|
variant: "caption",
|
|
281
281
|
color: "text.disabled",
|
|
282
282
|
children: "—"
|
|
283
283
|
}) }),
|
|
284
|
-
/* @__PURE__ */
|
|
284
|
+
/* @__PURE__ */ m(S, { children: [/* @__PURE__ */ p(E, {
|
|
285
285
|
variant: "body2",
|
|
286
286
|
sx: { fontWeight: 700 },
|
|
287
287
|
children: e.ownerName || (e.ownerType === "USER" ? "Personal" : "Facility")
|
|
288
|
-
}), /* @__PURE__ */
|
|
288
|
+
}), /* @__PURE__ */ p(E, {
|
|
289
289
|
variant: "caption",
|
|
290
290
|
color: "text.secondary",
|
|
291
291
|
children: e.ownerType
|
|
292
292
|
})] }),
|
|
293
|
-
/* @__PURE__ */
|
|
293
|
+
/* @__PURE__ */ p(S, { children: e.expiryDate ? /* @__PURE__ */ p(T, {
|
|
294
294
|
title: t ? "Past printed expiry" : "",
|
|
295
|
-
children: /* @__PURE__ */
|
|
295
|
+
children: /* @__PURE__ */ p(E, {
|
|
296
296
|
variant: "body2",
|
|
297
297
|
sx: {
|
|
298
298
|
fontWeight: 700,
|
|
299
299
|
fontVariantNumeric: "tabular-nums",
|
|
300
300
|
color: t ? "error.dark" : "text.primary"
|
|
301
301
|
},
|
|
302
|
-
children:
|
|
302
|
+
children: se(e.expiryDate)
|
|
303
303
|
})
|
|
304
|
-
}) : /* @__PURE__ */
|
|
304
|
+
}) : /* @__PURE__ */ p(E, {
|
|
305
305
|
variant: "caption",
|
|
306
306
|
color: "text.disabled",
|
|
307
307
|
children: "—"
|
|
308
308
|
}) }),
|
|
309
|
-
/* @__PURE__ */
|
|
309
|
+
/* @__PURE__ */ p(S, {
|
|
310
310
|
align: "right",
|
|
311
311
|
sx: { minWidth: 150 },
|
|
312
|
-
children: /* @__PURE__ */
|
|
312
|
+
children: /* @__PURE__ */ m(x, {
|
|
313
313
|
alignItems: "flex-end",
|
|
314
314
|
spacing: .5,
|
|
315
|
-
children: [/* @__PURE__ */
|
|
315
|
+
children: [/* @__PURE__ */ m(E, {
|
|
316
316
|
variant: "body2",
|
|
317
317
|
sx: {
|
|
318
318
|
fontWeight: 800,
|
|
319
319
|
fontVariantNumeric: "tabular-nums"
|
|
320
320
|
},
|
|
321
|
-
children: [e.qtyRemaining, /* @__PURE__ */
|
|
321
|
+
children: [e.qtyRemaining, /* @__PURE__ */ m(E, {
|
|
322
322
|
component: "span",
|
|
323
323
|
variant: "caption",
|
|
324
324
|
color: "text.secondary",
|
|
@@ -328,9 +328,9 @@ function F() {
|
|
|
328
328
|
},
|
|
329
329
|
children: ["/ ", e.qtyPurchased]
|
|
330
330
|
})]
|
|
331
|
-
}), /* @__PURE__ */
|
|
331
|
+
}), /* @__PURE__ */ p(_, {
|
|
332
332
|
sx: { width: 80 },
|
|
333
|
-
children: /* @__PURE__ */
|
|
333
|
+
children: /* @__PURE__ */ p(ge, {
|
|
334
334
|
variant: "determinate",
|
|
335
335
|
value: Math.min(100, Math.max(0, n * 100)),
|
|
336
336
|
sx: {
|
|
@@ -342,42 +342,42 @@ function F() {
|
|
|
342
342
|
})]
|
|
343
343
|
})
|
|
344
344
|
}),
|
|
345
|
-
/* @__PURE__ */
|
|
345
|
+
/* @__PURE__ */ p(S, { children: e.storageUnitName ? /* @__PURE__ */ p(E, {
|
|
346
346
|
variant: "caption",
|
|
347
347
|
sx: { fontWeight: 700 },
|
|
348
348
|
children: e.storageUnitName
|
|
349
|
-
}) : /* @__PURE__ */
|
|
349
|
+
}) : /* @__PURE__ */ p(E, {
|
|
350
350
|
variant: "caption",
|
|
351
351
|
color: "text.disabled",
|
|
352
352
|
children: "—"
|
|
353
353
|
}) }),
|
|
354
|
-
/* @__PURE__ */
|
|
354
|
+
/* @__PURE__ */ p(S, { children: /* @__PURE__ */ m(x, {
|
|
355
355
|
direction: "row",
|
|
356
356
|
spacing: .5,
|
|
357
357
|
flexWrap: "wrap",
|
|
358
358
|
useFlexGap: !0,
|
|
359
359
|
children: [
|
|
360
|
-
/* @__PURE__ */
|
|
360
|
+
/* @__PURE__ */ p(y, {
|
|
361
361
|
size: "small",
|
|
362
|
-
color:
|
|
363
|
-
label:
|
|
362
|
+
color: s(e.status),
|
|
363
|
+
label: u(d, e.status),
|
|
364
364
|
sx: {
|
|
365
365
|
fontWeight: 700,
|
|
366
366
|
borderRadius: 1.5,
|
|
367
367
|
height: 22
|
|
368
368
|
}
|
|
369
369
|
}),
|
|
370
|
-
e.isQuarantined ? /* @__PURE__ */
|
|
370
|
+
e.isQuarantined ? /* @__PURE__ */ p(y, {
|
|
371
371
|
size: "small",
|
|
372
372
|
color: "error",
|
|
373
|
-
label:
|
|
373
|
+
label: u(l, e.quarantineReason) || "Quarantined",
|
|
374
374
|
sx: {
|
|
375
375
|
fontWeight: 700,
|
|
376
376
|
borderRadius: 1.5,
|
|
377
377
|
height: 22
|
|
378
378
|
}
|
|
379
379
|
}) : null,
|
|
380
|
-
t && e.status !== "EXPIRED" ? /* @__PURE__ */
|
|
380
|
+
t && e.status !== "EXPIRED" ? /* @__PURE__ */ p(y, {
|
|
381
381
|
size: "small",
|
|
382
382
|
color: "warning",
|
|
383
383
|
label: "Expired",
|
|
@@ -387,7 +387,7 @@ function F() {
|
|
|
387
387
|
height: 22
|
|
388
388
|
}
|
|
389
389
|
}) : null,
|
|
390
|
-
e.sourceType ? /* @__PURE__ */
|
|
390
|
+
e.sourceType ? /* @__PURE__ */ p(y, {
|
|
391
391
|
size: "small",
|
|
392
392
|
variant: "outlined",
|
|
393
393
|
color: e.sourceType === "PICKUP" ? "info" : e.sourceType === "TRANSFER_IN" ? "primary" : "default",
|
|
@@ -400,20 +400,20 @@ function F() {
|
|
|
400
400
|
}) : null
|
|
401
401
|
]
|
|
402
402
|
}) }),
|
|
403
|
-
/* @__PURE__ */
|
|
403
|
+
/* @__PURE__ */ p(S, {
|
|
404
404
|
align: "right",
|
|
405
|
-
children:
|
|
405
|
+
children: c ? e.isQuarantined ? /* @__PURE__ */ p(v, {
|
|
406
406
|
size: "small",
|
|
407
407
|
variant: "outlined",
|
|
408
408
|
color: "success",
|
|
409
|
-
startIcon: /* @__PURE__ */
|
|
409
|
+
startIcon: /* @__PURE__ */ p(N, {}),
|
|
410
410
|
onClick: () => void Te(e),
|
|
411
411
|
children: "Unquarantine"
|
|
412
|
-
}) : t || e.status === "EXHAUSTED" || e.status === "IN_USE" ? null : /* @__PURE__ */
|
|
412
|
+
}) : t || e.status === "EXHAUSTED" || e.status === "IN_USE" ? null : /* @__PURE__ */ p(v, {
|
|
413
413
|
size: "small",
|
|
414
414
|
variant: "outlined",
|
|
415
415
|
color: "error",
|
|
416
|
-
startIcon: /* @__PURE__ */
|
|
416
|
+
startIcon: /* @__PURE__ */ p(M, {}),
|
|
417
417
|
onClick: () => V({
|
|
418
418
|
open: !0,
|
|
419
419
|
batch: e,
|
|
@@ -428,7 +428,7 @@ function F() {
|
|
|
428
428
|
}) })]
|
|
429
429
|
})]
|
|
430
430
|
})]
|
|
431
|
-
}), /* @__PURE__ */
|
|
431
|
+
}), /* @__PURE__ */ m(le, {
|
|
432
432
|
open: B.open,
|
|
433
433
|
onClose: () => V({
|
|
434
434
|
...B,
|
|
@@ -437,49 +437,39 @@ function F() {
|
|
|
437
437
|
fullWidth: !0,
|
|
438
438
|
maxWidth: "sm",
|
|
439
439
|
children: [
|
|
440
|
-
/* @__PURE__ */
|
|
441
|
-
/* @__PURE__ */
|
|
440
|
+
/* @__PURE__ */ p(fe, { children: "Quarantine Batch" }),
|
|
441
|
+
/* @__PURE__ */ p(de, {
|
|
442
442
|
dividers: !0,
|
|
443
|
-
children: /* @__PURE__ */
|
|
443
|
+
children: /* @__PURE__ */ m(x, {
|
|
444
444
|
spacing: 2,
|
|
445
445
|
sx: { pt: 1 },
|
|
446
446
|
children: [
|
|
447
|
-
/* @__PURE__ */
|
|
447
|
+
/* @__PURE__ */ m(E, {
|
|
448
448
|
variant: "body2",
|
|
449
449
|
children: [
|
|
450
450
|
"Product: ",
|
|
451
|
-
/* @__PURE__ */
|
|
452
|
-
/* @__PURE__ */
|
|
451
|
+
/* @__PURE__ */ p("strong", { children: B.batch?.productName }),
|
|
452
|
+
/* @__PURE__ */ p("br", {}),
|
|
453
453
|
"Lot: ",
|
|
454
|
-
/* @__PURE__ */
|
|
455
|
-
/* @__PURE__ */
|
|
454
|
+
/* @__PURE__ */ p("strong", { children: B.batch?.lotNumber || "—" }),
|
|
455
|
+
/* @__PURE__ */ p("br", {}),
|
|
456
456
|
"Remaining: ",
|
|
457
|
-
/* @__PURE__ */
|
|
457
|
+
/* @__PURE__ */ p("strong", { children: B.batch?.qtyRemaining })
|
|
458
458
|
]
|
|
459
459
|
}),
|
|
460
|
-
/* @__PURE__ */ p(
|
|
460
|
+
/* @__PURE__ */ p(a, {
|
|
461
|
+
label: "Reason",
|
|
461
462
|
required: !0,
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
onChange: (e) => V({
|
|
471
|
-
...B,
|
|
472
|
-
reason: e.target.value
|
|
473
|
-
}),
|
|
474
|
-
children: s.map((e) => /* @__PURE__ */ f(b, {
|
|
475
|
-
value: e.value,
|
|
476
|
-
children: e.label
|
|
477
|
-
}, e.value))
|
|
478
|
-
}),
|
|
479
|
-
a(B.reason, "Reason") ? /* @__PURE__ */ f(me, { children: a(B.reason, "Reason") }) : null
|
|
480
|
-
]
|
|
463
|
+
value: B.reason,
|
|
464
|
+
onChange: (e) => V({
|
|
465
|
+
...B,
|
|
466
|
+
reason: e
|
|
467
|
+
}),
|
|
468
|
+
options: l,
|
|
469
|
+
error: !!o(B.reason, "Reason"),
|
|
470
|
+
helperText: o(B.reason, "Reason") || ""
|
|
481
471
|
}),
|
|
482
|
-
/* @__PURE__ */
|
|
472
|
+
/* @__PURE__ */ p(w, {
|
|
483
473
|
label: "Notes",
|
|
484
474
|
size: "small",
|
|
485
475
|
multiline: !0,
|
|
@@ -494,16 +484,16 @@ function F() {
|
|
|
494
484
|
]
|
|
495
485
|
})
|
|
496
486
|
}),
|
|
497
|
-
/* @__PURE__ */
|
|
487
|
+
/* @__PURE__ */ m(ue, { children: [/* @__PURE__ */ p(v, {
|
|
498
488
|
onClick: () => V({
|
|
499
489
|
...B,
|
|
500
490
|
open: !1
|
|
501
491
|
}),
|
|
502
492
|
children: "Cancel"
|
|
503
|
-
}), /* @__PURE__ */
|
|
493
|
+
}), /* @__PURE__ */ p(v, {
|
|
504
494
|
variant: "contained",
|
|
505
495
|
color: "error",
|
|
506
|
-
disabled: !!
|
|
496
|
+
disabled: !!o(B.reason, "Reason"),
|
|
507
497
|
onClick: () => void we(),
|
|
508
498
|
children: "Quarantine"
|
|
509
499
|
})] })
|
|
@@ -514,4 +504,4 @@ function F() {
|
|
|
514
504
|
//#endregion
|
|
515
505
|
export { F as default };
|
|
516
506
|
|
|
517
|
-
//# sourceMappingURL=InventoryPage-
|
|
507
|
+
//# sourceMappingURL=InventoryPage-cy76UsMp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InventoryPage-cy76UsMp.js","names":[],"sources":["../src/views/InventoryPage.jsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n InputAdornment,\n InputLabel,\n LinearProgress,\n MenuItem,\n Select,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Tooltip,\n Typography,\n} from \"@mui/material\";\nimport { alpha, useTheme } from \"@mui/material/styles\";\nimport WidgetsRoundedIcon from \"@mui/icons-material/WidgetsRounded\";\nimport { PmEmptyRow, PmRef, PmSelect, PmTable, PmTableCard } from \"@pm/components/PmTable\";\nimport RefreshRoundedIcon from \"@mui/icons-material/RefreshRounded\";\nimport LockRoundedIcon from \"@mui/icons-material/LockRounded\";\nimport LockOpenRoundedIcon from \"@mui/icons-material/LockOpenRounded\";\nimport SearchRoundedIcon from \"@mui/icons-material/SearchRounded\";\nimport { showToast } from \"@/common/toaster/toaster\";\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 {\n listBatches,\n quarantineBatch,\n unquarantineBatch,\n} from \"@pm/services/pmApi\";\nimport { BATCH_STATUSES, QUARANTINE_REASONS, labelOf } from \"@pm/utils/constants\";\nimport { formatDate, isPastExpiry, statusColor } from \"@pm/utils/format\";\nimport { validateRequired } from \"@pm/utils/validation\";\n\n// Shared \"is this batch past its printed expiry?\" check. Used for both the\n// per-row pill and the \"Not yet expired\" filter so they can never disagree.\n// A batch whose expiryDate equals today is still valid — only the day AFTER\n// the printed expiry counts as expired (matches the unit packaging rule).\nfunction isBatchExpired(b) {\n if (!b) return false;\n if (b.status === 'EXPIRED') return true;\n return isPastExpiry(b.expiryDate);\n}\n\nexport default function InventoryPage() {\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.inventory');\n const [items, setItems] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(\"\");\n const [quarantineDialog, setQuarantineDialog] = useState({\n open: false,\n batch: null,\n reason: \"OTHER\",\n notes: \"\",\n });\n const theme = useTheme();\n const [search, setSearch] = useState('');\n const [statusFilter, setStatusFilter] = useState('ALL');\n // Filter chips. notYetExpired excludes anything past its printed expiry\n // (regardless of status). inStock keeps rows with qtyRemaining > 0.\n const [notYetExpired, setNotYetExpired] = useState(false);\n const [inStock, setInStock] = useState(false);\n\n async function load() {\n setLoading(true);\n setError(\"\");\n try {\n setItems(await listBatches());\n } catch (err) {\n const message =\n err?.response?.data?.message ??\n err?.message ??\n \"Failed to load inventory\";\n setError(message);\n showToast({ message, type: \"error\" });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.inventory', () => {\n void load();\n }, []);\n\n // Filters apply in-memory over whatever the list endpoint returned. Search\n // matches product name + lot (case-insensitive); chips + status narrow the\n // remaining set with AND semantics.\n const filteredItems = useMemo(() => {\n const q = search.trim().toLowerCase();\n return items.filter((b) => {\n if (q) {\n const hay = `${b.productName ?? ''} ${b.lotNumber ?? ''}`.toLowerCase();\n if (!hay.includes(q)) return false;\n }\n if (statusFilter !== 'ALL' && b.status !== statusFilter) return false;\n if (notYetExpired && isBatchExpired(b)) return false;\n if (inStock && !(Number(b.qtyRemaining ?? 0) > 0)) return false;\n return true;\n });\n }, [items, search, statusFilter, notYetExpired, inStock]);\n\n const hasFilter = search.trim() !== '' || statusFilter !== 'ALL' || notYetExpired || inStock;\n\n function clearFilters() {\n setSearch('');\n setStatusFilter('ALL');\n setNotYetExpired(false);\n setInStock(false);\n }\n\n async function doQuarantine() {\n try {\n await quarantineBatch({\n id: uuidv4(),\n batchId: quarantineDialog.batch.id,\n reason: quarantineDialog.reason,\n notes: quarantineDialog.notes || null,\n });\n showToast({ message: \"Batch quarantined.\", type: \"success\" });\n setQuarantineDialog({\n open: false,\n batch: null,\n reason: \"OTHER\",\n notes: \"\",\n });\n await load();\n } catch (err) {\n const message =\n err?.response?.data?.message ?? err?.message ?? \"Failed to quarantine\";\n showToast({ message, type: \"error\" });\n }\n }\n\n async function doUnquarantine(batch) {\n try {\n await unquarantineBatch({ id: uuidv4(), batchId: batch.id });\n showToast({ message: \"Quarantine lifted.\", type: \"success\" });\n await load();\n } catch (err) {\n const message =\n err?.response?.data?.message ??\n err?.message ??\n \"Failed to unquarantine\";\n showToast({ message, type: \"error\" });\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.inventory'}>\n <PmPageShell\n title=\"Inventory\"\n subtitle=\"Your stock batches. Click to see history or quarantine items if there's a problem.\"\n chips={[\"Stock\"]}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button\n variant=\"outlined\"\n startIcon={<RefreshRoundedIcon />}\n onClick={() => void load()}\n >\n Refresh\n </Button>\n </Stack>\n }\n >\n {error ? (\n <Alert severity=\"error\" sx={{ mb: 2 }}>\n {error}\n </Alert>\n ) : null}\n\n <PmTableCard\n eyebrow=\"Stock on hand\"\n title=\"Inventory batches\"\n subtitle={\n loading\n ? \"Loading…\"\n : hasFilter\n ? `${filteredItems.length} of ${items.length} ${items.length === 1 ? 'batch' : 'batches'} match`\n : `${items.length} ${items.length === 1 ? 'batch' : 'batches'} visible`\n }\n >\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} sx={{ mb: 2 }} alignItems={{ md: 'center' }}>\n <TextField\n size=\"small\"\n fullWidth\n placeholder=\"Search product or lot…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchRoundedIcon fontSize=\"small\" />\n </InputAdornment>\n ),\n }}\n sx={{ maxWidth: { md: 360 } }}\n />\n <FormControl size=\"small\" sx={{ minWidth: 160 }}>\n <InputLabel>Status</InputLabel>\n <Select\n label=\"Status\"\n value={statusFilter}\n onChange={(e) => {\n const next = e.target.value;\n setStatusFilter(next);\n // Picking a terminal status from the dropdown auto-clears the\n // opposing chip, so the filter pair can never resolve to an\n // empty set by construction.\n if (next === 'EXPIRED') setNotYetExpired(false);\n if (next === 'EXHAUSTED') setInStock(false);\n }}\n >\n <MenuItem value=\"ALL\">All statuses</MenuItem>\n {BATCH_STATUSES.map((s) => {\n const blocked = (s.value === 'EXPIRED' && notYetExpired) || (s.value === 'EXHAUSTED' && inStock);\n return (\n <MenuItem key={s.value} value={s.value} disabled={blocked}>\n {s.label}\n {blocked ? (\n <Typography component=\"span\" variant=\"caption\" color=\"text.disabled\" sx={{ ml: 1 }}>\n (clear chip first)\n </Typography>\n ) : null}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <Stack direction=\"row\" spacing={1} useFlexGap flexWrap=\"wrap\">\n <Chip\n label=\"Not yet expired\"\n size=\"small\"\n disabled={statusFilter === 'EXPIRED'}\n onClick={() => {\n // Auto-reset the conflicting dropdown value so the two\n // controls never produce an impossible combination.\n setNotYetExpired((prev) => {\n const next = !prev;\n if (next && statusFilter === 'EXPIRED') setStatusFilter('ALL');\n return next;\n });\n }}\n color={notYetExpired ? 'primary' : 'default'}\n variant={notYetExpired ? 'filled' : 'outlined'}\n sx={{ fontWeight: 700, borderRadius: 1.5 }}\n />\n <Chip\n label=\"Stock still left\"\n size=\"small\"\n disabled={statusFilter === 'EXHAUSTED'}\n onClick={() => {\n setInStock((prev) => {\n const next = !prev;\n if (next && statusFilter === 'EXHAUSTED') setStatusFilter('ALL');\n return next;\n });\n }}\n color={inStock ? 'primary' : 'default'}\n variant={inStock ? 'filled' : 'outlined'}\n sx={{ fontWeight: 700, borderRadius: 1.5 }}\n />\n </Stack>\n <Box sx={{ flexGrow: 1 }} />\n <Button variant=\"text\" onClick={clearFilters} disabled={!hasFilter}>Clear</Button>\n </Stack>\n\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Product</TableCell>\n <TableCell>Lot</TableCell>\n <TableCell>Owner</TableCell>\n <TableCell>Expiry</TableCell>\n <TableCell align=\"right\">Stock</TableCell>\n <TableCell>Storage</TableCell>\n <TableCell>Status</TableCell>\n <TableCell align=\"right\">Action</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 5 }).map((_, i) => (\n <TableRow key={i}>\n {Array.from({ length: 8 }).map((__, j) => (\n <TableCell key={j}>\n <Skeleton height={22} />\n </TableCell>\n ))}\n </TableRow>\n ))\n ) : filteredItems.length === 0 ? (\n <PmEmptyRow\n colSpan={8}\n icon={WidgetsRoundedIcon}\n title={hasFilter ? 'No batches match your filters' : 'No batches in stock'}\n hint={hasFilter\n ? 'Adjust your search or filters.'\n : 'Record a purchase to add stock.'}\n action={hasFilter ? (\n <Button variant=\"text\" size=\"small\" onClick={clearFilters}>Clear filters</Button>\n ) : null}\n />\n ) : (\n filteredItems.map((b) => {\n const isExpired = isBatchExpired(b);\n const remainingRatio =\n b.qtyPurchased > 0 ? b.qtyRemaining / b.qtyPurchased : 0;\n return (\n <TableRow key={b.id} hover>\n <TableCell>\n <Stack\n direction=\"row\"\n alignItems=\"baseline\"\n spacing={1}\n sx={{ minWidth: 0 }}\n >\n <Typography\n variant=\"body2\"\n sx={{ fontWeight: 700, lineHeight: 1.2 }}\n >\n {b.productName}\n </Typography>\n <PmRef id={b.serialId} />\n </Stack>\n </TableCell>\n <TableCell>\n {b.lotNumber ? (\n <Box\n component=\"span\"\n sx={{\n display: \"inline-flex\",\n px: 0.7,\n py: 0.1,\n borderRadius: 1,\n bgcolor: alpha(theme.palette.primary.main, 0.06),\n color: \"primary.dark\",\n fontFamily: \"monospace\",\n fontSize: \"0.72rem\",\n fontWeight: 700,\n }}\n >\n {b.lotNumber}\n </Box>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {b.ownerName || (b.ownerType === 'USER' ? 'Personal' : 'Facility')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {b.ownerType}\n </Typography>\n </TableCell>\n <TableCell>\n {b.expiryDate ? (\n <Tooltip\n title={isExpired ? \"Past printed expiry\" : \"\"}\n >\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 700,\n fontVariantNumeric: \"tabular-nums\",\n color: isExpired\n ? \"error.dark\"\n : \"text.primary\",\n }}\n >\n {formatDate(b.expiryDate)}\n </Typography>\n </Tooltip>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell align=\"right\" sx={{ minWidth: 150 }}>\n <Stack alignItems=\"flex-end\" spacing={0.5}>\n <Typography\n variant=\"body2\"\n sx={{\n fontWeight: 800,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n {b.qtyRemaining}\n <Typography\n component=\"span\"\n variant=\"caption\"\n color=\"text.secondary\"\n sx={{\n ml: 0.5,\n fontVariantNumeric: \"tabular-nums\",\n }}\n >\n / {b.qtyPurchased}\n </Typography>\n </Typography>\n <Box sx={{ width: 80 }}>\n <LinearProgress\n variant=\"determinate\"\n value={Math.min(\n 100,\n Math.max(0, remainingRatio * 100),\n )}\n sx={{ height: 4, borderRadius: 2 }}\n color={\n remainingRatio < 0.25 ? \"warning\" : \"primary\"\n }\n />\n </Box>\n </Stack>\n </TableCell>\n <TableCell>\n {b.storageUnitName ? (\n <Typography\n variant=\"caption\"\n sx={{ fontWeight: 700 }}\n >\n {b.storageUnitName}\n </Typography>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">\n —\n </Typography>\n )}\n </TableCell>\n <TableCell>\n <Stack\n direction=\"row\"\n spacing={0.5}\n flexWrap=\"wrap\"\n useFlexGap\n >\n <Chip\n size=\"small\"\n color={statusColor(b.status)}\n label={labelOf(BATCH_STATUSES, b.status)}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n {b.isQuarantined ? (\n <Chip\n size=\"small\"\n color=\"error\"\n label={labelOf(QUARANTINE_REASONS, b.quarantineReason) || \"Quarantined\"}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : null}\n {isExpired && b.status !== \"EXPIRED\" ? (\n <Chip\n size=\"small\"\n color=\"warning\"\n label=\"Expired\"\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : null}\n {b.sourceType ? (\n <Chip\n size=\"small\"\n variant=\"outlined\"\n color={\n b.sourceType === 'PICKUP' ? 'info'\n : b.sourceType === 'TRANSFER_IN' ? 'primary'\n : 'default'\n }\n label={b.sourceType === 'TRANSFER_IN' ? 'Transfer' : b.sourceType === 'PICKUP' ? 'Pickup' : b.sourceType === 'PURCHASE' ? 'Purchase' : b.sourceType}\n sx={{\n fontWeight: 700,\n borderRadius: 1.5,\n height: 22,\n }}\n />\n ) : null}\n </Stack>\n </TableCell>\n <TableCell align=\"right\">\n {!canWrite ? null : b.isQuarantined ? (\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"success\"\n startIcon={<LockOpenRoundedIcon />}\n onClick={() => void doUnquarantine(b)}\n >\n Unquarantine\n </Button>\n ) : isExpired ||\n b.status === \"EXHAUSTED\" ||\n b.status === \"IN_USE\" ? null : (\n <Button\n size=\"small\"\n variant=\"outlined\"\n color=\"error\"\n startIcon={<LockRoundedIcon />}\n onClick={() =>\n setQuarantineDialog({\n open: true,\n batch: b,\n reason: \"OTHER\",\n notes: \"\",\n })\n }\n >\n Quarantine\n </Button>\n )}\n </TableCell>\n </TableRow>\n );\n })\n )}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n\n <Dialog\n open={quarantineDialog.open}\n onClose={() =>\n setQuarantineDialog({ ...quarantineDialog, open: false })\n }\n fullWidth\n maxWidth=\"sm\"\n >\n <DialogTitle>Quarantine Batch</DialogTitle>\n <DialogContent dividers>\n <Stack spacing={2} sx={{ pt: 1 }}>\n <Typography variant=\"body2\">\n Product: <strong>{quarantineDialog.batch?.productName}</strong>\n <br />\n Lot: <strong>{quarantineDialog.batch?.lotNumber || \"—\"}</strong>\n <br />\n Remaining: <strong>{quarantineDialog.batch?.qtyRemaining}</strong>\n </Typography>\n <PmSelect\n label=\"Reason\"\n required\n value={quarantineDialog.reason}\n onChange={(v) =>\n setQuarantineDialog({ ...quarantineDialog, reason: v })\n }\n options={QUARANTINE_REASONS}\n error={!!validateRequired(quarantineDialog.reason, \"Reason\")}\n helperText={validateRequired(quarantineDialog.reason, \"Reason\") || \"\"}\n />\n <TextField\n label=\"Notes\"\n size=\"small\"\n multiline\n minRows={2}\n fullWidth\n value={quarantineDialog.notes}\n onChange={(e) =>\n setQuarantineDialog({\n ...quarantineDialog,\n notes: e.target.value,\n })\n }\n />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() =>\n setQuarantineDialog({ ...quarantineDialog, open: false })\n }\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"error\"\n disabled={!!validateRequired(quarantineDialog.reason, \"Reason\")}\n onClick={() => void doQuarantine()}\n >\n Quarantine\n </Button>\n </DialogActions>\n </Dialog>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAoDA,SAAS,EAAe,GAAG;CAGzB,OAFK,IACD,EAAE,WAAW,YAAkB,KAC5B,EAAa,EAAE,UAAU,IAFjB;AAGjB;AAEA,SAAwB,IAAgB;CAEtC,IAAM,IADQ,EACG,EAAM,IAAI,2CAA2C,GAChE,CAAC,GAAO,MAAY,EAAS,CAAC,CAAC,GAC/B,CAAC,GAAS,KAAc,EAAS,EAAK,GACtC,CAAC,GAAO,KAAY,EAAS,EAAE,GAC/B,CAAC,GAAkB,KAAuB,EAAS;EACvD,MAAM;EACN,OAAO;EACP,QAAQ;EACR,OAAO;CACT,CAAC,GACK,KAAQ,EAAS,GACjB,CAAC,GAAQ,KAAa,EAAS,EAAE,GACjC,CAAC,GAAc,KAAmB,EAAS,KAAK,GAGhD,CAAC,GAAe,KAAoB,EAAS,EAAK,GAClD,CAAC,GAAS,KAAc,EAAS,EAAK;CAE5C,eAAe,IAAO;EAEpB,AADA,EAAW,EAAI,GACf,EAAS,EAAE;EACX,IAAI;GACF,GAAS,MAAM,EAAY,CAAC;EAC9B,SAAS,GAAK;GACZ,IAAM,IACJ,GAAK,UAAU,MAAM,WACrB,GAAK,WACL;GAEF,AADA,EAAS,CAAO,GAChB,EAAU;IAAE;IAAS,MAAM;GAAQ,CAAC;EACtC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,GAAsB,iDAAiD;EACrE,EAAU;CACZ,GAAG,CAAC,CAAC;CAKL,IAAM,IAAgB,SAAc;EAClC,IAAM,IAAI,EAAO,KAAK,EAAE,YAAY;EACpC,OAAO,EAAM,QAAQ,MAOnB,EANI,KAEE,CADQ,GAAG,EAAE,eAAe,GAAG,GAAG,EAAE,aAAa,KAAK,YACrD,EAAI,SAAS,CAAC,KAEjB,MAAiB,SAAS,EAAE,WAAW,KACvC,KAAiB,EAAe,CAAC,KACjC,KAAW,EAAE,OAAO,EAAE,gBAAgB,CAAC,IAAI,GAEhD;CACH,GAAG;EAAC;EAAO;EAAQ;EAAc;EAAe;CAAO,CAAC,GAElD,IAAY,EAAO,KAAK,MAAM,MAAM,MAAiB,SAAS,KAAiB;CAErF,SAAS,IAAe;EAItB,AAHA,EAAU,EAAE,GACZ,EAAgB,KAAK,GACrB,EAAiB,EAAK,GACtB,EAAW,EAAK;CAClB;CAEA,eAAe,KAAe;EAC5B,IAAI;GAcF,AAbA,MAAM,EAAgB;IACpB,IAAI,EAAO;IACX,SAAS,EAAiB,MAAM;IAChC,QAAQ,EAAiB;IACzB,OAAO,EAAiB,SAAS;GACnC,CAAC,GACD,EAAU;IAAE,SAAS;IAAsB,MAAM;GAAU,CAAC,GAC5D,EAAoB;IAClB,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;GACT,CAAC,GACD,MAAM,EAAK;EACb,SAAS,GAAK;GAGZ,EAAU;IAAE,SADV,GAAK,UAAU,MAAM,WAAW,GAAK,WAAW;IAC7B,MAAM;GAAQ,CAAC;EACtC;CACF;CAEA,eAAe,GAAe,GAAO;EACnC,IAAI;GAGF,AAFA,MAAM,GAAkB;IAAE,IAAI,EAAO;IAAG,SAAS,EAAM;GAAG,CAAC,GAC3D,EAAU;IAAE,SAAS;IAAsB,MAAM;GAAU,CAAC,GAC5D,MAAM,EAAK;EACb,SAAS,GAAK;GAKZ,EAAU;IAAE,SAHV,GAAK,UAAU,MAAM,WACrB,GAAK,WACL;IACmB,MAAM;GAAQ,CAAC;EACtC;CACF;CAEA,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,IAAD,CAAQ,CAAA,GACR,kBAAC,GAAD;EAAS,MAAM;YAAf,CACE,kBAAC,IAAD;GACE,OAAM;GACN,UAAS;GACT,OAAO,CAAC,OAAO;GACf,SACE,kBAAC,GAAD;IAAO,WAAU;IAAM,SAAS;cAC9B,kBAAC,GAAD;KACE,SAAQ;KACR,WAAW,kBAAC,GAAD,CAAqB,CAAA;KAChC,eAAe,KAAK,EAAK;eAC1B;IAEO,CAAA;GACH,CAAA;aAbX,CAgBG,IACC,kBAAC,GAAD;IAAO,UAAS;IAAQ,IAAI,EAAE,IAAI,EAAE;cACjC;GACI,CAAA,IACL,MAEJ,kBAAC,GAAD;IACE,SAAQ;IACR,OAAM;IACN,UACE,IACI,aACA,IACE,GAAG,EAAc,OAAO,MAAM,EAAM,OAAO,GAAG,EAAM,WAAW,IAAI,UAAU,UAAU,UACvF,GAAG,EAAM,OAAO,GAAG,EAAM,WAAW,IAAI,UAAU,UAAU;cARtE,CAWE,kBAAC,GAAD;KAAO,WAAW;MAAE,IAAI;MAAU,IAAI;KAAM;KAAG,SAAS;KAAK,IAAI,EAAE,IAAI,EAAE;KAAG,YAAY,EAAE,IAAI,SAAS;eAAvG;MACE,kBAAC,GAAD;OACE,MAAK;OACL,WAAA;OACA,aAAY;OACZ,OAAO;OACP,WAAW,MAAM,EAAU,EAAE,OAAO,KAAK;OACzC,YAAY,EACV,gBACE,kBAAC,IAAD;QAAgB,UAAS;kBACvB,kBAAC,IAAD,EAAmB,UAAS,QAAS,CAAA;OACvB,CAAA,EAEpB;OACA,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,EAAE;MAC7B,CAAA;MACD,kBAAC,IAAD;OAAa,MAAK;OAAQ,IAAI,EAAE,UAAU,IAAI;iBAA9C,CACE,kBAAC,IAAD,EAAA,UAAY,SAAkB,CAAA,GAC9B,kBAAC,IAAD;QACE,OAAM;QACN,OAAO;QACP,WAAW,MAAM;SACf,IAAM,IAAO,EAAE,OAAO;SAMtB,AALA,EAAgB,CAAI,GAIhB,MAAS,aAAW,EAAiB,EAAK,GAC1C,MAAS,eAAa,EAAW,EAAK;QAC5C;kBAXF,CAaE,kBAAC,GAAD;SAAU,OAAM;mBAAM;QAAsB,CAAA,GAC3C,EAAe,KAAK,MAAM;SACzB,IAAM,IAAW,EAAE,UAAU,aAAa,KAAmB,EAAE,UAAU,eAAe;SACxF,OACE,kBAAC,GAAD;UAAwB,OAAO,EAAE;UAAO,UAAU;oBAAlD,CACG,EAAE,OACF,IACC,kBAAC,GAAD;WAAY,WAAU;WAAO,SAAQ;WAAU,OAAM;WAAgB,IAAI,EAAE,IAAI,EAAE;qBAAG;UAExE,CAAA,IACV,IACI;YAPK,EAAE,KAOP;QAEd,CAAC,CACK;SACG;;MACb,kBAAC,GAAD;OAAO,WAAU;OAAM,SAAS;OAAG,YAAA;OAAW,UAAS;iBAAvD,CACE,kBAAC,GAAD;QACE,OAAM;QACN,MAAK;QACL,UAAU,MAAiB;QAC3B,eAAe;SAGb,GAAkB,MAAS;UACzB,IAAM,IAAO,CAAC;UAEd,OADI,KAAQ,MAAiB,aAAW,EAAgB,KAAK,GACtD;SACT,CAAC;QACH;QACA,OAAO,IAAgB,YAAY;QACnC,SAAS,IAAgB,WAAW;QACpC,IAAI;SAAE,YAAY;SAAK,cAAc;QAAI;OAC1C,CAAA,GACD,kBAAC,GAAD;QACE,OAAM;QACN,MAAK;QACL,UAAU,MAAiB;QAC3B,eAAe;SACb,GAAY,MAAS;UACnB,IAAM,IAAO,CAAC;UAEd,OADI,KAAQ,MAAiB,eAAa,EAAgB,KAAK,GACxD;SACT,CAAC;QACH;QACA,OAAO,IAAU,YAAY;QAC7B,SAAS,IAAU,WAAW;QAC9B,IAAI;SAAE,YAAY;SAAK,cAAc;QAAI;OAC1C,CAAA,CACI;;MACP,kBAAC,GAAD,EAAK,IAAI,EAAE,UAAU,EAAE,EAAI,CAAA;MAC3B,kBAAC,GAAD;OAAQ,SAAQ;OAAO,SAAS;OAAc,UAAU,CAAC;iBAAW;MAAa,CAAA;KAC5E;QAEP,kBAAC,IAAD;KAAS,OAAA;eAAT,CACE,kBAAC,IAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD,EAAA,UAAW,UAAkB,CAAA;MAC7B,kBAAC,GAAD,EAAA,UAAW,MAAc,CAAA;MACzB,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;MAC3B,kBAAC,GAAD,EAAA,UAAW,SAAiB,CAAA;MAC5B,kBAAC,GAAD;OAAW,OAAM;iBAAQ;MAAgB,CAAA;MACzC,kBAAC,GAAD,EAAA,UAAW,UAAkB,CAAA;MAC7B,kBAAC,GAAD,EAAA,UAAW,SAAiB,CAAA;MAC5B,kBAAC,GAAD;OAAW,OAAM;iBAAQ;MAAiB,CAAA;KAClC,EAAA,CAAA,EACD,CAAA,GACX,kBAAC,IAAD,EAAA,UACG,IACC,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MAChC,kBAAC,GAAD,EAAA,UACG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAI,MAClC,kBAAC,GAAD,EAAA,UACE,kBAAC,IAAD,EAAU,QAAQ,GAAK,CAAA,EACd,GAFK,CAEL,CACZ,EACO,GANK,CAML,CACX,IACC,EAAc,WAAW,IAC3B,kBAAC,IAAD;MACE,SAAS;MACT,MAAM;MACN,OAAO,IAAY,kCAAkC;MACrD,MAAM,IACF,mCACA;MACJ,QAAQ,IACN,kBAAC,GAAD;OAAQ,SAAQ;OAAO,MAAK;OAAQ,SAAS;iBAAc;MAAqB,CAAA,IAC9E;KACL,CAAA,IAED,EAAc,KAAK,MAAM;MACvB,IAAM,IAAY,EAAe,CAAC,GAC5B,IACJ,EAAE,eAAe,IAAI,EAAE,eAAe,EAAE,eAAe;MACzD,OACE,kBAAC,GAAD;OAAqB,OAAA;iBAArB;QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;SACE,WAAU;SACV,YAAW;SACX,SAAS;SACT,IAAI,EAAE,UAAU,EAAE;mBAJpB,CAME,kBAAC,GAAD;UACE,SAAQ;UACR,IAAI;WAAE,YAAY;WAAK,YAAY;UAAI;oBAEtC,EAAE;SACO,CAAA,GACZ,kBAAC,IAAD,EAAO,IAAI,EAAE,SAAW,CAAA,CACnB;WACE,CAAA;QACX,kBAAC,GAAD,EAAA,UACG,EAAE,YACD,kBAAC,GAAD;SACE,WAAU;SACV,IAAI;UACF,SAAS;UACT,IAAI;UACJ,IAAI;UACJ,cAAc;UACd,SAAS,EAAM,GAAM,QAAQ,QAAQ,MAAM,GAAI;UAC/C,OAAO;UACP,YAAY;UACZ,UAAU;UACV,YAAY;SACd;mBAEC,EAAE;QACA,CAAA,IAEL,kBAAC,GAAD;SAAY,SAAQ;SAAU,OAAM;mBAAgB;QAExC,CAAA,EAEL,CAAA;QACX,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;SAAQ,IAAI,EAAE,YAAY,IAAI;mBAC/C,EAAE,cAAc,EAAE,cAAc,SAAS,aAAa;QAC7C,CAAA,GACZ,kBAAC,GAAD;SAAY,SAAQ;SAAU,OAAM;mBACjC,EAAE;QACO,CAAA,CACH,EAAA,CAAA;QACX,kBAAC,GAAD,EAAA,UACG,EAAE,aACD,kBAAC,GAAD;SACE,OAAO,IAAY,wBAAwB;mBAE3C,kBAAC,GAAD;UACE,SAAQ;UACR,IAAI;WACF,YAAY;WACZ,oBAAoB;WACpB,OAAO,IACH,eACA;UACN;oBAEC,GAAW,EAAE,UAAU;SACd,CAAA;QACL,CAAA,IAET,kBAAC,GAAD;SAAY,SAAQ;SAAU,OAAM;mBAAgB;QAExC,CAAA,EAEL,CAAA;QACX,kBAAC,GAAD;SAAW,OAAM;SAAQ,IAAI,EAAE,UAAU,IAAI;mBAC3C,kBAAC,GAAD;UAAO,YAAW;UAAW,SAAS;oBAAtC,CACE,kBAAC,GAAD;WACE,SAAQ;WACR,IAAI;YACF,YAAY;YACZ,oBAAoB;WACtB;qBALF,CAOG,EAAE,cACH,kBAAC,GAAD;YACE,WAAU;YACV,SAAQ;YACR,OAAM;YACN,IAAI;aACF,IAAI;aACJ,oBAAoB;YACtB;sBAPF,CAQC,MACI,EAAE,YACK;aACF;cACZ,kBAAC,GAAD;WAAK,IAAI,EAAE,OAAO,GAAG;qBACnB,kBAAC,IAAD;YACE,SAAQ;YACR,OAAO,KAAK,IACV,KACA,KAAK,IAAI,GAAG,IAAiB,GAAG,CAClC;YACA,IAAI;aAAE,QAAQ;aAAG,cAAc;YAAE;YACjC,OACE,IAAiB,MAAO,YAAY;WAEvC,CAAA;UACE,CAAA,CACA;;QACE,CAAA;QACX,kBAAC,GAAD,EAAA,UACG,EAAE,kBACD,kBAAC,GAAD;SACE,SAAQ;SACR,IAAI,EAAE,YAAY,IAAI;mBAErB,EAAE;QACO,CAAA,IAEZ,kBAAC,GAAD;SAAY,SAAQ;SAAU,OAAM;mBAAgB;QAExC,CAAA,EAEL,CAAA;QACX,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;SACE,WAAU;SACV,SAAS;SACT,UAAS;SACT,YAAA;mBAJF;UAME,kBAAC,GAAD;WACE,MAAK;WACL,OAAO,EAAY,EAAE,MAAM;WAC3B,OAAO,EAAQ,GAAgB,EAAE,MAAM;WACvC,IAAI;YACF,YAAY;YACZ,cAAc;YACd,QAAQ;WACV;UACD,CAAA;UACA,EAAE,gBACD,kBAAC,GAAD;WACE,MAAK;WACL,OAAM;WACN,OAAO,EAAQ,GAAoB,EAAE,gBAAgB,KAAK;WAC1D,IAAI;YACF,YAAY;YACZ,cAAc;YACd,QAAQ;WACV;UACD,CAAA,IACC;UACH,KAAa,EAAE,WAAW,YACzB,kBAAC,GAAD;WACE,MAAK;WACL,OAAM;WACN,OAAM;WACN,IAAI;YACF,YAAY;YACZ,cAAc;YACd,QAAQ;WACV;UACD,CAAA,IACC;UACH,EAAE,aACD,kBAAC,GAAD;WACE,MAAK;WACL,SAAQ;WACR,OACE,EAAE,eAAe,WAAW,SACxB,EAAE,eAAe,gBAAgB,YAC/B;WAER,OAAO,EAAE,eAAe,gBAAgB,aAAa,EAAE,eAAe,WAAW,WAAW,EAAE,eAAe,aAAa,aAAa,EAAE;WACzI,IAAI;YACF,YAAY;YACZ,cAAc;YACd,QAAQ;WACV;UACD,CAAA,IACC;SACC;WACE,CAAA;QACX,kBAAC,GAAD;SAAW,OAAM;mBACb,IAAkB,EAAE,gBACpB,kBAAC,GAAD;UACE,MAAK;UACL,SAAQ;UACR,OAAM;UACN,WAAW,kBAAC,GAAD,CAAsB,CAAA;UACjC,eAAe,KAAK,GAAe,CAAC;oBACrC;SAEO,CAAA,IACN,KACF,EAAE,WAAW,eACb,EAAE,WAAW,WAAW,OACxB,kBAAC,GAAD;UACE,MAAK;UACL,SAAQ;UACR,OAAM;UACN,WAAW,kBAAC,GAAD,CAAkB,CAAA;UAC7B,eACE,EAAoB;WAClB,MAAM;WACN,OAAO;WACP,QAAQ;WACR,OAAO;UACT,CAAC;oBAEJ;SAEO,CAAA,IA5BG;QA8BJ,CAAA;OACH;SAxNK,EAAE,EAwNP;KAEd,CAAC,EAEM,CAAA,CACJ;MACE;KACF;MAEb,kBAAC,IAAD;GACE,MAAM,EAAiB;GACvB,eACE,EAAoB;IAAE,GAAG;IAAkB,MAAM;GAAM,CAAC;GAE1D,WAAA;GACA,UAAS;aANX;IAQE,kBAAC,IAAD,EAAA,UAAa,mBAA6B,CAAA;IAC1C,kBAAC,IAAD;KAAe,UAAA;eACb,kBAAC,GAAD;MAAO,SAAS;MAAG,IAAI,EAAE,IAAI,EAAE;gBAA/B;OACE,kBAAC,GAAD;QAAY,SAAQ;kBAApB;SAA4B;SACjB,kBAAC,UAAD,EAAA,UAAS,EAAiB,OAAO,YAAoB,CAAA;SAC9D,kBAAC,MAAD,CAAK,CAAA;SAAC;SACD,kBAAC,UAAD,EAAA,UAAS,EAAiB,OAAO,aAAa,IAAY,CAAA;SAC/D,kBAAC,MAAD,CAAK,CAAA;SAAC;SACK,kBAAC,UAAD,EAAA,UAAS,EAAiB,OAAO,aAAqB,CAAA;QACvD;;OACZ,kBAAC,GAAD;QACE,OAAM;QACN,UAAA;QACA,OAAO,EAAiB;QACxB,WAAW,MACT,EAAoB;SAAE,GAAG;SAAkB,QAAQ;QAAE,CAAC;QAExD,SAAS;QACT,OAAO,CAAC,CAAC,EAAiB,EAAiB,QAAQ,QAAQ;QAC3D,YAAY,EAAiB,EAAiB,QAAQ,QAAQ,KAAK;OACpE,CAAA;OACD,kBAAC,GAAD;QACE,OAAM;QACN,MAAK;QACL,WAAA;QACA,SAAS;QACT,WAAA;QACA,OAAO,EAAiB;QACxB,WAAW,MACT,EAAoB;SAClB,GAAG;SACH,OAAO,EAAE,OAAO;QAClB,CAAC;OAEJ,CAAA;MACI;;IACM,CAAA;IACf,kBAAC,IAAD,EAAA,UAAA,CACE,kBAAC,GAAD;KACE,eACE,EAAoB;MAAE,GAAG;MAAkB,MAAM;KAAM,CAAC;eAE3D;IAEO,CAAA,GACR,kBAAC,GAAD;KACE,SAAQ;KACR,OAAM;KACN,UAAU,CAAC,CAAC,EAAiB,EAAiB,QAAQ,QAAQ;KAC9D,eAAe,KAAK,GAAa;eAClC;IAEO,CAAA,CACK,EAAA,CAAA;GACT;IACD;GACN,EAAA,CAAA;AAET"}
|