@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.4
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,18 +1,19 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { jsx as
|
|
2
|
+
import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
|
|
3
|
+
import { ArrowLeft as n, CheckCircle as r } from "lucide-react";
|
|
4
|
+
import { useParams as i } from "react-router-dom";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as s, Button as c, Card as l, CardContent as u, CardHeader as d, CardTitle as f, EmphasisPanel as p, GradientText as m, IllustratedEmptyState as h, NextSteps as g, PagePurpose as _, Separator as v } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/assethandler/pages/OperationsMaintenanceDetailPage.tsx
|
|
7
8
|
function y() {
|
|
8
|
-
let y =
|
|
9
|
-
if (!S) return /* @__PURE__ */
|
|
9
|
+
let y = t(), { maintenanceId: b } = i(), { maintenanceRecords: x } = e(), S = x.find((e) => e.id === b) ?? x[0];
|
|
10
|
+
if (!S) return /* @__PURE__ */ a("div", {
|
|
10
11
|
className: "p-6",
|
|
11
|
-
children: /* @__PURE__ */
|
|
12
|
+
children: /* @__PURE__ */ a(h, {
|
|
12
13
|
illustration: "empty-search",
|
|
13
14
|
title: "Maintenance record not found",
|
|
14
15
|
description: "This record may have been completed or removed. Return to the operations hub to find it.",
|
|
15
|
-
action: /* @__PURE__ */
|
|
16
|
+
action: /* @__PURE__ */ a(c, {
|
|
16
17
|
size: "sm",
|
|
17
18
|
onClick: () => y("/operations/operations-hub"),
|
|
18
19
|
children: "Back to operations"
|
|
@@ -20,45 +21,45 @@ function y() {
|
|
|
20
21
|
})
|
|
21
22
|
});
|
|
22
23
|
let C = S.checklist.filter((e) => e.completed).length;
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ o("div", {
|
|
24
25
|
className: "space-y-6 p-6",
|
|
25
26
|
children: [
|
|
26
|
-
/* @__PURE__ */
|
|
27
|
+
/* @__PURE__ */ o("div", {
|
|
27
28
|
className: "flex items-center justify-between",
|
|
28
|
-
children: [/* @__PURE__ */
|
|
29
|
+
children: [/* @__PURE__ */ o("div", {
|
|
29
30
|
className: "flex items-center gap-4",
|
|
30
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ a(c, {
|
|
31
32
|
variant: "ghost",
|
|
32
33
|
size: "icon",
|
|
33
34
|
onClick: () => y("/operations/operations-hub"),
|
|
34
|
-
children: /* @__PURE__ */
|
|
35
|
-
}), /* @__PURE__ */
|
|
35
|
+
children: /* @__PURE__ */ a(n, { className: "h-4 w-4" })
|
|
36
|
+
}), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("div", {
|
|
36
37
|
className: "flex items-center gap-3",
|
|
37
38
|
children: [
|
|
38
|
-
/* @__PURE__ */
|
|
39
|
+
/* @__PURE__ */ a("h1", {
|
|
39
40
|
className: "text-2xl font-bold",
|
|
40
|
-
children: /* @__PURE__ */
|
|
41
|
+
children: /* @__PURE__ */ a(m, { children: S.id })
|
|
41
42
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
+
/* @__PURE__ */ a(s, {
|
|
43
44
|
variant: "outline",
|
|
44
45
|
children: S.type
|
|
45
46
|
}),
|
|
46
|
-
/* @__PURE__ */
|
|
47
|
+
/* @__PURE__ */ a(s, {
|
|
47
48
|
variant: S.status === "completed" ? "default" : "secondary",
|
|
48
49
|
children: S.status.replace("_", " ")
|
|
49
50
|
})
|
|
50
51
|
]
|
|
51
|
-
}), /* @__PURE__ */
|
|
52
|
+
}), /* @__PURE__ */ a("p", {
|
|
52
53
|
className: "text-sm text-text-secondary mt-1",
|
|
53
54
|
children: S.title
|
|
54
55
|
})] })]
|
|
55
|
-
}), /* @__PURE__ */
|
|
56
|
+
}), /* @__PURE__ */ o(c, {
|
|
56
57
|
size: "sm",
|
|
57
|
-
children: [/* @__PURE__ */
|
|
58
|
+
children: [/* @__PURE__ */ a(r, { className: "mr-2 h-4 w-4" }), "Complete"]
|
|
58
59
|
})]
|
|
59
60
|
}),
|
|
60
|
-
/* @__PURE__ */ _
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ a(_, { children: "Everything needed to carry out and sign off a single maintenance job: the asset, the schedule, the step-by-step checklist and live progress. Work through the checklist, log notes and mark it complete so the asset's service history stays accurate." }),
|
|
62
|
+
/* @__PURE__ */ a(g, {
|
|
62
63
|
storageKey: "assethandler-maintenance-detail",
|
|
63
64
|
steps: [
|
|
64
65
|
{
|
|
@@ -81,73 +82,73 @@ function y() {
|
|
|
81
82
|
}
|
|
82
83
|
]
|
|
83
84
|
}),
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ o("div", {
|
|
85
86
|
className: "grid gap-6 lg:grid-cols-3",
|
|
86
|
-
children: [/* @__PURE__ */
|
|
87
|
+
children: [/* @__PURE__ */ o(p, {
|
|
87
88
|
className: "lg:col-span-2",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
89
|
+
children: [/* @__PURE__ */ a(d, {
|
|
89
90
|
className: "px-0 pt-0",
|
|
90
|
-
children: /* @__PURE__ */
|
|
91
|
-
}), /* @__PURE__ */
|
|
91
|
+
children: /* @__PURE__ */ a(f, { children: "Details" })
|
|
92
|
+
}), /* @__PURE__ */ o(u, {
|
|
92
93
|
className: "space-y-4 px-0 pb-0",
|
|
93
94
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h4", {
|
|
95
96
|
className: "text-sm font-medium text-text-secondary",
|
|
96
97
|
children: "Description"
|
|
97
|
-
}), /* @__PURE__ */
|
|
98
|
+
}), /* @__PURE__ */ a("p", {
|
|
98
99
|
className: "text-sm mt-1",
|
|
99
100
|
children: S.description
|
|
100
101
|
})] }),
|
|
101
|
-
/* @__PURE__ */
|
|
102
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ a(v, {}),
|
|
103
|
+
/* @__PURE__ */ o("div", {
|
|
103
104
|
className: "grid grid-cols-2 gap-4 text-sm",
|
|
104
105
|
children: [
|
|
105
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
106
107
|
className: "text-text-secondary",
|
|
107
108
|
children: "Asset"
|
|
108
|
-
}), /* @__PURE__ */
|
|
109
|
+
}), /* @__PURE__ */ a("p", {
|
|
109
110
|
className: "font-medium",
|
|
110
111
|
children: S.assetId
|
|
111
112
|
})] }),
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
113
114
|
className: "text-text-secondary",
|
|
114
115
|
children: "Type"
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
+
}), /* @__PURE__ */ a("p", {
|
|
116
117
|
className: "font-medium capitalize",
|
|
117
118
|
children: S.type
|
|
118
119
|
})] }),
|
|
119
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
120
121
|
className: "text-text-secondary",
|
|
121
122
|
children: "Scheduled"
|
|
122
|
-
}), /* @__PURE__ */
|
|
123
|
+
}), /* @__PURE__ */ a("p", {
|
|
123
124
|
className: "font-medium",
|
|
124
125
|
children: S.scheduledDate ? new Date(S.scheduledDate).toLocaleDateString() : "Not scheduled"
|
|
125
126
|
})] }),
|
|
126
|
-
/* @__PURE__ */
|
|
127
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
127
128
|
className: "text-text-secondary",
|
|
128
129
|
children: "Completed"
|
|
129
|
-
}), /* @__PURE__ */
|
|
130
|
+
}), /* @__PURE__ */ a("p", {
|
|
130
131
|
className: "font-medium",
|
|
131
132
|
children: S.completedDate ? new Date(S.completedDate).toLocaleDateString() : "—"
|
|
132
133
|
})] }),
|
|
133
|
-
S.estimatedCost != null && /* @__PURE__ */
|
|
134
|
+
S.estimatedCost != null && /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
134
135
|
className: "text-text-secondary",
|
|
135
136
|
children: "Estimated Cost"
|
|
136
|
-
}), /* @__PURE__ */
|
|
137
|
+
}), /* @__PURE__ */ o("p", {
|
|
137
138
|
className: "font-medium",
|
|
138
139
|
children: ["$", S.estimatedCost.toLocaleString()]
|
|
139
140
|
})] }),
|
|
140
|
-
S.actualCost != null && /* @__PURE__ */
|
|
141
|
+
S.actualCost != null && /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("span", {
|
|
141
142
|
className: "text-text-secondary",
|
|
142
143
|
children: "Actual Cost"
|
|
143
|
-
}), /* @__PURE__ */
|
|
144
|
+
}), /* @__PURE__ */ o("p", {
|
|
144
145
|
className: "font-medium",
|
|
145
146
|
children: ["$", S.actualCost.toLocaleString()]
|
|
146
147
|
})] })
|
|
147
148
|
]
|
|
148
149
|
}),
|
|
149
|
-
/* @__PURE__ */
|
|
150
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ a(v, {}),
|
|
151
|
+
/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("h4", {
|
|
151
152
|
className: "text-sm font-medium text-text-secondary mb-3",
|
|
152
153
|
children: [
|
|
153
154
|
"Checklist (",
|
|
@@ -156,14 +157,14 @@ function y() {
|
|
|
156
157
|
S.checklist.length,
|
|
157
158
|
")"
|
|
158
159
|
]
|
|
159
|
-
}), /* @__PURE__ */
|
|
160
|
+
}), /* @__PURE__ */ a("div", {
|
|
160
161
|
className: "space-y-2",
|
|
161
|
-
children: S.checklist.map((e, t) => /* @__PURE__ */
|
|
162
|
+
children: S.checklist.map((e, t) => /* @__PURE__ */ o("div", {
|
|
162
163
|
className: "flex items-center gap-3 rounded border p-2.5",
|
|
163
|
-
children: [/* @__PURE__ */
|
|
164
|
+
children: [/* @__PURE__ */ a("div", {
|
|
164
165
|
className: `h-4 w-4 rounded border-2 flex items-center justify-center ${e.completed ? "bg-action-primary-bg border-primary" : "border-muted-foreground"}`,
|
|
165
|
-
children: e.completed && /* @__PURE__ */
|
|
166
|
-
}), /* @__PURE__ */
|
|
166
|
+
children: e.completed && /* @__PURE__ */ a(r, { className: "h-3 w-3 text-action-primary-text" })
|
|
167
|
+
}), /* @__PURE__ */ a("span", {
|
|
167
168
|
className: `text-sm ${e.completed ? "line-through text-text-secondary" : ""}`,
|
|
168
169
|
children: e.task
|
|
169
170
|
})]
|
|
@@ -171,21 +172,21 @@ function y() {
|
|
|
171
172
|
})] })
|
|
172
173
|
]
|
|
173
174
|
})]
|
|
174
|
-
}), /* @__PURE__ */
|
|
175
|
+
}), /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ a(d, { children: /* @__PURE__ */ a(f, {
|
|
175
176
|
className: "text-base",
|
|
176
177
|
children: "Progress"
|
|
177
|
-
}) }), /* @__PURE__ */
|
|
178
|
+
}) }), /* @__PURE__ */ o(u, { children: [/* @__PURE__ */ o("div", {
|
|
178
179
|
className: "text-center mb-4",
|
|
179
|
-
children: [/* @__PURE__ */
|
|
180
|
+
children: [/* @__PURE__ */ o("p", {
|
|
180
181
|
className: "text-4xl font-bold",
|
|
181
182
|
children: [Math.round(C / S.checklist.length * 100), "%"]
|
|
182
|
-
}), /* @__PURE__ */
|
|
183
|
+
}), /* @__PURE__ */ a("p", {
|
|
183
184
|
className: "text-sm text-text-secondary",
|
|
184
185
|
children: "Complete"
|
|
185
186
|
})]
|
|
186
|
-
}), /* @__PURE__ */
|
|
187
|
+
}), /* @__PURE__ */ a("div", {
|
|
187
188
|
className: "h-3 rounded-full bg-bg-sunken overflow-hidden",
|
|
188
|
-
children: /* @__PURE__ */
|
|
189
|
+
children: /* @__PURE__ */ a("div", {
|
|
189
190
|
className: "h-full rounded-full bg-action-primary-bg transition-all",
|
|
190
191
|
style: { width: `${C / S.checklist.length * 100}%` }
|
|
191
192
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationsMaintenanceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/OperationsMaintenanceDetailPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, CheckCircle } from 'lucide-react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function OperationsMaintenanceDetailPage() {\n const navigate = useNavigate();\n const { maintenanceId } = useParams<{ maintenanceId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const record =\n maintenanceRecords.find((item) => item.id === maintenanceId) ?? maintenanceRecords[0];\n\n if (!record)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Maintenance record not found\"\n description=\"This record may have been completed or removed. Return to the operations hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/operations/operations-hub')}>\n Back to operations\n </Button>\n }\n />\n </div>\n );\n\n const completedTasks = record.checklist.filter((c) => c.completed).length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigate('/operations/operations-hub')}\n >\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>{record.id}</GradientText>\n </h1>\n <Badge variant=\"outline\">{record.type}</Badge>\n <Badge variant={record.status === 'completed' ? 'default' : 'secondary'}>\n {record.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{record.title}</p>\n </div>\n </div>\n <Button size=\"sm\">\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n Complete\n </Button>\n </div>\n\n <PagePurpose>\n Everything needed to carry out and sign off a single maintenance job: the asset, the\n schedule, the step-by-step checklist and live progress. Work through the checklist, log\n notes and mark it complete so the asset's service history stays accurate.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-maintenance-detail\"\n steps={[\n {\n id: 'complete',\n label: 'Work through the checklist',\n description: 'Tick off each task, then mark the job complete.',\n done: record.status === 'completed',\n },\n {\n id: 'asset',\n label: 'Open the related asset',\n description: 'Review the asset this maintenance is for.',\n onClick: () => navigate('/assets/asset-list'),\n },\n {\n id: 'calendar',\n label: 'View the maintenance calendar',\n description: 'See how this fits with other scheduled work.',\n onClick: () => navigate('/maintenance/maintenance-calendar'),\n },\n ]}\n />\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <EmphasisPanel className=\"lg:col-span-2\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary\">Description</h4>\n <p className=\"text-sm mt-1\">{record.description}</p>\n </div>\n <Separator />\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-text-secondary\">Asset</span>\n <p className=\"font-medium\">{record.assetId}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Type</span>\n <p className=\"font-medium capitalize\">{record.type}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Scheduled</span>\n <p className=\"font-medium\">\n {record.scheduledDate\n ? new Date(record.scheduledDate).toLocaleDateString()\n : 'Not scheduled'}\n </p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Completed</span>\n <p className=\"font-medium\">\n {record.completedDate ? new Date(record.completedDate).toLocaleDateString() : '—'}\n </p>\n </div>\n {record.estimatedCost != null && (\n <div>\n <span className=\"text-text-secondary\">Estimated Cost</span>\n <p className=\"font-medium\">${record.estimatedCost.toLocaleString()}</p>\n </div>\n )}\n {record.actualCost != null && (\n <div>\n <span className=\"text-text-secondary\">Actual Cost</span>\n <p className=\"font-medium\">${record.actualCost.toLocaleString()}</p>\n </div>\n )}\n </div>\n <Separator />\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary mb-3\">\n Checklist ({completedTasks}/{record.checklist.length})\n </h4>\n <div className=\"space-y-2\">\n {record.checklist.map((item, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded border p-2.5\">\n <div\n className={`h-4 w-4 rounded border-2 flex items-center justify-center ${item.completed ? 'bg-action-primary-bg border-primary' : 'border-muted-foreground'}`}\n >\n {item.completed && (\n <CheckCircle className=\"h-3 w-3 text-action-primary-text\" />\n )}\n </div>\n <span\n className={`text-sm ${item.completed ? 'line-through text-text-secondary' : ''}`}\n >\n {item.task}\n </span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Progress</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-center mb-4\">\n <p className=\"text-4xl font-bold\">\n {Math.round((completedTasks / record.checklist.length) * 100)}%\n </p>\n <p className=\"text-sm text-text-secondary\">Complete</p>\n </div>\n <div className=\"h-3 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all\"\n style={{ width: `${(completedTasks / record.checklist.length) * 100}%` }}\n />\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationsMaintenanceDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/OperationsMaintenanceDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Separator,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, CheckCircle } from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function OperationsMaintenanceDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { maintenanceId } = useParams<{ maintenanceId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const record =\n maintenanceRecords.find((item) => item.id === maintenanceId) ?? maintenanceRecords[0];\n\n if (!record)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Maintenance record not found\"\n description=\"This record may have been completed or removed. Return to the operations hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/operations/operations-hub')}>\n Back to operations\n </Button>\n }\n />\n </div>\n );\n\n const completedTasks = record.checklist.filter((c) => c.completed).length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={() => navigate('/operations/operations-hub')}\n >\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>{record.id}</GradientText>\n </h1>\n <Badge variant=\"outline\">{record.type}</Badge>\n <Badge variant={record.status === 'completed' ? 'default' : 'secondary'}>\n {record.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{record.title}</p>\n </div>\n </div>\n <Button size=\"sm\">\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n Complete\n </Button>\n </div>\n\n <PagePurpose>\n Everything needed to carry out and sign off a single maintenance job: the asset, the\n schedule, the step-by-step checklist and live progress. Work through the checklist, log\n notes and mark it complete so the asset's service history stays accurate.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-maintenance-detail\"\n steps={[\n {\n id: 'complete',\n label: 'Work through the checklist',\n description: 'Tick off each task, then mark the job complete.',\n done: record.status === 'completed',\n },\n {\n id: 'asset',\n label: 'Open the related asset',\n description: 'Review the asset this maintenance is for.',\n onClick: () => navigate('/assets/asset-list'),\n },\n {\n id: 'calendar',\n label: 'View the maintenance calendar',\n description: 'See how this fits with other scheduled work.',\n onClick: () => navigate('/maintenance/maintenance-calendar'),\n },\n ]}\n />\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <EmphasisPanel className=\"lg:col-span-2\">\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Details</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary\">Description</h4>\n <p className=\"text-sm mt-1\">{record.description}</p>\n </div>\n <Separator />\n <div className=\"grid grid-cols-2 gap-4 text-sm\">\n <div>\n <span className=\"text-text-secondary\">Asset</span>\n <p className=\"font-medium\">{record.assetId}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Type</span>\n <p className=\"font-medium capitalize\">{record.type}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Scheduled</span>\n <p className=\"font-medium\">\n {record.scheduledDate\n ? new Date(record.scheduledDate).toLocaleDateString()\n : 'Not scheduled'}\n </p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Completed</span>\n <p className=\"font-medium\">\n {record.completedDate ? new Date(record.completedDate).toLocaleDateString() : '—'}\n </p>\n </div>\n {record.estimatedCost != null && (\n <div>\n <span className=\"text-text-secondary\">Estimated Cost</span>\n <p className=\"font-medium\">${record.estimatedCost.toLocaleString()}</p>\n </div>\n )}\n {record.actualCost != null && (\n <div>\n <span className=\"text-text-secondary\">Actual Cost</span>\n <p className=\"font-medium\">${record.actualCost.toLocaleString()}</p>\n </div>\n )}\n </div>\n <Separator />\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary mb-3\">\n Checklist ({completedTasks}/{record.checklist.length})\n </h4>\n <div className=\"space-y-2\">\n {record.checklist.map((item, i) => (\n <div key={i} className=\"flex items-center gap-3 rounded border p-2.5\">\n <div\n className={`h-4 w-4 rounded border-2 flex items-center justify-center ${item.completed ? 'bg-action-primary-bg border-primary' : 'border-muted-foreground'}`}\n >\n {item.completed && (\n <CheckCircle className=\"h-3 w-3 text-action-primary-text\" />\n )}\n </div>\n <span\n className={`text-sm ${item.completed ? 'line-through text-text-secondary' : ''}`}\n >\n {item.task}\n </span>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Progress</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"text-center mb-4\">\n <p className=\"text-4xl font-bold\">\n {Math.round((completedTasks / record.checklist.length) * 100)}%\n </p>\n <p className=\"text-sm text-text-secondary\">Complete</p>\n </div>\n <div className=\"h-3 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-action-primary-bg transition-all\"\n style={{ width: `${(completedTasks / record.checklist.length) * 100}%` }}\n />\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|