@burdenoff/microfe-assethandler 2026.703.1 → 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/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +154 -154
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- 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/AssetsAssetTrackingPage.js.map +1 -1
- 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/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- 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/ItilChangeManagementPage.js.map +1 -1
- 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/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +113 -114
- 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/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- 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/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +36 -36
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- 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/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { AssetHandlerProvider as e } from "./providers/AssetHandlerProvider.js";
|
|
2
|
+
import { joinPath as t } from "./utils/navigation.js";
|
|
3
|
+
import { AssetHandlerRoutes as n } from "./AssetHandlerRoutes.js";
|
|
4
4
|
import { useEffect as r } from "react";
|
|
5
5
|
import { Boxes as i, BrainCircuit as a, Cpu as o, KeyRound as s, Leaf as c, Network as l, Radar as u, ShieldCheck as d } from "lucide-react";
|
|
6
6
|
import { jsx as f } from "react/jsx-runtime";
|
|
@@ -26,86 +26,86 @@ var m = (m) => {
|
|
|
26
26
|
{
|
|
27
27
|
id: "assethandler-assets",
|
|
28
28
|
label: "Assets",
|
|
29
|
-
path:
|
|
29
|
+
path: t(_, "assets/asset-list"),
|
|
30
30
|
order: 1
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
id: "assethandler-operations",
|
|
34
34
|
label: "Operations",
|
|
35
|
-
path:
|
|
35
|
+
path: t(_, "operations/operations-hub"),
|
|
36
36
|
order: 2
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
id: "assethandler-itil",
|
|
40
40
|
label: "ITIL",
|
|
41
|
-
path:
|
|
41
|
+
path: t(_, "itil/itilhub"),
|
|
42
42
|
order: 3
|
|
43
43
|
},
|
|
44
44
|
{
|
|
45
45
|
id: "assethandler-finance",
|
|
46
46
|
label: "Finance",
|
|
47
|
-
path:
|
|
47
|
+
path: t(_, "finance/finance-hub"),
|
|
48
48
|
order: 4
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
id: "assethandler-security",
|
|
52
52
|
label: "Security",
|
|
53
|
-
path:
|
|
53
|
+
path: t(_, "security/security-hub"),
|
|
54
54
|
order: 7
|
|
55
55
|
},
|
|
56
56
|
{
|
|
57
57
|
id: "assethandler-iot",
|
|
58
58
|
label: "IoT Devices",
|
|
59
|
-
path:
|
|
59
|
+
path: t(_, "advanced/iot-devices"),
|
|
60
60
|
icon: /* @__PURE__ */ f(o, { size: 16 }),
|
|
61
61
|
order: 10
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
id: "assethandler-digital-twin",
|
|
65
65
|
label: "Digital Twin",
|
|
66
|
-
path:
|
|
66
|
+
path: t(_, "advanced/digital-twin"),
|
|
67
67
|
icon: /* @__PURE__ */ f(i, { size: 16 }),
|
|
68
68
|
order: 11
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
id: "assethandler-sam",
|
|
72
72
|
label: "SAM",
|
|
73
|
-
path:
|
|
73
|
+
path: t(_, "advanced/sam-licenses"),
|
|
74
74
|
icon: /* @__PURE__ */ f(s, { size: 16 }),
|
|
75
75
|
order: 12
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
id: "assethandler-cmdb",
|
|
79
79
|
label: "CMDB",
|
|
80
|
-
path:
|
|
80
|
+
path: t(_, "advanced/cmdb-browser"),
|
|
81
81
|
icon: /* @__PURE__ */ f(l, { size: 16 }),
|
|
82
82
|
order: 13
|
|
83
83
|
},
|
|
84
84
|
{
|
|
85
85
|
id: "assethandler-discovery",
|
|
86
86
|
label: "Discovery",
|
|
87
|
-
path:
|
|
87
|
+
path: t(_, "advanced/discovery-jobs"),
|
|
88
88
|
icon: /* @__PURE__ */ f(u, { size: 16 }),
|
|
89
89
|
order: 14
|
|
90
90
|
},
|
|
91
91
|
{
|
|
92
92
|
id: "assethandler-provenance",
|
|
93
93
|
label: "Provenance",
|
|
94
|
-
path:
|
|
94
|
+
path: t(_, "advanced/provenance"),
|
|
95
95
|
icon: /* @__PURE__ */ f(d, { size: 16 }),
|
|
96
96
|
order: 15
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
id: "assethandler-esg",
|
|
100
100
|
label: "ESG",
|
|
101
|
-
path:
|
|
101
|
+
path: t(_, "advanced/esg-dashboard"),
|
|
102
102
|
icon: /* @__PURE__ */ f(c, { size: 16 }),
|
|
103
103
|
order: 16
|
|
104
104
|
},
|
|
105
105
|
{
|
|
106
106
|
id: "assethandler-ai",
|
|
107
107
|
label: "AI Predictions",
|
|
108
|
-
path:
|
|
108
|
+
path: t(_, "advanced/ai-predictions"),
|
|
109
109
|
icon: /* @__PURE__ */ f(a, { size: 16 }),
|
|
110
110
|
order: 17
|
|
111
111
|
}
|
|
@@ -123,9 +123,9 @@ var m = (m) => {
|
|
|
123
123
|
workspaceId: null,
|
|
124
124
|
gateway: "global",
|
|
125
125
|
defaultEnabled: !0,
|
|
126
|
-
children: /* @__PURE__ */ f(
|
|
126
|
+
children: /* @__PURE__ */ f(e, {
|
|
127
127
|
...m,
|
|
128
|
-
children: /* @__PURE__ */ f(
|
|
128
|
+
children: /* @__PURE__ */ f(n, {})
|
|
129
129
|
})
|
|
130
130
|
});
|
|
131
131
|
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { useAssetHandler as e } from "../providers/AssetHandlerProvider.js";
|
|
2
|
+
import { joinPath as t } from "../utils/navigation.js";
|
|
3
|
+
import { useCallback as n } from "react";
|
|
4
|
+
import { useNavigate as r } from "react-router-dom";
|
|
5
|
+
//#region src/assethandler/hooks/useAssetHandlerNavigate.ts
|
|
6
|
+
function i() {
|
|
7
|
+
let i = r(), { basePath: a = "/" } = e();
|
|
8
|
+
return n((e, n) => {
|
|
9
|
+
if (typeof e == "number") {
|
|
10
|
+
i(e);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
i(e.startsWith("/") ? t(a, e) : e, n);
|
|
14
|
+
}, [i, a]);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { i as useAssetHandlerNavigate };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=useAssetHandlerNavigate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useAssetHandlerNavigate.js","names":[],"sources":["../../../src/assethandler/hooks/useAssetHandlerNavigate.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useNavigate, type NavigateOptions } from 'react-router-dom';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\nimport { joinPath } from '../utils/navigation';\n\n/**\n * Base-path-aware navigation for in-MFE links.\n *\n * The AssetHandler MFE is mounted under a host base path (e.g. `/assethandler`)\n * when integrated into an app shell, or at `/` when running standalone. React\n * Router's `navigate('/assets/...')` resolves against the HOST router root, so\n * an absolute in-MFE path would escape the mount and land on a nonexistent host\n * route (which the shell bounces to `/dashboard`).\n *\n * This hook prefixes the active `basePath` onto absolute string targets so\n * `navigate('/assets/asset-create')` correctly resolves to\n * `/assethandler/assets/asset-create` when integrated and `/assets/asset-create`\n * when standalone. Relative paths and numeric deltas (`navigate(-1)`) pass\n * through untouched.\n */\nexport function useAssetHandlerNavigate() {\n const navigate = useNavigate();\n const { basePath = '/' } = useAssetHandler();\n\n return useCallback(\n (to: string | number, options?: NavigateOptions) => {\n if (typeof to === 'number') {\n navigate(to);\n return;\n }\n const resolved = to.startsWith('/') ? joinPath(basePath, to) : to;\n navigate(resolved, options);\n },\n [navigate, basePath],\n );\n}\n"],"mappings":";;;;;AAoBA,SAAgB,IAA0B;CACxC,IAAM,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAiB;AAE5C,QAAO,GACJ,GAAqB,MAA8B;AAClD,MAAI,OAAO,KAAO,UAAU;AAC1B,KAAS,EAAG;AACZ;;AAGF,IADiB,EAAG,WAAW,IAAI,GAAG,EAAS,GAAU,EAAG,GAAG,GAC5C,EAAQ;IAE7B,CAAC,GAAU,EAAS,CACrB"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useState as e } from "react";
|
|
2
2
|
import { BrainCircuit 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/AiPredictionsPage.tsx
|
|
8
|
-
var d =
|
|
8
|
+
var d = n`
|
|
9
9
|
query AssetHandlerAiPredictions {
|
|
10
10
|
aiPredictions {
|
|
11
11
|
id
|
|
@@ -18,7 +18,7 @@ var d = c`
|
|
|
18
18
|
modelVersion
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
`, f =
|
|
21
|
+
`, f = n`
|
|
22
22
|
mutation AssetHandlerRequestAiPrediction($input: RequestAIPredictionInput!) {
|
|
23
23
|
requestAIPrediction(input: $input) {
|
|
24
24
|
id
|
|
@@ -26,29 +26,29 @@ var d = c`
|
|
|
26
26
|
}
|
|
27
27
|
`;
|
|
28
28
|
function p() {
|
|
29
|
-
let [
|
|
29
|
+
let [n, p] = e("AST-001"), { data: m, loading: h, refetch: g } = i(d, { fetchPolicy: "cache-and-network" }), [_, { loading: v }] = r(f, { onCompleted: () => {
|
|
30
30
|
g();
|
|
31
31
|
} }), y = m?.aiPredictions ?? [];
|
|
32
|
-
return /* @__PURE__ */
|
|
32
|
+
return /* @__PURE__ */ o("div", {
|
|
33
33
|
className: "space-y-4 p-4",
|
|
34
34
|
children: [
|
|
35
|
-
/* @__PURE__ */
|
|
35
|
+
/* @__PURE__ */ o("h1", {
|
|
36
36
|
className: "flex items-center gap-2 text-2xl font-semibold",
|
|
37
37
|
children: [
|
|
38
|
-
/* @__PURE__ */
|
|
38
|
+
/* @__PURE__ */ a(t, { className: "h-6 w-6" }),
|
|
39
39
|
" ",
|
|
40
|
-
/* @__PURE__ */
|
|
40
|
+
/* @__PURE__ */ a(c, { children: "AI Predictions" })
|
|
41
41
|
]
|
|
42
42
|
}),
|
|
43
|
-
/* @__PURE__ */
|
|
44
|
-
/* @__PURE__ */ s
|
|
43
|
+
/* @__PURE__ */ a(u, { children: "Forecast failures before they happen. Enter an asset and run a model to get a risk score, confidence level and a concrete recommendation — so you can schedule preventive maintenance instead of reacting to breakdowns. Use it to prioritise which high-value or aging assets to service next." }),
|
|
44
|
+
/* @__PURE__ */ o(s, { children: [/* @__PURE__ */ a("h2", {
|
|
45
45
|
className: "text-sm font-semibold mb-3",
|
|
46
46
|
children: "Run a prediction"
|
|
47
|
-
}), /* @__PURE__ */
|
|
47
|
+
}), /* @__PURE__ */ o("form", {
|
|
48
48
|
className: "grid gap-3 md:grid-cols-3",
|
|
49
49
|
onSubmit: (e) => {
|
|
50
50
|
e.preventDefault(), _({ variables: { input: {
|
|
51
|
-
assetId:
|
|
51
|
+
assetId: n,
|
|
52
52
|
predictionType: "maintenance-risk",
|
|
53
53
|
featureVector: {
|
|
54
54
|
runtimeHours: 10240,
|
|
@@ -58,17 +58,17 @@ function p() {
|
|
|
58
58
|
} } });
|
|
59
59
|
},
|
|
60
60
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
61
|
+
/* @__PURE__ */ a("input", {
|
|
62
62
|
className: "rounded-md border px-3 py-2",
|
|
63
|
-
value:
|
|
63
|
+
value: n,
|
|
64
64
|
onChange: (e) => p(e.target.value),
|
|
65
65
|
"aria-label": "Asset ID"
|
|
66
66
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
67
|
+
/* @__PURE__ */ a("div", {
|
|
68
68
|
className: "text-sm text-text-secondary",
|
|
69
69
|
children: "Prediction Type: maintenance-risk"
|
|
70
70
|
}),
|
|
71
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ a("button", {
|
|
72
72
|
className: "rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text",
|
|
73
73
|
disabled: v,
|
|
74
74
|
type: "submit",
|
|
@@ -76,22 +76,22 @@ function p() {
|
|
|
76
76
|
})
|
|
77
77
|
]
|
|
78
78
|
})] }),
|
|
79
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ o("div", {
|
|
80
80
|
className: "grid gap-3 md:grid-cols-2",
|
|
81
81
|
children: [
|
|
82
|
-
h && y.length === 0 ? /* @__PURE__ */
|
|
82
|
+
h && y.length === 0 ? /* @__PURE__ */ a("div", {
|
|
83
83
|
className: "space-y-2 px-4 py-4",
|
|
84
|
-
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */
|
|
84
|
+
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))
|
|
85
85
|
}) : null,
|
|
86
|
-
!h && y.length === 0 ? /* @__PURE__ */
|
|
86
|
+
!h && y.length === 0 ? /* @__PURE__ */ a(l, {
|
|
87
87
|
illustration: "empty-data",
|
|
88
88
|
title: "No AI predictions available yet",
|
|
89
89
|
description: "AI-generated predictions for your assets will appear here."
|
|
90
90
|
}) : null,
|
|
91
|
-
y.map((e) => /* @__PURE__ */
|
|
91
|
+
y.map((e) => /* @__PURE__ */ o("article", {
|
|
92
92
|
className: "rounded-lg border p-4",
|
|
93
93
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
94
|
+
/* @__PURE__ */ o("p", {
|
|
95
95
|
className: "text-xs uppercase tracking-wide text-text-secondary",
|
|
96
96
|
children: [
|
|
97
97
|
e.predictionType,
|
|
@@ -99,7 +99,7 @@ function p() {
|
|
|
99
99
|
e.assetId
|
|
100
100
|
]
|
|
101
101
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ o("h2", {
|
|
103
103
|
className: "mt-1 text-base font-semibold",
|
|
104
104
|
children: [
|
|
105
105
|
"Risk score ",
|
|
@@ -107,7 +107,7 @@ function p() {
|
|
|
107
107
|
"%"
|
|
108
108
|
]
|
|
109
109
|
}),
|
|
110
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ o("p", {
|
|
111
111
|
className: "mt-1 text-sm text-text-secondary",
|
|
112
112
|
children: [
|
|
113
113
|
"Confidence ",
|
|
@@ -115,11 +115,11 @@ function p() {
|
|
|
115
115
|
"%"
|
|
116
116
|
]
|
|
117
117
|
}),
|
|
118
|
-
/* @__PURE__ */
|
|
118
|
+
/* @__PURE__ */ a("p", {
|
|
119
119
|
className: "mt-2 text-sm",
|
|
120
120
|
children: e.recommendation
|
|
121
121
|
}),
|
|
122
|
-
/* @__PURE__ */
|
|
122
|
+
/* @__PURE__ */ o("p", {
|
|
123
123
|
className: "mt-2 text-xs text-text-secondary",
|
|
124
124
|
children: [
|
|
125
125
|
e.modelVersion,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiPredictionsPage.js","names":[],"sources":["../../../src/assethandler/pages/AiPredictionsPage.tsx"],"sourcesContent":["import { BrainCircuit } from 'lucide-react';\nimport {
|
|
1
|
+
{"version":3,"file":"AiPredictionsPage.js","names":[],"sources":["../../../src/assethandler/pages/AiPredictionsPage.tsx"],"sourcesContent":["import { BrainCircuit } from 'lucide-react';\nimport {\n GradientText,\n IllustratedEmptyState,\n EmphasisPanel,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\n\nconst AI_PREDICTIONS_QUERY = gql`\n query AssetHandlerAiPredictions {\n aiPredictions {\n id\n assetId\n predictionType\n score\n confidence\n recommendation\n generatedAt\n modelVersion\n }\n }\n`;\n\nconst REQUEST_AI_PREDICTION_MUTATION = gql`\n mutation AssetHandlerRequestAiPrediction($input: RequestAIPredictionInput!) {\n requestAIPrediction(input: $input) {\n id\n }\n }\n`;\n\nexport function AiPredictionsPage() {\n const [assetId, setAssetId] = useState('AST-001');\n\n const { data, loading, refetch } = useQuery<{\n aiPredictions: Array<{\n id: string;\n assetId: string;\n predictionType: string;\n score: number;\n confidence: number;\n recommendation: string;\n generatedAt: string;\n modelVersion: string;\n }>;\n }>(AI_PREDICTIONS_QUERY, { fetchPolicy: 'cache-and-network' });\n\n const [requestPrediction, { loading: requesting }] = useMutation(REQUEST_AI_PREDICTION_MUTATION, {\n onCompleted: () => {\n void refetch();\n },\n });\n\n const predictions = data?.aiPredictions ?? [];\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1 className=\"flex items-center gap-2 text-2xl font-semibold\">\n <BrainCircuit className=\"h-6 w-6\" /> <GradientText>AI Predictions</GradientText>\n </h1>\n <PagePurpose>\n Forecast failures before they happen. Enter an asset and run a model to get a risk score,\n confidence level and a concrete recommendation — so you can schedule preventive maintenance\n instead of reacting to breakdowns. Use it to prioritise which high-value or aging assets to\n service next.\n </PagePurpose>\n <EmphasisPanel>\n <h2 className=\"text-sm font-semibold mb-3\">Run a prediction</h2>\n <form\n className=\"grid gap-3 md:grid-cols-3\"\n onSubmit={(event) => {\n event.preventDefault();\n void requestPrediction({\n variables: {\n input: {\n assetId,\n predictionType: 'maintenance-risk',\n featureVector: {\n runtimeHours: 10240,\n lastIncidentDaysAgo: 9,\n temperatureVariance: 0.23,\n },\n },\n },\n });\n }}\n >\n <input\n className=\"rounded-md border px-3 py-2\"\n value={assetId}\n onChange={(event) => setAssetId(event.target.value)}\n aria-label=\"Asset ID\"\n />\n <div className=\"text-sm text-text-secondary\">Prediction Type: maintenance-risk</div>\n <button\n className=\"rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text\"\n disabled={requesting}\n type=\"submit\"\n >\n {requesting ? 'Running...' : 'Run Prediction'}\n </button>\n </form>\n </EmphasisPanel>\n <div className=\"grid gap-3 md:grid-cols-2\">\n {loading && predictions.length === 0 ? (\n <div className=\"space-y-2 px-4 py-4\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div key={i} className=\"h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n ) : null}\n {!loading && predictions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No AI predictions available yet\"\n description=\"AI-generated predictions for your assets will appear here.\"\n />\n ) : null}\n {predictions.map((prediction) => (\n <article key={prediction.id} className=\"rounded-lg border p-4\">\n <p className=\"text-xs uppercase tracking-wide text-text-secondary\">\n {prediction.predictionType} • {prediction.assetId}\n </p>\n <h2 className=\"mt-1 text-base font-semibold\">\n Risk score {(prediction.score * 100).toFixed(1)}%\n </h2>\n <p className=\"mt-1 text-sm text-text-secondary\">\n Confidence {(prediction.confidence * 100).toFixed(1)}%\n </p>\n <p className=\"mt-2 text-sm\">{prediction.recommendation}</p>\n <p className=\"mt-2 text-xs text-text-secondary\">\n {prediction.modelVersion} • {new Date(prediction.generatedAt).toLocaleString()}\n </p>\n </article>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAWA,IAAM,IAAuB,CAAG;;;;;;;;;;;;;GAe1B,IAAiC,CAAG;;;;;;;AAQ1C,SAAgB,IAAoB;CAClC,IAAM,CAAC,GAAS,KAAc,EAAS,UAAU,EAE3C,EAAE,SAAM,YAAS,eAAY,EAWhC,GAAsB,EAAE,aAAa,qBAAqB,CAAC,EAExD,CAAC,GAAmB,EAAE,SAAS,OAAgB,EAAY,GAAgC,EAC/F,mBAAmB;AACZ,KAAS;IAEjB,CAAC,EAEI,IAAc,GAAM,iBAAiB,EAAE;AAE7C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;;KAAC,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;KAC7E;;GACL,kBAAC,GAAD,EAAA,UAAa,mSAKC,CAAA;GACd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA6B;IAAqB,CAAA,EAChE,kBAAC,QAAD;IACE,WAAU;IACV,WAAW,MAAU;AAEd,KADL,EAAM,gBAAgB,EACjB,EAAkB,EACrB,WAAW,EACT,OAAO;MACL;MACA,gBAAgB;MAChB,eAAe;OACb,cAAc;OACd,qBAAqB;OACrB,qBAAqB;OACtB;MACF,EACF,EACF,CAAC;;cAhBN;KAmBE,kBAAC,SAAD;MACE,WAAU;MACV,OAAO;MACP,WAAW,MAAU,EAAW,EAAM,OAAO,MAAM;MACnD,cAAW;MACX,CAAA;KACF,kBAAC,OAAD;MAAK,WAAU;gBAA8B;MAAuC,CAAA;KACpF,kBAAC,UAAD;MACE,WAAU;MACV,UAAU;MACV,MAAK;gBAEJ,IAAa,eAAe;MACtB,CAAA;KACJ;MACO,EAAA,CAAA;GAChB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACG,KAAW,EAAY,WAAW,IACjC,kBAAC,OAAD;MAAK,WAAU;gBACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAAa,WAAU,8DAA+D,EAA5E,EAA4E,CACtF;MACE,CAAA,GACJ;KACH,CAAC,KAAW,EAAY,WAAW,IAClC,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA,GACA;KACH,EAAY,KAAK,MAChB,kBAAC,WAAD;MAA6B,WAAU;gBAAvC;OACE,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAW;SAAe;SAAI,EAAW;SACxC;;OACJ,kBAAC,MAAD;QAAI,WAAU;kBAAd;SAA6C;UAC9B,EAAW,QAAQ,KAAK,QAAQ,EAAE;SAAC;SAC7C;;OACL,kBAAC,KAAD;QAAG,WAAU;kBAAb;SAAgD;UACjC,EAAW,aAAa,KAAK,QAAQ,EAAE;SAAC;SACnD;;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAgB,EAAW;QAAmB,CAAA;OAC3D,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAW;SAAa;SAAI,IAAI,KAAK,EAAW,YAAY,CAAC,gBAAgB;SAC5E;;OACI;QAdI,EAAW,GAcf,CACV;KACE;;GACF"}
|