@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.
Files changed (113) hide show
  1. package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
  2. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  3. package/dist/assethandler/pages/AnalyticsPage.js +538 -534
  4. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  5. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
  14. package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
  16. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  17. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
  18. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  19. package/dist/assethandler/pages/AuditTrailPage.js +93 -91
  20. package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
  21. package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
  22. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  23. package/dist/assethandler/pages/DashboardPage.js +157 -126
  24. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  25. package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
  26. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  27. package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
  28. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  29. package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
  30. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  31. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
  32. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
  34. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  35. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
  36. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  37. package/dist/assethandler/pages/IotDevicesPage.js +34 -35
  38. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
  40. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  41. package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
  42. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  43. package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
  44. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
  46. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  47. package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
  48. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  49. package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
  50. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  51. package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
  52. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  53. package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
  54. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  55. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
  56. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  57. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
  58. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  59. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
  60. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
  61. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
  62. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
  63. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
  64. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
  65. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
  66. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
  67. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
  68. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  69. package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
  70. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  71. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
  72. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  73. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
  74. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  75. package/dist/assethandler/pages/ProvenancePage.js +56 -53
  76. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  77. package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
  78. package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
  79. package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
  80. package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
  81. package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
  82. package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
  83. package/dist/assethandler/pages/SamLicensesPage.js +32 -33
  84. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  85. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
  86. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  87. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
  88. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  89. package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
  90. package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
  91. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
  92. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  93. package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
  94. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  95. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
  96. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  97. package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
  98. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  99. package/dist/assethandler/pages/UsersPage.js +108 -99
  100. package/dist/assethandler/pages/UsersPage.js.map +1 -1
  101. package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
  102. package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
  103. package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
  104. package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
  105. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
  106. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
  107. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
  108. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
  109. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
  110. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
  111. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
  112. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
  113. 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 { Badge as a, Button as o, Card as s, CardContent as c, GradientText as l, Tabs as u, TabsContent as d, TabsList as f, TabsTrigger as p } from "@burdenoff/fe-libs/ui";
4
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
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 g = {
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: _, maintenanceRecords: v } = e(), y = _.filter((e) => e.status === "open" || e.status === "in_progress"), b = v.filter((e) => e.status === "scheduled" || e.status === "in_progress"), x = _.reduce((e, t) => e + t.cost, 0) + v.reduce((e, t) => e + t.cost, 0);
14
- return /* @__PURE__ */ h("div", {
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__ */ h("div", {
18
+ /* @__PURE__ */ b("div", {
18
19
  className: "flex items-center justify-between",
19
- children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
20
+ children: [/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
20
21
  className: "text-2xl font-bold",
21
- children: /* @__PURE__ */ m(l, { children: "Operations Hub" })
22
- }), /* @__PURE__ */ m("p", {
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__ */ h(o, {
26
+ })] }), /* @__PURE__ */ b(s, {
26
27
  size: "sm",
27
- children: [/* @__PURE__ */ m(r, { className: "mr-2 h-4 w-4" }), "New Work Order"]
28
+ children: [/* @__PURE__ */ y(r, { className: "mr-2 h-4 w-4" }), "New Work Order"]
28
29
  })]
29
30
  }),
30
- /* @__PURE__ */ h("div", {
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__ */ m(s, { children: /* @__PURE__ */ h(c, {
34
- className: "pt-4",
35
- children: [/* @__PURE__ */ h("div", {
36
- className: "flex items-center gap-2 text-sm text-text-secondary",
37
- children: [/* @__PURE__ */ m(n, { className: "h-4 w-4" }), "Open Work Orders"]
38
- }), /* @__PURE__ */ m("p", {
39
- className: "text-2xl font-bold mt-1",
40
- children: y.length
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__ */ h("div", {
67
+ children: [/* @__PURE__ */ b("div", {
46
68
  className: "flex items-center gap-2 text-sm text-text-secondary",
47
- children: [/* @__PURE__ */ m(i, { className: "h-4 w-4" }), "Active Maintenance"]
48
- }), /* @__PURE__ */ m("p", {
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: b.length
72
+ children: E.length
51
73
  })]
52
74
  }) }),
53
- /* @__PURE__ */ m(s, { children: /* @__PURE__ */ h(c, {
75
+ /* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
54
76
  className: "pt-4",
55
- children: [/* @__PURE__ */ h("div", {
77
+ children: [/* @__PURE__ */ b("div", {
56
78
  className: "flex items-center gap-2 text-sm text-text-secondary",
57
- children: [/* @__PURE__ */ m(t, { className: "h-4 w-4" }), "Critical"]
58
- }), /* @__PURE__ */ m("p", {
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: _.filter((e) => e.priority === "critical").length
82
+ children: C.filter((e) => e.priority === "critical").length
61
83
  })]
62
84
  }) }),
63
- /* @__PURE__ */ m(s, { children: /* @__PURE__ */ h(c, {
85
+ /* @__PURE__ */ y(c, { children: /* @__PURE__ */ b(l, {
64
86
  className: "pt-4",
65
- children: [/* @__PURE__ */ m("div", {
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__ */ h("p", {
90
+ }), /* @__PURE__ */ b("p", {
69
91
  className: "text-2xl font-bold mt-1",
70
- children: ["$", x.toLocaleString()]
92
+ children: ["$", D.toLocaleString()]
71
93
  })]
72
94
  }) })
73
95
  ]
74
96
  }),
75
- /* @__PURE__ */ h(u, {
97
+ /* @__PURE__ */ b(h, {
76
98
  defaultValue: "work-orders",
77
99
  children: [
78
- /* @__PURE__ */ h(f, { children: [/* @__PURE__ */ h(p, {
100
+ /* @__PURE__ */ b(_, { children: [/* @__PURE__ */ b(v, {
79
101
  value: "work-orders",
80
102
  children: [
81
103
  "Work Orders (",
82
- _.length,
104
+ C.length,
83
105
  ")"
84
106
  ]
85
- }), /* @__PURE__ */ h(p, {
107
+ }), /* @__PURE__ */ b(v, {
86
108
  value: "maintenance",
87
109
  children: [
88
110
  "Maintenance (",
89
- v.length,
111
+ w.length,
90
112
  ")"
91
113
  ]
92
114
  })] }),
93
- /* @__PURE__ */ m(d, {
115
+ /* @__PURE__ */ y(g, {
94
116
  value: "work-orders",
95
117
  className: "mt-4",
96
- children: /* @__PURE__ */ m(s, { children: /* @__PURE__ */ m(c, {
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__ */ m("div", {
124
+ children: /* @__PURE__ */ y("div", {
99
125
  className: "overflow-x-auto",
100
- children: /* @__PURE__ */ h("table", {
126
+ children: /* @__PURE__ */ b("table", {
101
127
  className: "w-full text-sm",
102
- children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", {
128
+ children: [/* @__PURE__ */ y("thead", { children: /* @__PURE__ */ b("tr", {
103
129
  className: "border-b bg-bg-sunken/50",
104
130
  children: [
105
- /* @__PURE__ */ m("th", {
131
+ /* @__PURE__ */ y("th", {
106
132
  className: "text-left p-3 font-medium",
107
133
  children: "ID"
108
134
  }),
109
- /* @__PURE__ */ m("th", {
135
+ /* @__PURE__ */ y("th", {
110
136
  className: "text-left p-3 font-medium",
111
137
  children: "Title"
112
138
  }),
113
- /* @__PURE__ */ m("th", {
139
+ /* @__PURE__ */ y("th", {
114
140
  className: "text-left p-3 font-medium",
115
141
  children: "Asset"
116
142
  }),
117
- /* @__PURE__ */ m("th", {
143
+ /* @__PURE__ */ y("th", {
118
144
  className: "text-left p-3 font-medium",
119
145
  children: "Priority"
120
146
  }),
121
- /* @__PURE__ */ m("th", {
147
+ /* @__PURE__ */ y("th", {
122
148
  className: "text-left p-3 font-medium",
123
149
  children: "Status"
124
150
  }),
125
- /* @__PURE__ */ m("th", {
151
+ /* @__PURE__ */ y("th", {
126
152
  className: "text-left p-3 font-medium",
127
153
  children: "Assigned To"
128
154
  }),
129
- /* @__PURE__ */ m("th", {
155
+ /* @__PURE__ */ y("th", {
130
156
  className: "text-left p-3 font-medium",
131
157
  children: "Due"
132
158
  }),
133
- /* @__PURE__ */ m("th", {
159
+ /* @__PURE__ */ y("th", {
134
160
  className: "text-right p-3 font-medium",
135
161
  children: "Cost"
136
162
  })
137
163
  ]
138
- }) }), /* @__PURE__ */ m("tbody", { children: _.map((e) => /* @__PURE__ */ h("tr", {
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__ */ m("td", {
167
+ /* @__PURE__ */ y("td", {
142
168
  className: "p-3 font-mono text-xs",
143
169
  children: e.id
144
170
  }),
145
- /* @__PURE__ */ h("td", {
171
+ /* @__PURE__ */ b("td", {
146
172
  className: "p-3",
147
- children: [/* @__PURE__ */ m("p", {
173
+ children: [/* @__PURE__ */ y("p", {
148
174
  className: "font-medium",
149
175
  children: e.title
150
- }), /* @__PURE__ */ m("p", {
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__ */ m("td", {
181
+ /* @__PURE__ */ y("td", {
156
182
  className: "p-3 text-xs",
157
183
  children: e.relatedAssetName
158
184
  }),
159
- /* @__PURE__ */ m("td", {
185
+ /* @__PURE__ */ y("td", {
160
186
  className: "p-3",
161
- children: /* @__PURE__ */ m(a, {
162
- variant: g[e.priority],
187
+ children: /* @__PURE__ */ y(o, {
188
+ variant: x[e.priority],
163
189
  children: e.priority
164
190
  })
165
191
  }),
166
- /* @__PURE__ */ m("td", {
192
+ /* @__PURE__ */ y("td", {
167
193
  className: "p-3",
168
- children: /* @__PURE__ */ m(a, {
194
+ children: /* @__PURE__ */ y(o, {
169
195
  variant: "outline",
170
196
  children: e.status.replace("_", " ")
171
197
  })
172
198
  }),
173
- /* @__PURE__ */ m("td", {
199
+ /* @__PURE__ */ y("td", {
174
200
  className: "p-3 text-xs",
175
201
  children: e.assignedTo
176
202
  }),
177
- /* @__PURE__ */ m("td", {
203
+ /* @__PURE__ */ y("td", {
178
204
  className: "p-3 text-xs",
179
205
  children: e.dueDate
180
206
  }),
181
- /* @__PURE__ */ h("td", {
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__ */ m(d, {
217
+ /* @__PURE__ */ y(g, {
192
218
  value: "maintenance",
193
219
  className: "mt-4",
194
- children: /* @__PURE__ */ m(s, { children: /* @__PURE__ */ m(c, {
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__ */ m("div", {
226
+ children: /* @__PURE__ */ y("div", {
197
227
  className: "overflow-x-auto",
198
- children: /* @__PURE__ */ h("table", {
228
+ children: /* @__PURE__ */ b("table", {
199
229
  className: "w-full text-sm",
200
- children: [/* @__PURE__ */ m("thead", { children: /* @__PURE__ */ h("tr", {
230
+ children: [/* @__PURE__ */ y("thead", { children: /* @__PURE__ */ b("tr", {
201
231
  className: "border-b bg-bg-sunken/50",
202
232
  children: [
203
- /* @__PURE__ */ m("th", {
233
+ /* @__PURE__ */ y("th", {
204
234
  className: "text-left p-3 font-medium",
205
235
  children: "ID"
206
236
  }),
207
- /* @__PURE__ */ m("th", {
237
+ /* @__PURE__ */ y("th", {
208
238
  className: "text-left p-3 font-medium",
209
239
  children: "Title"
210
240
  }),
211
- /* @__PURE__ */ m("th", {
241
+ /* @__PURE__ */ y("th", {
212
242
  className: "text-left p-3 font-medium",
213
243
  children: "Asset"
214
244
  }),
215
- /* @__PURE__ */ m("th", {
245
+ /* @__PURE__ */ y("th", {
216
246
  className: "text-left p-3 font-medium",
217
247
  children: "Type"
218
248
  }),
219
- /* @__PURE__ */ m("th", {
249
+ /* @__PURE__ */ y("th", {
220
250
  className: "text-left p-3 font-medium",
221
251
  children: "Priority"
222
252
  }),
223
- /* @__PURE__ */ m("th", {
253
+ /* @__PURE__ */ y("th", {
224
254
  className: "text-left p-3 font-medium",
225
255
  children: "Status"
226
256
  }),
227
- /* @__PURE__ */ m("th", {
257
+ /* @__PURE__ */ y("th", {
228
258
  className: "text-left p-3 font-medium",
229
259
  children: "Date"
230
260
  }),
231
- /* @__PURE__ */ m("th", {
261
+ /* @__PURE__ */ y("th", {
232
262
  className: "text-right p-3 font-medium",
233
263
  children: "Cost"
234
264
  })
235
265
  ]
236
- }) }), /* @__PURE__ */ m("tbody", { children: v.map((e) => /* @__PURE__ */ h("tr", {
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__ */ m("td", {
269
+ /* @__PURE__ */ y("td", {
240
270
  className: "p-3 font-mono text-xs",
241
271
  children: e.id
242
272
  }),
243
- /* @__PURE__ */ m("td", {
273
+ /* @__PURE__ */ y("td", {
244
274
  className: "p-3 font-medium",
245
275
  children: e.title
246
276
  }),
247
- /* @__PURE__ */ m("td", {
277
+ /* @__PURE__ */ y("td", {
248
278
  className: "p-3 text-xs",
249
279
  children: e.assetName
250
280
  }),
251
- /* @__PURE__ */ m("td", {
281
+ /* @__PURE__ */ y("td", {
252
282
  className: "p-3 capitalize text-xs",
253
283
  children: e.type
254
284
  }),
255
- /* @__PURE__ */ m("td", {
285
+ /* @__PURE__ */ y("td", {
256
286
  className: "p-3",
257
- children: /* @__PURE__ */ m(a, {
258
- variant: g[e.priority],
287
+ children: /* @__PURE__ */ y(o, {
288
+ variant: x[e.priority],
259
289
  children: e.priority
260
290
  })
261
291
  }),
262
- /* @__PURE__ */ m("td", {
292
+ /* @__PURE__ */ y("td", {
263
293
  className: "p-3",
264
- children: /* @__PURE__ */ m(a, {
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__ */ m("td", {
299
+ /* @__PURE__ */ y("td", {
270
300
  className: "p-3 text-xs",
271
301
  children: e.scheduledDate
272
302
  }),
273
- /* @__PURE__ */ h("td", {
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 { _ as OperationsOperationsHubPage };
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":"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"}
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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"}