@burdenoff/microfe-assethandler 2026.703.5 → 2026.703.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/assethandler/components/ActivityTimeline.js.map +1 -1
  2. package/dist/assethandler/components/AttachmentsPanel.js +2 -1
  3. package/dist/assethandler/components/AttachmentsPanel.js.map +1 -1
  4. package/dist/assethandler/ops/NewWorkOrderDialog.js +164 -0
  5. package/dist/assethandler/ops/NewWorkOrderDialog.js.map +1 -0
  6. package/dist/assethandler/ops/ScheduleMaintenanceDialog.js +197 -0
  7. package/dist/assethandler/ops/ScheduleMaintenanceDialog.js.map +1 -0
  8. package/dist/assethandler/pages/AiPredictionsPage.js +112 -54
  9. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  12. package/dist/assethandler/pages/CmdbBrowserPage.js +195 -36
  13. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  14. package/dist/assethandler/pages/DigitalTwinPage.js +162 -31
  15. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  16. package/dist/assethandler/pages/DiscoveryJobsPage.js +85 -55
  17. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  18. package/dist/assethandler/pages/EsgDashboardPage.js +189 -60
  19. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  20. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  21. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  22. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  23. package/dist/assethandler/pages/IotDevicesPage.js +206 -38
  24. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  25. package/dist/assethandler/pages/ItilChangeDetailPage.js +221 -114
  26. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  27. package/dist/assethandler/pages/ItilChangeManagementPage.js +86 -61
  28. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  29. package/dist/assethandler/pages/ItilDialogs.js +361 -0
  30. package/dist/assethandler/pages/ItilDialogs.js.map +1 -0
  31. package/dist/assethandler/pages/ItilIncidentDetailPage.js +370 -105
  32. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/ItilIncidentManagementPage.js +130 -103
  34. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  35. package/dist/assethandler/pages/ItilItilhubPage.js +186 -132
  36. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  37. package/dist/assethandler/pages/ItilProblemDetailPage.js +195 -96
  38. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilProblemManagementPage.js +83 -58
  40. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  41. package/dist/assethandler/pages/KnowledgeBasePage.js +205 -75
  42. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  43. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +212 -96
  44. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  45. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +70 -38
  46. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  47. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +470 -116
  48. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  49. package/dist/assethandler/pages/OperationsOperationsHubPage.js +154 -102
  50. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  51. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +386 -79
  52. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  53. package/dist/assethandler/pages/ProvenancePage.js +102 -56
  54. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  55. package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -1
  56. package/dist/assethandler/pages/SamLicensesPage.js +186 -36
  57. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  58. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +147 -65
  59. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  60. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +349 -124
  61. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  62. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +191 -116
  63. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  64. package/dist/assethandler/pages/SecuritySecurityHubPage.js +421 -184
  65. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  66. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  67. package/package.json +1 -1
@@ -1,11 +1,15 @@
1
- import { useState as e } from "react";
2
- import { BrainCircuit as t } from "lucide-react";
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";
1
+ import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
+ import { notify as t } from "../utils/toast.js";
3
+ import { Pagination as n, usePagination as r } from "../components/Pagination.js";
4
+ import "../components/index.js";
5
+ import { useState as i } from "react";
6
+ import { BrainCircuit as a } from "lucide-react";
7
+ import { gql as o } from "@apollo/client";
8
+ import { useMutation as s, useQuery as c } from "@apollo/client/react";
9
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
10
+ import { Button as d, EmphasisPanel as f, GradientText as p, IllustratedEmptyState as m, Label as h, PagePurpose as g, Select as _, SelectContent as v, SelectItem as y, SelectTrigger as b, SelectValue as x } from "@burdenoff/fe-libs/ui";
7
11
  //#region src/assethandler/pages/AiPredictionsPage.tsx
8
- var d = n`
12
+ var S = o`
9
13
  query AssetHandlerAiPredictions {
10
14
  aiPredictions {
11
15
  id
@@ -18,88 +22,130 @@ var d = n`
18
22
  modelVersion
19
23
  }
20
24
  }
21
- `, f = n`
25
+ `, C = o`
22
26
  mutation AssetHandlerRequestAiPrediction($input: RequestAIPredictionInput!) {
23
27
  requestAIPrediction(input: $input) {
24
28
  id
25
29
  }
26
30
  }
27
- `;
28
- function p() {
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
- g();
31
- } }), y = m?.aiPredictions ?? [];
32
- return /* @__PURE__ */ o("div", {
31
+ `, w = [
32
+ {
33
+ value: "maintenance-risk",
34
+ label: "Maintenance risk"
35
+ },
36
+ {
37
+ value: "failure-forecast",
38
+ label: "Failure forecast"
39
+ },
40
+ {
41
+ value: "utilization-forecast",
42
+ label: "Utilization forecast"
43
+ },
44
+ {
45
+ value: "anomaly-detection",
46
+ label: "Anomaly detection"
47
+ },
48
+ {
49
+ value: "end-of-life",
50
+ label: "End-of-life projection"
51
+ }
52
+ ], T = (e) => w.find((t) => t.value === e)?.label ?? e.replace(/-/g, " ");
53
+ function E() {
54
+ let o = e((e) => e.assets), [E, D] = i(""), [O, k] = i("maintenance-risk"), { data: A, loading: j, refetch: M } = c(S, { fetchPolicy: "cache-and-network" }), [N, { loading: P }] = s(C, {
55
+ onCompleted: () => {
56
+ t.success("Prediction requested", "The model result will appear below shortly."), M();
57
+ },
58
+ onError: (e) => t.error("Could not run prediction", e.message)
59
+ }), F = A?.aiPredictions ?? [], I = r(F, { pageSize: 8 });
60
+ return /* @__PURE__ */ u("div", {
33
61
  className: "space-y-4 p-4",
34
62
  children: [
35
- /* @__PURE__ */ o("h1", {
63
+ /* @__PURE__ */ u("h1", {
36
64
  className: "flex items-center gap-2 text-2xl font-semibold",
37
65
  children: [
38
- /* @__PURE__ */ a(t, { className: "h-6 w-6" }),
66
+ /* @__PURE__ */ l(a, { className: "h-6 w-6" }),
39
67
  " ",
40
- /* @__PURE__ */ a(c, { children: "AI Predictions" })
68
+ /* @__PURE__ */ l(p, { children: "AI Predictions" })
41
69
  ]
42
70
  }),
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", {
71
+ /* @__PURE__ */ l(g, { children: "Forecast failures before they happen. Pick an asset and 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." }),
72
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l("h2", {
45
73
  className: "text-sm font-semibold mb-3",
46
74
  children: "Run a prediction"
47
- }), /* @__PURE__ */ o("form", {
75
+ }), /* @__PURE__ */ u("form", {
48
76
  className: "grid gap-3 md:grid-cols-3",
49
77
  onSubmit: (e) => {
50
- e.preventDefault(), _({ variables: { input: {
51
- assetId: n,
52
- predictionType: "maintenance-risk",
53
- featureVector: {
54
- runtimeHours: 10240,
55
- lastIncidentDaysAgo: 9,
56
- temperatureVariance: .23
57
- }
78
+ if (e.preventDefault(), !E) {
79
+ t.warning("Asset required", "Select an asset to run a prediction against.");
80
+ return;
81
+ }
82
+ N({ variables: { input: {
83
+ assetId: E,
84
+ predictionType: O
58
85
  } } });
59
86
  },
60
87
  children: [
61
- /* @__PURE__ */ a("input", {
62
- className: "rounded-md border px-3 py-2",
63
- value: n,
64
- onChange: (e) => p(e.target.value),
65
- "aria-label": "Asset ID"
88
+ /* @__PURE__ */ u("div", {
89
+ className: "space-y-2",
90
+ children: [/* @__PURE__ */ l(h, { children: "Asset" }), /* @__PURE__ */ u(_, {
91
+ value: E,
92
+ onValueChange: D,
93
+ children: [/* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(x, { placeholder: "Select an asset" }) }), /* @__PURE__ */ l(v, { children: o.map((e) => /* @__PURE__ */ u(y, {
94
+ value: e.id,
95
+ children: [
96
+ e.assetTag,
97
+ " — ",
98
+ e.name
99
+ ]
100
+ }, e.id)) })]
101
+ })]
66
102
  }),
67
- /* @__PURE__ */ a("div", {
68
- className: "text-sm text-text-secondary",
69
- children: "Prediction Type: maintenance-risk"
103
+ /* @__PURE__ */ u("div", {
104
+ className: "space-y-2",
105
+ children: [/* @__PURE__ */ l(h, { children: "Prediction Type" }), /* @__PURE__ */ u(_, {
106
+ value: O,
107
+ onValueChange: (e) => k(e),
108
+ children: [/* @__PURE__ */ l(b, { children: /* @__PURE__ */ l(x, {}) }), /* @__PURE__ */ l(v, { children: w.map((e) => /* @__PURE__ */ l(y, {
109
+ value: e.value,
110
+ children: e.label
111
+ }, e.value)) })]
112
+ })]
70
113
  }),
71
- /* @__PURE__ */ a("button", {
72
- className: "rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text",
73
- disabled: v,
74
- type: "submit",
75
- children: v ? "Running..." : "Run Prediction"
114
+ /* @__PURE__ */ l("div", {
115
+ className: "flex items-end",
116
+ children: /* @__PURE__ */ l(d, {
117
+ className: "w-full",
118
+ disabled: P,
119
+ type: "submit",
120
+ children: P ? "Running…" : "Run Prediction"
121
+ })
76
122
  })
77
123
  ]
78
124
  })] }),
79
- /* @__PURE__ */ o("div", {
125
+ /* @__PURE__ */ u("div", {
80
126
  className: "grid gap-3 md:grid-cols-2",
81
127
  children: [
82
- h && y.length === 0 ? /* @__PURE__ */ a("div", {
128
+ j && F.length === 0 ? /* @__PURE__ */ l("div", {
83
129
  className: "space-y-2 px-4 py-4",
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))
130
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ l("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
85
131
  }) : null,
86
- !h && y.length === 0 ? /* @__PURE__ */ a(l, {
132
+ !j && F.length === 0 ? /* @__PURE__ */ l(m, {
87
133
  illustration: "empty-data",
88
134
  title: "No AI predictions available yet",
89
- description: "AI-generated predictions for your assets will appear here."
135
+ description: "Run a prediction above to generate a risk score and recommendation."
90
136
  }) : null,
91
- y.map((e) => /* @__PURE__ */ o("article", {
137
+ I.pageItems.map((e) => /* @__PURE__ */ u("article", {
92
138
  className: "rounded-lg border p-4",
93
139
  children: [
94
- /* @__PURE__ */ o("p", {
140
+ /* @__PURE__ */ u("p", {
95
141
  className: "text-xs uppercase tracking-wide text-text-secondary",
96
142
  children: [
97
- e.predictionType,
143
+ T(e.predictionType),
98
144
  " • ",
99
145
  e.assetId
100
146
  ]
101
147
  }),
102
- /* @__PURE__ */ o("h2", {
148
+ /* @__PURE__ */ u("h2", {
103
149
  className: "mt-1 text-base font-semibold",
104
150
  children: [
105
151
  "Risk score ",
@@ -107,7 +153,7 @@ function p() {
107
153
  "%"
108
154
  ]
109
155
  }),
110
- /* @__PURE__ */ o("p", {
156
+ /* @__PURE__ */ u("p", {
111
157
  className: "mt-1 text-sm text-text-secondary",
112
158
  children: [
113
159
  "Confidence ",
@@ -115,11 +161,11 @@ function p() {
115
161
  "%"
116
162
  ]
117
163
  }),
118
- /* @__PURE__ */ a("p", {
164
+ /* @__PURE__ */ l("p", {
119
165
  className: "mt-2 text-sm",
120
166
  children: e.recommendation
121
167
  }),
122
- /* @__PURE__ */ o("p", {
168
+ /* @__PURE__ */ u("p", {
123
169
  className: "mt-2 text-xs text-text-secondary",
124
170
  children: [
125
171
  e.modelVersion,
@@ -130,11 +176,23 @@ function p() {
130
176
  ]
131
177
  }, e.id))
132
178
  ]
179
+ }),
180
+ /* @__PURE__ */ l(n, {
181
+ page: I.page,
182
+ pageCount: I.pageCount,
183
+ rangeStart: I.rangeStart,
184
+ rangeEnd: I.rangeEnd,
185
+ totalItems: I.totalItems,
186
+ canPrev: I.canPrev,
187
+ canNext: I.canNext,
188
+ onPrev: I.prevPage,
189
+ onNext: I.nextPage,
190
+ itemLabel: "predictions"
133
191
  })
134
192
  ]
135
193
  });
136
194
  }
137
195
  //#endregion
138
- export { p as AiPredictionsPage };
196
+ export { E as AiPredictionsPage };
139
197
 
140
198
  //# sourceMappingURL=AiPredictionsPage.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"file":"AiPredictionsPage.js","names":[],"sources":["../../../src/assethandler/pages/AiPredictionsPage.tsx"],"sourcesContent":["import type React from 'react';\nimport { BrainCircuit } from 'lucide-react';\nimport {\n Button,\n GradientText,\n IllustratedEmptyState,\n EmphasisPanel,\n PagePurpose,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { Pagination, usePagination } from '../components';\nimport { notify } from '../utils/toast';\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\ninterface AiPrediction {\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\n// Prediction model families exposed by the AI service. Values follow the\n// service's kebab-case convention (matches persisted `predictionType`).\nconst PREDICTION_TYPES = [\n { value: 'maintenance-risk', label: 'Maintenance risk' },\n { value: 'failure-forecast', label: 'Failure forecast' },\n { value: 'utilization-forecast', label: 'Utilization forecast' },\n { value: 'anomaly-detection', label: 'Anomaly detection' },\n { value: 'end-of-life', label: 'End-of-life projection' },\n] as const;\n\nconst humanizePredictionType = (value: string): string =>\n PREDICTION_TYPES.find((t) => t.value === value)?.label ?? value.replace(/-/g, ' ');\n\nexport function AiPredictionsPage() {\n const assets = useAssetHandlerStore((s) => s.assets);\n const [assetId, setAssetId] = useState('');\n const [predictionType, setPredictionType] =\n useState<(typeof PREDICTION_TYPES)[number]['value']>('maintenance-risk');\n\n const { data, loading, refetch } = useQuery<{ aiPredictions: AiPrediction[] }>(\n AI_PREDICTIONS_QUERY,\n { fetchPolicy: 'cache-and-network' }\n );\n\n const [requestPrediction, { loading: requesting }] = useMutation(REQUEST_AI_PREDICTION_MUTATION, {\n onCompleted: () => {\n notify.success('Prediction requested', 'The model result will appear below shortly.');\n void refetch();\n },\n onError: (error) => notify.error('Could not run prediction', error.message),\n });\n\n const predictions = data?.aiPredictions ?? [];\n const pagination = usePagination(predictions, { pageSize: 8 });\n\n const handleRun = (event: React.FormEvent) => {\n event.preventDefault();\n if (!assetId) {\n notify.warning('Asset required', 'Select an asset to run a prediction against.');\n return;\n }\n void requestPrediction({\n variables: { input: { assetId, predictionType } },\n });\n };\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. Pick an asset and 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 className=\"grid gap-3 md:grid-cols-3\" onSubmit={handleRun}>\n <div className=\"space-y-2\">\n <Label>Asset</Label>\n <Select value={assetId} onValueChange={setAssetId}>\n <SelectTrigger>\n <SelectValue placeholder=\"Select an asset\" />\n </SelectTrigger>\n <SelectContent>\n {assets.map((asset) => (\n <SelectItem key={asset.id} value={asset.id}>\n {asset.assetTag} — {asset.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Prediction Type</Label>\n <Select\n value={predictionType}\n onValueChange={(v) => setPredictionType(v as typeof predictionType)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {PREDICTION_TYPES.map((t) => (\n <SelectItem key={t.value} value={t.value}>\n {t.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex items-end\">\n <Button className=\"w-full\" disabled={requesting} type=\"submit\">\n {requesting ? 'Running…' : 'Run Prediction'}\n </Button>\n </div>\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=\"Run a prediction above to generate a risk score and recommendation.\"\n />\n ) : null}\n {pagination.pageItems.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 {humanizePredictionType(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 <Pagination\n page={pagination.page}\n pageCount={pagination.pageCount}\n rangeStart={pagination.rangeStart}\n rangeEnd={pagination.rangeEnd}\n totalItems={pagination.totalItems}\n canPrev={pagination.canPrev}\n canNext={pagination.canNext}\n onPrev={pagination.prevPage}\n onNext={pagination.nextPage}\n itemLabel=\"predictions\"\n />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\nexport function AssetsAssetCreatePage() {\n const navigate = useAssetHandlerNavigate();\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n tags: '',\n // Financial details\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n warrantyExpiry: '',\n supplier: '',\n department: '',\n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Asset created', `${data.createAsset.name} was registered in the inventory.`);\n navigate(`/assets/${data.createAsset.id}`);\n },\n onError: (error) => {\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const handleSubmit = () => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0) nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const tags = formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean);\n\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\n\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n // Financial details\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Create New Asset</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Register a new asset in the inventory</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Register a new asset so it can be tracked, maintained and assigned from day one. Capture its\n identity (name, tag, serial), category and condition, then the location and assignment\n details — the more you fill in now, the better your reports and audits later.\n </PagePurpose>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>General Information</CardTitle>\n <CardDescription>Basic asset details and identification</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Asset Name *</Label>\n <Input\n placeholder=\"e.g., Dell OptiPlex 7090\"\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Asset Tag *</Label>\n <Input\n placeholder=\"e.g., IT-HW-001\"\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Brief description of the asset...\"\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CATEGORY_OPTIONS.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select\n value={formData.condition}\n onValueChange={(v) => handleChange('condition', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment & Location</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Tags (comma-separated)</Label>\n <Input\n placeholder=\"e.g., desktop, engineering, high-performance\"\n value={formData.tags}\n onChange={(e) => handleChange('tags', e.target.value)}\n />\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Financial Details</CardTitle>\n <CardDescription>\n Purchase and depreciation data powers book value, TCO and finance reports\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 1200\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life (months)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 60\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 100\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => navigate('/assets/asset-list')}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"AssetsAssetCreatePage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetCreatePage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n CardDescription,\n Input,\n Label,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Loader2, Save, X } from 'lucide-react';\nimport { gql } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport { notify } from '../utils/toast';\n\nconst CREATE_ASSET_MUTATION = gql`\n mutation AssetHandlerCreateAsset($input: CreateAssetInput!) {\n createAsset(input: $input) {\n id\n assetNumber\n name\n }\n }\n`;\n\nconst CATEGORY_OPTIONS = [\n 'electronics',\n 'it_hardware',\n 'furniture',\n 'vehicles',\n 'equipment',\n 'software',\n 'networking',\n 'servers',\n];\n\nexport function AssetsAssetCreatePage() {\n const navigate = useAssetHandlerNavigate();\n const [formData, setFormData] = useState({\n name: '',\n description: '',\n category: 'it_hardware',\n status: 'ACTIVE',\n condition: 'GOOD',\n serialNumber: '',\n assetNumber: '',\n locationName: '',\n assignedTo: '',\n tags: '',\n // Financial details\n purchaseValue: '',\n purchaseDate: '',\n usefulLifeMonths: '',\n salvageValue: '',\n depreciationMethod: 'STRAIGHT_LINE',\n warrantyExpiry: '',\n supplier: '',\n department: '',\n });\n const [errors, setErrors] = useState<Record<string, string>>({});\n\n const [createAsset, { loading: creating }] = useMutation<{\n createAsset: { id: string; assetNumber: string; name: string };\n }>(CREATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: (data) => {\n notify.success('Asset created', `${data.createAsset.name} was registered in the inventory.`);\n navigate(`/assets/${data.createAsset.id}`);\n },\n onError: (error) => {\n notify.error('Could not create asset', error.message);\n },\n });\n\n const handleChange = (field: string, value: string) => {\n setFormData((prev) => ({ ...prev, [field]: value }));\n setErrors((prev) => {\n if (!prev[field]) return prev;\n const next = { ...prev };\n delete next[field];\n return next;\n });\n };\n\n const handleSubmit = () => {\n const nextErrors: Record<string, string> = {};\n if (!formData.name.trim()) nextErrors.name = 'Asset name is required';\n if (!formData.assetNumber.trim()) nextErrors.assetNumber = 'Asset tag is required';\n if (!formData.category.trim()) nextErrors.category = 'Category is required';\n\n const numericField = (value: string, label: string, key: string) => {\n if (value.trim() === '') return;\n const parsed = Number(value);\n if (Number.isNaN(parsed) || parsed < 0)\n nextErrors[key] = `${label} must be a positive number`;\n };\n numericField(formData.purchaseValue, 'Purchase value', 'purchaseValue');\n numericField(formData.salvageValue, 'Salvage value', 'salvageValue');\n numericField(formData.usefulLifeMonths, 'Useful life', 'usefulLifeMonths');\n\n setErrors(nextErrors);\n if (Object.keys(nextErrors).length > 0) {\n notify.warning('Missing required fields', 'Fill in the highlighted fields and try again.');\n return;\n }\n\n const tags = formData.tags\n .split(',')\n .map((tag) => tag.trim())\n .filter(Boolean);\n\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n const optionalDate = (value: string): string | null =>\n value.trim() === '' ? null : new Date(value).toISOString();\n\n void createAsset({\n variables: {\n input: {\n name: formData.name.trim(),\n assetNumber: formData.assetNumber.trim(),\n category: formData.category,\n status: formData.status,\n condition: formData.condition,\n description: formData.description.trim() || null,\n serialNumber: formData.serialNumber.trim() || null,\n locationName: formData.locationName.trim() || null,\n assignedTo: formData.assignedTo.trim() || null,\n tags,\n // Financial details\n purchaseValue: optionalNumber(formData.purchaseValue),\n purchaseDate: optionalDate(formData.purchaseDate),\n usefulLifeMonths: optionalNumber(formData.usefulLifeMonths),\n salvageValue: optionalNumber(formData.salvageValue),\n depreciationMethod: formData.depreciationMethod,\n warrantyExpiry: optionalDate(formData.warrantyExpiry),\n supplier: formData.supplier.trim() || null,\n department: formData.department.trim() || null,\n },\n },\n });\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/assets/asset-list')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Create New Asset</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Register a new asset in the inventory</p>\n </div>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => navigate('/assets/asset-list')}>\n <X className=\"mr-2 h-4 w-4\" />\n Cancel\n </Button>\n <Button size=\"sm\" onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n Register a new asset so it can be tracked, maintained and assigned from day one. Capture its\n identity (name, tag, serial), category and condition, then the location and assignment\n details — the more you fill in now, the better your reports and audits later.\n </PagePurpose>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>General Information</CardTitle>\n <CardDescription>Basic asset details and identification</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4 px-0 pb-0\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Asset Name *</Label>\n <Input\n placeholder=\"e.g., Dell OptiPlex 7090\"\n value={formData.name}\n onChange={(e) => handleChange('name', e.target.value)}\n aria-invalid={!!errors.name}\n />\n {errors.name ? <p className=\"text-xs text-status-error-text\">{errors.name}</p> : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Asset Tag *</Label>\n <Input\n placeholder=\"e.g., IT-HW-001\"\n value={formData.assetNumber}\n onChange={(e) => handleChange('assetNumber', e.target.value)}\n aria-invalid={!!errors.assetNumber}\n />\n {errors.assetNumber ? (\n <p className=\"text-xs text-status-error-text\">{errors.assetNumber}</p>\n ) : null}\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n placeholder=\"Brief description of the asset...\"\n value={formData.description}\n onChange={(e) => handleChange('description', e.target.value)}\n rows={3}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Category *</Label>\n <Select value={formData.category} onValueChange={(v) => handleChange('category', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {CATEGORY_OPTIONS.map((category) => (\n <SelectItem key={category} value={category} className=\"capitalize\">\n {category.replace(/_/g, ' ')}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={formData.status} onValueChange={(v) => handleChange('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select\n value={formData.condition}\n onValueChange={(v) => handleChange('condition', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n placeholder=\"e.g., DELL-7090-X1A2B3\"\n value={formData.serialNumber}\n onChange={(e) => handleChange('serialNumber', e.target.value)}\n />\n </div>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Assignment & Location</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n placeholder=\"e.g., john.smith@company.com\"\n value={formData.assignedTo}\n onChange={(e) => handleChange('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n placeholder=\"e.g., Building A, Floor 3, Desk 15\"\n value={formData.locationName}\n onChange={(e) => handleChange('locationName', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Tags (comma-separated)</Label>\n <Input\n placeholder=\"e.g., desktop, engineering, high-performance\"\n value={formData.tags}\n onChange={(e) => handleChange('tags', e.target.value)}\n />\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Financial Details</CardTitle>\n <CardDescription>\n Purchase and depreciation data powers book value, TCO and finance reports\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 1200\"\n value={formData.purchaseValue}\n onChange={(e) => handleChange('purchaseValue', e.target.value)}\n aria-invalid={!!errors.purchaseValue}\n />\n {errors.purchaseValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.purchaseValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Purchase Date</Label>\n <Input\n type=\"date\"\n value={formData.purchaseDate}\n onChange={(e) => handleChange('purchaseDate', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n placeholder=\"e.g., Dell Technologies\"\n value={formData.supplier}\n onChange={(e) => handleChange('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Useful Life (months)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n placeholder=\"e.g., 60\"\n value={formData.usefulLifeMonths}\n onChange={(e) => handleChange('usefulLifeMonths', e.target.value)}\n aria-invalid={!!errors.usefulLifeMonths}\n />\n {errors.usefulLifeMonths ? (\n <p className=\"text-xs text-status-error-text\">{errors.usefulLifeMonths}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n placeholder=\"e.g., 100\"\n value={formData.salvageValue}\n onChange={(e) => handleChange('salvageValue', e.target.value)}\n aria-invalid={!!errors.salvageValue}\n />\n {errors.salvageValue ? (\n <p className=\"text-xs text-status-error-text\">{errors.salvageValue}</p>\n ) : null}\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation Method</Label>\n <Select\n value={formData.depreciationMethod}\n onValueChange={(v) => handleChange('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Warranty Expiry</Label>\n <Input\n type=\"date\"\n value={formData.warrantyExpiry}\n onChange={(e) => handleChange('warrantyExpiry', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n placeholder=\"e.g., Engineering\"\n value={formData.department}\n onChange={(e) => handleChange('department', e.target.value)}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" onClick={() => navigate('/assets/asset-list')}>\n Cancel\n </Button>\n <Button onClick={handleSubmit} disabled={creating}>\n {creating ? (\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n ) : (\n <Save className=\"mr-2 h-4 w-4\" />\n )}\n {creating ? 'Creating...' : 'Create Asset'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}