@burdenoff/microfe-assethandler 2026.713.2 → 2026.714.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/components/AttachmentsPanel.d.ts.map +1 -1
- package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
- package/dist/assethandler/hooks/useCopy.d.ts +28 -0
- package/dist/assethandler/hooks/useCopy.d.ts.map +1 -0
- package/dist/assethandler/hooks/useCopy.js +33 -0
- package/dist/assethandler/hooks/useCopy.js.map +1 -0
- package/dist/assethandler/index.d.ts +1 -1
- package/dist/assethandler/index.d.ts.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +259 -258
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +1 -2
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +47 -48
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.d.ts.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +236 -236
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +126 -125
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +127 -127
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.d.ts.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/types/index.d.ts +20 -0
- package/dist/assethandler/types/index.d.ts.map +1 -1
- package/dist/types/assistant.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
2
|
import { useHiddenCategoryIds as t } from "../providers/AssetHandlerProvider.js";
|
|
3
3
|
import { useAssetHandlerNavigate as n } from "../hooks/useAssetHandlerNavigate.js";
|
|
4
|
-
import {
|
|
4
|
+
import { useCopy as r } from "../hooks/useCopy.js";
|
|
5
5
|
import { notify as i } from "../utils/toast.js";
|
|
6
6
|
import { formatCompact as a } from "../components/charts/chartTheme.js";
|
|
7
7
|
import { BarsChart as ee } from "../components/charts/BarsChart.js";
|
|
@@ -14,7 +14,6 @@ import { useMemo as c, useState as l, useSyncExternalStore as u } from "react";
|
|
|
14
14
|
import { ArrowDown as ie, ArrowUp as ae, Box as d, Boxes as oe, CheckCircle2 as se, ChevronsUpDown as ce, Code as f, Copy as p, Eye as m, Grid3x3 as le, List as ue, Monitor as h, MoreHorizontal as g, Plus as _, Search as v, Server as y, Table as de, Truck as b, Wifi as x, Wrench as S } from "lucide-react";
|
|
15
15
|
import { Fragment as C, jsx as w, jsxs as T } from "react/jsx-runtime";
|
|
16
16
|
import { Button as E, Card as D, CardContent as O, CardHeader as fe, CardTitle as pe, DropdownMenu as k, DropdownMenuContent as A, DropdownMenuItem as j, DropdownMenuTrigger as M, GradientText as me, IllustratedEmptyState as he, Input as ge, PagePurpose as _e, Select as N, SelectContent as P, SelectItem as F, SelectTrigger as I, SelectValue as L } from "@burdenoff/fe-libs/ui";
|
|
17
|
-
import { useI18n as ve } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
18
17
|
//#region src/assethandler/pages/AssetsAssetListPage.tsx
|
|
19
18
|
var R = {
|
|
20
19
|
active: "bg-status-success-bg-subtle text-status-success-text",
|
|
@@ -28,7 +27,7 @@ var R = {
|
|
|
28
27
|
fair: "text-status-warning-text bg-status-warning-bg-subtle",
|
|
29
28
|
poor: "text-status-warning-text bg-status-warning-bg-subtle",
|
|
30
29
|
damaged: "text-status-error-text bg-status-error-bg-subtle"
|
|
31
|
-
},
|
|
30
|
+
}, ve = {
|
|
32
31
|
active: "var(--color-status-success-bg)",
|
|
33
32
|
maintenance: "var(--color-status-warning-bg)",
|
|
34
33
|
inactive: "var(--color-status-info-bg)",
|
|
@@ -66,7 +65,7 @@ function U({ status: e }) {
|
|
|
66
65
|
children: e.replace(/_/g, " ")
|
|
67
66
|
});
|
|
68
67
|
}
|
|
69
|
-
function
|
|
68
|
+
function ye() {
|
|
70
69
|
return u((e) => {
|
|
71
70
|
if (typeof window > "u" || !window.matchMedia) return () => {};
|
|
72
71
|
let t = window.matchMedia("(max-width: 767px)");
|
|
@@ -74,7 +73,7 @@ function be() {
|
|
|
74
73
|
}, () => typeof window < "u" && window.matchMedia ? window.matchMedia("(max-width: 767px)").matches : !1, () => !1);
|
|
75
74
|
}
|
|
76
75
|
function W() {
|
|
77
|
-
let
|
|
76
|
+
let u = r(), f = n(), p = t(), { assets: m, hydrated: h } = e(), g = ye(), [y, b] = l(""), [x, S] = l("all"), [k, A] = l("all"), [j, M] = l("table"), [R, B] = l(!1), [V, W] = l("name"), [G, K] = l("asc"), q = !R && g && j === "table" ? "list" : j, J = (e) => {
|
|
78
77
|
B(!0), M(e);
|
|
79
78
|
}, Y = c(() => [...new Set(m.map((e) => e.category).filter(Boolean))].filter((e) => !p.has(e)).sort(), [m, p]), X = c(() => m.filter((e) => {
|
|
80
79
|
if (p.has(e.category)) return !1;
|
|
@@ -86,7 +85,7 @@ function W() {
|
|
|
86
85
|
x,
|
|
87
86
|
k,
|
|
88
87
|
p
|
|
89
|
-
]),
|
|
88
|
+
]), xe = c(() => {
|
|
90
89
|
let e = G === "asc" ? 1 : -1;
|
|
91
90
|
return [...X].sort((t, n) => {
|
|
92
91
|
let r = (t[V] ?? "").toString().toLowerCase(), i = (n[V] ?? "").toString().toLowerCase();
|
|
@@ -96,35 +95,35 @@ function W() {
|
|
|
96
95
|
X,
|
|
97
96
|
V,
|
|
98
97
|
G
|
|
99
|
-
]), Z = m.filter((e) => e.status === "active").length,
|
|
98
|
+
]), Z = m.filter((e) => e.status === "active").length, Se = c(() => {
|
|
100
99
|
let e = {};
|
|
101
100
|
for (let t of m) e[t.status] = (e[t.status] || 0) + 1;
|
|
102
101
|
return Object.entries(e).map(([e, t]) => ({
|
|
103
102
|
name: e.charAt(0).toUpperCase() + e.slice(1),
|
|
104
103
|
value: t,
|
|
105
|
-
color:
|
|
104
|
+
color: ve[e]
|
|
106
105
|
}));
|
|
107
|
-
}, [m]),
|
|
106
|
+
}, [m]), Ce = c(() => {
|
|
108
107
|
let e = {};
|
|
109
108
|
for (let t of m) e[t.category] = (e[t.category] || 0) + 1;
|
|
110
109
|
return Object.entries(e).sort((e, t) => t[1] - e[1]).slice(0, 8).map(([e, t]) => ({
|
|
111
110
|
category: e.replace(/_/g, " "),
|
|
112
111
|
count: t
|
|
113
112
|
}));
|
|
114
|
-
}, [m]), Q = re(
|
|
113
|
+
}, [m]), Q = re(xe, {
|
|
115
114
|
pageSize: 12,
|
|
116
115
|
resetKey: `${y}|${x}|${k}|${V}|${G}`
|
|
117
|
-
}),
|
|
116
|
+
}), we = (e) => {
|
|
118
117
|
V === e ? K((e) => e === "asc" ? "desc" : "asc") : (W(e), K("asc"));
|
|
119
118
|
}, $ = (e, t) => /* @__PURE__ */ w("th", {
|
|
120
119
|
className: "p-3 text-left font-medium",
|
|
121
120
|
children: /* @__PURE__ */ T("button", {
|
|
122
121
|
type: "button",
|
|
123
|
-
onClick: () =>
|
|
122
|
+
onClick: () => we(t),
|
|
124
123
|
className: "inline-flex items-center gap-1 hover:text-text-primary",
|
|
125
124
|
children: [e, V === t ? w(G === "asc" ? ae : ie, { className: "h-3 w-3 text-action-primary-bg" }) : /* @__PURE__ */ w(ce, { className: "h-3 w-3 text-text-muted" })]
|
|
126
125
|
})
|
|
127
|
-
}),
|
|
126
|
+
}), Te = (e) => {
|
|
128
127
|
navigator.clipboard?.writeText(e), i.success("Asset tag copied", `${e} copied to clipboard.`);
|
|
129
128
|
};
|
|
130
129
|
return /* @__PURE__ */ T("div", {
|
|
@@ -134,27 +133,27 @@ function W() {
|
|
|
134
133
|
className: "flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between",
|
|
135
134
|
children: [/* @__PURE__ */ T("div", { children: [/* @__PURE__ */ w("h1", {
|
|
136
135
|
className: "text-2xl font-bold",
|
|
137
|
-
children: /* @__PURE__ */ w(me, { children:
|
|
136
|
+
children: /* @__PURE__ */ w(me, { children: u("assethandler.assets.list.title", "{{asset}} Inventory") })
|
|
138
137
|
}), /* @__PURE__ */ T("p", {
|
|
139
138
|
className: "text-sm text-text-secondary",
|
|
140
139
|
children: [
|
|
141
140
|
m.length,
|
|
142
141
|
" ",
|
|
143
|
-
|
|
142
|
+
u("assethandler.assets.list.subtitle.totalAssets", "total {{assetsLower}}"),
|
|
143
|
+
" ·",
|
|
144
144
|
" ",
|
|
145
|
-
"· ",
|
|
146
145
|
Z,
|
|
147
146
|
" ",
|
|
148
|
-
|
|
147
|
+
u("assethandler.assets.list.subtitle.active", "active")
|
|
149
148
|
]
|
|
150
149
|
})] }), /* @__PURE__ */ T(E, {
|
|
151
150
|
className: "w-full sm:w-auto",
|
|
152
151
|
size: "sm",
|
|
153
152
|
onClick: () => f("/assets/asset-create"),
|
|
154
|
-
children: [/* @__PURE__ */ w(_, { className: "mr-2 h-4 w-4" }),
|
|
153
|
+
children: [/* @__PURE__ */ w(_, { className: "mr-2 h-4 w-4" }), u("assethandler.assets.list.actions.addAsset", "Add {{asset}}")]
|
|
155
154
|
})]
|
|
156
155
|
}),
|
|
157
|
-
/* @__PURE__ */ w(_e, { children:
|
|
156
|
+
/* @__PURE__ */ w(_e, { children: u("assethandler.assets.list.purpose", "The single source of truth for every {{assetLower}} you own or manage. Search, filter and group by category, status or condition to find any item fast, review its assignment, then drill in to update, check it in/out or schedule maintenance.") }),
|
|
158
157
|
m.length > 0 ? /* @__PURE__ */ T(C, { children: [/* @__PURE__ */ T("div", {
|
|
159
158
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
160
159
|
children: [
|
|
@@ -190,7 +189,7 @@ function W() {
|
|
|
190
189
|
title: "Status mix",
|
|
191
190
|
subtitle: "Assets by lifecycle status",
|
|
192
191
|
children: /* @__PURE__ */ w(te, {
|
|
193
|
-
data:
|
|
192
|
+
data: Se,
|
|
194
193
|
centerLabel: "Total",
|
|
195
194
|
centerValue: m.length,
|
|
196
195
|
height: 220
|
|
@@ -199,7 +198,7 @@ function W() {
|
|
|
199
198
|
title: "By category",
|
|
200
199
|
subtitle: "Top categories by asset count",
|
|
201
200
|
children: /* @__PURE__ */ w(ee, {
|
|
202
|
-
data:
|
|
201
|
+
data: Ce,
|
|
203
202
|
xKey: "category",
|
|
204
203
|
orientation: "horizontal",
|
|
205
204
|
height: 220,
|
|
@@ -207,7 +206,7 @@ function W() {
|
|
|
207
206
|
valueFormat: a,
|
|
208
207
|
series: [{
|
|
209
208
|
key: "count",
|
|
210
|
-
label: "
|
|
209
|
+
label: u("assethandler.assets.list.chart.series", "{{assets}}")
|
|
211
210
|
}]
|
|
212
211
|
})
|
|
213
212
|
})]
|
|
@@ -220,7 +219,7 @@ function W() {
|
|
|
220
219
|
/* @__PURE__ */ T("div", {
|
|
221
220
|
className: "relative min-w-0 flex-1",
|
|
222
221
|
children: [/* @__PURE__ */ w(v, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ w(ge, {
|
|
223
|
-
placeholder:
|
|
222
|
+
placeholder: u("assethandler.assets.list.search.placeholder", "Search by name, {{assetLower}} tag, serial number..."),
|
|
224
223
|
value: y,
|
|
225
224
|
onChange: (e) => b(e.target.value),
|
|
226
225
|
className: "pl-9"
|
|
@@ -231,10 +230,10 @@ function W() {
|
|
|
231
230
|
onValueChange: S,
|
|
232
231
|
children: [/* @__PURE__ */ w(I, {
|
|
233
232
|
className: "w-full sm:w-[180px]",
|
|
234
|
-
children: /* @__PURE__ */ w(L, { placeholder:
|
|
233
|
+
children: /* @__PURE__ */ w(L, { placeholder: u("assethandler.assets.list.filters.category.placeholder", "Category") })
|
|
235
234
|
}), /* @__PURE__ */ T(P, { children: [/* @__PURE__ */ w(F, {
|
|
236
235
|
value: "all",
|
|
237
|
-
children:
|
|
236
|
+
children: u("assethandler.assets.list.filters.category.all", "All Categories")
|
|
238
237
|
}), Y.map((e) => /* @__PURE__ */ w(F, {
|
|
239
238
|
value: e,
|
|
240
239
|
className: "capitalize",
|
|
@@ -246,31 +245,31 @@ function W() {
|
|
|
246
245
|
onValueChange: A,
|
|
247
246
|
children: [/* @__PURE__ */ w(I, {
|
|
248
247
|
className: "w-full sm:w-[160px]",
|
|
249
|
-
children: /* @__PURE__ */ w(L, { placeholder:
|
|
248
|
+
children: /* @__PURE__ */ w(L, { placeholder: u("assethandler.assets.list.filters.status.placeholder", "Status") })
|
|
250
249
|
}), /* @__PURE__ */ T(P, { children: [
|
|
251
250
|
/* @__PURE__ */ w(F, {
|
|
252
251
|
value: "all",
|
|
253
|
-
children:
|
|
252
|
+
children: u("assethandler.assets.list.filters.status.all", "All Statuses")
|
|
254
253
|
}),
|
|
255
254
|
/* @__PURE__ */ w(F, {
|
|
256
255
|
value: "active",
|
|
257
|
-
children:
|
|
256
|
+
children: u("assethandler.assets.list.filters.status.active", "Active")
|
|
258
257
|
}),
|
|
259
258
|
/* @__PURE__ */ w(F, {
|
|
260
259
|
value: "inactive",
|
|
261
|
-
children:
|
|
260
|
+
children: u("assethandler.assets.list.filters.status.inactive", "Inactive")
|
|
262
261
|
}),
|
|
263
262
|
/* @__PURE__ */ w(F, {
|
|
264
263
|
value: "maintenance",
|
|
265
|
-
children:
|
|
264
|
+
children: u("assethandler.assets.list.filters.status.maintenance", "Maintenance")
|
|
266
265
|
}),
|
|
267
266
|
/* @__PURE__ */ w(F, {
|
|
268
267
|
value: "retired",
|
|
269
|
-
children:
|
|
268
|
+
children: u("assethandler.assets.list.filters.status.retired", "Retired")
|
|
270
269
|
}),
|
|
271
270
|
/* @__PURE__ */ w(F, {
|
|
272
271
|
value: "disposed",
|
|
273
|
-
children:
|
|
272
|
+
children: u("assethandler.assets.list.filters.status.disposed", "Disposed")
|
|
274
273
|
})
|
|
275
274
|
] })]
|
|
276
275
|
}),
|
|
@@ -328,16 +327,16 @@ function W() {
|
|
|
328
327
|
children: [/* @__PURE__ */ w("thead", { children: /* @__PURE__ */ T("tr", {
|
|
329
328
|
className: "border-b bg-bg-sunken/50 text-text-secondary",
|
|
330
329
|
children: [
|
|
331
|
-
$(
|
|
332
|
-
$(
|
|
333
|
-
$(
|
|
334
|
-
$(
|
|
335
|
-
$(
|
|
330
|
+
$(u("assethandler.assets.list.table.assetTag", "{{asset}} Tag"), "assetTag"),
|
|
331
|
+
$(u("assethandler.assets.list.table.name", "Name"), "name"),
|
|
332
|
+
$(u("assethandler.assets.list.table.category", "Category"), "category"),
|
|
333
|
+
$(u("assethandler.assets.list.table.status", "Status"), "status"),
|
|
334
|
+
$(u("assethandler.assets.list.table.condition", "Condition"), "condition"),
|
|
336
335
|
/* @__PURE__ */ w("th", {
|
|
337
336
|
className: "p-3 text-left font-medium",
|
|
338
|
-
children:
|
|
337
|
+
children: u("assethandler.assets.list.table.location", "Location")
|
|
339
338
|
}),
|
|
340
|
-
$(
|
|
339
|
+
$(u("assethandler.assets.list.table.assignedTo", "Assigned To"), "assignedTo"),
|
|
341
340
|
/* @__PURE__ */ w("th", { className: "w-10 p-3" })
|
|
342
341
|
]
|
|
343
342
|
}) }), /* @__PURE__ */ w("tbody", { children: Q.pageItems.map((e) => /* @__PURE__ */ T("tr", {
|
|
@@ -390,9 +389,9 @@ function W() {
|
|
|
390
389
|
/* @__PURE__ */ w("td", {
|
|
391
390
|
className: "p-3",
|
|
392
391
|
onClick: (e) => e.stopPropagation(),
|
|
393
|
-
children: /* @__PURE__ */ w(
|
|
392
|
+
children: /* @__PURE__ */ w(be, {
|
|
394
393
|
onView: () => f(`/assets/${e.id}`),
|
|
395
|
-
onCopy: () =>
|
|
394
|
+
onCopy: () => Te(e.assetTag)
|
|
396
395
|
})
|
|
397
396
|
})
|
|
398
397
|
]
|
|
@@ -427,7 +426,7 @@ function W() {
|
|
|
427
426
|
className: "flex justify-between",
|
|
428
427
|
children: [/* @__PURE__ */ w("span", {
|
|
429
428
|
className: "text-text-secondary",
|
|
430
|
-
children:
|
|
429
|
+
children: u("assethandler.assets.list.grid.category", "Category")
|
|
431
430
|
}), /* @__PURE__ */ w("span", {
|
|
432
431
|
className: "capitalize",
|
|
433
432
|
children: e.category.replace(/_/g, " ")
|
|
@@ -437,7 +436,7 @@ function W() {
|
|
|
437
436
|
className: "flex justify-between",
|
|
438
437
|
children: [/* @__PURE__ */ w("span", {
|
|
439
438
|
className: "text-text-secondary",
|
|
440
|
-
children:
|
|
439
|
+
children: u("assethandler.assets.list.grid.condition", "Condition")
|
|
441
440
|
}), /* @__PURE__ */ w("span", {
|
|
442
441
|
className: `rounded-md px-2 py-0.5 text-xs font-medium capitalize ${z[e.condition] || ""}`,
|
|
443
442
|
children: e.condition
|
|
@@ -447,7 +446,7 @@ function W() {
|
|
|
447
446
|
className: "flex justify-between",
|
|
448
447
|
children: [/* @__PURE__ */ w("span", {
|
|
449
448
|
className: "text-text-secondary",
|
|
450
|
-
children:
|
|
449
|
+
children: u("assethandler.assets.list.grid.assignedTo", "Assigned To")
|
|
451
450
|
}), /* @__PURE__ */ w("span", {
|
|
452
451
|
className: "text-xs",
|
|
453
452
|
children: e.assignedTo || "—"
|
|
@@ -501,18 +500,18 @@ function W() {
|
|
|
501
500
|
}),
|
|
502
501
|
h && X.length === 0 && /* @__PURE__ */ w(he, {
|
|
503
502
|
illustration: y || x !== "all" || k !== "all" ? "empty-search" : "empty-data",
|
|
504
|
-
title:
|
|
505
|
-
description:
|
|
503
|
+
title: u("assethandler.assets.list.empty.title", "No {{assetsLower}} found"),
|
|
504
|
+
description: u("assethandler.assets.list.empty.description", "Try adjusting your filters or add a new {{assetLower}} to get started."),
|
|
506
505
|
action: /* @__PURE__ */ T(E, {
|
|
507
506
|
size: "sm",
|
|
508
507
|
onClick: () => f("/assets/asset-create"),
|
|
509
|
-
children: [/* @__PURE__ */ w(_, { className: "mr-2 h-4 w-4" }),
|
|
508
|
+
children: [/* @__PURE__ */ w(_, { className: "mr-2 h-4 w-4" }), u("assethandler.assets.list.actions.addAsset", "Add {{asset}}")]
|
|
510
509
|
})
|
|
511
510
|
})
|
|
512
511
|
]
|
|
513
512
|
});
|
|
514
513
|
}
|
|
515
|
-
function
|
|
514
|
+
function be({ onView: e, onCopy: t }) {
|
|
516
515
|
return /* @__PURE__ */ T(k, { children: [/* @__PURE__ */ w(M, {
|
|
517
516
|
asChild: !0,
|
|
518
517
|
children: /* @__PURE__ */ w(E, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetListPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetListPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { useHiddenCategoryIds } from '../providers/AssetHandlerProvider';\nimport { useState, useMemo, useSyncExternalStore } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Plus,\n Grid3x3,\n List,\n Table as TableIcon,\n ArrowUp,\n ArrowDown,\n ChevronsUpDown,\n MoreHorizontal,\n Copy,\n Eye,\n Monitor,\n Server,\n Wifi,\n Truck,\n Wrench,\n Code,\n Box,\n Boxes,\n CheckCircle2,\n} from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { tWithFallback } from '../utils/i18n';\nimport {\n Pagination,\n usePagination,\n ChartCard,\n StatTile,\n DonutChart,\n BarsChart,\n formatCompact,\n} from '../components';\n\n// Soft, semantic status pill — matches the mock's soft pills (green/amber/gray/red).\nconst STATUS_PILL: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\n// Status distribution slice colours — semantic tokens (theme-aware CSS vars).\nconst STATUS_SLICE_COLOR: Record<string, string> = {\n active: 'var(--color-status-success-bg)',\n maintenance: 'var(--color-status-warning-bg)',\n inactive: 'var(--color-status-info-bg)',\n retired: 'var(--color-text-muted)',\n disposed: 'var(--color-status-error-bg)',\n};\n\nconst categoryIcons: Record<string, typeof Box> = {\n electronics: Monitor,\n it_hardware: Monitor,\n furniture: Box,\n vehicles: Truck,\n equipment: Wrench,\n software: Code,\n networking: Wifi,\n servers: Server,\n};\nconst categoryTints: Record<string, string> = {\n electronics: 'bg-status-info-bg-subtle text-status-info-text',\n it_hardware: 'bg-status-info-bg-subtle text-status-info-text',\n furniture: 'bg-status-warning-bg-subtle text-status-warning-text',\n vehicles: 'bg-status-success-bg-subtle text-status-success-text',\n equipment: 'bg-status-warning-bg-subtle text-status-warning-text',\n software: 'bg-action-primary-bg/10 text-action-primary-bg',\n networking: 'bg-status-info-bg-subtle text-status-info-text',\n servers: 'bg-status-error-bg-subtle text-status-error-text',\n};\nfunction CategoryIconTile({ category }: { category: string }) {\n const Icon = categoryIcons[category] ?? Box;\n const tint = categoryTints[category] ?? 'bg-bg-sunken text-text-secondary';\n return (\n <span className={`inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md ${tint}`}>\n <Icon className=\"h-4 w-4\" />\n </span>\n );\n}\n\nfunction StatusPill({ status }: { status: string }) {\n return (\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n STATUS_PILL[status] || 'bg-bg-sunken text-text-secondary'\n }`}\n >\n {status.replace(/_/g, ' ')}\n </span>\n );\n}\n\ntype SortKey = 'assetTag' | 'name' | 'category' | 'status' | 'condition' | 'assignedTo';\n\n// SSR-safe narrow-viewport hook (auto-fall-back the table to cards on phones).\nfunction useIsNarrow(): boolean {\n return useSyncExternalStore(\n (cb) => {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const mq = window.matchMedia('(max-width: 767px)');\n mq.addEventListener('change', cb);\n return () => mq.removeEventListener('change', cb);\n },\n () =>\n typeof window !== 'undefined' && window.matchMedia\n ? window.matchMedia('(max-width: 767px)').matches\n : false,\n () => false\n );\n}\n\nexport function AssetsAssetListPage() {\n const { t } = useI18n();\n const navigate = useAssetHandlerNavigate();\n const hiddenCategories = useHiddenCategoryIds();\n const { assets, hydrated } = useAssetHandlerStore();\n const isNarrow = useIsNarrow();\n const [searchQuery, setSearchQuery] = useState('');\n const [categoryFilter, setCategoryFilter] = useState('all');\n const [statusFilter, setStatusFilter] = useState('all');\n const [viewMode, setViewMode] = useState<'table' | 'grid' | 'list'>('table');\n const [userPickedView, setUserPickedView] = useState(false);\n const [sortKey, setSortKey] = useState<SortKey>('name');\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');\n\n // On phones, default to the card list (unless the user explicitly chose a view).\n const effectiveView = !userPickedView && isNarrow && viewMode === 'table' ? 'list' : viewMode;\n const pickView = (mode: 'table' | 'grid' | 'list') => {\n setUserPickedView(true);\n setViewMode(mode);\n };\n\n const categories = useMemo(\n () =>\n [...new Set(assets.map((a) => a.category).filter(Boolean))]\n .filter((c) => !hiddenCategories.has(c))\n .sort(),\n [assets, hiddenCategories]\n );\n\n const filteredAssets = useMemo(() => {\n return assets.filter((a) => {\n if (hiddenCategories.has(a.category)) return false;\n const matchesSearch =\n searchQuery === '' ||\n a.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.assetTag.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.serialNumber.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesCategory = categoryFilter === 'all' || a.category === categoryFilter;\n const matchesStatus = statusFilter === 'all' || a.status === statusFilter;\n return matchesSearch && matchesCategory && matchesStatus;\n });\n }, [assets, searchQuery, categoryFilter, statusFilter, hiddenCategories]);\n\n const sortedAssets = useMemo(() => {\n const dir = sortDir === 'asc' ? 1 : -1;\n return [...filteredAssets].sort((a, b) => {\n const av = (a[sortKey] ?? '').toString().toLowerCase();\n const bv = (b[sortKey] ?? '').toString().toLowerCase();\n return av.localeCompare(bv) * dir;\n });\n }, [filteredAssets, sortKey, sortDir]);\n\n const activeCount = assets.filter((a) => a.status === 'active').length;\n\n const statusSlices = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of assets) counts[a.status] = (counts[a.status] || 0) + 1;\n return Object.entries(counts).map(([status, value]) => ({\n name: status.charAt(0).toUpperCase() + status.slice(1),\n value,\n color: STATUS_SLICE_COLOR[status],\n }));\n }, [assets]);\n\n const categoryBars = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of assets) counts[a.category] = (counts[a.category] || 0) + 1;\n return Object.entries(counts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8)\n .map(([category, count]) => ({ category: category.replace(/_/g, ' '), count }));\n }, [assets]);\n\n const pager = usePagination(sortedAssets, {\n pageSize: 12,\n resetKey: `${searchQuery}|${categoryFilter}|${statusFilter}|${sortKey}|${sortDir}`,\n });\n\n const toggleSort = (key: SortKey) => {\n if (sortKey === key) {\n setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n };\n\n const renderSortHeader = (label: string, col: SortKey) => (\n <th className=\"p-3 text-left font-medium\">\n <button\n type=\"button\"\n onClick={() => toggleSort(col)}\n className=\"inline-flex items-center gap-1 hover:text-text-primary\"\n >\n {label}\n {sortKey === col ? (\n sortDir === 'asc' ? (\n <ArrowUp className=\"h-3 w-3 text-action-primary-bg\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 text-action-primary-bg\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 text-text-muted\" />\n )}\n </button>\n </th>\n );\n\n const copyTag = (tag: string) => {\n void navigator.clipboard?.writeText(tag);\n notify.success('Asset tag copied', `${tag} copied to clipboard.`);\n };\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {tWithFallback(t, 'assethandler.assets.list.title', 'Asset Inventory')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {assets.length}{' '}\n {tWithFallback(t, 'assethandler.assets.list.subtitle.totalAssets', 'total assets')}{' '}\n · {activeCount}{' '}\n {tWithFallback(t, 'assethandler.assets.list.subtitle.active', 'active')}\n </p>\n </div>\n <Button\n className=\"w-full sm:w-auto\"\n size=\"sm\"\n onClick={() => navigate('/assets/asset-create')}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.list.actions.addAsset', 'Add Asset')}\n </Button>\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'assethandler.assets.list.purpose',\n 'The single source of truth for every asset you own or manage. Search, filter and group by category, status or condition to find any item fast, review its assignment, then drill in to update, check it in/out or schedule maintenance.'\n )}\n </PagePurpose>\n\n {/* Insight strip */}\n {assets.length > 0 ? (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Total assets\"\n value={assets.length}\n format={formatCompact}\n icon={Boxes}\n hero\n />\n <StatTile\n label=\"Active\"\n value={activeCount}\n format={formatCompact}\n icon={CheckCircle2}\n />\n <StatTile\n label=\"Categories\"\n value={categories.length}\n format={formatCompact}\n icon={Box}\n />\n <StatTile\n label=\"Showing\"\n value={filteredAssets.length}\n format={formatCompact}\n icon={Search}\n />\n </div>\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard title=\"Status mix\" subtitle=\"Assets by lifecycle status\">\n <DonutChart\n data={statusSlices}\n centerLabel=\"Total\"\n centerValue={assets.length}\n height={220}\n />\n </ChartCard>\n <ChartCard title=\"By category\" subtitle=\"Top categories by asset count\">\n <BarsChart\n data={categoryBars}\n xKey=\"category\"\n orientation=\"horizontal\"\n height={220}\n categoryWidth={110}\n valueFormat={formatCompact}\n series={[{ key: 'count', label: 'Assets' }]}\n />\n </ChartCard>\n </div>\n </>\n ) : null}\n\n {/* Filters Bar */}\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:flex-wrap\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder={tWithFallback(\n t,\n 'assethandler.assets.list.search.placeholder',\n 'Search by name, asset tag, serial number...'\n )}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Select value={categoryFilter} onValueChange={setCategoryFilter}>\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue\n placeholder={tWithFallback(\n t,\n 'assethandler.assets.list.filters.category.placeholder',\n 'Category'\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tWithFallback(\n t,\n 'assethandler.assets.list.filters.category.all',\n 'All Categories'\n )}\n </SelectItem>\n {categories.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-[160px]\">\n <SelectValue\n placeholder={tWithFallback(\n t,\n 'assethandler.assets.list.filters.status.placeholder',\n 'Status'\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tWithFallback(t, 'assethandler.assets.list.filters.status.all', 'All Statuses')}\n </SelectItem>\n <SelectItem value=\"active\">\n {tWithFallback(t, 'assethandler.assets.list.filters.status.active', 'Active')}\n </SelectItem>\n <SelectItem value=\"inactive\">\n {tWithFallback(t, 'assethandler.assets.list.filters.status.inactive', 'Inactive')}\n </SelectItem>\n <SelectItem value=\"maintenance\">\n {tWithFallback(\n t,\n 'assethandler.assets.list.filters.status.maintenance',\n 'Maintenance'\n )}\n </SelectItem>\n <SelectItem value=\"retired\">\n {tWithFallback(t, 'assethandler.assets.list.filters.status.retired', 'Retired')}\n </SelectItem>\n <SelectItem value=\"disposed\">\n {tWithFallback(t, 'assethandler.assets.list.filters.status.disposed', 'Disposed')}\n </SelectItem>\n </SelectContent>\n </Select>\n <div className=\"flex gap-1 rounded-md border p-0.5\">\n <Button\n variant={effectiveView === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'table'}\n onClick={() => pickView('table')}\n >\n <TableIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Table</span>\n </Button>\n <Button\n variant={effectiveView === 'grid' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'grid'}\n onClick={() => pickView('grid')}\n >\n <Grid3x3 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Grid</span>\n </Button>\n <Button\n variant={effectiveView === 'list' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'list'}\n onClick={() => pickView('list')}\n >\n <List className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">List</span>\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {!hydrated && assets.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n\n {effectiveView === 'table' && filteredAssets.length > 0 && (\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 text-text-secondary\">\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.assetTag', 'Asset Tag'),\n 'assetTag'\n )}\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.name', 'Name'),\n 'name'\n )}\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.category', 'Category'),\n 'category'\n )}\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.status', 'Status'),\n 'status'\n )}\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.condition', 'Condition'),\n 'condition'\n )}\n <th className=\"p-3 text-left font-medium\">\n {tWithFallback(t, 'assethandler.assets.list.table.location', 'Location')}\n </th>\n {renderSortHeader(\n tWithFallback(t, 'assethandler.assets.list.table.assignedTo', 'Assigned To'),\n 'assignedTo'\n )}\n <th className=\"w-10 p-3\" />\n </tr>\n </thead>\n <tbody>\n {pager.pageItems.map((asset) => (\n <tr\n key={asset.id}\n className=\"cursor-pointer border-b hover:bg-bg-sunken/50\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <td className=\"p-3\">\n <span className=\"flex items-center gap-3\">\n <CategoryIconTile category={asset.category} />\n <span className=\"font-mono text-xs\">{asset.assetTag}</span>\n </span>\n </td>\n <td className=\"p-3\">\n <p className=\"font-medium text-text-primary\">{asset.name}</p>\n <p className=\"text-xs text-text-secondary\">{asset.serialNumber}</p>\n </td>\n <td className=\"p-3 capitalize\">{asset.category.replace(/_/g, ' ')}</td>\n <td className=\"p-3\">\n <StatusPill status={asset.status} />\n </td>\n <td className=\"p-3\">\n <span\n className={`inline-flex rounded-md px-2 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] || ''}`}\n >\n {asset.condition}\n </span>\n </td>\n <td className=\"max-w-[200px] truncate p-3 text-xs\">\n {asset.location || '—'}\n </td>\n <td className=\"p-3 text-xs\">{asset.assignedTo || '—'}</td>\n <td className=\"p-3\" onClick={(e) => e.stopPropagation()}>\n <RowActions\n onView={() => navigate(`/assets/${asset.id}`)}\n onCopy={() => copyTag(asset.assetTag)}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n\n {effectiveView === 'grid' && filteredAssets.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {pager.pageItems.map((asset) => (\n <Card\n key={asset.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <CategoryIconTile category={asset.category} />\n <span className=\"font-mono text-xs text-text-secondary\">{asset.assetTag}</span>\n </span>\n <StatusPill status={asset.status} />\n </div>\n <CardTitle className=\"mt-2 text-base\">{asset.name}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tWithFallback(t, 'assethandler.assets.list.grid.category', 'Category')}\n </span>\n <span className=\"capitalize\">{asset.category.replace(/_/g, ' ')}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tWithFallback(t, 'assethandler.assets.list.grid.condition', 'Condition')}\n </span>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] || ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tWithFallback(t, 'assethandler.assets.list.grid.assignedTo', 'Assigned To')}\n </span>\n <span className=\"text-xs\">{asset.assignedTo || '—'}</span>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {effectiveView === 'list' && filteredAssets.length > 0 && (\n <div className=\"space-y-2\">\n {pager.pageItems.map((asset) => (\n <Card\n key={asset.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <CardContent className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <CategoryIconTile category={asset.category} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"truncate text-sm font-medium\">{asset.name}</p>\n <StatusPill status={asset.status} />\n </div>\n <p className=\"truncate text-xs text-text-secondary\">\n {asset.assetTag}\n {asset.serialNumber ? <> · {asset.serialNumber}</> : null}\n {asset.location ? <> · {asset.location}</> : null}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {filteredAssets.length > 0 && (\n <Pagination\n page={pager.page}\n pageCount={pager.pageCount}\n rangeStart={pager.rangeStart}\n rangeEnd={pager.rangeEnd}\n totalItems={pager.totalItems}\n canPrev={pager.canPrev}\n canNext={pager.canNext}\n onPrev={pager.prevPage}\n onNext={pager.nextPage}\n itemLabel=\"assets\"\n />\n )}\n\n {hydrated && filteredAssets.length === 0 && (\n <IllustratedEmptyState\n illustration={\n searchQuery || categoryFilter !== 'all' || statusFilter !== 'all'\n ? 'empty-search'\n : 'empty-data'\n }\n title={tWithFallback(t, 'assethandler.assets.list.empty.title', 'No assets found')}\n description={tWithFallback(\n t,\n 'assethandler.assets.list.empty.description',\n 'Try adjusting your filters or add a new asset to get started.'\n )}\n action={\n <Button size=\"sm\" onClick={() => navigate('/assets/asset-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.list.actions.addAsset', 'Add Asset')}\n </Button>\n }\n />\n )}\n </div>\n );\n}\n\nfunction RowActions({ onView, onCopy }: { onView: () => void; onCopy: () => void }) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" aria-label=\"Asset actions\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onView}>\n <Eye className=\"mr-2 h-4 w-4\" />\n View details\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onCopy}>\n <Copy className=\"mr-2 h-4 w-4\" />\n Copy asset tag\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsAssetListPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetListPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { useHiddenCategoryIds } from '../providers/AssetHandlerProvider';\nimport { useState, useMemo, useSyncExternalStore } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n Plus,\n Grid3x3,\n List,\n Table as TableIcon,\n ArrowUp,\n ArrowDown,\n ChevronsUpDown,\n MoreHorizontal,\n Copy,\n Eye,\n Monitor,\n Server,\n Wifi,\n Truck,\n Wrench,\n Code,\n Box,\n Boxes,\n CheckCircle2,\n} from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { notify } from '../utils/toast';\nimport { useCopy } from '../hooks/useCopy';\nimport {\n Pagination,\n usePagination,\n ChartCard,\n StatTile,\n DonutChart,\n BarsChart,\n formatCompact,\n} from '../components';\n\n// Soft, semantic status pill — matches the mock's soft pills (green/amber/gray/red).\nconst STATUS_PILL: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\n// Status distribution slice colours — semantic tokens (theme-aware CSS vars).\nconst STATUS_SLICE_COLOR: Record<string, string> = {\n active: 'var(--color-status-success-bg)',\n maintenance: 'var(--color-status-warning-bg)',\n inactive: 'var(--color-status-info-bg)',\n retired: 'var(--color-text-muted)',\n disposed: 'var(--color-status-error-bg)',\n};\n\nconst categoryIcons: Record<string, typeof Box> = {\n electronics: Monitor,\n it_hardware: Monitor,\n furniture: Box,\n vehicles: Truck,\n equipment: Wrench,\n software: Code,\n networking: Wifi,\n servers: Server,\n};\nconst categoryTints: Record<string, string> = {\n electronics: 'bg-status-info-bg-subtle text-status-info-text',\n it_hardware: 'bg-status-info-bg-subtle text-status-info-text',\n furniture: 'bg-status-warning-bg-subtle text-status-warning-text',\n vehicles: 'bg-status-success-bg-subtle text-status-success-text',\n equipment: 'bg-status-warning-bg-subtle text-status-warning-text',\n software: 'bg-action-primary-bg/10 text-action-primary-bg',\n networking: 'bg-status-info-bg-subtle text-status-info-text',\n servers: 'bg-status-error-bg-subtle text-status-error-text',\n};\nfunction CategoryIconTile({ category }: { category: string }) {\n const Icon = categoryIcons[category] ?? Box;\n const tint = categoryTints[category] ?? 'bg-bg-sunken text-text-secondary';\n return (\n <span className={`inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-md ${tint}`}>\n <Icon className=\"h-4 w-4\" />\n </span>\n );\n}\n\nfunction StatusPill({ status }: { status: string }) {\n return (\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n STATUS_PILL[status] || 'bg-bg-sunken text-text-secondary'\n }`}\n >\n {status.replace(/_/g, ' ')}\n </span>\n );\n}\n\ntype SortKey = 'assetTag' | 'name' | 'category' | 'status' | 'condition' | 'assignedTo';\n\n// SSR-safe narrow-viewport hook (auto-fall-back the table to cards on phones).\nfunction useIsNarrow(): boolean {\n return useSyncExternalStore(\n (cb) => {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const mq = window.matchMedia('(max-width: 767px)');\n mq.addEventListener('change', cb);\n return () => mq.removeEventListener('change', cb);\n },\n () =>\n typeof window !== 'undefined' && window.matchMedia\n ? window.matchMedia('(max-width: 767px)').matches\n : false,\n () => false\n );\n}\n\nexport function AssetsAssetListPage() {\n const tc = useCopy();\n const navigate = useAssetHandlerNavigate();\n const hiddenCategories = useHiddenCategoryIds();\n const { assets, hydrated } = useAssetHandlerStore();\n const isNarrow = useIsNarrow();\n const [searchQuery, setSearchQuery] = useState('');\n const [categoryFilter, setCategoryFilter] = useState('all');\n const [statusFilter, setStatusFilter] = useState('all');\n const [viewMode, setViewMode] = useState<'table' | 'grid' | 'list'>('table');\n const [userPickedView, setUserPickedView] = useState(false);\n const [sortKey, setSortKey] = useState<SortKey>('name');\n const [sortDir, setSortDir] = useState<'asc' | 'desc'>('asc');\n\n // On phones, default to the card list (unless the user explicitly chose a view).\n const effectiveView = !userPickedView && isNarrow && viewMode === 'table' ? 'list' : viewMode;\n const pickView = (mode: 'table' | 'grid' | 'list') => {\n setUserPickedView(true);\n setViewMode(mode);\n };\n\n const categories = useMemo(\n () =>\n [...new Set(assets.map((a) => a.category).filter(Boolean))]\n .filter((c) => !hiddenCategories.has(c))\n .sort(),\n [assets, hiddenCategories]\n );\n\n const filteredAssets = useMemo(() => {\n return assets.filter((a) => {\n if (hiddenCategories.has(a.category)) return false;\n const matchesSearch =\n searchQuery === '' ||\n a.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.assetTag.toLowerCase().includes(searchQuery.toLowerCase()) ||\n a.serialNumber.toLowerCase().includes(searchQuery.toLowerCase());\n const matchesCategory = categoryFilter === 'all' || a.category === categoryFilter;\n const matchesStatus = statusFilter === 'all' || a.status === statusFilter;\n return matchesSearch && matchesCategory && matchesStatus;\n });\n }, [assets, searchQuery, categoryFilter, statusFilter, hiddenCategories]);\n\n const sortedAssets = useMemo(() => {\n const dir = sortDir === 'asc' ? 1 : -1;\n return [...filteredAssets].sort((a, b) => {\n const av = (a[sortKey] ?? '').toString().toLowerCase();\n const bv = (b[sortKey] ?? '').toString().toLowerCase();\n return av.localeCompare(bv) * dir;\n });\n }, [filteredAssets, sortKey, sortDir]);\n\n const activeCount = assets.filter((a) => a.status === 'active').length;\n\n const statusSlices = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of assets) counts[a.status] = (counts[a.status] || 0) + 1;\n return Object.entries(counts).map(([status, value]) => ({\n name: status.charAt(0).toUpperCase() + status.slice(1),\n value,\n color: STATUS_SLICE_COLOR[status],\n }));\n }, [assets]);\n\n const categoryBars = useMemo(() => {\n const counts: Record<string, number> = {};\n for (const a of assets) counts[a.category] = (counts[a.category] || 0) + 1;\n return Object.entries(counts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 8)\n .map(([category, count]) => ({ category: category.replace(/_/g, ' '), count }));\n }, [assets]);\n\n const pager = usePagination(sortedAssets, {\n pageSize: 12,\n resetKey: `${searchQuery}|${categoryFilter}|${statusFilter}|${sortKey}|${sortDir}`,\n });\n\n const toggleSort = (key: SortKey) => {\n if (sortKey === key) {\n setSortDir((d) => (d === 'asc' ? 'desc' : 'asc'));\n } else {\n setSortKey(key);\n setSortDir('asc');\n }\n };\n\n const renderSortHeader = (label: string, col: SortKey) => (\n <th className=\"p-3 text-left font-medium\">\n <button\n type=\"button\"\n onClick={() => toggleSort(col)}\n className=\"inline-flex items-center gap-1 hover:text-text-primary\"\n >\n {label}\n {sortKey === col ? (\n sortDir === 'asc' ? (\n <ArrowUp className=\"h-3 w-3 text-action-primary-bg\" />\n ) : (\n <ArrowDown className=\"h-3 w-3 text-action-primary-bg\" />\n )\n ) : (\n <ChevronsUpDown className=\"h-3 w-3 text-text-muted\" />\n )}\n </button>\n </th>\n );\n\n const copyTag = (tag: string) => {\n void navigator.clipboard?.writeText(tag);\n notify.success('Asset tag copied', `${tag} copied to clipboard.`);\n };\n\n return (\n <div className=\"space-y-6 p-4 sm:p-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>\n {tc('assethandler.assets.list.title', '{{asset}} Inventory')}\n </GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {assets.length}{' '}\n {tc('assethandler.assets.list.subtitle.totalAssets', 'total {{assetsLower}}')} ·{' '}\n {activeCount} {tc('assethandler.assets.list.subtitle.active', 'active')}\n </p>\n </div>\n <Button\n className=\"w-full sm:w-auto\"\n size=\"sm\"\n onClick={() => navigate('/assets/asset-create')}\n >\n <Plus className=\"mr-2 h-4 w-4\" />\n {tc('assethandler.assets.list.actions.addAsset', 'Add {{asset}}')}\n </Button>\n </div>\n\n <PagePurpose>\n {tc(\n 'assethandler.assets.list.purpose',\n 'The single source of truth for every {{assetLower}} you own or manage. Search, filter and group by category, status or condition to find any item fast, review its assignment, then drill in to update, check it in/out or schedule maintenance.'\n )}\n </PagePurpose>\n\n {/* Insight strip */}\n {assets.length > 0 ? (\n <>\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n label=\"Total assets\"\n value={assets.length}\n format={formatCompact}\n icon={Boxes}\n hero\n />\n <StatTile\n label=\"Active\"\n value={activeCount}\n format={formatCompact}\n icon={CheckCircle2}\n />\n <StatTile\n label=\"Categories\"\n value={categories.length}\n format={formatCompact}\n icon={Box}\n />\n <StatTile\n label=\"Showing\"\n value={filteredAssets.length}\n format={formatCompact}\n icon={Search}\n />\n </div>\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard title=\"Status mix\" subtitle=\"Assets by lifecycle status\">\n <DonutChart\n data={statusSlices}\n centerLabel=\"Total\"\n centerValue={assets.length}\n height={220}\n />\n </ChartCard>\n <ChartCard title=\"By category\" subtitle=\"Top categories by asset count\">\n <BarsChart\n data={categoryBars}\n xKey=\"category\"\n orientation=\"horizontal\"\n height={220}\n categoryWidth={110}\n valueFormat={formatCompact}\n series={[\n {\n key: 'count',\n label: tc('assethandler.assets.list.chart.series', '{{assets}}'),\n },\n ]}\n />\n </ChartCard>\n </div>\n </>\n ) : null}\n\n {/* Filters Bar */}\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex flex-col gap-3 md:flex-row md:flex-wrap\">\n <div className=\"relative min-w-0 flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder={tc(\n 'assethandler.assets.list.search.placeholder',\n 'Search by name, {{assetLower}} tag, serial number...'\n )}\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Select value={categoryFilter} onValueChange={setCategoryFilter}>\n <SelectTrigger className=\"w-full sm:w-[180px]\">\n <SelectValue\n placeholder={tc(\n 'assethandler.assets.list.filters.category.placeholder',\n 'Category'\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tc('assethandler.assets.list.filters.category.all', 'All Categories')}\n </SelectItem>\n {categories.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n <Select value={statusFilter} onValueChange={setStatusFilter}>\n <SelectTrigger className=\"w-full sm:w-[160px]\">\n <SelectValue\n placeholder={tc('assethandler.assets.list.filters.status.placeholder', 'Status')}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tc('assethandler.assets.list.filters.status.all', 'All Statuses')}\n </SelectItem>\n <SelectItem value=\"active\">\n {tc('assethandler.assets.list.filters.status.active', 'Active')}\n </SelectItem>\n <SelectItem value=\"inactive\">\n {tc('assethandler.assets.list.filters.status.inactive', 'Inactive')}\n </SelectItem>\n <SelectItem value=\"maintenance\">\n {tc('assethandler.assets.list.filters.status.maintenance', 'Maintenance')}\n </SelectItem>\n <SelectItem value=\"retired\">\n {tc('assethandler.assets.list.filters.status.retired', 'Retired')}\n </SelectItem>\n <SelectItem value=\"disposed\">\n {tc('assethandler.assets.list.filters.status.disposed', 'Disposed')}\n </SelectItem>\n </SelectContent>\n </Select>\n <div className=\"flex gap-1 rounded-md border p-0.5\">\n <Button\n variant={effectiveView === 'table' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'table'}\n onClick={() => pickView('table')}\n >\n <TableIcon className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Table</span>\n </Button>\n <Button\n variant={effectiveView === 'grid' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'grid'}\n onClick={() => pickView('grid')}\n >\n <Grid3x3 className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">Grid</span>\n </Button>\n <Button\n variant={effectiveView === 'list' ? 'default' : 'ghost'}\n size=\"sm\"\n className=\"h-8 gap-1.5 px-2\"\n aria-pressed={effectiveView === 'list'}\n onClick={() => pickView('list')}\n >\n <List className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">List</span>\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n {!hydrated && assets.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n\n {effectiveView === 'table' && filteredAssets.length > 0 && (\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 text-text-secondary\">\n {renderSortHeader(\n tc('assethandler.assets.list.table.assetTag', '{{asset}} Tag'),\n 'assetTag'\n )}\n {renderSortHeader(tc('assethandler.assets.list.table.name', 'Name'), 'name')}\n {renderSortHeader(\n tc('assethandler.assets.list.table.category', 'Category'),\n 'category'\n )}\n {renderSortHeader(\n tc('assethandler.assets.list.table.status', 'Status'),\n 'status'\n )}\n {renderSortHeader(\n tc('assethandler.assets.list.table.condition', 'Condition'),\n 'condition'\n )}\n <th className=\"p-3 text-left font-medium\">\n {tc('assethandler.assets.list.table.location', 'Location')}\n </th>\n {renderSortHeader(\n tc('assethandler.assets.list.table.assignedTo', 'Assigned To'),\n 'assignedTo'\n )}\n <th className=\"w-10 p-3\" />\n </tr>\n </thead>\n <tbody>\n {pager.pageItems.map((asset) => (\n <tr\n key={asset.id}\n className=\"cursor-pointer border-b hover:bg-bg-sunken/50\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <td className=\"p-3\">\n <span className=\"flex items-center gap-3\">\n <CategoryIconTile category={asset.category} />\n <span className=\"font-mono text-xs\">{asset.assetTag}</span>\n </span>\n </td>\n <td className=\"p-3\">\n <p className=\"font-medium text-text-primary\">{asset.name}</p>\n <p className=\"text-xs text-text-secondary\">{asset.serialNumber}</p>\n </td>\n <td className=\"p-3 capitalize\">{asset.category.replace(/_/g, ' ')}</td>\n <td className=\"p-3\">\n <StatusPill status={asset.status} />\n </td>\n <td className=\"p-3\">\n <span\n className={`inline-flex rounded-md px-2 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] || ''}`}\n >\n {asset.condition}\n </span>\n </td>\n <td className=\"max-w-[200px] truncate p-3 text-xs\">\n {asset.location || '—'}\n </td>\n <td className=\"p-3 text-xs\">{asset.assignedTo || '—'}</td>\n <td className=\"p-3\" onClick={(e) => e.stopPropagation()}>\n <RowActions\n onView={() => navigate(`/assets/${asset.id}`)}\n onCopy={() => copyTag(asset.assetTag)}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n\n {effectiveView === 'grid' && filteredAssets.length > 0 && (\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-3\">\n {pager.pageItems.map((asset) => (\n <Card\n key={asset.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"flex min-w-0 items-center gap-2.5\">\n <CategoryIconTile category={asset.category} />\n <span className=\"font-mono text-xs text-text-secondary\">{asset.assetTag}</span>\n </span>\n <StatusPill status={asset.status} />\n </div>\n <CardTitle className=\"mt-2 text-base\">{asset.name}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 text-sm\">\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tc('assethandler.assets.list.grid.category', 'Category')}\n </span>\n <span className=\"capitalize\">{asset.category.replace(/_/g, ' ')}</span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tc('assethandler.assets.list.grid.condition', 'Condition')}\n </span>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] || ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <div className=\"flex justify-between\">\n <span className=\"text-text-secondary\">\n {tc('assethandler.assets.list.grid.assignedTo', 'Assigned To')}\n </span>\n <span className=\"text-xs\">{asset.assignedTo || '—'}</span>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {effectiveView === 'list' && filteredAssets.length > 0 && (\n <div className=\"space-y-2\">\n {pager.pageItems.map((asset) => (\n <Card\n key={asset.id}\n className=\"cursor-pointer\"\n onClick={() => navigate(`/assets/${asset.id}`)}\n >\n <CardContent className=\"px-4 py-3\">\n <div className=\"flex items-center gap-3\">\n <CategoryIconTile category={asset.category} />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center justify-between gap-2\">\n <p className=\"truncate text-sm font-medium\">{asset.name}</p>\n <StatusPill status={asset.status} />\n </div>\n <p className=\"truncate text-xs text-text-secondary\">\n {asset.assetTag}\n {asset.serialNumber ? <> · {asset.serialNumber}</> : null}\n {asset.location ? <> · {asset.location}</> : null}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n\n {filteredAssets.length > 0 && (\n <Pagination\n page={pager.page}\n pageCount={pager.pageCount}\n rangeStart={pager.rangeStart}\n rangeEnd={pager.rangeEnd}\n totalItems={pager.totalItems}\n canPrev={pager.canPrev}\n canNext={pager.canNext}\n onPrev={pager.prevPage}\n onNext={pager.nextPage}\n itemLabel=\"assets\"\n />\n )}\n\n {hydrated && filteredAssets.length === 0 && (\n <IllustratedEmptyState\n illustration={\n searchQuery || categoryFilter !== 'all' || statusFilter !== 'all'\n ? 'empty-search'\n : 'empty-data'\n }\n title={tc('assethandler.assets.list.empty.title', 'No {{assetsLower}} found')}\n description={tc(\n 'assethandler.assets.list.empty.description',\n 'Try adjusting your filters or add a new {{assetLower}} to get started.'\n )}\n action={\n <Button size=\"sm\" onClick={() => navigate('/assets/asset-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {tc('assethandler.assets.list.actions.addAsset', 'Add {{asset}}')}\n </Button>\n }\n />\n )}\n </div>\n );\n}\n\nfunction RowActions({ onView, onCopy }: { onView: () => void; onCopy: () => void }) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button variant=\"ghost\" size=\"icon\" className=\"h-8 w-8\" aria-label=\"Asset actions\">\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem onClick={onView}>\n <Eye className=\"mr-2 h-4 w-4\" />\n View details\n </DropdownMenuItem>\n <DropdownMenuItem onClick={onCopy}>\n <Copy className=\"mr-2 h-4 w-4\" />\n Copy asset tag\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/assethandler/pages/DashboardPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/assethandler/pages/DashboardPage.tsx"],"names":[],"mappings":"AAgKA,wBAAgB,aAAa,gCA4rB5B"}
|