@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/AssetHandlerRoot.js +18 -18
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
- package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
- package/dist/assethandler/pages/AnalyticsPage.js +154 -154
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
- package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
- package/dist/assethandler/pages/DashboardPage.js +119 -119
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
- package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
- package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +29 -29
- package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
- package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
- package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
- package/dist/assethandler/pages/ProvenancePage.js +36 -36
- package/dist/assethandler/pages/SamLicensesPage.js +27 -27
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
- package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
- package/package.json +1 -1
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Box as e } from "lucide-react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { gql as t } from "@apollo/client";
|
|
3
|
+
import { useQuery as n } from "@apollo/client/react";
|
|
4
|
+
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
+
import { GlassCard as a, GradientText as o, IllustratedEmptyState as s, PagePurpose as c } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/assethandler/pages/DigitalTwinPage.tsx
|
|
7
|
-
var l =
|
|
7
|
+
var l = t`
|
|
8
8
|
query AssetHandlerDigitalTwins {
|
|
9
9
|
digitalTwins {
|
|
10
10
|
id
|
|
@@ -17,49 +17,49 @@ var l = s`
|
|
|
17
17
|
}
|
|
18
18
|
`;
|
|
19
19
|
function u() {
|
|
20
|
-
let { data:
|
|
21
|
-
return /* @__PURE__ */
|
|
20
|
+
let { data: t, loading: u } = n(l, { fetchPolicy: "cache-and-network" }), d = t?.digitalTwins ?? [];
|
|
21
|
+
return /* @__PURE__ */ i("div", {
|
|
22
22
|
className: "space-y-4 p-4",
|
|
23
23
|
children: [
|
|
24
|
-
/* @__PURE__ */
|
|
24
|
+
/* @__PURE__ */ i("h1", {
|
|
25
25
|
className: "flex items-center gap-2 text-2xl font-semibold",
|
|
26
26
|
children: [
|
|
27
|
-
/* @__PURE__ */
|
|
27
|
+
/* @__PURE__ */ r(e, { className: "h-6 w-6" }),
|
|
28
28
|
" ",
|
|
29
|
-
/* @__PURE__ */
|
|
29
|
+
/* @__PURE__ */ r(o, { children: "Digital Twin" })
|
|
30
30
|
]
|
|
31
31
|
}),
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ r(c, { children: "A live virtual replica of your most critical assets. Use digital twins to simulate what-if scenarios, validate maintenance changes, and visualise condition without touching the physical equipment — so you can de-risk decisions on high-value or hard-to-access assets." }),
|
|
33
|
+
/* @__PURE__ */ i("div", {
|
|
34
34
|
className: "grid gap-3 md:grid-cols-2",
|
|
35
35
|
children: [
|
|
36
|
-
u && d.length === 0 ? /* @__PURE__ */
|
|
36
|
+
u && d.length === 0 ? /* @__PURE__ */ r("div", {
|
|
37
37
|
className: "space-y-2 px-4 py-4",
|
|
38
|
-
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */
|
|
38
|
+
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ r("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
39
39
|
}) : null,
|
|
40
|
-
!u && d.length === 0 ? /* @__PURE__ */
|
|
40
|
+
!u && d.length === 0 ? /* @__PURE__ */ r(s, {
|
|
41
41
|
illustration: "empty-data",
|
|
42
42
|
title: "No digital twins found",
|
|
43
43
|
description: "Digital twins of your assets will appear here."
|
|
44
44
|
}) : null,
|
|
45
|
-
d.map((e,
|
|
46
|
-
treatment:
|
|
47
|
-
glow:
|
|
45
|
+
d.map((e, t) => /* @__PURE__ */ i(a, {
|
|
46
|
+
treatment: t === 0 ? "glass" : "plain",
|
|
47
|
+
glow: t === 0,
|
|
48
48
|
className: "p-4 border-border-seam",
|
|
49
49
|
children: [
|
|
50
|
-
/* @__PURE__ */
|
|
50
|
+
/* @__PURE__ */ i("p", {
|
|
51
51
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
52
52
|
children: ["Asset ", e.assetId]
|
|
53
53
|
}),
|
|
54
|
-
/* @__PURE__ */
|
|
54
|
+
/* @__PURE__ */ r("h2", {
|
|
55
55
|
className: "mt-1 text-base font-semibold",
|
|
56
56
|
children: e.modelRef
|
|
57
57
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ i("p", {
|
|
59
59
|
className: "mt-1 text-sm text-text-secondary",
|
|
60
60
|
children: ["Fidelity: ", e.fidelityLevel]
|
|
61
61
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ i("p", {
|
|
63
63
|
className: "mt-1 text-sm text-text-secondary",
|
|
64
64
|
children: ["Geometry: ", e.geometryRef ?? "Not linked"]
|
|
65
65
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useState as e } from "react";
|
|
2
2
|
import { Radar as t } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { gql as n } from "@apollo/client";
|
|
4
|
+
import { useMutation as r, useQuery as i } from "@apollo/client/react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { EmphasisPanel as s, GradientText as c, IllustratedEmptyState as l, PagePurpose as u } from "@burdenoff/fe-libs/ui";
|
|
7
7
|
//#region src/assethandler/pages/DiscoveryJobsPage.tsx
|
|
8
|
-
var d =
|
|
8
|
+
var d = n`
|
|
9
9
|
query AssetHandlerDiscoveryJobs {
|
|
10
10
|
discoveryJobs {
|
|
11
11
|
id
|
|
@@ -17,7 +17,7 @@ var d = c`
|
|
|
17
17
|
completedAt
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
`, f =
|
|
20
|
+
`, f = n`
|
|
21
21
|
mutation AssetHandlerStartDiscoveryJob($input: StartDiscoveryJobInput!) {
|
|
22
22
|
startDiscoveryJob(input: $input) {
|
|
23
23
|
id
|
|
@@ -25,46 +25,46 @@ var d = c`
|
|
|
25
25
|
}
|
|
26
26
|
`;
|
|
27
27
|
function p() {
|
|
28
|
-
let [
|
|
28
|
+
let [n, p] = e("Nightly Datacenter Scan"), [m, h] = e("aws-ap-south-1"), { data: g, loading: _, refetch: v } = i(d, { fetchPolicy: "cache-and-network" }), [y, { loading: b }] = r(f, { onCompleted: () => {
|
|
29
29
|
v();
|
|
30
30
|
} }), x = g?.discoveryJobs ?? [];
|
|
31
|
-
return /* @__PURE__ */
|
|
31
|
+
return /* @__PURE__ */ o("div", {
|
|
32
32
|
className: "space-y-4 p-4",
|
|
33
33
|
children: [
|
|
34
|
-
/* @__PURE__ */
|
|
34
|
+
/* @__PURE__ */ o("h1", {
|
|
35
35
|
className: "flex items-center gap-2 text-2xl font-semibold",
|
|
36
36
|
children: [
|
|
37
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ a(t, { className: "h-6 w-6" }),
|
|
38
38
|
" ",
|
|
39
|
-
/* @__PURE__ */
|
|
39
|
+
/* @__PURE__ */ a(c, { children: "Discovery Jobs" })
|
|
40
40
|
]
|
|
41
41
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
/* @__PURE__ */ s
|
|
42
|
+
/* @__PURE__ */ a(u, { children: "Automatically find assets across your cloud and on-prem environments instead of entering them by hand. Point a discovery job at a source (e.g. an AWS region) and it scans for new or changed assets and feeds them into your inventory — keeping the estate complete and up to date." }),
|
|
43
|
+
/* @__PURE__ */ o(s, { children: [/* @__PURE__ */ a("h2", {
|
|
44
44
|
className: "text-sm font-semibold mb-3",
|
|
45
45
|
children: "Start a discovery scan"
|
|
46
|
-
}), /* @__PURE__ */
|
|
46
|
+
}), /* @__PURE__ */ o("form", {
|
|
47
47
|
className: "grid gap-3 md:grid-cols-3",
|
|
48
48
|
onSubmit: (e) => {
|
|
49
49
|
e.preventDefault(), y({ variables: { input: {
|
|
50
|
-
name:
|
|
50
|
+
name: n,
|
|
51
51
|
source: m
|
|
52
52
|
} } });
|
|
53
53
|
},
|
|
54
54
|
children: [
|
|
55
|
-
/* @__PURE__ */
|
|
55
|
+
/* @__PURE__ */ a("input", {
|
|
56
56
|
className: "rounded-md border px-3 py-2",
|
|
57
|
-
value:
|
|
57
|
+
value: n,
|
|
58
58
|
onChange: (e) => p(e.target.value),
|
|
59
59
|
placeholder: "Job name"
|
|
60
60
|
}),
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ a("input", {
|
|
62
62
|
className: "rounded-md border px-3 py-2",
|
|
63
63
|
value: m,
|
|
64
64
|
onChange: (e) => h(e.target.value),
|
|
65
65
|
placeholder: "Discovery source"
|
|
66
66
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ a("button", {
|
|
68
68
|
className: "rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text",
|
|
69
69
|
disabled: b,
|
|
70
70
|
type: "submit",
|
|
@@ -72,39 +72,39 @@ function p() {
|
|
|
72
72
|
})
|
|
73
73
|
]
|
|
74
74
|
})] }),
|
|
75
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ o("div", {
|
|
76
76
|
className: "rounded-lg border",
|
|
77
77
|
children: [
|
|
78
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ o("div", {
|
|
79
79
|
className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary",
|
|
80
80
|
children: [
|
|
81
|
-
/* @__PURE__ */
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
/* @__PURE__ */
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
-
/* @__PURE__ */
|
|
81
|
+
/* @__PURE__ */ a("span", { children: "Name" }),
|
|
82
|
+
/* @__PURE__ */ a("span", { children: "Source" }),
|
|
83
|
+
/* @__PURE__ */ a("span", { children: "Status" }),
|
|
84
|
+
/* @__PURE__ */ a("span", { children: "Discovered" }),
|
|
85
|
+
/* @__PURE__ */ a("span", { children: "Started" })
|
|
86
86
|
]
|
|
87
87
|
}),
|
|
88
|
-
_ && x.length === 0 ? /* @__PURE__ */
|
|
88
|
+
_ && x.length === 0 ? /* @__PURE__ */ a("div", {
|
|
89
89
|
className: "space-y-2 px-4 py-4",
|
|
90
|
-
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */
|
|
90
|
+
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ a("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
91
91
|
}) : null,
|
|
92
|
-
!_ && x.length === 0 ? /* @__PURE__ */
|
|
92
|
+
!_ && x.length === 0 ? /* @__PURE__ */ a(l, {
|
|
93
93
|
illustration: "empty-data",
|
|
94
94
|
title: "No discovery jobs found",
|
|
95
95
|
description: "Run a discovery job to populate this list."
|
|
96
96
|
}) : null,
|
|
97
|
-
x.map((e) => /* @__PURE__ */
|
|
97
|
+
x.map((e) => /* @__PURE__ */ o("div", {
|
|
98
98
|
className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0",
|
|
99
99
|
children: [
|
|
100
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ a("span", {
|
|
101
101
|
className: "font-medium",
|
|
102
102
|
children: e.name
|
|
103
103
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
105
|
-
/* @__PURE__ */
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ a("span", { children: e.source }),
|
|
105
|
+
/* @__PURE__ */ a("span", { children: e.status }),
|
|
106
|
+
/* @__PURE__ */ a("span", { children: e.assetsDiscovered }),
|
|
107
|
+
/* @__PURE__ */ a("span", {
|
|
108
108
|
className: "text-text-secondary",
|
|
109
109
|
children: e.startedAt ? new Date(e.startedAt).toLocaleString() : "n/a"
|
|
110
110
|
})
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useState as e } from "react";
|
|
2
2
|
import { Leaf as t } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { gql as n } from "@apollo/client";
|
|
4
|
+
import { useMutation as r, useQuery as i } from "@apollo/client/react";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { EmphasisPanel as s, GradientText as c, IllustratedEmptyState as l, PagePurpose as u } from "@burdenoff/fe-libs/ui";
|
|
7
7
|
//#region src/assethandler/pages/EsgDashboardPage.tsx
|
|
8
|
-
var d =
|
|
8
|
+
var d = n`
|
|
9
9
|
query AssetHandlerEsgMetrics {
|
|
10
10
|
esgMetrics {
|
|
11
11
|
id
|
|
@@ -20,7 +20,7 @@ var d = c`
|
|
|
20
20
|
periodEnd
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
`, f =
|
|
23
|
+
`, f = n`
|
|
24
24
|
mutation AssetHandlerUpsertEsgMetric($input: UpsertEsgMetricInput!) {
|
|
25
25
|
upsertEsgMetric(input: $input) {
|
|
26
26
|
id
|
|
@@ -28,53 +28,53 @@ var d = c`
|
|
|
28
28
|
}
|
|
29
29
|
`;
|
|
30
30
|
function p() {
|
|
31
|
-
let [
|
|
31
|
+
let [n, p] = e("42.5"), { data: m, loading: h, refetch: g } = i(d, { fetchPolicy: "cache-and-network" }), [_, { loading: v }] = r(f, { onCompleted: () => {
|
|
32
32
|
g();
|
|
33
33
|
} }), y = m?.esgMetrics ?? [];
|
|
34
|
-
return /* @__PURE__ */
|
|
34
|
+
return /* @__PURE__ */ o("div", {
|
|
35
35
|
className: "space-y-4 p-4",
|
|
36
36
|
children: [
|
|
37
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ o("h1", {
|
|
38
38
|
className: "flex items-center gap-2 text-2xl font-semibold",
|
|
39
39
|
children: [
|
|
40
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ a(t, { className: "h-6 w-6" }),
|
|
41
41
|
" ",
|
|
42
|
-
/* @__PURE__ */
|
|
42
|
+
/* @__PURE__ */ a(c, { children: "ESG Dashboard" })
|
|
43
43
|
]
|
|
44
44
|
}),
|
|
45
|
-
/* @__PURE__ */
|
|
46
|
-
/* @__PURE__ */ s
|
|
45
|
+
/* @__PURE__ */ a(u, { children: "Measure the environmental and governance impact of your asset estate against targets — energy use, carbon emissions, responsible disposal. Record metrics here to track progress toward sustainability goals and produce the evidence ESG reporting and audits require." }),
|
|
46
|
+
/* @__PURE__ */ o(s, { children: [/* @__PURE__ */ a("h2", {
|
|
47
47
|
className: "text-sm font-semibold mb-3",
|
|
48
48
|
children: "Record an ESG metric"
|
|
49
|
-
}), /* @__PURE__ */
|
|
49
|
+
}), /* @__PURE__ */ o("form", {
|
|
50
50
|
className: "grid gap-3 md:grid-cols-4",
|
|
51
51
|
onSubmit: (e) => {
|
|
52
52
|
e.preventDefault();
|
|
53
|
-
let t = new Date((/* @__PURE__ */ new Date()).getFullYear(), (/* @__PURE__ */ new Date()).getMonth(), 1).toISOString(),
|
|
53
|
+
let t = new Date((/* @__PURE__ */ new Date()).getFullYear(), (/* @__PURE__ */ new Date()).getMonth(), 1).toISOString(), r = (/* @__PURE__ */ new Date()).toISOString();
|
|
54
54
|
_({ variables: { input: {
|
|
55
55
|
metricKey: "carbon-footprint-scope2",
|
|
56
56
|
metricName: "Scope 2 Carbon Emissions",
|
|
57
57
|
category: "environment",
|
|
58
58
|
unit: "tCO2e",
|
|
59
|
-
value: Number(
|
|
59
|
+
value: Number(n),
|
|
60
60
|
target: 40,
|
|
61
61
|
trend: "improving",
|
|
62
62
|
periodStart: t,
|
|
63
|
-
periodEnd:
|
|
63
|
+
periodEnd: r
|
|
64
64
|
} } });
|
|
65
65
|
},
|
|
66
66
|
children: [
|
|
67
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ a("input", {
|
|
68
68
|
className: "rounded-md border px-3 py-2",
|
|
69
|
-
value:
|
|
69
|
+
value: n,
|
|
70
70
|
onChange: (e) => p(e.target.value),
|
|
71
71
|
"aria-label": "Metric value"
|
|
72
72
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
73
|
+
/* @__PURE__ */ a("div", {
|
|
74
74
|
className: "text-sm text-text-secondary md:col-span-2",
|
|
75
75
|
children: "Metric: Scope 2 Carbon Emissions (monthly)"
|
|
76
76
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
77
|
+
/* @__PURE__ */ a("button", {
|
|
78
78
|
className: "rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text",
|
|
79
79
|
disabled: v,
|
|
80
80
|
type: "submit",
|
|
@@ -82,45 +82,45 @@ function p() {
|
|
|
82
82
|
})
|
|
83
83
|
]
|
|
84
84
|
})] }),
|
|
85
|
-
/* @__PURE__ */
|
|
85
|
+
/* @__PURE__ */ o("div", {
|
|
86
86
|
className: "grid gap-3 md:grid-cols-2",
|
|
87
87
|
children: [
|
|
88
|
-
h && y.length === 0 ? /* @__PURE__ */
|
|
88
|
+
h && y.length === 0 ? /* @__PURE__ */ a("div", {
|
|
89
89
|
className: "space-y-2 px-4 py-4",
|
|
90
|
-
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */
|
|
90
|
+
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ a("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
91
91
|
}) : null,
|
|
92
|
-
!h && y.length === 0 ? /* @__PURE__ */
|
|
92
|
+
!h && y.length === 0 ? /* @__PURE__ */ a(l, {
|
|
93
93
|
illustration: "empty-data",
|
|
94
94
|
title: "No ESG metrics recorded yet",
|
|
95
95
|
description: "Sustainability and ESG metrics will appear here once recorded."
|
|
96
96
|
}) : null,
|
|
97
|
-
y.map((e) => /* @__PURE__ */
|
|
97
|
+
y.map((e) => /* @__PURE__ */ o("article", {
|
|
98
98
|
className: "rounded-lg border p-4",
|
|
99
99
|
children: [
|
|
100
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ a("p", {
|
|
101
101
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
102
102
|
children: e.category
|
|
103
103
|
}),
|
|
104
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ a("h2", {
|
|
105
105
|
className: "mt-1 text-base font-semibold",
|
|
106
106
|
children: e.metricName
|
|
107
107
|
}),
|
|
108
|
-
/* @__PURE__ */
|
|
108
|
+
/* @__PURE__ */ o("p", {
|
|
109
109
|
className: "mt-2 text-sm",
|
|
110
110
|
children: [
|
|
111
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ a("span", {
|
|
112
112
|
className: "font-semibold",
|
|
113
113
|
children: e.value
|
|
114
114
|
}),
|
|
115
115
|
" ",
|
|
116
116
|
e.unit,
|
|
117
|
-
e.target === null ? null : /* @__PURE__ */
|
|
117
|
+
e.target === null ? null : /* @__PURE__ */ o("span", {
|
|
118
118
|
className: "text-text-secondary",
|
|
119
119
|
children: [" / target ", e.target]
|
|
120
120
|
})
|
|
121
121
|
]
|
|
122
122
|
}),
|
|
123
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ o("p", {
|
|
124
124
|
className: "mt-1 text-xs text-text-secondary",
|
|
125
125
|
children: ["Trend: ", e.trend ?? "stable"]
|
|
126
126
|
})
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { jsx as
|
|
2
|
+
import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
|
|
3
|
+
import { ArrowLeft as n, Edit as r } from "lucide-react";
|
|
4
|
+
import { useParams as i } from "react-router-dom";
|
|
5
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as s, Button as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, EmphasisPanel as m, GradientText as h, IllustratedEmptyState as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/assethandler/pages/FinanceBudgetDetailPage.tsx
|
|
7
8
|
function v() {
|
|
8
|
-
let v =
|
|
9
|
-
if (!S) return /* @__PURE__ */
|
|
9
|
+
let v = t(), { budgetId: y } = i(), { budgets: b, transactions: x } = e(), S = b.find((e) => e.id === y) ?? b[0];
|
|
10
|
+
if (!S) return /* @__PURE__ */ a("div", {
|
|
10
11
|
className: "p-6",
|
|
11
|
-
children: /* @__PURE__ */ g
|
|
12
|
+
children: /* @__PURE__ */ a(g, {
|
|
12
13
|
illustration: "empty-search",
|
|
13
14
|
title: "Budget not found",
|
|
14
15
|
description: "This budget may have been archived or removed. Return to the finance hub to find it.",
|
|
15
|
-
action: /* @__PURE__ */
|
|
16
|
+
action: /* @__PURE__ */ a(c, {
|
|
16
17
|
size: "sm",
|
|
17
18
|
onClick: () => v("/finance/finance-hub"),
|
|
18
19
|
children: "Back to finance"
|
|
@@ -20,28 +21,28 @@ function v() {
|
|
|
20
21
|
})
|
|
21
22
|
});
|
|
22
23
|
let C = x.filter((e) => e.category === S.category), w = Math.round(S.spent / S.allocated * 100);
|
|
23
|
-
return /* @__PURE__ */
|
|
24
|
+
return /* @__PURE__ */ o("div", {
|
|
24
25
|
className: "space-y-6 p-6",
|
|
25
26
|
children: [
|
|
26
|
-
/* @__PURE__ */
|
|
27
|
+
/* @__PURE__ */ o("div", {
|
|
27
28
|
className: "flex items-center justify-between",
|
|
28
|
-
children: [/* @__PURE__ */
|
|
29
|
+
children: [/* @__PURE__ */ o("div", {
|
|
29
30
|
className: "flex items-center gap-4",
|
|
30
|
-
children: [/* @__PURE__ */
|
|
31
|
+
children: [/* @__PURE__ */ a(c, {
|
|
31
32
|
variant: "ghost",
|
|
32
33
|
size: "icon",
|
|
33
34
|
onClick: () => v("/finance/finance-hub"),
|
|
34
|
-
children: /* @__PURE__ */
|
|
35
|
-
}), /* @__PURE__ */
|
|
35
|
+
children: /* @__PURE__ */ a(n, { className: "h-4 w-4" })
|
|
36
|
+
}), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("div", {
|
|
36
37
|
className: "flex items-center gap-3",
|
|
37
|
-
children: [/* @__PURE__ */
|
|
38
|
+
children: [/* @__PURE__ */ a("h1", {
|
|
38
39
|
className: "text-2xl font-bold",
|
|
39
|
-
children: /* @__PURE__ */
|
|
40
|
-
}), /* @__PURE__ */
|
|
40
|
+
children: /* @__PURE__ */ a(h, { children: S.name })
|
|
41
|
+
}), /* @__PURE__ */ a(s, {
|
|
41
42
|
variant: S.status === "over_budget" ? "destructive" : S.status === "under_budget" ? "secondary" : "default",
|
|
42
43
|
children: S.status.replace("_", " ")
|
|
43
44
|
})]
|
|
44
|
-
}), /* @__PURE__ */
|
|
45
|
+
}), /* @__PURE__ */ o("p", {
|
|
45
46
|
className: "text-sm text-text-secondary mt-1",
|
|
46
47
|
children: [
|
|
47
48
|
S.department,
|
|
@@ -49,66 +50,66 @@ function v() {
|
|
|
49
50
|
S.period
|
|
50
51
|
]
|
|
51
52
|
})] })]
|
|
52
|
-
}), /* @__PURE__ */
|
|
53
|
+
}), /* @__PURE__ */ o(c, {
|
|
53
54
|
size: "sm",
|
|
54
|
-
children: [/* @__PURE__ */
|
|
55
|
+
children: [/* @__PURE__ */ a(r, { className: "mr-2 h-4 w-4" }), "Edit Budget"]
|
|
55
56
|
})]
|
|
56
57
|
}),
|
|
57
|
-
/* @__PURE__ */
|
|
58
|
-
/* @__PURE__ */
|
|
58
|
+
/* @__PURE__ */ a(_, { children: "Drill into a single budget to see exactly how it is being consumed: what was allocated, what has been spent, what remains, and every transaction charged against it. Use it to catch overruns early and decide whether to reallocate, cut spend or top up." }),
|
|
59
|
+
/* @__PURE__ */ o("div", {
|
|
59
60
|
className: "grid gap-4 md:grid-cols-3",
|
|
60
61
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
+
/* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
|
|
62
63
|
className: "pt-4",
|
|
63
|
-
children: [/* @__PURE__ */
|
|
64
|
+
children: [/* @__PURE__ */ a("p", {
|
|
64
65
|
className: "text-sm text-text-secondary",
|
|
65
66
|
children: "Allocated"
|
|
66
|
-
}), /* @__PURE__ */
|
|
67
|
+
}), /* @__PURE__ */ o("p", {
|
|
67
68
|
className: "text-2xl font-bold tabular-nums",
|
|
68
69
|
children: ["$", S.allocated.toLocaleString()]
|
|
69
70
|
})]
|
|
70
71
|
}) }),
|
|
71
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
|
|
72
73
|
className: "pt-4",
|
|
73
74
|
children: [
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ a("p", {
|
|
75
76
|
className: "text-sm text-text-secondary",
|
|
76
77
|
children: "Spent"
|
|
77
78
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ o("p", {
|
|
79
80
|
className: "text-2xl font-bold tabular-nums",
|
|
80
81
|
children: ["$", S.spent.toLocaleString()]
|
|
81
82
|
}),
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
+
/* @__PURE__ */ o("p", {
|
|
83
84
|
className: "text-xs text-text-secondary",
|
|
84
85
|
children: [w, "% utilized"]
|
|
85
86
|
})
|
|
86
87
|
]
|
|
87
88
|
}) }),
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
+
/* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
|
|
89
90
|
className: "pt-4",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
91
|
+
children: [/* @__PURE__ */ a("p", {
|
|
91
92
|
className: "text-sm text-text-secondary",
|
|
92
93
|
children: "Remaining"
|
|
93
|
-
}), /* @__PURE__ */
|
|
94
|
+
}), /* @__PURE__ */ o("p", {
|
|
94
95
|
className: `text-2xl font-bold ${S.remaining < 0 ? "text-status-error-text" : "text-status-success-text"}`,
|
|
95
96
|
children: ["$", S.remaining.toLocaleString()]
|
|
96
97
|
})]
|
|
97
98
|
}) })
|
|
98
99
|
]
|
|
99
100
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ o(m, { children: [/* @__PURE__ */ a(f, {
|
|
101
102
|
className: "px-0 pt-0",
|
|
102
|
-
children: /* @__PURE__ */
|
|
103
|
-
}), /* @__PURE__ */
|
|
103
|
+
children: /* @__PURE__ */ a(p, { children: "Budget Utilization" })
|
|
104
|
+
}), /* @__PURE__ */ o(u, {
|
|
104
105
|
className: "px-0 pb-0",
|
|
105
|
-
children: [/* @__PURE__ */
|
|
106
|
+
children: [/* @__PURE__ */ a("div", {
|
|
106
107
|
className: "h-4 rounded-full bg-bg-sunken overflow-hidden",
|
|
107
|
-
children: /* @__PURE__ */
|
|
108
|
+
children: /* @__PURE__ */ a("div", {
|
|
108
109
|
className: `h-full rounded-full transition-all ${S.status === "over_budget" ? "bg-status-error-bg" : "bg-action-primary-bg"}`,
|
|
109
110
|
style: { width: `${Math.min(w, 100)}%` }
|
|
110
111
|
})
|
|
111
|
-
}), /* @__PURE__ */
|
|
112
|
+
}), /* @__PURE__ */ o("p", {
|
|
112
113
|
className: "text-sm text-text-secondary mt-2",
|
|
113
114
|
children: [
|
|
114
115
|
w,
|
|
@@ -118,69 +119,69 @@ function v() {
|
|
|
118
119
|
]
|
|
119
120
|
})]
|
|
120
121
|
})] }),
|
|
121
|
-
/* @__PURE__ */
|
|
122
|
+
/* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o(f, { children: [/* @__PURE__ */ a(p, { children: "Related Transactions" }), /* @__PURE__ */ o(d, { children: [
|
|
122
123
|
"Transactions in ",
|
|
123
124
|
S.category,
|
|
124
125
|
" category"
|
|
125
|
-
] })] }), /* @__PURE__ */
|
|
126
|
+
] })] }), /* @__PURE__ */ a(u, {
|
|
126
127
|
className: "p-0",
|
|
127
|
-
children: /* @__PURE__ */
|
|
128
|
+
children: /* @__PURE__ */ o("div", {
|
|
128
129
|
className: "overflow-x-auto",
|
|
129
|
-
children: [/* @__PURE__ */
|
|
130
|
+
children: [/* @__PURE__ */ o("table", {
|
|
130
131
|
className: "w-full text-sm",
|
|
131
|
-
children: [/* @__PURE__ */
|
|
132
|
+
children: [/* @__PURE__ */ a("thead", { children: /* @__PURE__ */ o("tr", {
|
|
132
133
|
className: "border-b bg-bg-sunken/50",
|
|
133
134
|
children: [
|
|
134
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ a("th", {
|
|
135
136
|
className: "text-left p-3 font-medium",
|
|
136
137
|
children: "ID"
|
|
137
138
|
}),
|
|
138
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ a("th", {
|
|
139
140
|
className: "text-left p-3 font-medium",
|
|
140
141
|
children: "Description"
|
|
141
142
|
}),
|
|
142
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ a("th", {
|
|
143
144
|
className: "text-right p-3 font-medium",
|
|
144
145
|
children: "Amount"
|
|
145
146
|
}),
|
|
146
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ a("th", {
|
|
147
148
|
className: "text-left p-3 font-medium",
|
|
148
149
|
children: "Status"
|
|
149
150
|
}),
|
|
150
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ a("th", {
|
|
151
152
|
className: "text-left p-3 font-medium",
|
|
152
153
|
children: "Date"
|
|
153
154
|
})
|
|
154
155
|
]
|
|
155
|
-
}) }), /* @__PURE__ */
|
|
156
|
+
}) }), /* @__PURE__ */ a("tbody", { children: C.map((e) => /* @__PURE__ */ o("tr", {
|
|
156
157
|
className: "border-b hover:bg-bg-sunken/50",
|
|
157
158
|
children: [
|
|
158
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ a("td", {
|
|
159
160
|
className: "p-3 font-mono text-xs",
|
|
160
161
|
children: e.id
|
|
161
162
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ a("td", {
|
|
163
164
|
className: "p-3 truncate max-w-xs",
|
|
164
165
|
children: e.description
|
|
165
166
|
}),
|
|
166
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ o("td", {
|
|
167
168
|
className: "p-3 text-right font-medium",
|
|
168
169
|
children: ["$", Math.abs(e.amount).toLocaleString()]
|
|
169
170
|
}),
|
|
170
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ a("td", {
|
|
171
172
|
className: "p-3",
|
|
172
|
-
children: /* @__PURE__ */
|
|
173
|
+
children: /* @__PURE__ */ a(s, {
|
|
173
174
|
variant: "outline",
|
|
174
175
|
children: e.status
|
|
175
176
|
})
|
|
176
177
|
}),
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
+
/* @__PURE__ */ a("td", {
|
|
178
179
|
className: "p-3 text-xs",
|
|
179
180
|
children: new Date(e.date).toLocaleDateString()
|
|
180
181
|
})
|
|
181
182
|
]
|
|
182
183
|
}, e.id)) })]
|
|
183
|
-
}), C.length === 0 && /* @__PURE__ */ g
|
|
184
|
+
}), C.length === 0 && /* @__PURE__ */ a(g, {
|
|
184
185
|
illustration: "empty-data",
|
|
185
186
|
title: "No related transactions",
|
|
186
187
|
description: `No spend has been charged to the ${S.category} category yet.`
|