@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.
Files changed (77) hide show
  1. package/dist/BrandsPage-CSA3meke.js +385 -0
  2. package/dist/BrandsPage-CSA3meke.js.map +1 -0
  3. package/dist/CategoriesPage-BrspzkJL.js +340 -0
  4. package/dist/CategoriesPage-BrspzkJL.js.map +1 -0
  5. package/dist/{DashboardPage-BNKUQj46.js → DashboardPage-CqaquOs2.js} +21 -22
  6. package/dist/{DashboardPage-BNKUQj46.js.map → DashboardPage-CqaquOs2.js.map} +1 -1
  7. package/dist/{FacilityPicker-Coi8I3yE.js → FacilityPicker-Dv_H95WW.js} +13 -13
  8. package/dist/{FacilityPicker-Coi8I3yE.js.map → FacilityPicker-Dv_H95WW.js.map} +1 -1
  9. package/dist/{InventoryPage-BR6jOzg2.js → InventoryPage-CPbzfDMR.js} +12 -12
  10. package/dist/{InventoryPage-BR6jOzg2.js.map → InventoryPage-CPbzfDMR.js.map} +1 -1
  11. package/dist/{MemberProfileCard-DbHZCS5n.js → MemberProfileCard-0vjO3Gzd.js} +2 -2
  12. package/dist/{MemberProfileCard-DbHZCS5n.js.map → MemberProfileCard-0vjO3Gzd.js.map} +1 -1
  13. package/dist/{PaymentCreatePage-Ci3ERnby.js → PaymentCreatePage-BYmDZAIB.js} +9 -10
  14. package/dist/{PaymentCreatePage-Ci3ERnby.js.map → PaymentCreatePage-BYmDZAIB.js.map} +1 -1
  15. package/dist/{PaymentsPage-sdg902zX.js → PaymentsPage-BXPvKon-.js} +16 -16
  16. package/dist/{PaymentsPage-sdg902zX.js.map → PaymentsPage-BXPvKon-.js.map} +1 -1
  17. package/dist/PickupCreatePage-CMGwoAXj.js +426 -0
  18. package/dist/PickupCreatePage-CMGwoAXj.js.map +1 -0
  19. package/dist/{PickupsPage-Ci2Ll0Kn.js → PickupsPage-D66_Wta4.js} +84 -39
  20. package/dist/PickupsPage-D66_Wta4.js.map +1 -0
  21. package/dist/PmTable-B9970kPY.js +375 -0
  22. package/dist/PmTable-B9970kPY.js.map +1 -0
  23. package/dist/{ProductEditPage-DL8gy85Y.js → ProductEditPage-B8qFTCW9.js} +226 -243
  24. package/dist/ProductEditPage-B8qFTCW9.js.map +1 -0
  25. package/dist/ProductsPage-C7_r9cKn.js +254 -0
  26. package/dist/ProductsPage-C7_r9cKn.js.map +1 -0
  27. package/dist/{PurchaseCreatePage-C3KMfBxJ.js → PurchaseCreatePage-CDfNDcKG.js} +150 -149
  28. package/dist/PurchaseCreatePage-CDfNDcKG.js.map +1 -0
  29. package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js → PurchaseRequestDetailPage-C7aAwEqw.js} +15 -15
  30. package/dist/{PurchaseRequestDetailPage-C0GYFJDl.js.map → PurchaseRequestDetailPage-C7aAwEqw.js.map} +1 -1
  31. package/dist/{PurchaseRequestsPage-DvFH_tWe.js → PurchaseRequestsPage-BwCkbpaX.js} +14 -14
  32. package/dist/{PurchaseRequestsPage-DvFH_tWe.js.map → PurchaseRequestsPage-BwCkbpaX.js.map} +1 -1
  33. package/dist/{PurchasesPage-BCvLvSp4.js → PurchasesPage-CvaZouVy.js} +11 -12
  34. package/dist/{PurchasesPage-BCvLvSp4.js.map → PurchasesPage-CvaZouVy.js.map} +1 -1
  35. package/dist/{SaleCreatePage-DpkQMoTq.js → SaleCreatePage-DP1Qmltu.js} +30 -31
  36. package/dist/{SaleCreatePage-DpkQMoTq.js.map → SaleCreatePage-DP1Qmltu.js.map} +1 -1
  37. package/dist/{SalesPage-DUwgkEO-.js → SalesPage-CO3cdYX5.js} +18 -19
  38. package/dist/{SalesPage-DUwgkEO-.js.map → SalesPage-CO3cdYX5.js.map} +1 -1
  39. package/dist/{SettingsPage-CusC0jqJ.js → SettingsPage-DvVRwSFw.js} +104 -103
  40. package/dist/SettingsPage-DvVRwSFw.js.map +1 -0
  41. package/dist/StorageUnitsPage-B9Hr_RkW.js +470 -0
  42. package/dist/StorageUnitsPage-B9Hr_RkW.js.map +1 -0
  43. package/dist/{TransactionsPage-DDaK4VyY.js → TransactionsPage-HKIGwEZN.js} +127 -123
  44. package/dist/TransactionsPage-HKIGwEZN.js.map +1 -0
  45. package/dist/{TransferCreatePage-BxudLfhS.js → TransferCreatePage-DMuZqQ3c.js} +9 -9
  46. package/dist/{TransferCreatePage-BxudLfhS.js.map → TransferCreatePage-DMuZqQ3c.js.map} +1 -1
  47. package/dist/{TransfersPage-zgmt7teZ.js → TransfersPage-COIyouL4.js} +16 -16
  48. package/dist/{TransfersPage-zgmt7teZ.js.map → TransfersPage-COIyouL4.js.map} +1 -1
  49. package/dist/{VialsPage-CjqPfgpV.js → VialsPage-BNPUwGCU.js} +291 -224
  50. package/dist/VialsPage-BNPUwGCU.js.map +1 -0
  51. package/dist/{constants-BrA_hfAI.js → constants-5ZCZo-Zm.js} +5 -2
  52. package/dist/{constants-BrA_hfAI.js.map → constants-5ZCZo-Zm.js.map} +1 -1
  53. package/dist/{PmGuard-CjJBisaN.js → currency-ClRLIEg2.js} +186 -9
  54. package/dist/currency-ClRLIEg2.js.map +1 -0
  55. package/dist/index.js +1 -1
  56. package/package.json +1 -1
  57. package/dist/BrandsPage-DCMCVvDY.js +0 -334
  58. package/dist/BrandsPage-DCMCVvDY.js.map +0 -1
  59. package/dist/CategoriesPage-BpRhwfrc.js +0 -284
  60. package/dist/CategoriesPage-BpRhwfrc.js.map +0 -1
  61. package/dist/PickupCreatePage-CieMsgWV.js +0 -310
  62. package/dist/PickupCreatePage-CieMsgWV.js.map +0 -1
  63. package/dist/PickupsPage-Ci2Ll0Kn.js.map +0 -1
  64. package/dist/PmGuard-CjJBisaN.js.map +0 -1
  65. package/dist/PmTable-BuXZQZCU.js +0 -302
  66. package/dist/PmTable-BuXZQZCU.js.map +0 -1
  67. package/dist/ProductEditPage-DL8gy85Y.js.map +0 -1
  68. package/dist/ProductsPage-BANTKxLb.js +0 -221
  69. package/dist/ProductsPage-BANTKxLb.js.map +0 -1
  70. package/dist/PurchaseCreatePage-C3KMfBxJ.js.map +0 -1
  71. package/dist/SettingsPage-CusC0jqJ.js.map +0 -1
  72. package/dist/StorageUnitsPage-BlC2AgrJ.js +0 -469
  73. package/dist/StorageUnitsPage-BlC2AgrJ.js.map +0 -1
  74. package/dist/TransactionsPage-DDaK4VyY.js.map +0 -1
  75. package/dist/VialsPage-CjqPfgpV.js.map +0 -1
  76. package/dist/currency-BDDCDgeE.js +0 -169
  77. package/dist/currency-BDDCDgeE.js.map +0 -1
@@ -1,469 +0,0 @@
1
- import { C as e, N as t, a as n, i as r, lt as ee, n as te, r as ne, t as re } from "./PmGuard-CjJBisaN.js";
2
- import { a as ie, o as ae, t as oe } from "./PmTable-BuXZQZCU.js";
3
- import { h as se, m as i, n as a, t as o } from "./validation-Ba7puFIO.js";
4
- import { t as s } from "./useFieldErrors-hDG8ox_x.js";
5
- import { o as c, p as ce } from "./constants-BrA_hfAI.js";
6
- import { t as l } from "./FacilityPicker-Coi8I3yE.js";
7
- import { useState as u } from "react";
8
- import { jsx as d, jsxs as f } from "react/jsx-runtime";
9
- import { v4 as le } from "uuid";
10
- import { Alert as ue, Box as p, Button as m, Checkbox as de, Chip as h, Dialog as fe, DialogActions as g, DialogContent as pe, DialogTitle as me, Divider as he, FormControl as _, FormControlLabel as v, FormHelperText as ge, InputLabel as y, MenuItem as b, Select as x, Skeleton as _e, Stack as S, TableBody as ve, TableCell as C, TableHead as ye, TableRow as w, TextField as T, Typography as E } from "@mui/material";
11
- import D from "@mui/icons-material/AddRounded";
12
- import O from "@mui/icons-material/RefreshRounded";
13
- import { showToast as k } from "@/common/toaster/toaster";
14
- import A from "@mui/icons-material/WarehouseRounded";
15
- //#region src/views/StorageUnitsPage.jsx
16
- var j = [{
17
- value: "FACILITY",
18
- label: "Facility"
19
- }];
20
- function M() {
21
- let M = r().has("update.manage.productManagement.storageUnit"), [N, P] = u([]), [be, F] = u({}), [I, L] = u(!1), [R, z] = u(""), [xe, B] = u(!1), [V, H] = u(null), [U, W] = u(K()), G = s();
22
- function K() {
23
- return {
24
- id: "",
25
- ownerType: "FACILITY",
26
- ownerId: "",
27
- unitName: "",
28
- unitCode: "",
29
- unitType: "REFRIGERATOR",
30
- make: "",
31
- model: "",
32
- comments: "",
33
- operatingTempMinCelsius: "",
34
- operatingTempMaxCelsius: "",
35
- isActive: !0
36
- };
37
- }
38
- async function q() {
39
- L(!0), z("");
40
- try {
41
- let n = await t({ activeOnly: !1 });
42
- P(n);
43
- let r = Array.from(new Set(n.map((e) => e.ownerId).filter(Boolean)));
44
- if (r.length === 0) F({});
45
- else try {
46
- let t = await e(r), n = {};
47
- t.forEach((e) => {
48
- n[e.id] = e.name;
49
- }), F(n);
50
- } catch {
51
- F({});
52
- }
53
- } catch (e) {
54
- let t = e?.response?.data?.message ?? e?.message ?? "Failed to load storage units";
55
- z(t), k({
56
- message: t,
57
- type: "error"
58
- });
59
- } finally {
60
- L(!1);
61
- }
62
- }
63
- ne("view.manage.productManagement.storageUnit", () => {
64
- q();
65
- }, []);
66
- function Se(e) {
67
- return be[e] ?? e;
68
- }
69
- function J() {
70
- H(null), W({
71
- ...K(),
72
- id: le()
73
- }), G.reset(), z(""), B(!0);
74
- }
75
- function Ce(e) {
76
- H(e), G.reset(), z(""), W({
77
- id: e.id,
78
- ownerType: e.ownerType ?? "FACILITY",
79
- ownerId: e.ownerId ?? "",
80
- unitName: e.unitName ?? "",
81
- unitCode: e.unitCode ?? "",
82
- unitType: e.unitType ?? "REFRIGERATOR",
83
- make: e.make ?? "",
84
- model: e.model ?? "",
85
- comments: e.comments ?? "",
86
- operatingTempMinCelsius: e.operatingTempMinCelsius ?? "",
87
- operatingTempMaxCelsius: e.operatingTempMaxCelsius ?? "",
88
- isActive: e.isActive !== !1
89
- }), B(!0);
90
- }
91
- let Y = se(U.operatingTempMinCelsius, U.operatingTempMaxCelsius), X = a(U.unitCode, { required: !0 }), Z = (U.unitCode || "").trim().toUpperCase(), we = !X && Z && U.ownerId && N.some((e) => e.id !== U.id && e.ownerId === U.ownerId && (e.unitCode || "").toUpperCase() === Z), Q = {
92
- ownerType: i(U.ownerType, "Owner type"),
93
- ownerId: i(U.ownerId, "Facility"),
94
- unitName: i(U.unitName, "Name"),
95
- unitCode: X || (we ? "Code is already in use for this facility." : ""),
96
- unitType: i(U.unitType, "Type"),
97
- operatingTempMinCelsius: Y.min,
98
- operatingTempMaxCelsius: Y.max
99
- }, $ = o(Q);
100
- async function Te() {
101
- if (!$) {
102
- G.markAllTouched(), z("Please fix the highlighted fields.");
103
- return;
104
- }
105
- try {
106
- await ee({
107
- id: U.id,
108
- ownerId: U.ownerId,
109
- unitName: U.unitName.trim(),
110
- unitCode: U.unitCode.trim().toUpperCase(),
111
- unitType: U.unitType,
112
- make: U.make?.trim() || null,
113
- model: U.model?.trim() || null,
114
- comments: U.comments?.trim() || null,
115
- operatingTempMinCelsius: U.operatingTempMinCelsius === "" ? null : Number(U.operatingTempMinCelsius),
116
- operatingTempMaxCelsius: U.operatingTempMaxCelsius === "" ? null : Number(U.operatingTempMaxCelsius),
117
- isActive: U.isActive
118
- }), k({
119
- message: "Storage unit saved.",
120
- type: "success"
121
- }), B(!1), await q();
122
- } catch (e) {
123
- let t = e?.response?.data?.message ?? e?.message ?? "Failed to save storage unit";
124
- z(t), k({
125
- message: t,
126
- type: "error"
127
- });
128
- }
129
- }
130
- return /* @__PURE__ */ f(p, { children: [/* @__PURE__ */ d(te, {}), /* @__PURE__ */ f(re, {
131
- perm: "view.manage.productManagement.storageUnit",
132
- children: [/* @__PURE__ */ f(n, {
133
- title: "Storage Units",
134
- subtitle: "Cold-chain equipment for storing vaccine and product batches. Currently managed per facility.",
135
- chips: ["Catalog", "Facility-owned"],
136
- actions: /* @__PURE__ */ f(S, {
137
- direction: "row",
138
- spacing: 1,
139
- children: [/* @__PURE__ */ d(m, {
140
- variant: "outlined",
141
- startIcon: /* @__PURE__ */ d(O, {}),
142
- onClick: () => void q(),
143
- children: "Refresh"
144
- }), M ? /* @__PURE__ */ d(m, {
145
- variant: "contained",
146
- startIcon: /* @__PURE__ */ d(D, {}),
147
- onClick: J,
148
- children: "New Storage Unit"
149
- }) : null]
150
- }),
151
- children: [R ? /* @__PURE__ */ d(ue, {
152
- severity: "error",
153
- sx: { mb: 2 },
154
- children: R
155
- }) : null, /* @__PURE__ */ d(ae, {
156
- eyebrow: "Cold-chain network",
157
- title: "Storage units",
158
- subtitle: I ? "Loading…" : `${N.length} ${N.length === 1 ? "unit" : "units"}`,
159
- children: /* @__PURE__ */ f(ie, { children: [/* @__PURE__ */ d(ye, { children: /* @__PURE__ */ f(w, { children: [
160
- /* @__PURE__ */ d(C, { children: "Code" }),
161
- /* @__PURE__ */ d(C, { children: "Name" }),
162
- /* @__PURE__ */ d(C, { children: "Facility" }),
163
- /* @__PURE__ */ d(C, { children: "Type" }),
164
- /* @__PURE__ */ d(C, { children: "Operating range" }),
165
- /* @__PURE__ */ d(C, { children: "Status" }),
166
- /* @__PURE__ */ d(C, {
167
- align: "right",
168
- children: "Action"
169
- })
170
- ] }) }), /* @__PURE__ */ d(ve, { children: I ? Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ d(w, { children: Array.from({ length: 7 }).map((e, t) => /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(_e, { height: 22 }) }, t)) }, t)) : N.length === 0 ? /* @__PURE__ */ d(oe, {
171
- colSpan: 7,
172
- icon: A,
173
- title: "No storage units yet",
174
- hint: "You need storage equipment to keep vaccine batches safe.",
175
- action: M ? /* @__PURE__ */ d(m, {
176
- variant: "contained",
177
- size: "small",
178
- startIcon: /* @__PURE__ */ d(D, {}),
179
- onClick: J,
180
- children: "Create first unit"
181
- }) : null
182
- }) : N.map((e) => /* @__PURE__ */ f(w, {
183
- hover: !0,
184
- children: [
185
- /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(p, {
186
- component: "span",
187
- sx: {
188
- display: "inline-flex",
189
- px: .85,
190
- py: .25,
191
- borderRadius: 1,
192
- bgcolor: "grey.100",
193
- fontFamily: "monospace",
194
- fontSize: "0.72rem",
195
- fontWeight: 800
196
- },
197
- children: e.unitCode
198
- }) }),
199
- /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(E, {
200
- variant: "body2",
201
- sx: { fontWeight: 700 },
202
- children: e.unitName
203
- }) }),
204
- /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(E, {
205
- variant: "caption",
206
- color: "text.secondary",
207
- children: Se(e.ownerId)
208
- }) }),
209
- /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(h, {
210
- size: "small",
211
- label: ce(c, e.unitType),
212
- variant: "outlined",
213
- sx: {
214
- fontWeight: 700,
215
- borderRadius: 1.5,
216
- height: 22
217
- }
218
- }) }),
219
- /* @__PURE__ */ d(C, { children: e.operatingTempMinCelsius != null && e.operatingTempMaxCelsius != null ? /* @__PURE__ */ f(E, {
220
- variant: "caption",
221
- sx: {
222
- fontWeight: 700,
223
- fontVariantNumeric: "tabular-nums"
224
- },
225
- children: [
226
- e.operatingTempMinCelsius,
227
- "°C → ",
228
- e.operatingTempMaxCelsius,
229
- "°C"
230
- ]
231
- }) : /* @__PURE__ */ d(E, {
232
- variant: "caption",
233
- color: "text.disabled",
234
- children: "—"
235
- }) }),
236
- /* @__PURE__ */ d(C, { children: /* @__PURE__ */ d(h, {
237
- size: "small",
238
- label: e.isActive ? "Active" : "Inactive",
239
- color: e.isActive ? "success" : "default",
240
- variant: e.isActive ? "filled" : "outlined",
241
- sx: {
242
- fontWeight: 700,
243
- borderRadius: 1.5,
244
- height: 22
245
- }
246
- }) }),
247
- /* @__PURE__ */ d(C, {
248
- align: "right",
249
- children: M ? /* @__PURE__ */ d(m, {
250
- size: "small",
251
- variant: "outlined",
252
- onClick: () => Ce(e),
253
- children: "Edit"
254
- }) : null
255
- })
256
- ]
257
- }, e.id)) })] })
258
- })]
259
- }), /* @__PURE__ */ f(fe, {
260
- open: xe,
261
- onClose: () => B(!1),
262
- fullWidth: !0,
263
- maxWidth: "sm",
264
- children: [
265
- /* @__PURE__ */ d(me, { children: V ? "Edit Storage Unit" : "New Storage Unit" }),
266
- /* @__PURE__ */ d(pe, {
267
- dividers: !0,
268
- children: /* @__PURE__ */ f(S, {
269
- spacing: 2,
270
- sx: { pt: 1 },
271
- children: [
272
- /* @__PURE__ */ f(_, {
273
- required: !0,
274
- fullWidth: !0,
275
- size: "small",
276
- disabled: !!V,
277
- error: G.show("ownerType") && !!Q.ownerType,
278
- children: [
279
- /* @__PURE__ */ d(y, { children: "Owner Type" }),
280
- /* @__PURE__ */ d(x, {
281
- label: "Owner Type",
282
- value: U.ownerType,
283
- onChange: (e) => W({
284
- ...U,
285
- ownerType: e.target.value,
286
- ownerId: ""
287
- }),
288
- onBlur: G.onBlur("ownerType"),
289
- children: j.map((e) => /* @__PURE__ */ d(b, {
290
- value: e.value,
291
- children: e.label
292
- }, e.value))
293
- }),
294
- /* @__PURE__ */ d(ge, { children: G.show("ownerType") && Q.ownerType ? Q.ownerType : "Only Facility is available currently." })
295
- ]
296
- }),
297
- /* @__PURE__ */ d(l, {
298
- required: !0,
299
- disabled: !!V || U.ownerType !== "FACILITY",
300
- value: U.ownerId,
301
- onChange: (e) => W({
302
- ...U,
303
- ownerId: e
304
- }),
305
- onBlur: G.onBlur("ownerId"),
306
- error: G.show("ownerId") && !!Q.ownerId,
307
- helperText: G.show("ownerId") && Q.ownerId ? Q.ownerId : "Search by name. The owner cannot be changed once created."
308
- }),
309
- /* @__PURE__ */ d(he, {}),
310
- /* @__PURE__ */ d(T, {
311
- required: !0,
312
- label: "Unit name",
313
- size: "small",
314
- fullWidth: !0,
315
- value: U.unitName,
316
- onChange: (e) => {
317
- let t = e.target.value, n = t.split(/\s+/).filter(Boolean).map((e) => e[0]).join("").toUpperCase().replace(/[^A-Z0-9_]/g, "");
318
- W((e) => ({
319
- ...e,
320
- unitName: t,
321
- unitCode: V ? e.unitCode : n
322
- }));
323
- },
324
- onBlur: G.onBlur("unitName"),
325
- error: G.show("unitName") && !!Q.unitName,
326
- helperText: G.show("unitName") ? Q.unitName : ""
327
- }),
328
- /* @__PURE__ */ d(T, {
329
- required: !0,
330
- label: "Unit code (unique within facility)",
331
- size: "small",
332
- fullWidth: !0,
333
- value: U.unitCode,
334
- onChange: (e) => W({
335
- ...U,
336
- unitCode: e.target.value.toUpperCase()
337
- }),
338
- onBlur: G.onBlur("unitCode"),
339
- error: G.show("unitCode") && !!Q.unitCode,
340
- helperText: G.show("unitCode") && Q.unitCode ? Q.unitCode : "Auto-generated from the name. Edit if needed to make it unique within this facility."
341
- }),
342
- /* @__PURE__ */ f(_, {
343
- required: !0,
344
- fullWidth: !0,
345
- size: "small",
346
- error: G.show("unitType") && !!Q.unitType,
347
- children: [/* @__PURE__ */ d(y, { children: "Type" }), /* @__PURE__ */ d(x, {
348
- label: "Type",
349
- value: U.unitType,
350
- onChange: (e) => W({
351
- ...U,
352
- unitType: e.target.value
353
- }),
354
- onBlur: G.onBlur("unitType"),
355
- children: c.map((e) => /* @__PURE__ */ d(b, {
356
- value: e.value,
357
- children: e.label
358
- }, e.value))
359
- })]
360
- }),
361
- /* @__PURE__ */ f(S, {
362
- direction: "row",
363
- spacing: 2,
364
- children: [/* @__PURE__ */ d(T, {
365
- label: "Make",
366
- size: "small",
367
- fullWidth: !0,
368
- value: U.make,
369
- onChange: (e) => W({
370
- ...U,
371
- make: e.target.value
372
- }),
373
- helperText: "Example: Godrej, Vestfrost"
374
- }), /* @__PURE__ */ d(T, {
375
- label: "Model",
376
- size: "small",
377
- fullWidth: !0,
378
- value: U.model,
379
- onChange: (e) => W({
380
- ...U,
381
- model: e.target.value
382
- }),
383
- helperText: "Example: GVR-100"
384
- })]
385
- }),
386
- /* @__PURE__ */ f(S, {
387
- direction: "row",
388
- spacing: 2,
389
- children: [/* @__PURE__ */ d(T, {
390
- label: "Min °C",
391
- size: "small",
392
- type: "number",
393
- fullWidth: !0,
394
- inputProps: {
395
- step: "0.1",
396
- min: -90,
397
- max: 30
398
- },
399
- value: U.operatingTempMinCelsius,
400
- onChange: (e) => W({
401
- ...U,
402
- operatingTempMinCelsius: e.target.value
403
- }),
404
- onBlur: G.onBlur("operatingTempMinCelsius"),
405
- error: G.show("operatingTempMinCelsius") && !!Q.operatingTempMinCelsius,
406
- helperText: G.show("operatingTempMinCelsius") && Q.operatingTempMinCelsius ? Q.operatingTempMinCelsius : "Allowed range: −90°C to +30°C"
407
- }), /* @__PURE__ */ d(T, {
408
- label: "Max °C",
409
- size: "small",
410
- type: "number",
411
- fullWidth: !0,
412
- inputProps: {
413
- step: "0.1",
414
- min: -90,
415
- max: 30
416
- },
417
- value: U.operatingTempMaxCelsius,
418
- onChange: (e) => W({
419
- ...U,
420
- operatingTempMaxCelsius: e.target.value
421
- }),
422
- onBlur: G.onBlur("operatingTempMaxCelsius"),
423
- error: G.show("operatingTempMaxCelsius") && !!Q.operatingTempMaxCelsius,
424
- helperText: G.show("operatingTempMaxCelsius") && Q.operatingTempMaxCelsius ? Q.operatingTempMaxCelsius : "Allowed range: −90°C to +30°C"
425
- })]
426
- }),
427
- /* @__PURE__ */ d(T, {
428
- label: "Comments",
429
- size: "small",
430
- multiline: !0,
431
- minRows: 2,
432
- fullWidth: !0,
433
- value: U.comments,
434
- onChange: (e) => W({
435
- ...U,
436
- comments: e.target.value
437
- }),
438
- helperText: "Notes about placement, maintenance schedule, or other details."
439
- }),
440
- /* @__PURE__ */ d(v, {
441
- control: /* @__PURE__ */ d(de, {
442
- checked: U.isActive,
443
- onChange: (e) => W({
444
- ...U,
445
- isActive: e.target.checked
446
- })
447
- }),
448
- label: "Active"
449
- })
450
- ]
451
- })
452
- }),
453
- /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ d(m, {
454
- onClick: () => B(!1),
455
- children: "Cancel"
456
- }), /* @__PURE__ */ d(m, {
457
- variant: "contained",
458
- disabled: !$,
459
- onClick: () => void Te(),
460
- children: "Save"
461
- })] })
462
- ]
463
- })]
464
- })] });
465
- }
466
- //#endregion
467
- export { M as default };
468
-
469
- //# sourceMappingURL=StorageUnitsPage-BlC2AgrJ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"StorageUnitsPage-BlC2AgrJ.js","names":[],"sources":["../src/views/StorageUnitsPage.jsx"],"sourcesContent":["import { useState } from 'react';\nimport { v4 as uuidv4 } from 'uuid';\nimport {\n Alert,\n Box,\n Button,\n Checkbox,\n Chip,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n FormControl,\n FormControlLabel,\n FormHelperText,\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 AddRoundedIcon from '@mui/icons-material/AddRounded';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport WarehouseRoundedIcon from '@mui/icons-material/WarehouseRounded';\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 { PmEmptyRow, PmTable, PmTableCard } from '@pm/components/PmTable';\nimport { STORAGE_UNIT_TYPES, labelOf } from '@pm/utils/constants';\nimport {\n getFacilitiesByIds,\n getStorageUnits,\n upsertStorageUnit,\n} from '@pm/services/pmApi';\nimport FacilityPicker from '@pm/components/FacilityPicker';\nimport {\n isClean,\n validateCode,\n validateRequired,\n validateTempRange,\n} from '@pm/utils/validation';\nimport { useFieldErrors } from '@pm/utils/useFieldErrors';\n\n// Today only FACILITY-owned storage units exist. The dropdown is kept so the\n// UI is ready for future owner kinds (REGIONAL_DEPOT, etc.) without a redesign.\nconst OWNER_TYPES = [{ value: 'FACILITY', label: 'Facility' }];\n\nexport default function StorageUnitsPage() {\n const perms = usePmPermissions();\n const canWrite = perms.has('update.manage.productManagement.storageUnit');\n const [items, setItems] = useState([]);\n // Map of facility id → name, hydrated for the ownerIds present on the\n // loaded storage units. Avoids loading the entire facility table just to\n // render the \"Facility\" column.\n const [facilityNames, setFacilityNames] = useState({});\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState('');\n const [openDialog, setOpenDialog] = useState(false);\n const [editing, setEditing] = useState(null);\n const [form, setForm] = useState(emptyForm());\n const fieldErrors = useFieldErrors();\n\n function emptyForm() {\n return {\n id: '',\n ownerType: 'FACILITY',\n ownerId: '',\n unitName: '',\n unitCode: '',\n unitType: 'REFRIGERATOR',\n make: '',\n model: '',\n comments: '',\n operatingTempMinCelsius: '',\n operatingTempMaxCelsius: '',\n isActive: true,\n };\n }\n\n async function load() {\n setLoading(true);\n setError('');\n try {\n const units = await getStorageUnits({ activeOnly: false });\n setItems(units);\n // Hydrate display names only for the facilities actually referenced\n // by the loaded units. Storage units are short — even the largest\n // deployment is a few hundred — so this is one cheap call.\n const ids = Array.from(new Set(units.map((u) => u.ownerId).filter(Boolean)));\n if (ids.length === 0) {\n setFacilityNames({});\n } else {\n try {\n const refs = await getFacilitiesByIds(ids);\n const map = {};\n refs.forEach((r) => { map[r.id] = r.name; });\n setFacilityNames(map);\n } catch {\n setFacilityNames({});\n }\n }\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load storage units';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.storageUnit', () => {\n void load();\n }, []);\n\n function facilityNameFor(id) {\n return facilityNames[id] ?? id;\n }\n\n function openCreate() {\n setEditing(null);\n setForm({ ...emptyForm(), id: uuidv4() });\n fieldErrors.reset();\n setError('');\n setOpenDialog(true);\n }\n\n function openEdit(item) {\n setEditing(item);\n fieldErrors.reset();\n setError('');\n setForm({\n id: item.id,\n ownerType: item.ownerType ?? 'FACILITY',\n ownerId: item.ownerId ?? '',\n unitName: item.unitName ?? '',\n unitCode: item.unitCode ?? '',\n unitType: item.unitType ?? 'REFRIGERATOR',\n make: item.make ?? '',\n model: item.model ?? '',\n comments: item.comments ?? '',\n operatingTempMinCelsius: item.operatingTempMinCelsius ?? '',\n operatingTempMaxCelsius: item.operatingTempMaxCelsius ?? '',\n isActive: item.isActive !== false,\n });\n setOpenDialog(true);\n }\n\n const tempErrors = validateTempRange(form.operatingTempMinCelsius, form.operatingTempMaxCelsius);\n // Code uniqueness is enforced per facility in the DB. Mirror that scope here so\n // the operator gets the duplicate warning inline instead of as a 500 after save.\n const codeBase = validateCode(form.unitCode, { required: true });\n const codeNorm = (form.unitCode || '').trim().toUpperCase();\n const codeClash = !codeBase\n && codeNorm\n && form.ownerId\n && items.some((u) => u.id !== form.id\n && u.ownerId === form.ownerId\n && (u.unitCode || '').toUpperCase() === codeNorm);\n const formErrors = {\n ownerType: validateRequired(form.ownerType, 'Owner type'),\n ownerId: validateRequired(form.ownerId, 'Facility'),\n unitName: validateRequired(form.unitName, 'Name'),\n unitCode: codeBase || (codeClash ? 'Code is already in use for this facility.' : ''),\n unitType: validateRequired(form.unitType, 'Type'),\n operatingTempMinCelsius: tempErrors.min,\n operatingTempMaxCelsius: tempErrors.max,\n };\n const formIsValid = isClean(formErrors);\n\n async function save() {\n if (!formIsValid) {\n fieldErrors.markAllTouched();\n setError('Please fix the highlighted fields.');\n return;\n }\n try {\n await upsertStorageUnit({\n id: form.id,\n ownerId: form.ownerId,\n unitName: form.unitName.trim(),\n unitCode: form.unitCode.trim().toUpperCase(),\n unitType: form.unitType,\n make: form.make?.trim() || null,\n model: form.model?.trim() || null,\n comments: form.comments?.trim() || null,\n operatingTempMinCelsius: form.operatingTempMinCelsius === '' ? null : Number(form.operatingTempMinCelsius),\n operatingTempMaxCelsius: form.operatingTempMaxCelsius === '' ? null : Number(form.operatingTempMaxCelsius),\n isActive: form.isActive,\n });\n showToast({ message: 'Storage unit saved.', type: 'success' });\n setOpenDialog(false);\n await load();\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to save storage unit';\n setError(message);\n showToast({ message, type: 'error' });\n }\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.storageUnit'}>\n <PmPageShell\n title=\"Storage Units\"\n subtitle=\"Cold-chain equipment for storing vaccine and product batches. Currently managed per facility.\"\n chips={['Catalog', 'Facility-owned']}\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load()}>Refresh</Button>\n {canWrite ? (\n <Button variant=\"contained\" startIcon={<AddRoundedIcon />} onClick={openCreate}>New Storage Unit</Button>\n ) : null}\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n <PmTableCard\n eyebrow=\"Cold-chain network\"\n title=\"Storage units\"\n subtitle={loading ? 'Loading…' : `${items.length} ${items.length === 1 ? 'unit' : 'units'}`}\n >\n <PmTable>\n <TableHead>\n <TableRow>\n <TableCell>Code</TableCell>\n <TableCell>Name</TableCell>\n <TableCell>Facility</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Operating range</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: 7 }).map((__, j) => (\n <TableCell key={j}><Skeleton height={22} /></TableCell>\n ))}\n </TableRow>\n ))\n ) : items.length === 0 ? (\n <PmEmptyRow\n colSpan={7}\n icon={WarehouseRoundedIcon}\n title=\"No storage units yet\"\n hint=\"You need storage equipment to keep vaccine batches safe.\"\n action={canWrite ? (\n <Button variant=\"contained\" size=\"small\" startIcon={<AddRoundedIcon />} onClick={openCreate}>\n Create first unit\n </Button>\n ) : null}\n />\n ) : items.map((u) => (\n <TableRow key={u.id} hover>\n <TableCell>\n <Box component=\"span\" sx={{\n display: 'inline-flex', px: 0.85, py: 0.25, borderRadius: 1,\n bgcolor: 'grey.100', fontFamily: 'monospace', fontSize: '0.72rem', fontWeight: 800,\n }}>\n {u.unitCode}\n </Box>\n </TableCell>\n <TableCell><Typography variant=\"body2\" sx={{ fontWeight: 700 }}>{u.unitName}</Typography></TableCell>\n <TableCell><Typography variant=\"caption\" color=\"text.secondary\">{facilityNameFor(u.ownerId)}</Typography></TableCell>\n <TableCell>\n <Chip size=\"small\" label={labelOf(STORAGE_UNIT_TYPES, u.unitType)} variant=\"outlined\"\n sx={{ fontWeight: 700, borderRadius: 1.5, height: 22 }} />\n </TableCell>\n <TableCell>\n {u.operatingTempMinCelsius != null && u.operatingTempMaxCelsius != null ? (\n <Typography variant=\"caption\" sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>\n {u.operatingTempMinCelsius}°C → {u.operatingTempMaxCelsius}°C\n </Typography>\n ) : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell>\n <Chip size=\"small\"\n label={u.isActive ? 'Active' : 'Inactive'}\n color={u.isActive ? 'success' : 'default'}\n variant={u.isActive ? 'filled' : 'outlined'}\n sx={{ fontWeight: 700, borderRadius: 1.5, height: 22 }} />\n </TableCell>\n <TableCell align=\"right\">\n {canWrite ? (\n <Button size=\"small\" variant=\"outlined\" onClick={() => openEdit(u)}>Edit</Button>\n ) : null}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n\n <Dialog open={openDialog} onClose={() => setOpenDialog(false)} fullWidth maxWidth=\"sm\">\n <DialogTitle>{editing ? 'Edit Storage Unit' : 'New Storage Unit'}</DialogTitle>\n <DialogContent dividers>\n <Stack spacing={2} sx={{ pt: 1 }}>\n\n {/* ------- Ownership: who this storage unit belongs to ------- */}\n <FormControl required fullWidth size=\"small\"\n disabled={!!editing}\n error={fieldErrors.show('ownerType') && !!formErrors.ownerType}>\n <InputLabel>Owner Type</InputLabel>\n <Select label=\"Owner Type\" value={form.ownerType}\n onChange={(e) => setForm({ ...form, ownerType: e.target.value, ownerId: '' })}\n onBlur={fieldErrors.onBlur('ownerType')}>\n {OWNER_TYPES.map((o) => <MenuItem key={o.value} value={o.value}>{o.label}</MenuItem>)}\n </Select>\n <FormHelperText>\n {fieldErrors.show('ownerType') && formErrors.ownerType\n ? formErrors.ownerType\n : 'Only Facility is available currently.'}\n </FormHelperText>\n </FormControl>\n\n <FacilityPicker\n required\n disabled={!!editing || form.ownerType !== 'FACILITY'}\n value={form.ownerId}\n onChange={(id) => setForm({ ...form, ownerId: id })}\n onBlur={fieldErrors.onBlur('ownerId')}\n error={fieldErrors.show('ownerId') && !!formErrors.ownerId}\n helperText={\n fieldErrors.show('ownerId') && formErrors.ownerId\n ? formErrors.ownerId\n : 'Search by name. The owner cannot be changed once created.'\n }\n />\n\n <Divider />\n\n {/* ------- Unit details ------- */}\n <TextField\n required\n label=\"Unit name\" size=\"small\" fullWidth\n value={form.unitName}\n onChange={(e) => {\n const nextName = e.target.value;\n // Derive a default code from the name on create — initials, A-Z/0-9\n // only. We never overwrite a code on edit (it's already curated and\n // ownerCode-scoped uniqueness depends on it).\n const auto = nextName\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => w[0])\n .join('')\n .toUpperCase()\n .replace(/[^A-Z0-9_]/g, '');\n setForm((f) => ({\n ...f,\n unitName: nextName,\n unitCode: editing ? f.unitCode : auto,\n }));\n }}\n onBlur={fieldErrors.onBlur('unitName')}\n error={fieldErrors.show('unitName') && !!formErrors.unitName}\n helperText={fieldErrors.show('unitName') ? formErrors.unitName : ''}\n />\n <TextField\n required\n label=\"Unit code (unique within facility)\" size=\"small\" fullWidth\n value={form.unitCode}\n onChange={(e) => setForm({ ...form, unitCode: e.target.value.toUpperCase() })}\n onBlur={fieldErrors.onBlur('unitCode')}\n error={fieldErrors.show('unitCode') && !!formErrors.unitCode}\n helperText={\n fieldErrors.show('unitCode') && formErrors.unitCode\n ? formErrors.unitCode\n : 'Auto-generated from the name. Edit if needed to make it unique within this facility.'\n }\n />\n <FormControl required fullWidth size=\"small\"\n error={fieldErrors.show('unitType') && !!formErrors.unitType}>\n <InputLabel>Type</InputLabel>\n <Select label=\"Type\" value={form.unitType}\n onChange={(e) => setForm({ ...form, unitType: e.target.value })}\n onBlur={fieldErrors.onBlur('unitType')}>\n {STORAGE_UNIT_TYPES.map((t) => <MenuItem key={t.value} value={t.value}>{t.label}</MenuItem>)}\n </Select>\n </FormControl>\n\n <Stack direction=\"row\" spacing={2}>\n <TextField label=\"Make\" size=\"small\" fullWidth\n value={form.make}\n onChange={(e) => setForm({ ...form, make: e.target.value })}\n helperText=\"Example: Godrej, Vestfrost\" />\n <TextField label=\"Model\" size=\"small\" fullWidth\n value={form.model}\n onChange={(e) => setForm({ ...form, model: e.target.value })}\n helperText=\"Example: GVR-100\" />\n </Stack>\n <Stack direction=\"row\" spacing={2}>\n <TextField\n label=\"Min °C\" size=\"small\" type=\"number\" fullWidth\n inputProps={{ step: '0.1', min: -90, max: 30 }}\n value={form.operatingTempMinCelsius}\n onChange={(e) => setForm({ ...form, operatingTempMinCelsius: e.target.value })}\n onBlur={fieldErrors.onBlur('operatingTempMinCelsius')}\n error={fieldErrors.show('operatingTempMinCelsius') && !!formErrors.operatingTempMinCelsius}\n helperText={\n fieldErrors.show('operatingTempMinCelsius') && formErrors.operatingTempMinCelsius\n ? formErrors.operatingTempMinCelsius\n : 'Allowed range: −90°C to +30°C'\n }\n />\n <TextField\n label=\"Max °C\" size=\"small\" type=\"number\" fullWidth\n inputProps={{ step: '0.1', min: -90, max: 30 }}\n value={form.operatingTempMaxCelsius}\n onChange={(e) => setForm({ ...form, operatingTempMaxCelsius: e.target.value })}\n onBlur={fieldErrors.onBlur('operatingTempMaxCelsius')}\n error={fieldErrors.show('operatingTempMaxCelsius') && !!formErrors.operatingTempMaxCelsius}\n helperText={\n fieldErrors.show('operatingTempMaxCelsius') && formErrors.operatingTempMaxCelsius\n ? formErrors.operatingTempMaxCelsius\n : 'Allowed range: −90°C to +30°C'\n }\n />\n </Stack>\n <TextField label=\"Comments\" size=\"small\" multiline minRows={2} fullWidth\n value={form.comments}\n onChange={(e) => setForm({ ...form, comments: e.target.value })}\n helperText=\"Notes about placement, maintenance schedule, or other details.\" />\n <FormControlLabel control={<Checkbox checked={form.isActive}\n onChange={(e) => setForm({ ...form, isActive: e.target.checked })} />} label=\"Active\" />\n </Stack>\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpenDialog(false)}>Cancel</Button>\n <Button variant=\"contained\" disabled={!formIsValid} onClick={() => void save()}>Save</Button>\n </DialogActions>\n </Dialog>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionsPage-DDaK4VyY.js","names":[],"sources":["../src/views/TransactionsPage.jsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Alert,\n Autocomplete,\n Box,\n Button,\n Chip,\n FormControl,\n IconButton,\n InputLabel,\n MenuItem,\n Select,\n Skeleton,\n Stack,\n TableBody,\n TableCell,\n TableHead,\n TableRow,\n TextField,\n Tooltip,\n Typography,\n} from '@mui/material';\nimport { alpha, useTheme } from '@mui/material/styles';\nimport RefreshRoundedIcon from '@mui/icons-material/RefreshRounded';\nimport ReceiptLongRoundedIcon from '@mui/icons-material/ReceiptLongRounded';\nimport ChevronLeftRoundedIcon from '@mui/icons-material/ChevronLeftRounded';\nimport ChevronRightRoundedIcon from '@mui/icons-material/ChevronRightRounded';\nimport CallMadeRoundedIcon from '@mui/icons-material/CallMadeRounded';\nimport CallReceivedRoundedIcon from '@mui/icons-material/CallReceivedRounded';\nimport SwapHorizRoundedIcon from '@mui/icons-material/SwapHorizRounded';\nimport VaccinesRoundedIcon from '@mui/icons-material/VaccinesRounded';\nimport ShoppingCartRoundedIcon from '@mui/icons-material/ShoppingCartRounded';\nimport PointOfSaleRoundedIcon from '@mui/icons-material/PointOfSaleRounded';\nimport PaymentsRoundedIcon from '@mui/icons-material/PaymentsRounded';\nimport ReportRoundedIcon from '@mui/icons-material/ReportRounded';\nimport BlockRoundedIcon from '@mui/icons-material/BlockRounded';\nimport LockOpenRoundedIcon from '@mui/icons-material/LockOpenRounded';\nimport MoveDownRoundedIcon from '@mui/icons-material/MoveDownRounded';\nimport FactCheckRoundedIcon from '@mui/icons-material/FactCheckRounded';\nimport CancelRoundedIcon from '@mui/icons-material/CancelRounded';\nimport CheckCircleRoundedIcon from '@mui/icons-material/CheckCircleRounded';\nimport HourglassEmptyRoundedIcon from '@mui/icons-material/HourglassEmptyRounded';\nimport SearchRoundedIcon from '@mui/icons-material/SearchRounded';\nimport PictureAsPdfRoundedIcon from '@mui/icons-material/PictureAsPdfRounded';\nimport InsertDriveFileRoundedIcon from '@mui/icons-material/InsertDriveFileRounded';\nimport { showToast } from '@/common/toaster/toaster';\nimport useDownloadPdf from '@/hooks/useDownloadPdf';\nimport { useDownloadXlsx } from '@/hooks/useDownloadXlsx';\nimport PmPageShell from '@pm/components/PmPageShell';\nimport PmNav from '@pm/components/PmNav';\nimport PmGuard from '@pm/components/PmGuard';\nimport { usePermissionedEffect } from '@pm/utils/permissions';\nimport {\n PmEmptyRow,\n PmMoney,\n PmTable,\n PmTableCard,\n} from '@pm/components/PmTable';\nimport { queryTransactions } from '@pm/services/pmApi';\nimport { formatDateTime, formatNumber } from '@pm/utils/format';\nimport { SYNC_STATUSES, labelOf } from '@pm/utils/constants';\n\n// Per-type visual: chip colour + icon. The icon turns the type column from a\n// flat text label into something the operator can scan with peripheral vision.\nconst TYPE_META = {\n RECEIPT: { color: 'success', icon: CallReceivedRoundedIcon, label: 'Receipt' },\n VIAL_OPENED: { color: 'info', icon: VaccinesRoundedIcon, label: 'Vial opened' },\n ADMINISTRATION: { color: 'primary', icon: VaccinesRoundedIcon, label: 'Administration' },\n WASTAGE: { color: 'warning', icon: ReportRoundedIcon, label: 'Wastage' },\n EXPIRY: { color: 'warning', icon: ReportRoundedIcon, label: 'Expiry' },\n SALE: { color: 'success', icon: PointOfSaleRoundedIcon, label: 'Sale' },\n PAYMENT: { color: 'success', icon: PaymentsRoundedIcon, label: 'Payment' },\n QUARANTINE: { color: 'error', icon: BlockRoundedIcon, label: 'Quarantine' },\n RECALL: { color: 'error', icon: BlockRoundedIcon, label: 'Recall' },\n UNQUARANTINE: { color: 'info', icon: LockOpenRoundedIcon, label: 'Unquarantine' },\n TRANSFER_OUT: { color: 'default', icon: CallMadeRoundedIcon, label: 'Transfer out' },\n TRANSFER_IN: { color: 'default', icon: SwapHorizRoundedIcon, label: 'Transfer in' },\n PICKUP_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Pickup — out' },\n PICKUP_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Pickup — in' },\n TOPUP_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Top-up — out' },\n TOPUP_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Top-up — in' },\n RETURN_OUT: { color: 'default', icon: MoveDownRoundedIcon, label: 'Return — out' },\n RETURN_IN: { color: 'default', icon: MoveDownRoundedIcon, label: 'Return — in' },\n PURCHASE_REQUEST_SUBMITTED: { color: 'info', icon: HourglassEmptyRoundedIcon, label: 'Request submitted' },\n PURCHASE_REQUEST_APPROVED: { color: 'success', icon: CheckCircleRoundedIcon, label: 'Request approved' },\n PURCHASE_REQUEST_PARTIAL: { color: 'warning', icon: FactCheckRoundedIcon, label: 'Request partial' },\n PURCHASE_REQUEST_REJECTED: { color: 'error', icon: CancelRoundedIcon, label: 'Request rejected' },\n PURCHASE_REQUEST_CANCELLED: { color: 'default', icon: CancelRoundedIcon, label: 'Request cancelled' },\n};\n\nfunction TypeChip({ type }) {\n const meta = TYPE_META[type] || { color: 'default', icon: ShoppingCartRoundedIcon, label: type };\n const Icon = meta.icon;\n return (\n <Chip\n size=\"small\"\n color={meta.color}\n icon={<Icon sx={{ fontSize: '1rem !important' }} />}\n label={meta.label}\n sx={{\n fontWeight: 700,\n height: 24,\n borderRadius: 1.5,\n '& .MuiChip-icon': { ml: 0.75, mr: -0.25 },\n }}\n />\n );\n}\n\nfunction SyncChip({ status }) {\n const color = status === 'COMPLETED' ? 'success' : status === 'FAILED' ? 'error' : 'warning';\n return (\n <Chip\n size=\"small\"\n label={labelOf(SYNC_STATUSES, status)}\n color={color}\n variant=\"outlined\"\n sx={{ fontWeight: 700, height: 22, borderRadius: 1.5, fontSize: '0.7rem' }}\n />\n );\n}\n\n// Type options for the filter Autocomplete — pulled from TYPE_META so any\n// new types automatically show up in the dropdown without extra wiring.\nconst TYPE_OPTIONS = Object.keys(TYPE_META).map((value) => ({\n value,\n label: TYPE_META[value].label,\n}));\n\nexport default function TransactionsPage() {\n const theme = useTheme();\n const downloadPdf = useDownloadPdf();\n const downloadXlsx = useDownloadXlsx();\n const [items, setItems] = useState([]);\n const [totalElements, setTotalElements] = useState(0);\n const [page, setPage] = useState(0);\n const [pageSize, setPageSize] = useState(50);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n // Filter state — fed into the query on every load. The \"applied\" snapshot\n // is what was last submitted; the \"draft\" version is the in-progress\n // values bound to the inputs so typing doesn't fire a request per\n // keystroke.\n const [filters, setFilters] = useState({\n dateFrom: '', dateTo: '', types: [], search: '', ownerType: '',\n });\n\n async function load(p = page, size = pageSize, f = filters) {\n setLoading(true);\n setError('');\n try {\n const data = await queryTransactions({\n page: p,\n size,\n dateFrom: f.dateFrom ? new Date(f.dateFrom).toISOString() : undefined,\n // Inclusive end-of-day: send the end timestamp at 23:59:59 so the\n // user's \"today\" filter captures everything that happened today.\n dateTo: f.dateTo ? new Date(`${f.dateTo}T23:59:59`).toISOString() : undefined,\n types: f.types.length > 0 ? f.types : undefined,\n ownerType: f.ownerType || undefined,\n search: f.search?.trim() || undefined,\n });\n setItems(data.content ?? []);\n setTotalElements(data.totalElements ?? 0);\n setPage(data.page ?? 0);\n setPageSize(data.size ?? size);\n } catch (err) {\n const message = err?.response?.data?.message ?? err?.message ?? 'Failed to load ledger';\n setError(message);\n showToast({ message, type: 'error' });\n } finally {\n setLoading(false);\n }\n }\n\n usePermissionedEffect('view.manage.productManagement.ledger', () => {\n void load(0, pageSize, filters);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const startIdx = totalElements === 0 ? 0 : page * pageSize + 1;\n const endIdx = page * pageSize + items.length;\n const totalPages = pageSize > 0 ? Math.ceil(totalElements / pageSize) : 0;\n\n function applyFilters(next) {\n setFilters(next);\n void load(0, pageSize, next);\n }\n\n function resetFilters() {\n const blank = { dateFrom: '', dateTo: '', types: [], search: '', ownerType: '' };\n setFilters(blank);\n void load(0, pageSize, blank);\n }\n\n // Flatten the current page into a column-mapped shape the download\n // hooks can consume. Strings only — both hooks call toString() on values\n // for cell rendering, so we pre-format here so the file matches the UI.\n const exportColumns = ['Time', 'Type', 'Owner', 'Product', 'Vaccine', 'Lot', 'Qty', 'Volume', 'Money', 'Notes'];\n const exportKeys = ['time', 'type', 'owner', 'product', 'vaccine', 'lot', 'qty', 'volume', 'money', 'notes'];\n const exportData = useMemo(() => items.map((t) => ({\n time: t.transactionTime ? formatDateTime(t.transactionTime) : '',\n type: TYPE_META[t.transactionType]?.label ?? t.transactionType ?? '',\n owner: `${t.ownerName ?? (t.ownerType === 'USER' ? 'Personal' : 'Facility')} (${t.ownerType ?? '—'})`,\n product: t.productName ?? '',\n vaccine: t.vaccineCode ?? '',\n lot: t.lotNumber ?? '',\n qty: t.quantity ?? '',\n volume: t.volumeMl != null ? `${formatNumber(t.volumeMl)} ml` : '',\n money: t.monetaryAmount != null ? formatNumber(t.monetaryAmount) : '',\n notes: t.notes ?? '',\n })), [items]);\n\n function buildFileName(extension) {\n const stamp = new Date().toISOString().replace(/[:T]/g, '-').slice(0, 16);\n return `pm-ledger-${stamp}.${extension}`;\n }\n\n function doDownloadPdf() {\n if (exportData.length === 0) {\n showToast({ message: 'Nothing to export on this page.', type: 'info' });\n return;\n }\n downloadPdf({\n title: 'PM Stock Ledger',\n columns: exportColumns,\n keys: exportKeys,\n data: exportData,\n fileName: buildFileName('pdf'),\n headerText: 'Product Management — Stock Ledger',\n footerText: 'Generated by MEDplat PM',\n orientation: 'landscape',\n });\n }\n\n function doDownloadXlsx() {\n if (exportData.length === 0) {\n showToast({ message: 'Nothing to export on this page.', type: 'info' });\n return;\n }\n void downloadXlsx({\n columns: exportColumns,\n keys: exportKeys,\n data: exportData,\n filename: buildFileName('xlsx'),\n });\n }\n\n return (\n <Box>\n <PmNav />\n <PmGuard perm={'view.manage.productManagement.ledger'}>\n <PmPageShell\n title=\"Stock Ledger\"\n subtitle=\"Complete record of all stock and money movements. Balances always match this ledger.\"\n actions={\n <Stack direction=\"row\" spacing={1}>\n <Button variant=\"outlined\" startIcon={<PictureAsPdfRoundedIcon />} onClick={doDownloadPdf} disabled={loading || items.length === 0}>PDF</Button>\n <Button variant=\"outlined\" startIcon={<InsertDriveFileRoundedIcon />} onClick={doDownloadXlsx} disabled={loading || items.length === 0}>Excel</Button>\n <Button variant=\"outlined\" startIcon={<RefreshRoundedIcon />} onClick={() => void load(0, pageSize, filters)}>Refresh</Button>\n </Stack>\n }\n >\n {error ? <Alert severity=\"error\" sx={{ mb: 2 }}>{error}</Alert> : null}\n\n {/* ---------- Filter panel ---------- */}\n <Box sx={{ mb: 2, p: 2, borderRadius: 3, border: '1px solid', borderColor: 'divider' }}>\n <Stack direction={{ xs: 'column', md: 'row' }} spacing={1.5} alignItems={{ md: 'center' }}>\n <TextField\n size=\"small\" type=\"date\" label=\"From\"\n InputLabelProps={{ shrink: true }}\n value={filters.dateFrom}\n onChange={(e) => setFilters((f) => ({ ...f, dateFrom: e.target.value }))}\n sx={{ minWidth: 160 }}\n />\n <TextField\n size=\"small\" type=\"date\" label=\"To\"\n InputLabelProps={{ shrink: true }}\n value={filters.dateTo}\n onChange={(e) => setFilters((f) => ({ ...f, dateTo: e.target.value }))}\n sx={{ minWidth: 160 }}\n />\n <Autocomplete\n size=\"small\" multiple disableCloseOnSelect\n options={TYPE_OPTIONS}\n getOptionLabel={(o) => o.label}\n isOptionEqualToValue={(a, b) => a.value === b.value}\n value={TYPE_OPTIONS.filter((o) => filters.types.includes(o.value))}\n onChange={(_, next) => setFilters((f) => ({ ...f, types: next.map((o) => o.value) }))}\n renderInput={(params) => <TextField {...params} label=\"Types\" placeholder=\"Any\" />}\n sx={{ minWidth: 240, flexGrow: 1 }}\n />\n <FormControl size=\"small\" sx={{ minWidth: 140 }}>\n <InputLabel>Owner</InputLabel>\n <Select label=\"Owner\" value={filters.ownerType}\n onChange={(e) => setFilters((f) => ({ ...f, ownerType: e.target.value }))}>\n <MenuItem value=\"\">Any</MenuItem>\n <MenuItem value=\"FACILITY\">Facility</MenuItem>\n <MenuItem value=\"USER\">Personal</MenuItem>\n </Select>\n </FormControl>\n <TextField\n size=\"small\" label=\"Search\"\n placeholder=\"Lot, vaccine code, notes…\"\n value={filters.search}\n onChange={(e) => setFilters((f) => ({ ...f, search: e.target.value }))}\n onKeyDown={(e) => { if (e.key === 'Enter') applyFilters(filters); }}\n sx={{ minWidth: 220, flexGrow: 1 }}\n InputProps={{ startAdornment: <SearchRoundedIcon fontSize=\"small\" sx={{ color: 'text.secondary', mr: 1 }} /> }}\n />\n <Button variant=\"contained\" onClick={() => applyFilters(filters)} disabled={loading}>Apply</Button>\n <Button variant=\"text\" onClick={resetFilters} disabled={loading}>Clear</Button>\n </Stack>\n </Box>\n\n <PmTableCard\n eyebrow=\"Audit feed\"\n title=\"Transactions\"\n subtitle={loading\n ? 'Loading…'\n : totalElements === 0\n ? 'No transactions in this window'\n : `Showing ${startIdx}–${endIdx} of ${totalElements} · page ${page + 1} of ${totalPages}`}\n actions={\n <Stack direction=\"row\" spacing={0.5} alignItems=\"center\">\n <FormControl size=\"small\" variant=\"outlined\" sx={{ minWidth: 88, mr: 1 }}>\n <InputLabel>Size</InputLabel>\n <Select label=\"Size\" value={pageSize}\n onChange={(e) => { const v = Number(e.target.value); setPageSize(v); void load(0, v, filters); }}>\n {[25, 50, 100, 200].map((s) => <MenuItem key={s} value={s}>{s}</MenuItem>)}\n </Select>\n </FormControl>\n <Tooltip title=\"Previous page\">\n <span>\n <IconButton\n size=\"small\"\n disabled={page === 0 || loading}\n onClick={() => void load(page - 1, pageSize, filters)}\n sx={{ border: '1px solid', borderColor: 'divider' }}\n >\n <ChevronLeftRoundedIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n <Box sx={{ px: 1, minWidth: 64, textAlign: 'center' }}>\n <Typography variant=\"caption\" sx={{ fontWeight: 800, color: 'text.secondary', fontVariantNumeric: 'tabular-nums' }}>\n {totalElements === 0 ? '—' : `${startIdx}–${endIdx}`}\n </Typography>\n </Box>\n <Tooltip title=\"Next page\">\n <span>\n <IconButton\n size=\"small\"\n disabled={page + 1 >= totalPages || loading}\n onClick={() => void load(page + 1, pageSize, filters)}\n sx={{ border: '1px solid', borderColor: 'divider' }}\n >\n <ChevronRightRoundedIcon fontSize=\"small\" />\n </IconButton>\n </span>\n </Tooltip>\n </Stack>\n }\n >\n <PmTable dense>\n <TableHead>\n <TableRow>\n <TableCell>Time</TableCell>\n <TableCell>Type</TableCell>\n <TableCell>Owner</TableCell>\n <TableCell>Product · Lot</TableCell>\n <TableCell align=\"right\">Qty</TableCell>\n <TableCell align=\"right\">Volume</TableCell>\n <TableCell align=\"right\">Money</TableCell>\n <TableCell>Sync</TableCell>\n <TableCell>Notes</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>\n {loading ? (\n Array.from({ length: 6 }).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 ) : items.length === 0 ? (\n <PmEmptyRow\n colSpan={9}\n icon={ReceiptLongRoundedIcon}\n title=\"No transactions in this window\"\n hint=\"Record a purchase, sale, vial open, or payment. Every stock and money movement lands here.\"\n />\n ) : items.map((t) => (\n <TableRow key={t.id} hover>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, lineHeight: 1.2 }}>\n {formatDateTime(t.transactionTime)}\n </Typography>\n </TableCell>\n <TableCell><TypeChip type={t.transactionType} /></TableCell>\n <TableCell>\n <Typography variant=\"body2\" sx={{ fontWeight: 700 }}>\n {t.ownerName || (t.ownerType === 'USER' ? 'Personal' : 'Facility')}\n </Typography>\n <Typography variant=\"caption\" color=\"text.secondary\">\n {t.ownerType}\n </Typography>\n </TableCell>\n <TableCell>\n <Stack direction=\"row\" alignItems=\"baseline\" spacing={1} sx={{ minWidth: 0 }}>\n <Typography variant=\"body2\" sx={{ fontWeight: 700, lineHeight: 1.2 }} noWrap>\n {t.productName || '—'}\n </Typography>\n {t.vaccineCode ? (\n <Box\n component=\"span\"\n sx={{\n px: 0.6,\n py: 0.05,\n borderRadius: 1,\n bgcolor: alpha(theme.palette.info.main, 0.1),\n color: 'info.dark',\n fontFamily: 'monospace',\n fontSize: '0.65rem',\n fontWeight: 700,\n }}\n >\n {t.vaccineCode}\n </Box>\n ) : null}\n {t.lotNumber ? (\n <Box\n component=\"span\"\n sx={{\n display: 'inline-flex',\n px: 0.7,\n py: 0.1,\n borderRadius: 1,\n bgcolor: alpha(theme.palette.primary.main, 0.06),\n color: 'primary.dark',\n fontFamily: 'monospace',\n fontSize: '0.7rem',\n fontWeight: 700,\n }}\n >\n {t.lotNumber}\n </Box>\n ) : null}\n </Stack>\n </TableCell>\n <TableCell align=\"right\">\n {t.quantity != null\n ? <Typography variant=\"body2\" sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{t.quantity}</Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell align=\"right\">\n {t.volumeMl != null\n ? <Typography variant=\"body2\" sx={{ fontWeight: 700, fontVariantNumeric: 'tabular-nums' }}>{formatNumber(t.volumeMl)} ml</Typography>\n : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n <TableCell align=\"right\">\n <PmMoney value={t.monetaryAmount} />\n </TableCell>\n <TableCell><SyncChip status={t.syncStatus} /></TableCell>\n <TableCell sx={{ maxWidth: 240 }}>\n {t.notes ? (\n <Tooltip title={t.notes}>\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ display: 'block', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }}>\n {t.notes}\n </Typography>\n </Tooltip>\n ) : <Typography variant=\"caption\" color=\"text.disabled\">—</Typography>}\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </PmTable>\n </PmTableCard>\n </PmPageShell>\n </PmGuard>\n </Box>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,IAAM,IAAY;CAChB,SAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAU;CACxF,aAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAc;CAC5F,gBAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAiB;CAC/F,SAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAU;CACxF,QAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAS;CACvF,MAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAO;CACrF,SAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAU;CACxF,YAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAa;CAC3F,QAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAS;CACvF,cAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAe;CAC7F,cAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAe;CAC7F,aAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAc;CAC5F,YAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAe;CAC7F,WAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAc;CAC5F,WAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAe;CAC7F,UAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAc;CAC5F,YAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAe;CAC7F,WAAiB;EAAE,OAAO;EAAW,MAAM;EAA4B,OAAO;CAAc;CAC5F,4BAA4B;EAAE,OAAO;EAAW,MAAM;EAA2B,OAAO;CAAoB;CAC5G,2BAA4B;EAAE,OAAO;EAAW,MAAM;EAA2B,OAAO;CAAmB;CAC3G,0BAA4B;EAAE,OAAO;EAAW,MAAM;EAA2B,OAAO;CAAkB;CAC1G,2BAA4B;EAAE,OAAO;EAAW,MAAM;EAA2B,OAAO;CAAmB;CAC3G,4BAA4B;EAAE,OAAO;EAAW,MAAM;EAA2B,OAAO;CAAoB;AAC9G;AAEA,SAAS,GAAS,EAAE,WAAQ;CAC1B,IAAM,IAAO,EAAU,MAAS;EAAE,OAAO;EAAW,MAAM;EAAyB,OAAO;CAAK,GACzF,IAAO,EAAK;CAClB,OACE,kBAAC,GAAD;EACE,MAAK;EACL,OAAO,EAAK;EACZ,MAAM,kBAAC,GAAD,EAAM,IAAI,EAAE,UAAU,kBAAkB,EAAI,CAAA;EAClD,OAAO,EAAK;EACZ,IAAI;GACF,YAAY;GACZ,QAAQ;GACR,cAAc;GACd,mBAAmB;IAAE,IAAI;IAAM,IAAI;GAAM;EAC3C;CACD,CAAA;AAEL;AAEA,SAAS,GAAS,EAAE,aAAU;CAC5B,IAAM,IAAQ,MAAW,cAAc,YAAY,MAAW,WAAW,UAAU;CACnF,OACE,kBAAC,GAAD;EACE,MAAK;EACL,OAAO,EAAQ,GAAe,CAAM;EAC7B;EACP,SAAQ;EACR,IAAI;GAAE,YAAY;GAAK,QAAQ;GAAI,cAAc;GAAK,UAAU;EAAS;CAC1E,CAAA;AAEL;AAIA,IAAM,IAAe,OAAO,KAAK,CAAS,EAAE,KAAK,OAAW;CAC1D;CACA,OAAO,EAAU,GAAO;AAC1B,EAAE;AAEF,SAAwB,IAAmB;CACzC,IAAM,IAAQ,EAAS,GACjB,IAAc,GAAe,GAC7B,IAAe,GAAgB,GAC/B,CAAC,GAAO,KAAY,EAAS,CAAC,CAAC,GAC/B,CAAC,GAAe,KAAoB,EAAS,CAAC,GAC9C,CAAC,GAAM,KAAW,EAAS,CAAC,GAC5B,CAAC,GAAU,KAAe,EAAS,EAAE,GACrC,CAAC,GAAS,KAAc,EAAS,EAAI,GACrC,CAAC,GAAO,KAAY,EAAS,EAAE,GAK/B,CAAC,GAAS,KAAc,EAAS;EACrC,UAAU;EAAI,QAAQ;EAAI,OAAO,CAAC;EAAG,QAAQ;EAAI,WAAW;CAC9D,CAAC;CAED,eAAe,EAAK,IAAI,GAAM,IAAO,GAAU,IAAI,GAAS;EAE1D,AADA,EAAW,EAAI,GACf,EAAS,EAAE;EACX,IAAI;GACF,IAAM,IAAO,MAAM,EAAkB;IACnC,MAAM;IACN;IACA,UAAU,EAAE,WAAW,IAAI,KAAK,EAAE,QAAQ,EAAE,YAAY,IAAI,KAAA;IAG5D,QAAQ,EAAE,0BAAS,IAAI,KAAK,GAAG,EAAE,OAAO,UAAU,GAAE,YAAY,IAAI,KAAA;IACpE,OAAO,EAAE,MAAM,SAAS,IAAI,EAAE,QAAQ,KAAA;IACtC,WAAW,EAAE,aAAa,KAAA;IAC1B,QAAQ,EAAE,QAAQ,KAAK,KAAK,KAAA;GAC9B,CAAC;GAID,AAHA,EAAS,EAAK,WAAW,CAAC,CAAC,GAC3B,EAAiB,EAAK,iBAAiB,CAAC,GACxC,EAAQ,EAAK,QAAQ,CAAC,GACtB,EAAY,EAAK,QAAQ,CAAI;EAC/B,SAAS,GAAK;GACZ,IAAM,IAAU,GAAK,UAAU,MAAM,WAAW,GAAK,WAAW;GAEhE,AADA,EAAS,CAAO,GAChB,EAAU;IAAE;IAAS,MAAM;GAAQ,CAAC;EACtC,UAAU;GACR,EAAW,EAAK;EAClB;CACF;CAEA,EAAsB,8CAA8C;EAClE,EAAU,GAAG,GAAU,CAAO;CAEhC,GAAG,CAAC,CAAC;CAEL,IAAM,IAAW,MAAkB,IAAI,IAAI,IAAO,IAAW,GACvD,IAAS,IAAO,IAAW,EAAM,QACjC,IAAa,IAAW,IAAI,KAAK,KAAK,IAAgB,CAAQ,IAAI;CAExE,SAAS,EAAa,GAAM;EAE1B,AADA,EAAW,CAAI,GACf,EAAU,GAAG,GAAU,CAAI;CAC7B;CAEA,SAAS,KAAe;EACtB,IAAM,IAAQ;GAAE,UAAU;GAAI,QAAQ;GAAI,OAAO,CAAC;GAAG,QAAQ;GAAI,WAAW;EAAG;EAE/E,AADA,EAAW,CAAK,GAChB,EAAU,GAAG,GAAU,CAAK;CAC9B;CAKA,IAAM,IAAgB;EAAC;EAAQ;EAAQ;EAAS;EAAW;EAAW;EAAO;EAAO;EAAU;EAAS;CAAO,GACxG,IAAa;EAAC;EAAQ;EAAQ;EAAS;EAAW;EAAW;EAAO;EAAO;EAAU;EAAS;CAAO,GACrG,IAAa,SAAc,EAAM,KAAK,OAAO;EACjD,MAAM,EAAE,kBAAkB,EAAe,EAAE,eAAe,IAAI;EAC9D,MAAM,EAAU,EAAE,kBAAkB,SAAS,EAAE,mBAAmB;EAClE,OAAO,GAAG,EAAE,cAAc,EAAE,cAAc,SAAS,aAAa,YAAY,IAAI,EAAE,aAAa,IAAI;EACnG,SAAS,EAAE,eAAe;EAC1B,SAAS,EAAE,eAAe;EAC1B,KAAK,EAAE,aAAa;EACpB,KAAK,EAAE,YAAY;EACnB,QAAQ,EAAE,YAAY,OAA0C,KAAnC,GAAG,EAAa,EAAE,QAAQ,EAAE;EACzD,OAAO,EAAE,kBAAkB,OAAwC,KAAjC,EAAa,EAAE,cAAc;EAC/D,OAAO,EAAE,SAAS;CACpB,EAAE,GAAG,CAAC,CAAK,CAAC;CAEZ,SAAS,EAAc,GAAW;EAEhC,OAAO,8BADO,IAAI,KAAK,GAAE,YAAY,EAAE,QAAQ,SAAS,GAAG,EAAE,MAAM,GAAG,EAClD,EAAM,GAAG;CAC/B;CAEA,SAAS,KAAgB;EACvB,IAAI,EAAW,WAAW,GAAG;GAC3B,EAAU;IAAE,SAAS;IAAmC,MAAM;GAAO,CAAC;GACtE;EACF;EACA,EAAY;GACV,OAAO;GACP,SAAS;GACT,MAAM;GACN,MAAM;GACN,UAAU,EAAc,KAAK;GAC7B,YAAY;GACZ,YAAY;GACZ,aAAa;EACf,CAAC;CACH;CAEA,SAAS,KAAiB;EACxB,IAAI,EAAW,WAAW,GAAG;GAC3B,EAAU;IAAE,SAAS;IAAmC,MAAM;GAAO,CAAC;GACtE;EACF;EACA,EAAkB;GAChB,SAAS;GACT,MAAM;GACN,MAAM;GACN,UAAU,EAAc,MAAM;EAChC,CAAC;CACH;CAEA,OACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,CAAQ,CAAA,GACR,kBAAC,GAAD;EAAS,MAAM;YACf,kBAAC,GAAD;GACE,OAAM;GACN,UAAS;GACT,SACE,kBAAC,GAAD;IAAO,WAAU;IAAM,SAAS;cAAhC;KACE,kBAAC,GAAD;MAAQ,SAAQ;MAAW,WAAW,kBAAC,IAAD,CAA0B,CAAA;MAAG,SAAS;MAAe,UAAU,KAAW,EAAM,WAAW;gBAAG;KAAW,CAAA;KAC/I,kBAAC,GAAD;MAAQ,SAAQ;MAAW,WAAW,kBAAC,IAAD,CAA6B,CAAA;MAAG,SAAS;MAAgB,UAAU,KAAW,EAAM,WAAW;gBAAG;KAAa,CAAA;KACrJ,kBAAC,GAAD;MAAQ,SAAQ;MAAW,WAAW,kBAAC,IAAD,CAAqB,CAAA;MAAG,eAAe,KAAK,EAAK,GAAG,GAAU,CAAO;gBAAG;KAAe,CAAA;IACxH;;aARX;IAWG,IAAQ,kBAAC,IAAD;KAAO,UAAS;KAAQ,IAAI,EAAE,IAAI,EAAE;eAAI;IAAa,CAAA,IAAI;IAGlE,kBAAC,GAAD;KAAK,IAAI;MAAE,IAAI;MAAG,GAAG;MAAG,cAAc;MAAG,QAAQ;MAAa,aAAa;KAAU;eACnF,kBAAC,GAAD;MAAO,WAAW;OAAE,IAAI;OAAU,IAAI;MAAM;MAAG,SAAS;MAAK,YAAY,EAAE,IAAI,SAAS;gBAAxF;OACE,kBAAC,GAAD;QACE,MAAK;QAAQ,MAAK;QAAO,OAAM;QAC/B,iBAAiB,EAAE,QAAQ,GAAK;QAChC,OAAO,EAAQ;QACf,WAAW,MAAM,GAAY,OAAO;SAAE,GAAG;SAAG,UAAU,EAAE,OAAO;QAAM,EAAE;QACvE,IAAI,EAAE,UAAU,IAAI;OACrB,CAAA;OACD,kBAAC,GAAD;QACE,MAAK;QAAQ,MAAK;QAAO,OAAM;QAC/B,iBAAiB,EAAE,QAAQ,GAAK;QAChC,OAAO,EAAQ;QACf,WAAW,MAAM,GAAY,OAAO;SAAE,GAAG;SAAG,QAAQ,EAAE,OAAO;QAAM,EAAE;QACrE,IAAI,EAAE,UAAU,IAAI;OACrB,CAAA;OACD,kBAAC,IAAD;QACE,MAAK;QAAQ,UAAA;QAAS,sBAAA;QACtB,SAAS;QACT,iBAAiB,MAAM,EAAE;QACzB,uBAAuB,GAAG,MAAM,EAAE,UAAU,EAAE;QAC9C,OAAO,EAAa,QAAQ,MAAM,EAAQ,MAAM,SAAS,EAAE,KAAK,CAAC;QACjE,WAAW,GAAG,MAAS,GAAY,OAAO;SAAE,GAAG;SAAG,OAAO,EAAK,KAAK,MAAM,EAAE,KAAK;QAAE,EAAE;QACpF,cAAc,MAAW,kBAAC,GAAD;SAAW,GAAI;SAAQ,OAAM;SAAQ,aAAY;QAAO,CAAA;QACjF,IAAI;SAAE,UAAU;SAAK,UAAU;QAAE;OAClC,CAAA;OACD,kBAAC,GAAD;QAAa,MAAK;QAAQ,IAAI,EAAE,UAAU,IAAI;kBAA9C,CACE,kBAAC,GAAD,EAAA,UAAY,QAAiB,CAAA,GAC7B,kBAAC,GAAD;SAAQ,OAAM;SAAQ,OAAO,EAAQ;SACnC,WAAW,MAAM,GAAY,OAAO;UAAE,GAAG;UAAG,WAAW,EAAE,OAAO;SAAM,EAAE;mBAD1E;UAEE,kBAAC,GAAD;WAAU,OAAM;qBAAG;UAAa,CAAA;UAChC,kBAAC,GAAD;WAAU,OAAM;qBAAW;UAAkB,CAAA;UAC7C,kBAAC,GAAD;WAAU,OAAM;qBAAO;UAAkB,CAAA;SACnC;UACG;;OACb,kBAAC,GAAD;QACE,MAAK;QAAQ,OAAM;QACnB,aAAY;QACZ,OAAO,EAAQ;QACf,WAAW,MAAM,GAAY,OAAO;SAAE,GAAG;SAAG,QAAQ,EAAE,OAAO;QAAM,EAAE;QACrE,YAAY,MAAM;SAAE,AAAI,EAAE,QAAQ,WAAS,EAAa,CAAO;QAAG;QAClE,IAAI;SAAE,UAAU;SAAK,UAAU;QAAE;QACjC,YAAY,EAAE,gBAAgB,kBAAC,IAAD;SAAmB,UAAS;SAAQ,IAAI;UAAE,OAAO;UAAkB,IAAI;SAAE;QAAI,CAAA,EAAE;OAC9G,CAAA;OACD,kBAAC,GAAD;QAAQ,SAAQ;QAAY,eAAe,EAAa,CAAO;QAAG,UAAU;kBAAS;OAAa,CAAA;OAClG,kBAAC,GAAD;QAAQ,SAAQ;QAAO,SAAS;QAAc,UAAU;kBAAS;OAAa,CAAA;MACzE;;IACJ,CAAA;IAEL,kBAAC,IAAD;KACE,SAAQ;KACR,OAAM;KACN,UAAU,IACN,aACA,MAAkB,IAChB,mCACA,WAAW,EAAS,GAAG,EAAO,MAAM,EAAc,UAAU,IAAO,EAAE,MAAM;KACjF,SACE,kBAAC,GAAD;MAAO,WAAU;MAAM,SAAS;MAAK,YAAW;gBAAhD;OACE,kBAAC,GAAD;QAAa,MAAK;QAAQ,SAAQ;QAAW,IAAI;SAAE,UAAU;SAAI,IAAI;QAAE;kBAAvE,CACE,kBAAC,GAAD,EAAA,UAAY,OAAgB,CAAA,GAC5B,kBAAC,GAAD;SAAQ,OAAM;SAAO,OAAO;SAC1B,WAAW,MAAM;UAAE,IAAM,IAAI,OAAO,EAAE,OAAO,KAAK;UAAmB,AAAhB,EAAY,CAAC,GAAG,EAAU,GAAG,GAAG,CAAO;SAAG;mBAC9F;UAAC;UAAI;UAAI;UAAK;SAAG,EAAE,KAAK,MAAM,kBAAC,GAAD;UAAkB,OAAO;oBAAI;SAAY,GAA1B,CAA0B,CAAC;QACnE,CAAA,CACG;;OACb,kBAAC,GAAD;QAAS,OAAM;kBACb,kBAAC,QAAD,EAAA,UACE,kBAAC,GAAD;SACE,MAAK;SACL,UAAU,MAAS,KAAK;SACxB,eAAe,KAAK,EAAK,IAAO,GAAG,GAAU,CAAO;SACpD,IAAI;UAAE,QAAQ;UAAa,aAAa;SAAU;mBAElD,kBAAC,IAAD,EAAwB,UAAS,QAAS,CAAA;QAChC,CAAA,EACR,CAAA;OACC,CAAA;OACT,kBAAC,GAAD;QAAK,IAAI;SAAE,IAAI;SAAG,UAAU;SAAI,WAAW;QAAS;kBAClD,kBAAC,GAAD;SAAY,SAAQ;SAAU,IAAI;UAAE,YAAY;UAAK,OAAO;UAAkB,oBAAoB;SAAe;mBAC9G,MAAkB,IAAI,MAAM,GAAG,EAAS,GAAG;QAClC,CAAA;OACT,CAAA;OACL,kBAAC,GAAD;QAAS,OAAM;kBACb,kBAAC,QAAD,EAAA,UACE,kBAAC,GAAD;SACE,MAAK;SACL,UAAU,IAAO,KAAK,KAAc;SACpC,eAAe,KAAK,EAAK,IAAO,GAAG,GAAU,CAAO;SACpD,IAAI;UAAE,QAAQ;UAAa,aAAa;SAAU;mBAElD,kBAAC,IAAD,EAAyB,UAAS,QAAS,CAAA;QACjC,CAAA,EACR,CAAA;OACC,CAAA;MACJ;;eAGT,kBAAC,IAAD;MAAS,OAAA;gBAAT,CACE,kBAAC,IAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;OACE,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;OAC1B,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;OAC1B,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;OAC3B,kBAAC,GAAD,EAAA,UAAW,gBAAwB,CAAA;OACnC,kBAAC,GAAD;QAAW,OAAM;kBAAQ;OAAc,CAAA;OACvC,kBAAC,GAAD;QAAW,OAAM;kBAAQ;OAAiB,CAAA;OAC1C,kBAAC,GAAD;QAAW,OAAM;kBAAQ;OAAgB,CAAA;OACzC,kBAAC,GAAD,EAAA,UAAW,OAAe,CAAA;OAC1B,kBAAC,GAAD,EAAA,UAAW,QAAgB,CAAA;MACnB,EAAA,CAAA,EACD,CAAA,GACX,kBAAC,IAAD,EAAA,UACG,IACC,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAG,MAChC,kBAAC,GAAD,EAAA,UACG,MAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,GAAI,MAClC,kBAAC,GAAD,EAAA,UAAmB,kBAAC,IAAD,EAAU,QAAQ,GAAK,CAAA,EAAY,GAAtC,CAAsC,CACvD,EACO,GAJK,CAIL,CACX,IACC,EAAM,WAAW,IACnB,kBAAC,IAAD;OACE,SAAS;OACT,MAAM;OACN,OAAM;OACN,MAAK;MACN,CAAA,IACC,EAAM,KAAK,MACb,kBAAC,GAAD;OAAqB,OAAA;iBAArB;QACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;SAAY,SAAQ;SAAQ,IAAI;UAAE,YAAY;UAAK,YAAY;SAAI;mBAChE,EAAe,EAAE,eAAe;QACvB,CAAA,EACH,CAAA;QACX,kBAAC,GAAD,EAAA,UAAW,kBAAC,IAAD,EAAU,MAAM,EAAE,gBAAkB,CAAA,EAAY,CAAA;QAC3D,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;SAAY,SAAQ;SAAQ,IAAI,EAAE,YAAY,IAAI;mBAC/C,EAAE,cAAc,EAAE,cAAc,SAAS,aAAa;QAC7C,CAAA,GACZ,kBAAC,GAAD;SAAY,SAAQ;SAAU,OAAM;mBACjC,EAAE;QACO,CAAA,CACH,EAAA,CAAA;QACX,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;SAAO,WAAU;SAAM,YAAW;SAAW,SAAS;SAAG,IAAI,EAAE,UAAU,EAAE;mBAA3E;UACE,kBAAC,GAAD;WAAY,SAAQ;WAAQ,IAAI;YAAE,YAAY;YAAK,YAAY;WAAI;WAAG,QAAA;qBACnE,EAAE,eAAe;UACR,CAAA;UACX,EAAE,cACD,kBAAC,GAAD;WACE,WAAU;WACV,IAAI;YACF,IAAI;YACJ,IAAI;YACJ,cAAc;YACd,SAAS,EAAM,EAAM,QAAQ,KAAK,MAAM,EAAG;YAC3C,OAAO;YACP,YAAY;YACZ,UAAU;YACV,YAAY;WACd;qBAEC,EAAE;UACA,CAAA,IACH;UACH,EAAE,YACD,kBAAC,GAAD;WACE,WAAU;WACV,IAAI;YACF,SAAS;YACT,IAAI;YACJ,IAAI;YACJ,cAAc;YACd,SAAS,EAAM,EAAM,QAAQ,QAAQ,MAAM,GAAI;YAC/C,OAAO;YACP,YAAY;YACZ,UAAU;YACV,YAAY;WACd;qBAEC,EAAE;UACA,CAAA,IACH;SACC;WACE,CAAA;QACX,kBAAC,GAAD;SAAW,OAAM;mBACd,EAAE,YAAY,OAEX,kBAAC,GAAD;UAAY,SAAQ;UAAU,OAAM;oBAAgB;SAAa,CAAA,IADjE,kBAAC,GAAD;UAAY,SAAQ;UAAQ,IAAI;WAAE,YAAY;WAAK,oBAAoB;UAAe;oBAAI,EAAE;SAAqB,CAAA;QAE5G,CAAA;QACX,kBAAC,GAAD;SAAW,OAAM;mBACd,EAAE,YAAY,OAEX,kBAAC,GAAD;UAAY,SAAQ;UAAU,OAAM;oBAAgB;SAAa,CAAA,IADjE,kBAAC,GAAD;UAAY,SAAQ;UAAQ,IAAI;WAAE,YAAY;WAAK,oBAAoB;UAAe;oBAAtF,CAA0F,EAAa,EAAE,QAAQ,GAAE,KAAe;;QAE7H,CAAA;QACX,kBAAC,GAAD;SAAW,OAAM;mBACf,kBAAC,IAAD,EAAS,OAAO,EAAE,eAAiB,CAAA;QAC1B,CAAA;QACX,kBAAC,GAAD,EAAA,UAAW,kBAAC,IAAD,EAAU,QAAQ,EAAE,WAAa,CAAA,EAAY,CAAA;QACxD,kBAAC,GAAD;SAAW,IAAI,EAAE,UAAU,IAAI;mBAC5B,EAAE,QACD,kBAAC,GAAD;UAAS,OAAO,EAAE;oBAChB,kBAAC,GAAD;WAAY,SAAQ;WAAU,OAAM;WAAiB,IAAI;YAAE,SAAS;YAAS,UAAU;YAAU,cAAc;YAAY,YAAY;WAAS;qBAC7I,EAAE;UACO,CAAA;SACL,CAAA,IACP,kBAAC,GAAD;UAAY,SAAQ;UAAU,OAAM;oBAAgB;SAAa,CAAA;QAC5D,CAAA;OACH;SAhFK,EAAE,EAgFP,CACX,EACQ,CAAA,CACJ;;IACE,CAAA;GACF;;CACJ,CAAA,CACN,EAAA,CAAA;AAET"}