@argusoft/medplat-product-management 1.0.6 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/dist/{BrandsPage-DM5ZRz8L.js → BrandsPage-CdqGFmGf.js} +57 -58
  2. package/dist/BrandsPage-CdqGFmGf.js.map +1 -0
  3. package/dist/CategoriesPage-DJM0Nalw.js +392 -0
  4. package/dist/CategoriesPage-DJM0Nalw.js.map +1 -0
  5. package/dist/{DashboardPage-CW77OzUg.js → DashboardPage-BASkXr00.js} +14 -14
  6. package/dist/{DashboardPage-CW77OzUg.js.map → DashboardPage-BASkXr00.js.map} +1 -1
  7. package/dist/{FacilityPicker-C2drWyqo.js → FacilityPicker-jV-qXp1k.js} +8 -6
  8. package/dist/{FacilityPicker-C2drWyqo.js.map → FacilityPicker-jV-qXp1k.js.map} +1 -1
  9. package/dist/InventoryPage-CTdq6txa.js +658 -0
  10. package/dist/InventoryPage-CTdq6txa.js.map +1 -0
  11. package/dist/{MemberProfileCard-D9jepThR.js → MemberProfileCard-DwWda-tS.js} +3 -3
  12. package/dist/{MemberProfileCard-D9jepThR.js.map → MemberProfileCard-DwWda-tS.js.map} +1 -1
  13. package/dist/{PaymentCreatePage-DAUWv5RO.js → PaymentCreatePage-B3bP-K01.js} +137 -138
  14. package/dist/PaymentCreatePage-B3bP-K01.js.map +1 -0
  15. package/dist/{PaymentsPage-B6Fs2xey.js → PaymentsPage-Dh8bqXVE.js} +42 -43
  16. package/dist/PaymentsPage-Dh8bqXVE.js.map +1 -0
  17. package/dist/PickupBatchLinesEditor-B2fLx1lU.js +116 -0
  18. package/dist/PickupBatchLinesEditor-B2fLx1lU.js.map +1 -0
  19. package/dist/{PickupCreatePage-4ffB1_yq.js → PickupCreatePage-BeYhR45k.js} +301 -257
  20. package/dist/PickupCreatePage-BeYhR45k.js.map +1 -0
  21. package/dist/PickupsPage-C6lBtAoQ.js +814 -0
  22. package/dist/PickupsPage-C6lBtAoQ.js.map +1 -0
  23. package/dist/{PmGuard-DrbbysnW.js → PmGuard-DrIl1sHL.js} +2 -2
  24. package/dist/{PmGuard-DrbbysnW.js.map → PmGuard-DrIl1sHL.js.map} +1 -1
  25. package/dist/PmTable-BSV_bMJZ.js +545 -0
  26. package/dist/PmTable-BSV_bMJZ.js.map +1 -0
  27. package/dist/ProductEditPage-DZTUH95T.js +1295 -0
  28. package/dist/ProductEditPage-DZTUH95T.js.map +1 -0
  29. package/dist/{ProductsPage-DFgK9-13.js → ProductsPage-CqOsah4_.js} +61 -64
  30. package/dist/ProductsPage-CqOsah4_.js.map +1 -0
  31. package/dist/{PurchaseCreatePage-B1eV15aS.js → PurchaseCreatePage-D6os7srp.js} +210 -153
  32. package/dist/PurchaseCreatePage-D6os7srp.js.map +1 -0
  33. package/dist/PurchaseRequestDetailPage-DErqGKiq.js +1544 -0
  34. package/dist/PurchaseRequestDetailPage-DErqGKiq.js.map +1 -0
  35. package/dist/PurchaseRequestsPage-CHBoRzzH.js +280 -0
  36. package/dist/PurchaseRequestsPage-CHBoRzzH.js.map +1 -0
  37. package/dist/{PurchasesPage-Bsrqxvb1.js → PurchasesPage-C-2K7wH6.js} +40 -41
  38. package/dist/PurchasesPage-C-2K7wH6.js.map +1 -0
  39. package/dist/{SaleCreatePage-CPyVj3Dh.js → SaleCreatePage-DB3_UEgy.js} +117 -118
  40. package/dist/SaleCreatePage-DB3_UEgy.js.map +1 -0
  41. package/dist/{SalesPage-BWpgPKz_.js → SalesPage-BhBGG426.js} +89 -90
  42. package/dist/SalesPage-BhBGG426.js.map +1 -0
  43. package/dist/SettingsPage-CBUu9DZK.js +746 -0
  44. package/dist/SettingsPage-CBUu9DZK.js.map +1 -0
  45. package/dist/StorageUnitsPage-oe0lXLd1.js +719 -0
  46. package/dist/StorageUnitsPage-oe0lXLd1.js.map +1 -0
  47. package/dist/{TransactionsPage-DQBjCHoN.js → TransactionsPage-7dRZpZOD.js} +108 -83
  48. package/dist/TransactionsPage-7dRZpZOD.js.map +1 -0
  49. package/dist/{TransferCreatePage-DdVExUif.js → TransferCreatePage-DtkAlP9l.js} +73 -74
  50. package/dist/TransferCreatePage-DtkAlP9l.js.map +1 -0
  51. package/dist/{TransfersPage-C1qS9kNL.js → TransfersPage-BaEjbvnj.js} +67 -68
  52. package/dist/TransfersPage-BaEjbvnj.js.map +1 -0
  53. package/dist/{VialsPage-rTAYlXGZ.js → VialsPage-vo9Of9oC.js} +83 -84
  54. package/dist/VialsPage-vo9Of9oC.js.map +1 -0
  55. package/dist/constants-ClZJY2x1.js +405 -0
  56. package/dist/constants-ClZJY2x1.js.map +1 -0
  57. package/dist/index.js +582 -391
  58. package/dist/index.js.map +1 -1
  59. package/dist/{settingsStore-GLCtI-tv.js → settingsStore-BlA2GIhl.js} +89 -58
  60. package/dist/settingsStore-BlA2GIhl.js.map +1 -0
  61. package/dist/{validation-BkUPqrdA.js → validation-B6Kl5Xf9.js} +23 -22
  62. package/dist/validation-B6Kl5Xf9.js.map +1 -0
  63. package/package.json +1 -1
  64. package/dist/BrandsPage-DM5ZRz8L.js.map +0 -1
  65. package/dist/CategoriesPage-v7vz_i2N.js +0 -342
  66. package/dist/CategoriesPage-v7vz_i2N.js.map +0 -1
  67. package/dist/InventoryPage-_VWlqD2e.js +0 -686
  68. package/dist/InventoryPage-_VWlqD2e.js.map +0 -1
  69. package/dist/PaymentCreatePage-DAUWv5RO.js.map +0 -1
  70. package/dist/PaymentsPage-B6Fs2xey.js.map +0 -1
  71. package/dist/PickupCreatePage-4ffB1_yq.js.map +0 -1
  72. package/dist/PickupsPage-C-21LwTf.js +0 -604
  73. package/dist/PickupsPage-C-21LwTf.js.map +0 -1
  74. package/dist/PmTable-BMFiuHdG.js +0 -375
  75. package/dist/PmTable-BMFiuHdG.js.map +0 -1
  76. package/dist/ProductEditPage-BinNxjlB.js +0 -708
  77. package/dist/ProductEditPage-BinNxjlB.js.map +0 -1
  78. package/dist/ProductsPage-DFgK9-13.js.map +0 -1
  79. package/dist/PurchaseCreatePage-B1eV15aS.js.map +0 -1
  80. package/dist/PurchaseRequestDetailPage-52S6Nf7a.js +0 -588
  81. package/dist/PurchaseRequestDetailPage-52S6Nf7a.js.map +0 -1
  82. package/dist/PurchaseRequestsPage-DNNUnXy4.js +0 -266
  83. package/dist/PurchaseRequestsPage-DNNUnXy4.js.map +0 -1
  84. package/dist/PurchasesPage-Bsrqxvb1.js.map +0 -1
  85. package/dist/SaleCreatePage-CPyVj3Dh.js.map +0 -1
  86. package/dist/SalesPage-BWpgPKz_.js.map +0 -1
  87. package/dist/SettingsPage-Ch-37E5R.js +0 -663
  88. package/dist/SettingsPage-Ch-37E5R.js.map +0 -1
  89. package/dist/StorageUnitsPage-DF0MC356.js +0 -471
  90. package/dist/StorageUnitsPage-DF0MC356.js.map +0 -1
  91. package/dist/TransactionsPage-DQBjCHoN.js.map +0 -1
  92. package/dist/TransferCreatePage-DdVExUif.js.map +0 -1
  93. package/dist/TransfersPage-C1qS9kNL.js.map +0 -1
  94. package/dist/VialsPage-rTAYlXGZ.js.map +0 -1
  95. package/dist/constants-CdzV0PxZ.js +0 -270
  96. package/dist/constants-CdzV0PxZ.js.map +0 -1
  97. package/dist/settingsStore-GLCtI-tv.js.map +0 -1
  98. package/dist/validation-BkUPqrdA.js.map +0 -1
@@ -1,588 +0,0 @@
1
- import { C as e, a as t, f as n, r } from "./settingsStore-GLCtI-tv.js";
2
- import { a as i, i as a, r as o } from "./PmTable-BMFiuHdG.js";
3
- import { n as s, t as ee } from "./format-UOyOu75i.js";
4
- import { a as te, i as ne, n as re, r as ie, t as ae } from "./PmGuard-DrbbysnW.js";
5
- import { useMemo as c, useState as l } from "react";
6
- import { Fragment as u, jsx as d, jsxs as f } from "react/jsx-runtime";
7
- import { Alert as p, Box as m, Button as h, Card as g, CardContent as _, Chip as oe, Divider as v, Stack as y, Table as se, TableBody as ce, TableCell as b, TableHead as le, TableRow as x, TextField as S, Typography as C } from "@mui/material";
8
- import { showToast as w } from "@/common/toaster/toaster";
9
- import { alpha as ue } from "@mui/material/styles";
10
- import de from "@mui/icons-material/RefreshRounded";
11
- import { useNavigate as fe, useParams as pe } from "react-router-dom";
12
- import me from "@mui/icons-material/ArrowBackRounded";
13
- import he from "@mui/icons-material/CheckCircleRounded";
14
- import ge from "@mui/icons-material/CancelRounded";
15
- import _e from "@mui/icons-material/DoNotDisturbRounded";
16
- //#region src/views/PurchaseRequestDetailPage.jsx
17
- function ve(e) {
18
- switch (e) {
19
- case "PENDING": return "info";
20
- case "APPROVED": return "success";
21
- case "PARTIALLY_APPROVED": return "warning";
22
- case "REJECTED": return "error";
23
- case "CANCELLED": return "default";
24
- default: return "default";
25
- }
26
- }
27
- function T(e) {
28
- return e ? e.toLowerCase().split("_").map((e) => e.charAt(0).toUpperCase() + e.slice(1)).join(" ") : "";
29
- }
30
- function E() {
31
- let E = fe(), { requestId: O } = pe(), k = ne().has("approve.manage.productManagement.purchase"), A = r()?.managePurchaseAmounts !== !1, [j, M] = l(null), [ye, N] = l(!0), [P, F] = l(!1), [I, L] = l(""), [R, z] = l({}), [B, V] = l({}), [H, U] = l({}), [W, G] = l("");
32
- async function K() {
33
- N(!0), L("");
34
- try {
35
- let t = await e(O);
36
- M(t);
37
- let n = {}, r = {}, i = {};
38
- (t?.items ?? []).forEach((e) => {
39
- n[e.id] = String(e.approvedQuantity == null ? e.requestedQuantity : e.approvedQuantity), r[e.id] = e.lotNumber ?? "", i[e.id] = e.expiryDate ? new Date(e.expiryDate).toISOString().substring(0, 10) : "";
40
- }), z(n), V(r), U(i), G(t?.decisionNotes ?? "");
41
- } catch (e) {
42
- L(e?.response?.data?.message ?? e?.message ?? "Failed to load purchase request");
43
- } finally {
44
- N(!1);
45
- }
46
- }
47
- ie(["view.manage.productManagement.purchase", "approve.manage.productManagement.purchase"], () => {
48
- K();
49
- }, [O]);
50
- let q = j?.status === "PENDING", J = c(() => {
51
- if (!j || !A) return null;
52
- let e = 0, t = !1;
53
- return (j.items ?? []).forEach((n) => {
54
- let r = Number(R[n.id] ?? 0);
55
- !Number.isFinite(r) || r <= 0 || n.buyPrice != null && (e += Number(n.buyPrice) * r, t = !0);
56
- }), t ? e : null;
57
- }, [
58
- j,
59
- R,
60
- A
61
- ]);
62
- function be(e, t) {
63
- z((n) => ({
64
- ...n,
65
- [e]: t
66
- }));
67
- }
68
- function xe(e, t) {
69
- V((n) => ({
70
- ...n,
71
- [e]: t
72
- }));
73
- }
74
- function Se(e, t) {
75
- U((n) => ({
76
- ...n,
77
- [e]: t
78
- }));
79
- }
80
- function Ce() {
81
- if (!j) return;
82
- let e = {};
83
- j.items.forEach((t) => {
84
- e[t.id] = String(t.requestedQuantity);
85
- }), z(e);
86
- }
87
- function Y() {
88
- if (!j) return;
89
- let e = {};
90
- j.items.forEach((t) => {
91
- e[t.id] = "0";
92
- }), z(e);
93
- }
94
- let X = c(() => {
95
- if (!j) return {};
96
- let e = {};
97
- return (j.items ?? []).forEach((t) => {
98
- let n = R[t.id];
99
- if (n == null || n === "") {
100
- e[t.id] = "Required";
101
- return;
102
- }
103
- let r = Number(n);
104
- !Number.isInteger(r) || r < 0 ? e[t.id] = "Must be 0 or a positive whole number" : r > t.requestedQuantity && (e[t.id] = `At most ${t.requestedQuantity}`);
105
- }), e;
106
- }, [j, R]), Z = c(() => {
107
- if (!j) return {};
108
- let e = {};
109
- return (j.items ?? []).forEach((t) => {
110
- let n = Number(R[t.id] ?? 0);
111
- !Number.isFinite(n) || n <= 0 || (B[t.id] ?? "").trim() || (e[t.id] = "Lot is required when approving this line");
112
- }), e;
113
- }, [
114
- j,
115
- R,
116
- B
117
- ]), Q = c(() => {
118
- if (!j) return {};
119
- let e = {}, t = (/* @__PURE__ */ new Date()).toISOString().substring(0, 10);
120
- return (j.items ?? []).forEach((n) => {
121
- let r = Number(R[n.id] ?? 0);
122
- if (!Number.isFinite(r) || r <= 0) return;
123
- let i = (H[n.id] ?? "").trim();
124
- i ? i < t && (e[n.id] = "Expiry must be today or later") : e[n.id] = "Expiry is required when approving this line";
125
- }), e;
126
- }, [
127
- j,
128
- R,
129
- H
130
- ]), we = Object.keys(X).length === 0 && Object.keys(Z).length === 0 && Object.keys(Q).length === 0;
131
- async function Te() {
132
- if (!(!we || !j)) {
133
- F(!0), L("");
134
- try {
135
- let e = await n(j.id, {
136
- decisionNotes: W || null,
137
- items: j.items.map((e) => {
138
- let t = (B[e.id] ?? "").trim(), n = (H[e.id] ?? "").trim();
139
- return {
140
- itemId: e.id,
141
- approvedQuantity: Number(R[e.id]),
142
- lotNumber: t || null,
143
- expiryDate: n || null
144
- };
145
- })
146
- });
147
- M(e), w({
148
- message: `Request ${T(e.status).toLowerCase()}.`,
149
- type: "success"
150
- });
151
- } catch (e) {
152
- L(e?.response?.data?.message ?? e?.message ?? "Failed to submit decision");
153
- } finally {
154
- F(!1);
155
- }
156
- }
157
- }
158
- async function Ee() {
159
- if (j) {
160
- F(!0), L("");
161
- try {
162
- let e = await t(j.id);
163
- M(e), w({
164
- message: "Request cancelled.",
165
- type: "success"
166
- });
167
- } catch (e) {
168
- L(e?.response?.data?.message ?? e?.message ?? "Failed to cancel request");
169
- } finally {
170
- F(!1);
171
- }
172
- }
173
- }
174
- let $ = q && k;
175
- return /* @__PURE__ */ f(m, { children: [/* @__PURE__ */ d(re, {}), /* @__PURE__ */ d(ae, {
176
- anyOf: ["view.manage.productManagement.purchase", "approve.manage.productManagement.purchase"],
177
- children: /* @__PURE__ */ f(te, {
178
- title: j?.serialId ? `Purchase Request #${j.serialId}` : "Purchase Request",
179
- subtitle: "Approve or reject each item. Your decision closes the entire request.",
180
- chips: j?.status ? [T(j.status)] : [],
181
- actions: /* @__PURE__ */ f(y, {
182
- direction: "row",
183
- spacing: 1,
184
- children: [/* @__PURE__ */ d(h, {
185
- variant: "outlined",
186
- startIcon: /* @__PURE__ */ d(me, {}),
187
- onClick: () => E("/ui/medplat/manage/pm/purchase-requests"),
188
- children: "Back"
189
- }), /* @__PURE__ */ d(h, {
190
- variant: "outlined",
191
- startIcon: /* @__PURE__ */ d(de, {}),
192
- onClick: () => void K(),
193
- children: "Refresh"
194
- })]
195
- }),
196
- children: [I ? /* @__PURE__ */ d(p, {
197
- severity: "error",
198
- sx: { mb: 2 },
199
- children: I
200
- }) : null, !ye && j ? /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d(g, {
201
- sx: {
202
- borderRadius: 1.5,
203
- mb: 2,
204
- border: "1px solid",
205
- borderColor: "divider",
206
- boxShadow: "0 12px 32px rgba(15, 23, 42, 0.045)"
207
- },
208
- children: /* @__PURE__ */ f(_, {
209
- sx: { p: 2.5 },
210
- children: [
211
- /* @__PURE__ */ f(y, {
212
- direction: {
213
- xs: "column",
214
- md: "row"
215
- },
216
- spacing: 2,
217
- alignItems: { md: "flex-start" },
218
- children: [/* @__PURE__ */ f(m, {
219
- sx: {
220
- flexGrow: 1,
221
- minWidth: 0
222
- },
223
- children: [
224
- /* @__PURE__ */ f(y, {
225
- direction: "row",
226
- alignItems: "center",
227
- spacing: 1.5,
228
- sx: { mb: .5 },
229
- children: [
230
- /* @__PURE__ */ d(i, { id: j.serialId }),
231
- /* @__PURE__ */ d(oe, {
232
- size: "small",
233
- label: T(j.status),
234
- color: ve(j.status)
235
- }),
236
- /* @__PURE__ */ d(C, {
237
- variant: "caption",
238
- color: "text.secondary",
239
- children: j.ownerType
240
- })
241
- ]
242
- }),
243
- /* @__PURE__ */ d(C, {
244
- variant: "h6",
245
- sx: { fontWeight: 800 },
246
- children: j.ownerName || (j.ownerType === "USER" ? "Personal" : "Facility")
247
- }),
248
- /* @__PURE__ */ f(C, {
249
- variant: "caption",
250
- color: "text.secondary",
251
- sx: { display: "block" },
252
- children: ["For purchase date ", ee(j.purchaseDate)]
253
- })
254
- ]
255
- }), /* @__PURE__ */ f(y, {
256
- spacing: .25,
257
- sx: { minWidth: 260 },
258
- children: [
259
- /* @__PURE__ */ d(D, {
260
- label: "Requested by",
261
- children: j.requestedByName || `#${j.requestedBy}`
262
- }),
263
- /* @__PURE__ */ d(D, {
264
- label: "Requested on",
265
- children: s(j.requestedOn)
266
- }),
267
- j.decidedBy ? /* @__PURE__ */ f(u, { children: [/* @__PURE__ */ d(D, {
268
- label: "Decided by",
269
- children: j.decidedByName || `#${j.decidedBy}`
270
- }), /* @__PURE__ */ d(D, {
271
- label: "Decided on",
272
- children: s(j.decidedOn)
273
- })] }) : null,
274
- j.paymentMode ? /* @__PURE__ */ d(D, {
275
- label: "Payment",
276
- children: j.paymentMode
277
- }) : null
278
- ]
279
- })]
280
- }),
281
- j.notes ? /* @__PURE__ */ f(u, { children: [
282
- /* @__PURE__ */ d(v, { sx: { my: 1.5 } }),
283
- /* @__PURE__ */ d(C, {
284
- variant: "caption",
285
- color: "text.secondary",
286
- sx: {
287
- display: "block",
288
- mb: .5,
289
- fontWeight: 700,
290
- textTransform: "uppercase",
291
- letterSpacing: .6
292
- },
293
- children: "Requester notes"
294
- }),
295
- /* @__PURE__ */ d(C, {
296
- variant: "body2",
297
- children: j.notes
298
- })
299
- ] }) : null,
300
- j.decisionNotes ? /* @__PURE__ */ f(u, { children: [
301
- /* @__PURE__ */ d(v, { sx: { my: 1.5 } }),
302
- /* @__PURE__ */ d(C, {
303
- variant: "caption",
304
- color: "text.secondary",
305
- sx: {
306
- display: "block",
307
- mb: .5,
308
- fontWeight: 700,
309
- textTransform: "uppercase",
310
- letterSpacing: .6
311
- },
312
- children: "Decision notes"
313
- }),
314
- /* @__PURE__ */ d(C, {
315
- variant: "body2",
316
- children: j.decisionNotes
317
- })
318
- ] }) : null
319
- ]
320
- })
321
- }), /* @__PURE__ */ d(g, {
322
- sx: {
323
- borderRadius: 1.5,
324
- mb: 2,
325
- border: "1px solid",
326
- borderColor: "divider",
327
- boxShadow: "0 12px 32px rgba(15, 23, 42, 0.045)"
328
- },
329
- children: /* @__PURE__ */ f(_, {
330
- sx: { p: 2.5 },
331
- children: [
332
- /* @__PURE__ */ f(y, {
333
- direction: {
334
- xs: "column",
335
- md: "row"
336
- },
337
- alignItems: { md: "flex-end" },
338
- justifyContent: "space-between",
339
- sx: { mb: 1.5 },
340
- children: [/* @__PURE__ */ d(o, {
341
- eyebrow: "Lines",
342
- title: $ ? "Decide per-line quantities" : "Requested items",
343
- hint: $ ? "Enter 0 to reject an item, or less than requested to partially approve." : null
344
- }), $ ? /* @__PURE__ */ f(y, {
345
- direction: "row",
346
- spacing: 1,
347
- children: [/* @__PURE__ */ d(h, {
348
- size: "small",
349
- variant: "outlined",
350
- onClick: Ce,
351
- children: "Approve all"
352
- }), /* @__PURE__ */ d(h, {
353
- size: "small",
354
- variant: "outlined",
355
- color: "error",
356
- onClick: Y,
357
- children: "Reject all"
358
- })]
359
- }) : null]
360
- }),
361
- /* @__PURE__ */ f(se, {
362
- size: "small",
363
- children: [/* @__PURE__ */ d(le, { children: /* @__PURE__ */ f(x, { children: [
364
- /* @__PURE__ */ d(b, { children: "Product" }),
365
- /* @__PURE__ */ d(b, { children: "Lot" }),
366
- /* @__PURE__ */ d(b, { children: "Expiry" }),
367
- A ? /* @__PURE__ */ d(b, {
368
- align: "right",
369
- children: "Buy Price"
370
- }) : null,
371
- /* @__PURE__ */ d(b, {
372
- align: "right",
373
- children: "Requested"
374
- }),
375
- /* @__PURE__ */ d(b, {
376
- align: "right",
377
- children: $ ? "Approve" : "Approved"
378
- }),
379
- j.ownerType === "FACILITY" ? /* @__PURE__ */ d(b, { children: "Storage" }) : null
380
- ] }) }), /* @__PURE__ */ d(ce, { children: j.items.map((e) => {
381
- let t = X[e.id], n = Z[e.id], r = Q[e.id], i = Number(R[e.id] ?? 0), o = $ && Number.isFinite(i) && i > 0;
382
- return /* @__PURE__ */ f(x, { children: [
383
- /* @__PURE__ */ d(b, {
384
- sx: { fontWeight: 700 },
385
- children: e.productName
386
- }),
387
- /* @__PURE__ */ d(b, {
388
- sx: {
389
- fontFamily: "monospace",
390
- fontSize: "0.78rem"
391
- },
392
- children: $ ? /* @__PURE__ */ d(S, {
393
- size: "small",
394
- placeholder: "Enter lot",
395
- value: B[e.id] ?? "",
396
- onChange: (t) => xe(e.id, t.target.value),
397
- disabled: !o,
398
- error: !!n,
399
- helperText: n || (o ? "" : "Approve qty > 0 to enter lot"),
400
- inputProps: { style: {
401
- fontFamily: "monospace",
402
- fontSize: "0.78rem"
403
- } },
404
- sx: { minWidth: 140 }
405
- }) : e.lotNumber || "—"
406
- }),
407
- /* @__PURE__ */ d(b, { children: $ ? /* @__PURE__ */ d(S, {
408
- size: "small",
409
- type: "date",
410
- InputLabelProps: { shrink: !0 },
411
- value: H[e.id] ?? "",
412
- onChange: (t) => Se(e.id, t.target.value),
413
- disabled: !o,
414
- error: !!r,
415
- helperText: r || "",
416
- sx: { minWidth: 150 }
417
- }) : e.expiryDate ? ee(e.expiryDate) : "—" }),
418
- A ? /* @__PURE__ */ d(b, {
419
- align: "right",
420
- children: e.buyPrice == null ? /* @__PURE__ */ d(C, {
421
- variant: "caption",
422
- color: "text.disabled",
423
- children: "—"
424
- }) : /* @__PURE__ */ d(a, {
425
- value: e.buyPrice,
426
- bold: !1
427
- })
428
- }) : null,
429
- /* @__PURE__ */ d(b, {
430
- align: "right",
431
- sx: {
432
- fontVariantNumeric: "tabular-nums",
433
- fontWeight: 700
434
- },
435
- children: e.requestedQuantity
436
- }),
437
- /* @__PURE__ */ d(b, {
438
- align: "right",
439
- children: $ ? /* @__PURE__ */ d(S, {
440
- size: "small",
441
- type: "number",
442
- inputProps: {
443
- min: 0,
444
- max: e.requestedQuantity,
445
- style: { textAlign: "right" }
446
- },
447
- value: R[e.id] ?? "",
448
- onChange: (t) => be(e.id, t.target.value),
449
- error: !!t,
450
- helperText: t || "",
451
- sx: { maxWidth: 110 }
452
- }) : /* @__PURE__ */ d(C, {
453
- sx: {
454
- fontVariantNumeric: "tabular-nums",
455
- fontWeight: 700
456
- },
457
- children: e.approvedQuantity == null ? "—" : e.approvedQuantity
458
- })
459
- }),
460
- j.ownerType === "FACILITY" ? /* @__PURE__ */ d(b, { children: e.storageUnitName || "—" }) : null
461
- ] }, e.id);
462
- }) })]
463
- }),
464
- $ ? /* @__PURE__ */ f(u, { children: [
465
- /* @__PURE__ */ d(v, { sx: { my: 2 } }),
466
- /* @__PURE__ */ f(y, {
467
- direction: {
468
- xs: "column",
469
- md: "row"
470
- },
471
- spacing: 2,
472
- alignItems: { md: "flex-start" },
473
- children: [/* @__PURE__ */ d(S, {
474
- fullWidth: !0,
475
- size: "small",
476
- label: "Decision notes (optional)",
477
- placeholder: "Rationale shown to the requester",
478
- value: W,
479
- onChange: (e) => G(e.target.value),
480
- multiline: !0,
481
- minRows: 2
482
- }), A && J != null ? /* @__PURE__ */ f(m, {
483
- sx: (e) => ({
484
- minWidth: 220,
485
- p: 1.5,
486
- borderRadius: 1.5,
487
- border: "1px solid",
488
- borderColor: "divider",
489
- bgcolor: ue(e.palette.primary.main, .04),
490
- textAlign: "right"
491
- }),
492
- children: [/* @__PURE__ */ d(C, {
493
- variant: "caption",
494
- color: "text.secondary",
495
- sx: {
496
- display: "block",
497
- fontWeight: 800,
498
- textTransform: "uppercase",
499
- letterSpacing: .6
500
- },
501
- children: "Total if approved"
502
- }), /* @__PURE__ */ d(a, {
503
- value: Number(J.toFixed(2)),
504
- size: "big"
505
- })]
506
- }) : null]
507
- }),
508
- /* @__PURE__ */ f(y, {
509
- direction: "row",
510
- spacing: 1,
511
- justifyContent: "flex-end",
512
- sx: { mt: 2 },
513
- children: [/* @__PURE__ */ d(h, {
514
- variant: "outlined",
515
- color: "error",
516
- startIcon: /* @__PURE__ */ d(ge, {}),
517
- disabled: P,
518
- onClick: () => {
519
- Y();
520
- },
521
- children: "Set all to 0"
522
- }), /* @__PURE__ */ d(h, {
523
- variant: "contained",
524
- startIcon: /* @__PURE__ */ d(he, {}),
525
- disabled: P || !we,
526
- onClick: () => void Te(),
527
- children: P ? "Submitting…" : "Submit Decision"
528
- })]
529
- })
530
- ] }) : null,
531
- q && !k ? /* @__PURE__ */ d(y, {
532
- direction: "row",
533
- spacing: 1,
534
- justifyContent: "flex-end",
535
- sx: { mt: 2 },
536
- children: /* @__PURE__ */ d(h, {
537
- variant: "outlined",
538
- color: "error",
539
- startIcon: /* @__PURE__ */ d(_e, {}),
540
- disabled: P,
541
- onClick: () => void Ee(),
542
- children: P ? "Cancelling…" : "Cancel Request"
543
- })
544
- }) : null,
545
- j.approvedPurchaseId ? /* @__PURE__ */ f(p, {
546
- severity: "success",
547
- sx: { mt: 2 },
548
- children: [
549
- "Stock was added to inventory under purchase id ",
550
- /* @__PURE__ */ d("strong", { children: j.approvedPurchaseId }),
551
- "."
552
- ]
553
- }) : null
554
- ]
555
- })
556
- })] }) : null]
557
- })
558
- })] });
559
- }
560
- function D({ label: e, children: t }) {
561
- return /* @__PURE__ */ f(y, {
562
- direction: "row",
563
- spacing: 1,
564
- sx: { minWidth: 0 },
565
- children: [/* @__PURE__ */ d(C, {
566
- variant: "caption",
567
- color: "text.secondary",
568
- sx: {
569
- minWidth: 100,
570
- fontWeight: 700,
571
- textTransform: "uppercase",
572
- letterSpacing: .5
573
- },
574
- children: e
575
- }), /* @__PURE__ */ d(C, {
576
- variant: "caption",
577
- sx: {
578
- minWidth: 0,
579
- fontWeight: 700
580
- },
581
- children: t
582
- })]
583
- });
584
- }
585
- //#endregion
586
- export { E as default };
587
-
588
- //# sourceMappingURL=PurchaseRequestDetailPage-52S6Nf7a.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PurchaseRequestDetailPage-52S6Nf7a.js","names":[],"sources":["../src/views/PurchaseRequestDetailPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport {\n Alert,\n Box,\n Button,\n Card,\n CardContent,\n Chip,\n Divider,\n Stack,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Typography,\n} from '@mui/material';\nimport { alpha } from '@mui/material/styles';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport ArrowBackRoundedIcon from '@mui/icons-material/ArrowBackRounded';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport CancelRoundedIcon from '@mui/icons-material/CancelRounded';\nimport DoNotDisturbRoundedIcon from '@mui/icons-material/DoNotDisturbRounded';\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 { PmFormSection, PmMoney, PmRef } from '@pm/components/PmTable';\nimport { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport {\n cancelPurchaseRequest,\n decidePurchaseRequest,\n getPurchaseRequest,\n} from '@pm/services/pmApi';\nimport { formatDate, formatDateTime } from '@pm/utils/format';\nimport { usePmSettings } from '@pm/utils/settingsStore';\n\nfunction statusChipColor(status) {\n switch (status) {\n case 'PENDING': return 'info';\n case 'APPROVED': return 'success';\n case 'PARTIALLY_APPROVED': return 'warning';\n case 'REJECTED': return 'error';\n case 'CANCELLED': return 'default';\n default: return 'default';\n }\n}\n\nfunction prettyStatus(status) {\n if (!status) return '';\n return status\n .toLowerCase()\n .split('_')\n .map((p) => p.charAt(0).toUpperCase() + p.slice(1))\n .join(' ');\n}\n\nexport default function PurchaseRequestDetailPage() {\n const navigate = useNavigate();\n const { requestId } = useParams();\n const perms = usePmPermissions();\n const canDecide = perms.has('approve.manage.productManagement.purchase');\n const settings = usePmSettings();\n const manageAmounts = settings?.managePurchaseAmounts !== false;\n\n const [request, setRequest] = useState(null);\n const [loading, setLoading] = useState(true);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState('');\n // Per-line approved quantities the approver is currently editing. Keyed by\n // item.id so the controls stay decoupled from order in the source list.\n const [approvedDraft, setApprovedDraft] = useState({});\n // Per-line lot numbers the approver fills at decision time — the requester\n // doesn't have the goods yet, so they don't know what lot will be shipped.\n // The approver enters this when confirming receipt.\n const [lotDraft, setLotDraft] = useState({});\n // Same logic for expiry — the requester can't read the expiry off a vial\n // they don't have. Captured by the approver.\n const [expiryDraft, setExpiryDraft] = useState({});\n const [decisionNotes, setDecisionNotes] = useState('');\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const data = await getPurchaseRequest(requestId);\n setRequest(data);\n // Seed the draft with full approval — the typical case is \"approve everything\".\n const draft = {};\n const lots = {};\n const expiries = {};\n (data?.items ?? []).forEach((it) => {\n draft[it.id] = String(it.approvedQuantity != null ? it.approvedQuantity : it.requestedQuantity);\n lots[it.id] = it.lotNumber ?? '';\n // Expiry from the existing item, normalized to yyyy-MM-dd for the date input.\n expiries[it.id] = it.expiryDate ? new Date(it.expiryDate).toISOString().substring(0, 10) : '';\n });\n setApprovedDraft(draft);\n setLotDraft(lots);\n setExpiryDraft(expiries);\n setDecisionNotes(data?.decisionNotes ?? '');\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to load purchase request');\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect(\n ['view.manage.productManagement.purchase', 'approve.manage.productManagement.purchase'],\n () => { void load(); },\n [requestId],\n );\n\n const isPending = request?.status === 'PENDING';\n\n // Sum the *approved* dollars for the in-flight decision so the approver\n // can see the cost of what they're about to confirm.\n const approvedTotal = useMemo(() => {\n if (!request || !manageAmounts) return null;\n let total = 0;\n let priced = false;\n (request.items ?? []).forEach((it) => {\n const qty = Number(approvedDraft[it.id] ?? 0);\n if (!Number.isFinite(qty) || qty <= 0) return;\n if (it.buyPrice == null) return;\n total += Number(it.buyPrice) * qty;\n priced = true;\n });\n return priced ? total : null;\n }, [request, approvedDraft, manageAmounts]);\n\n function patchDraft(itemId, value) {\n setApprovedDraft((d) => ({ ...d, [itemId]: value }));\n }\n\n function patchLot(itemId, value) {\n setLotDraft((d) => ({ ...d, [itemId]: value }));\n }\n\n function patchExpiry(itemId, value) {\n setExpiryDraft((d) => ({ ...d, [itemId]: value }));\n }\n\n function setAllToRequested() {\n if (!request) return;\n const draft = {};\n request.items.forEach((it) => { draft[it.id] = String(it.requestedQuantity); });\n setApprovedDraft(draft);\n }\n\n function setAllToZero() {\n if (!request) return;\n const draft = {};\n request.items.forEach((it) => { draft[it.id] = '0'; });\n setApprovedDraft(draft);\n }\n\n // Validates each line's approved qty is an integer in [0, requestedQty].\n // Returns a per-id error map; empty means \"ready to submit\".\n const draftErrors = useMemo(() => {\n if (!request) return {};\n const errs = {};\n (request.items ?? []).forEach((it) => {\n const raw = approvedDraft[it.id];\n if (raw == null || raw === '') {\n errs[it.id] = 'Required';\n return;\n }\n const n = Number(raw);\n if (!Number.isInteger(n) || n < 0) errs[it.id] = 'Must be 0 or a positive whole number';\n else if (n > it.requestedQuantity) errs[it.id] = `At most ${it.requestedQuantity}`;\n });\n return errs;\n }, [request, approvedDraft]);\n // Lot is required on every line the approver is approving (>0). Rejected\n // lines don't need a lot since no stock lands.\n const lotErrors = useMemo(() => {\n if (!request) return {};\n const errs = {};\n (request.items ?? []).forEach((it) => {\n const qty = Number(approvedDraft[it.id] ?? 0);\n if (!Number.isFinite(qty) || qty <= 0) return;\n const lot = (lotDraft[it.id] ?? '').trim();\n if (!lot) errs[it.id] = 'Lot is required when approving this line';\n });\n return errs;\n }, [request, approvedDraft, lotDraft]);\n // Expiry mirrors lot — required for any approved line, must be in the future.\n const expiryErrors = useMemo(() => {\n if (!request) return {};\n const errs = {};\n const todayStr = new Date().toISOString().substring(0, 10);\n (request.items ?? []).forEach((it) => {\n const qty = Number(approvedDraft[it.id] ?? 0);\n if (!Number.isFinite(qty) || qty <= 0) return;\n const exp = (expiryDraft[it.id] ?? '').trim();\n if (!exp) {\n errs[it.id] = 'Expiry is required when approving this line';\n } else if (exp < todayStr) {\n errs[it.id] = 'Expiry must be today or later';\n }\n });\n return errs;\n }, [request, approvedDraft, expiryDraft]);\n const draftIsClean = Object.keys(draftErrors).length === 0\n && Object.keys(lotErrors).length === 0\n && Object.keys(expiryErrors).length === 0;\n\n async function submit() {\n if (!draftIsClean || !request) return;\n setSubmitting(true);\n setError('');\n try {\n const updated = await decidePurchaseRequest(request.id, {\n decisionNotes: decisionNotes || null,\n items: request.items.map((it) => {\n const lot = (lotDraft[it.id] ?? '').trim();\n const exp = (expiryDraft[it.id] ?? '').trim();\n return {\n itemId: it.id,\n approvedQuantity: Number(approvedDraft[it.id]),\n lotNumber: lot ? lot : null,\n expiryDate: exp ? exp : null,\n };\n }),\n });\n setRequest(updated);\n showToast({ message: `Request ${prettyStatus(updated.status).toLowerCase()}.`, type: 'success' });\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to submit decision');\n } finally {\n setSubmitting(false);\n }\n }\n\n async function cancel() {\n if (!request) return;\n setSubmitting(true);\n setError('');\n try {\n const updated = await cancelPurchaseRequest(request.id);\n setRequest(updated);\n showToast({ message: 'Request cancelled.', type: 'success' });\n } catch (err) {\n setError(err?.response?.data?.message ?? err?.message ?? 'Failed to cancel request');\n } finally {\n setSubmitting(false);\n }\n }\n\n // Coarse-grained UI states for the approver: clean PENDING + decide perm →\n // show the editable decision form. Otherwise the same table is shown\n // read-only with the historical approved quantities.\n const showDecisionForm = isPending && canDecide;\n\n return (\n <Box>\n <PmNav />\n <PmGuard anyOf={['view.manage.productManagement.purchase', 'approve.manage.productManagement.purchase']}>\n <PmPageShell\n title={request?.serialId ? `Purchase Request #${request.serialId}` : 'Purchase Request'}\n subtitle=\"Approve or reject each item. Your decision closes the entire request.\"\n chips={request?.status ? [prettyStatus(request.status)] : []}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<ArrowBackRoundedIcon />} onClick={() => navigate('/ui/medplat/manage/pm/purchase-requests')}>Back</Button>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n {!loading && request ? (\n <>\n {/* ---------- Summary ---------- */}\n <Card sx={{ borderRadius: 1.5, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={2} alignItems={{ md: 'flex-start' }}>\n <Box sx={{ flexGrow: 1, minWidth: 0 }}>\n <Stack direction=\"row\" alignItems=\"center\" spacing={1.5} sx={{ mb: 0.5 }}>\n <PmRef id={request.serialId} />\n <Chip size=\"small\" label={prettyStatus(request.status)} color={statusChipColor(request.status)} />\n <Typography variant=\"caption\" color=\"text.secondary\">{request.ownerType}</Typography>\n </Stack>\n <Typography variant=\"h6\" sx={{ fontWeight: 800 }}>\n {request.ownerName || (request.ownerType === 'USER' ? 'Personal' : 'Facility')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n For purchase date {formatDate(request.purchaseDate)}\n </Typography>\n </Box>\n <Stack spacing={0.25} sx={{ minWidth: 260 }}>\n <Row label=\"Requested by\">{request.requestedByName || `#${request.requestedBy}`}</Row>\n <Row label=\"Requested on\">{formatDateTime(request.requestedOn)}</Row>\n {request.decidedBy ? (\n <>\n <Row label=\"Decided by\">{request.decidedByName || `#${request.decidedBy}`}</Row>\n <Row label=\"Decided on\">{formatDateTime(request.decidedOn)}</Row>\n </>\n ) : null}\n {request.paymentMode ? <Row label=\"Payment\">{request.paymentMode}</Row> : null}\n </Stack>\n </Stack>\n {request.notes ? (\n <>\n <Divider sx={{ my: 1.5 }} />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5, fontWeight: 700, textTransform: 'uppercase', letterSpacing: 0.6 }}>\n Requester notes\n </Typography>\n <Typography variant=\"body2\">{request.notes}</Typography>\n </>\n ) : null}\n {request.decisionNotes ? (\n <>\n <Divider sx={{ my: 1.5 }} />\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mb: 0.5, fontWeight: 700, textTransform: 'uppercase', letterSpacing: 0.6 }}>\n Decision notes\n </Typography>\n <Typography variant=\"body2\">{request.decisionNotes}</Typography>\n </>\n ) : null}\n </CardContent>\n </Card>\n\n {/* ---------- Line items ---------- */}\n <Card sx={{ borderRadius: 1.5, mb: 2, border: '1px solid', borderColor: 'divider', boxShadow: '0 12px 32px rgba(15, 23, 42, 0.045)' }}>\n <CardContent sx={{ p: 2.5 }}>\n <Stack direction={{ xs: 'column', md: 'row' }} alignItems={{ md: 'flex-end' }} justifyContent=\"space-between\" sx={{ mb: 1.5 }}>\n <PmFormSection\n eyebrow=\"Lines\"\n title={showDecisionForm ? 'Decide per-line quantities' : 'Requested items'}\n hint={showDecisionForm\n ? 'Enter 0 to reject an item, or less than requested to partially approve.'\n : null}\n />\n {showDecisionForm ? (\n <Stack direction=\"row\" spacing={1}>\n <Button size=\"small\" variant=\"outlined\" onClick={setAllToRequested}>Approve all</Button>\n <Button size=\"small\" variant=\"outlined\" color=\"error\" onClick={setAllToZero}>Reject all</Button>\n </Stack>\n ) : null}\n </Stack>\n\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Product</TableCell>\n <TableCell>Lot</TableCell>\n <TableCell>Expiry</TableCell>\n {manageAmounts ? <TableCell align=\"right\">Buy Price</TableCell> : null}\n <TableCell align=\"right\">Requested</TableCell>\n <TableCell align=\"right\">{showDecisionForm ? 'Approve' : 'Approved'}</TableCell>\n {request.ownerType === 'FACILITY' ? <TableCell>Storage</TableCell> : null}\n </TableRow>\n </TableHead>\n <TableBody>\n {request.items.map((it) => {\n const lineErr = draftErrors[it.id];\n const lotErr = lotErrors[it.id];\n const expiryErr = expiryErrors[it.id];\n const approveQty = Number(approvedDraft[it.id] ?? 0);\n const lotInputActive = showDecisionForm && Number.isFinite(approveQty) && approveQty > 0;\n return (\n <TableRow key={it.id}>\n <TableCell sx={{ fontWeight: 700 }}>{it.productName}</TableCell>\n <TableCell sx={{ fontFamily: 'monospace', fontSize: '0.78rem' }}>\n {showDecisionForm ? (\n <TextField\n size=\"small\"\n placeholder=\"Enter lot\"\n value={lotDraft[it.id] ?? ''}\n onChange={(e) => patchLot(it.id, e.target.value)}\n disabled={!lotInputActive}\n error={!!lotErr}\n helperText={lotErr || (lotInputActive ? '' : 'Approve qty > 0 to enter lot')}\n inputProps={{ style: { fontFamily: 'monospace', fontSize: '0.78rem' } }}\n sx={{ minWidth: 140 }}\n />\n ) : (it.lotNumber || '—')}\n </TableCell>\n <TableCell>\n {showDecisionForm ? (\n <TextField\n size=\"small\"\n type=\"date\"\n InputLabelProps={{ shrink: true }}\n value={expiryDraft[it.id] ?? ''}\n onChange={(e) => patchExpiry(it.id, e.target.value)}\n disabled={!lotInputActive}\n error={!!expiryErr}\n helperText={expiryErr || (lotInputActive ? '' : '')}\n sx={{ minWidth: 150 }}\n />\n ) : (it.expiryDate ? formatDate(it.expiryDate) : '—')}\n </TableCell>\n {manageAmounts ? (\n <TableCell align=\"right\">\n {it.buyPrice != null ? <PmMoney value={it.buyPrice} bold={false} /> : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n ) : null}\n <TableCell align=\"right\" sx={{ fontVariantNumeric: 'tabular-nums', fontWeight: 700 }}>\n {it.requestedQuantity}\n </TableCell>\n <TableCell align=\"right\">\n {showDecisionForm ? (\n <TextField\n size=\"small\"\n type=\"number\"\n inputProps={{ min: 0, max: it.requestedQuantity, style: { textAlign: 'right' } }}\n value={approvedDraft[it.id] ?? ''}\n onChange={(e) => patchDraft(it.id, e.target.value)}\n error={!!lineErr}\n helperText={lineErr || ''}\n sx={{ maxWidth: 110 }}\n />\n ) : (\n <Typography sx={{ fontVariantNumeric: 'tabular-nums', fontWeight: 700 }}>\n {it.approvedQuantity == null ? '—' : it.approvedQuantity}\n </Typography>\n )}\n </TableCell>\n {request.ownerType === 'FACILITY' ? (\n <TableCell>{it.storageUnitName || '—'}</TableCell>\n ) : null}\n </TableRow>\n );\n })}\n </TableBody>\n </Table>\n\n {showDecisionForm ? (\n <>\n <Divider sx={{ my: 2 }} />\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={2} alignItems={{ md: 'flex-start' }}>\n <TextField\n fullWidth\n size=\"small\"\n label=\"Decision notes (optional)\"\n placeholder=\"Rationale shown to the requester\"\n value={decisionNotes}\n onChange={(e) => setDecisionNotes(e.target.value)}\n multiline\n minRows={2}\n />\n {manageAmounts && approvedTotal != null ? (\n <Box sx={(t) => ({\n minWidth: 220,\n p: 1.5,\n borderRadius: 1.5,\n border: '1px solid',\n borderColor: 'divider',\n bgcolor: alpha(t.palette.primary.main, 0.04),\n textAlign: 'right',\n })}>\n <Typography variant=\"caption\" color=\"text.secondary\"\n sx={{ display: 'block', fontWeight: 800, textTransform: 'uppercase', letterSpacing: 0.6 }}>\n Total if approved\n </Typography>\n <PmMoney value={Number(approvedTotal.toFixed(2))} size=\"big\" />\n </Box>\n ) : null}\n </Stack>\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\" sx={{ mt: 2 }}>\n <Button\n variant=\"outlined\" color=\"error\" startIcon={<CancelRoundedIcon />}\n disabled={submitting}\n onClick={() => { setAllToZero(); }}\n >\n Set all to 0\n </Button>\n <Button\n variant=\"contained\" startIcon={<CheckCircleRoundedIcon />}\n disabled={submitting || !draftIsClean}\n onClick={() => void submit()}\n >\n {submitting ? 'Submitting…' : 'Submit Decision'}\n </Button>\n </Stack>\n </>\n ) : null}\n\n {/* Requester withdrawal — only on PENDING + only when the\n current user is the original requester. The backend\n enforces this too; the UI just hides the button when it's\n not applicable. */}\n {isPending && !canDecide ? (\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\" sx={{ mt: 2 }}>\n <Button\n variant=\"outlined\" color=\"error\" startIcon={<DoNotDisturbRoundedIcon />}\n disabled={submitting} onClick={() => void cancel()}\n >\n {submitting ? 'Cancelling…' : 'Cancel Request'}\n </Button>\n </Stack>\n ) : null}\n\n {request.approvedPurchaseId ? (\n <Alert severity=\"success\" sx={{ mt: 2 }}>\n Stock was added to inventory under purchase id <strong>{request.approvedPurchaseId}</strong>.\n </Alert>\n ) : null}\n </CardContent>\n </Card>\n </>\n ) : null}\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n\nfunction Row({ label, children }) {\n return (\n <Stack direction=\"row\" spacing={1} sx={{ minWidth: 0 }}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ minWidth: 100, fontWeight: 700, textTransform: 'uppercase', letterSpacing: 0.5 }}>\n {label}\n </Typography>\n <Typography variant=\"caption\" sx={{ minWidth: 0, fontWeight: 700 }}>\n {children}\n </Typography>\n </Stack>\n );\n}\n"],"mappings":"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"}