@burdenoff/microfe-assethandler 2026.625.1 → 2026.625.2
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/pages/AiPredictionsPage.js +42 -41
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +538 -534
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/AuditTrailPage.js +93 -91
- package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
- package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
- package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +157 -126
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +34 -35
- package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +56 -53
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
- package/dist/assethandler/pages/SamLicensesPage.js +32 -33
- package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/pages/UsersPage.js +108 -99
- package/dist/assethandler/pages/UsersPage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,184 +1,210 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
2
|
import { AlertTriangle as t, ClipboardList as n, Plus as r, Wrench as i } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { useNavigate as a } from "react-router-dom";
|
|
4
|
+
import { Badge as o, Button as s, Card as c, CardContent as l, EmphasisPanel as u, GradientText as d, IllustratedEmptyState as f, NextSteps as p, PagePurpose as m, Tabs as h, TabsContent as g, TabsList as _, TabsTrigger as v } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
5
6
|
//#region src/assethandler/pages/OperationsOperationsHubPage.tsx
|
|
6
|
-
var
|
|
7
|
+
var x = {
|
|
7
8
|
critical: "destructive",
|
|
8
9
|
high: "destructive",
|
|
9
10
|
medium: "default",
|
|
10
11
|
low: "secondary"
|
|
11
12
|
};
|
|
12
|
-
function
|
|
13
|
-
let { workOrders:
|
|
14
|
-
return /* @__PURE__ */
|
|
13
|
+
function S() {
|
|
14
|
+
let S = a(), { workOrders: C, maintenanceRecords: w } = e(), T = C.filter((e) => e.status === "open" || e.status === "in_progress"), E = w.filter((e) => e.status === "scheduled" || e.status === "in_progress"), D = C.reduce((e, t) => e + t.cost, 0) + w.reduce((e, t) => e + t.cost, 0);
|
|
15
|
+
return /* @__PURE__ */ b("div", {
|
|
15
16
|
className: "space-y-6 p-6",
|
|
16
17
|
children: [
|
|
17
|
-
/* @__PURE__ */
|
|
18
|
+
/* @__PURE__ */ b("div", {
|
|
18
19
|
className: "flex items-center justify-between",
|
|
19
|
-
children: [/* @__PURE__ */
|
|
20
|
+
children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
|
|
20
21
|
className: "text-2xl font-bold",
|
|
21
|
-
children: /* @__PURE__ */
|
|
22
|
-
}), /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ y(d, { children: "Operations Hub" })
|
|
23
|
+
}), /* @__PURE__ */ y("p", {
|
|
23
24
|
className: "text-sm text-text-secondary",
|
|
24
25
|
children: "Work orders and maintenance operations"
|
|
25
|
-
})] }), /* @__PURE__ */
|
|
26
|
+
})] }), /* @__PURE__ */ b(s, {
|
|
26
27
|
size: "sm",
|
|
27
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ y(r, { className: "mr-2 h-4 w-4" }), "New Work Order"]
|
|
28
29
|
})]
|
|
29
30
|
}),
|
|
30
|
-
/* @__PURE__ */
|
|
31
|
+
/* @__PURE__ */ y(m, { children: "Where the hands-on work gets coordinated: raise and assign work orders, run scheduled and breakdown maintenance, and keep an eye on cost. Use this hub to see what is open, what is critical, and what is due — so your team always knows what to fix next." }),
|
|
32
|
+
/* @__PURE__ */ y(p, {
|
|
33
|
+
storageKey: "assethandler-operations-hub",
|
|
34
|
+
steps: [
|
|
35
|
+
{
|
|
36
|
+
id: "scheduler",
|
|
37
|
+
label: "Plan preventive maintenance",
|
|
38
|
+
description: "Schedule upcoming maintenance before assets fail.",
|
|
39
|
+
onClick: () => S("/maintenance/maintenance-scheduler")
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "calendar",
|
|
43
|
+
label: "View the maintenance calendar",
|
|
44
|
+
description: "Spot clashes and overdue jobs at a glance.",
|
|
45
|
+
onClick: () => S("/maintenance/maintenance-calendar")
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "assets",
|
|
49
|
+
label: "Open the asset inventory",
|
|
50
|
+
description: "Jump to an asset to log a work order against it.",
|
|
51
|
+
onClick: () => S("/assets/asset-list")
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ b("div", {
|
|
31
56
|
className: "grid gap-4 md:grid-cols-4",
|
|
32
57
|
children: [
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
className: "
|
|
35
|
-
children: [/* @__PURE__ */
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
})]
|
|
42
|
-
}) }),
|
|
43
|
-
/* @__PURE__ */ m(s, { children: /* @__PURE__ */ h(c, {
|
|
58
|
+
/* @__PURE__ */ b(u, { children: [/* @__PURE__ */ b("div", {
|
|
59
|
+
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
60
|
+
children: [/* @__PURE__ */ y(n, { className: "h-4 w-4" }), "Open Work Orders"]
|
|
61
|
+
}), /* @__PURE__ */ y("p", {
|
|
62
|
+
className: "text-2xl font-bold mt-1 tabular-nums",
|
|
63
|
+
children: T.length
|
|
64
|
+
})] }),
|
|
65
|
+
/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
44
66
|
className: "pt-4",
|
|
45
|
-
children: [/* @__PURE__ */
|
|
67
|
+
children: [/* @__PURE__ */ b("div", {
|
|
46
68
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
47
|
-
children: [/* @__PURE__ */
|
|
48
|
-
}), /* @__PURE__ */
|
|
69
|
+
children: [/* @__PURE__ */ y(i, { className: "h-4 w-4" }), "Active Maintenance"]
|
|
70
|
+
}), /* @__PURE__ */ y("p", {
|
|
49
71
|
className: "text-2xl font-bold mt-1",
|
|
50
|
-
children:
|
|
72
|
+
children: E.length
|
|
51
73
|
})]
|
|
52
74
|
}) }),
|
|
53
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
54
76
|
className: "pt-4",
|
|
55
|
-
children: [/* @__PURE__ */
|
|
77
|
+
children: [/* @__PURE__ */ b("div", {
|
|
56
78
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
57
|
-
children: [/* @__PURE__ */
|
|
58
|
-
}), /* @__PURE__ */
|
|
79
|
+
children: [/* @__PURE__ */ y(t, { className: "h-4 w-4" }), "Critical"]
|
|
80
|
+
}), /* @__PURE__ */ y("p", {
|
|
59
81
|
className: "text-2xl font-bold mt-1 text-status-error-text",
|
|
60
|
-
children:
|
|
82
|
+
children: C.filter((e) => e.priority === "critical").length
|
|
61
83
|
})]
|
|
62
84
|
}) }),
|
|
63
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
|
|
64
86
|
className: "pt-4",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
87
|
+
children: [/* @__PURE__ */ y("div", {
|
|
66
88
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
67
89
|
children: "Total Cost"
|
|
68
|
-
}), /* @__PURE__ */
|
|
90
|
+
}), /* @__PURE__ */ b("p", {
|
|
69
91
|
className: "text-2xl font-bold mt-1",
|
|
70
|
-
children: ["$",
|
|
92
|
+
children: ["$", D.toLocaleString()]
|
|
71
93
|
})]
|
|
72
94
|
}) })
|
|
73
95
|
]
|
|
74
96
|
}),
|
|
75
|
-
/* @__PURE__ */ h
|
|
97
|
+
/* @__PURE__ */ b(h, {
|
|
76
98
|
defaultValue: "work-orders",
|
|
77
99
|
children: [
|
|
78
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ b(_, { children: [/* @__PURE__ */ b(v, {
|
|
79
101
|
value: "work-orders",
|
|
80
102
|
children: [
|
|
81
103
|
"Work Orders (",
|
|
82
|
-
|
|
104
|
+
C.length,
|
|
83
105
|
")"
|
|
84
106
|
]
|
|
85
|
-
}), /* @__PURE__ */
|
|
107
|
+
}), /* @__PURE__ */ b(v, {
|
|
86
108
|
value: "maintenance",
|
|
87
109
|
children: [
|
|
88
110
|
"Maintenance (",
|
|
89
|
-
|
|
111
|
+
w.length,
|
|
90
112
|
")"
|
|
91
113
|
]
|
|
92
114
|
})] }),
|
|
93
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ y(g, {
|
|
94
116
|
value: "work-orders",
|
|
95
117
|
className: "mt-4",
|
|
96
|
-
children:
|
|
118
|
+
children: C.length === 0 ? /* @__PURE__ */ y(f, {
|
|
119
|
+
illustration: "empty-generic",
|
|
120
|
+
title: "No work orders",
|
|
121
|
+
description: "Raise a work order when an asset needs repair, inspection or attention."
|
|
122
|
+
}) : /* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, {
|
|
97
123
|
className: "p-0",
|
|
98
|
-
children: /* @__PURE__ */
|
|
124
|
+
children: /* @__PURE__ */ y("div", {
|
|
99
125
|
className: "overflow-x-auto",
|
|
100
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ b("table", {
|
|
101
127
|
className: "w-full text-sm",
|
|
102
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ y("thead", { children: /* @__PURE__ */ b("tr", {
|
|
103
129
|
className: "border-b bg-bg-sunken/50",
|
|
104
130
|
children: [
|
|
105
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ y("th", {
|
|
106
132
|
className: "text-left p-3 font-medium",
|
|
107
133
|
children: "ID"
|
|
108
134
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ y("th", {
|
|
110
136
|
className: "text-left p-3 font-medium",
|
|
111
137
|
children: "Title"
|
|
112
138
|
}),
|
|
113
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ y("th", {
|
|
114
140
|
className: "text-left p-3 font-medium",
|
|
115
141
|
children: "Asset"
|
|
116
142
|
}),
|
|
117
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ y("th", {
|
|
118
144
|
className: "text-left p-3 font-medium",
|
|
119
145
|
children: "Priority"
|
|
120
146
|
}),
|
|
121
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ y("th", {
|
|
122
148
|
className: "text-left p-3 font-medium",
|
|
123
149
|
children: "Status"
|
|
124
150
|
}),
|
|
125
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ y("th", {
|
|
126
152
|
className: "text-left p-3 font-medium",
|
|
127
153
|
children: "Assigned To"
|
|
128
154
|
}),
|
|
129
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ y("th", {
|
|
130
156
|
className: "text-left p-3 font-medium",
|
|
131
157
|
children: "Due"
|
|
132
158
|
}),
|
|
133
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ y("th", {
|
|
134
160
|
className: "text-right p-3 font-medium",
|
|
135
161
|
children: "Cost"
|
|
136
162
|
})
|
|
137
163
|
]
|
|
138
|
-
}) }), /* @__PURE__ */
|
|
164
|
+
}) }), /* @__PURE__ */ y("tbody", { children: C.map((e) => /* @__PURE__ */ b("tr", {
|
|
139
165
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
140
166
|
children: [
|
|
141
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ y("td", {
|
|
142
168
|
className: "p-3 font-mono text-xs",
|
|
143
169
|
children: e.id
|
|
144
170
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ b("td", {
|
|
146
172
|
className: "p-3",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ y("p", {
|
|
148
174
|
className: "font-medium",
|
|
149
175
|
children: e.title
|
|
150
|
-
}), /* @__PURE__ */
|
|
176
|
+
}), /* @__PURE__ */ y("p", {
|
|
151
177
|
className: "text-xs text-text-secondary truncate max-w-xs",
|
|
152
178
|
children: e.description
|
|
153
179
|
})]
|
|
154
180
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
181
|
+
/* @__PURE__ */ y("td", {
|
|
156
182
|
className: "p-3 text-xs",
|
|
157
183
|
children: e.relatedAssetName
|
|
158
184
|
}),
|
|
159
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ y("td", {
|
|
160
186
|
className: "p-3",
|
|
161
|
-
children: /* @__PURE__ */
|
|
162
|
-
variant:
|
|
187
|
+
children: /* @__PURE__ */ y(o, {
|
|
188
|
+
variant: x[e.priority],
|
|
163
189
|
children: e.priority
|
|
164
190
|
})
|
|
165
191
|
}),
|
|
166
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ y("td", {
|
|
167
193
|
className: "p-3",
|
|
168
|
-
children: /* @__PURE__ */
|
|
194
|
+
children: /* @__PURE__ */ y(o, {
|
|
169
195
|
variant: "outline",
|
|
170
196
|
children: e.status.replace("_", " ")
|
|
171
197
|
})
|
|
172
198
|
}),
|
|
173
|
-
/* @__PURE__ */
|
|
199
|
+
/* @__PURE__ */ y("td", {
|
|
174
200
|
className: "p-3 text-xs",
|
|
175
201
|
children: e.assignedTo
|
|
176
202
|
}),
|
|
177
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ y("td", {
|
|
178
204
|
className: "p-3 text-xs",
|
|
179
205
|
children: e.dueDate
|
|
180
206
|
}),
|
|
181
|
-
/* @__PURE__ */
|
|
207
|
+
/* @__PURE__ */ b("td", {
|
|
182
208
|
className: "p-3 text-right font-medium",
|
|
183
209
|
children: ["$", e.cost.toLocaleString()]
|
|
184
210
|
})
|
|
@@ -188,89 +214,93 @@ function _() {
|
|
|
188
214
|
})
|
|
189
215
|
}) })
|
|
190
216
|
}),
|
|
191
|
-
/* @__PURE__ */
|
|
217
|
+
/* @__PURE__ */ y(g, {
|
|
192
218
|
value: "maintenance",
|
|
193
219
|
className: "mt-4",
|
|
194
|
-
children:
|
|
220
|
+
children: w.length === 0 ? /* @__PURE__ */ y(f, {
|
|
221
|
+
illustration: "empty-generic",
|
|
222
|
+
title: "No maintenance scheduled",
|
|
223
|
+
description: "Scheduled and completed maintenance for your assets will appear here."
|
|
224
|
+
}) : /* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, {
|
|
195
225
|
className: "p-0",
|
|
196
|
-
children: /* @__PURE__ */
|
|
226
|
+
children: /* @__PURE__ */ y("div", {
|
|
197
227
|
className: "overflow-x-auto",
|
|
198
|
-
children: /* @__PURE__ */
|
|
228
|
+
children: /* @__PURE__ */ b("table", {
|
|
199
229
|
className: "w-full text-sm",
|
|
200
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ y("thead", { children: /* @__PURE__ */ b("tr", {
|
|
201
231
|
className: "border-b bg-bg-sunken/50",
|
|
202
232
|
children: [
|
|
203
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ y("th", {
|
|
204
234
|
className: "text-left p-3 font-medium",
|
|
205
235
|
children: "ID"
|
|
206
236
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ y("th", {
|
|
208
238
|
className: "text-left p-3 font-medium",
|
|
209
239
|
children: "Title"
|
|
210
240
|
}),
|
|
211
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ y("th", {
|
|
212
242
|
className: "text-left p-3 font-medium",
|
|
213
243
|
children: "Asset"
|
|
214
244
|
}),
|
|
215
|
-
/* @__PURE__ */
|
|
245
|
+
/* @__PURE__ */ y("th", {
|
|
216
246
|
className: "text-left p-3 font-medium",
|
|
217
247
|
children: "Type"
|
|
218
248
|
}),
|
|
219
|
-
/* @__PURE__ */
|
|
249
|
+
/* @__PURE__ */ y("th", {
|
|
220
250
|
className: "text-left p-3 font-medium",
|
|
221
251
|
children: "Priority"
|
|
222
252
|
}),
|
|
223
|
-
/* @__PURE__ */
|
|
253
|
+
/* @__PURE__ */ y("th", {
|
|
224
254
|
className: "text-left p-3 font-medium",
|
|
225
255
|
children: "Status"
|
|
226
256
|
}),
|
|
227
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ y("th", {
|
|
228
258
|
className: "text-left p-3 font-medium",
|
|
229
259
|
children: "Date"
|
|
230
260
|
}),
|
|
231
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ y("th", {
|
|
232
262
|
className: "text-right p-3 font-medium",
|
|
233
263
|
children: "Cost"
|
|
234
264
|
})
|
|
235
265
|
]
|
|
236
|
-
}) }), /* @__PURE__ */
|
|
266
|
+
}) }), /* @__PURE__ */ y("tbody", { children: w.map((e) => /* @__PURE__ */ b("tr", {
|
|
237
267
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
238
268
|
children: [
|
|
239
|
-
/* @__PURE__ */
|
|
269
|
+
/* @__PURE__ */ y("td", {
|
|
240
270
|
className: "p-3 font-mono text-xs",
|
|
241
271
|
children: e.id
|
|
242
272
|
}),
|
|
243
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ y("td", {
|
|
244
274
|
className: "p-3 font-medium",
|
|
245
275
|
children: e.title
|
|
246
276
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
277
|
+
/* @__PURE__ */ y("td", {
|
|
248
278
|
className: "p-3 text-xs",
|
|
249
279
|
children: e.assetName
|
|
250
280
|
}),
|
|
251
|
-
/* @__PURE__ */
|
|
281
|
+
/* @__PURE__ */ y("td", {
|
|
252
282
|
className: "p-3 capitalize text-xs",
|
|
253
283
|
children: e.type
|
|
254
284
|
}),
|
|
255
|
-
/* @__PURE__ */
|
|
285
|
+
/* @__PURE__ */ y("td", {
|
|
256
286
|
className: "p-3",
|
|
257
|
-
children: /* @__PURE__ */
|
|
258
|
-
variant:
|
|
287
|
+
children: /* @__PURE__ */ y(o, {
|
|
288
|
+
variant: x[e.priority],
|
|
259
289
|
children: e.priority
|
|
260
290
|
})
|
|
261
291
|
}),
|
|
262
|
-
/* @__PURE__ */
|
|
292
|
+
/* @__PURE__ */ y("td", {
|
|
263
293
|
className: "p-3",
|
|
264
|
-
children: /* @__PURE__ */
|
|
294
|
+
children: /* @__PURE__ */ y(o, {
|
|
265
295
|
variant: e.status === "completed" ? "default" : "outline",
|
|
266
296
|
children: e.status.replace("_", " ")
|
|
267
297
|
})
|
|
268
298
|
}),
|
|
269
|
-
/* @__PURE__ */
|
|
299
|
+
/* @__PURE__ */ y("td", {
|
|
270
300
|
className: "p-3 text-xs",
|
|
271
301
|
children: e.scheduledDate
|
|
272
302
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
303
|
+
/* @__PURE__ */ b("td", {
|
|
274
304
|
className: "p-3 text-right font-medium",
|
|
275
305
|
children: ["$", e.cost]
|
|
276
306
|
})
|
|
@@ -286,6 +316,6 @@ function _() {
|
|
|
286
316
|
});
|
|
287
317
|
}
|
|
288
318
|
//#endregion
|
|
289
|
-
export {
|
|
319
|
+
export { S as OperationsOperationsHubPage };
|
|
290
320
|
|
|
291
321
|
//# sourceMappingURL=OperationsOperationsHubPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationsOperationsHubPage.js","names":[],"sources":["../../../src/assethandler/pages/OperationsOperationsHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Wrench, ClipboardList, AlertTriangle, CheckCircle, Clock, Plus } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst priorityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n};\n\nexport function OperationsOperationsHubPage() {\n const { workOrders, maintenanceRecords } = useAssetHandlerStore();\n\n const openWorkOrders = workOrders.filter(\n (w) => w.status === 'open' || w.status === 'in_progress'\n );\n const scheduledMaintenance = maintenanceRecords.filter(\n (m) => m.status === 'scheduled' || m.status === 'in_progress'\n );\n const totalCost =\n workOrders.reduce((s, w) => s + w.cost, 0) + maintenanceRecords.reduce((s, m) => s + m.cost, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Operations Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Work orders and maintenance operations</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n New Work Order\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <ClipboardList className=\"h-4 w-4\" />\n Open Work Orders\n </div>\n <p className=\"text-2xl font-bold mt-1\">{openWorkOrders.length}</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 <Wrench className=\"h-4 w-4\" />\n Active Maintenance\n </div>\n <p className=\"text-2xl font-bold mt-1\">{scheduledMaintenance.length}</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 <AlertTriangle className=\"h-4 w-4\" />\n Critical\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {workOrders.filter((w) => w.priority === 'critical').length}\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\">Total Cost</div>\n <p className=\"text-2xl font-bold mt-1\">${totalCost.toLocaleString()}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"work-orders\">\n <TabsList>\n <TabsTrigger value=\"work-orders\">Work Orders ({workOrders.length})</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance ({maintenanceRecords.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"work-orders\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Priority</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Assigned To</th>\n <th className=\"text-left p-3 font-medium\">Due</th>\n <th className=\"text-right p-3 font-medium\">Cost</th>\n </tr>\n </thead>\n <tbody>\n {workOrders.map((wo) => (\n <tr key={wo.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{wo.id}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{wo.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {wo.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{wo.relatedAssetName}</td>\n <td className=\"p-3\">\n <Badge variant={priorityColors[wo.priority]}>{wo.priority}</Badge>\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{wo.status.replace('_', ' ')}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{wo.assignedTo}</td>\n <td className=\"p-3 text-xs\">{wo.dueDate}</td>\n <td className=\"p-3 text-right font-medium\">${wo.cost.toLocaleString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Priority</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n <th className=\"text-right p-3 font-medium\">Cost</th>\n </tr>\n </thead>\n <tbody>\n {maintenanceRecords.map((m) => (\n <tr key={m.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{m.id}</td>\n <td className=\"p-3 font-medium\">{m.title}</td>\n <td className=\"p-3 text-xs\">{m.assetName}</td>\n <td className=\"p-3 capitalize text-xs\">{m.type}</td>\n <td className=\"p-3\">\n <Badge variant={priorityColors[m.priority]}>{m.priority}</Badge>\n </td>\n <td className=\"p-3\">\n <Badge variant={m.status === 'completed' ? 'default' : 'outline'}>\n {m.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{m.scheduledDate}</td>\n <td className=\"p-3 text-right font-medium\">${m.cost}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":";;;;;AAiBA,IAAM,IAAsF;CAC1F,UAAU;CACV,MAAM;CACN,QAAQ;CACR,KAAK;CACN;AAED,SAAgB,IAA8B;CAC5C,IAAM,EAAE,eAAY,0BAAuB,GAAsB,EAE3D,IAAiB,EAAW,QAC/B,MAAM,EAAE,WAAW,UAAU,EAAE,WAAW,cAC5C,EACK,IAAuB,EAAmB,QAC7C,MAAM,EAAE,WAAW,eAAe,EAAE,WAAW,cACjD,EACK,IACJ,EAAW,QAAQ,GAAG,MAAM,IAAI,EAAE,MAAM,EAAE,GAAG,EAAmB,QAAQ,GAAG,MAAM,IAAI,EAAE,MAAM,EAAE;AAEjG,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;KACxC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAA0C,CAAA,CACjF,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;eAAb,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,iBAE1B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,mBAEjC;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAe;OAAW,CAAA,CACtD;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA,EAAA,qBAE1B;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA2B,EAAqB;OAAW,CAAA,CAC5D;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EAAA,WAEjC;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAW,QAAQ,MAAM,EAAE,aAAa,WAAW,CAAC;OACnD,CAAA,CACQ;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAsD;OAAgB,CAAA,EACrF,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAAuC,KAAE,EAAU,gBAAgB,CAAK;SAC5D;SACT,CAAA;KACH;;GAEN,kBAAC,GAAD;IAAM,cAAa;cAAnB;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAAiC;OAAc,EAAW;OAAO;OAAe;SAChF,kBAAC,GAAD;MAAa,OAAM;gBAAnB;OAAiC;OAAc,EAAmB;OAAO;OAAe;QAC/E,EAAA,CAAA;KAEX,kBAAC,GAAD;MAAa,OAAM;MAAc,WAAU;gBACzC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAO,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAa,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAgB,CAAA;WAC1D,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAQ,CAAA;WAClD,kBAAC,MAAD;YAAI,WAAU;sBAA6B;YAAS,CAAA;WACjD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAW,KAAK,MACf,kBAAC,MAAD;UAAgB,WAAU;oBAA1B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAG;YAAQ,CAAA;WAClD,kBAAC,MAAD;YAAI,WAAU;sBAAd,CACE,kBAAC,KAAD;aAAG,WAAU;uBAAe,EAAG;aAAU,CAAA,EACzC,kBAAC,KAAD;aAAG,WAAU;uBACV,EAAG;aACF,CAAA,CACD;;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAG;YAAsB,CAAA;WACtD,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAS,EAAe,EAAG;uBAAY,EAAG;aAAiB,CAAA;YAC/D,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAQ;uBAAW,EAAG,OAAO,QAAQ,KAAK,IAAI;aAAS,CAAA;YAC3D,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAG;YAAgB,CAAA;WAChD,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAG;YAAa,CAAA;WAC7C,kBAAC,MAAD;YAAI,WAAU;sBAAd,CAA2C,KAAE,EAAG,KAAK,gBAAgB,CAAM;;WACxE;YAlBI,EAAG,GAkBP,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MACK,CAAA;KAEd,kBAAC,GAAD;MAAa,OAAM;MAAc,WAAU;gBACzC,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAO,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAa,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA6B;YAAS,CAAA;WACjD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAmB,KAAK,MACvB,kBAAC,MAAD;UAAe,WAAU;oBAAzB;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAE;YAAQ,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAAmB,EAAE;YAAW,CAAA;WAC9C,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAE;YAAe,CAAA;WAC9C,kBAAC,MAAD;YAAI,WAAU;sBAA0B,EAAE;YAAU,CAAA;WACpD,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAS,EAAe,EAAE;uBAAY,EAAE;aAAiB,CAAA;YAC7D,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAS,EAAE,WAAW,cAAc,YAAY;uBACpD,EAAE,OAAO,QAAQ,KAAK,IAAI;aACrB,CAAA;YACL,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAE;YAAmB,CAAA;WAClD,kBAAC,MAAD;YAAI,WAAU;sBAAd,CAA2C,KAAE,EAAE,KAAU;;WACtD;YAfI,EAAE,GAeN,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MACK,CAAA;KACT;;GACH"}
|
|
1
|
+
{"version":3,"file":"OperationsOperationsHubPage.js","names":[],"sources":["../../../src/assethandler/pages/OperationsOperationsHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\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 { Wrench, ClipboardList, AlertTriangle, Plus } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst priorityColors: Record<string, 'destructive' | 'default' | 'secondary' | 'outline'> = {\n critical: 'destructive',\n high: 'destructive',\n medium: 'default',\n low: 'secondary',\n};\n\nexport function OperationsOperationsHubPage() {\n const navigate = useNavigate();\n const { workOrders, maintenanceRecords } = useAssetHandlerStore();\n\n const openWorkOrders = workOrders.filter(\n (w) => w.status === 'open' || w.status === 'in_progress'\n );\n const scheduledMaintenance = maintenanceRecords.filter(\n (m) => m.status === 'scheduled' || m.status === 'in_progress'\n );\n const totalCost =\n workOrders.reduce((s, w) => s + w.cost, 0) + maintenanceRecords.reduce((s, m) => s + m.cost, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Operations Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Work orders and maintenance operations</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n New Work Order\n </Button>\n </div>\n\n <PagePurpose>\n Where the hands-on work gets coordinated: raise and assign work orders, run scheduled and\n breakdown maintenance, and keep an eye on cost. Use this hub to see what is open, what is\n critical, and what is due — so your team always knows what to fix next.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-operations-hub\"\n steps={[\n {\n id: 'scheduler',\n label: 'Plan preventive maintenance',\n description: 'Schedule upcoming maintenance before assets fail.',\n onClick: () => navigate('/maintenance/maintenance-scheduler'),\n },\n {\n id: 'calendar',\n label: 'View the maintenance calendar',\n description: 'Spot clashes and overdue jobs at a glance.',\n onClick: () => navigate('/maintenance/maintenance-calendar'),\n },\n {\n id: 'assets',\n label: 'Open the asset inventory',\n description: 'Jump to an asset to log a work order against it.',\n onClick: () => navigate('/assets/asset-list'),\n },\n ]}\n />\n\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 <ClipboardList className=\"h-4 w-4\" />\n Open Work Orders\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{openWorkOrders.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Wrench className=\"h-4 w-4\" />\n Active Maintenance\n </div>\n <p className=\"text-2xl font-bold mt-1\">{scheduledMaintenance.length}</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 <AlertTriangle className=\"h-4 w-4\" />\n Critical\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">\n {workOrders.filter((w) => w.priority === 'critical').length}\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\">Total Cost</div>\n <p className=\"text-2xl font-bold mt-1\">${totalCost.toLocaleString()}</p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"work-orders\">\n <TabsList>\n <TabsTrigger value=\"work-orders\">Work Orders ({workOrders.length})</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance ({maintenanceRecords.length})</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"work-orders\" className=\"mt-4\">\n {workOrders.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No work orders\"\n description=\"Raise a work order when an asset needs repair, inspection or attention.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Priority</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Assigned To</th>\n <th className=\"text-left p-3 font-medium\">Due</th>\n <th className=\"text-right p-3 font-medium\">Cost</th>\n </tr>\n </thead>\n <tbody>\n {workOrders.map((wo) => (\n <tr key={wo.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{wo.id}</td>\n <td className=\"p-3\">\n <p className=\"font-medium\">{wo.title}</p>\n <p className=\"text-xs text-text-secondary truncate max-w-xs\">\n {wo.description}\n </p>\n </td>\n <td className=\"p-3 text-xs\">{wo.relatedAssetName}</td>\n <td className=\"p-3\">\n <Badge variant={priorityColors[wo.priority]}>{wo.priority}</Badge>\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{wo.status.replace('_', ' ')}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{wo.assignedTo}</td>\n <td className=\"p-3 text-xs\">{wo.dueDate}</td>\n <td className=\"p-3 text-right font-medium\">${wo.cost.toLocaleString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4\">\n {maintenanceRecords.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No maintenance scheduled\"\n description=\"Scheduled and completed maintenance for your assets will appear here.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Title</th>\n <th className=\"text-left p-3 font-medium\">Asset</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Priority</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n <th className=\"text-right p-3 font-medium\">Cost</th>\n </tr>\n </thead>\n <tbody>\n {maintenanceRecords.map((m) => (\n <tr key={m.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{m.id}</td>\n <td className=\"p-3 font-medium\">{m.title}</td>\n <td className=\"p-3 text-xs\">{m.assetName}</td>\n <td className=\"p-3 capitalize text-xs\">{m.type}</td>\n <td className=\"p-3\">\n <Badge variant={priorityColors[m.priority]}>{m.priority}</Badge>\n </td>\n <td className=\"p-3\">\n <Badge variant={m.status === 'completed' ? 'default' : 'outline'}>\n {m.status.replace('_', ' ')}\n </Badge>\n </td>\n <td className=\"p-3 text-xs\">{m.scheduledDate}</td>\n <td className=\"p-3 text-right font-medium\">${m.cost}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|