@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,8 +1,9 @@
|
|
|
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, XCircle as i } from "lucide-react";
|
|
4
|
+
import { useParams as a } from "react-router-dom";
|
|
5
|
+
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as c, Button as l, Card as u, CardContent as d, CardHeader as f, CardTitle as p, EmphasisPanel as m, GradientText as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v, Separator as y } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/assethandler/pages/ItilChangeDetailPage.tsx
|
|
7
8
|
var b = {
|
|
8
9
|
critical: "destructive",
|
|
@@ -11,14 +12,14 @@ var b = {
|
|
|
11
12
|
low: "secondary"
|
|
12
13
|
};
|
|
13
14
|
function x() {
|
|
14
|
-
let x =
|
|
15
|
-
if (!T) return /* @__PURE__ */
|
|
15
|
+
let x = t(), { changeId: S } = a(), { changeRequests: C, assets: w } = e(), T = C.find((e) => e.id === S) ?? C[0];
|
|
16
|
+
if (!T) return /* @__PURE__ */ o("div", {
|
|
16
17
|
className: "p-6",
|
|
17
|
-
children: /* @__PURE__ */
|
|
18
|
+
children: /* @__PURE__ */ o(g, {
|
|
18
19
|
illustration: "empty-search",
|
|
19
20
|
title: "Change request not found",
|
|
20
21
|
description: "This change may have been completed or removed. Return to change management to find it.",
|
|
21
|
-
action: /* @__PURE__ */
|
|
22
|
+
action: /* @__PURE__ */ o(l, {
|
|
22
23
|
size: "sm",
|
|
23
24
|
onClick: () => x("/itil/change-management"),
|
|
24
25
|
children: "Back to changes"
|
|
@@ -26,57 +27,57 @@ function x() {
|
|
|
26
27
|
})
|
|
27
28
|
});
|
|
28
29
|
let E = w.filter((e) => T.affectedAssets.includes(e.id));
|
|
29
|
-
return /* @__PURE__ */
|
|
30
|
+
return /* @__PURE__ */ s("div", {
|
|
30
31
|
className: "space-y-6 p-6",
|
|
31
32
|
children: [
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
+
/* @__PURE__ */ s("div", {
|
|
33
34
|
className: "flex items-center justify-between",
|
|
34
|
-
children: [/* @__PURE__ */
|
|
35
|
+
children: [/* @__PURE__ */ s("div", {
|
|
35
36
|
className: "flex items-center gap-4",
|
|
36
|
-
children: [/* @__PURE__ */
|
|
37
|
+
children: [/* @__PURE__ */ o(l, {
|
|
37
38
|
variant: "ghost",
|
|
38
39
|
size: "icon",
|
|
39
40
|
onClick: () => x("/itil/change-management"),
|
|
40
|
-
children: /* @__PURE__ */
|
|
41
|
-
}), /* @__PURE__ */
|
|
41
|
+
children: /* @__PURE__ */ o(n, { className: "h-4 w-4" })
|
|
42
|
+
}), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ s("div", {
|
|
42
43
|
className: "flex items-center gap-3",
|
|
43
44
|
children: [
|
|
44
|
-
/* @__PURE__ */
|
|
45
|
+
/* @__PURE__ */ o("h1", {
|
|
45
46
|
className: "text-2xl font-bold",
|
|
46
|
-
children: /* @__PURE__ */
|
|
47
|
+
children: /* @__PURE__ */ o(h, { children: T.id })
|
|
47
48
|
}),
|
|
48
|
-
/* @__PURE__ */
|
|
49
|
+
/* @__PURE__ */ o(c, {
|
|
49
50
|
variant: T.type === "emergency" ? "destructive" : "outline",
|
|
50
51
|
className: "capitalize",
|
|
51
52
|
children: T.type
|
|
52
53
|
}),
|
|
53
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ s(c, {
|
|
54
55
|
variant: b[T.risk],
|
|
55
56
|
children: ["Risk: ", T.risk]
|
|
56
57
|
}),
|
|
57
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ o(c, {
|
|
58
59
|
variant: "outline",
|
|
59
60
|
children: T.status.replace("_", " ")
|
|
60
61
|
})
|
|
61
62
|
]
|
|
62
|
-
}), /* @__PURE__ */
|
|
63
|
+
}), /* @__PURE__ */ o("p", {
|
|
63
64
|
className: "text-sm text-text-secondary mt-1",
|
|
64
65
|
children: T.title
|
|
65
66
|
})] })]
|
|
66
|
-
}), /* @__PURE__ */
|
|
67
|
+
}), /* @__PURE__ */ s("div", {
|
|
67
68
|
className: "flex gap-2",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ o(l, {
|
|
69
70
|
variant: "outline",
|
|
70
71
|
size: "sm",
|
|
71
72
|
children: "Reject"
|
|
72
|
-
}), /* @__PURE__ */
|
|
73
|
+
}), /* @__PURE__ */ s(l, {
|
|
73
74
|
size: "sm",
|
|
74
|
-
children: [/* @__PURE__ */
|
|
75
|
+
children: [/* @__PURE__ */ o(r, { className: "mr-2 h-4 w-4" }), "Approve"]
|
|
75
76
|
})]
|
|
76
77
|
})]
|
|
77
78
|
}),
|
|
78
|
-
/* @__PURE__ */ v
|
|
79
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ o(v, { children: "The full record of a single planned change: what is changing, its risk and schedule, which assets it touches, and where it stands in the approval chain. Use this page to approve, reject or track a change so it lands safely in its agreed window." }),
|
|
80
|
+
/* @__PURE__ */ o(_, {
|
|
80
81
|
storageKey: "assethandler-change-detail",
|
|
81
82
|
steps: [
|
|
82
83
|
{
|
|
@@ -99,55 +100,55 @@ function x() {
|
|
|
99
100
|
}
|
|
100
101
|
]
|
|
101
102
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
103
|
+
/* @__PURE__ */ s("div", {
|
|
103
104
|
className: "grid gap-6 lg:grid-cols-3",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
105
|
+
children: [/* @__PURE__ */ s(m, {
|
|
105
106
|
className: "lg:col-span-2",
|
|
106
|
-
children: [/* @__PURE__ */
|
|
107
|
+
children: [/* @__PURE__ */ o(f, {
|
|
107
108
|
className: "px-0 pt-0",
|
|
108
|
-
children: /* @__PURE__ */
|
|
109
|
-
}), /* @__PURE__ */
|
|
109
|
+
children: /* @__PURE__ */ o(p, { children: "Change Details" })
|
|
110
|
+
}), /* @__PURE__ */ s(d, {
|
|
110
111
|
className: "space-y-4 px-0 pb-0",
|
|
111
112
|
children: [
|
|
112
|
-
/* @__PURE__ */
|
|
113
|
+
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h4", {
|
|
113
114
|
className: "text-sm font-medium text-text-secondary",
|
|
114
115
|
children: "Description"
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
+
}), /* @__PURE__ */ o("p", {
|
|
116
117
|
className: "text-sm mt-1",
|
|
117
118
|
children: T.description
|
|
118
119
|
})] }),
|
|
119
|
-
/* @__PURE__ */
|
|
120
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ o(y, {}),
|
|
121
|
+
/* @__PURE__ */ s("div", {
|
|
121
122
|
className: "grid grid-cols-2 gap-4 text-sm",
|
|
122
|
-
children: [/* @__PURE__ */
|
|
123
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("span", {
|
|
123
124
|
className: "text-text-secondary",
|
|
124
125
|
children: "Scheduled Start"
|
|
125
|
-
}), /* @__PURE__ */
|
|
126
|
+
}), /* @__PURE__ */ o("p", {
|
|
126
127
|
className: "font-medium",
|
|
127
128
|
children: new Date(T.scheduledStart).toLocaleString()
|
|
128
|
-
})] }), /* @__PURE__ */
|
|
129
|
+
})] }), /* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("span", {
|
|
129
130
|
className: "text-text-secondary",
|
|
130
131
|
children: "Scheduled End"
|
|
131
|
-
}), /* @__PURE__ */
|
|
132
|
+
}), /* @__PURE__ */ o("p", {
|
|
132
133
|
className: "font-medium",
|
|
133
134
|
children: new Date(T.scheduledEnd).toLocaleString()
|
|
134
135
|
})] })]
|
|
135
136
|
}),
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
/* @__PURE__ */
|
|
137
|
+
/* @__PURE__ */ o(y, {}),
|
|
138
|
+
/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h4", {
|
|
138
139
|
className: "text-sm font-medium text-text-secondary mb-2",
|
|
139
140
|
children: "Affected Assets"
|
|
140
|
-
}), /* @__PURE__ */
|
|
141
|
+
}), /* @__PURE__ */ o("div", {
|
|
141
142
|
className: "space-y-2",
|
|
142
|
-
children: E.map((e) => /* @__PURE__ */
|
|
143
|
+
children: E.map((e) => /* @__PURE__ */ s("div", {
|
|
143
144
|
className: "flex items-center justify-between rounded border p-2",
|
|
144
|
-
children: [/* @__PURE__ */
|
|
145
|
+
children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("p", {
|
|
145
146
|
className: "text-sm font-medium",
|
|
146
147
|
children: e.name
|
|
147
|
-
}), /* @__PURE__ */
|
|
148
|
+
}), /* @__PURE__ */ o("p", {
|
|
148
149
|
className: "text-xs text-text-secondary",
|
|
149
150
|
children: e.assetTag
|
|
150
|
-
})] }), /* @__PURE__ */
|
|
151
|
+
})] }), /* @__PURE__ */ o(c, {
|
|
151
152
|
variant: "outline",
|
|
152
153
|
children: e.status.replace("_", " ")
|
|
153
154
|
})]
|
|
@@ -155,93 +156,93 @@ function x() {
|
|
|
155
156
|
})] })
|
|
156
157
|
]
|
|
157
158
|
})]
|
|
158
|
-
}), /* @__PURE__ */
|
|
159
|
+
}), /* @__PURE__ */ s("div", {
|
|
159
160
|
className: "space-y-4",
|
|
160
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, {
|
|
161
162
|
className: "text-base",
|
|
162
163
|
children: "Properties"
|
|
163
|
-
}) }), /* @__PURE__ */
|
|
164
|
+
}) }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ s("dl", {
|
|
164
165
|
className: "space-y-3 text-sm",
|
|
165
166
|
children: [
|
|
166
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ s("div", {
|
|
167
168
|
className: "flex justify-between",
|
|
168
|
-
children: [/* @__PURE__ */
|
|
169
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
169
170
|
className: "text-text-secondary",
|
|
170
171
|
children: "Type"
|
|
171
|
-
}), /* @__PURE__ */
|
|
172
|
+
}), /* @__PURE__ */ o("dd", {
|
|
172
173
|
className: "font-medium capitalize",
|
|
173
174
|
children: T.type
|
|
174
175
|
})]
|
|
175
176
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
177
|
+
/* @__PURE__ */ s("div", {
|
|
177
178
|
className: "flex justify-between",
|
|
178
|
-
children: [/* @__PURE__ */
|
|
179
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
179
180
|
className: "text-text-secondary",
|
|
180
181
|
children: "Risk"
|
|
181
|
-
}), /* @__PURE__ */
|
|
182
|
+
}), /* @__PURE__ */ o("dd", { children: /* @__PURE__ */ o(c, {
|
|
182
183
|
variant: b[T.risk],
|
|
183
184
|
children: T.risk
|
|
184
185
|
}) })]
|
|
185
186
|
}),
|
|
186
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ s("div", {
|
|
187
188
|
className: "flex justify-between",
|
|
188
|
-
children: [/* @__PURE__ */
|
|
189
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
189
190
|
className: "text-text-secondary",
|
|
190
191
|
children: "Status"
|
|
191
|
-
}), /* @__PURE__ */
|
|
192
|
+
}), /* @__PURE__ */ o("dd", { children: /* @__PURE__ */ o(c, {
|
|
192
193
|
variant: "outline",
|
|
193
194
|
children: T.status.replace("_", " ")
|
|
194
195
|
}) })]
|
|
195
196
|
}),
|
|
196
|
-
/* @__PURE__ */
|
|
197
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ o(y, {}),
|
|
198
|
+
/* @__PURE__ */ s("div", {
|
|
198
199
|
className: "flex justify-between",
|
|
199
|
-
children: [/* @__PURE__ */
|
|
200
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
200
201
|
className: "text-text-secondary",
|
|
201
202
|
children: "Requested By"
|
|
202
|
-
}), /* @__PURE__ */
|
|
203
|
+
}), /* @__PURE__ */ o("dd", {
|
|
203
204
|
className: "text-xs",
|
|
204
205
|
children: T.requestedBy
|
|
205
206
|
})]
|
|
206
207
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ s("div", {
|
|
208
209
|
className: "flex justify-between",
|
|
209
|
-
children: [/* @__PURE__ */
|
|
210
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
210
211
|
className: "text-text-secondary",
|
|
211
212
|
children: "Assigned To"
|
|
212
|
-
}), /* @__PURE__ */
|
|
213
|
+
}), /* @__PURE__ */ o("dd", {
|
|
213
214
|
className: "text-xs",
|
|
214
215
|
children: T.assignedTo
|
|
215
216
|
})]
|
|
216
217
|
}),
|
|
217
|
-
/* @__PURE__ */
|
|
218
|
+
/* @__PURE__ */ s("div", {
|
|
218
219
|
className: "flex justify-between",
|
|
219
|
-
children: [/* @__PURE__ */
|
|
220
|
+
children: [/* @__PURE__ */ o("dt", {
|
|
220
221
|
className: "text-text-secondary",
|
|
221
222
|
children: "Created"
|
|
222
|
-
}), /* @__PURE__ */
|
|
223
|
+
}), /* @__PURE__ */ o("dd", {
|
|
223
224
|
className: "text-xs",
|
|
224
225
|
children: new Date(T.createdAt).toLocaleDateString()
|
|
225
226
|
})]
|
|
226
227
|
})
|
|
227
228
|
]
|
|
228
|
-
}) })] }), /* @__PURE__ */
|
|
229
|
+
}) })] }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o(f, { children: /* @__PURE__ */ o(p, {
|
|
229
230
|
className: "text-base",
|
|
230
231
|
children: "Approvals"
|
|
231
|
-
}) }), /* @__PURE__ */
|
|
232
|
+
}) }), /* @__PURE__ */ o(d, { children: T.approvals.length === 0 ? /* @__PURE__ */ o("p", {
|
|
232
233
|
className: "text-sm text-text-secondary text-center py-4",
|
|
233
234
|
children: "No approvals yet"
|
|
234
|
-
}) : /* @__PURE__ */
|
|
235
|
+
}) : /* @__PURE__ */ o("div", {
|
|
235
236
|
className: "space-y-2",
|
|
236
|
-
children: T.approvals.map((e, t) => /* @__PURE__ */
|
|
237
|
+
children: T.approvals.map((e, t) => /* @__PURE__ */ s("div", {
|
|
237
238
|
className: "flex items-center justify-between rounded border p-2",
|
|
238
|
-
children: [/* @__PURE__ */
|
|
239
|
+
children: [/* @__PURE__ */ s("div", {
|
|
239
240
|
className: "flex items-center gap-2",
|
|
240
|
-
children: [e.status === "approved" ? /* @__PURE__ */
|
|
241
|
+
children: [e.status === "approved" ? /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" }) : /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-error-text" }), /* @__PURE__ */ o("span", {
|
|
241
242
|
className: "text-sm",
|
|
242
243
|
children: e.name
|
|
243
244
|
})]
|
|
244
|
-
}), /* @__PURE__ */
|
|
245
|
+
}), /* @__PURE__ */ o("span", {
|
|
245
246
|
className: "text-xs text-text-secondary",
|
|
246
247
|
children: new Date(e.date).toLocaleDateString()
|
|
247
248
|
})]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItilChangeDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/ItilChangeDetailPage.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, XCircle } from 'lucide-react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst riskColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n};\n\nexport function ItilChangeDetailPage() {\n const navigate = useNavigate();\n const { changeId } = useParams<{ changeId: string }>();\n const { changeRequests, assets } = useAssetHandlerStore();\n const change = changeRequests.find((item) => item.id === changeId) ?? changeRequests[0];\n\n if (!change)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Change request not found\"\n description=\"This change may have been completed or removed. Return to change management to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/itil/change-management')}>\n Back to changes\n </Button>\n }\n />\n </div>\n );\n\n const affectedAssetDetails = assets.filter((a) => change.affectedAssets.includes(a.id));\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 variant=\"ghost\" size=\"icon\" onClick={() => navigate('/itil/change-management')}>\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>{change.id}</GradientText>\n </h1>\n <Badge\n variant={change.type === 'emergency' ? 'destructive' : 'outline'}\n className=\"capitalize\"\n >\n {change.type}\n </Badge>\n <Badge variant={riskColors[change.risk]}>Risk: {change.risk}</Badge>\n <Badge variant=\"outline\">{change.status.replace('_', ' ')}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{change.title}</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Reject\n </Button>\n <Button size=\"sm\">\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n Approve\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The full record of a single planned change: what is changing, its risk and schedule, which\n assets it touches, and where it stands in the approval chain. Use this page to approve,\n reject or track a change so it lands safely in its agreed window.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-change-detail\"\n steps={[\n {\n id: 'approve',\n label: 'Approve or reject this change',\n description: 'Sign off on the change once you have reviewed its risk.',\n done: change.status === 'approved' || change.status === 'completed',\n },\n {\n id: 'assets',\n label: 'Review affected assets',\n description: 'Confirm the blast radius before the change window.',\n onClick: () => navigate('/assets/asset-list'),\n },\n {\n id: 'calendar',\n label: 'Check the maintenance calendar',\n description: 'Make sure the schedule does not clash with other 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>Change 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\">{change.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\">Scheduled Start</span>\n <p className=\"font-medium\">{new Date(change.scheduledStart).toLocaleString()}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Scheduled End</span>\n <p className=\"font-medium\">{new Date(change.scheduledEnd).toLocaleString()}</p>\n </div>\n </div>\n <Separator />\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Affected Assets</h4>\n <div className=\"space-y-2\">\n {affectedAssetDetails.map((a) => (\n <div key={a.id} className=\"flex items-center justify-between rounded border p-2\">\n <div>\n <p className=\"text-sm font-medium\">{a.name}</p>\n <p className=\"text-xs text-text-secondary\">{a.assetTag}</p>\n </div>\n <Badge variant=\"outline\">{a.status.replace('_', ' ')}</Badge>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Properties</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Type</dt>\n <dd className=\"font-medium capitalize\">{change.type}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Risk</dt>\n <dd>\n <Badge variant={riskColors[change.risk]}>{change.risk}</Badge>\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd>\n <Badge variant=\"outline\">{change.status.replace('_', ' ')}</Badge>\n </dd>\n </div>\n <Separator />\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Requested By</dt>\n <dd className=\"text-xs\">{change.requestedBy}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Assigned To</dt>\n <dd className=\"text-xs\">{change.assignedTo}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-xs\">{new Date(change.createdAt).toLocaleDateString()}</dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Approvals</CardTitle>\n </CardHeader>\n <CardContent>\n {change.approvals.length === 0 ? (\n <p className=\"text-sm text-text-secondary text-center py-4\">No approvals yet</p>\n ) : (\n <div className=\"space-y-2\">\n {change.approvals.map((approval, i) => (\n <div key={i} className=\"flex items-center justify-between rounded border p-2\">\n <div className=\"flex items-center gap-2\">\n {approval.status === 'approved' ? (\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span className=\"text-sm\">{approval.name}</span>\n </div>\n <span className=\"text-xs text-text-secondary\">\n {new Date(approval.date).toLocaleDateString()}\n </span>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ItilChangeDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/ItilChangeDetailPage.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, XCircle } from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst riskColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n};\n\nexport function ItilChangeDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { changeId } = useParams<{ changeId: string }>();\n const { changeRequests, assets } = useAssetHandlerStore();\n const change = changeRequests.find((item) => item.id === changeId) ?? changeRequests[0];\n\n if (!change)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Change request not found\"\n description=\"This change may have been completed or removed. Return to change management to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/itil/change-management')}>\n Back to changes\n </Button>\n }\n />\n </div>\n );\n\n const affectedAssetDetails = assets.filter((a) => change.affectedAssets.includes(a.id));\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 variant=\"ghost\" size=\"icon\" onClick={() => navigate('/itil/change-management')}>\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>{change.id}</GradientText>\n </h1>\n <Badge\n variant={change.type === 'emergency' ? 'destructive' : 'outline'}\n className=\"capitalize\"\n >\n {change.type}\n </Badge>\n <Badge variant={riskColors[change.risk]}>Risk: {change.risk}</Badge>\n <Badge variant=\"outline\">{change.status.replace('_', ' ')}</Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">{change.title}</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n Reject\n </Button>\n <Button size=\"sm\">\n <CheckCircle className=\"mr-2 h-4 w-4\" />\n Approve\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The full record of a single planned change: what is changing, its risk and schedule, which\n assets it touches, and where it stands in the approval chain. Use this page to approve,\n reject or track a change so it lands safely in its agreed window.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-change-detail\"\n steps={[\n {\n id: 'approve',\n label: 'Approve or reject this change',\n description: 'Sign off on the change once you have reviewed its risk.',\n done: change.status === 'approved' || change.status === 'completed',\n },\n {\n id: 'assets',\n label: 'Review affected assets',\n description: 'Confirm the blast radius before the change window.',\n onClick: () => navigate('/assets/asset-list'),\n },\n {\n id: 'calendar',\n label: 'Check the maintenance calendar',\n description: 'Make sure the schedule does not clash with other 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>Change 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\">{change.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\">Scheduled Start</span>\n <p className=\"font-medium\">{new Date(change.scheduledStart).toLocaleString()}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Scheduled End</span>\n <p className=\"font-medium\">{new Date(change.scheduledEnd).toLocaleString()}</p>\n </div>\n </div>\n <Separator />\n <div>\n <h4 className=\"text-sm font-medium text-text-secondary mb-2\">Affected Assets</h4>\n <div className=\"space-y-2\">\n {affectedAssetDetails.map((a) => (\n <div key={a.id} className=\"flex items-center justify-between rounded border p-2\">\n <div>\n <p className=\"text-sm font-medium\">{a.name}</p>\n <p className=\"text-xs text-text-secondary\">{a.assetTag}</p>\n </div>\n <Badge variant=\"outline\">{a.status.replace('_', ' ')}</Badge>\n </div>\n ))}\n </div>\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Properties</CardTitle>\n </CardHeader>\n <CardContent>\n <dl className=\"space-y-3 text-sm\">\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Type</dt>\n <dd className=\"font-medium capitalize\">{change.type}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Risk</dt>\n <dd>\n <Badge variant={riskColors[change.risk]}>{change.risk}</Badge>\n </dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Status</dt>\n <dd>\n <Badge variant=\"outline\">{change.status.replace('_', ' ')}</Badge>\n </dd>\n </div>\n <Separator />\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Requested By</dt>\n <dd className=\"text-xs\">{change.requestedBy}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Assigned To</dt>\n <dd className=\"text-xs\">{change.assignedTo}</dd>\n </div>\n <div className=\"flex justify-between\">\n <dt className=\"text-text-secondary\">Created</dt>\n <dd className=\"text-xs\">{new Date(change.createdAt).toLocaleDateString()}</dd>\n </div>\n </dl>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Approvals</CardTitle>\n </CardHeader>\n <CardContent>\n {change.approvals.length === 0 ? (\n <p className=\"text-sm text-text-secondary text-center py-4\">No approvals yet</p>\n ) : (\n <div className=\"space-y-2\">\n {change.approvals.map((approval, i) => (\n <div key={i} className=\"flex items-center justify-between rounded border p-2\">\n <div className=\"flex items-center gap-2\">\n {approval.status === 'approved' ? (\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n ) : (\n <XCircle className=\"h-4 w-4 text-status-error-text\" />\n )}\n <span className=\"text-sm\">{approval.name}</span>\n </div>\n <span className=\"text-xs text-text-secondary\">\n {new Date(approval.date).toLocaleDateString()}\n </span>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
2
|
import { Plus as t } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { jsx as n, jsxs as r } from "react/jsx-runtime";
|
|
4
|
+
import { Badge as i, Button as a, Card as o, CardContent as s, EmphasisPanel as c, GradientText as l, IllustratedEmptyState as u, PagePurpose as d } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/assethandler/pages/ItilChangeManagementPage.tsx
|
|
6
6
|
var f = {
|
|
7
7
|
critical: "destructive",
|
|
@@ -11,159 +11,159 @@ var f = {
|
|
|
11
11
|
};
|
|
12
12
|
function p() {
|
|
13
13
|
let { changeRequests: p } = e();
|
|
14
|
-
return /* @__PURE__ */
|
|
14
|
+
return /* @__PURE__ */ r("div", {
|
|
15
15
|
className: "space-y-6 p-6",
|
|
16
16
|
children: [
|
|
17
|
-
/* @__PURE__ */
|
|
17
|
+
/* @__PURE__ */ r("div", {
|
|
18
18
|
className: "flex items-center justify-between",
|
|
19
|
-
children: [/* @__PURE__ */
|
|
19
|
+
children: [/* @__PURE__ */ r("div", { children: [/* @__PURE__ */ n("h1", {
|
|
20
20
|
className: "text-2xl font-bold",
|
|
21
|
-
children: /* @__PURE__ */
|
|
22
|
-
}), /* @__PURE__ */
|
|
21
|
+
children: /* @__PURE__ */ n(l, { children: "Change Management" })
|
|
22
|
+
}), /* @__PURE__ */ r("p", {
|
|
23
23
|
className: "text-sm text-text-secondary",
|
|
24
24
|
children: [p.length, " change requests"]
|
|
25
|
-
})] }), /* @__PURE__ */
|
|
25
|
+
})] }), /* @__PURE__ */ r(a, {
|
|
26
26
|
size: "sm",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
27
|
+
children: [/* @__PURE__ */ n(t, { className: "mr-2 h-4 w-4" }), "New Change Request"]
|
|
28
28
|
})]
|
|
29
29
|
}),
|
|
30
|
-
/* @__PURE__ */
|
|
31
|
-
/* @__PURE__ */
|
|
30
|
+
/* @__PURE__ */ n(d, { children: "Plan and govern every change to your assets and services so nothing breaks unexpectedly. Capture the change, assess its risk, route it for approval, and schedule it for a safe window — giving you a controlled, auditable trail of what changed, when and why." }),
|
|
31
|
+
/* @__PURE__ */ r("div", {
|
|
32
32
|
className: "grid gap-4 md:grid-cols-4",
|
|
33
33
|
children: [
|
|
34
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ r(c, { children: [/* @__PURE__ */ n("p", {
|
|
35
35
|
className: "text-sm text-text-secondary",
|
|
36
36
|
children: "Total"
|
|
37
|
-
}), /* @__PURE__ */
|
|
37
|
+
}), /* @__PURE__ */ n("p", {
|
|
38
38
|
className: "text-2xl font-bold tabular-nums",
|
|
39
39
|
children: p.length
|
|
40
40
|
})] }),
|
|
41
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ n(o, { children: /* @__PURE__ */ r(s, {
|
|
42
42
|
className: "pt-4",
|
|
43
|
-
children: [/* @__PURE__ */
|
|
43
|
+
children: [/* @__PURE__ */ n("p", {
|
|
44
44
|
className: "text-sm text-text-secondary",
|
|
45
45
|
children: "Approved"
|
|
46
|
-
}), /* @__PURE__ */
|
|
46
|
+
}), /* @__PURE__ */ n("p", {
|
|
47
47
|
className: "text-2xl font-bold text-status-success-text",
|
|
48
48
|
children: p.filter((e) => e.status === "approved").length
|
|
49
49
|
})]
|
|
50
50
|
}) }),
|
|
51
|
-
/* @__PURE__ */
|
|
51
|
+
/* @__PURE__ */ n(o, { children: /* @__PURE__ */ r(s, {
|
|
52
52
|
className: "pt-4",
|
|
53
|
-
children: [/* @__PURE__ */
|
|
53
|
+
children: [/* @__PURE__ */ n("p", {
|
|
54
54
|
className: "text-sm text-text-secondary",
|
|
55
55
|
children: "Submitted"
|
|
56
|
-
}), /* @__PURE__ */
|
|
56
|
+
}), /* @__PURE__ */ n("p", {
|
|
57
57
|
className: "text-2xl font-bold text-status-info-text",
|
|
58
58
|
children: p.filter((e) => e.status === "submitted").length
|
|
59
59
|
})]
|
|
60
60
|
}) }),
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ n(o, { children: /* @__PURE__ */ r(s, {
|
|
62
62
|
className: "pt-4",
|
|
63
|
-
children: [/* @__PURE__ */
|
|
63
|
+
children: [/* @__PURE__ */ n("p", {
|
|
64
64
|
className: "text-sm text-text-secondary",
|
|
65
65
|
children: "Completed"
|
|
66
|
-
}), /* @__PURE__ */
|
|
66
|
+
}), /* @__PURE__ */ n("p", {
|
|
67
67
|
className: "text-2xl font-bold tabular-nums",
|
|
68
68
|
children: p.filter((e) => e.status === "completed").length
|
|
69
69
|
})]
|
|
70
70
|
}) })
|
|
71
71
|
]
|
|
72
72
|
}),
|
|
73
|
-
p.length === 0 ? /* @__PURE__ */ u
|
|
73
|
+
p.length === 0 ? /* @__PURE__ */ n(u, {
|
|
74
74
|
illustration: "empty-generic",
|
|
75
75
|
title: "No change requests",
|
|
76
76
|
description: "Raise a change request to plan and risk-assess updates to your assets."
|
|
77
|
-
}) : /* @__PURE__ */
|
|
77
|
+
}) : /* @__PURE__ */ n(o, { children: /* @__PURE__ */ n(s, {
|
|
78
78
|
className: "p-0",
|
|
79
|
-
children: /* @__PURE__ */
|
|
79
|
+
children: /* @__PURE__ */ n("div", {
|
|
80
80
|
className: "overflow-x-auto",
|
|
81
|
-
children: /* @__PURE__ */
|
|
81
|
+
children: /* @__PURE__ */ r("table", {
|
|
82
82
|
className: "w-full text-sm",
|
|
83
|
-
children: [/* @__PURE__ */
|
|
83
|
+
children: [/* @__PURE__ */ n("thead", { children: /* @__PURE__ */ r("tr", {
|
|
84
84
|
className: "border-b bg-bg-sunken/50",
|
|
85
85
|
children: [
|
|
86
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ n("th", {
|
|
87
87
|
className: "text-left p-3 font-medium",
|
|
88
88
|
children: "ID"
|
|
89
89
|
}),
|
|
90
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ n("th", {
|
|
91
91
|
className: "text-left p-3 font-medium",
|
|
92
92
|
children: "Title"
|
|
93
93
|
}),
|
|
94
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ n("th", {
|
|
95
95
|
className: "text-left p-3 font-medium",
|
|
96
96
|
children: "Type"
|
|
97
97
|
}),
|
|
98
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ n("th", {
|
|
99
99
|
className: "text-left p-3 font-medium",
|
|
100
100
|
children: "Risk"
|
|
101
101
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ n("th", {
|
|
103
103
|
className: "text-left p-3 font-medium",
|
|
104
104
|
children: "Status"
|
|
105
105
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ n("th", {
|
|
107
107
|
className: "text-left p-3 font-medium",
|
|
108
108
|
children: "Requested By"
|
|
109
109
|
}),
|
|
110
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ n("th", {
|
|
111
111
|
className: "text-left p-3 font-medium",
|
|
112
112
|
children: "Scheduled"
|
|
113
113
|
}),
|
|
114
|
-
/* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ n("th", {
|
|
115
115
|
className: "text-left p-3 font-medium",
|
|
116
116
|
children: "Approvals"
|
|
117
117
|
})
|
|
118
118
|
]
|
|
119
|
-
}) }), /* @__PURE__ */
|
|
119
|
+
}) }), /* @__PURE__ */ n("tbody", { children: p.map((e) => /* @__PURE__ */ r("tr", {
|
|
120
120
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
121
121
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
122
|
+
/* @__PURE__ */ n("td", {
|
|
123
123
|
className: "p-3 font-mono text-xs",
|
|
124
124
|
children: e.id
|
|
125
125
|
}),
|
|
126
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ r("td", {
|
|
127
127
|
className: "p-3",
|
|
128
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ n("p", {
|
|
129
129
|
className: "font-medium",
|
|
130
130
|
children: e.title
|
|
131
|
-
}), /* @__PURE__ */
|
|
131
|
+
}), /* @__PURE__ */ n("p", {
|
|
132
132
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
133
133
|
children: e.description
|
|
134
134
|
})]
|
|
135
135
|
}),
|
|
136
|
-
/* @__PURE__ */
|
|
136
|
+
/* @__PURE__ */ n("td", {
|
|
137
137
|
className: "p-3",
|
|
138
|
-
children: /* @__PURE__ */
|
|
138
|
+
children: /* @__PURE__ */ n(i, {
|
|
139
139
|
variant: e.type === "emergency" ? "destructive" : "outline",
|
|
140
140
|
className: "capitalize",
|
|
141
141
|
children: e.type
|
|
142
142
|
})
|
|
143
143
|
}),
|
|
144
|
-
/* @__PURE__ */
|
|
144
|
+
/* @__PURE__ */ n("td", {
|
|
145
145
|
className: "p-3",
|
|
146
|
-
children: /* @__PURE__ */
|
|
146
|
+
children: /* @__PURE__ */ n(i, {
|
|
147
147
|
variant: f[e.risk],
|
|
148
148
|
children: e.risk
|
|
149
149
|
})
|
|
150
150
|
}),
|
|
151
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ n("td", {
|
|
152
152
|
className: "p-3",
|
|
153
|
-
children: /* @__PURE__ */
|
|
153
|
+
children: /* @__PURE__ */ n(i, {
|
|
154
154
|
variant: "outline",
|
|
155
155
|
children: e.status.replace("_", " ")
|
|
156
156
|
})
|
|
157
157
|
}),
|
|
158
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ n("td", {
|
|
159
159
|
className: "p-3 text-xs",
|
|
160
160
|
children: e.requestedBy
|
|
161
161
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
162
|
+
/* @__PURE__ */ n("td", {
|
|
163
163
|
className: "p-3 text-xs",
|
|
164
164
|
children: new Date(e.scheduledStart).toLocaleDateString()
|
|
165
165
|
}),
|
|
166
|
-
/* @__PURE__ */
|
|
166
|
+
/* @__PURE__ */ n("td", {
|
|
167
167
|
className: "p-3 text-xs",
|
|
168
168
|
children: e.approvals.length > 0 ? e.approvals.map((e) => e.status).join(", ") : "Pending"
|
|
169
169
|
})
|