@burdenoff/microfe-assethandler 2026.713.1 → 2026.714.1
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/hooks/useCopy.d.ts +28 -0
- package/dist/assethandler/hooks/useCopy.d.ts.map +1 -0
- package/dist/assethandler/hooks/useCopy.js +33 -0
- package/dist/assethandler/hooks/useCopy.js.map +1 -0
- package/dist/assethandler/index.d.ts +1 -1
- package/dist/assethandler/index.d.ts.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +259 -258
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +1 -2
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.d.ts.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +47 -48
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.d.ts.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +236 -236
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.d.ts.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +126 -125
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +127 -127
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/types/index.d.ts +20 -0
- package/dist/assethandler/types/index.d.ts.map +1 -1
- package/dist/services/createSandboxAssistantTransport.d.ts +8 -26
- package/dist/services/createSandboxAssistantTransport.d.ts.map +1 -1
- package/dist/services/createSandboxAssistantTransport.js +8 -114
- package/dist/services/createSandboxAssistantTransport.js.map +1 -1
- package/dist/utils/pageContext.d.ts.map +1 -1
- package/dist/utils/pageContext.js.map +1 -1
- package/package.json +2 -2
- package/dist/generated/wspace-operations.js +0 -255
- package/dist/generated/wspace-operations.js.map +0 -1
- package/dist/services/assistantApi.d.ts +0 -71
- package/dist/services/assistantApi.d.ts.map +0 -1
- package/dist/services/assistantApi.js +0 -215
- package/dist/services/assistantApi.js.map +0 -1
|
@@ -1,22 +1,23 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { useCopy as t } from "../hooks/useCopy.js";
|
|
3
|
+
import { cn as n } from "../utils/cn.js";
|
|
4
|
+
import { formatCompact as r, formatCurrencyCompact as i, seriesColor as ee } from "../components/charts/chartTheme.js";
|
|
4
5
|
import { TrendChart as a } from "../components/charts/TrendChart.js";
|
|
5
6
|
import { BarsChart as o } from "../components/charts/BarsChart.js";
|
|
6
7
|
import { DonutChart as s } from "../components/charts/DonutChart.js";
|
|
7
|
-
import { RadialGauge as
|
|
8
|
-
import { ProgressMeter as
|
|
8
|
+
import { RadialGauge as te } from "../components/charts/RadialGauge.js";
|
|
9
|
+
import { ProgressMeter as ne } from "../components/charts/ProgressMeter.js";
|
|
9
10
|
import { StatTile as c } from "../components/StatTile.js";
|
|
10
11
|
import { ChartCard as l } from "../components/ChartCard.js";
|
|
11
12
|
import "../components/index.js";
|
|
12
13
|
import { useMemo as u } from "react";
|
|
13
|
-
import { Activity as d, AlertTriangle as f, Box as p, ClipboardList as m, DollarSign as
|
|
14
|
-
import { gql as
|
|
15
|
-
import { useQuery as
|
|
16
|
-
import { jsx as
|
|
17
|
-
import { Card as
|
|
14
|
+
import { Activity as d, AlertTriangle as f, Box as p, ClipboardList as m, DollarSign as re, Gauge as h, PieChart as g, Receipt as _, ShieldCheck as ie, TrendingDown as ae, Users as oe, Wallet as v, Wrench as y } from "lucide-react";
|
|
15
|
+
import { gql as b } from "@apollo/client";
|
|
16
|
+
import { useQuery as se } from "@apollo/client/react";
|
|
17
|
+
import { jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
18
|
+
import { Card as C, CardContent as w, CardHeader as T, CardTitle as E, EmphasisPanel as ce, GradientText as le, IllustratedEmptyState as D, PagePurpose as ue, Separator as de, Tabs as fe, TabsContent as O, TabsList as pe, TabsTrigger as k } from "@burdenoff/fe-libs/ui";
|
|
18
19
|
//#region src/assethandler/pages/AnalyticsPage.tsx
|
|
19
|
-
var
|
|
20
|
+
var me = b`
|
|
20
21
|
query AssetHandlerAnalyticsRollups {
|
|
21
22
|
financialSummary {
|
|
22
23
|
totalAssetValue
|
|
@@ -40,54 +41,54 @@ var he = v`
|
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
}
|
|
43
|
-
`,
|
|
44
|
-
function
|
|
44
|
+
`, A = i("USD");
|
|
45
|
+
function j(e) {
|
|
45
46
|
return e.replace(/_/g, " ").replace(/\b\w/g, (e) => e.toUpperCase());
|
|
46
47
|
}
|
|
47
|
-
function
|
|
48
|
+
function M(e) {
|
|
48
49
|
if (!e) return null;
|
|
49
50
|
let t = new Date(e);
|
|
50
51
|
return Number.isNaN(t.getTime()) ? null : t;
|
|
51
52
|
}
|
|
52
|
-
function
|
|
53
|
+
function N(e) {
|
|
53
54
|
return `${e.getFullYear()}-${String(e.getMonth() + 1).padStart(2, "0")}`;
|
|
54
55
|
}
|
|
55
|
-
function
|
|
56
|
+
function P(e) {
|
|
56
57
|
let [t, n] = e.split("-").map(Number);
|
|
57
58
|
return new Date(t, n - 1, 1).toLocaleString(void 0, { month: "short" });
|
|
58
59
|
}
|
|
59
|
-
var
|
|
60
|
+
var F = {
|
|
60
61
|
success: "bg-status-success-bg-subtle text-status-success-text",
|
|
61
62
|
warning: "bg-status-warning-bg-subtle text-status-warning-text",
|
|
62
63
|
error: "bg-status-error-bg-subtle text-status-error-text",
|
|
63
64
|
info: "bg-status-info-bg-subtle text-status-info-text",
|
|
64
65
|
neutral: "bg-bg-sunken text-text-secondary"
|
|
65
66
|
};
|
|
66
|
-
function
|
|
67
|
-
return /* @__PURE__ */
|
|
68
|
-
className:
|
|
69
|
-
children:
|
|
67
|
+
function I({ tone: e, children: t }) {
|
|
68
|
+
return /* @__PURE__ */ x("span", {
|
|
69
|
+
className: n("inline-flex items-center rounded-full px-2 py-0.5 text-[11px] font-medium capitalize whitespace-nowrap", F[e]),
|
|
70
|
+
children: t
|
|
70
71
|
});
|
|
71
72
|
}
|
|
72
|
-
var
|
|
73
|
-
function
|
|
74
|
-
let { assets:
|
|
73
|
+
var he = (e) => e === "completed" || e === "approved" ? "success" : e === "rejected" ? "error" : e === "pending" ? "warning" : "neutral";
|
|
74
|
+
function L() {
|
|
75
|
+
let i = t(), { assets: b, transactions: F, incidents: L, maintenanceRecords: R, budgets: z, invoices: B, workOrders: V } = e(), { data: H } = se(me, {
|
|
75
76
|
fetchPolicy: "cache-and-network",
|
|
76
77
|
errorPolicy: "all"
|
|
77
|
-
}),
|
|
78
|
-
let e =
|
|
79
|
-
let n =
|
|
78
|
+
}), U = H?.financialSummary, W = H?.utilizationReport, G = u(() => {
|
|
79
|
+
let e = b.reduce((e, t) => {
|
|
80
|
+
let n = j(t.category);
|
|
80
81
|
return e[n] = (e[n] || 0) + 1, e;
|
|
81
82
|
}, {});
|
|
82
83
|
return Object.entries(e).sort((e, t) => t[1] - e[1]).map(([e, t]) => ({
|
|
83
84
|
name: e,
|
|
84
85
|
value: t
|
|
85
86
|
}));
|
|
86
|
-
}, [
|
|
87
|
+
}, [b]), K = u(() => G.map((e) => ({
|
|
87
88
|
category: e.name,
|
|
88
89
|
count: e.value
|
|
89
|
-
})), [
|
|
90
|
-
let e =
|
|
90
|
+
})), [G]), ge = u(() => {
|
|
91
|
+
let e = b.reduce((e, t) => (e[t.status] = (e[t.status] || 0) + 1, e), {}), t = {
|
|
91
92
|
active: "success",
|
|
92
93
|
maintenance: "warning",
|
|
93
94
|
retired: "neutral",
|
|
@@ -101,204 +102,204 @@ function F() {
|
|
|
101
102
|
neutral: "var(--color-text-muted)"
|
|
102
103
|
};
|
|
103
104
|
return Object.entries(e).sort((e, t) => t[1] - e[1]).map(([e, r]) => ({
|
|
104
|
-
name:
|
|
105
|
+
name: j(e),
|
|
105
106
|
value: r,
|
|
106
107
|
color: n[t[e] ?? "neutral"]
|
|
107
108
|
}));
|
|
108
|
-
}, [
|
|
109
|
+
}, [b]), _e = u(() => {
|
|
109
110
|
let e = [
|
|
110
111
|
"excellent",
|
|
111
112
|
"good",
|
|
112
113
|
"fair",
|
|
113
114
|
"poor",
|
|
114
115
|
"damaged"
|
|
115
|
-
], t =
|
|
116
|
+
], t = b.reduce((e, t) => (e[t.condition] = (e[t.condition] || 0) + 1, e), {});
|
|
116
117
|
return e.filter((e) => t[e]).map((e) => ({
|
|
117
|
-
condition:
|
|
118
|
+
condition: j(e),
|
|
118
119
|
count: t[e]
|
|
119
120
|
})).concat(Object.entries(t).filter(([t]) => !e.includes(t)).map(([e, t]) => ({
|
|
120
|
-
condition:
|
|
121
|
+
condition: j(e),
|
|
121
122
|
count: t
|
|
122
123
|
})));
|
|
123
|
-
}, [
|
|
124
|
+
}, [b]), q = b.length, ve = b.filter((e) => e.status === "active").length, J = G.length, Y = b.filter((e) => e.condition === "poor" || e.condition === "damaged" || e.status === "maintenance"), ye = F.reduce((e, t) => e + Math.abs(t.amount), 0), be = z.reduce((e, t) => e + t.allocated, 0), xe = z.reduce((e, t) => e + t.spent, 0), Se = z.reduce((e, t) => e + t.remaining, 0), Ce = R.reduce((e, t) => e + (t.actualCost ?? t.estimatedCost ?? 0), 0), we = B.filter((e) => e.status !== "paid" && e.status !== "cancelled"), Te = we.reduce((e, t) => e + t.amount, 0), X = u(() => z.map((e) => ({
|
|
124
125
|
name: e.name,
|
|
125
126
|
allocated: e.allocated,
|
|
126
127
|
spent: e.spent
|
|
127
|
-
})), [
|
|
128
|
+
})), [z]), Z = u(() => {
|
|
128
129
|
let e = /* @__PURE__ */ new Map();
|
|
129
|
-
for (let t of
|
|
130
|
-
let n =
|
|
130
|
+
for (let t of F) {
|
|
131
|
+
let n = M(t.date);
|
|
131
132
|
if (!n) continue;
|
|
132
|
-
let r =
|
|
133
|
+
let r = N(n);
|
|
133
134
|
e.set(r, (e.get(r) ?? 0) + Math.abs(t.amount));
|
|
134
135
|
}
|
|
135
136
|
return [...e.keys()].sort().map((t) => ({
|
|
136
|
-
month:
|
|
137
|
+
month: P(t),
|
|
137
138
|
spend: Math.round(e.get(t) ?? 0)
|
|
138
139
|
}));
|
|
139
|
-
}, [
|
|
140
|
-
status:
|
|
140
|
+
}, [F]), Ee = L.filter((e) => e.status === "resolved" || e.status === "closed"), Q = L.filter((e) => e.slaBreached), De = L.length > 0 ? Math.round((1 - Q.length / L.length) * 100) : 100, Oe = R.filter((e) => e.status === "completed"), ke = R.filter((e) => e.status === "scheduled"), Ae = V.filter((e) => e.status !== "completed" && e.status !== "cancelled"), je = u(() => (W?.byStatus ?? []).map((e) => ({
|
|
141
|
+
status: j(e.status),
|
|
141
142
|
count: e.count
|
|
142
|
-
})), [
|
|
143
|
-
let e =
|
|
143
|
+
})), [W]), Me = u(() => {
|
|
144
|
+
let e = V.reduce((e, t) => (e[t.status] = (e[t.status] || 0) + 1, e), {});
|
|
144
145
|
return Object.entries(e).sort((e, t) => t[1] - e[1]).map(([e, t]) => ({
|
|
145
|
-
name:
|
|
146
|
+
name: j(e),
|
|
146
147
|
value: t
|
|
147
148
|
}));
|
|
148
|
-
}, [
|
|
149
|
+
}, [V]), Ne = u(() => {
|
|
149
150
|
let e = /* @__PURE__ */ new Map();
|
|
150
|
-
for (let t of
|
|
151
|
-
let n =
|
|
151
|
+
for (let t of R) {
|
|
152
|
+
let n = M(t.completedDate ?? t.scheduledDate), r = t.actualCost ?? t.estimatedCost;
|
|
152
153
|
if (!n || r === void 0) continue;
|
|
153
|
-
let i =
|
|
154
|
+
let i = N(n);
|
|
154
155
|
e.set(i, (e.get(i) ?? 0) + r);
|
|
155
156
|
}
|
|
156
157
|
return [...e.keys()].sort().map((t) => ({
|
|
157
|
-
month:
|
|
158
|
+
month: P(t),
|
|
158
159
|
cost: Math.round(e.get(t) ?? 0)
|
|
159
160
|
}));
|
|
160
|
-
}, [
|
|
161
|
+
}, [R]), $ = U ? [
|
|
161
162
|
{
|
|
162
163
|
label: "Total Asset Value",
|
|
163
|
-
value:
|
|
164
|
-
icon:
|
|
164
|
+
value: U.totalAssetValue,
|
|
165
|
+
icon: re
|
|
165
166
|
},
|
|
166
167
|
{
|
|
167
168
|
label: "Total Depreciation",
|
|
168
|
-
value:
|
|
169
|
-
icon:
|
|
169
|
+
value: U.totalDepreciation,
|
|
170
|
+
icon: ae
|
|
170
171
|
},
|
|
171
172
|
{
|
|
172
173
|
label: "Maintenance Spend",
|
|
173
|
-
value:
|
|
174
|
-
icon:
|
|
174
|
+
value: U.totalMaintenanceSpend,
|
|
175
|
+
icon: y
|
|
175
176
|
},
|
|
176
177
|
{
|
|
177
178
|
label: "Transaction Expense",
|
|
178
|
-
value:
|
|
179
|
-
icon:
|
|
179
|
+
value: U.transactionExpense,
|
|
180
|
+
icon: _
|
|
180
181
|
},
|
|
181
182
|
{
|
|
182
183
|
label: "Budget Allocated",
|
|
183
|
-
value:
|
|
184
|
-
icon:
|
|
184
|
+
value: U.budgetAllocated,
|
|
185
|
+
icon: v
|
|
185
186
|
},
|
|
186
187
|
{
|
|
187
188
|
label: "Budget Spent",
|
|
188
|
-
value:
|
|
189
|
-
icon:
|
|
189
|
+
value: U.budgetSpent,
|
|
190
|
+
icon: v
|
|
190
191
|
},
|
|
191
192
|
{
|
|
192
193
|
label: "Invoices Outstanding",
|
|
193
|
-
value:
|
|
194
|
+
value: U.invoicesOutstanding,
|
|
194
195
|
icon: f
|
|
195
196
|
}
|
|
196
197
|
] : [];
|
|
197
|
-
return /* @__PURE__ */
|
|
198
|
+
return /* @__PURE__ */ S("div", {
|
|
198
199
|
className: "space-y-6 p-4 sm:p-6",
|
|
199
200
|
children: [
|
|
200
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("h1", {
|
|
201
202
|
className: "text-2xl font-bold sm:text-3xl",
|
|
202
|
-
children: /* @__PURE__ */
|
|
203
|
-
}), /* @__PURE__ */
|
|
203
|
+
children: /* @__PURE__ */ x(le, { children: "Analytics & Business Intelligence" })
|
|
204
|
+
}), /* @__PURE__ */ x("p", {
|
|
204
205
|
className: "text-sm text-text-secondary mt-1",
|
|
205
206
|
children: "Asset, financial and operational insights across your estate"
|
|
206
207
|
})] }),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ x(ue, { children: "Turn raw asset data into decisions. See how your estate is distributed by category, status and condition, where budget is being spent, and how operations are trending — so you can plan work, justify replacements and spot risk before it shows up as downtime." }),
|
|
209
|
+
/* @__PURE__ */ S(fe, {
|
|
209
210
|
defaultValue: "overview",
|
|
210
211
|
children: [
|
|
211
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ S(pe, {
|
|
212
213
|
className: "max-w-full justify-start overflow-x-auto",
|
|
213
214
|
children: [
|
|
214
|
-
/* @__PURE__ */
|
|
215
|
+
/* @__PURE__ */ x(k, {
|
|
215
216
|
value: "overview",
|
|
216
217
|
children: "Overview"
|
|
217
218
|
}),
|
|
218
|
-
/* @__PURE__ */
|
|
219
|
+
/* @__PURE__ */ x(k, {
|
|
219
220
|
value: "financial",
|
|
220
221
|
children: "Financial"
|
|
221
222
|
}),
|
|
222
|
-
/* @__PURE__ */
|
|
223
|
+
/* @__PURE__ */ x(k, {
|
|
223
224
|
value: "operational",
|
|
224
225
|
children: "Operational"
|
|
225
226
|
}),
|
|
226
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ x(k, {
|
|
227
228
|
value: "insights",
|
|
228
229
|
children: "Insights"
|
|
229
230
|
})
|
|
230
231
|
]
|
|
231
232
|
}),
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ S(O, {
|
|
233
234
|
value: "overview",
|
|
234
235
|
className: "space-y-6 mt-6",
|
|
235
236
|
children: [
|
|
236
|
-
/* @__PURE__ */
|
|
237
|
+
/* @__PURE__ */ S("div", {
|
|
237
238
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
238
239
|
children: [
|
|
239
|
-
/* @__PURE__ */
|
|
240
|
+
/* @__PURE__ */ x(c, {
|
|
240
241
|
hero: !0,
|
|
241
|
-
label: "Total
|
|
242
|
-
value:
|
|
243
|
-
format:
|
|
242
|
+
label: i("assethandler.analytics.metrics.totalAssets", "Total {{assets}}"),
|
|
243
|
+
value: q,
|
|
244
|
+
format: r,
|
|
244
245
|
icon: p
|
|
245
246
|
}),
|
|
246
|
-
/* @__PURE__ */
|
|
247
|
+
/* @__PURE__ */ x(c, {
|
|
247
248
|
label: "Categories",
|
|
248
|
-
value:
|
|
249
|
-
icon:
|
|
249
|
+
value: J,
|
|
250
|
+
icon: g
|
|
250
251
|
}),
|
|
251
|
-
/* @__PURE__ */
|
|
252
|
+
/* @__PURE__ */ x(c, {
|
|
252
253
|
label: "Needs Attention",
|
|
253
|
-
value:
|
|
254
|
+
value: Y.length,
|
|
254
255
|
icon: f
|
|
255
256
|
}),
|
|
256
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ x(c, {
|
|
257
258
|
label: "Open Incidents",
|
|
258
|
-
value:
|
|
259
|
+
value: L.length - Ee.length,
|
|
259
260
|
icon: d
|
|
260
261
|
})
|
|
261
262
|
]
|
|
262
263
|
}),
|
|
263
|
-
/* @__PURE__ */
|
|
264
|
+
/* @__PURE__ */ S("div", {
|
|
264
265
|
className: "grid gap-6 lg:grid-cols-2",
|
|
265
|
-
children: [/* @__PURE__ */
|
|
266
|
+
children: [/* @__PURE__ */ x(l, {
|
|
266
267
|
title: "Assets by Category",
|
|
267
268
|
subtitle: "Computed from real data",
|
|
268
|
-
icon:
|
|
269
|
-
children: /* @__PURE__ */
|
|
270
|
-
data:
|
|
269
|
+
icon: g,
|
|
270
|
+
children: /* @__PURE__ */ x(o, {
|
|
271
|
+
data: K,
|
|
271
272
|
xKey: "category",
|
|
272
273
|
series: [{
|
|
273
274
|
key: "count",
|
|
274
275
|
label: "Assets"
|
|
275
276
|
}],
|
|
276
277
|
orientation: "horizontal",
|
|
277
|
-
height: Math.max(220,
|
|
278
|
+
height: Math.max(220, K.length * 40),
|
|
278
279
|
categoryWidth: 120,
|
|
279
280
|
emptyLabel: "No assets yet",
|
|
280
281
|
ariaLabel: "Assets by category"
|
|
281
282
|
})
|
|
282
|
-
}), /* @__PURE__ */
|
|
283
|
+
}), /* @__PURE__ */ x(l, {
|
|
283
284
|
title: "Assets by Status",
|
|
284
285
|
subtitle: "Computed from real data",
|
|
285
286
|
icon: d,
|
|
286
|
-
children: /* @__PURE__ */
|
|
287
|
-
data:
|
|
288
|
-
centerLabel: "
|
|
289
|
-
centerValue:
|
|
287
|
+
children: /* @__PURE__ */ x(s, {
|
|
288
|
+
data: ge,
|
|
289
|
+
centerLabel: i("assethandler.analytics.donut.centerLabel", "{{assets}}"),
|
|
290
|
+
centerValue: q,
|
|
290
291
|
height: 260,
|
|
291
292
|
emptyLabel: "No assets yet",
|
|
292
293
|
ariaLabel: "Assets by status"
|
|
293
294
|
})
|
|
294
295
|
})]
|
|
295
296
|
}),
|
|
296
|
-
/* @__PURE__ */
|
|
297
|
+
/* @__PURE__ */ x(l, {
|
|
297
298
|
title: "Asset Condition Mix",
|
|
298
299
|
subtitle: "Computed from real data",
|
|
299
|
-
icon:
|
|
300
|
-
children: /* @__PURE__ */
|
|
301
|
-
data:
|
|
300
|
+
icon: h,
|
|
301
|
+
children: /* @__PURE__ */ x(o, {
|
|
302
|
+
data: _e,
|
|
302
303
|
xKey: "condition",
|
|
303
304
|
series: [{
|
|
304
305
|
key: "count",
|
|
@@ -311,198 +312,198 @@ function F() {
|
|
|
311
312
|
})
|
|
312
313
|
]
|
|
313
314
|
}),
|
|
314
|
-
/* @__PURE__ */
|
|
315
|
+
/* @__PURE__ */ S(O, {
|
|
315
316
|
value: "financial",
|
|
316
317
|
className: "space-y-6 mt-6",
|
|
317
318
|
children: [
|
|
318
|
-
|
|
319
|
+
U ? /* @__PURE__ */ x("div", {
|
|
319
320
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
320
|
-
children: $.slice(0, 4).map((e, t) => /* @__PURE__ */
|
|
321
|
+
children: $.slice(0, 4).map((e, t) => /* @__PURE__ */ x(c, {
|
|
321
322
|
hero: t === 0,
|
|
322
323
|
label: e.label,
|
|
323
324
|
value: e.value,
|
|
324
|
-
format:
|
|
325
|
+
format: A,
|
|
325
326
|
icon: e.icon
|
|
326
327
|
}, e.label))
|
|
327
|
-
}) : /* @__PURE__ */
|
|
328
|
+
}) : /* @__PURE__ */ x(C, { children: /* @__PURE__ */ x(w, {
|
|
328
329
|
className: "py-8",
|
|
329
|
-
children: /* @__PURE__ */
|
|
330
|
+
children: /* @__PURE__ */ x(D, {
|
|
330
331
|
illustration: "empty-data",
|
|
331
332
|
title: "Financial summary unavailable",
|
|
332
333
|
description: "Portfolio valuation and budget rollups will appear once financial data is recorded."
|
|
333
334
|
})
|
|
334
335
|
}) }),
|
|
335
|
-
|
|
336
|
+
U ? /* @__PURE__ */ x("div", {
|
|
336
337
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-3",
|
|
337
|
-
children: $.slice(4).map((e) => /* @__PURE__ */
|
|
338
|
+
children: $.slice(4).map((e) => /* @__PURE__ */ x(c, {
|
|
338
339
|
label: e.label,
|
|
339
340
|
value: e.value,
|
|
340
|
-
format:
|
|
341
|
+
format: A,
|
|
341
342
|
icon: e.icon,
|
|
342
|
-
delta: e.label === "Invoices Outstanding" ? `${
|
|
343
|
+
delta: e.label === "Invoices Outstanding" ? `${U.invoicesOutstandingCount} unpaid` : void 0,
|
|
343
344
|
deltaTone: "neutral"
|
|
344
345
|
}, e.label))
|
|
345
346
|
}) : null,
|
|
346
|
-
/* @__PURE__ */
|
|
347
|
+
/* @__PURE__ */ S("div", {
|
|
347
348
|
className: "grid gap-6 lg:grid-cols-2",
|
|
348
|
-
children: [/* @__PURE__ */
|
|
349
|
+
children: [/* @__PURE__ */ x(l, {
|
|
349
350
|
title: "Budget: Allocated vs Spent",
|
|
350
351
|
subtitle: "Per budget, from real data",
|
|
351
|
-
icon:
|
|
352
|
-
children:
|
|
352
|
+
icon: v,
|
|
353
|
+
children: X.length === 0 ? /* @__PURE__ */ x(D, {
|
|
353
354
|
illustration: "empty-data",
|
|
354
355
|
title: "No budgets yet",
|
|
355
356
|
description: "Create a budget to track allocation and spend here."
|
|
356
|
-
}) : /* @__PURE__ */
|
|
357
|
-
data:
|
|
357
|
+
}) : /* @__PURE__ */ x(o, {
|
|
358
|
+
data: X,
|
|
358
359
|
xKey: "name",
|
|
359
360
|
series: [{
|
|
360
361
|
key: "allocated",
|
|
361
362
|
label: "Allocated",
|
|
362
|
-
color:
|
|
363
|
+
color: ee(1)
|
|
363
364
|
}, {
|
|
364
365
|
key: "spent",
|
|
365
366
|
label: "Spent"
|
|
366
367
|
}],
|
|
367
|
-
height: Math.max(220,
|
|
368
|
+
height: Math.max(220, X.length * 56),
|
|
368
369
|
orientation: "horizontal",
|
|
369
370
|
categoryWidth: 120,
|
|
370
|
-
valueFormat:
|
|
371
|
+
valueFormat: A,
|
|
371
372
|
ariaLabel: "Budget allocated versus spent"
|
|
372
373
|
})
|
|
373
|
-
}), /* @__PURE__ */
|
|
374
|
+
}), /* @__PURE__ */ x(l, {
|
|
374
375
|
title: "Spend Over Time",
|
|
375
376
|
subtitle: "Monthly transaction spend",
|
|
376
|
-
icon:
|
|
377
|
-
children:
|
|
377
|
+
icon: _,
|
|
378
|
+
children: Z.length === 0 ? /* @__PURE__ */ x(D, {
|
|
378
379
|
illustration: "empty-data",
|
|
379
380
|
title: "No transactions yet",
|
|
380
381
|
description: "Recorded purchases, leases and disposals will chart here."
|
|
381
|
-
}) : /* @__PURE__ */
|
|
382
|
-
data:
|
|
382
|
+
}) : /* @__PURE__ */ x(a, {
|
|
383
|
+
data: Z,
|
|
383
384
|
xKey: "month",
|
|
384
385
|
series: [{
|
|
385
386
|
key: "spend",
|
|
386
387
|
label: "Spend"
|
|
387
388
|
}],
|
|
388
|
-
valueFormat:
|
|
389
|
+
valueFormat: A,
|
|
389
390
|
height: 260,
|
|
390
391
|
ariaLabel: "Monthly transaction spend"
|
|
391
392
|
})
|
|
392
393
|
})]
|
|
393
394
|
}),
|
|
394
|
-
/* @__PURE__ */
|
|
395
|
+
/* @__PURE__ */ x(l, {
|
|
395
396
|
title: "Budget Utilization",
|
|
396
397
|
subtitle: "Allocated vs. spent per budget",
|
|
397
|
-
icon:
|
|
398
|
-
children:
|
|
398
|
+
icon: v,
|
|
399
|
+
children: z.length === 0 ? /* @__PURE__ */ x(D, {
|
|
399
400
|
illustration: "empty-data",
|
|
400
401
|
title: "No budgets yet",
|
|
401
402
|
description: "Create a budget to track allocation and spend here."
|
|
402
|
-
}) : /* @__PURE__ */
|
|
403
|
+
}) : /* @__PURE__ */ S("div", {
|
|
403
404
|
className: "space-y-4",
|
|
404
405
|
children: [
|
|
405
|
-
|
|
406
|
+
z.map((e) => /* @__PURE__ */ x(ne, {
|
|
406
407
|
label: e.name,
|
|
407
408
|
value: e.spent,
|
|
408
409
|
max: e.allocated,
|
|
409
410
|
format: (e) => `$${Math.round(e).toLocaleString()}`
|
|
410
411
|
}, e.id)),
|
|
411
|
-
/* @__PURE__ */
|
|
412
|
-
/* @__PURE__ */
|
|
412
|
+
/* @__PURE__ */ x(de, {}),
|
|
413
|
+
/* @__PURE__ */ S("div", {
|
|
413
414
|
className: "flex items-center justify-between text-sm font-medium",
|
|
414
|
-
children: [/* @__PURE__ */
|
|
415
|
+
children: [/* @__PURE__ */ x("span", { children: "Remaining across all budgets" }), /* @__PURE__ */ S("span", {
|
|
415
416
|
className: "tabular-nums",
|
|
416
|
-
children: ["$",
|
|
417
|
+
children: ["$", Se.toLocaleString()]
|
|
417
418
|
})]
|
|
418
419
|
})
|
|
419
420
|
]
|
|
420
421
|
})
|
|
421
422
|
}),
|
|
422
|
-
/* @__PURE__ */
|
|
423
|
+
/* @__PURE__ */ S("div", {
|
|
423
424
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
424
425
|
children: [
|
|
425
|
-
/* @__PURE__ */
|
|
426
|
+
/* @__PURE__ */ x(c, {
|
|
426
427
|
label: "Transactions",
|
|
427
|
-
value:
|
|
428
|
-
icon:
|
|
429
|
-
delta: `$${
|
|
428
|
+
value: F.length,
|
|
429
|
+
icon: _,
|
|
430
|
+
delta: `$${ye.toLocaleString()} value`,
|
|
430
431
|
deltaTone: "neutral"
|
|
431
432
|
}),
|
|
432
|
-
/* @__PURE__ */
|
|
433
|
+
/* @__PURE__ */ x(c, {
|
|
433
434
|
label: "Budget Allocated",
|
|
434
|
-
value:
|
|
435
|
-
format:
|
|
436
|
-
icon:
|
|
437
|
-
delta: `$${
|
|
435
|
+
value: be,
|
|
436
|
+
format: A,
|
|
437
|
+
icon: v,
|
|
438
|
+
delta: `$${xe.toLocaleString()} spent`,
|
|
438
439
|
deltaTone: "neutral"
|
|
439
440
|
}),
|
|
440
|
-
/* @__PURE__ */
|
|
441
|
+
/* @__PURE__ */ x(c, {
|
|
441
442
|
label: "Maintenance Cost",
|
|
442
|
-
value:
|
|
443
|
-
format:
|
|
444
|
-
icon:
|
|
443
|
+
value: Ce,
|
|
444
|
+
format: A,
|
|
445
|
+
icon: y
|
|
445
446
|
}),
|
|
446
|
-
/* @__PURE__ */
|
|
447
|
+
/* @__PURE__ */ x(c, {
|
|
447
448
|
label: "Outstanding Invoices",
|
|
448
|
-
value:
|
|
449
|
-
format:
|
|
449
|
+
value: Te,
|
|
450
|
+
format: A,
|
|
450
451
|
icon: f,
|
|
451
|
-
delta: `${
|
|
452
|
+
delta: `${we.length} of ${B.length}`,
|
|
452
453
|
deltaTone: "neutral"
|
|
453
454
|
})
|
|
454
455
|
]
|
|
455
456
|
}),
|
|
456
|
-
/* @__PURE__ */
|
|
457
|
+
/* @__PURE__ */ x(l, {
|
|
457
458
|
title: "Recent Transactions",
|
|
458
|
-
icon:
|
|
459
|
-
children:
|
|
459
|
+
icon: _,
|
|
460
|
+
children: F.length === 0 ? /* @__PURE__ */ x(D, {
|
|
460
461
|
illustration: "empty-data",
|
|
461
462
|
title: "No transactions",
|
|
462
463
|
description: "Asset purchases, leases and disposals will appear here."
|
|
463
|
-
}) : /* @__PURE__ */
|
|
464
|
+
}) : /* @__PURE__ */ x("div", {
|
|
464
465
|
className: "overflow-x-auto",
|
|
465
|
-
children: /* @__PURE__ */
|
|
466
|
+
children: /* @__PURE__ */ S("table", {
|
|
466
467
|
className: "w-full text-sm",
|
|
467
|
-
children: [/* @__PURE__ */
|
|
468
|
+
children: [/* @__PURE__ */ x("thead", { children: /* @__PURE__ */ S("tr", {
|
|
468
469
|
className: "border-b border-border-seam text-text-secondary",
|
|
469
470
|
children: [
|
|
470
|
-
/* @__PURE__ */
|
|
471
|
+
/* @__PURE__ */ x("th", {
|
|
471
472
|
className: "py-2 text-left font-medium",
|
|
472
473
|
children: "Type"
|
|
473
474
|
}),
|
|
474
|
-
/* @__PURE__ */
|
|
475
|
+
/* @__PURE__ */ x("th", {
|
|
475
476
|
className: "py-2 text-left font-medium",
|
|
476
477
|
children: "Description"
|
|
477
478
|
}),
|
|
478
|
-
/* @__PURE__ */
|
|
479
|
+
/* @__PURE__ */ x("th", {
|
|
479
480
|
className: "py-2 text-right font-medium",
|
|
480
481
|
children: "Amount"
|
|
481
482
|
}),
|
|
482
|
-
/* @__PURE__ */
|
|
483
|
+
/* @__PURE__ */ x("th", {
|
|
483
484
|
className: "py-2 text-left font-medium",
|
|
484
485
|
children: "Status"
|
|
485
486
|
})
|
|
486
487
|
]
|
|
487
|
-
}) }), /* @__PURE__ */
|
|
488
|
+
}) }), /* @__PURE__ */ x("tbody", { children: F.slice(0, 6).map((e) => /* @__PURE__ */ S("tr", {
|
|
488
489
|
className: "border-b border-border-seam hover:bg-bg-sunken/50",
|
|
489
490
|
children: [
|
|
490
|
-
/* @__PURE__ */
|
|
491
|
+
/* @__PURE__ */ x("td", {
|
|
491
492
|
className: "py-2.5 capitalize",
|
|
492
493
|
children: e.type
|
|
493
494
|
}),
|
|
494
|
-
/* @__PURE__ */
|
|
495
|
+
/* @__PURE__ */ x("td", {
|
|
495
496
|
className: "max-w-xs truncate py-2.5",
|
|
496
497
|
children: e.description
|
|
497
498
|
}),
|
|
498
|
-
/* @__PURE__ */
|
|
499
|
-
className:
|
|
499
|
+
/* @__PURE__ */ S("td", {
|
|
500
|
+
className: n("py-2.5 text-right font-medium tabular-nums", e.amount < 0 && "text-status-error-text"),
|
|
500
501
|
children: ["$", Math.abs(e.amount).toLocaleString()]
|
|
501
502
|
}),
|
|
502
|
-
/* @__PURE__ */
|
|
503
|
+
/* @__PURE__ */ x("td", {
|
|
503
504
|
className: "py-2.5",
|
|
504
|
-
children: /* @__PURE__ */
|
|
505
|
-
tone:
|
|
505
|
+
children: /* @__PURE__ */ x(I, {
|
|
506
|
+
tone: he(e.status),
|
|
506
507
|
children: e.status
|
|
507
508
|
})
|
|
508
509
|
})
|
|
@@ -513,107 +514,107 @@ function F() {
|
|
|
513
514
|
})
|
|
514
515
|
]
|
|
515
516
|
}),
|
|
516
|
-
/* @__PURE__ */
|
|
517
|
+
/* @__PURE__ */ S(O, {
|
|
517
518
|
value: "operational",
|
|
518
519
|
className: "space-y-6 mt-6",
|
|
519
520
|
children: [
|
|
520
|
-
/* @__PURE__ */
|
|
521
|
+
/* @__PURE__ */ S("div", {
|
|
521
522
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-5",
|
|
522
523
|
children: [
|
|
523
|
-
/* @__PURE__ */
|
|
524
|
-
label: "Total
|
|
525
|
-
value:
|
|
524
|
+
/* @__PURE__ */ x(c, {
|
|
525
|
+
label: i("assethandler.analytics.metrics.totalAssets", "Total {{assets}}"),
|
|
526
|
+
value: W?.totalAssets ?? q,
|
|
526
527
|
icon: p
|
|
527
528
|
}),
|
|
528
|
-
/* @__PURE__ */
|
|
529
|
+
/* @__PURE__ */ x(c, {
|
|
529
530
|
label: "Assigned",
|
|
530
|
-
value:
|
|
531
|
-
icon:
|
|
531
|
+
value: W?.assignedAssets ?? "—",
|
|
532
|
+
icon: oe
|
|
532
533
|
}),
|
|
533
|
-
/* @__PURE__ */
|
|
534
|
+
/* @__PURE__ */ x(c, {
|
|
534
535
|
label: "Unassigned",
|
|
535
|
-
value:
|
|
536
|
+
value: W?.unassignedAssets ?? "—",
|
|
536
537
|
icon: p
|
|
537
538
|
}),
|
|
538
|
-
/* @__PURE__ */
|
|
539
|
+
/* @__PURE__ */ x(c, {
|
|
539
540
|
label: "Idle",
|
|
540
|
-
value:
|
|
541
|
+
value: W?.idleAssets ?? "—",
|
|
541
542
|
icon: d
|
|
542
543
|
}),
|
|
543
|
-
/* @__PURE__ */
|
|
544
|
+
/* @__PURE__ */ x(c, {
|
|
544
545
|
label: "Overdue",
|
|
545
|
-
value:
|
|
546
|
+
value: W?.overdueAssignments ?? "—",
|
|
546
547
|
icon: f,
|
|
547
|
-
delta:
|
|
548
|
+
delta: W && W.overdueAssignments > 0 ? "action needed" : void 0,
|
|
548
549
|
deltaTone: "negative",
|
|
549
550
|
deltaDirection: "up"
|
|
550
551
|
})
|
|
551
552
|
]
|
|
552
553
|
}),
|
|
553
|
-
/* @__PURE__ */
|
|
554
|
+
/* @__PURE__ */ S("div", {
|
|
554
555
|
className: "grid gap-6 lg:grid-cols-2",
|
|
555
|
-
children: [/* @__PURE__ */
|
|
556
|
+
children: [/* @__PURE__ */ x(l, {
|
|
556
557
|
title: "Assets by Status",
|
|
557
558
|
subtitle: "Assignment coverage",
|
|
558
|
-
icon:
|
|
559
|
-
children: /* @__PURE__ */
|
|
560
|
-
data:
|
|
559
|
+
icon: h,
|
|
560
|
+
children: /* @__PURE__ */ x(o, {
|
|
561
|
+
data: je,
|
|
561
562
|
xKey: "status",
|
|
562
563
|
series: [{
|
|
563
564
|
key: "count",
|
|
564
565
|
label: "Assets"
|
|
565
566
|
}],
|
|
566
567
|
orientation: "horizontal",
|
|
567
|
-
height: Math.max(200,
|
|
568
|
+
height: Math.max(200, je.length * 40),
|
|
568
569
|
categoryWidth: 120,
|
|
569
570
|
emptyLabel: "No utilization data",
|
|
570
571
|
ariaLabel: "Assets by status"
|
|
571
572
|
})
|
|
572
|
-
}), /* @__PURE__ */
|
|
573
|
+
}), /* @__PURE__ */ x(l, {
|
|
573
574
|
title: "Work Orders by Status",
|
|
574
575
|
subtitle: "From real data",
|
|
575
576
|
icon: m,
|
|
576
|
-
children: /* @__PURE__ */
|
|
577
|
-
data:
|
|
577
|
+
children: /* @__PURE__ */ x(s, {
|
|
578
|
+
data: Me,
|
|
578
579
|
centerLabel: "Work orders",
|
|
579
|
-
centerValue:
|
|
580
|
+
centerValue: V.length,
|
|
580
581
|
height: 260,
|
|
581
582
|
emptyLabel: "No work orders",
|
|
582
583
|
ariaLabel: "Work orders by status"
|
|
583
584
|
})
|
|
584
585
|
})]
|
|
585
586
|
}),
|
|
586
|
-
/* @__PURE__ */
|
|
587
|
+
/* @__PURE__ */ x(l, {
|
|
587
588
|
title: "Maintenance Cost Over Time",
|
|
588
589
|
subtitle: "Monthly recorded maintenance cost",
|
|
589
|
-
icon:
|
|
590
|
-
children:
|
|
590
|
+
icon: y,
|
|
591
|
+
children: Ne.length === 0 ? /* @__PURE__ */ x(D, {
|
|
591
592
|
illustration: "empty-data",
|
|
592
593
|
title: "No maintenance cost yet",
|
|
593
594
|
description: "Once maintenance records carry cost, monthly spend will chart here."
|
|
594
|
-
}) : /* @__PURE__ */
|
|
595
|
-
data:
|
|
595
|
+
}) : /* @__PURE__ */ x(a, {
|
|
596
|
+
data: Ne,
|
|
596
597
|
xKey: "month",
|
|
597
598
|
series: [{
|
|
598
599
|
key: "cost",
|
|
599
600
|
label: "Cost"
|
|
600
601
|
}],
|
|
601
|
-
valueFormat:
|
|
602
|
+
valueFormat: A,
|
|
602
603
|
height: 260,
|
|
603
604
|
ariaLabel: "Monthly maintenance cost"
|
|
604
605
|
})
|
|
605
606
|
}),
|
|
606
|
-
/* @__PURE__ */
|
|
607
|
+
/* @__PURE__ */ S("div", {
|
|
607
608
|
className: "grid gap-4 sm:grid-cols-2 lg:grid-cols-4",
|
|
608
609
|
children: [
|
|
609
|
-
/* @__PURE__ */
|
|
610
|
+
/* @__PURE__ */ x(c, {
|
|
610
611
|
label: "Incidents",
|
|
611
|
-
value:
|
|
612
|
+
value: L.length,
|
|
612
613
|
icon: d,
|
|
613
|
-
delta: `${
|
|
614
|
+
delta: `${Ee.length} resolved`,
|
|
614
615
|
deltaTone: "neutral"
|
|
615
616
|
}),
|
|
616
|
-
/* @__PURE__ */
|
|
617
|
+
/* @__PURE__ */ x(c, {
|
|
617
618
|
label: "SLA Breaches",
|
|
618
619
|
value: Q.length,
|
|
619
620
|
icon: f,
|
|
@@ -621,139 +622,139 @@ function F() {
|
|
|
621
622
|
deltaTone: Q.length > 0 ? "negative" : "positive",
|
|
622
623
|
deltaDirection: Q.length > 0 ? "up" : "neutral"
|
|
623
624
|
}),
|
|
624
|
-
/* @__PURE__ */
|
|
625
|
+
/* @__PURE__ */ x(c, {
|
|
625
626
|
label: "Maintenance Done",
|
|
626
|
-
value:
|
|
627
|
-
icon:
|
|
628
|
-
delta: `of ${
|
|
627
|
+
value: Oe.length,
|
|
628
|
+
icon: y,
|
|
629
|
+
delta: `of ${R.length}`,
|
|
629
630
|
deltaTone: "neutral"
|
|
630
631
|
}),
|
|
631
|
-
/* @__PURE__ */
|
|
632
|
+
/* @__PURE__ */ x(c, {
|
|
632
633
|
label: "Open Work Orders",
|
|
633
|
-
value:
|
|
634
|
+
value: Ae.length,
|
|
634
635
|
icon: m,
|
|
635
|
-
delta: `of ${
|
|
636
|
+
delta: `of ${V.length}`,
|
|
636
637
|
deltaTone: "neutral"
|
|
637
638
|
})
|
|
638
639
|
]
|
|
639
640
|
})
|
|
640
641
|
]
|
|
641
642
|
}),
|
|
642
|
-
/* @__PURE__ */
|
|
643
|
+
/* @__PURE__ */ S(O, {
|
|
643
644
|
value: "insights",
|
|
644
645
|
className: "space-y-6 mt-6",
|
|
645
|
-
children: [/* @__PURE__ */
|
|
646
|
+
children: [/* @__PURE__ */ S("div", {
|
|
646
647
|
className: "grid gap-6 lg:grid-cols-3",
|
|
647
|
-
children: [/* @__PURE__ */
|
|
648
|
+
children: [/* @__PURE__ */ x(l, {
|
|
648
649
|
title: "SLA Compliance",
|
|
649
650
|
subtitle: "Incidents resolved within SLA",
|
|
650
|
-
icon:
|
|
651
|
-
children: /* @__PURE__ */
|
|
652
|
-
value:
|
|
651
|
+
icon: ie,
|
|
652
|
+
children: /* @__PURE__ */ x(te, {
|
|
653
|
+
value: De,
|
|
653
654
|
label: "within SLA",
|
|
654
|
-
sublabel: `${Q.length} of ${
|
|
655
|
+
sublabel: `${Q.length} of ${L.length} breached`,
|
|
655
656
|
format: (e) => `${Math.round(e)}%`,
|
|
656
657
|
height: 220,
|
|
657
658
|
ariaLabel: "SLA compliance percentage"
|
|
658
659
|
})
|
|
659
|
-
}), /* @__PURE__ */
|
|
660
|
+
}), /* @__PURE__ */ S("div", {
|
|
660
661
|
className: "lg:col-span-2 grid gap-4 sm:grid-cols-3",
|
|
661
662
|
children: [
|
|
662
|
-
/* @__PURE__ */
|
|
663
|
+
/* @__PURE__ */ S(C, {
|
|
663
664
|
className: "border-status-info-border bg-status-info-bg-subtle",
|
|
664
|
-
children: [/* @__PURE__ */
|
|
665
|
+
children: [/* @__PURE__ */ x(T, { children: /* @__PURE__ */ x(E, {
|
|
665
666
|
className: "text-status-info-text text-base",
|
|
666
667
|
children: "Diversification"
|
|
667
|
-
}) }), /* @__PURE__ */
|
|
668
|
+
}) }), /* @__PURE__ */ x(w, { children: /* @__PURE__ */ S("p", {
|
|
668
669
|
className: "text-sm text-status-info-text",
|
|
669
670
|
children: [
|
|
670
671
|
"Your estate spans ",
|
|
671
|
-
|
|
672
|
+
J,
|
|
672
673
|
" categories across ",
|
|
673
|
-
|
|
674
|
+
q,
|
|
674
675
|
" assets.",
|
|
675
676
|
" ",
|
|
676
|
-
|
|
677
|
+
ve,
|
|
677
678
|
" are currently active."
|
|
678
679
|
]
|
|
679
680
|
}) })]
|
|
680
681
|
}),
|
|
681
|
-
/* @__PURE__ */
|
|
682
|
+
/* @__PURE__ */ S(C, {
|
|
682
683
|
className: "border-status-success-border bg-status-success-bg-subtle",
|
|
683
|
-
children: [/* @__PURE__ */
|
|
684
|
+
children: [/* @__PURE__ */ x(T, { children: /* @__PURE__ */ x(E, {
|
|
684
685
|
className: "text-status-success-text text-base",
|
|
685
686
|
children: "Budget"
|
|
686
|
-
}) }), /* @__PURE__ */
|
|
687
|
+
}) }), /* @__PURE__ */ x(w, { children: /* @__PURE__ */ S("p", {
|
|
687
688
|
className: "text-sm text-status-success-text",
|
|
688
689
|
children: [
|
|
689
690
|
"$",
|
|
690
|
-
|
|
691
|
+
xe.toLocaleString(),
|
|
691
692
|
" spent of $",
|
|
692
|
-
|
|
693
|
+
be.toLocaleString(),
|
|
693
694
|
" ",
|
|
694
695
|
"allocated, leaving $",
|
|
695
|
-
|
|
696
|
+
Se.toLocaleString(),
|
|
696
697
|
" across ",
|
|
697
|
-
|
|
698
|
+
z.length,
|
|
698
699
|
" ",
|
|
699
700
|
"budgets."
|
|
700
701
|
]
|
|
701
702
|
}) })]
|
|
702
703
|
}),
|
|
703
|
-
/* @__PURE__ */
|
|
704
|
+
/* @__PURE__ */ S(C, {
|
|
704
705
|
className: "border-status-warning-border bg-status-warning-bg-subtle",
|
|
705
|
-
children: [/* @__PURE__ */
|
|
706
|
+
children: [/* @__PURE__ */ x(T, { children: /* @__PURE__ */ x(E, {
|
|
706
707
|
className: "text-status-warning-text text-base",
|
|
707
708
|
children: "Maintenance"
|
|
708
|
-
}) }), /* @__PURE__ */
|
|
709
|
+
}) }), /* @__PURE__ */ x(w, { children: /* @__PURE__ */ S("p", {
|
|
709
710
|
className: "text-sm text-status-warning-text",
|
|
710
711
|
children: [
|
|
711
|
-
|
|
712
|
+
ke.length,
|
|
712
713
|
" tasks scheduled. Total maintenance spend is $",
|
|
713
|
-
|
|
714
|
+
Ce.toLocaleString(),
|
|
714
715
|
". Stay on top of preventive maintenance."
|
|
715
716
|
]
|
|
716
717
|
}) })]
|
|
717
718
|
})
|
|
718
719
|
]
|
|
719
720
|
})]
|
|
720
|
-
}), /* @__PURE__ */
|
|
721
|
+
}), /* @__PURE__ */ S(ce, { children: [/* @__PURE__ */ x(T, {
|
|
721
722
|
className: "px-0 pt-0",
|
|
722
|
-
children: /* @__PURE__ */
|
|
723
|
+
children: /* @__PURE__ */ S(E, {
|
|
723
724
|
className: "flex items-center gap-2",
|
|
724
|
-
children: [/* @__PURE__ */ y
|
|
725
|
+
children: [/* @__PURE__ */ x(y, { className: "h-4 w-4" }), "Assets Needing Attention"]
|
|
725
726
|
})
|
|
726
|
-
}), /* @__PURE__ */
|
|
727
|
+
}), /* @__PURE__ */ x(w, {
|
|
727
728
|
className: "px-0 pb-0",
|
|
728
|
-
children:
|
|
729
|
+
children: Y.length === 0 ? /* @__PURE__ */ x(D, {
|
|
729
730
|
illustration: "empty-success",
|
|
730
731
|
title: "Everything looks healthy",
|
|
731
732
|
description: "No assets are flagged as poor, damaged or in maintenance right now."
|
|
732
|
-
}) : /* @__PURE__ */
|
|
733
|
+
}) : /* @__PURE__ */ x("div", {
|
|
733
734
|
className: "space-y-3",
|
|
734
|
-
children:
|
|
735
|
+
children: Y.slice(0, 6).map((e, t) => /* @__PURE__ */ S("div", {
|
|
735
736
|
className: "flex items-center justify-between gap-3 rounded-lg border border-border-seam bg-gloss-card p-3",
|
|
736
|
-
children: [/* @__PURE__ */
|
|
737
|
+
children: [/* @__PURE__ */ S("div", {
|
|
737
738
|
className: "flex min-w-0 items-center gap-3",
|
|
738
|
-
children: [/* @__PURE__ */
|
|
739
|
+
children: [/* @__PURE__ */ x("div", {
|
|
739
740
|
className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-action-primary-bg/10 text-xs font-medium text-primary",
|
|
740
741
|
children: t + 1
|
|
741
|
-
}), /* @__PURE__ */
|
|
742
|
+
}), /* @__PURE__ */ S("div", {
|
|
742
743
|
className: "min-w-0",
|
|
743
|
-
children: [/* @__PURE__ */
|
|
744
|
+
children: [/* @__PURE__ */ x("p", {
|
|
744
745
|
className: "truncate text-sm font-medium",
|
|
745
746
|
children: e.name
|
|
746
|
-
}), /* @__PURE__ */
|
|
747
|
+
}), /* @__PURE__ */ S("p", {
|
|
747
748
|
className: "truncate text-xs text-text-secondary capitalize",
|
|
748
749
|
children: [e.category.replace("_", " "), e.location ? ` · ${e.location}` : ""]
|
|
749
750
|
})]
|
|
750
751
|
})]
|
|
751
|
-
}), /* @__PURE__ */
|
|
752
|
+
}), /* @__PURE__ */ S("div", {
|
|
752
753
|
className: "flex shrink-0 items-center gap-2",
|
|
753
|
-
children: [/* @__PURE__ */
|
|
754
|
+
children: [/* @__PURE__ */ x(I, {
|
|
754
755
|
tone: e.condition === "damaged" ? "error" : "warning",
|
|
755
756
|
children: e.condition
|
|
756
|
-
}), /* @__PURE__ */
|
|
757
|
+
}), /* @__PURE__ */ x(I, {
|
|
757
758
|
tone: e.status === "active" ? "success" : "warning",
|
|
758
759
|
children: e.status.replace("_", " ")
|
|
759
760
|
})]
|
|
@@ -768,6 +769,6 @@ function F() {
|
|
|
768
769
|
});
|
|
769
770
|
}
|
|
770
771
|
//#endregion
|
|
771
|
-
export {
|
|
772
|
+
export { L as AnalyticsPage };
|
|
772
773
|
|
|
773
774
|
//# sourceMappingURL=AnalyticsPage.js.map
|