@burdenoff/microfe-assethandler 2026.625.2 → 2026.703.1

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 (76) hide show
  1. package/dist/assethandler/AssetHandlerRoot.js +0 -24
  2. package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
  3. package/dist/assethandler/AssetHandlerRoutes.js +92 -160
  4. package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
  5. package/dist/assethandler/pages/AnalyticsPage.js +367 -402
  6. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +29 -26
  8. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +278 -164
  10. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetCreatePage.js +200 -242
  12. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetDetailPage.js +192 -286
  14. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.js +204 -296
  16. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  17. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +38 -42
  18. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  19. package/dist/assethandler/pages/DashboardPage.js +212 -236
  20. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  21. package/dist/assethandler/pages/ItilIncidentDetailPage.js +41 -85
  22. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  23. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +1 -1
  24. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  25. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +37 -86
  26. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  27. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +82 -98
  28. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  29. package/dist/assethandler/pages/OperationsOperationsHubPage.js +6 -22
  30. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  31. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +4 -34
  32. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +105 -150
  34. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  35. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +116 -152
  36. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  37. package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
  38. package/dist/assethandler/store/assethandlerStore.js +68 -2206
  39. package/dist/assethandler/store/assethandlerStore.js.map +1 -1
  40. package/dist/assethandler/utils/toast.js +33 -0
  41. package/dist/assethandler/utils/toast.js.map +1 -0
  42. package/package.json +5 -4
  43. package/dist/assethandler/pages/AssetsAssetEditPage.js +0 -353
  44. package/dist/assethandler/pages/AssetsAssetEditPage.js.map +0 -1
  45. package/dist/assethandler/pages/AuditTrailPage.js +0 -215
  46. package/dist/assethandler/pages/AuditTrailPage.js.map +0 -1
  47. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +0 -177
  48. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +0 -1
  49. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +0 -162
  50. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +0 -1
  51. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +0 -143
  52. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +0 -1
  53. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +0 -163
  54. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +0 -1
  55. package/dist/assethandler/pages/ReportsReportBuilderPage.js +0 -208
  56. package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +0 -1
  57. package/dist/assethandler/pages/ReportsReportsDashboardPage.js +0 -236
  58. package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +0 -1
  59. package/dist/assethandler/pages/ReportsReportsListPage.js +0 -144
  60. package/dist/assethandler/pages/ReportsReportsListPage.js.map +0 -1
  61. package/dist/assethandler/pages/SecurityScheduleBackupPage.js +0 -149
  62. package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +0 -1
  63. package/dist/assethandler/pages/UsersPage.js +0 -208
  64. package/dist/assethandler/pages/UsersPage.js.map +0 -1
  65. package/dist/assethandler/pages/UsersUserCreatePage.js +0 -220
  66. package/dist/assethandler/pages/UsersUserCreatePage.js.map +0 -1
  67. package/dist/assethandler/pages/UsersUserManagementHubPage.js +0 -373
  68. package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +0 -1
  69. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +0 -264
  70. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +0 -1
  71. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +0 -206
  72. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +0 -1
  73. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +0 -171
  74. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +0 -1
  75. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +0 -173
  76. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +0 -1
@@ -1,238 +1,352 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
- import { useState as t } from "react";
3
- import { AlertTriangle as n, ArrowDownToLine as r, ArrowUpFromLine as i, Clock as a, Search as o } from "lucide-react";
4
- import { Badge as s, Button as c, Card as l, CardContent as u, EmphasisPanel as d, GradientText as f, IllustratedEmptyState as p, Input as m, PagePurpose as h, Tabs as g, TabsContent as _, TabsList as v, TabsTrigger as y } from "@burdenoff/fe-libs/ui";
5
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
2
+ import { notify as t } from "../utils/toast.js";
3
+ import { useMemo as n, useState as r } from "react";
4
+ import { AlertTriangle as i, ArrowDownToLine as a, ArrowUpFromLine as o, Clock as s, Search as c } from "lucide-react";
5
+ import { Badge as l, Button as u, Card as d, CardContent as f, EmphasisPanel as p, GradientText as m, IllustratedEmptyState as h, Input as g, PagePurpose as ee, Tabs as _, TabsContent as v, TabsList as y, TabsTrigger as b } from "@burdenoff/fe-libs/ui";
6
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
7
+ import { gql as C } from "@apollo/client";
8
+ import { useMutation as w, useQuery as T } from "@apollo/client/react";
6
9
  //#region src/assethandler/pages/AssetsAssetCheckInOutPage.tsx
7
- var S = {
8
- active: "default",
9
- returned: "secondary",
10
- overdue: "destructive"
10
+ var E = C`
11
+ query AssetHandlerAssetAssignments {
12
+ assetAssignments {
13
+ id
14
+ assetId
15
+ assetName
16
+ assignedTo
17
+ assignedBy
18
+ checkedOutAt
19
+ dueAt
20
+ checkedInAt
21
+ status
22
+ notes
23
+ }
24
+ }
25
+ `, D = C`
26
+ mutation AssetHandlerCheckOutAsset($input: CheckOutAssetInput!) {
27
+ checkOutAsset(input: $input) {
28
+ id
29
+ status
30
+ }
31
+ }
32
+ `, O = C`
33
+ mutation AssetHandlerCheckInAsset($input: CheckInAssetInput!) {
34
+ checkInAsset(input: $input) {
35
+ id
36
+ status
37
+ }
38
+ }
39
+ `, k = {
40
+ CHECKED_OUT: "default",
41
+ RETURNED: "secondary",
42
+ OVERDUE: "destructive"
43
+ }, A = {
44
+ CHECKED_OUT: "checked out",
45
+ RETURNED: "returned",
46
+ OVERDUE: "overdue"
11
47
  };
12
- function C() {
13
- let { checkInOutRecords: C } = e(), [w, T] = t(""), E = C.filter((e) => e.status === "active"), D = C.filter((e) => e.status === "overdue"), O = C.filter((e) => e.status === "returned"), k = C.filter((e) => w === "" || e.assetName.toLowerCase().includes(w.toLowerCase()) || e.userName.toLowerCase().includes(w.toLowerCase()));
14
- return /* @__PURE__ */ x("div", {
48
+ function j() {
49
+ let { assets: C } = e(), [j, M] = r(""), [te, N] = r(!1), [P, F] = r(""), [I, L] = r(""), [R, z] = r(""), [B, V] = r(""), { data: H, loading: U, refetch: W } = T(E, { fetchPolicy: "cache-and-network" }), [G, { loading: K }] = w(D, {
50
+ onCompleted: () => {
51
+ t.success("Asset checked out", "The assignment has been recorded."), N(!1), F(""), L(""), z(""), V(""), W();
52
+ },
53
+ onError: (e) => t.error("Check-out failed", e.message)
54
+ }), [q, { loading: J }] = w(O, {
55
+ onCompleted: () => {
56
+ t.success("Asset checked in", "The asset has been returned."), W();
57
+ },
58
+ onError: (e) => t.error("Check-in failed", e.message)
59
+ }), Y = n(() => H?.assetAssignments ?? [], [H]), X = Y.filter((e) => e.status === "CHECKED_OUT"), Z = Y.filter((e) => e.status === "OVERDUE"), Q = Y.filter((e) => e.status === "RETURNED"), $ = Y.filter((e) => j === "" || e.assetName.toLowerCase().includes(j.toLowerCase()) || e.assignedTo.toLowerCase().includes(j.toLowerCase()));
60
+ return /* @__PURE__ */ S("div", {
15
61
  className: "space-y-6 p-6",
16
62
  children: [
17
- /* @__PURE__ */ x("div", {
63
+ /* @__PURE__ */ S("div", {
18
64
  className: "flex items-center justify-between",
19
- children: [/* @__PURE__ */ x("div", { children: [/* @__PURE__ */ b("h1", {
65
+ children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
20
66
  className: "text-2xl font-bold",
21
- children: /* @__PURE__ */ b(f, { children: "Asset Check-In / Check-Out" })
22
- }), /* @__PURE__ */ b("p", {
67
+ children: /* @__PURE__ */ x(m, { children: "Asset Check-In / Check-Out" })
68
+ }), /* @__PURE__ */ x("p", {
23
69
  className: "text-sm text-text-secondary",
24
70
  children: "Manage asset assignments and returns"
25
71
  })] }), /* @__PURE__ */ x("div", {
26
72
  className: "flex gap-2",
27
- children: [/* @__PURE__ */ x(c, {
28
- variant: "outline",
73
+ children: /* @__PURE__ */ S(u, {
29
74
  size: "sm",
30
- children: [/* @__PURE__ */ b(r, { className: "mr-2 h-4 w-4" }), "Check In"]
31
- }), /* @__PURE__ */ x(c, {
32
- size: "sm",
33
- children: [/* @__PURE__ */ b(i, { className: "mr-2 h-4 w-4" }), "Check Out"]
34
- })]
75
+ onClick: () => N((e) => !e),
76
+ children: [/* @__PURE__ */ x(o, { className: "mr-2 h-4 w-4" }), "Check Out"]
77
+ })
35
78
  })]
36
79
  }),
37
- /* @__PURE__ */ b(h, { children: "Know who has what, right now. Check assets out to people for a job or loan period and check them back in on return — with condition logged each way. Use it to chase overdue items and make sure nothing walks off without a trace." }),
38
- /* @__PURE__ */ x("div", {
80
+ /* @__PURE__ */ x(ee, { children: "Know who has what, right now. Check assets out to people for a job or loan period and check them back in on return. Use it to chase overdue items and make sure nothing walks off without a trace." }),
81
+ te && /* @__PURE__ */ S(p, { children: [/* @__PURE__ */ x("h2", {
82
+ className: "text-sm font-semibold mb-3",
83
+ children: "Check out an asset"
84
+ }), /* @__PURE__ */ S("form", {
85
+ className: "grid gap-3 md:grid-cols-2 lg:grid-cols-4",
86
+ onSubmit: (e) => {
87
+ if (e.preventDefault(), !P || !I.trim()) {
88
+ t.warning("Missing details", "Choose an asset and who is receiving it.");
89
+ return;
90
+ }
91
+ G({ variables: { input: {
92
+ assetId: P,
93
+ assignedTo: I.trim(),
94
+ dueAt: R ? new Date(R).toISOString() : null,
95
+ notes: B.trim() || null
96
+ } } });
97
+ },
98
+ children: [
99
+ /* @__PURE__ */ S("select", {
100
+ className: "rounded-md border px-3 py-2 bg-bg-base",
101
+ value: P,
102
+ onChange: (e) => F(e.target.value),
103
+ "aria-label": "Asset to check out",
104
+ children: [/* @__PURE__ */ x("option", {
105
+ value: "",
106
+ children: "Select an asset…"
107
+ }), C.map((e) => /* @__PURE__ */ S("option", {
108
+ value: e.id,
109
+ children: [
110
+ e.name,
111
+ " (",
112
+ e.assetTag,
113
+ ")"
114
+ ]
115
+ }, e.id))]
116
+ }),
117
+ /* @__PURE__ */ x(g, {
118
+ placeholder: "Assign to (name or email)",
119
+ value: I,
120
+ onChange: (e) => L(e.target.value)
121
+ }),
122
+ /* @__PURE__ */ x(g, {
123
+ type: "date",
124
+ "aria-label": "Due date",
125
+ value: R,
126
+ onChange: (e) => z(e.target.value)
127
+ }),
128
+ /* @__PURE__ */ x(g, {
129
+ placeholder: "Notes (optional)",
130
+ value: B,
131
+ onChange: (e) => V(e.target.value)
132
+ }),
133
+ /* @__PURE__ */ S("div", {
134
+ className: "md:col-span-2 lg:col-span-4 flex gap-2",
135
+ children: [/* @__PURE__ */ x(u, {
136
+ type: "submit",
137
+ size: "sm",
138
+ disabled: K,
139
+ children: K ? "Checking out…" : "Confirm check-out"
140
+ }), /* @__PURE__ */ x(u, {
141
+ type: "button",
142
+ variant: "outline",
143
+ size: "sm",
144
+ onClick: () => N(!1),
145
+ children: "Cancel"
146
+ })]
147
+ })
148
+ ]
149
+ })] }),
150
+ /* @__PURE__ */ S("div", {
39
151
  className: "grid gap-4 md:grid-cols-4",
40
152
  children: [
41
- /* @__PURE__ */ x(d, { children: [/* @__PURE__ */ x("div", {
153
+ /* @__PURE__ */ S(p, { children: [/* @__PURE__ */ S("div", {
42
154
  className: "flex items-center gap-2 text-sm text-text-secondary",
43
- children: [/* @__PURE__ */ b(i, { className: "h-4 w-4" }), "Active Checkouts"]
44
- }), /* @__PURE__ */ b("p", {
155
+ children: [/* @__PURE__ */ x(o, { className: "h-4 w-4" }), "Active Checkouts"]
156
+ }), /* @__PURE__ */ x("p", {
45
157
  className: "text-2xl font-bold mt-1 tabular-nums",
46
- children: E.length
158
+ children: X.length
47
159
  })] }),
48
- /* @__PURE__ */ b(l, { children: /* @__PURE__ */ x(u, {
160
+ /* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
49
161
  className: "pt-4",
50
- children: [/* @__PURE__ */ x("div", {
162
+ children: [/* @__PURE__ */ S("div", {
51
163
  className: "flex items-center gap-2 text-sm text-text-secondary",
52
- children: [/* @__PURE__ */ b(n, { className: "h-4 w-4 text-status-error-text" }), "Overdue"]
53
- }), /* @__PURE__ */ b("p", {
164
+ children: [/* @__PURE__ */ x(i, { className: "h-4 w-4 text-status-error-text" }), "Overdue"]
165
+ }), /* @__PURE__ */ x("p", {
54
166
  className: "text-2xl font-bold mt-1 text-status-error-text",
55
- children: D.length
167
+ children: Z.length
56
168
  })]
57
169
  }) }),
58
- /* @__PURE__ */ b(l, { children: /* @__PURE__ */ x(u, {
170
+ /* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
59
171
  className: "pt-4",
60
- children: [/* @__PURE__ */ x("div", {
172
+ children: [/* @__PURE__ */ S("div", {
61
173
  className: "flex items-center gap-2 text-sm text-text-secondary",
62
- children: [/* @__PURE__ */ b(r, { className: "h-4 w-4" }), "Returned"]
63
- }), /* @__PURE__ */ b("p", {
174
+ children: [/* @__PURE__ */ x(a, { className: "h-4 w-4" }), "Returned"]
175
+ }), /* @__PURE__ */ x("p", {
64
176
  className: "text-2xl font-bold mt-1",
65
- children: O.length
177
+ children: Q.length
66
178
  })]
67
179
  }) }),
68
- /* @__PURE__ */ b(l, { children: /* @__PURE__ */ x(u, {
180
+ /* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
69
181
  className: "pt-4",
70
- children: [/* @__PURE__ */ x("div", {
182
+ children: [/* @__PURE__ */ S("div", {
71
183
  className: "flex items-center gap-2 text-sm text-text-secondary",
72
- children: [/* @__PURE__ */ b(a, { className: "h-4 w-4" }), "Total Records"]
73
- }), /* @__PURE__ */ b("p", {
184
+ children: [/* @__PURE__ */ x(s, { className: "h-4 w-4" }), "Total Records"]
185
+ }), /* @__PURE__ */ x("p", {
74
186
  className: "text-2xl font-bold mt-1",
75
- children: C.length
187
+ children: Y.length
76
188
  })]
77
189
  }) })
78
190
  ]
79
191
  }),
80
- /* @__PURE__ */ x("div", {
192
+ /* @__PURE__ */ S("div", {
81
193
  className: "relative max-w-md",
82
- children: [/* @__PURE__ */ b(o, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ b(m, {
83
- placeholder: "Search by asset or user name...",
84
- value: w,
85
- onChange: (e) => T(e.target.value),
194
+ children: [/* @__PURE__ */ x(c, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ x(g, {
195
+ placeholder: "Search by asset or person…",
196
+ value: j,
197
+ onChange: (e) => M(e.target.value),
86
198
  className: "pl-9"
87
199
  })]
88
200
  }),
89
- /* @__PURE__ */ x(g, {
201
+ /* @__PURE__ */ S(_, {
90
202
  defaultValue: "all",
91
- children: [/* @__PURE__ */ x(v, { children: [
92
- /* @__PURE__ */ x(y, {
203
+ children: [/* @__PURE__ */ S(y, { children: [
204
+ /* @__PURE__ */ S(b, {
93
205
  value: "all",
94
206
  children: [
95
207
  "All (",
96
- k.length,
208
+ $.length,
97
209
  ")"
98
210
  ]
99
211
  }),
100
- /* @__PURE__ */ x(y, {
212
+ /* @__PURE__ */ S(b, {
101
213
  value: "active",
102
214
  children: [
103
215
  "Active (",
104
- E.length,
216
+ X.length,
105
217
  ")"
106
218
  ]
107
219
  }),
108
- /* @__PURE__ */ x(y, {
220
+ /* @__PURE__ */ S(b, {
109
221
  value: "overdue",
110
222
  children: [
111
223
  "Overdue (",
112
- D.length,
224
+ Z.length,
113
225
  ")"
114
226
  ]
115
227
  }),
116
- /* @__PURE__ */ x(y, {
228
+ /* @__PURE__ */ S(b, {
117
229
  value: "returned",
118
230
  children: [
119
231
  "Returned (",
120
- O.length,
232
+ Q.length,
121
233
  ")"
122
234
  ]
123
235
  })
124
236
  ] }), [
125
- "all",
126
- "active",
127
- "overdue",
128
- "returned"
129
- ].map((e) => {
130
- let t = e === "all" ? k : k.filter((t) => t.status === e);
131
- return /* @__PURE__ */ b(_, {
237
+ ["all", null],
238
+ ["active", "CHECKED_OUT"],
239
+ ["overdue", "OVERDUE"],
240
+ ["returned", "RETURNED"]
241
+ ].map(([e, t]) => {
242
+ let n = t === null ? $ : $.filter((e) => e.status === t);
243
+ return /* @__PURE__ */ x(v, {
132
244
  value: e,
133
245
  className: "mt-4",
134
- children: /* @__PURE__ */ b(l, { children: /* @__PURE__ */ b(u, {
246
+ children: /* @__PURE__ */ x(d, { children: /* @__PURE__ */ x(f, {
135
247
  className: "p-0",
136
- children: /* @__PURE__ */ x("div", {
248
+ children: /* @__PURE__ */ S("div", {
137
249
  className: "overflow-x-auto",
138
- children: [/* @__PURE__ */ x("table", {
139
- className: "w-full text-sm",
140
- children: [/* @__PURE__ */ b("thead", { children: /* @__PURE__ */ x("tr", {
141
- className: "border-b bg-bg-sunken/50",
142
- children: [
143
- /* @__PURE__ */ b("th", {
144
- className: "text-left p-3 font-medium",
145
- children: "ID"
146
- }),
147
- /* @__PURE__ */ b("th", {
148
- className: "text-left p-3 font-medium",
149
- children: "Type"
150
- }),
151
- /* @__PURE__ */ b("th", {
152
- className: "text-left p-3 font-medium",
153
- children: "Asset"
154
- }),
155
- /* @__PURE__ */ b("th", {
156
- className: "text-left p-3 font-medium",
157
- children: "User"
158
- }),
159
- /* @__PURE__ */ b("th", {
160
- className: "text-left p-3 font-medium",
161
- children: "Date"
162
- }),
163
- /* @__PURE__ */ b("th", {
164
- className: "text-left p-3 font-medium",
165
- children: "Expected Return"
166
- }),
167
- /* @__PURE__ */ b("th", {
168
- className: "text-left p-3 font-medium",
169
- children: "Condition"
170
- }),
171
- /* @__PURE__ */ b("th", {
172
- className: "text-left p-3 font-medium",
173
- children: "Status"
174
- })
175
- ]
176
- }) }), /* @__PURE__ */ b("tbody", { children: t.map((e) => /* @__PURE__ */ x("tr", {
177
- className: "border-b hover:bg-bg-sunken/50",
178
- children: [
179
- /* @__PURE__ */ b("td", {
180
- className: "p-3 font-mono text-xs",
181
- children: e.id
182
- }),
183
- /* @__PURE__ */ b("td", {
184
- className: "p-3",
185
- children: /* @__PURE__ */ x("div", {
186
- className: "flex items-center gap-1.5",
187
- children: [e.type === "check_out" ? /* @__PURE__ */ b(i, { className: "h-3.5 w-3.5 text-status-info-text" }) : /* @__PURE__ */ b(r, { className: "h-3.5 w-3.5 text-status-success-text" }), /* @__PURE__ */ b("span", {
188
- className: "capitalize text-xs",
189
- children: e.type.replace("_", " ")
190
- })]
250
+ children: [
251
+ /* @__PURE__ */ S("table", {
252
+ className: "w-full text-sm",
253
+ children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
254
+ className: "border-b bg-bg-sunken/50",
255
+ children: [
256
+ /* @__PURE__ */ x("th", {
257
+ className: "text-left p-3 font-medium",
258
+ children: "Asset"
259
+ }),
260
+ /* @__PURE__ */ x("th", {
261
+ className: "text-left p-3 font-medium",
262
+ children: "Assigned To"
263
+ }),
264
+ /* @__PURE__ */ x("th", {
265
+ className: "text-left p-3 font-medium",
266
+ children: "Checked Out"
267
+ }),
268
+ /* @__PURE__ */ x("th", {
269
+ className: "text-left p-3 font-medium",
270
+ children: "Due"
271
+ }),
272
+ /* @__PURE__ */ x("th", {
273
+ className: "text-left p-3 font-medium",
274
+ children: "Returned"
275
+ }),
276
+ /* @__PURE__ */ x("th", {
277
+ className: "text-left p-3 font-medium",
278
+ children: "Status"
279
+ }),
280
+ /* @__PURE__ */ x("th", {
281
+ className: "text-right p-3 font-medium",
282
+ children: "Action"
191
283
  })
192
- }),
193
- /* @__PURE__ */ x("td", {
194
- className: "p-3",
195
- children: [/* @__PURE__ */ b("p", {
196
- className: "font-medium",
197
- children: e.assetName
198
- }), /* @__PURE__ */ b("p", {
199
- className: "text-xs text-text-secondary",
200
- children: e.assetId
201
- })]
202
- }),
203
- /* @__PURE__ */ b("td", {
204
- className: "p-3",
205
- children: /* @__PURE__ */ b("p", {
206
- className: "text-sm",
207
- children: e.userName
208
- })
209
- }),
210
- /* @__PURE__ */ b("td", {
211
- className: "p-3 text-xs",
212
- children: new Date(e.date).toLocaleDateString()
213
- }),
214
- /* @__PURE__ */ b("td", {
215
- className: "p-3 text-xs",
216
- children: e.expectedReturn ? new Date(e.expectedReturn).toLocaleDateString() : "-"
217
- }),
218
- /* @__PURE__ */ b("td", {
219
- className: "p-3 capitalize text-xs",
220
- children: e.condition
221
- }),
222
- /* @__PURE__ */ b("td", {
223
- className: "p-3",
224
- children: /* @__PURE__ */ b(s, {
225
- variant: S[e.status] || "outline",
226
- children: e.status
284
+ ]
285
+ }) }), /* @__PURE__ */ x("tbody", { children: n.map((e) => /* @__PURE__ */ S("tr", {
286
+ className: "border-b hover:bg-bg-sunken/50",
287
+ children: [
288
+ /* @__PURE__ */ S("td", {
289
+ className: "p-3",
290
+ children: [/* @__PURE__ */ x("p", {
291
+ className: "font-medium",
292
+ children: e.assetName
293
+ }), /* @__PURE__ */ x("p", {
294
+ className: "text-xs text-text-secondary",
295
+ children: e.assetId
296
+ })]
297
+ }),
298
+ /* @__PURE__ */ S("td", {
299
+ className: "p-3",
300
+ children: [/* @__PURE__ */ x("p", {
301
+ className: "text-sm",
302
+ children: e.assignedTo
303
+ }), /* @__PURE__ */ S("p", {
304
+ className: "text-xs text-text-secondary",
305
+ children: ["by ", e.assignedBy]
306
+ })]
307
+ }),
308
+ /* @__PURE__ */ x("td", {
309
+ className: "p-3 text-xs",
310
+ children: new Date(e.checkedOutAt).toLocaleDateString()
311
+ }),
312
+ /* @__PURE__ */ x("td", {
313
+ className: "p-3 text-xs",
314
+ children: e.dueAt ? new Date(e.dueAt).toLocaleDateString() : "—"
315
+ }),
316
+ /* @__PURE__ */ x("td", {
317
+ className: "p-3 text-xs",
318
+ children: e.checkedInAt ? new Date(e.checkedInAt).toLocaleDateString() : "—"
319
+ }),
320
+ /* @__PURE__ */ x("td", {
321
+ className: "p-3",
322
+ children: /* @__PURE__ */ x(l, {
323
+ variant: k[e.status],
324
+ children: A[e.status]
325
+ })
326
+ }),
327
+ /* @__PURE__ */ x("td", {
328
+ className: "p-3 text-right",
329
+ children: e.status === "RETURNED" ? null : /* @__PURE__ */ S(u, {
330
+ size: "sm",
331
+ variant: "outline",
332
+ disabled: J,
333
+ onClick: () => void q({ variables: { input: { assignmentId: e.id } } }),
334
+ children: [/* @__PURE__ */ x(a, { className: "mr-1.5 h-3.5 w-3.5" }), "Check In"]
335
+ })
227
336
  })
228
- })
229
- ]
230
- }, e.id)) })]
231
- }), t.length === 0 && /* @__PURE__ */ b(p, {
232
- illustration: w ? "empty-search" : "empty-people",
233
- title: w ? "No matching records" : "No check-in / out records",
234
- description: w ? "No records match your search — try a different name." : "Check an asset out to someone and the activity will appear here."
235
- })]
337
+ ]
338
+ }, e.id)) })]
339
+ }),
340
+ n.length === 0 && !U && /* @__PURE__ */ x(h, {
341
+ illustration: j ? "empty-search" : "empty-people",
342
+ title: j ? "No matching records" : "No check-in / out records",
343
+ description: j ? "No records match your search — try a different name." : "Check an asset out to someone and the activity will appear here."
344
+ }),
345
+ U && n.length === 0 ? /* @__PURE__ */ x("div", {
346
+ className: "space-y-2 p-4",
347
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ x("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
348
+ }) : null
349
+ ]
236
350
  })
237
351
  }) })
238
352
  }, e);
@@ -242,6 +356,6 @@ function C() {
242
356
  });
243
357
  }
244
358
  //#endregion
245
- export { C as AssetsAssetCheckInOutPage };
359
+ export { j as AssetsAssetCheckInOutPage };
246
360
 
247
361
  //# sourceMappingURL=AssetsAssetCheckInOutPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsAssetCheckInOutPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCheckInOutPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowDownToLine, ArrowUpFromLine, Clock, Search, AlertTriangle } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n returned: 'secondary',\n overdue: 'destructive',\n};\n\nexport function AssetsAssetCheckInOutPage() {\n const { checkInOutRecords } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\n\n const activeCheckouts = checkInOutRecords.filter((r) => r.status === 'active');\n const overdueCheckouts = checkInOutRecords.filter((r) => r.status === 'overdue');\n const returnedRecords = checkInOutRecords.filter((r) => r.status === 'returned');\n\n const filteredRecords = checkInOutRecords.filter(\n (r) =>\n searchQuery === '' ||\n r.assetName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n r.userName.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Asset Check-In / Check-Out</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage asset assignments and returns</p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <ArrowDownToLine className=\"mr-2 h-4 w-4\" />\n Check In\n </Button>\n <Button size=\"sm\">\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n Check Out\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Know who has what, right now. Check assets out to people for a job or loan period and check\n them back in on return — with condition logged each way. Use it to chase overdue items and\n make sure nothing walks off without a trace.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowUpFromLine className=\"h-4 w-4\" />\n Active Checkouts\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{activeCheckouts.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Overdue\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {overdueCheckouts.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowDownToLine className=\"h-4 w-4\" />\n Returned\n </div>\n <p className=\"text-2xl font-bold mt-1\">{returnedRecords.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Total Records\n </div>\n <p className=\"text-2xl font-bold mt-1\">{checkInOutRecords.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search by asset or user name...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n <Tabs defaultValue=\"all\">\n <TabsList>\n <TabsTrigger value=\"all\">All ({filteredRecords.length})</TabsTrigger>\n <TabsTrigger value=\"active\">Active ({activeCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"overdue\">Overdue ({overdueCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"returned\">Returned ({returnedRecords.length})</TabsTrigger>\n </TabsList>\n {(['all', 'active', 'overdue', 'returned'] as const).map((tab) => {\n const records =\n tab === 'all' ? filteredRecords : filteredRecords.filter((r) => r.status === tab);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">User</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n <th className=\"text-left p-3 font-medium\">Expected Return</th>\n <th className=\"text-left p-3 font-medium\">Condition</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => (\n <tr key={rec.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3 font-mono text-xs\">{rec.id}</td>\n <td className=\"p-3\">\n <div className=\"flex items-center gap-1.5\">\n {rec.type === 'check_out' ? (\n <ArrowUpFromLine className=\"h-3.5 w-3.5 text-status-info-text\" />\n ) : (\n <ArrowDownToLine className=\"h-3.5 w-3.5 text-status-success-text\" />\n )}\n <span className=\"capitalize text-xs\">\n {rec.type.replace('_', ' ')}\n </span>\n </div>\n </td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{rec.assetName}</p>\n <p className=\"text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <p className=\"text-sm\">{rec.userName}</p>\n </td>\n <td className=\"p-3 text-xs\">\n {new Date(rec.date).toLocaleDateString()}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.expectedReturn\n ? new Date(rec.expectedReturn).toLocaleDateString()\n : '-'}\n </td>\n <td className=\"p-3 capitalize text-xs\">{rec.condition}</td>\n <td className=\"p-3\">\n <Badge variant={statusColors[rec.status] || 'outline'}>\n {rec.status}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {records.length === 0 && (\n <IllustratedEmptyState\n illustration={searchQuery ? 'empty-search' : 'empty-people'}\n title={searchQuery ? 'No matching records' : 'No check-in / out records'}\n description={\n searchQuery\n ? 'No records match your search — try a different name.'\n : 'Check an asset out to someone and the activity will appear here.'\n }\n />\n )}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n}\n"],"mappings":";;;;;;AAmBA,IAAM,IAAoF;CACxF,QAAQ;CACR,UAAU;CACV,SAAS;CACV;AAED,SAAgB,IAA4B;CAC1C,IAAM,EAAE,yBAAsB,GAAsB,EAC9C,CAAC,GAAa,KAAkB,EAAS,GAAG,EAE5C,IAAkB,EAAkB,QAAQ,MAAM,EAAE,WAAW,SAAS,EACxE,IAAmB,EAAkB,QAAQ,MAAM,EAAE,WAAW,UAAU,EAC1E,IAAkB,EAAkB,QAAQ,MAAM,EAAE,WAAW,WAAW,EAE1E,IAAkB,EAAkB,QACvC,MACC,MAAgB,MAChB,EAAE,UAAU,aAAa,CAAC,SAAS,EAAY,aAAa,CAAC,IAC7D,EAAE,SAAS,aAAa,CAAC,SAAS,EAAY,aAAa,CAAC,CAC/D;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,8BAAyC,CAAA;KACpD,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAwC,CAAA,CAC/E,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAQ,SAAQ;MAAU,MAAK;gBAA/B,CACE,kBAAC,GAAD,EAAiB,WAAU,gBAAiB,CAAA,EAAA,WAErC;SACT,kBAAC,GAAD;MAAQ,MAAK;gBAAb,CACE,kBAAC,GAAD,EAAiB,WAAU,gBAAiB,CAAA,EAAA,YAErC;QACL;OACF;;GAEN,kBAAC,GAAD,EAAA,UAAa,uOAIC,CAAA;GAEd,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAiB,WAAU,WAAY,CAAA,EAAA,mBAEnC;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAwC,EAAgB;MAAW,CAAA,CAClE,EAAA,CAAA;KAChB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAe,WAAU,kCAAmC,CAAA,EAAA,UAExD;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAiB;OAChB,CAAA,CACQ;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAiB,WAAU,WAAY,CAAA,EAAA,WAEnC;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAgB;OAAW,CAAA,CACvD;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA,EAAA,gBAEzB;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAkB;OAAW,CAAA,CACzD;SACT,CAAA;KACH;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;KACE,aAAY;KACZ,OAAO;KACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;KAC/C,WAAU;KACV,CAAA,CACE;;GAEN,kBAAC,GAAD;IAAM,cAAa;cAAnB,CACE,kBAAC,GAAD,EAAA,UAAA;KACE,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAAyB;OAAM,EAAgB;OAAO;OAAe;;KACrE,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAA4B;OAAS,EAAgB;OAAO;OAAe;;KAC3E,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAA6B;OAAU,EAAiB;OAAO;OAAe;;KAC9E,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAA8B;OAAW,EAAgB;OAAO;OAAe;;KACtE,EAAA,CAAA,EACT;KAAC;KAAO;KAAU;KAAW;KAAW,CAAW,KAAK,MAAQ;KAChE,IAAM,IACJ,MAAQ,QAAQ,IAAkB,EAAgB,QAAQ,MAAM,EAAE,WAAW,EAAI;AACnF,YACE,kBAAC,GAAD;MAAuB,OAAO;MAAK,WAAU;gBAC3C,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAO,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAoB,CAAA;WAC9D,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAc,CAAA;WACxD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WAClD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAQ,KAAK,MACZ,kBAAC,MAAD;UAAiB,WAAU;oBAA3B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAI;YAAQ,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,OAAD;aAAK,WAAU;uBAAf,CACG,EAAI,SAAS,cACZ,kBAAC,GAAD,EAAiB,WAAU,qCAAsC,CAAA,GAEjE,kBAAC,GAAD,EAAiB,WAAU,wCAAyC,CAAA,EAEtE,kBAAC,QAAD;cAAM,WAAU;wBACb,EAAI,KAAK,QAAQ,KAAK,IAAI;cACtB,CAAA,CACH;;YACH,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAd,CACE,kBAAC,KAAD;aAAG,WAAU;uBAAe,EAAI;aAAc,CAAA,EAC9C,kBAAC,KAAD;aAAG,WAAU;uBAA+B,EAAI;aAAY,CAAA,CACzD;;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,KAAD;aAAG,WAAU;uBAAW,EAAI;aAAa,CAAA;YACtC,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACX,IAAI,KAAK,EAAI,KAAK,CAAC,oBAAoB;YACrC,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACX,EAAI,iBACD,IAAI,KAAK,EAAI,eAAe,CAAC,oBAAoB,GACjD;YACD,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAA0B,EAAI;YAAe,CAAA;WAC3D,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAS,EAAa,EAAI,WAAW;uBACzC,EAAI;aACC,CAAA;YACL,CAAA;WACF;YAnCI,EAAI,GAmCR,CACL,EACI,CAAA,CACF;YACP,EAAQ,WAAW,KAClB,kBAAC,GAAD;SACE,cAAc,IAAc,iBAAiB;SAC7C,OAAO,IAAc,wBAAwB;SAC7C,aACE,IACI,yDACA;SAEN,CAAA,CAEA;;OACM,CAAA,EACT,CAAA;MACK,EAxEI,EAwEJ;MAEhB,CACG;;GACH"}
1
+ {"version":3,"file":"AssetsAssetCheckInOutPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCheckInOutPage.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowDownToLine, ArrowUpFromLine, Clock, Search, AlertTriangle } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\n\n// ─── Backend types (mirror wspace-assethandler-svc AssetAssignment) ───────────\ntype AssignmentStatus = 'CHECKED_OUT' | 'OVERDUE' | 'RETURNED';\n\ninterface AssetAssignment {\n id: string;\n assetId: string;\n assetName: string;\n assignedTo: string;\n assignedBy: string;\n checkedOutAt: string;\n dueAt: string | null;\n checkedInAt: string | null;\n status: AssignmentStatus;\n notes: string | null;\n}\n\nconst ASSET_ASSIGNMENTS_QUERY = gql`\n query AssetHandlerAssetAssignments {\n assetAssignments {\n id\n assetId\n assetName\n assignedTo\n assignedBy\n checkedOutAt\n dueAt\n checkedInAt\n status\n notes\n }\n }\n`;\n\nconst CHECK_OUT_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckOutAsset($input: CheckOutAssetInput!) {\n checkOutAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst CHECK_IN_ASSET_MUTATION = gql`\n mutation AssetHandlerCheckInAsset($input: CheckInAssetInput!) {\n checkInAsset(input: $input) {\n id\n status\n }\n }\n`;\n\nconst statusColors: Record<AssignmentStatus, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n CHECKED_OUT: 'default',\n RETURNED: 'secondary',\n OVERDUE: 'destructive',\n};\n\nconst statusLabels: Record<AssignmentStatus, string> = {\n CHECKED_OUT: 'checked out',\n RETURNED: 'returned',\n OVERDUE: 'overdue',\n};\n\nexport function AssetsAssetCheckInOutPage() {\n const { assets } = useAssetHandlerStore();\n const [searchQuery, setSearchQuery] = useState('');\n const [showCheckout, setShowCheckout] = useState(false);\n const [assetId, setAssetId] = useState('');\n const [assignedTo, setAssignedTo] = useState('');\n const [dueAt, setDueAt] = useState('');\n const [notes, setNotes] = useState('');\n\n const { data, loading, refetch } = useQuery<{ assetAssignments: AssetAssignment[] }>(\n ASSET_ASSIGNMENTS_QUERY,\n { fetchPolicy: 'cache-and-network' }\n );\n\n const [checkOutAsset, { loading: checkingOut }] = useMutation(CHECK_OUT_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked out', 'The assignment has been recorded.');\n setShowCheckout(false);\n setAssetId('');\n setAssignedTo('');\n setDueAt('');\n setNotes('');\n void refetch();\n },\n onError: (error) => notify.error('Check-out failed', error.message),\n });\n\n const [checkInAsset, { loading: checkingIn }] = useMutation(CHECK_IN_ASSET_MUTATION, {\n onCompleted: () => {\n notify.success('Asset checked in', 'The asset has been returned.');\n void refetch();\n },\n onError: (error) => notify.error('Check-in failed', error.message),\n });\n\n const assignments = useMemo(() => data?.assetAssignments ?? [], [data]);\n\n const activeCheckouts = assignments.filter((a) => a.status === 'CHECKED_OUT');\n const overdueCheckouts = assignments.filter((a) => a.status === 'OVERDUE');\n const returnedRecords = assignments.filter((a) => a.status === 'RETURNED');\n\n const filteredRecords = assignments.filter(\n (a) =>\n searchQuery === '' ||\n a.assetName.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.assignedTo.toLowerCase().includes(searchQuery.toLowerCase())\n );\n\n const submitCheckout = (event: React.FormEvent) => {\n event.preventDefault();\n if (!assetId || !assignedTo.trim()) {\n notify.warning('Missing details', 'Choose an asset and who is receiving it.');\n return;\n }\n void checkOutAsset({\n variables: {\n input: {\n assetId,\n assignedTo: assignedTo.trim(),\n dueAt: dueAt ? new Date(dueAt).toISOString() : null,\n notes: notes.trim() || null,\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Asset Check-In / Check-Out</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage asset assignments and returns</p>\n </div>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" onClick={() => setShowCheckout((v) => !v)}>\n <ArrowUpFromLine className=\"mr-2 h-4 w-4\" />\n Check Out\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Know who has what, right now. Check assets out to people for a job or loan period and check\n them back in on return. Use it to chase overdue items and make sure nothing walks off\n without a trace.\n </PagePurpose>\n\n {showCheckout && (\n <EmphasisPanel>\n <h2 className=\"text-sm font-semibold mb-3\">Check out an asset</h2>\n <form className=\"grid gap-3 md:grid-cols-2 lg:grid-cols-4\" onSubmit={submitCheckout}>\n <select\n className=\"rounded-md border px-3 py-2 bg-bg-base\"\n value={assetId}\n onChange={(event) => setAssetId(event.target.value)}\n aria-label=\"Asset to check out\"\n >\n <option value=\"\">Select an asset…</option>\n {assets.map((asset) => (\n <option key={asset.id} value={asset.id}>\n {asset.name} ({asset.assetTag})\n </option>\n ))}\n </select>\n <Input\n placeholder=\"Assign to (name or email)\"\n value={assignedTo}\n onChange={(event) => setAssignedTo(event.target.value)}\n />\n <Input\n type=\"date\"\n aria-label=\"Due date\"\n value={dueAt}\n onChange={(event) => setDueAt(event.target.value)}\n />\n <Input\n placeholder=\"Notes (optional)\"\n value={notes}\n onChange={(event) => setNotes(event.target.value)}\n />\n <div className=\"md:col-span-2 lg:col-span-4 flex gap-2\">\n <Button type=\"submit\" size=\"sm\" disabled={checkingOut}>\n {checkingOut ? 'Checking out…' : 'Confirm check-out'}\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setShowCheckout(false)}\n >\n Cancel\n </Button>\n </div>\n </form>\n </EmphasisPanel>\n )}\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowUpFromLine className=\"h-4 w-4\" />\n Active Checkouts\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{activeCheckouts.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <AlertTriangle className=\"h-4 w-4 text-status-error-text\" />\n Overdue\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {overdueCheckouts.length}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ArrowDownToLine className=\"h-4 w-4\" />\n Returned\n </div>\n <p className=\"text-2xl font-bold mt-1\">{returnedRecords.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Total Records\n </div>\n <p className=\"text-2xl font-bold mt-1\">{assignments.length}</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search by asset or person…\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n\n <Tabs defaultValue=\"all\">\n <TabsList>\n <TabsTrigger value=\"all\">All ({filteredRecords.length})</TabsTrigger>\n <TabsTrigger value=\"active\">Active ({activeCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"overdue\">Overdue ({overdueCheckouts.length})</TabsTrigger>\n <TabsTrigger value=\"returned\">Returned ({returnedRecords.length})</TabsTrigger>\n </TabsList>\n {(\n [\n ['all', null],\n ['active', 'CHECKED_OUT'],\n ['overdue', 'OVERDUE'],\n ['returned', 'RETURNED'],\n ] as const\n ).map(([tab, status]) => {\n const records =\n status === null ? filteredRecords : filteredRecords.filter((r) => r.status === status);\n return (\n <TabsContent key={tab} value={tab} className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Assigned To</th>\n <th className=\"text-left p-3 font-medium\">Checked Out</th>\n <th className=\"text-left p-3 font-medium\">Due</th>\n <th className=\"text-left p-3 font-medium\">Returned</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-right p-3 font-medium\">Action</th>\n </tr>\n </thead>\n <tbody>\n {records.map((rec) => (\n <tr key={rec.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{rec.assetName}</p>\n <p className=\"text-xs text-text-secondary\">{rec.assetId}</p>\n </td>\n <td className=\"p-3\">\n <p className=\"text-sm\">{rec.assignedTo}</p>\n <p className=\"text-xs text-text-secondary\">by {rec.assignedBy}</p>\n </td>\n <td className=\"p-3 text-xs\">\n {new Date(rec.checkedOutAt).toLocaleDateString()}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.dueAt ? new Date(rec.dueAt).toLocaleDateString() : '—'}\n </td>\n <td className=\"p-3 text-xs\">\n {rec.checkedInAt\n ? new Date(rec.checkedInAt).toLocaleDateString()\n : '—'}\n </td>\n <td className=\"p-3\">\n <Badge variant={statusColors[rec.status]}>\n {statusLabels[rec.status]}\n </Badge>\n </td>\n <td className=\"p-3 text-right\">\n {rec.status !== 'RETURNED' ? (\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={checkingIn}\n onClick={() =>\n void checkInAsset({\n variables: { input: { assignmentId: rec.id } },\n })\n }\n >\n <ArrowDownToLine className=\"mr-1.5 h-3.5 w-3.5\" />\n Check In\n </Button>\n ) : null}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n {records.length === 0 && !loading && (\n <IllustratedEmptyState\n illustration={searchQuery ? 'empty-search' : 'empty-people'}\n title={searchQuery ? 'No matching records' : 'No check-in / out records'}\n description={\n searchQuery\n ? 'No records match your search — try a different name.'\n : 'Check an asset out to someone and the activity will appear here.'\n }\n />\n )}\n {loading && records.length === 0 ? (\n <div className=\"space-y-2 p-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : null}\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n );\n })}\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}