@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.
- package/dist/assethandler/AssetHandlerRoot.js +0 -24
- package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
- package/dist/assethandler/AssetHandlerRoutes.js +92 -160
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +367 -402
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +29 -26
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +278 -164
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +200 -242
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +192 -286
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +204 -296
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +38 -42
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +212 -236
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +41 -85
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +37 -86
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +82 -98
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +6 -22
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +4 -34
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +105 -150
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +116 -152
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js +68 -2206
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/toast.js +33 -0
- package/dist/assethandler/utils/toast.js.map +1 -0
- package/package.json +5 -4
- package/dist/assethandler/pages/AssetsAssetEditPage.js +0 -353
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +0 -1
- package/dist/assethandler/pages/AuditTrailPage.js +0 -215
- package/dist/assethandler/pages/AuditTrailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +0 -177
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +0 -162
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +0 -143
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +0 -163
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +0 -208
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +0 -236
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +0 -144
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +0 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +0 -149
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +0 -1
- package/dist/assethandler/pages/UsersPage.js +0 -208
- package/dist/assethandler/pages/UsersPage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +0 -220
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +0 -373
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +0 -264
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +0 -206
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +0 -171
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +0 -173
- 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 {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
13
|
-
let {
|
|
14
|
-
|
|
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__ */
|
|
63
|
+
/* @__PURE__ */ S("div", {
|
|
18
64
|
className: "flex items-center justify-between",
|
|
19
|
-
children: [/* @__PURE__ */
|
|
65
|
+
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
|
|
20
66
|
className: "text-2xl font-bold",
|
|
21
|
-
children: /* @__PURE__ */
|
|
22
|
-
}), /* @__PURE__ */
|
|
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:
|
|
28
|
-
variant: "outline",
|
|
73
|
+
children: /* @__PURE__ */ S(u, {
|
|
29
74
|
size: "sm",
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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__ */
|
|
38
|
-
/* @__PURE__ */ x("
|
|
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__ */
|
|
153
|
+
/* @__PURE__ */ S(p, { children: [/* @__PURE__ */ S("div", {
|
|
42
154
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
43
|
-
children: [/* @__PURE__ */
|
|
44
|
-
}), /* @__PURE__ */
|
|
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:
|
|
158
|
+
children: X.length
|
|
47
159
|
})] }),
|
|
48
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
|
|
49
161
|
className: "pt-4",
|
|
50
|
-
children: [/* @__PURE__ */
|
|
162
|
+
children: [/* @__PURE__ */ S("div", {
|
|
51
163
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
52
|
-
children: [/* @__PURE__ */
|
|
53
|
-
}), /* @__PURE__ */
|
|
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:
|
|
167
|
+
children: Z.length
|
|
56
168
|
})]
|
|
57
169
|
}) }),
|
|
58
|
-
/* @__PURE__ */
|
|
170
|
+
/* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
|
|
59
171
|
className: "pt-4",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
172
|
+
children: [/* @__PURE__ */ S("div", {
|
|
61
173
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
62
|
-
children: [/* @__PURE__ */
|
|
63
|
-
}), /* @__PURE__ */
|
|
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:
|
|
177
|
+
children: Q.length
|
|
66
178
|
})]
|
|
67
179
|
}) }),
|
|
68
|
-
/* @__PURE__ */
|
|
180
|
+
/* @__PURE__ */ x(d, { children: /* @__PURE__ */ S(f, {
|
|
69
181
|
className: "pt-4",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
182
|
+
children: [/* @__PURE__ */ S("div", {
|
|
71
183
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
72
|
-
children: [/* @__PURE__ */
|
|
73
|
-
}), /* @__PURE__ */
|
|
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:
|
|
187
|
+
children: Y.length
|
|
76
188
|
})]
|
|
77
189
|
}) })
|
|
78
190
|
]
|
|
79
191
|
}),
|
|
80
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ S("div", {
|
|
81
193
|
className: "relative max-w-md",
|
|
82
|
-
children: [/* @__PURE__ */
|
|
83
|
-
placeholder: "Search by asset or
|
|
84
|
-
value:
|
|
85
|
-
onChange: (e) =>
|
|
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__ */
|
|
201
|
+
/* @__PURE__ */ S(_, {
|
|
90
202
|
defaultValue: "all",
|
|
91
|
-
children: [/* @__PURE__ */
|
|
92
|
-
/* @__PURE__ */
|
|
203
|
+
children: [/* @__PURE__ */ S(y, { children: [
|
|
204
|
+
/* @__PURE__ */ S(b, {
|
|
93
205
|
value: "all",
|
|
94
206
|
children: [
|
|
95
207
|
"All (",
|
|
96
|
-
|
|
208
|
+
$.length,
|
|
97
209
|
")"
|
|
98
210
|
]
|
|
99
211
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ S(b, {
|
|
101
213
|
value: "active",
|
|
102
214
|
children: [
|
|
103
215
|
"Active (",
|
|
104
|
-
|
|
216
|
+
X.length,
|
|
105
217
|
")"
|
|
106
218
|
]
|
|
107
219
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ S(b, {
|
|
109
221
|
value: "overdue",
|
|
110
222
|
children: [
|
|
111
223
|
"Overdue (",
|
|
112
|
-
|
|
224
|
+
Z.length,
|
|
113
225
|
")"
|
|
114
226
|
]
|
|
115
227
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ S(b, {
|
|
117
229
|
value: "returned",
|
|
118
230
|
children: [
|
|
119
231
|
"Returned (",
|
|
120
|
-
|
|
232
|
+
Q.length,
|
|
121
233
|
")"
|
|
122
234
|
]
|
|
123
235
|
})
|
|
124
236
|
] }), [
|
|
125
|
-
"all",
|
|
126
|
-
"active",
|
|
127
|
-
"overdue",
|
|
128
|
-
"returned"
|
|
129
|
-
].map((e) => {
|
|
130
|
-
let
|
|
131
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
246
|
+
children: /* @__PURE__ */ x(d, { children: /* @__PURE__ */ x(f, {
|
|
135
247
|
className: "p-0",
|
|
136
|
-
children: /* @__PURE__ */
|
|
248
|
+
children: /* @__PURE__ */ S("div", {
|
|
137
249
|
className: "overflow-x-auto",
|
|
138
|
-
children: [
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
children: e.
|
|
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
|
-
},
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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 {
|
|
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":"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"}
|
|
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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"}
|