@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/AssetHandlerRoot.js +18 -18
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
- package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
- package/dist/assethandler/pages/AnalyticsPage.js +154 -154
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
- package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
- package/dist/assethandler/pages/DashboardPage.js +119 -119
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
- package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
- package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +29 -29
- package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
- package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
- package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
- package/dist/assethandler/pages/ProvenancePage.js +36 -36
- package/dist/assethandler/pages/SamLicensesPage.js +27 -27
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
- package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
- package/package.json +1 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
2
|
+
import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
|
|
3
|
+
import { tWithFallback as n } from "../utils/i18n.js";
|
|
4
|
+
import { ArrowLeft as r, Calendar as i, Clock as a, MapPin as o, Tag as s, User as c, Wrench as l } from "lucide-react";
|
|
5
|
+
import { useParams as u } from "react-router-dom";
|
|
6
|
+
import { gql as d } from "@apollo/client";
|
|
7
|
+
import { useQuery as f } from "@apollo/client/react";
|
|
8
|
+
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
9
|
+
import { Badge as g, Button as _, Card as v, CardContent as y, CardDescription as b, CardHeader as x, CardTitle as S, EmphasisPanel as C, GradientText as w, IllustratedEmptyState as T, NextSteps as E, PagePurpose as D, Separator as O, Tabs as k, TabsContent as A, TabsList as j, TabsTrigger as M } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
import { useI18n as N } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
11
|
//#region src/assethandler/pages/AssetsAssetDetailPage.tsx
|
|
11
|
-
var P =
|
|
12
|
+
var P = d`
|
|
12
13
|
query AssetHandlerAsset($id: ID!) {
|
|
13
14
|
asset(id: $id) {
|
|
14
15
|
id
|
|
@@ -40,23 +41,23 @@ var P = M`
|
|
|
40
41
|
damaged: "text-status-error-text bg-status-error-bg-subtle"
|
|
41
42
|
};
|
|
42
43
|
function L() {
|
|
43
|
-
let { t:
|
|
44
|
+
let { t: d } = N(), L = t(), { assetId: z } = u(), { maintenanceRecords: B } = e(), { data: V, loading: H } = f(P, {
|
|
44
45
|
variables: { id: z ?? "" },
|
|
45
46
|
skip: !z,
|
|
46
47
|
fetchPolicy: "cache-and-network"
|
|
47
48
|
});
|
|
48
|
-
if (H && !V) return /* @__PURE__ */
|
|
49
|
+
if (H && !V) return /* @__PURE__ */ m("div", {
|
|
49
50
|
className: "space-y-3 p-6",
|
|
50
|
-
children: Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */
|
|
51
|
+
children: Array.from({ length: 6 }).map((e, t) => /* @__PURE__ */ m("div", { className: "h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
51
52
|
});
|
|
52
53
|
let U = V?.asset;
|
|
53
|
-
if (!U) return /* @__PURE__ */
|
|
54
|
+
if (!U) return /* @__PURE__ */ m("div", {
|
|
54
55
|
className: "p-6",
|
|
55
|
-
children: /* @__PURE__ */
|
|
56
|
+
children: /* @__PURE__ */ m(T, {
|
|
56
57
|
illustration: "empty-search",
|
|
57
|
-
title:
|
|
58
|
+
title: n(d, "assethandler.assets.detail.notFound", "Asset not found"),
|
|
58
59
|
description: "This asset may have been disposed or removed. Return to the inventory to find it.",
|
|
59
|
-
action: /* @__PURE__ */
|
|
60
|
+
action: /* @__PURE__ */ m(_, {
|
|
60
61
|
size: "sm",
|
|
61
62
|
onClick: () => L("/assets/asset-list"),
|
|
62
63
|
children: "Back to inventory"
|
|
@@ -69,42 +70,42 @@ function L() {
|
|
|
69
70
|
condition: U.condition.toLowerCase(),
|
|
70
71
|
category: U.category.toLowerCase()
|
|
71
72
|
}, G = B.filter((e) => e.assetId === W.id), K = G.filter((e) => e.status !== "completed" && e.status !== "cancelled");
|
|
72
|
-
return /* @__PURE__ */
|
|
73
|
+
return /* @__PURE__ */ h("div", {
|
|
73
74
|
className: "space-y-6 p-6",
|
|
74
75
|
children: [
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
+
/* @__PURE__ */ m("div", {
|
|
76
77
|
className: "flex items-center justify-between",
|
|
77
|
-
children: /* @__PURE__ */
|
|
78
|
+
children: /* @__PURE__ */ h("div", {
|
|
78
79
|
className: "flex items-center gap-4",
|
|
79
|
-
children: [/* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ m(_, {
|
|
80
81
|
variant: "ghost",
|
|
81
82
|
size: "icon",
|
|
82
83
|
onClick: () => L("/assets/asset-list"),
|
|
83
|
-
children: /* @__PURE__ */
|
|
84
|
-
}), /* @__PURE__ */
|
|
84
|
+
children: /* @__PURE__ */ m(r, { className: "h-4 w-4" })
|
|
85
|
+
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
|
|
85
86
|
className: "flex items-center gap-3",
|
|
86
87
|
children: [
|
|
87
|
-
/* @__PURE__ */
|
|
88
|
+
/* @__PURE__ */ m("h1", {
|
|
88
89
|
className: "text-2xl font-bold",
|
|
89
|
-
children: /* @__PURE__ */
|
|
90
|
+
children: /* @__PURE__ */ m(w, { children: W.name })
|
|
90
91
|
}),
|
|
91
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ m(g, {
|
|
92
93
|
variant: F[W.status] ?? "outline",
|
|
93
94
|
children: W.status.replace(/_/g, " ")
|
|
94
95
|
}),
|
|
95
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ m("span", {
|
|
96
97
|
className: `rounded-md px-2 py-0.5 text-xs font-medium ${I[W.condition] ?? ""}`,
|
|
97
98
|
children: W.condition
|
|
98
99
|
})
|
|
99
100
|
]
|
|
100
|
-
}), /* @__PURE__ */
|
|
101
|
+
}), /* @__PURE__ */ h("p", {
|
|
101
102
|
className: "text-sm text-text-secondary mt-1",
|
|
102
|
-
children: [W.assetNumber, W.serialNumber ? /* @__PURE__ */
|
|
103
|
+
children: [W.assetNumber, W.serialNumber ? /* @__PURE__ */ h(p, { children: [" · SN: ", W.serialNumber] }) : null]
|
|
103
104
|
})] })]
|
|
104
105
|
})
|
|
105
106
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ m(D, { children: n(d, "assethandler.assets.detail.purpose", "The complete profile of a single asset — its identity, condition, location, assignment and maintenance history. Use this page as the asset's home base: check it in or out and schedule the next service.") }),
|
|
108
|
+
/* @__PURE__ */ m(E, {
|
|
108
109
|
storageKey: "assethandler-asset-detail",
|
|
109
110
|
steps: [
|
|
110
111
|
{
|
|
@@ -127,117 +128,117 @@ function L() {
|
|
|
127
128
|
}
|
|
128
129
|
]
|
|
129
130
|
}),
|
|
130
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ h("div", {
|
|
131
132
|
className: "grid gap-4 md:grid-cols-4",
|
|
132
133
|
children: [
|
|
133
|
-
/* @__PURE__ */
|
|
134
|
-
/* @__PURE__ */
|
|
134
|
+
/* @__PURE__ */ h(C, { children: [
|
|
135
|
+
/* @__PURE__ */ h("div", {
|
|
135
136
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
136
|
-
children: [/* @__PURE__ */
|
|
137
|
+
children: [/* @__PURE__ */ m(l, { className: "h-4 w-4" }), n(d, "assethandler.assets.detail.stats.maintenanceRecords", "Maintenance Records")]
|
|
137
138
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ m("p", {
|
|
139
140
|
className: "text-2xl font-bold mt-1 tabular-nums",
|
|
140
141
|
children: G.length
|
|
141
142
|
}),
|
|
142
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ h("p", {
|
|
143
144
|
className: "text-xs text-text-secondary",
|
|
144
145
|
children: [
|
|
145
146
|
K.length,
|
|
146
147
|
" ",
|
|
147
|
-
|
|
148
|
+
n(d, "assethandler.assets.detail.stats.open", "open")
|
|
148
149
|
]
|
|
149
150
|
})
|
|
150
151
|
] }),
|
|
151
|
-
/* @__PURE__ */
|
|
152
|
+
/* @__PURE__ */ m(v, { children: /* @__PURE__ */ h(y, {
|
|
152
153
|
className: "pt-4",
|
|
153
|
-
children: [/* @__PURE__ */
|
|
154
|
+
children: [/* @__PURE__ */ h("div", {
|
|
154
155
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
155
|
-
children: [/* @__PURE__ */
|
|
156
|
-
}), /* @__PURE__ */
|
|
156
|
+
children: [/* @__PURE__ */ m(i, { className: "h-4 w-4" }), n(d, "assethandler.assets.detail.stats.registered", "Registered")]
|
|
157
|
+
}), /* @__PURE__ */ m("p", {
|
|
157
158
|
className: "text-lg font-bold mt-1",
|
|
158
159
|
children: W.createdAt ? new Date(W.createdAt).toLocaleDateString() : "—"
|
|
159
160
|
})]
|
|
160
161
|
}) }),
|
|
161
|
-
/* @__PURE__ */
|
|
162
|
+
/* @__PURE__ */ m(v, { children: /* @__PURE__ */ h(y, {
|
|
162
163
|
className: "pt-4",
|
|
163
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ h("div", {
|
|
164
165
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
166
|
-
}), /* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ m(a, { className: "h-4 w-4" }), n(d, "assethandler.assets.detail.stats.lastUpdated", "Last Updated")]
|
|
167
|
+
}), /* @__PURE__ */ m("p", {
|
|
167
168
|
className: "text-lg font-bold mt-1",
|
|
168
169
|
children: W.updatedAt ? new Date(W.updatedAt).toLocaleDateString() : "—"
|
|
169
170
|
})]
|
|
170
171
|
}) }),
|
|
171
|
-
/* @__PURE__ */
|
|
172
|
+
/* @__PURE__ */ m(v, { children: /* @__PURE__ */ h(y, {
|
|
172
173
|
className: "pt-4",
|
|
173
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ h("div", {
|
|
174
175
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
175
|
-
children: [/* @__PURE__ */
|
|
176
|
-
}), /* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ m(o, { className: "h-4 w-4" }), n(d, "assethandler.assets.detail.stats.location", "Location")]
|
|
177
|
+
}), /* @__PURE__ */ m("p", {
|
|
177
178
|
className: "text-lg font-bold mt-1 truncate",
|
|
178
179
|
children: W.locationName || "—"
|
|
179
180
|
})]
|
|
180
181
|
}) })
|
|
181
182
|
]
|
|
182
183
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
184
|
+
/* @__PURE__ */ h(k, {
|
|
184
185
|
defaultValue: "details",
|
|
185
186
|
children: [
|
|
186
|
-
/* @__PURE__ */ j
|
|
187
|
+
/* @__PURE__ */ h(j, { children: [/* @__PURE__ */ m(M, {
|
|
187
188
|
value: "details",
|
|
188
|
-
children:
|
|
189
|
-
}), /* @__PURE__ */
|
|
189
|
+
children: n(d, "assethandler.assets.detail.tabs.details", "Details")
|
|
190
|
+
}), /* @__PURE__ */ m(M, {
|
|
190
191
|
value: "maintenance",
|
|
191
|
-
children:
|
|
192
|
+
children: n(d, "assethandler.assets.detail.tabs.maintenance", "Maintenance")
|
|
192
193
|
})] }),
|
|
193
|
-
/* @__PURE__ */ A
|
|
194
|
+
/* @__PURE__ */ m(A, {
|
|
194
195
|
value: "details",
|
|
195
196
|
className: "space-y-6 mt-4",
|
|
196
|
-
children: /* @__PURE__ */
|
|
197
|
+
children: /* @__PURE__ */ h("div", {
|
|
197
198
|
className: "grid gap-6 lg:grid-cols-2",
|
|
198
|
-
children: [/* @__PURE__ */
|
|
199
|
+
children: [/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, { children: n(d, "assethandler.assets.detail.sections.generalInformation", "General Information") }) }), /* @__PURE__ */ m(y, { children: /* @__PURE__ */ h("dl", {
|
|
199
200
|
className: "space-y-3 text-sm",
|
|
200
201
|
children: [
|
|
201
|
-
/* @__PURE__ */
|
|
202
|
-
label:
|
|
202
|
+
/* @__PURE__ */ m(R, {
|
|
203
|
+
label: n(d, "assethandler.assets.detail.fields.description", "Description"),
|
|
203
204
|
value: W.description || "—"
|
|
204
205
|
}),
|
|
205
|
-
/* @__PURE__ */
|
|
206
|
-
label:
|
|
206
|
+
/* @__PURE__ */ m(R, {
|
|
207
|
+
label: n(d, "assethandler.assets.detail.fields.category", "Category"),
|
|
207
208
|
value: W.category.replace(/_/g, " ")
|
|
208
209
|
}),
|
|
209
|
-
/* @__PURE__ */
|
|
210
|
-
label:
|
|
210
|
+
/* @__PURE__ */ m(R, {
|
|
211
|
+
label: n(d, "assethandler.assets.detail.fields.serialNumber", "Serial Number"),
|
|
211
212
|
value: W.serialNumber || "—"
|
|
212
213
|
}),
|
|
213
|
-
/* @__PURE__ */
|
|
214
|
-
label:
|
|
214
|
+
/* @__PURE__ */ m(R, {
|
|
215
|
+
label: n(d, "assethandler.assets.detail.fields.assetTag", "Asset Tag"),
|
|
215
216
|
value: W.assetNumber
|
|
216
217
|
})
|
|
217
218
|
]
|
|
218
|
-
}) })] }), /* @__PURE__ */
|
|
219
|
-
/* @__PURE__ */
|
|
219
|
+
}) })] }), /* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(x, { children: /* @__PURE__ */ m(S, { children: n(d, "assethandler.assets.detail.sections.assignmentLocation", "Assignment & Location") }) }), /* @__PURE__ */ h(y, { children: [
|
|
220
|
+
/* @__PURE__ */ h("dl", {
|
|
220
221
|
className: "space-y-3 text-sm",
|
|
221
|
-
children: [/* @__PURE__ */
|
|
222
|
-
label:
|
|
222
|
+
children: [/* @__PURE__ */ m(R, {
|
|
223
|
+
label: n(d, "assethandler.assets.detail.fields.assignedTo", "Assigned To"),
|
|
223
224
|
value: W.assignedTo || "—",
|
|
224
|
-
icon: /* @__PURE__ */
|
|
225
|
-
}), /* @__PURE__ */
|
|
226
|
-
label:
|
|
225
|
+
icon: /* @__PURE__ */ m(c, { className: "h-3.5 w-3.5" })
|
|
226
|
+
}), /* @__PURE__ */ m(R, {
|
|
227
|
+
label: n(d, "assethandler.assets.detail.fields.location", "Location"),
|
|
227
228
|
value: W.locationName || "—",
|
|
228
|
-
icon: /* @__PURE__ */
|
|
229
|
+
icon: /* @__PURE__ */ m(o, { className: "h-3.5 w-3.5" })
|
|
229
230
|
})]
|
|
230
231
|
}),
|
|
231
|
-
/* @__PURE__ */
|
|
232
|
-
/* @__PURE__ */
|
|
232
|
+
/* @__PURE__ */ m(O, { className: "my-4" }),
|
|
233
|
+
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("h4", {
|
|
233
234
|
className: "text-sm font-medium mb-2 flex items-center gap-2",
|
|
234
|
-
children: [/* @__PURE__ */
|
|
235
|
-
}), W.tags.length === 0 ? /* @__PURE__ */
|
|
235
|
+
children: [/* @__PURE__ */ m(s, { className: "h-3.5 w-3.5" }), n(d, "assethandler.assets.detail.fields.tags", "Tags")]
|
|
236
|
+
}), W.tags.length === 0 ? /* @__PURE__ */ m("p", {
|
|
236
237
|
className: "text-xs text-text-secondary",
|
|
237
|
-
children:
|
|
238
|
-
}) : /* @__PURE__ */
|
|
238
|
+
children: n(d, "assethandler.assets.detail.fields.noTags", "No tags yet")
|
|
239
|
+
}) : /* @__PURE__ */ m("div", {
|
|
239
240
|
className: "flex flex-wrap gap-1.5",
|
|
240
|
-
children: W.tags.map((e) => /* @__PURE__ */
|
|
241
|
+
children: W.tags.map((e) => /* @__PURE__ */ m(g, {
|
|
241
242
|
variant: "secondary",
|
|
242
243
|
className: "text-xs",
|
|
243
244
|
children: e
|
|
@@ -246,55 +247,55 @@ function L() {
|
|
|
246
247
|
] })] })]
|
|
247
248
|
})
|
|
248
249
|
}),
|
|
249
|
-
/* @__PURE__ */ A
|
|
250
|
+
/* @__PURE__ */ m(A, {
|
|
250
251
|
value: "maintenance",
|
|
251
252
|
className: "mt-4",
|
|
252
|
-
children: /* @__PURE__ */
|
|
253
|
+
children: /* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(x, { children: [/* @__PURE__ */ h(S, {
|
|
253
254
|
className: "flex items-center gap-2",
|
|
254
|
-
children: [/* @__PURE__ */
|
|
255
|
-
}), /* @__PURE__ */
|
|
255
|
+
children: [/* @__PURE__ */ m(l, { className: "h-4 w-4" }), n(d, "assethandler.assets.detail.maintenance.title", "Maintenance History")]
|
|
256
|
+
}), /* @__PURE__ */ h(b, { children: [
|
|
256
257
|
G.length,
|
|
257
258
|
" ",
|
|
258
|
-
|
|
259
|
-
] })] }), /* @__PURE__ */
|
|
259
|
+
n(d, "assethandler.assets.detail.maintenance.recordsFound", "records found")
|
|
260
|
+
] })] }), /* @__PURE__ */ m(y, { children: G.length === 0 ? /* @__PURE__ */ m("p", {
|
|
260
261
|
className: "text-center text-text-secondary py-8",
|
|
261
|
-
children:
|
|
262
|
-
}) : /* @__PURE__ */
|
|
262
|
+
children: n(d, "assethandler.assets.detail.maintenance.empty", "No maintenance records for this asset.")
|
|
263
|
+
}) : /* @__PURE__ */ m("div", {
|
|
263
264
|
className: "space-y-3",
|
|
264
|
-
children: G.map((e) => /* @__PURE__ */
|
|
265
|
+
children: G.map((e) => /* @__PURE__ */ m("div", {
|
|
265
266
|
className: "flex items-start gap-4 rounded-lg border p-4",
|
|
266
|
-
children: /* @__PURE__ */
|
|
267
|
+
children: /* @__PURE__ */ h("div", {
|
|
267
268
|
className: "flex-1",
|
|
268
269
|
children: [
|
|
269
|
-
/* @__PURE__ */
|
|
270
|
+
/* @__PURE__ */ h("div", {
|
|
270
271
|
className: "flex items-center gap-2",
|
|
271
|
-
children: [/* @__PURE__ */
|
|
272
|
+
children: [/* @__PURE__ */ m(g, {
|
|
272
273
|
variant: "outline",
|
|
273
274
|
className: "capitalize",
|
|
274
275
|
children: e.type
|
|
275
|
-
}), /* @__PURE__ */
|
|
276
|
+
}), /* @__PURE__ */ m(g, {
|
|
276
277
|
variant: e.status === "completed" ? "default" : "secondary",
|
|
277
278
|
className: "capitalize",
|
|
278
279
|
children: e.status.replace(/_/g, " ")
|
|
279
280
|
})]
|
|
280
281
|
}),
|
|
281
|
-
/* @__PURE__ */
|
|
282
|
+
/* @__PURE__ */ m("p", {
|
|
282
283
|
className: "font-medium mt-1",
|
|
283
284
|
children: e.title
|
|
284
285
|
}),
|
|
285
|
-
/* @__PURE__ */
|
|
286
|
+
/* @__PURE__ */ m("p", {
|
|
286
287
|
className: "text-sm text-text-secondary",
|
|
287
288
|
children: e.description
|
|
288
289
|
}),
|
|
289
|
-
/* @__PURE__ */
|
|
290
|
+
/* @__PURE__ */ h("div", {
|
|
290
291
|
className: "flex gap-4 mt-2 text-xs text-text-secondary",
|
|
291
|
-
children: [/* @__PURE__ */
|
|
292
|
-
|
|
292
|
+
children: [/* @__PURE__ */ h("span", { children: [
|
|
293
|
+
n(d, "assethandler.assets.detail.maintenance.scheduled", "Scheduled"),
|
|
293
294
|
":",
|
|
294
295
|
" ",
|
|
295
296
|
e.scheduledDate ? new Date(e.scheduledDate).toLocaleDateString() : "—"
|
|
296
|
-
] }), e.actualCost != null || e.estimatedCost != null ? /* @__PURE__ */
|
|
297
|
-
|
|
297
|
+
] }), e.actualCost != null || e.estimatedCost != null ? /* @__PURE__ */ h("span", { children: [
|
|
298
|
+
n(d, "assethandler.assets.detail.maintenance.cost", "Cost"),
|
|
298
299
|
": $",
|
|
299
300
|
(e.actualCost ?? e.estimatedCost ?? 0).toLocaleString()
|
|
300
301
|
] }) : null]
|
|
@@ -310,12 +311,12 @@ function L() {
|
|
|
310
311
|
});
|
|
311
312
|
}
|
|
312
313
|
function R({ label: e, value: t, icon: n }) {
|
|
313
|
-
return /* @__PURE__ */
|
|
314
|
+
return /* @__PURE__ */ h("div", {
|
|
314
315
|
className: "flex items-start justify-between gap-4",
|
|
315
|
-
children: [/* @__PURE__ */
|
|
316
|
+
children: [/* @__PURE__ */ h("dt", {
|
|
316
317
|
className: "text-text-secondary flex items-center gap-1.5 shrink-0",
|
|
317
318
|
children: [n, e]
|
|
318
|
-
}), /* @__PURE__ */
|
|
319
|
+
}), /* @__PURE__ */ m("dd", {
|
|
319
320
|
className: "font-medium text-right capitalize",
|
|
320
321
|
children: t
|
|
321
322
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import type React from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, MapPin, Calendar, Tag, User, Wrench, Clock } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { tWithFallback } from '../utils/i18n';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface AssetQueryResult {\n asset: {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n } | null;\n}\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n inactive: 'outline',\n maintenance: 'secondary',\n retired: 'outline',\n disposed: 'destructive',\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\nexport function AssetsAssetDetailPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n\n const { data, loading } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\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 );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'assethandler.assets.detail.notFound', 'Asset not found')}\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n Back to inventory\n </Button>\n }\n />\n </div>\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <Badge variant={statusColors[asset.status] ?? 'outline'}>\n {asset.status.replace(/_/g, ' ')}\n </Badge>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.purpose',\n \"The complete profile of a single asset — its identity, condition, location, assignment and maintenance history. Use this page as the asset's home base: check it in or out and schedule the next service.\"\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-asset-detail\"\n steps={[\n {\n id: 'checkinout',\n label: 'Check this asset in or out',\n description: 'Record who is using it and when it returns.',\n onClick: () => navigate('/assets/asset-check-in-out'),\n },\n {\n id: 'maintenance',\n label: 'Schedule maintenance',\n description: 'Plan the next service before it is overdue.',\n onClick: () => navigate('/maintenance/maintenance-scheduler'),\n },\n {\n id: 'operations',\n label: 'Raise a work order',\n description: 'Create corrective or preventive work for this asset.',\n onClick: () => navigate('/operations/operations-hub'),\n },\n ]}\n />\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Wrench className=\"h-4 w-4\" />\n {tWithFallback(\n t,\n 'assethandler.assets.detail.stats.maintenanceRecords',\n 'Maintenance Records'\n )}\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{assetMaintenance.length}</p>\n <p className=\"text-xs text-text-secondary\">\n {openMaintenance.length}{' '}\n {tWithFallback(t, 'assethandler.assets.detail.stats.open', 'open')}\n </p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.registered', 'Registered')}\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.lastUpdated', 'Last Updated')}\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.updatedAt ? new Date(asset.updatedAt).toLocaleDateString() : '—'}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.location', 'Location')}\n </div>\n <p className=\"text-lg font-bold mt-1 truncate\">{asset.locationName || '—'}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"details\">\n <TabsList>\n <TabsTrigger value=\"details\">\n {tWithFallback(t, 'assethandler.assets.detail.tabs.details', 'Details')}\n </TabsTrigger>\n <TabsTrigger value=\"maintenance\">\n {tWithFallback(t, 'assethandler.assets.detail.tabs.maintenance', 'Maintenance')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"space-y-6 mt-4\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.sections.generalInformation',\n 'General Information'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.description',\n 'Description'\n )}\n value={asset.description || '—'}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.category',\n 'Category'\n )}\n value={asset.category.replace(/_/g, ' ')}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.serialNumber',\n 'Serial Number'\n )}\n value={asset.serialNumber || '—'}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.assetTag',\n 'Asset Tag'\n )}\n value={asset.assetNumber}\n />\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.sections.assignmentLocation',\n 'Assignment & Location'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.assignedTo',\n 'Assigned To'\n )}\n value={asset.assignedTo || '—'}\n icon={<User className=\"h-3.5 w-3.5\" />}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.location',\n 'Location'\n )}\n value={asset.locationName || '—'}\n icon={<MapPin className=\"h-3.5 w-3.5\" />}\n />\n </dl>\n <Separator className=\"my-4\" />\n <div>\n <h4 className=\"text-sm font-medium mb-2 flex items-center gap-2\">\n <Tag className=\"h-3.5 w-3.5\" />\n {tWithFallback(t, 'assethandler.assets.detail.fields.tags', 'Tags')}\n </h4>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n {tWithFallback(t, 'assethandler.assets.detail.fields.noTags', 'No tags yet')}\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.title',\n 'Maintenance History'\n )}\n </CardTitle>\n <CardDescription>\n {assetMaintenance.length}{' '}\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.recordsFound',\n 'records found'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"text-center text-text-secondary py-8\">\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.empty',\n 'No maintenance records for this asset.'\n )}\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <Badge\n variant={m.status === 'completed' ? 'default' : 'secondary'}\n className=\"capitalize\"\n >\n {m.status.replace(/_/g, ' ')}\n </Badge>\n </div>\n <p className=\"font-medium mt-1\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"flex gap-4 mt-2 text-xs text-text-secondary\">\n <span>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.scheduled',\n 'Scheduled'\n )}\n :{' '}\n {m.scheduledDate ? new Date(m.scheduledDate).toLocaleDateString() : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.cost',\n 'Cost'\n )}\n : ${(m.actualCost ?? m.estimatedCost ?? 0).toLocaleString()}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n\nfunction DetailRow({\n label,\n value,\n icon,\n}: {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4\">\n <dt className=\"text-text-secondary flex items-center gap-1.5 shrink-0\">\n {icon}\n {label}\n </dt>\n <dd className=\"font-medium text-right capitalize\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport type React from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Separator,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, MapPin, Calendar, Tag, User, Wrench, Clock } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useParams } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { tWithFallback } from '../utils/i18n';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n }\n }\n`;\n\ninterface AssetQueryResult {\n asset: {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n } | null;\n}\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n inactive: 'outline',\n maintenance: 'secondary',\n retired: 'outline',\n disposed: 'destructive',\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\nexport function AssetsAssetDetailPage() {\n const { t } = useI18n();\n const navigate = useAssetHandlerNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n\n const { data, loading } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\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 );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title={tWithFallback(t, 'assethandler.assets.detail.notFound', 'Asset not found')}\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n Back to inventory\n </Button>\n }\n />\n </div>\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{asset.name}</GradientText>\n </h1>\n <Badge variant={statusColors[asset.status] ?? 'outline'}>\n {asset.status.replace(/_/g, ' ')}\n </Badge>\n <span\n className={`rounded-md px-2 py-0.5 text-xs font-medium ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.purpose',\n \"The complete profile of a single asset — its identity, condition, location, assignment and maintenance history. Use this page as the asset's home base: check it in or out and schedule the next service.\"\n )}\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-asset-detail\"\n steps={[\n {\n id: 'checkinout',\n label: 'Check this asset in or out',\n description: 'Record who is using it and when it returns.',\n onClick: () => navigate('/assets/asset-check-in-out'),\n },\n {\n id: 'maintenance',\n label: 'Schedule maintenance',\n description: 'Plan the next service before it is overdue.',\n onClick: () => navigate('/maintenance/maintenance-scheduler'),\n },\n {\n id: 'operations',\n label: 'Raise a work order',\n description: 'Create corrective or preventive work for this asset.',\n onClick: () => navigate('/operations/operations-hub'),\n },\n ]}\n />\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Wrench className=\"h-4 w-4\" />\n {tWithFallback(\n t,\n 'assethandler.assets.detail.stats.maintenanceRecords',\n 'Maintenance Records'\n )}\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{assetMaintenance.length}</p>\n <p className=\"text-xs text-text-secondary\">\n {openMaintenance.length}{' '}\n {tWithFallback(t, 'assethandler.assets.detail.stats.open', 'open')}\n </p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Calendar className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.registered', 'Registered')}\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.lastUpdated', 'Last Updated')}\n </div>\n <p className=\"text-lg font-bold mt-1\">\n {asset.updatedAt ? new Date(asset.updatedAt).toLocaleDateString() : '—'}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <MapPin className=\"h-4 w-4\" />\n {tWithFallback(t, 'assethandler.assets.detail.stats.location', 'Location')}\n </div>\n <p className=\"text-lg font-bold mt-1 truncate\">{asset.locationName || '—'}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"details\">\n <TabsList>\n <TabsTrigger value=\"details\">\n {tWithFallback(t, 'assethandler.assets.detail.tabs.details', 'Details')}\n </TabsTrigger>\n <TabsTrigger value=\"maintenance\">\n {tWithFallback(t, 'assethandler.assets.detail.tabs.maintenance', 'Maintenance')}\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"space-y-6 mt-4\">\n <div className=\"grid gap-6 lg:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.sections.generalInformation',\n 'General Information'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.description',\n 'Description'\n )}\n value={asset.description || '—'}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.category',\n 'Category'\n )}\n value={asset.category.replace(/_/g, ' ')}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.serialNumber',\n 'Serial Number'\n )}\n value={asset.serialNumber || '—'}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.assetTag',\n 'Asset Tag'\n )}\n value={asset.assetNumber}\n />\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.sections.assignmentLocation',\n 'Assignment & Location'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.assignedTo',\n 'Assigned To'\n )}\n value={asset.assignedTo || '—'}\n icon={<User className=\"h-3.5 w-3.5\" />}\n />\n <DetailRow\n label={tWithFallback(\n t,\n 'assethandler.assets.detail.fields.location',\n 'Location'\n )}\n value={asset.locationName || '—'}\n icon={<MapPin className=\"h-3.5 w-3.5\" />}\n />\n </dl>\n <Separator className=\"my-4\" />\n <div>\n <h4 className=\"text-sm font-medium mb-2 flex items-center gap-2\">\n <Tag className=\"h-3.5 w-3.5\" />\n {tWithFallback(t, 'assethandler.assets.detail.fields.tags', 'Tags')}\n </h4>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">\n {tWithFallback(t, 'assethandler.assets.detail.fields.noTags', 'No tags yet')}\n </p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <Badge key={tag} variant=\"secondary\" className=\"text-xs\">\n {tag}\n </Badge>\n ))}\n </div>\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.title',\n 'Maintenance History'\n )}\n </CardTitle>\n <CardDescription>\n {assetMaintenance.length}{' '}\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.recordsFound',\n 'records found'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"text-center text-text-secondary py-8\">\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.empty',\n 'No maintenance records for this asset.'\n )}\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <Badge\n variant={m.status === 'completed' ? 'default' : 'secondary'}\n className=\"capitalize\"\n >\n {m.status.replace(/_/g, ' ')}\n </Badge>\n </div>\n <p className=\"font-medium mt-1\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"flex gap-4 mt-2 text-xs text-text-secondary\">\n <span>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.scheduled',\n 'Scheduled'\n )}\n :{' '}\n {m.scheduledDate ? new Date(m.scheduledDate).toLocaleDateString() : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>\n {tWithFallback(\n t,\n 'assethandler.assets.detail.maintenance.cost',\n 'Cost'\n )}\n : ${(m.actualCost ?? m.estimatedCost ?? 0).toLocaleString()}\n </span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n\nfunction DetailRow({\n label,\n value,\n icon,\n}: {\n label: string;\n value: string;\n icon?: React.ReactNode;\n}) {\n return (\n <div className=\"flex items-start justify-between gap-4\">\n <dt className=\"text-text-secondary flex items-center gap-1.5 shrink-0\">\n {icon}\n {label}\n </dt>\n <dd className=\"font-medium text-right capitalize\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|