@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.
Files changed (31) hide show
  1. package/dist/assethandler/components/AttachmentsPanel.d.ts.map +1 -1
  2. package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
  3. package/dist/assethandler/hooks/useCopy.d.ts +28 -0
  4. package/dist/assethandler/hooks/useCopy.d.ts.map +1 -0
  5. package/dist/assethandler/hooks/useCopy.js +33 -0
  6. package/dist/assethandler/hooks/useCopy.js.map +1 -0
  7. package/dist/assethandler/index.d.ts +1 -1
  8. package/dist/assethandler/index.d.ts.map +1 -1
  9. package/dist/assethandler/pages/AnalyticsPage.d.ts.map +1 -1
  10. package/dist/assethandler/pages/AnalyticsPage.js +259 -258
  11. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  12. package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +1 -2
  14. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.d.ts.map +1 -1
  16. package/dist/assethandler/pages/AssetsAssetListPage.js +47 -48
  17. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  18. package/dist/assethandler/pages/DashboardPage.d.ts.map +1 -1
  19. package/dist/assethandler/pages/DashboardPage.js +236 -236
  20. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  21. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts.map +1 -1
  22. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +126 -125
  23. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  24. package/dist/assethandler/pages/TransactionsTransactionListPage.js +127 -127
  25. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  26. package/dist/assethandler/store/assethandlerStore.d.ts.map +1 -1
  27. package/dist/assethandler/store/assethandlerStore.js.map +1 -1
  28. package/dist/assethandler/types/index.d.ts +20 -0
  29. package/dist/assethandler/types/index.d.ts.map +1 -1
  30. package/dist/types/assistant.d.ts.map +1 -1
  31. 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 { tWithFallback as r } from "../utils/i18n.js";
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
- }, ye = {
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 be() {
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 { t: u } = ve(), f = n(), p = t(), { assets: m, hydrated: h } = e(), g = be(), [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) => {
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
- ]), Se = c(() => {
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, Ce = c(() => {
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: ye[e]
104
+ color: ve[e]
106
105
  }));
107
- }, [m]), we = c(() => {
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(Se, {
113
+ }, [m]), Q = re(xe, {
115
114
  pageSize: 12,
116
115
  resetKey: `${y}|${x}|${k}|${V}|${G}`
117
- }), Te = (e) => {
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: () => Te(t),
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
- }), Ee = (e) => {
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: r(u, "assethandler.assets.list.title", "Asset Inventory") })
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
- r(u, "assethandler.assets.list.subtitle.totalAssets", "total assets"),
142
+ u("assethandler.assets.list.subtitle.totalAssets", "total {{assetsLower}}"),
143
+ " ·",
144
144
  " ",
145
- "· ",
146
145
  Z,
147
146
  " ",
148
- r(u, "assethandler.assets.list.subtitle.active", "active")
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" }), r(u, "assethandler.assets.list.actions.addAsset", "Add Asset")]
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: r(u, "assethandler.assets.list.purpose", "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.") }),
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: Ce,
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: we,
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: "Assets"
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: r(u, "assethandler.assets.list.search.placeholder", "Search by name, asset tag, serial number..."),
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: r(u, "assethandler.assets.list.filters.category.placeholder", "Category") })
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: r(u, "assethandler.assets.list.filters.category.all", "All Categories")
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: r(u, "assethandler.assets.list.filters.status.placeholder", "Status") })
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: r(u, "assethandler.assets.list.filters.status.all", "All Statuses")
252
+ children: u("assethandler.assets.list.filters.status.all", "All Statuses")
254
253
  }),
255
254
  /* @__PURE__ */ w(F, {
256
255
  value: "active",
257
- children: r(u, "assethandler.assets.list.filters.status.active", "Active")
256
+ children: u("assethandler.assets.list.filters.status.active", "Active")
258
257
  }),
259
258
  /* @__PURE__ */ w(F, {
260
259
  value: "inactive",
261
- children: r(u, "assethandler.assets.list.filters.status.inactive", "Inactive")
260
+ children: u("assethandler.assets.list.filters.status.inactive", "Inactive")
262
261
  }),
263
262
  /* @__PURE__ */ w(F, {
264
263
  value: "maintenance",
265
- children: r(u, "assethandler.assets.list.filters.status.maintenance", "Maintenance")
264
+ children: u("assethandler.assets.list.filters.status.maintenance", "Maintenance")
266
265
  }),
267
266
  /* @__PURE__ */ w(F, {
268
267
  value: "retired",
269
- children: r(u, "assethandler.assets.list.filters.status.retired", "Retired")
268
+ children: u("assethandler.assets.list.filters.status.retired", "Retired")
270
269
  }),
271
270
  /* @__PURE__ */ w(F, {
272
271
  value: "disposed",
273
- children: r(u, "assethandler.assets.list.filters.status.disposed", "Disposed")
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
- $(r(u, "assethandler.assets.list.table.assetTag", "Asset Tag"), "assetTag"),
332
- $(r(u, "assethandler.assets.list.table.name", "Name"), "name"),
333
- $(r(u, "assethandler.assets.list.table.category", "Category"), "category"),
334
- $(r(u, "assethandler.assets.list.table.status", "Status"), "status"),
335
- $(r(u, "assethandler.assets.list.table.condition", "Condition"), "condition"),
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: r(u, "assethandler.assets.list.table.location", "Location")
337
+ children: u("assethandler.assets.list.table.location", "Location")
339
338
  }),
340
- $(r(u, "assethandler.assets.list.table.assignedTo", "Assigned To"), "assignedTo"),
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(xe, {
392
+ children: /* @__PURE__ */ w(be, {
394
393
  onView: () => f(`/assets/${e.id}`),
395
- onCopy: () => Ee(e.assetTag)
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: r(u, "assethandler.assets.list.grid.category", "Category")
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: r(u, "assethandler.assets.list.grid.condition", "Condition")
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: r(u, "assethandler.assets.list.grid.assignedTo", "Assigned To")
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: r(u, "assethandler.assets.list.empty.title", "No assets found"),
505
- description: r(u, "assethandler.assets.list.empty.description", "Try adjusting your filters or add a new asset to get started."),
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" }), r(u, "assethandler.assets.list.actions.addAsset", "Add Asset")]
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 xe({ onView: e, onCopy: t }) {
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 &middot; {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 ? <> &middot; {asset.serialNumber}</> : null}\n {asset.location ? <> &middot; {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}}')} &middot;{' '}\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 ? <> &middot; {asset.serialNumber}</> : null}\n {asset.location ? <> &middot; {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":"AAiKA,wBAAgB,aAAa,gCAisB5B"}
1
+ {"version":3,"file":"DashboardPage.d.ts","sourceRoot":"","sources":["../../../src/assethandler/pages/DashboardPage.tsx"],"names":[],"mappings":"AAgKA,wBAAgB,aAAa,gCA4rB5B"}