@argusoft/medplat-product-management 1.0.0
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-DCMCVvDY.js +334 -0
- package/dist/BrandsPage-DCMCVvDY.js.map +1 -0
- package/dist/CategoriesPage-BpRhwfrc.js +284 -0
- package/dist/CategoriesPage-BpRhwfrc.js.map +1 -0
- package/dist/DashboardPage-BNKUQj46.js +436 -0
- package/dist/DashboardPage-BNKUQj46.js.map +1 -0
- package/dist/FacilityPicker-Coi8I3yE.js +79 -0
- package/dist/FacilityPicker-Coi8I3yE.js.map +1 -0
- package/dist/InventoryPage-BR6jOzg2.js +517 -0
- package/dist/InventoryPage-BR6jOzg2.js.map +1 -0
- package/dist/MemberProfileCard-DbHZCS5n.js +272 -0
- package/dist/MemberProfileCard-DbHZCS5n.js.map +1 -0
- package/dist/PaymentCreatePage-Ci3ERnby.js +487 -0
- package/dist/PaymentCreatePage-Ci3ERnby.js.map +1 -0
- package/dist/PaymentsPage-sdg902zX.js +157 -0
- package/dist/PaymentsPage-sdg902zX.js.map +1 -0
- package/dist/PickupCreatePage-CieMsgWV.js +310 -0
- package/dist/PickupCreatePage-CieMsgWV.js.map +1 -0
- package/dist/PickupsPage-Ci2Ll0Kn.js +566 -0
- package/dist/PickupsPage-Ci2Ll0Kn.js.map +1 -0
- package/dist/PmGuard-CjJBisaN.js +1195 -0
- package/dist/PmGuard-CjJBisaN.js.map +1 -0
- package/dist/PmTable-BuXZQZCU.js +302 -0
- package/dist/PmTable-BuXZQZCU.js.map +1 -0
- package/dist/ProductEditPage-DL8gy85Y.js +666 -0
- package/dist/ProductEditPage-DL8gy85Y.js.map +1 -0
- package/dist/ProductsPage-BANTKxLb.js +221 -0
- package/dist/ProductsPage-BANTKxLb.js.map +1 -0
- package/dist/PurchaseCreatePage-C3KMfBxJ.js +626 -0
- package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +1 -0
- package/dist/PurchaseRequestDetailPage-C0GYFJDl.js +586 -0
- package/dist/PurchaseRequestDetailPage-C0GYFJDl.js.map +1 -0
- package/dist/PurchaseRequestsPage-DvFH_tWe.js +265 -0
- package/dist/PurchaseRequestsPage-DvFH_tWe.js.map +1 -0
- package/dist/PurchasesPage-BCvLvSp4.js +295 -0
- package/dist/PurchasesPage-BCvLvSp4.js.map +1 -0
- package/dist/SaleCreatePage-DpkQMoTq.js +548 -0
- package/dist/SaleCreatePage-DpkQMoTq.js.map +1 -0
- package/dist/SalesPage-DUwgkEO-.js +315 -0
- package/dist/SalesPage-DUwgkEO-.js.map +1 -0
- package/dist/SettingsPage-CusC0jqJ.js +710 -0
- package/dist/SettingsPage-CusC0jqJ.js.map +1 -0
- package/dist/StorageUnitsPage-BlC2AgrJ.js +469 -0
- package/dist/StorageUnitsPage-BlC2AgrJ.js.map +1 -0
- package/dist/TransactionsPage-DDaK4VyY.js +714 -0
- package/dist/TransactionsPage-DDaK4VyY.js.map +1 -0
- package/dist/TransferCreatePage-BxudLfhS.js +363 -0
- package/dist/TransferCreatePage-BxudLfhS.js.map +1 -0
- package/dist/TransfersPage-zgmt7teZ.js +480 -0
- package/dist/TransfersPage-zgmt7teZ.js.map +1 -0
- package/dist/VialsPage-CjqPfgpV.js +855 -0
- package/dist/VialsPage-CjqPfgpV.js.map +1 -0
- package/dist/constants-BrA_hfAI.js +254 -0
- package/dist/constants-BrA_hfAI.js.map +1 -0
- package/dist/currency-BDDCDgeE.js +169 -0
- package/dist/currency-BDDCDgeE.js.map +1 -0
- package/dist/format-UOyOu75i.js +52 -0
- package/dist/format-UOyOu75i.js.map +1 -0
- package/dist/index.js +45 -0
- package/dist/index.js.map +1 -0
- package/dist/useFieldErrors-hDG8ox_x.js +29 -0
- package/dist/useFieldErrors-hDG8ox_x.js.map +1 -0
- package/dist/validation-Ba7puFIO.js +109 -0
- package/dist/validation-Ba7puFIO.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { I as e, J as t, N as n, a as ee, g as r, i, m as te, n as ne, r as re, t as ie } from "./PmGuard-CjJBisaN.js";
|
|
2
|
+
import { a as ae, i as oe, o as se, t as ce } from "./PmTable-BuXZQZCU.js";
|
|
3
|
+
import { n as le, t as a } from "./format-UOyOu75i.js";
|
|
4
|
+
import { c as ue, p as de } from "./constants-BrA_hfAI.js";
|
|
5
|
+
import { useMemo as o, useState as s } from "react";
|
|
6
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
7
|
+
import { Alert as u, Box as d, Button as f, Chip as fe, Dialog as p, DialogActions as m, DialogContent as h, DialogTitle as g, FormControl as pe, FormHelperText as me, InputAdornment as he, InputLabel as ge, MenuItem as _, Select as _e, Skeleton as ve, Stack as v, Tab as y, TableBody as ye, TableCell as b, TableHead as be, TableRow as x, Tabs as xe, TextField as S, Typography as C } from "@mui/material";
|
|
8
|
+
import w from "@mui/icons-material/AddRounded";
|
|
9
|
+
import Se from "@mui/icons-material/RefreshRounded";
|
|
10
|
+
import { showToast as T } from "@/common/toaster/toaster";
|
|
11
|
+
import { useNavigate as Ce } from "react-router-dom";
|
|
12
|
+
import { alpha as E } from "@mui/material/styles";
|
|
13
|
+
import we from "@mui/icons-material/SwapHorizRounded";
|
|
14
|
+
import Te from "@mui/icons-material/SearchRounded";
|
|
15
|
+
import D from "@mui/icons-material/CheckCircleRounded";
|
|
16
|
+
import O from "@mui/icons-material/DoNotDisturbRounded";
|
|
17
|
+
//#region src/views/TransfersPage.jsx
|
|
18
|
+
function Ee(e) {
|
|
19
|
+
switch (e) {
|
|
20
|
+
case "PENDING": return "info";
|
|
21
|
+
case "COMPLETED": return "success";
|
|
22
|
+
case "CANCELLED": return "default";
|
|
23
|
+
default: return "default";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function k() {
|
|
27
|
+
let k = Ce(), A = i().has("update.manage.productManagement.transfer"), [j, De] = s([]), [Oe, ke] = s([]), [M, Ae] = s(() => /* @__PURE__ */ new Set()), [N, P] = s(!0), [F, I] = s(""), [L, je] = s("all"), [R, Me] = s(""), [z, B] = s({
|
|
28
|
+
open: !1,
|
|
29
|
+
transfer: null
|
|
30
|
+
}), [V, H] = s({
|
|
31
|
+
destStorageUnitId: "",
|
|
32
|
+
notes: ""
|
|
33
|
+
}), [U, W] = s({
|
|
34
|
+
open: !1,
|
|
35
|
+
transfer: null
|
|
36
|
+
}), [G, K] = s(""), [q, J] = s(!1);
|
|
37
|
+
async function Y() {
|
|
38
|
+
P(!0), I("");
|
|
39
|
+
try {
|
|
40
|
+
let [ee, r, i] = await Promise.all([
|
|
41
|
+
t(),
|
|
42
|
+
n({ activeOnly: !0 }).catch(() => []),
|
|
43
|
+
e().catch(() => [])
|
|
44
|
+
]);
|
|
45
|
+
De(ee), ke(r), Ae(new Set(i.map((e) => e.id)));
|
|
46
|
+
} catch (e) {
|
|
47
|
+
let t = e?.response?.data?.message ?? e?.message ?? "Failed to load transfers";
|
|
48
|
+
I(t), T({
|
|
49
|
+
message: t,
|
|
50
|
+
type: "error"
|
|
51
|
+
});
|
|
52
|
+
} finally {
|
|
53
|
+
P(!1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
re("view.manage.productManagement.transfer", () => {
|
|
57
|
+
Y();
|
|
58
|
+
}, []);
|
|
59
|
+
let Ne = o(() => ({
|
|
60
|
+
incoming: j.filter((e) => e.status === "PENDING").length,
|
|
61
|
+
outgoing: j.filter((e) => e.status === "PENDING").length
|
|
62
|
+
}), [j]), X = o(() => {
|
|
63
|
+
let e = j;
|
|
64
|
+
L === "incoming" && (e = e.filter((e) => e.status === "PENDING")), L === "outgoing" && (e = e.filter((e) => e.status === "PENDING"));
|
|
65
|
+
let t = R.trim().toLowerCase();
|
|
66
|
+
return t && (e = e.filter((e) => `${e.productName ?? ""} ${e.sourceFacilityName ?? ""} ${e.destFacilityName ?? ""} ${e.lotNumber ?? ""} ${e.notes ?? ""}`.toLowerCase().includes(t))), e;
|
|
67
|
+
}, [
|
|
68
|
+
j,
|
|
69
|
+
L,
|
|
70
|
+
R
|
|
71
|
+
]);
|
|
72
|
+
function Pe(e) {
|
|
73
|
+
H({
|
|
74
|
+
destStorageUnitId: e.destStorageUnitId ?? "",
|
|
75
|
+
notes: ""
|
|
76
|
+
}), B({
|
|
77
|
+
open: !0,
|
|
78
|
+
transfer: e
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function Z() {
|
|
82
|
+
q || B({
|
|
83
|
+
open: !1,
|
|
84
|
+
transfer: null
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function Fe(e) {
|
|
88
|
+
K(""), W({
|
|
89
|
+
open: !0,
|
|
90
|
+
transfer: e
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
function Q() {
|
|
94
|
+
q || W({
|
|
95
|
+
open: !1,
|
|
96
|
+
transfer: null
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
let $ = o(() => z.transfer ? Oe.filter((e) => e.ownerId === z.transfer.destFacilityId) : [], [Oe, z.transfer]);
|
|
100
|
+
async function Ie() {
|
|
101
|
+
if (z.transfer) {
|
|
102
|
+
J(!0);
|
|
103
|
+
try {
|
|
104
|
+
await r(z.transfer.id, {
|
|
105
|
+
destStorageUnitId: V.destStorageUnitId || null,
|
|
106
|
+
notes: V.notes || null
|
|
107
|
+
}), T({
|
|
108
|
+
message: "Transfer confirmed — stock landed at the destination.",
|
|
109
|
+
type: "success"
|
|
110
|
+
}), Z(), await Y();
|
|
111
|
+
} catch (e) {
|
|
112
|
+
T({
|
|
113
|
+
message: e?.response?.data?.message ?? e?.message ?? "Failed to confirm transfer",
|
|
114
|
+
type: "error"
|
|
115
|
+
});
|
|
116
|
+
} finally {
|
|
117
|
+
J(!1);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
async function Le() {
|
|
122
|
+
if (U.transfer) {
|
|
123
|
+
J(!0);
|
|
124
|
+
try {
|
|
125
|
+
await te(U.transfer.id, { notes: G || null }), T({
|
|
126
|
+
message: "Transfer cancelled — stock returned to the source.",
|
|
127
|
+
type: "success"
|
|
128
|
+
}), Q(), await Y();
|
|
129
|
+
} catch (e) {
|
|
130
|
+
T({
|
|
131
|
+
message: e?.response?.data?.message ?? e?.message ?? "Failed to cancel transfer",
|
|
132
|
+
type: "error"
|
|
133
|
+
});
|
|
134
|
+
} finally {
|
|
135
|
+
J(!1);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return /* @__PURE__ */ l(d, { children: [
|
|
140
|
+
/* @__PURE__ */ c(ne, {}),
|
|
141
|
+
/* @__PURE__ */ c(ie, {
|
|
142
|
+
perm: "view.manage.productManagement.transfer",
|
|
143
|
+
children: /* @__PURE__ */ l(ee, {
|
|
144
|
+
title: "Stock Transfers",
|
|
145
|
+
subtitle: "Stock movements between facilities. The sender loses stock when shipping. The receiver gains it when they confirm.",
|
|
146
|
+
actions: /* @__PURE__ */ l(v, {
|
|
147
|
+
direction: "row",
|
|
148
|
+
spacing: 1,
|
|
149
|
+
children: [/* @__PURE__ */ c(f, {
|
|
150
|
+
variant: "outlined",
|
|
151
|
+
startIcon: /* @__PURE__ */ c(Se, {}),
|
|
152
|
+
onClick: () => void Y(),
|
|
153
|
+
children: "Refresh"
|
|
154
|
+
}), A ? /* @__PURE__ */ c(f, {
|
|
155
|
+
variant: "contained",
|
|
156
|
+
startIcon: /* @__PURE__ */ c(w, {}),
|
|
157
|
+
onClick: () => k("/ui/medplat/manage/pm/transfers/new"),
|
|
158
|
+
children: "New Transfer"
|
|
159
|
+
}) : null]
|
|
160
|
+
}),
|
|
161
|
+
children: [F ? /* @__PURE__ */ c(u, {
|
|
162
|
+
severity: "error",
|
|
163
|
+
sx: { mb: 2 },
|
|
164
|
+
children: F
|
|
165
|
+
}) : null, /* @__PURE__ */ l(se, {
|
|
166
|
+
eyebrow: "Operations",
|
|
167
|
+
title: "Transfers",
|
|
168
|
+
subtitle: N ? "Loading…" : `${X.length} ${X.length === 1 ? "transfer" : "transfers"}`,
|
|
169
|
+
children: [/* @__PURE__ */ l(v, {
|
|
170
|
+
direction: {
|
|
171
|
+
xs: "column",
|
|
172
|
+
md: "row"
|
|
173
|
+
},
|
|
174
|
+
spacing: 1.5,
|
|
175
|
+
sx: { mb: 2 },
|
|
176
|
+
alignItems: { md: "center" },
|
|
177
|
+
children: [
|
|
178
|
+
/* @__PURE__ */ l(xe, {
|
|
179
|
+
value: L,
|
|
180
|
+
onChange: (e, t) => je(t),
|
|
181
|
+
sx: { minHeight: 40 },
|
|
182
|
+
children: [/* @__PURE__ */ c(y, {
|
|
183
|
+
value: "all",
|
|
184
|
+
label: `All${j.length ? ` (${j.length})` : ""}`,
|
|
185
|
+
sx: {
|
|
186
|
+
minHeight: 40,
|
|
187
|
+
textTransform: "none",
|
|
188
|
+
fontWeight: 700
|
|
189
|
+
}
|
|
190
|
+
}), /* @__PURE__ */ c(y, {
|
|
191
|
+
value: "incoming",
|
|
192
|
+
label: `Pending${Ne.incoming ? ` (${Ne.incoming})` : ""}`,
|
|
193
|
+
sx: {
|
|
194
|
+
minHeight: 40,
|
|
195
|
+
textTransform: "none",
|
|
196
|
+
fontWeight: 700
|
|
197
|
+
}
|
|
198
|
+
})]
|
|
199
|
+
}),
|
|
200
|
+
/* @__PURE__ */ c(d, { sx: { flexGrow: 1 } }),
|
|
201
|
+
/* @__PURE__ */ c(S, {
|
|
202
|
+
size: "small",
|
|
203
|
+
fullWidth: !0,
|
|
204
|
+
placeholder: "Search by product, facility, lot, notes…",
|
|
205
|
+
value: R,
|
|
206
|
+
onChange: (e) => Me(e.target.value),
|
|
207
|
+
sx: { maxWidth: { md: 360 } },
|
|
208
|
+
InputProps: { startAdornment: /* @__PURE__ */ c(he, {
|
|
209
|
+
position: "start",
|
|
210
|
+
children: /* @__PURE__ */ c(Te, { fontSize: "small" })
|
|
211
|
+
}) }
|
|
212
|
+
})
|
|
213
|
+
]
|
|
214
|
+
}), /* @__PURE__ */ l(ae, {
|
|
215
|
+
dense: !0,
|
|
216
|
+
children: [/* @__PURE__ */ c(be, { children: /* @__PURE__ */ l(x, { children: [
|
|
217
|
+
/* @__PURE__ */ c(b, { children: "Ref" }),
|
|
218
|
+
/* @__PURE__ */ c(b, { children: "Product" }),
|
|
219
|
+
/* @__PURE__ */ c(b, { children: "From" }),
|
|
220
|
+
/* @__PURE__ */ c(b, { children: "To" }),
|
|
221
|
+
/* @__PURE__ */ c(b, {
|
|
222
|
+
align: "right",
|
|
223
|
+
children: "Qty"
|
|
224
|
+
}),
|
|
225
|
+
/* @__PURE__ */ c(b, { children: "Shipped" }),
|
|
226
|
+
/* @__PURE__ */ c(b, { children: "Status" }),
|
|
227
|
+
/* @__PURE__ */ c(b, {
|
|
228
|
+
align: "right",
|
|
229
|
+
children: "Action"
|
|
230
|
+
})
|
|
231
|
+
] }) }), /* @__PURE__ */ c(ye, { children: N ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ c(x, { children: Array.from({ length: 8 }).map((e, t) => /* @__PURE__ */ c(b, { children: /* @__PURE__ */ c(ve, { height: 22 }) }, t)) }, t)) : X.length === 0 ? /* @__PURE__ */ c(ce, {
|
|
232
|
+
colSpan: 8,
|
|
233
|
+
icon: we,
|
|
234
|
+
title: R.trim() === "" ? L === "incoming" ? "No pending transfers" : "No transfers yet" : "No transfers match your search",
|
|
235
|
+
hint: "Create a transfer to move stock between facilities.",
|
|
236
|
+
action: A ? /* @__PURE__ */ c(f, {
|
|
237
|
+
variant: "contained",
|
|
238
|
+
size: "small",
|
|
239
|
+
startIcon: /* @__PURE__ */ c(w, {}),
|
|
240
|
+
onClick: () => k("/ui/medplat/manage/pm/transfers/new"),
|
|
241
|
+
children: "Ship first transfer"
|
|
242
|
+
}) : null
|
|
243
|
+
}) : X.map((e) => /* @__PURE__ */ l(x, {
|
|
244
|
+
hover: !0,
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ c(b, { children: /* @__PURE__ */ c(oe, { id: e.serialId }) }),
|
|
247
|
+
/* @__PURE__ */ l(b, { children: [/* @__PURE__ */ c(C, {
|
|
248
|
+
variant: "body2",
|
|
249
|
+
sx: { fontWeight: 700 },
|
|
250
|
+
children: e.productName ?? "—"
|
|
251
|
+
}), e.lotNumber ? /* @__PURE__ */ c(C, {
|
|
252
|
+
variant: "caption",
|
|
253
|
+
sx: {
|
|
254
|
+
fontFamily: "monospace",
|
|
255
|
+
color: "text.secondary"
|
|
256
|
+
},
|
|
257
|
+
children: e.lotNumber
|
|
258
|
+
}) : null] }),
|
|
259
|
+
/* @__PURE__ */ c(b, { children: e.sourceFacilityName ?? "—" }),
|
|
260
|
+
/* @__PURE__ */ c(b, { children: e.destFacilityName ?? "—" }),
|
|
261
|
+
/* @__PURE__ */ c(b, {
|
|
262
|
+
align: "right",
|
|
263
|
+
children: /* @__PURE__ */ c(C, {
|
|
264
|
+
sx: {
|
|
265
|
+
fontWeight: 700,
|
|
266
|
+
fontVariantNumeric: "tabular-nums"
|
|
267
|
+
},
|
|
268
|
+
children: e.qty
|
|
269
|
+
})
|
|
270
|
+
}),
|
|
271
|
+
/* @__PURE__ */ l(b, { children: [/* @__PURE__ */ c(C, {
|
|
272
|
+
variant: "body2",
|
|
273
|
+
children: a(e.shippedOn)
|
|
274
|
+
}), /* @__PURE__ */ c(C, {
|
|
275
|
+
variant: "caption",
|
|
276
|
+
color: "text.secondary",
|
|
277
|
+
children: e.shippedByName ?? `#${e.shippedBy}`
|
|
278
|
+
})] }),
|
|
279
|
+
/* @__PURE__ */ c(b, { children: /* @__PURE__ */ c(fe, {
|
|
280
|
+
size: "small",
|
|
281
|
+
label: de(ue, e.status),
|
|
282
|
+
color: Ee(e.status)
|
|
283
|
+
}) }),
|
|
284
|
+
/* @__PURE__ */ c(b, {
|
|
285
|
+
align: "right",
|
|
286
|
+
children: (() => {
|
|
287
|
+
if (e.status !== "PENDING" || !A) return /* @__PURE__ */ c(C, {
|
|
288
|
+
variant: "caption",
|
|
289
|
+
color: "text.disabled",
|
|
290
|
+
children: "—"
|
|
291
|
+
});
|
|
292
|
+
let t = M.has(e.destFacilityId), n = M.has(e.sourceFacilityId);
|
|
293
|
+
return !t && !n ? /* @__PURE__ */ c(C, {
|
|
294
|
+
variant: "caption",
|
|
295
|
+
color: "text.disabled",
|
|
296
|
+
children: "—"
|
|
297
|
+
}) : /* @__PURE__ */ l(v, {
|
|
298
|
+
direction: "row",
|
|
299
|
+
spacing: 1,
|
|
300
|
+
justifyContent: "flex-end",
|
|
301
|
+
children: [t ? /* @__PURE__ */ c(f, {
|
|
302
|
+
size: "small",
|
|
303
|
+
variant: "outlined",
|
|
304
|
+
startIcon: /* @__PURE__ */ c(D, {}),
|
|
305
|
+
onClick: () => Pe(e),
|
|
306
|
+
children: "Confirm"
|
|
307
|
+
}) : null, n ? /* @__PURE__ */ c(f, {
|
|
308
|
+
size: "small",
|
|
309
|
+
variant: "outlined",
|
|
310
|
+
color: "error",
|
|
311
|
+
startIcon: /* @__PURE__ */ c(O, {}),
|
|
312
|
+
onClick: () => Fe(e),
|
|
313
|
+
children: "Cancel"
|
|
314
|
+
}) : null]
|
|
315
|
+
});
|
|
316
|
+
})()
|
|
317
|
+
})
|
|
318
|
+
]
|
|
319
|
+
}, e.id)) })]
|
|
320
|
+
})]
|
|
321
|
+
})]
|
|
322
|
+
})
|
|
323
|
+
}),
|
|
324
|
+
/* @__PURE__ */ l(p, {
|
|
325
|
+
open: z.open,
|
|
326
|
+
onClose: Z,
|
|
327
|
+
maxWidth: "sm",
|
|
328
|
+
fullWidth: !0,
|
|
329
|
+
children: [
|
|
330
|
+
/* @__PURE__ */ l(g, { children: ["Confirm transfer #", z.transfer?.serialId] }),
|
|
331
|
+
/* @__PURE__ */ c(h, { children: z.transfer ? /* @__PURE__ */ l(v, {
|
|
332
|
+
spacing: 2,
|
|
333
|
+
sx: { mt: 1 },
|
|
334
|
+
children: [
|
|
335
|
+
/* @__PURE__ */ l(d, {
|
|
336
|
+
sx: (e) => ({
|
|
337
|
+
p: 1.5,
|
|
338
|
+
borderRadius: 3,
|
|
339
|
+
bgcolor: E(e.palette.primary.main, .04),
|
|
340
|
+
border: `1px solid ${E(e.palette.primary.main, .12)}`
|
|
341
|
+
}),
|
|
342
|
+
children: [
|
|
343
|
+
/* @__PURE__ */ l(C, {
|
|
344
|
+
variant: "body2",
|
|
345
|
+
children: [
|
|
346
|
+
/* @__PURE__ */ c("strong", { children: z.transfer.productName }),
|
|
347
|
+
" · qty ",
|
|
348
|
+
z.transfer.qty
|
|
349
|
+
]
|
|
350
|
+
}),
|
|
351
|
+
/* @__PURE__ */ l(C, {
|
|
352
|
+
variant: "caption",
|
|
353
|
+
color: "text.secondary",
|
|
354
|
+
sx: { display: "block" },
|
|
355
|
+
children: [
|
|
356
|
+
"Shipped ",
|
|
357
|
+
le(z.transfer.shippedOn),
|
|
358
|
+
" by ",
|
|
359
|
+
z.transfer.shippedByName ?? `#${z.transfer.shippedBy}`,
|
|
360
|
+
" from ",
|
|
361
|
+
z.transfer.sourceFacilityName
|
|
362
|
+
]
|
|
363
|
+
}),
|
|
364
|
+
z.transfer.lotNumber ? /* @__PURE__ */ l(C, {
|
|
365
|
+
variant: "caption",
|
|
366
|
+
color: "text.secondary",
|
|
367
|
+
sx: {
|
|
368
|
+
display: "block",
|
|
369
|
+
mt: .5
|
|
370
|
+
},
|
|
371
|
+
children: [
|
|
372
|
+
"Lot ",
|
|
373
|
+
z.transfer.lotNumber,
|
|
374
|
+
z.transfer.expiryDate ? ` · expires ${a(z.transfer.expiryDate)}` : ""
|
|
375
|
+
]
|
|
376
|
+
}) : null
|
|
377
|
+
]
|
|
378
|
+
}),
|
|
379
|
+
/* @__PURE__ */ l(pe, {
|
|
380
|
+
required: !0,
|
|
381
|
+
size: "small",
|
|
382
|
+
disabled: $.length === 0,
|
|
383
|
+
error: !V.destStorageUnitId,
|
|
384
|
+
children: [
|
|
385
|
+
/* @__PURE__ */ c(ge, { children: "Landing Storage" }),
|
|
386
|
+
/* @__PURE__ */ l(_e, {
|
|
387
|
+
label: "Landing Storage",
|
|
388
|
+
value: V.destStorageUnitId,
|
|
389
|
+
onChange: (e) => H((t) => ({
|
|
390
|
+
...t,
|
|
391
|
+
destStorageUnitId: e.target.value
|
|
392
|
+
})),
|
|
393
|
+
children: [/* @__PURE__ */ c(_, {
|
|
394
|
+
value: "",
|
|
395
|
+
disabled: !0,
|
|
396
|
+
children: /* @__PURE__ */ c("em", { children: "— Pick a storage unit —" })
|
|
397
|
+
}), $.map((e) => /* @__PURE__ */ c(_, {
|
|
398
|
+
value: e.id,
|
|
399
|
+
children: e.unitName
|
|
400
|
+
}, e.id))]
|
|
401
|
+
}),
|
|
402
|
+
/* @__PURE__ */ c(me, { children: $.length === 0 ? "No storage units at this facility — add one on the Storage Units page first." : z.transfer?.destStorageUnitId ? "Sender suggested a unit (pre-filled). You can change it; cold-chain compatibility is checked server-side." : "Required. Cold-chain compatibility is checked server-side against the product." })
|
|
403
|
+
]
|
|
404
|
+
}),
|
|
405
|
+
/* @__PURE__ */ c(S, {
|
|
406
|
+
size: "small",
|
|
407
|
+
multiline: !0,
|
|
408
|
+
minRows: 2,
|
|
409
|
+
label: "Notes (optional)",
|
|
410
|
+
value: V.notes,
|
|
411
|
+
onChange: (e) => H((t) => ({
|
|
412
|
+
...t,
|
|
413
|
+
notes: e.target.value
|
|
414
|
+
}))
|
|
415
|
+
})
|
|
416
|
+
]
|
|
417
|
+
}) : null }),
|
|
418
|
+
/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(f, {
|
|
419
|
+
onClick: Z,
|
|
420
|
+
disabled: q,
|
|
421
|
+
children: "Close"
|
|
422
|
+
}), /* @__PURE__ */ c(f, {
|
|
423
|
+
variant: "contained",
|
|
424
|
+
startIcon: /* @__PURE__ */ c(D, {}),
|
|
425
|
+
onClick: () => void Ie(),
|
|
426
|
+
disabled: q || !V.destStorageUnitId || $.length === 0,
|
|
427
|
+
children: q ? "Confirming…" : "Confirm Receipt"
|
|
428
|
+
})] })
|
|
429
|
+
]
|
|
430
|
+
}),
|
|
431
|
+
/* @__PURE__ */ l(p, {
|
|
432
|
+
open: U.open,
|
|
433
|
+
onClose: Q,
|
|
434
|
+
maxWidth: "sm",
|
|
435
|
+
fullWidth: !0,
|
|
436
|
+
children: [
|
|
437
|
+
/* @__PURE__ */ l(g, { children: ["Cancel transfer #", U.transfer?.serialId] }),
|
|
438
|
+
/* @__PURE__ */ c(h, { children: U.transfer ? /* @__PURE__ */ l(v, {
|
|
439
|
+
spacing: 2,
|
|
440
|
+
sx: { mt: 1 },
|
|
441
|
+
children: [/* @__PURE__ */ l(u, {
|
|
442
|
+
severity: "warning",
|
|
443
|
+
children: [
|
|
444
|
+
"Cancelling will credit ",
|
|
445
|
+
U.transfer.qty,
|
|
446
|
+
" ",
|
|
447
|
+
U.transfer.qty === 1 ? "unit" : "units",
|
|
448
|
+
" back to ",
|
|
449
|
+
/* @__PURE__ */ c("strong", { children: U.transfer.sourceFacilityName }),
|
|
450
|
+
"."
|
|
451
|
+
]
|
|
452
|
+
}), /* @__PURE__ */ c(S, {
|
|
453
|
+
size: "small",
|
|
454
|
+
multiline: !0,
|
|
455
|
+
minRows: 2,
|
|
456
|
+
label: "Reason (optional)",
|
|
457
|
+
value: G,
|
|
458
|
+
onChange: (e) => K(e.target.value)
|
|
459
|
+
})]
|
|
460
|
+
}) : null }),
|
|
461
|
+
/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(f, {
|
|
462
|
+
onClick: Q,
|
|
463
|
+
disabled: q,
|
|
464
|
+
children: "Close"
|
|
465
|
+
}), /* @__PURE__ */ c(f, {
|
|
466
|
+
variant: "contained",
|
|
467
|
+
color: "error",
|
|
468
|
+
startIcon: /* @__PURE__ */ c(O, {}),
|
|
469
|
+
onClick: () => void Le(),
|
|
470
|
+
disabled: q,
|
|
471
|
+
children: q ? "Cancelling…" : "Cancel Transfer"
|
|
472
|
+
})] })
|
|
473
|
+
]
|
|
474
|
+
})
|
|
475
|
+
] });
|
|
476
|
+
}
|
|
477
|
+
//#endregion
|
|
478
|
+
export { k as default };
|
|
479
|
+
|
|
480
|
+
//# sourceMappingURL=TransfersPage-zgmt7teZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransfersPage-zgmt7teZ.js","names":[],"sources":["../src/views/TransfersPage.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 Tab,\n Tabs,\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 SwapHorizRoundedIcon from '@mui/icons-material/SwapHorizRounded';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\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 { usePermissionedEffect, usePmPermissions } from '@pm/utils/permissions';\nimport {\n PmEmptyRow,\n PmRef,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport {\n cancelTransfer,\n confirmTransfer,\n getStorageUnits,\n listFacilities,\n listTransfers,\n} from '@pm/services/pmApi';\nimport { formatDate, formatDateTime } from '@pm/utils/format';\nimport { TRANSFER_STATUSES, labelOf } from '@pm/utils/constants';\n\nfunction statusChipColor(status) {\n switch (status) {\n case 'PENDING': return 'info';\n case 'COMPLETED': return 'success';\n case 'CANCELLED': return 'default';\n default: return 'default';\n }\n}\n\nexport default function TransfersPage() {\n const navigate = useNavigate();\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.transfer');\n const [rows, setRows] = useState([]);\n const [storageUnits, setStorageUnits] = useState([]);\n // UUIDs of facilities the current user is assigned to — controls which\n // per-row action buttons render. Confirm is reserved for users at the\n // destination facility; cancel is reserved for users at the source.\n const [assignedFacilityIds, setAssignedFacilityIds] = useState(() => new Set());\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [tab, setTab] = useState('all');\n const [search, setSearch] = useState('');\n const [confirmDialog, setConfirmDialog] = useState({ open: false, transfer: null });\n const [confirmForm, setConfirmForm] = useState({ destStorageUnitId: '', notes: '' });\n const [cancelDialog, setCancelDialog] = useState({ open: false, transfer: null });\n const [cancelNotes, setCancelNotes] = useState('');\n const [submitting, setSubmitting] = useState(false);\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const [t, su, fac] = await Promise.all([\n listTransfers(),\n getStorageUnits({ activeOnly: true }).catch(() => []),\n listFacilities().catch(() => []),\n ]);\n setRows(t);\n setStorageUnits(su);\n setAssignedFacilityIds(new Set(fac.map((f) => f.id)));\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load transfers';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.transfer', () => { void load(); }, []);\n\n const counts = useMemo(() => ({\n incoming: rows.filter((r) => r.status === 'PENDING').length,\n outgoing: rows.filter((r) => r.status === 'PENDING').length,\n }), [rows]);\n\n const filtered = useMemo(() => {\n let base = rows;\n if (tab === 'incoming') base = base.filter((r) => r.status === 'PENDING');\n if (tab === 'outgoing') base = base.filter((r) => r.status === 'PENDING');\n const q = search.trim().toLowerCase();\n if (q) {\n base = base.filter((r) => {\n const hay = `${r.productName ?? ''} ${r.sourceFacilityName ?? ''} ${r.destFacilityName ?? ''} ${r.lotNumber ?? ''} ${r.notes ?? ''}`.toLowerCase();\n return hay.includes(q);\n });\n }\n return base;\n }, [rows, tab, search]);\n\n function openConfirm(t) {\n setConfirmForm({\n destStorageUnitId: t.destStorageUnitId ?? '',\n notes: '',\n });\n setConfirmDialog({ open: true, transfer: t });\n }\n\n function closeConfirm() {\n if (submitting) return;\n setConfirmDialog({ open: false, transfer: null });\n }\n\n function openCancel(t) {\n setCancelNotes('');\n setCancelDialog({ open: true, transfer: t });\n }\n\n function closeCancel() {\n if (submitting) return;\n setCancelDialog({ open: false, transfer: null });\n }\n\n // Storage units belonging to the receiver's facility — receiver picks one\n // (or accepts the sender's suggestion).\n const destUnits = useMemo(() => {\n if (!confirmDialog.transfer) return [];\n return storageUnits.filter((u) => u.ownerId === confirmDialog.transfer.destFacilityId);\n }, [storageUnits, confirmDialog.transfer]);\n\n async function submitConfirm() {\n if (!confirmDialog.transfer) return;\n setSubmitting(true);\n try {\n await confirmTransfer(confirmDialog.transfer.id, {\n destStorageUnitId: confirmForm.destStorageUnitId || null,\n notes: confirmForm.notes || null,\n });\n showToast({ message: 'Transfer confirmed — stock landed at the destination.', type: 'success' });\n closeConfirm();\n await load();\n } catch (err) {\n showToast({ message: err?.response?.data?.message ?? err?.message ?? 'Failed to confirm transfer', type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n async function submitCancel() {\n if (!cancelDialog.transfer) return;\n setSubmitting(true);\n try {\n await cancelTransfer(cancelDialog.transfer.id, { notes: cancelNotes || null });\n showToast({ message: 'Transfer cancelled — stock returned to the source.', type: 'success' });\n closeCancel();\n await load();\n } catch (err) {\n showToast({ message: err?.response?.data?.message ?? err?.message ?? 'Failed to cancel transfer', type: 'error' });\n } finally {\n setSubmitting(false);\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.transfer'}>\n <PmPageShell\n title=\"Stock Transfers\"\n subtitle=\"Stock movements between facilities. The sender loses stock when shipping. The receiver gains it when they confirm.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canWrite ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/transfers/new')}>\n New Transfer\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=\"Transfers\"\n subtitle={loading ? 'Loading…' : `${filtered.length} ${filtered.length === 1 ? 'transfer' : 'transfers'}`}\n >\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} sx={{ mb: 2 }} alignItems={{ md: 'center' }}>\n <Tabs value={tab} onChange={(_, v) => setTab(v)} sx={{ minHeight: 40 }}>\n <Tab value=\"all\" label={`All${rows.length ? ` (${rows.length})` : ''}`} sx={{ minHeight: 40, textTransform: 'none', fontWeight: 700 }} />\n <Tab value=\"incoming\" label={`Pending${counts.incoming ? ` (${counts.incoming})` : ''}`} sx={{ minHeight: 40, textTransform: 'none', fontWeight: 700 }} />\n </Tabs>\n <Box sx={{ flexGrow: 1 }} />\n <TextField\n size=\"small\" fullWidth\n placeholder=\"Search by product, facility, lot, notes…\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n sx={{ maxWidth: { md: 360 } }}\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>Product</TableCell>\n <TableCell>From</TableCell>\n <TableCell>To</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell>Shipped</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: 8 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : filtered.length === 0 ? (\n <PmEmptyRow\n colSpan={8}\n icon={SwapHorizRoundedIcon}\n title={search.trim() !== ''\n ? 'No transfers match your search'\n : tab === 'incoming'\n ? 'No pending transfers'\n : 'No transfers yet'}\n hint=\"Create a transfer to move stock between facilities.\"\n action={canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />}\n onClick={() => navigate('/ui/medplat/manage/pm/transfers/new')}>\n Ship first transfer\n </Button>\n ) : null}\n />\n ) : filtered.map((r) => (\n <TableRow key={r.id} hover>\n <TableCell><PmRef id={r.serialId} /></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.sourceFacilityName ?? '—'}</TableCell>\n <TableCell>{r.destFacilityName ?? '—'}</TableCell>\n <TableCell align=\"right\">\n <Typography sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{r.qty}</Typography>\n </TableCell>\n <TableCell>\n <Typography variant=\"body2\">{formatDate(r.shippedOn)}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">{r.shippedByName ?? `#${r.shippedBy}`}</Typography>\n </TableCell>\n <TableCell>\n <Chip size=\"small\" label={labelOf(TRANSFER_STATUSES, r.status)} color={statusChipColor(r.status)} />\n </TableCell>\n <TableCell align=\"right\">\n {(() => {\n // Two-party rule: only destination-facility users can\n // confirm; only source-facility users can cancel. The\n // backend enforces both checks too — this just hides\n // the buttons a user couldn't act on. A user assigned\n // to both ends sees both buttons.\n if (r.status !== 'PENDING' || !canWrite) {\n return <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>;\n }\n const canConfirm = assignedFacilityIds.has(r.destFacilityId);\n const canCancel = assignedFacilityIds.has(r.sourceFacilityId);\n if (!canConfirm && !canCancel) {\n return <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>;\n }\n return (\n <Stack direction=\"row\" spacing={1} justifyContent=\"flex-end\">\n {canConfirm ? (\n <Button size=\"small\" variant=\"outlined\" startIcon={<CheckCircleRoundedIcon />}\n onClick={() => openConfirm(r)}>\n Confirm\n </Button>\n ) : null}\n {canCancel ? (\n <Button size=\"small\" variant=\"outlined\" color=\"error\" startIcon={<DoNotDisturbRoundedIcon />}\n onClick={() => openCancel(r)}>\n Cancel\n </Button>\n ) : null}\n </Stack>\n );\n })()}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n\n {/* ---------- Confirm dialog ---------- */}\n <Dialog open={confirmDialog.open} onClose={closeConfirm} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Confirm transfer #{confirmDialog.transfer?.serialId}</DialogTitle>\n <DialogContent>\n {confirmDialog.transfer ? (\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>{confirmDialog.transfer.productName}</strong> · qty {confirmDialog.transfer.qty}</Typography>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block' }}>\n Shipped {formatDateTime(confirmDialog.transfer.shippedOn)} by {confirmDialog.transfer.shippedByName ?? `#${confirmDialog.transfer.shippedBy}`} from {confirmDialog.transfer.sourceFacilityName}\n </Typography>\n {confirmDialog.transfer.lotNumber ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', mt: 0.5 }}>\n Lot {confirmDialog.transfer.lotNumber}\n {confirmDialog.transfer.expiryDate ? ` · expires ${formatDate(confirmDialog.transfer.expiryDate)}` : ''}\n </Typography>\n ) : null}\n </Box>\n\n <FormControl required size=\"small\" disabled={destUnits.length === 0}\n error={!confirmForm.destStorageUnitId}>\n <InputLabel>Landing Storage</InputLabel>\n <Select\n label=\"Landing Storage\"\n value={confirmForm.destStorageUnitId}\n onChange={(e) => setConfirmForm((f) => ({ ...f, destStorageUnitId: e.target.value }))}\n >\n <MenuItem value=\"\" disabled><em>— Pick a storage unit —</em></MenuItem>\n {destUnits.map((u) => (\n <MenuItem key={u.id} value={u.id}>{u.unitName}</MenuItem>\n ))}\n </Select>\n <FormHelperText>\n {destUnits.length === 0\n ? 'No storage units at this facility — add one on the Storage Units page first.'\n : confirmDialog.transfer?.destStorageUnitId\n ? 'Sender suggested a unit (pre-filled). You can change it; cold-chain compatibility is checked server-side.'\n : 'Required. Cold-chain compatibility is checked server-side against the product.'}\n </FormHelperText>\n </FormControl>\n\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Notes (optional)\"\n value={confirmForm.notes}\n onChange={(e) => setConfirmForm((f) => ({ ...f, notes: e.target.value }))}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeConfirm} disabled={submitting}>Close</Button>\n <Button variant=\"contained\" startIcon={<CheckCircleRoundedIcon />}\n onClick={() => void submitConfirm()}\n disabled={submitting || !confirmForm.destStorageUnitId || destUnits.length === 0}>\n {submitting ? 'Confirming…' : 'Confirm Receipt'}\n </Button>\n </DialogActions>\n </Dialog>\n\n {/* ---------- Cancel dialog ---------- */}\n <Dialog open={cancelDialog.open} onClose={closeCancel} maxWidth=\"sm\" fullWidth>\n <DialogTitle>Cancel transfer #{cancelDialog.transfer?.serialId}</DialogTitle>\n <DialogContent>\n {cancelDialog.transfer ? (\n <Stack spacing={2} sx={{ mt: 1 }}>\n <Alert severity=\"warning\">\n Cancelling will credit {cancelDialog.transfer.qty} {cancelDialog.transfer.qty === 1 ? 'unit' : 'units'} back to <strong>{cancelDialog.transfer.sourceFacilityName}</strong>.\n </Alert>\n <TextField\n size=\"small\" multiline minRows={2}\n label=\"Reason (optional)\"\n value={cancelNotes}\n onChange={(e) => setCancelNotes(e.target.value)}\n />\n </Stack>\n ) : null}\n </DialogContent>\n <DialogActions>\n <Button onClick={closeCancel} disabled={submitting}>Close</Button>\n <Button variant=\"contained\" color=\"error\" startIcon={<DoNotDisturbRoundedIcon />}\n onClick={() => void submitCancel()} disabled={submitting}>\n {submitting ? 'Cancelling…' : 'Cancel Transfer'}\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n}\n"],"mappings":"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"}
|