@argusoft/medplat-product-management 1.0.0 → 1.0.2
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 +385 -0
- package/dist/BrandsPage-CSA3meke.js.map +1 -0
- package/dist/CategoriesPage-BrspzkJL.js +340 -0
- package/dist/CategoriesPage-BrspzkJL.js.map +1 -0
- package/dist/{DashboardPage-BNKUQj46.js → DashboardPage-CqaquOs2.js} +21 -22
- package/dist/{DashboardPage-BNKUQj46.js.map → DashboardPage-CqaquOs2.js.map} +1 -1
- package/dist/{FacilityPicker-Coi8I3yE.js → FacilityPicker-Dv_H95WW.js} +13 -13
- package/dist/{FacilityPicker-Coi8I3yE.js.map → FacilityPicker-Dv_H95WW.js.map} +1 -1
- package/dist/{InventoryPage-BR6jOzg2.js → InventoryPage-CPbzfDMR.js} +12 -12
- package/dist/{InventoryPage-BR6jOzg2.js.map → InventoryPage-CPbzfDMR.js.map} +1 -1
- package/dist/{MemberProfileCard-DbHZCS5n.js → MemberProfileCard-0vjO3Gzd.js} +2 -2
- package/dist/{MemberProfileCard-DbHZCS5n.js.map → MemberProfileCard-0vjO3Gzd.js.map} +1 -1
- package/dist/{PaymentCreatePage-Ci3ERnby.js → PaymentCreatePage-BYmDZAIB.js} +9 -10
- package/dist/{PaymentCreatePage-Ci3ERnby.js.map → PaymentCreatePage-BYmDZAIB.js.map} +1 -1
- package/dist/{PaymentsPage-sdg902zX.js → PaymentsPage-BXPvKon-.js} +16 -16
- package/dist/{PaymentsPage-sdg902zX.js.map → PaymentsPage-BXPvKon-.js.map} +1 -1
- package/dist/PickupCreatePage-CMGwoAXj.js +426 -0
- package/dist/PickupCreatePage-CMGwoAXj.js.map +1 -0
- package/dist/{PickupsPage-Ci2Ll0Kn.js → PickupsPage-D66_Wta4.js} +84 -39
- package/dist/PickupsPage-D66_Wta4.js.map +1 -0
- package/dist/PmTable-B9970kPY.js +375 -0
- package/dist/PmTable-B9970kPY.js.map +1 -0
- package/dist/{ProductEditPage-DL8gy85Y.js → ProductEditPage-B8qFTCW9.js} +226 -243
- package/dist/ProductEditPage-B8qFTCW9.js.map +1 -0
- package/dist/ProductsPage-C7_r9cKn.js +254 -0
- package/dist/ProductsPage-C7_r9cKn.js.map +1 -0
- package/dist/{PurchaseCreatePage-C3KMfBxJ.js → PurchaseCreatePage-CDfNDcKG.js} +150 -149
- package/dist/PurchaseCreatePage-CDfNDcKG.js.map +1 -0
- package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js → PurchaseRequestDetailPage-C7aAwEqw.js} +15 -15
- package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js.map → PurchaseRequestDetailPage-C7aAwEqw.js.map} +1 -1
- package/dist/{PurchaseRequestsPage-DvFH_tWe.js → PurchaseRequestsPage-BwCkbpaX.js} +14 -14
- package/dist/{PurchaseRequestsPage-DvFH_tWe.js.map → PurchaseRequestsPage-BwCkbpaX.js.map} +1 -1
- package/dist/{PurchasesPage-BCvLvSp4.js → PurchasesPage-CvaZouVy.js} +11 -12
- package/dist/{PurchasesPage-BCvLvSp4.js.map → PurchasesPage-CvaZouVy.js.map} +1 -1
- package/dist/{SaleCreatePage-DpkQMoTq.js → SaleCreatePage-DP1Qmltu.js} +30 -31
- package/dist/{SaleCreatePage-DpkQMoTq.js.map → SaleCreatePage-DP1Qmltu.js.map} +1 -1
- package/dist/{SalesPage-DUwgkEO-.js → SalesPage-CO3cdYX5.js} +18 -19
- package/dist/{SalesPage-DUwgkEO-.js.map → SalesPage-CO3cdYX5.js.map} +1 -1
- package/dist/{SettingsPage-CusC0jqJ.js → SettingsPage-DvVRwSFw.js} +104 -103
- package/dist/SettingsPage-DvVRwSFw.js.map +1 -0
- package/dist/StorageUnitsPage-B9Hr_RkW.js +470 -0
- package/dist/StorageUnitsPage-B9Hr_RkW.js.map +1 -0
- package/dist/{TransactionsPage-DDaK4VyY.js → TransactionsPage-HKIGwEZN.js} +127 -123
- package/dist/TransactionsPage-HKIGwEZN.js.map +1 -0
- package/dist/{TransferCreatePage-BxudLfhS.js → TransferCreatePage-DMuZqQ3c.js} +9 -9
- package/dist/{TransferCreatePage-BxudLfhS.js.map → TransferCreatePage-DMuZqQ3c.js.map} +1 -1
- package/dist/{TransfersPage-zgmt7teZ.js → TransfersPage-COIyouL4.js} +16 -16
- package/dist/{TransfersPage-zgmt7teZ.js.map → TransfersPage-COIyouL4.js.map} +1 -1
- package/dist/{VialsPage-CjqPfgpV.js → VialsPage-BNPUwGCU.js} +291 -224
- package/dist/VialsPage-BNPUwGCU.js.map +1 -0
- package/dist/{constants-BrA_hfAI.js → constants-5ZCZo-Zm.js} +5 -2
- package/dist/{constants-BrA_hfAI.js.map → constants-5ZCZo-Zm.js.map} +1 -1
- package/dist/{PmGuard-CjJBisaN.js → currency-ClRLIEg2.js} +186 -9
- package/dist/currency-ClRLIEg2.js.map +1 -0
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/BrandsPage-DCMCVvDY.js +0 -334
- package/dist/BrandsPage-DCMCVvDY.js.map +0 -1
- package/dist/CategoriesPage-BpRhwfrc.js +0 -284
- package/dist/CategoriesPage-BpRhwfrc.js.map +0 -1
- package/dist/PickupCreatePage-CieMsgWV.js +0 -310
- package/dist/PickupCreatePage-CieMsgWV.js.map +0 -1
- package/dist/PickupsPage-Ci2Ll0Kn.js.map +0 -1
- package/dist/PmGuard-CjJBisaN.js.map +0 -1
- package/dist/PmTable-BuXZQZCU.js +0 -302
- package/dist/PmTable-BuXZQZCU.js.map +0 -1
- package/dist/ProductEditPage-DL8gy85Y.js.map +0 -1
- package/dist/ProductsPage-BANTKxLb.js +0 -221
- package/dist/ProductsPage-BANTKxLb.js.map +0 -1
- package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +0 -1
- package/dist/SettingsPage-CusC0jqJ.js.map +0 -1
- package/dist/StorageUnitsPage-BlC2AgrJ.js +0 -469
- package/dist/StorageUnitsPage-BlC2AgrJ.js.map +0 -1
- package/dist/TransactionsPage-DDaK4VyY.js.map +0 -1
- package/dist/VialsPage-CjqPfgpV.js.map +0 -1
- package/dist/currency-BDDCDgeE.js +0 -169
- package/dist/currency-BDDCDgeE.js.map +0 -1
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { a as
|
|
3
|
-
import { n
|
|
4
|
-
import { f as de, p as fe, r as pe } from "./constants-
|
|
1
|
+
import { U as e, a as t, i as ee, n as te, nt as ne, o as re, r as ie, tt as ae } from "./currency-ClRLIEg2.js";
|
|
2
|
+
import { a as oe, c as se, s as ce, t as le } from "./PmTable-B9970kPY.js";
|
|
3
|
+
import { n, t as ue } from "./format-UOyOu75i.js";
|
|
4
|
+
import { f as de, p as fe, r as pe } from "./constants-5ZCZo-Zm.js";
|
|
5
5
|
import { useMemo as me, useState as r } from "react";
|
|
6
6
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
7
7
|
import { v4 as he } from "uuid";
|
|
8
|
-
import { Alert as o, Box as s, Button as c, Chip as
|
|
8
|
+
import { Alert as o, Box as s, Button as c, Chip as l, Dialog as u, DialogActions as d, DialogContent as f, DialogTitle as ge, FormControl as _e, FormHelperText as ve, InputAdornment as ye, InputLabel as be, MenuItem as p, Select as xe, Skeleton as Se, Stack as m, TableBody as Ce, TableCell as h, TableHead as we, TableRow as g, TextField as _, Typography as v } from "@mui/material";
|
|
9
9
|
import y from "@mui/icons-material/AddRounded";
|
|
10
10
|
import Te from "@mui/icons-material/RefreshRounded";
|
|
11
11
|
import { showToast as b } from "@/common/toaster/toaster";
|
|
@@ -24,7 +24,7 @@ function Ae(e) {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
function S() {
|
|
27
|
-
let S = Ee(), C =
|
|
27
|
+
let S = Ee(), C = t().has("update.manage.productManagement.pickup"), [w, je] = r([]), [T, E] = r(!0), [D, O] = r(""), [k, Me] = r(""), [A, j] = r({
|
|
28
28
|
open: !1,
|
|
29
29
|
pickup: null
|
|
30
30
|
}), [M, N] = r({
|
|
@@ -52,12 +52,12 @@ function S() {
|
|
|
52
52
|
E(!1);
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
ee("view.manage.productManagement.pickup", () => {
|
|
56
56
|
B();
|
|
57
57
|
}, []);
|
|
58
58
|
let V = me(() => {
|
|
59
59
|
let e = k.trim().toLowerCase();
|
|
60
|
-
return e ? w.filter((t) => `${t.productName ?? ""} ${t.facilityName ?? ""} ${t.userName ?? ""} ${t.lotNumber ?? ""} ${t.notes ?? ""}`.toLowerCase().includes(e)) : w;
|
|
60
|
+
return e ? w.filter((t) => `${t.sessionName ?? ""} ${t.sessionSite ?? ""} ${t.productName ?? ""} ${t.facilityName ?? ""} ${t.userName ?? ""} ${t.lotNumber ?? ""} ${t.notes ?? ""}`.toLowerCase().includes(e)) : w;
|
|
61
61
|
}, [w, k]);
|
|
62
62
|
function Ne(e) {
|
|
63
63
|
let t = e.expectedRemainingQty ?? 0;
|
|
@@ -91,17 +91,17 @@ function S() {
|
|
|
91
91
|
pickup: null
|
|
92
92
|
});
|
|
93
93
|
}
|
|
94
|
-
let W = Number(I.additionalQty),
|
|
95
|
-
async function
|
|
96
|
-
if (!(
|
|
94
|
+
let W = P.pickup?.sourceBatchQtyRemaining ?? null, G = Number(I.additionalQty), K = !Number.isInteger(G) || G <= 0 ? "Enter a whole number greater than 0." : W != null && G > W ? `Only ${W} available at the source facility.` : "";
|
|
95
|
+
async function Fe() {
|
|
96
|
+
if (!(K || !P.pickup)) {
|
|
97
97
|
z(!0);
|
|
98
98
|
try {
|
|
99
|
-
await
|
|
99
|
+
await ne(P.pickup.id, {
|
|
100
100
|
id: he(),
|
|
101
|
-
additionalQty:
|
|
101
|
+
additionalQty: G,
|
|
102
102
|
notes: I.notes || null
|
|
103
103
|
}), b({
|
|
104
|
-
message: `Topped up ${
|
|
104
|
+
message: `Topped up ${G} unit${G === 1 ? "" : "s"}.`,
|
|
105
105
|
type: "success"
|
|
106
106
|
}), U(), await B();
|
|
107
107
|
} catch (e) {
|
|
@@ -115,11 +115,11 @@ function S() {
|
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
117
|
let q = A.pickup?.expectedRemainingQty ?? 0, J = Number(M.returnedQty), Y = Number.isFinite(J) && J >= 0 && J <= q ? q - J : null, X = !Number.isInteger(J) || J < 0 ? "Enter a whole number from 0 to the expected remaining." : J > q ? `At most ${q} can be returned.` : "", Z = Y != null && Y > 0 || (A.pickup?.openVials ?? []).length > 0, Q = Z && !M.wastageReason ? "A reason is required for the wastage being recorded." : "", $ = !X && !Q;
|
|
118
|
-
async function
|
|
118
|
+
async function Ie() {
|
|
119
119
|
if (!(!$ || !A.pickup)) {
|
|
120
120
|
z(!0);
|
|
121
121
|
try {
|
|
122
|
-
await
|
|
122
|
+
await ae(A.pickup.id, {
|
|
123
123
|
returnedQty: J,
|
|
124
124
|
wastageReason: Z ? M.wastageReason : null,
|
|
125
125
|
notes: M.notes || null
|
|
@@ -138,10 +138,10 @@ function S() {
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
return /* @__PURE__ */ a(s, { children: [
|
|
141
|
-
/* @__PURE__ */ i(
|
|
142
|
-
/* @__PURE__ */ i(
|
|
141
|
+
/* @__PURE__ */ i(ie, {}),
|
|
142
|
+
/* @__PURE__ */ i(te, {
|
|
143
143
|
perm: "view.manage.productManagement.pickup",
|
|
144
|
-
children: /* @__PURE__ */ a(
|
|
144
|
+
children: /* @__PURE__ */ a(re, {
|
|
145
145
|
title: "Stock Pickups",
|
|
146
146
|
subtitle: "Stock you're carrying for field work. Record returns and any items lost or used.",
|
|
147
147
|
actions: /* @__PURE__ */ a(m, {
|
|
@@ -185,10 +185,11 @@ function S() {
|
|
|
185
185
|
children: /* @__PURE__ */ i(Oe, { fontSize: "small" })
|
|
186
186
|
}) }
|
|
187
187
|
})
|
|
188
|
-
}), /* @__PURE__ */ a(
|
|
188
|
+
}), /* @__PURE__ */ a(ce, {
|
|
189
189
|
dense: !0,
|
|
190
190
|
children: [/* @__PURE__ */ i(we, { children: /* @__PURE__ */ a(g, { children: [
|
|
191
191
|
/* @__PURE__ */ i(h, { children: "Ref" }),
|
|
192
|
+
/* @__PURE__ */ i(h, { children: "Session" }),
|
|
192
193
|
/* @__PURE__ */ i(h, { children: "Product" }),
|
|
193
194
|
/* @__PURE__ */ i(h, { children: "Facility" }),
|
|
194
195
|
/* @__PURE__ */ i(h, { children: "User" }),
|
|
@@ -202,8 +203,8 @@ function S() {
|
|
|
202
203
|
align: "right",
|
|
203
204
|
children: "Action"
|
|
204
205
|
})
|
|
205
|
-
] }) }), /* @__PURE__ */ i(Ce, { children: T ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ i(g, { children: Array.from({ length:
|
|
206
|
-
colSpan:
|
|
206
|
+
] }) }), /* @__PURE__ */ i(Ce, { children: T ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ i(g, { children: Array.from({ length: 9 }).map((e, t) => /* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(Se, { height: 22 }) }, t)) }, t)) : V.length === 0 ? /* @__PURE__ */ i(le, {
|
|
207
|
+
colSpan: 9,
|
|
207
208
|
icon: De,
|
|
208
209
|
title: k.trim() === "" ? "No pickups yet" : "No pickups match your search",
|
|
209
210
|
hint: "Check out stock from a facility to use in the field.",
|
|
@@ -218,6 +219,37 @@ function S() {
|
|
|
218
219
|
hover: !0,
|
|
219
220
|
children: [
|
|
220
221
|
/* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(oe, { id: e.serialId }) }),
|
|
222
|
+
/* @__PURE__ */ a(h, {
|
|
223
|
+
sx: { maxWidth: 220 },
|
|
224
|
+
children: [
|
|
225
|
+
/* @__PURE__ */ i(v, {
|
|
226
|
+
variant: "body2",
|
|
227
|
+
sx: {
|
|
228
|
+
fontWeight: 700,
|
|
229
|
+
wordBreak: "break-word"
|
|
230
|
+
},
|
|
231
|
+
children: e.sessionName ?? "—"
|
|
232
|
+
}),
|
|
233
|
+
e.sessionSite ? /* @__PURE__ */ i(v, {
|
|
234
|
+
variant: "caption",
|
|
235
|
+
color: "text.secondary",
|
|
236
|
+
sx: {
|
|
237
|
+
display: "block",
|
|
238
|
+
wordBreak: "break-word"
|
|
239
|
+
},
|
|
240
|
+
children: e.sessionSite
|
|
241
|
+
}) : null,
|
|
242
|
+
e.sessionStartTime ? /* @__PURE__ */ a(v, {
|
|
243
|
+
variant: "caption",
|
|
244
|
+
color: "text.secondary",
|
|
245
|
+
sx: {
|
|
246
|
+
display: "block",
|
|
247
|
+
fontVariantNumeric: "tabular-nums"
|
|
248
|
+
},
|
|
249
|
+
children: [n(e.sessionStartTime), e.sessionExpectedEndTime ? ` → ${n(e.sessionExpectedEndTime)}` : ""]
|
|
250
|
+
}) : null
|
|
251
|
+
]
|
|
252
|
+
}),
|
|
221
253
|
/* @__PURE__ */ a(h, { children: [/* @__PURE__ */ i(v, {
|
|
222
254
|
variant: "body2",
|
|
223
255
|
sx: { fontWeight: 700 },
|
|
@@ -258,7 +290,11 @@ function S() {
|
|
|
258
290
|
variant: "body2",
|
|
259
291
|
children: ue(e.pickedOn)
|
|
260
292
|
}) }),
|
|
261
|
-
/* @__PURE__ */ i(h, { children: /* @__PURE__ */ i(
|
|
293
|
+
/* @__PURE__ */ i(h, { children: e.status === "OPEN" && e.sessionExpectedEndTime && new Date(e.sessionExpectedEndTime).getTime() < Date.now() ? /* @__PURE__ */ i(l, {
|
|
294
|
+
size: "small",
|
|
295
|
+
label: "Overdue",
|
|
296
|
+
color: "error"
|
|
297
|
+
}) : /* @__PURE__ */ i(l, {
|
|
262
298
|
size: "small",
|
|
263
299
|
label: fe(pe, e.status),
|
|
264
300
|
color: Ae(e.status)
|
|
@@ -294,14 +330,14 @@ function S() {
|
|
|
294
330
|
})]
|
|
295
331
|
})
|
|
296
332
|
}),
|
|
297
|
-
/* @__PURE__ */ a(
|
|
333
|
+
/* @__PURE__ */ a(u, {
|
|
298
334
|
open: A.open,
|
|
299
335
|
onClose: H,
|
|
300
336
|
maxWidth: "sm",
|
|
301
337
|
fullWidth: !0,
|
|
302
338
|
children: [
|
|
303
|
-
/* @__PURE__ */ a(
|
|
304
|
-
/* @__PURE__ */ i(
|
|
339
|
+
/* @__PURE__ */ a(ge, { children: ["End outreach session #", A.pickup?.serialId] }),
|
|
340
|
+
/* @__PURE__ */ i(f, { children: A.pickup ? /* @__PURE__ */ a(m, {
|
|
305
341
|
spacing: 2,
|
|
306
342
|
sx: { mt: 1 },
|
|
307
343
|
children: [
|
|
@@ -325,7 +361,7 @@ function S() {
|
|
|
325
361
|
"Picked ",
|
|
326
362
|
A.pickup.pickedQty,
|
|
327
363
|
" on ",
|
|
328
|
-
|
|
364
|
+
n(A.pickup.pickedOn),
|
|
329
365
|
" from ",
|
|
330
366
|
A.pickup.facilityName
|
|
331
367
|
]
|
|
@@ -455,26 +491,26 @@ function S() {
|
|
|
455
491
|
})
|
|
456
492
|
]
|
|
457
493
|
}) : null }),
|
|
458
|
-
/* @__PURE__ */ a(
|
|
494
|
+
/* @__PURE__ */ a(d, { children: [/* @__PURE__ */ i(c, {
|
|
459
495
|
onClick: H,
|
|
460
496
|
disabled: R,
|
|
461
497
|
children: "Cancel"
|
|
462
498
|
}), /* @__PURE__ */ i(c, {
|
|
463
499
|
variant: "contained",
|
|
464
|
-
onClick: () => void
|
|
500
|
+
onClick: () => void Ie(),
|
|
465
501
|
disabled: !$ || R,
|
|
466
502
|
children: R ? "Submitting…" : "End Session"
|
|
467
503
|
})] })
|
|
468
504
|
]
|
|
469
505
|
}),
|
|
470
|
-
/* @__PURE__ */ a(
|
|
506
|
+
/* @__PURE__ */ a(u, {
|
|
471
507
|
open: P.open,
|
|
472
508
|
onClose: U,
|
|
473
509
|
maxWidth: "xs",
|
|
474
510
|
fullWidth: !0,
|
|
475
511
|
children: [
|
|
476
|
-
/* @__PURE__ */ a(
|
|
477
|
-
/* @__PURE__ */ i(
|
|
512
|
+
/* @__PURE__ */ a(ge, { children: ["Top up session #", P.pickup?.serialId] }),
|
|
513
|
+
/* @__PURE__ */ i(f, { children: P.pickup ? /* @__PURE__ */ a(m, {
|
|
478
514
|
spacing: 2,
|
|
479
515
|
sx: { mt: 1 },
|
|
480
516
|
children: [
|
|
@@ -511,6 +547,12 @@ function S() {
|
|
|
511
547
|
" · remaining sealed on user: ",
|
|
512
548
|
P.pickup.expectedRemainingQty ?? 0
|
|
513
549
|
]
|
|
550
|
+
}),
|
|
551
|
+
W == null ? null : /* @__PURE__ */ a(v, {
|
|
552
|
+
variant: "caption",
|
|
553
|
+
color: "text.secondary",
|
|
554
|
+
sx: { display: "block" },
|
|
555
|
+
children: ["Available at source: ", /* @__PURE__ */ i("strong", { children: W })]
|
|
514
556
|
})
|
|
515
557
|
]
|
|
516
558
|
}),
|
|
@@ -524,14 +566,17 @@ function S() {
|
|
|
524
566
|
size: "small",
|
|
525
567
|
type: "number",
|
|
526
568
|
label: "Additional Quantity",
|
|
527
|
-
inputProps: {
|
|
569
|
+
inputProps: {
|
|
570
|
+
min: 1,
|
|
571
|
+
max: W ?? void 0
|
|
572
|
+
},
|
|
528
573
|
value: I.additionalQty,
|
|
529
574
|
onChange: (e) => L((t) => ({
|
|
530
575
|
...t,
|
|
531
576
|
additionalQty: e.target.value
|
|
532
577
|
})),
|
|
533
|
-
error: !!
|
|
534
|
-
helperText:
|
|
578
|
+
error: !!K,
|
|
579
|
+
helperText: K || (W == null ? "Sealed units to add to this session." : `Sealed units to add. Up to ${W} available at the source.`)
|
|
535
580
|
}),
|
|
536
581
|
/* @__PURE__ */ i(_, {
|
|
537
582
|
size: "small",
|
|
@@ -546,14 +591,14 @@ function S() {
|
|
|
546
591
|
})
|
|
547
592
|
]
|
|
548
593
|
}) : null }),
|
|
549
|
-
/* @__PURE__ */ a(
|
|
594
|
+
/* @__PURE__ */ a(d, { children: [/* @__PURE__ */ i(c, {
|
|
550
595
|
onClick: U,
|
|
551
596
|
disabled: R,
|
|
552
597
|
children: "Cancel"
|
|
553
598
|
}), /* @__PURE__ */ i(c, {
|
|
554
599
|
variant: "contained",
|
|
555
|
-
onClick: () => void
|
|
556
|
-
disabled: !!
|
|
600
|
+
onClick: () => void Fe(),
|
|
601
|
+
disabled: !!K || R,
|
|
557
602
|
children: R ? "Submitting…" : "Top Up"
|
|
558
603
|
})] })
|
|
559
604
|
]
|
|
@@ -563,4 +608,4 @@ function S() {
|
|
|
563
608
|
//#endregion
|
|
564
609
|
export { S as default };
|
|
565
610
|
|
|
566
|
-
//# sourceMappingURL=PickupsPage-
|
|
611
|
+
//# sourceMappingURL=PickupsPage-D66_Wta4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PickupsPage-D66_Wta4.js","names":[],"sources":["../src/views/PickupsPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport {\n Alert,\n Box,\n Button,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n FormControl,\n FormHelperText,\n InputAdornment,\n InputLabel,\n MenuItem,\n Select,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport SearchRoundedIcon from '@mui/icons-material/SearchRounded';\nimport MoveDownRoundedIcon from '@mui/icons-material/MoveDownRounded';\nimport AssignmentReturnRoundedIcon from '@mui/icons-material/AssignmentReturnRounded';\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 PmEmptyRow,\n PmRef,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n listPickups,\n recordPickupReturn,\n recordPickupTopup,\n} from '@pm/services/pmApi';\nimport { formatDate, formatDateTime } from '@pm/utils/format';\nimport { PICKUP_STATUSES, WASTAGE_REASONS, labelOf } from '@pm/utils/constants';\n\nfunction statusChipColor(status) {\n switch (status) {\n case 'OPEN': return 'info';\n case 'RETURNED': return 'success';\n case 'CANCELLED': return 'default';\n default: return 'default';\n }\n}\n\nexport default function PickupsPage() {\n const navigate = useNavigate();\n const perms = usePmPermissions();\n const canCreate = perms.has('update.manage.productManagement.pickup');\n const [rows, setRows] = useState([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n const [returnDialog, setReturnDialog] = useState({ open: false, pickup: null });\n const [returnForm, setReturnForm] = useState({ returnedQty: '', wastageReason: '', notes: '' });\n const [topupDialog, setTopupDialog] = useState({ open: false, pickup: null });\n const [topupForm, setTopupForm] = useState({ additionalQty: '', notes: '' });\n const [submitting, setSubmitting] = useState(false);\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n setRows(await listPickups());\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load pickups';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.pickup', () => { void load(); }, []);\n\n const filtered = useMemo(() => {\n const q = search.trim().toLowerCase();\n if (!q) return rows;\n return rows.filter((r) => {\n const hay = `${r.sessionName ?? ''} ${r.sessionSite ?? ''} ${r.productName ?? ''} ${r.facilityName ?? ''} ${r.userName ?? ''} ${r.lotNumber ?? ''} ${r.notes ?? ''}`.toLowerCase();\n return hay.includes(q);\n });\n }, [rows, search]);\n\n function openReturn(p) {\n const expected = p.expectedRemainingQty ?? 0;\n setReturnForm({\n // Default to \"return everything that's expected to remain\" — no wastage.\n returnedQty: String(expected),\n wastageReason: '',\n notes: '',\n });\n setReturnDialog({ open: true, pickup: p });\n }\n\n function closeReturn() {\n if (submitting) return;\n setReturnDialog({ open: false, pickup: null });\n }\n\n function openTopup(p) {\n setTopupForm({ additionalQty: '1', notes: '' });\n setTopupDialog({ open: true, pickup: p });\n }\n\n function closeTopup() {\n if (submitting) return;\n setTopupDialog({ open: false, pickup: null });\n }\n\n // Ceiling for a top-up is whatever the source (facility) batch still has —\n // the backend rejects more than this, so cap it here for a friendly UX.\n const topupSourceAvailable = topupDialog.pickup?.sourceBatchQtyRemaining ?? null;\n const topupAdditionalQty = Number(topupForm.additionalQty);\n const topupQtyError = !Number.isInteger(topupAdditionalQty) || topupAdditionalQty <= 0\n ? 'Enter a whole number greater than 0.'\n : (topupSourceAvailable != null && topupAdditionalQty > topupSourceAvailable)\n ? `Only ${topupSourceAvailable} available at the source facility.`\n : '';\n\n async function submitTopup() {\n if (topupQtyError || !topupDialog.pickup) return;\n setSubmitting(true);\n try {\n await recordPickupTopup(topupDialog.pickup.id, {\n id: uuidv4(),\n additionalQty: topupAdditionalQty,\n notes: topupForm.notes || null,\n });\n showToast({\n message: `Topped up ${topupAdditionalQty} unit${topupAdditionalQty === 1 ? '' : 's'}.`,\n type: 'success',\n });\n closeTopup();\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to top up';\n showToast({ message, type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n const expectedRemaining = returnDialog.pickup?.expectedRemainingQty ?? 0;\n const returnedQty = Number(returnForm.returnedQty);\n const wastedQty = Number.isFinite(returnedQty) && returnedQty >= 0 && returnedQty <= expectedRemaining\n ? expectedRemaining - returnedQty\n : null;\n const returnedQtyError = !Number.isInteger(returnedQty) || returnedQty < 0\n ? 'Enter a whole number from 0 to the expected remaining.'\n : returnedQty > expectedRemaining\n ? `At most ${expectedRemaining} can be returned.`\n : '';\n // Reason is required whenever ANY wastage will be written — either the\n // sealed-units gap is > 0, or there are open vials to close (their\n // remaining volume becomes wastage).\n const reasonRequired = (wastedQty != null && wastedQty > 0)\n || ((returnDialog.pickup?.openVials ?? []).length > 0);\n const reasonError = reasonRequired && !returnForm.wastageReason\n ? 'A reason is required for the wastage being recorded.'\n : '';\n const returnFormValid = !returnedQtyError && !reasonError;\n\n async function submitReturn() {\n if (!returnFormValid || !returnDialog.pickup) return;\n setSubmitting(true);\n try {\n await recordPickupReturn(returnDialog.pickup.id, {\n returnedQty,\n wastageReason: reasonRequired ? returnForm.wastageReason : null,\n notes: returnForm.notes || null,\n });\n showToast({\n message: wastedQty > 0\n ? `Returned ${returnedQty}, wasted ${wastedQty}.`\n : `Returned ${returnedQty} unit${returnedQty === 1 ? '' : 's'}.`,\n type: 'success',\n });\n closeReturn();\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to record return';\n showToast({ message, type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.pickup'}>\n <PmPageShell\n title=\"Stock Pickups\"\n subtitle=\"Stock you're carrying for field work. Record returns and any items lost or used.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canCreate ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/pickups/new')}>\n New Pickup\n </Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Operations\"\n title=\"Pickups\"\n subtitle={loading ? 'Loading…' : `${filtered.length} ${filtered.length === 1 ? 'pickup' : 'pickups'}`}\n >\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} sx={{ mb: 2 }}>\n <TextField\n size=\"small\" fullWidth\n placeholder=\"Search by product, facility, user, lot, notes…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n InputProps={{\n startAdornment: <InputAdornment position=\"start\"><SearchRoundedIcon fontSize=\"small\" /></InputAdornment>,\n }}\n />\n </Stack>\n\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Ref</TableCell>\n <TableCell>Session</TableCell>\n <TableCell>Product</TableCell>\n <TableCell>Facility</TableCell>\n <TableCell>User</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell>Picked</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: 9 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : filtered.length === 0 ? (\n <PmEmptyRow\n colSpan={9}\n icon={MoveDownRoundedIcon}\n title={search.trim() !== '' ? 'No pickups match your search' : 'No pickups yet'}\n hint=\"Check out stock from a facility to use in the field.\"\n action={canCreate ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/pickups/new')}>\n Record first pickup\n </Button>\n ) : null}\n />\n ) : filtered.map((r) => (\n <TableRow key={r.id} hover>\n <TableCell><PmRef id={r.serialId} /></TableCell>\n <TableCell sx={{ maxWidth: 220 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, wordBreak: 'break-word' }}>\n {r.sessionName ?? '—'}\n </Typography>\n {r.sessionSite ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', wordBreak: 'break-word' }}>\n {r.sessionSite}\n </Typography>\n ) : null}\n {r.sessionStartTime ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', fontVariantNumeric: 'tabular-nums' }}>\n {formatDateTime(r.sessionStartTime)}\n {r.sessionExpectedEndTime ? ` → ${formatDateTime(r.sessionExpectedEndTime)}` : ''}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>{r.productName ?? '—'}</Typography>\n {r.lotNumber ? (\n <Typography variant=\"caption\" sx={{ fontFamily: 'monospace', color: 'text.secondary' }}>\n {r.lotNumber}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>{r.facilityName ?? '—'}</TableCell>\n <TableCell>{r.userName ?? '—'}</TableCell>\n <TableCell align=\"right\">\n <Typography sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{r.pickedQty}</Typography>\n {r.status === 'OPEN' && r.expectedRemainingQty != null ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {r.expectedRemainingQty} left on user\n </Typography>\n ) : r.status === 'RETURNED' ? (\n <Typography variant=\"caption\" color=\"text.secondary\">\n {r.returnedQty} returned{r.wastedQty > 0 ? ` · ${r.wastedQty} wasted` : ''}\n </Typography>\n ) : null}\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">{formatDate(r.pickedOn)}</Typography>\n </TableCell>\n <TableCell>\n {r.status === 'OPEN' && r.sessionExpectedEndTime\n && new Date(r.sessionExpectedEndTime).getTime() < Date.now() ? (\n <Chip size=\"small\" label=\"Overdue\" color=\"error\" />\n ) : (\n <Chip size=\"small\" label={labelOf(PICKUP_STATUSES, r.status)} color={statusChipColor(r.status)} />\n )}\n </TableCell>\n <TableCell align=\"right\">\n {r.status === 'OPEN' && canCreate ? (\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\">\n <Button size=\"small\" variant=\"outlined\" startIcon={<AddRoundedIcon />}\n onClick={() => openTopup(r)}>\n Top Up\n </Button>\n <Button size=\"small\" variant=\"outlined\" startIcon={<AssignmentReturnRoundedIcon />}\n onClick={() => openReturn(r)}>\n End Session\n </Button>\n </Stack>\n ) : (\n <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>\n )}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n\n {/* ---------- End Outreach Session dialog ---------- */}\n <Dialog open={returnDialog.open} onClose={closeReturn} maxWidth=\"sm\" fullWidth>\n <DialogTitle>End outreach session #{returnDialog.pickup?.serialId}</DialogTitle>\n <DialogContent>\n {returnDialog.pickup ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Box sx={(t) => ({\n p: 1.5, borderRadius: 3,\n bgcolor: alpha(t.palette.primary.main, 0.04),\n border: `1px solid ${alpha(t.palette.primary.main, 0.12)}`,\n })}>\n <Typography variant=\"body2\"><strong>{returnDialog.pickup.productName}</strong></Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Picked {returnDialog.pickup.pickedQty} on {formatDateTime(returnDialog.pickup.pickedOn)} from {returnDialog.pickup.facilityName}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5 }}>\n Sealed units expected on user: <strong>{expectedRemaining}</strong>\n {' '}({(returnDialog.pickup.pickedQty ?? 0) - expectedRemaining - ((returnDialog.pickup.openVials ?? []).length)} already administered / wasted during the day)\n </Typography>\n </Box>\n\n <TextField\n required size=\"small\" type=\"number\"\n label=\"Sealed Units Returned\"\n inputProps={{ min: 0, max: expectedRemaining }}\n value={returnForm.returnedQty}\n onChange={(e) => setReturnForm((f) => ({ ...f, returnedQty: e.target.value }))}\n error={!!returnedQtyError}\n helperText={returnedQtyError || `Out of ${expectedRemaining} sealed units expected to remain`}\n />\n\n {wastedQty != null && wastedQty > 0 ? (\n <Alert severity=\"warning\" variant=\"outlined\">\n <strong>{wastedQty}</strong> sealed {wastedQty === 1 ? 'unit' : 'units'} unaccounted for — will be marked as wastage.\n </Alert>\n ) : null}\n\n {/* Open-vial wastage preview. Any vial opened during outreach\n does not return to the facility — it's closed with wastage\n as part of this end-session action. Volume shown so the\n operator knows what's being written off. */}\n {(returnDialog.pickup.openVials ?? []).length > 0 ? (\n <Alert severity=\"info\" variant=\"outlined\">\n <Typography variant=\"body2\" sx={{ fontWeight: 700, mb: 0.5 }}>\n {returnDialog.pickup.openVials.length} open vial{returnDialog.pickup.openVials.length === 1 ? '' : 's'} on you will be closed with wastage\n </Typography>\n <Stack spacing={0.25} sx={{ mt: 0.5 }}>\n {returnDialog.pickup.openVials.map((v) => (\n <Typography key={v.id} variant=\"caption\" color=\"text.secondary\">\n Lot {v.lotNumber || '—'} · {Number(v.volumeRemainingMl ?? 0).toFixed(2)} ml remaining\n </Typography>\n ))}\n </Stack>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.75 }}>\n These volumes will be recorded as wastage using the reason picked below.\n </Typography>\n </Alert>\n ) : null}\n\n <FormControl size=\"small\" disabled={!reasonRequired} error={!!reasonError}>\n <InputLabel>Wastage Reason{reasonRequired ? ' *' : ''}</InputLabel>\n <Select\n label={`Wastage Reason${reasonRequired ? ' *' : ''}`}\n value={returnForm.wastageReason}\n onChange={(e) => setReturnForm((f) => ({ ...f, wastageReason: e.target.value }))}\n >\n <MenuItem value=\"\"><em>—</em></MenuItem>\n {WASTAGE_REASONS.map((r) => (\n <MenuItem key={r.value} value={r.value}>{r.label}</MenuItem>\n ))}\n </Select>\n <FormHelperText>\n {reasonError\n || (reasonRequired\n ? 'Required — same reason covers both unaccounted sealed units and any open-vial remaining volume.'\n : 'Not needed — nothing being wasted.')}\n </FormHelperText>\n </FormControl>\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={returnForm.notes}\n onChange={(e) => setReturnForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeReturn} disabled={submitting}>Cancel</Button>\n <Button variant=\"contained\" onClick={() => void submitReturn()}\n disabled={!returnFormValid || submitting}>\n {submitting ? 'Submitting…' : 'End Session'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* ---------- Top Up dialog ---------- */}\n <Dialog open={topupDialog.open} onClose={closeTopup} maxWidth=\"xs\" fullWidth>\n <DialogTitle>Top up session #{topupDialog.pickup?.serialId}</DialogTitle>\n <DialogContent>\n {topupDialog.pickup ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Box sx={(t) => ({\n p: 1.5, borderRadius: 3,\n bgcolor: alpha(t.palette.primary.main, 0.04),\n border: `1px solid ${alpha(t.palette.primary.main, 0.12)}`,\n })}>\n <Typography variant=\"body2\"><strong>{topupDialog.pickup.productName}</strong></Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Source: {topupDialog.pickup.facilityName} · Lot {topupDialog.pickup.lotNumber || '—'}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Currently picked: {topupDialog.pickup.pickedQty} · remaining sealed on user: {topupDialog.pickup.expectedRemainingQty ?? 0}\n </Typography>\n {topupSourceAvailable != null ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Available at source: <strong>{topupSourceAvailable}</strong>\n </Typography>\n ) : null}\n </Box>\n\n <Alert severity=\"info\" variant=\"outlined\">\n Top-ups come from the same source batch as the original pickup so lot / expiry stays consistent. To pick from a different batch, end this session first.\n </Alert>\n\n <TextField\n required size=\"small\" type=\"number\"\n label=\"Additional Quantity\"\n inputProps={{ min: 1, max: topupSourceAvailable ?? undefined }}\n value={topupForm.additionalQty}\n onChange={(e) => setTopupForm((f) => ({ ...f, additionalQty: e.target.value }))}\n error={!!topupQtyError}\n helperText={topupQtyError\n || (topupSourceAvailable != null\n ? `Sealed units to add. Up to ${topupSourceAvailable} available at the source.`\n : 'Sealed units to add to this session.')}\n />\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={topupForm.notes}\n onChange={(e) => setTopupForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeTopup} disabled={submitting}>Cancel</Button>\n <Button variant=\"contained\" onClick={() => void submitTopup()}\n disabled={!!topupQtyError || submitting}>\n {submitting ? 'Submitting…' : 'Top Up'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n"],"mappings":"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"}
|