@burdenoff/microfe-assethandler 2026.625.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
  2. package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
  3. package/dist/assethandler/pages/AnalyticsPage.js +538 -534
  4. package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
  5. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
  6. package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
  7. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
  8. package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
  9. package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
  10. package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
  11. package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
  12. package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
  13. package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
  14. package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
  15. package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
  16. package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
  17. package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
  18. package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
  19. package/dist/assethandler/pages/AuditTrailPage.js +93 -91
  20. package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
  21. package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
  22. package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
  23. package/dist/assethandler/pages/DashboardPage.js +157 -126
  24. package/dist/assethandler/pages/DashboardPage.js.map +1 -1
  25. package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
  26. package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
  27. package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
  28. package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
  29. package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
  30. package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
  31. package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
  32. package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
  33. package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
  34. package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
  35. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
  36. package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
  37. package/dist/assethandler/pages/IotDevicesPage.js +34 -35
  38. package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
  39. package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
  40. package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
  41. package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
  42. package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
  43. package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
  44. package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
  45. package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
  46. package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
  47. package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
  48. package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
  49. package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
  50. package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
  51. package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
  52. package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
  53. package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
  54. package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
  55. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
  56. package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
  57. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
  58. package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
  59. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
  60. package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
  61. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
  62. package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
  63. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
  64. package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
  65. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
  66. package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
  67. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
  68. package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
  69. package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
  70. package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
  71. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
  72. package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
  73. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
  74. package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
  75. package/dist/assethandler/pages/ProvenancePage.js +56 -53
  76. package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
  77. package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
  78. package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
  79. package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
  80. package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
  81. package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
  82. package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
  83. package/dist/assethandler/pages/SamLicensesPage.js +32 -33
  84. package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
  85. package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
  86. package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
  87. package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
  88. package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
  89. package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
  90. package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
  91. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
  92. package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
  93. package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
  94. package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
  95. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
  96. package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
  97. package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
  98. package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
  99. package/dist/assethandler/pages/UsersPage.js +108 -99
  100. package/dist/assethandler/pages/UsersPage.js.map +1 -1
  101. package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
  102. package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
  103. package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
  104. package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
  105. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
  106. package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
  107. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
  108. package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
  109. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
  110. package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
  111. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
  112. package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
  113. package/package.json +2 -2
@@ -1,208 +1,210 @@
1
1
  import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
2
2
  import { BarChart3 as t, DollarSign as n, Package as r, TrendingDown as i } from "lucide-react";
3
- import { Badge as a, Card as o, CardContent as s, CardHeader as c, CardTitle as l, GlassCard as u, GradientText as d, Table as f, TableBody as p, TableCell as m, TableHead as h, TableHeader as g, TableRow as _ } from "@burdenoff/fe-libs/ui";
4
- import { jsx as v, jsxs as y } from "react/jsx-runtime";
3
+ import { Badge as a, Card as o, CardContent as s, CardHeader as c, CardTitle as l, GlassCard as u, GradientText as d, PagePurpose as f, Table as p, TableBody as m, TableCell as h, TableHead as g, TableHeader as _, TableRow as v } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
5
5
  //#region src/assethandler/pages/PortfolioPortfolioOverviewPage.tsx
6
- function b() {
7
- let { portfolio: b } = e(), x = b.totalValue > 0 ? Math.round((b.totalValue - b.depreciatedValue) / b.totalValue * 100) : 0, S = (e) => e >= 1e6 ? `$${(e / 1e6).toFixed(2)}M` : `$${e.toLocaleString()}`, C = Math.max(...b.byCategory.map((e) => e.value), 1), w = Math.max(...b.depreciationTrend.map((e) => e.value), 1), T = Math.max(...b.acquisitionTrend.map((e) => e.value), 1);
8
- return /* @__PURE__ */ y("div", {
6
+ function x() {
7
+ let { portfolio: x } = e(), S = x.totalValue > 0 ? Math.round((x.totalValue - x.depreciatedValue) / x.totalValue * 100) : 0, C = (e) => e >= 1e6 ? `$${(e / 1e6).toFixed(2)}M` : `$${e.toLocaleString()}`, w = Math.max(...x.byCategory.map((e) => e.value), 1), T = Math.max(...x.depreciationTrend.map((e) => e.value), 1), E = Math.max(...x.acquisitionTrend.map((e) => e.value), 1);
8
+ return /* @__PURE__ */ b("div", {
9
9
  className: "space-y-6 p-6",
10
10
  children: [
11
- /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("h1", {
11
+ /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
12
12
  className: "text-2xl font-semibold",
13
- children: /* @__PURE__ */ v(d, { children: "Portfolio Overview" })
14
- }), /* @__PURE__ */ v("p", {
13
+ children: /* @__PURE__ */ y(d, { children: "Portfolio Overview" })
14
+ }), /* @__PURE__ */ y("p", {
15
15
  className: "text-sm text-text-secondary",
16
16
  children: "Comprehensive view of your asset portfolio, valuations, and trends."
17
17
  })] }),
18
- /* @__PURE__ */ y("div", {
18
+ /* @__PURE__ */ y(f, { children: "The big-picture financial view of everything you own: how many assets you have, what they were worth, what they are worth now after depreciation, and how value is spread across categories and departments. Use it to inform replacement planning, budgeting and audit." }),
19
+ /* @__PURE__ */ b("div", {
19
20
  className: "grid gap-4 md:grid-cols-4",
20
21
  children: [
21
- /* @__PURE__ */ y(u, {
22
+ /* @__PURE__ */ b(u, {
22
23
  treatment: "metric",
23
24
  className: "border-border-seam",
24
- children: [/* @__PURE__ */ y(c, {
25
+ children: [/* @__PURE__ */ b(c, {
25
26
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
26
- children: [/* @__PURE__ */ v(l, {
27
+ children: [/* @__PURE__ */ y(l, {
27
28
  className: "text-sm font-medium",
28
29
  children: "Total Assets"
29
- }), /* @__PURE__ */ v(r, { className: "h-4 w-4 text-text-secondary" })]
30
- }), /* @__PURE__ */ y(s, { children: [/* @__PURE__ */ v("div", {
30
+ }), /* @__PURE__ */ y(r, { className: "h-4 w-4 text-text-secondary" })]
31
+ }), /* @__PURE__ */ b(s, { children: [/* @__PURE__ */ y("div", {
31
32
  className: "text-2xl font-bold tabular-nums",
32
- children: b.totalAssets.toLocaleString()
33
- }), /* @__PURE__ */ v("p", {
33
+ children: x.totalAssets.toLocaleString()
34
+ }), /* @__PURE__ */ y("p", {
34
35
  className: "text-xs text-text-secondary",
35
36
  children: "Across all categories"
36
37
  })] })]
37
38
  }),
38
- /* @__PURE__ */ y(u, {
39
- treatment: "metric",
39
+ /* @__PURE__ */ b(u, {
40
+ treatment: "glass",
41
+ glow: !0,
40
42
  className: "border-border-seam",
41
- children: [/* @__PURE__ */ y(c, {
43
+ children: [/* @__PURE__ */ b(c, {
42
44
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
43
- children: [/* @__PURE__ */ v(l, {
45
+ children: [/* @__PURE__ */ y(l, {
44
46
  className: "text-sm font-medium",
45
47
  children: "Total Value"
46
- }), /* @__PURE__ */ v(n, { className: "h-4 w-4 text-status-success-text" })]
47
- }), /* @__PURE__ */ y(s, { children: [/* @__PURE__ */ v("div", {
48
+ }), /* @__PURE__ */ y(n, { className: "h-4 w-4 text-status-success-text" })]
49
+ }), /* @__PURE__ */ b(s, { children: [/* @__PURE__ */ y("div", {
48
50
  className: "text-2xl font-bold tabular-nums",
49
- children: S(b.totalValue)
50
- }), /* @__PURE__ */ v("p", {
51
+ children: C(x.totalValue)
52
+ }), /* @__PURE__ */ y("p", {
51
53
  className: "text-xs text-text-secondary",
52
54
  children: "Original purchase value"
53
55
  })] })]
54
56
  }),
55
- /* @__PURE__ */ y(u, {
57
+ /* @__PURE__ */ b(u, {
56
58
  treatment: "metric",
57
59
  className: "border-border-seam",
58
- children: [/* @__PURE__ */ y(c, {
60
+ children: [/* @__PURE__ */ b(c, {
59
61
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
60
- children: [/* @__PURE__ */ v(l, {
62
+ children: [/* @__PURE__ */ y(l, {
61
63
  className: "text-sm font-medium",
62
64
  children: "Current Value"
63
- }), /* @__PURE__ */ v(i, { className: "h-4 w-4 text-status-warning-text" })]
64
- }), /* @__PURE__ */ y(s, { children: [/* @__PURE__ */ v("div", {
65
+ }), /* @__PURE__ */ y(i, { className: "h-4 w-4 text-status-warning-text" })]
66
+ }), /* @__PURE__ */ b(s, { children: [/* @__PURE__ */ y("div", {
65
67
  className: "text-2xl font-bold tabular-nums",
66
- children: S(b.depreciatedValue)
67
- }), /* @__PURE__ */ v("p", {
68
+ children: C(x.depreciatedValue)
69
+ }), /* @__PURE__ */ y("p", {
68
70
  className: "text-xs text-text-secondary",
69
71
  children: "After depreciation"
70
72
  })] })]
71
73
  }),
72
- /* @__PURE__ */ y(u, {
74
+ /* @__PURE__ */ b(u, {
73
75
  treatment: "metric",
74
76
  className: "border-border-seam",
75
- children: [/* @__PURE__ */ y(c, {
77
+ children: [/* @__PURE__ */ b(c, {
76
78
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
77
- children: [/* @__PURE__ */ v(l, {
79
+ children: [/* @__PURE__ */ y(l, {
78
80
  className: "text-sm font-medium",
79
81
  children: "Depreciation"
80
- }), /* @__PURE__ */ v(t, { className: "h-4 w-4 text-text-secondary" })]
81
- }), /* @__PURE__ */ y(s, { children: [/* @__PURE__ */ y("div", {
82
+ }), /* @__PURE__ */ y(t, { className: "h-4 w-4 text-text-secondary" })]
83
+ }), /* @__PURE__ */ b(s, { children: [/* @__PURE__ */ b("div", {
82
84
  className: "text-2xl font-bold tabular-nums",
83
- children: [x, "%"]
84
- }), /* @__PURE__ */ y("p", {
85
+ children: [S, "%"]
86
+ }), /* @__PURE__ */ b("p", {
85
87
  className: "text-xs text-text-secondary",
86
- children: [S(b.totalValue - b.depreciatedValue), " total loss"]
88
+ children: [C(x.totalValue - x.depreciatedValue), " total loss"]
87
89
  })] })]
88
90
  })
89
91
  ]
90
92
  }),
91
- /* @__PURE__ */ y("div", {
93
+ /* @__PURE__ */ b("div", {
92
94
  className: "grid gap-6 md:grid-cols-2",
93
95
  children: [
94
- /* @__PURE__ */ y(o, { children: [/* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(l, { children: "Assets by Category" }) }), /* @__PURE__ */ v(s, {
96
+ /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Assets by Category" }) }), /* @__PURE__ */ y(s, {
95
97
  className: "space-y-3",
96
- children: b.byCategory.map((e) => /* @__PURE__ */ y("div", {
98
+ children: x.byCategory.map((e) => /* @__PURE__ */ b("div", {
97
99
  className: "space-y-1",
98
- children: [/* @__PURE__ */ y("div", {
100
+ children: [/* @__PURE__ */ b("div", {
99
101
  className: "flex items-center justify-between text-sm",
100
- children: [/* @__PURE__ */ v("span", {
102
+ children: [/* @__PURE__ */ y("span", {
101
103
  className: "font-medium capitalize",
102
104
  children: e.category.replace(/_/g, " ")
103
- }), /* @__PURE__ */ y("span", {
105
+ }), /* @__PURE__ */ b("span", {
104
106
  className: "text-text-secondary",
105
107
  children: [
106
108
  e.count,
107
109
  " assets - ",
108
- S(e.value)
110
+ C(e.value)
109
111
  ]
110
112
  })]
111
- }), /* @__PURE__ */ v("div", {
113
+ }), /* @__PURE__ */ y("div", {
112
114
  className: "h-3 bg-bg-sunken rounded overflow-hidden",
113
- children: /* @__PURE__ */ v("div", {
115
+ children: /* @__PURE__ */ y("div", {
114
116
  className: "h-3 bg-action-primary-bg rounded",
115
- style: { width: `${Math.round(e.value / C * 100)}%` }
117
+ style: { width: `${Math.round(e.value / w * 100)}%` }
116
118
  })
117
119
  })]
118
120
  }, e.category))
119
121
  })] }),
120
- /* @__PURE__ */ y(o, { children: [/* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(l, { children: "Assets by Department" }) }), /* @__PURE__ */ v(s, { children: /* @__PURE__ */ y(f, { children: [/* @__PURE__ */ v(g, { children: /* @__PURE__ */ y(_, { children: [
121
- /* @__PURE__ */ v(h, { children: "Department" }),
122
- /* @__PURE__ */ v(h, {
122
+ /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Assets by Department" }) }), /* @__PURE__ */ y(s, { children: /* @__PURE__ */ b(p, { children: [/* @__PURE__ */ y(_, { children: /* @__PURE__ */ b(v, { children: [
123
+ /* @__PURE__ */ y(g, { children: "Department" }),
124
+ /* @__PURE__ */ y(g, {
123
125
  className: "text-right",
124
126
  children: "Count"
125
127
  }),
126
- /* @__PURE__ */ v(h, {
128
+ /* @__PURE__ */ y(g, {
127
129
  className: "text-right",
128
130
  children: "Value"
129
131
  })
130
- ] }) }), /* @__PURE__ */ v(p, { children: b.byDepartment.map((e) => /* @__PURE__ */ y(_, { children: [
131
- /* @__PURE__ */ v(m, {
132
+ ] }) }), /* @__PURE__ */ y(m, { children: x.byDepartment.map((e) => /* @__PURE__ */ b(v, { children: [
133
+ /* @__PURE__ */ y(h, {
132
134
  className: "font-medium",
133
135
  children: e.department
134
136
  }),
135
- /* @__PURE__ */ v(m, {
137
+ /* @__PURE__ */ y(h, {
136
138
  className: "text-right",
137
139
  children: e.count
138
140
  }),
139
- /* @__PURE__ */ v(m, {
141
+ /* @__PURE__ */ y(h, {
140
142
  className: "text-right",
141
- children: S(e.value)
143
+ children: C(e.value)
142
144
  })
143
145
  ] }, e.department)) })] }) })] }),
144
- /* @__PURE__ */ y(o, { children: [/* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(l, { children: "Assets by Status" }) }), /* @__PURE__ */ v(s, { children: /* @__PURE__ */ v("div", {
146
+ /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Assets by Status" }) }), /* @__PURE__ */ y(s, { children: /* @__PURE__ */ y("div", {
145
147
  className: "flex flex-wrap gap-3",
146
- children: b.byStatus.map((e) => /* @__PURE__ */ y("div", {
148
+ children: x.byStatus.map((e) => /* @__PURE__ */ b("div", {
147
149
  className: "flex items-center gap-2 rounded-lg border p-3",
148
- children: [/* @__PURE__ */ v(a, {
150
+ children: [/* @__PURE__ */ y(a, {
149
151
  variant: e.status === "active" ? "default" : e.status === "disposed" ? "destructive" : "secondary",
150
152
  className: "capitalize",
151
153
  children: e.status.replace(/_/g, " ")
152
- }), /* @__PURE__ */ v("span", {
154
+ }), /* @__PURE__ */ y("span", {
153
155
  className: "text-lg font-bold",
154
156
  children: e.count
155
157
  })]
156
158
  }, e.status))
157
159
  }) })] }),
158
- /* @__PURE__ */ y(o, { children: [/* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(l, { children: "Depreciation Trend" }) }), /* @__PURE__ */ v(s, {
160
+ /* @__PURE__ */ b(o, { children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Depreciation Trend" }) }), /* @__PURE__ */ y(s, {
159
161
  className: "space-y-2",
160
- children: b.depreciationTrend.map((e) => /* @__PURE__ */ y("div", {
162
+ children: x.depreciationTrend.map((e) => /* @__PURE__ */ b("div", {
161
163
  className: "flex items-center gap-3",
162
164
  children: [
163
- /* @__PURE__ */ v("span", {
165
+ /* @__PURE__ */ y("span", {
164
166
  className: "w-10 text-xs text-text-secondary",
165
167
  children: e.month
166
168
  }),
167
- /* @__PURE__ */ v("div", {
169
+ /* @__PURE__ */ y("div", {
168
170
  className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
169
- children: /* @__PURE__ */ v("div", {
171
+ children: /* @__PURE__ */ y("div", {
170
172
  className: "h-4 bg-status-warning-bg rounded",
171
- style: { width: `${Math.round(e.value / w * 100)}%` }
173
+ style: { width: `${Math.round(e.value / T * 100)}%` }
172
174
  })
173
175
  }),
174
- /* @__PURE__ */ v("span", {
176
+ /* @__PURE__ */ y("span", {
175
177
  className: "text-xs font-medium w-16 text-right",
176
- children: S(e.value)
178
+ children: C(e.value)
177
179
  })
178
180
  ]
179
181
  }, e.month))
180
182
  })] }),
181
- /* @__PURE__ */ y(o, {
183
+ /* @__PURE__ */ b(o, {
182
184
  className: "md:col-span-2",
183
- children: [/* @__PURE__ */ v(c, { children: /* @__PURE__ */ v(l, { children: "Acquisition Trend" }) }), /* @__PURE__ */ v(s, {
185
+ children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Acquisition Trend" }) }), /* @__PURE__ */ y(s, {
184
186
  className: "space-y-2",
185
- children: b.acquisitionTrend.map((e) => /* @__PURE__ */ y("div", {
187
+ children: x.acquisitionTrend.map((e) => /* @__PURE__ */ b("div", {
186
188
  className: "flex items-center gap-3",
187
189
  children: [
188
- /* @__PURE__ */ v("span", {
190
+ /* @__PURE__ */ y("span", {
189
191
  className: "w-10 text-xs text-text-secondary",
190
192
  children: e.month
191
193
  }),
192
- /* @__PURE__ */ v("div", {
194
+ /* @__PURE__ */ y("div", {
193
195
  className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
194
- children: /* @__PURE__ */ v("div", {
196
+ children: /* @__PURE__ */ y("div", {
195
197
  className: "h-4 bg-status-success-bg rounded",
196
- style: { width: `${Math.round(e.value / T * 100)}%` }
198
+ style: { width: `${Math.round(e.value / E * 100)}%` }
197
199
  })
198
200
  }),
199
- /* @__PURE__ */ y("span", {
201
+ /* @__PURE__ */ b("span", {
200
202
  className: "text-xs w-12 text-right",
201
203
  children: [e.count, " units"]
202
204
  }),
203
- /* @__PURE__ */ v("span", {
205
+ /* @__PURE__ */ y("span", {
204
206
  className: "text-xs font-medium w-16 text-right",
205
- children: S(e.value)
207
+ children: C(e.value)
206
208
  })
207
209
  ]
208
210
  }, e.month))
@@ -214,6 +216,6 @@ function b() {
214
216
  });
215
217
  }
216
218
  //#endregion
217
- export { b as PortfolioPortfolioOverviewPage };
219
+ export { x as PortfolioPortfolioOverviewPage };
218
220
 
219
221
  //# sourceMappingURL=PortfolioPortfolioOverviewPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PortfolioPortfolioOverviewPage.js","names":[],"sources":["../../../src/assethandler/pages/PortfolioPortfolioOverviewPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n GradientText,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport { Package, DollarSign, TrendingDown, BarChart3 } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function PortfolioPortfolioOverviewPage() {\n const { portfolio } = useAssetHandlerStore();\n\n const depreciationPct =\n portfolio.totalValue > 0\n ? Math.round(\n ((portfolio.totalValue - portfolio.depreciatedValue) / portfolio.totalValue) * 100\n )\n : 0;\n\n const formatCurrency = (val: number) =>\n val >= 1000000 ? `$${(val / 1000000).toFixed(2)}M` : `$${val.toLocaleString()}`;\n\n const maxCategoryValue = Math.max(...portfolio.byCategory.map((c) => c.value), 1);\n const maxDepreciation = Math.max(...portfolio.depreciationTrend.map((d) => d.value), 1);\n const maxAcquisitionValue = Math.max(...portfolio.acquisitionTrend.map((a) => a.value), 1);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Portfolio Overview</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Comprehensive view of your asset portfolio, valuations, and trends.\n </p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Assets</CardTitle>\n <Package className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {portfolio.totalAssets.toLocaleString()}\n </div>\n <p className=\"text-xs text-text-secondary\">Across all categories</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Value</CardTitle>\n <DollarSign className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(portfolio.totalValue)}\n </div>\n <p className=\"text-xs text-text-secondary\">Original purchase value</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Current Value</CardTitle>\n <TrendingDown className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(portfolio.depreciatedValue)}\n </div>\n <p className=\"text-xs text-text-secondary\">After depreciation</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Depreciation</CardTitle>\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{depreciationPct}%</div>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(portfolio.totalValue - portfolio.depreciatedValue)} total loss\n </p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-6 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Assets by Category</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {portfolio.byCategory.map((cat) => (\n <div key={cat.category} className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-medium capitalize\">{cat.category.replace(/_/g, ' ')}</span>\n <span className=\"text-text-secondary\">\n {cat.count} assets - {formatCurrency(cat.value)}\n </span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((cat.value / maxCategoryValue) * 100)}%` }}\n />\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assets by Department</CardTitle>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Department</TableHead>\n <TableHead className=\"text-right\">Count</TableHead>\n <TableHead className=\"text-right\">Value</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {portfolio.byDepartment.map((dept) => (\n <TableRow key={dept.department}>\n <TableCell className=\"font-medium\">{dept.department}</TableCell>\n <TableCell className=\"text-right\">{dept.count}</TableCell>\n <TableCell className=\"text-right\">{formatCurrency(dept.value)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assets by Status</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-3\">\n {portfolio.byStatus.map((s) => (\n <div key={s.status} className=\"flex items-center gap-2 rounded-lg border p-3\">\n <Badge\n variant={\n s.status === 'active'\n ? 'default'\n : s.status === 'disposed'\n ? 'destructive'\n : 'secondary'\n }\n className=\"capitalize\"\n >\n {s.status.replace(/_/g, ' ')}\n </Badge>\n <span className=\"text-lg font-bold\">{s.count}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Depreciation Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {portfolio.depreciationTrend.map((d) => (\n <div key={d.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-xs text-text-secondary\">{d.month}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-status-warning-bg rounded\"\n style={{ width: `${Math.round((d.value / maxDepreciation) * 100)}%` }}\n />\n </div>\n <span className=\"text-xs font-medium w-16 text-right\">\n {formatCurrency(d.value)}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"md:col-span-2\">\n <CardHeader>\n <CardTitle>Acquisition Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {portfolio.acquisitionTrend.map((a) => (\n <div key={a.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-xs text-text-secondary\">{a.month}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-status-success-bg rounded\"\n style={{ width: `${Math.round((a.value / maxAcquisitionValue) * 100)}%` }}\n />\n </div>\n <span className=\"text-xs w-12 text-right\">{a.count} units</span>\n <span className=\"text-xs font-medium w-16 text-right\">\n {formatCurrency(a.value)}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"PortfolioPortfolioOverviewPage.js","names":[],"sources":["../../../src/assethandler/pages/PortfolioPortfolioOverviewPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n GradientText,\n GlassCard,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Package, DollarSign, TrendingDown, BarChart3 } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function PortfolioPortfolioOverviewPage() {\n const { portfolio } = useAssetHandlerStore();\n\n const depreciationPct =\n portfolio.totalValue > 0\n ? Math.round(\n ((portfolio.totalValue - portfolio.depreciatedValue) / portfolio.totalValue) * 100\n )\n : 0;\n\n const formatCurrency = (val: number) =>\n val >= 1000000 ? `$${(val / 1000000).toFixed(2)}M` : `$${val.toLocaleString()}`;\n\n const maxCategoryValue = Math.max(...portfolio.byCategory.map((c) => c.value), 1);\n const maxDepreciation = Math.max(...portfolio.depreciationTrend.map((d) => d.value), 1);\n const maxAcquisitionValue = Math.max(...portfolio.acquisitionTrend.map((a) => a.value), 1);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Portfolio Overview</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Comprehensive view of your asset portfolio, valuations, and trends.\n </p>\n </div>\n\n <PagePurpose>\n The big-picture financial view of everything you own: how many assets you have, what they\n were worth, what they are worth now after depreciation, and how value is spread across\n categories and departments. Use it to inform replacement planning, budgeting and audit.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Assets</CardTitle>\n <Package className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {portfolio.totalAssets.toLocaleString()}\n </div>\n <p className=\"text-xs text-text-secondary\">Across all categories</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Value</CardTitle>\n <DollarSign className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(portfolio.totalValue)}\n </div>\n <p className=\"text-xs text-text-secondary\">Original purchase value</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Current Value</CardTitle>\n <TrendingDown className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {formatCurrency(portfolio.depreciatedValue)}\n </div>\n <p className=\"text-xs text-text-secondary\">After depreciation</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Depreciation</CardTitle>\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{depreciationPct}%</div>\n <p className=\"text-xs text-text-secondary\">\n {formatCurrency(portfolio.totalValue - portfolio.depreciatedValue)} total loss\n </p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-6 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Assets by Category</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {portfolio.byCategory.map((cat) => (\n <div key={cat.category} className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-sm\">\n <span className=\"font-medium capitalize\">{cat.category.replace(/_/g, ' ')}</span>\n <span className=\"text-text-secondary\">\n {cat.count} assets - {formatCurrency(cat.value)}\n </span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-action-primary-bg rounded\"\n style={{ width: `${Math.round((cat.value / maxCategoryValue) * 100)}%` }}\n />\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assets by Department</CardTitle>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Department</TableHead>\n <TableHead className=\"text-right\">Count</TableHead>\n <TableHead className=\"text-right\">Value</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {portfolio.byDepartment.map((dept) => (\n <TableRow key={dept.department}>\n <TableCell className=\"font-medium\">{dept.department}</TableCell>\n <TableCell className=\"text-right\">{dept.count}</TableCell>\n <TableCell className=\"text-right\">{formatCurrency(dept.value)}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Assets by Status</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"flex flex-wrap gap-3\">\n {portfolio.byStatus.map((s) => (\n <div key={s.status} className=\"flex items-center gap-2 rounded-lg border p-3\">\n <Badge\n variant={\n s.status === 'active'\n ? 'default'\n : s.status === 'disposed'\n ? 'destructive'\n : 'secondary'\n }\n className=\"capitalize\"\n >\n {s.status.replace(/_/g, ' ')}\n </Badge>\n <span className=\"text-lg font-bold\">{s.count}</span>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Depreciation Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {portfolio.depreciationTrend.map((d) => (\n <div key={d.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-xs text-text-secondary\">{d.month}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-status-warning-bg rounded\"\n style={{ width: `${Math.round((d.value / maxDepreciation) * 100)}%` }}\n />\n </div>\n <span className=\"text-xs font-medium w-16 text-right\">\n {formatCurrency(d.value)}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"md:col-span-2\">\n <CardHeader>\n <CardTitle>Acquisition Trend</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-2\">\n {portfolio.acquisitionTrend.map((a) => (\n <div key={a.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-xs text-text-secondary\">{a.month}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-status-success-bg rounded\"\n style={{ width: `${Math.round((a.value / maxAcquisitionValue) * 100)}%` }}\n />\n </div>\n <span className=\"text-xs w-12 text-right\">{a.count} units</span>\n <span className=\"text-xs font-medium w-16 text-right\">\n {formatCurrency(a.value)}\n </span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAmBA,SAAgB,IAAiC;CAC/C,IAAM,EAAE,iBAAc,GAAsB,EAEtC,IACJ,EAAU,aAAa,IACnB,KAAK,OACD,EAAU,aAAa,EAAU,oBAAoB,EAAU,aAAc,IAChF,GACD,GAEA,KAAkB,MACtB,KAAO,MAAU,KAAK,IAAM,KAAS,QAAQ,EAAE,CAAC,KAAK,IAAI,EAAI,gBAAgB,IAEzE,IAAmB,KAAK,IAAI,GAAG,EAAU,WAAW,KAAK,MAAM,EAAE,MAAM,EAAE,EAAE,EAC3E,IAAkB,KAAK,IAAI,GAAG,EAAU,kBAAkB,KAAK,MAAM,EAAE,MAAM,EAAE,EAAE,EACjF,IAAsB,KAAK,IAAI,GAAG,EAAU,iBAAiB,KAAK,MAAM,EAAE,MAAM,EAAE,EAAE;AAE1F,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,sBAAiC,CAAA;IAC5C,CAAA,EACL,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA,CACA,EAAA,CAAA;GAEN,kBAAC,GAAD,EAAA,UAAa,4QAIC,CAAA;GAEd,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAwB,CAAA,EACnE,kBAAC,GAAD,EAAS,WAAU,+BAAgC,CAAA,CACxC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAU,YAAY,gBAAgB;OACnC,CAAA,EACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAyB,CAAA,CACxD,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAuB,CAAA,EAClE,kBAAC,GAAD,EAAY,WAAU,oCAAqC,CAAA,CAChD;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAe,EAAU,WAAW;OACjC,CAAA,EACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAA2B,CAAA,CAC1D,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAyB,CAAA,EACpE,kBAAC,GAAD,EAAc,WAAU,oCAAqC,CAAA,CAClD;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAe,EAAU,iBAAiB;OACvC,CAAA,EACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAsB,CAAA,CACrD,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAwB,CAAA,EACnE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,CAC1C;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CAAkD,GAAgB,IAAO;UACzE,kBAAC,KAAD;OAAG,WAAU;iBAAb,CACG,EAAe,EAAU,aAAa,EAAU,iBAAiB,EAAC,cACjE;SACQ,EAAA,CAAA,CACJ;;KACR;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,sBAA8B,CAAA,EAC9B,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBACpB,EAAU,WAAW,KAAK,MACzB,kBAAC,OAAD;OAAwB,WAAU;iBAAlC,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAA0B,EAAI,SAAS,QAAQ,MAAM,IAAI;SAAQ,CAAA,EACjF,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACG,EAAI;UAAM;UAAW,EAAe,EAAI,MAAM;UAC1C;WACH;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAU;SACV,OAAO,EAAE,OAAO,GAAG,KAAK,MAAO,EAAI,QAAQ,IAAoB,IAAI,CAAC,IAAI;SACxE,CAAA;QACE,CAAA,CACF;SAbI,EAAI,SAaR,CACN;MACU,CAAA,CACT,EAAA,CAAA;KAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,wBAAgC,CAAA,EAChC,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD,EAAA,UAAW,cAAsB,CAAA;MACjC,kBAAC,GAAD;OAAW,WAAU;iBAAa;OAAiB,CAAA;MACnD,kBAAC,GAAD;OAAW,WAAU;iBAAa;OAAiB,CAAA;MAC1C,EAAA,CAAA,EACC,CAAA,EACd,kBAAC,GAAD,EAAA,UACG,EAAU,aAAa,KAAK,MAC3B,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD;OAAW,WAAU;iBAAe,EAAK;OAAuB,CAAA;MAChE,kBAAC,GAAD;OAAW,WAAU;iBAAc,EAAK;OAAkB,CAAA;MAC1D,kBAAC,GAAD;OAAW,WAAU;iBAAc,EAAe,EAAK,MAAM;OAAa,CAAA;MACjE,EAAA,EAJI,EAAK,WAIT,CACX,EACQ,CAAA,CACN,EAAA,CAAA,EACI,CAAA,CACT,EAAA,CAAA;KAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,oBAA4B,CAAA,EAC5B,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBACZ,EAAU,SAAS,KAAK,MACvB,kBAAC,OAAD;OAAoB,WAAU;iBAA9B,CACE,kBAAC,GAAD;QACE,SACE,EAAE,WAAW,WACT,YACA,EAAE,WAAW,aACX,gBACA;QAER,WAAU;kBAET,EAAE,OAAO,QAAQ,MAAM,IAAI;QACtB,CAAA,EACR,kBAAC,QAAD;QAAM,WAAU;kBAAqB,EAAE;QAAa,CAAA,CAChD;SAdI,EAAE,OAcN,CACN;MACE,CAAA,EACM,CAAA,CACT,EAAA,CAAA;KAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,sBAA8B,CAAA,EAC9B,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBACpB,EAAU,kBAAkB,KAAK,MAChC,kBAAC,OAAD;OAAmB,WAAU;iBAA7B;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAoC,EAAE;SAAa,CAAA;QACnE,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,WAAU;UACV,OAAO,EAAE,OAAO,GAAG,KAAK,MAAO,EAAE,QAAQ,IAAmB,IAAI,CAAC,IAAI;UACrE,CAAA;SACE,CAAA;QACN,kBAAC,QAAD;SAAM,WAAU;mBACb,EAAe,EAAE,MAAM;SACnB,CAAA;QACH;SAXI,EAAE,MAWN,CACN;MACU,CAAA,CACT,EAAA,CAAA;KAEP,kBAAC,GAAD;MAAM,WAAU;gBAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,qBAA6B,CAAA,EAC7B,CAAA,EACb,kBAAC,GAAD;OAAa,WAAU;iBACpB,EAAU,iBAAiB,KAAK,MAC/B,kBAAC,OAAD;QAAmB,WAAU;kBAA7B;SACE,kBAAC,QAAD;UAAM,WAAU;oBAAoC,EAAE;UAAa,CAAA;SACnE,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAU;WACV,OAAO,EAAE,OAAO,GAAG,KAAK,MAAO,EAAE,QAAQ,IAAuB,IAAI,CAAC,IAAI;WACzE,CAAA;UACE,CAAA;SACN,kBAAC,QAAD;UAAM,WAAU;oBAAhB,CAA2C,EAAE,OAAM,SAAa;;SAChE,kBAAC,QAAD;UAAM,WAAU;oBACb,EAAe,EAAE,MAAM;UACnB,CAAA;SACH;UAZI,EAAE,MAYN,CACN;OACU,CAAA,CACT;;KACH;;GACF"}
@@ -1,11 +1,11 @@
1
1
  import { useState as e } from "react";
2
2
  import { ShieldCheck as t } from "lucide-react";
3
- import { GradientText as n } from "@burdenoff/fe-libs/ui";
4
- import { jsx as r, jsxs as i } from "react/jsx-runtime";
5
- import { gql as a } from "@apollo/client";
6
- import { useMutation as o, useQuery as s } from "@apollo/client/react";
3
+ import { EmphasisPanel as n, GradientText as r, IllustratedEmptyState as i, PagePurpose as a } from "@burdenoff/fe-libs/ui";
4
+ import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
+ import { gql as c } from "@apollo/client";
6
+ import { useMutation as l, useQuery as u } from "@apollo/client/react";
7
7
  //#region src/assethandler/pages/ProvenancePage.tsx
8
- var c = a`
8
+ var d = c`
9
9
  query AssetHandlerProvenanceRecords {
10
10
  provenanceRecords {
11
11
  id
@@ -17,96 +17,99 @@ var c = a`
17
17
  attestedBy
18
18
  }
19
19
  }
20
- `, l = a`
20
+ `, f = c`
21
21
  mutation AssetHandlerRecordProvenance($input: RecordProvenanceInput!) {
22
22
  recordProvenance(input: $input) {
23
23
  id
24
24
  }
25
25
  }
26
26
  `;
27
- function u() {
28
- let [a, u] = e("AST-001"), [d, f] = e("polygon-amoy"), { data: p, loading: m, refetch: h } = s(c, { fetchPolicy: "cache-and-network" }), [g, { loading: _ }] = o(l, { onCompleted: () => {
29
- h();
30
- } }), v = p?.provenanceRecords ?? [];
31
- return /* @__PURE__ */ i("div", {
27
+ function p() {
28
+ let [c, p] = e("AST-001"), [m, h] = e("polygon-amoy"), { data: g, loading: _, refetch: v } = u(d, { fetchPolicy: "cache-and-network" }), [y, { loading: b }] = l(f, { onCompleted: () => {
29
+ v();
30
+ } }), x = g?.provenanceRecords ?? [];
31
+ return /* @__PURE__ */ s("div", {
32
32
  className: "space-y-4 p-4",
33
33
  children: [
34
- /* @__PURE__ */ i("h1", {
34
+ /* @__PURE__ */ s("h1", {
35
35
  className: "flex items-center gap-2 text-2xl font-semibold",
36
36
  children: [
37
- /* @__PURE__ */ r(t, { className: "h-6 w-6" }),
37
+ /* @__PURE__ */ o(t, { className: "h-6 w-6" }),
38
38
  " ",
39
- /* @__PURE__ */ r(n, { children: "Provenance" })
39
+ /* @__PURE__ */ o(r, { children: "Provenance" })
40
40
  ]
41
41
  }),
42
- /* @__PURE__ */ r("p", {
43
- className: "text-text-secondary",
44
- children: "Verify immutable asset provenance and lifecycle attestations."
45
- }),
46
- /* @__PURE__ */ i("form", {
47
- className: "grid gap-3 rounded-lg border p-4 md:grid-cols-3",
42
+ /* @__PURE__ */ o(a, { children: "Prove an asset's history is tamper-proof. Record cryptographic attestations of key lifecycle events to a blockchain network so ownership, custody and condition can be independently verified later — essential for high-value, regulated or resold assets." }),
43
+ /* @__PURE__ */ s(n, { children: [/* @__PURE__ */ o("h2", {
44
+ className: "text-sm font-semibold mb-3",
45
+ children: "Record an attestation"
46
+ }), /* @__PURE__ */ s("form", {
47
+ className: "grid gap-3 md:grid-cols-3",
48
48
  onSubmit: (e) => {
49
- e.preventDefault(), g({ variables: { input: {
50
- assetId: a,
51
- hash: `${a}-${Date.now()}`,
52
- chainNetwork: d,
49
+ e.preventDefault(), y({ variables: { input: {
50
+ assetId: c,
51
+ hash: `${c}-${Date.now()}`,
52
+ chainNetwork: m,
53
53
  metadata: { source: "assethandler-ui" }
54
54
  } } });
55
55
  },
56
56
  children: [
57
- /* @__PURE__ */ r("input", {
57
+ /* @__PURE__ */ o("input", {
58
58
  className: "rounded-md border px-3 py-2",
59
- value: a,
60
- onChange: (e) => u(e.target.value)
59
+ value: c,
60
+ onChange: (e) => p(e.target.value),
61
+ "aria-label": "Asset ID"
61
62
  }),
62
- /* @__PURE__ */ r("input", {
63
+ /* @__PURE__ */ o("input", {
63
64
  className: "rounded-md border px-3 py-2",
64
- value: d,
65
- onChange: (e) => f(e.target.value)
65
+ value: m,
66
+ onChange: (e) => h(e.target.value),
67
+ "aria-label": "Chain network"
66
68
  }),
67
- /* @__PURE__ */ r("button", {
69
+ /* @__PURE__ */ o("button", {
68
70
  className: "rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text",
69
- disabled: _,
71
+ disabled: b,
70
72
  type: "submit",
71
- children: _ ? "Recording..." : "Record Attestation"
73
+ children: b ? "Recording..." : "Record Attestation"
72
74
  })
73
75
  ]
74
- }),
75
- /* @__PURE__ */ i("div", {
76
+ })] }),
77
+ /* @__PURE__ */ s("div", {
76
78
  className: "rounded-lg border",
77
79
  children: [
78
- /* @__PURE__ */ i("div", {
80
+ /* @__PURE__ */ s("div", {
79
81
  className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary",
80
82
  children: [
81
- /* @__PURE__ */ r("span", { children: "Asset" }),
82
- /* @__PURE__ */ r("span", { children: "Network" }),
83
- /* @__PURE__ */ r("span", { children: "Hash" }),
84
- /* @__PURE__ */ r("span", { children: "Tx" }),
85
- /* @__PURE__ */ r("span", { children: "Attested At" })
83
+ /* @__PURE__ */ o("span", { children: "Asset" }),
84
+ /* @__PURE__ */ o("span", { children: "Network" }),
85
+ /* @__PURE__ */ o("span", { children: "Hash" }),
86
+ /* @__PURE__ */ o("span", { children: "Tx" }),
87
+ /* @__PURE__ */ o("span", { children: "Attested At" })
86
88
  ]
87
89
  }),
88
- m && v.length === 0 ? /* @__PURE__ */ r("div", {
90
+ _ && x.length === 0 ? /* @__PURE__ */ o("div", {
89
91
  className: "space-y-2 px-4 py-4",
90
- 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))
92
+ children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ o("div", { className: "h-8 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
91
93
  }) : null,
92
- !m && v.length === 0 ? /* @__PURE__ */ r("div", {
93
- className: "px-4 py-4 text-sm text-text-secondary",
94
- children: "No provenance records found."
94
+ !_ && x.length === 0 ? /* @__PURE__ */ o(i, {
95
+ illustration: "empty-data",
96
+ title: "No provenance records yet",
97
+ description: "Record an attestation above to start an immutable, verifiable history for your assets."
95
98
  }) : null,
96
- v.map((e) => /* @__PURE__ */ i("div", {
99
+ x.map((e) => /* @__PURE__ */ s("div", {
97
100
  className: "grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0",
98
101
  children: [
99
- /* @__PURE__ */ r("span", { children: e.assetId }),
100
- /* @__PURE__ */ r("span", { children: e.chainNetwork }),
101
- /* @__PURE__ */ r("span", {
102
+ /* @__PURE__ */ o("span", { children: e.assetId }),
103
+ /* @__PURE__ */ o("span", { children: e.chainNetwork }),
104
+ /* @__PURE__ */ o("span", {
102
105
  className: "truncate",
103
106
  children: e.hash
104
107
  }),
105
- /* @__PURE__ */ r("span", {
108
+ /* @__PURE__ */ o("span", {
106
109
  className: "truncate text-text-secondary",
107
110
  children: e.txHash ?? "pending"
108
111
  }),
109
- /* @__PURE__ */ r("span", {
112
+ /* @__PURE__ */ o("span", {
110
113
  className: "text-text-secondary",
111
114
  children: new Date(e.attestedAt).toLocaleString()
112
115
  })
@@ -118,6 +121,6 @@ function u() {
118
121
  });
119
122
  }
120
123
  //#endregion
121
- export { u as ProvenancePage };
124
+ export { p as ProvenancePage };
122
125
 
123
126
  //# sourceMappingURL=ProvenancePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProvenancePage.js","names":[],"sources":["../../../src/assethandler/pages/ProvenancePage.tsx"],"sourcesContent":["import { ShieldCheck } from 'lucide-react';\nimport { GradientText, IllustratedEmptyState } from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\n\nconst PROVENANCE_RECORDS_QUERY = gql`\n query AssetHandlerProvenanceRecords {\n provenanceRecords {\n id\n assetId\n hash\n chainNetwork\n txHash\n attestedAt\n attestedBy\n }\n }\n`;\n\nconst RECORD_PROVENANCE_MUTATION = gql`\n mutation AssetHandlerRecordProvenance($input: RecordProvenanceInput!) {\n recordProvenance(input: $input) {\n id\n }\n }\n`;\n\nexport function ProvenancePage() {\n const [assetId, setAssetId] = useState('AST-001');\n const [chainNetwork, setChainNetwork] = useState('polygon-amoy');\n\n const { data, loading, refetch } = useQuery<{\n provenanceRecords: Array<{\n id: string;\n assetId: string;\n hash: string;\n chainNetwork: string;\n txHash: string | null;\n attestedAt: string;\n attestedBy: string;\n }>;\n }>(PROVENANCE_RECORDS_QUERY, { fetchPolicy: 'cache-and-network' });\n\n const [recordProvenance, { loading: recording }] = useMutation(RECORD_PROVENANCE_MUTATION, {\n onCompleted: () => {\n void refetch();\n },\n });\n\n const records = data?.provenanceRecords ?? [];\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1 className=\"flex items-center gap-2 text-2xl font-semibold\">\n <ShieldCheck className=\"h-6 w-6\" /> <GradientText>Provenance</GradientText>\n </h1>\n <p className=\"text-text-secondary\">\n Verify immutable asset provenance and lifecycle attestations.\n </p>\n <form\n className=\"grid gap-3 rounded-lg border p-4 md:grid-cols-3\"\n onSubmit={(event) => {\n event.preventDefault();\n const hash = `${assetId}-${Date.now()}`;\n void recordProvenance({\n variables: {\n input: { assetId, hash, chainNetwork, metadata: { source: 'assethandler-ui' } },\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 />\n <input\n className=\"rounded-md border px-3 py-2\"\n value={chainNetwork}\n onChange={(event) => setChainNetwork(event.target.value)}\n />\n <button\n className=\"rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text\"\n disabled={recording}\n type=\"submit\"\n >\n {recording ? 'Recording...' : 'Record Attestation'}\n </button>\n </form>\n <div className=\"rounded-lg border\">\n <div className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n <span>Asset</span>\n <span>Network</span>\n <span>Hash</span>\n <span>Tx</span>\n <span>Attested At</span>\n </div>\n {loading && records.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 && records.length === 0 ? (\n <div className=\"px-4 py-4 text-sm text-text-secondary\">No provenance records found.</div>\n ) : null}\n {records.map((record) => (\n <div\n key={record.id}\n className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0\"\n >\n <span>{record.assetId}</span>\n <span>{record.chainNetwork}</span>\n <span className=\"truncate\">{record.hash}</span>\n <span className=\"truncate text-text-secondary\">{record.txHash ?? 'pending'}</span>\n <span className=\"text-text-secondary\">\n {new Date(record.attestedAt).toLocaleString()}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,IAAM,IAA2B,CAAG;;;;;;;;;;;;GAc9B,IAA6B,CAAG;;;;;;;AAQtC,SAAgB,IAAiB;CAC/B,IAAM,CAAC,GAAS,KAAc,EAAS,UAAU,EAC3C,CAAC,GAAc,KAAmB,EAAS,eAAe,EAE1D,EAAE,SAAM,YAAS,eAAY,EAUhC,GAA0B,EAAE,aAAa,qBAAqB,CAAC,EAE5D,CAAC,GAAkB,EAAE,SAAS,OAAe,EAAY,GAA4B,EACzF,mBAAmB;AACZ,KAAS;IAEjB,CAAC,EAEI,IAAU,GAAM,qBAAqB,EAAE;AAE7C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;;KAAC,kBAAC,GAAD,EAAA,UAAc,cAAyB,CAAA;KACxE;;GACL,kBAAC,KAAD;IAAG,WAAU;cAAsB;IAE/B,CAAA;GACJ,kBAAC,QAAD;IACE,WAAU;IACV,WAAW,MAAU;AAGd,KAFL,EAAM,gBAAgB,EAEjB,EAAiB,EACpB,WAAW,EACT,OAAO;MAAE;MAAS,MAHT,GAAG,EAAQ,GAAG,KAAK,KAAK;MAGT;MAAc,UAAU,EAAE,QAAQ,mBAAmB;MAAE,EAChF,EACF,CAAC;;cATN;KAYE,kBAAC,SAAD;MACE,WAAU;MACV,OAAO;MACP,WAAW,MAAU,EAAW,EAAM,OAAO,MAAM;MACnD,CAAA;KACF,kBAAC,SAAD;MACE,WAAU;MACV,OAAO;MACP,WAAW,MAAU,EAAgB,EAAM,OAAO,MAAM;MACxD,CAAA;KACF,kBAAC,UAAD;MACE,WAAU;MACV,UAAU;MACV,MAAK;gBAEJ,IAAY,iBAAiB;MACvB,CAAA;KACJ;;GACP,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA;OAClB,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;OACpB,kBAAC,QAAD,EAAA,UAAM,QAAW,CAAA;OACjB,kBAAC,QAAD,EAAA,UAAM,MAAS,CAAA;OACf,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA;OACpB;;KACL,KAAW,EAAQ,WAAW,IAC7B,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,EAAQ,WAAW,IAC9B,kBAAC,OAAD;MAAK,WAAU;gBAAwC;MAAkC,CAAA,GACvF;KACH,EAAQ,KAAK,MACZ,kBAAC,OAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,QAAD,EAAA,UAAO,EAAO,SAAe,CAAA;OAC7B,kBAAC,QAAD,EAAA,UAAO,EAAO,cAAoB,CAAA;OAClC,kBAAC,QAAD;QAAM,WAAU;kBAAY,EAAO;QAAY,CAAA;OAC/C,kBAAC,QAAD;QAAM,WAAU;kBAAgC,EAAO,UAAU;QAAiB,CAAA;OAClF,kBAAC,QAAD;QAAM,WAAU;kBACb,IAAI,KAAK,EAAO,WAAW,CAAC,gBAAgB;QACxC,CAAA;OACH;QAVC,EAAO,GAUR,CACN;KACE;;GACF"}
1
+ {"version":3,"file":"ProvenancePage.js","names":[],"sources":["../../../src/assethandler/pages/ProvenancePage.tsx"],"sourcesContent":["import { ShieldCheck } from 'lucide-react';\nimport { GradientText, IllustratedEmptyState, EmphasisPanel, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\n\nconst PROVENANCE_RECORDS_QUERY = gql`\n query AssetHandlerProvenanceRecords {\n provenanceRecords {\n id\n assetId\n hash\n chainNetwork\n txHash\n attestedAt\n attestedBy\n }\n }\n`;\n\nconst RECORD_PROVENANCE_MUTATION = gql`\n mutation AssetHandlerRecordProvenance($input: RecordProvenanceInput!) {\n recordProvenance(input: $input) {\n id\n }\n }\n`;\n\nexport function ProvenancePage() {\n const [assetId, setAssetId] = useState('AST-001');\n const [chainNetwork, setChainNetwork] = useState('polygon-amoy');\n\n const { data, loading, refetch } = useQuery<{\n provenanceRecords: Array<{\n id: string;\n assetId: string;\n hash: string;\n chainNetwork: string;\n txHash: string | null;\n attestedAt: string;\n attestedBy: string;\n }>;\n }>(PROVENANCE_RECORDS_QUERY, { fetchPolicy: 'cache-and-network' });\n\n const [recordProvenance, { loading: recording }] = useMutation(RECORD_PROVENANCE_MUTATION, {\n onCompleted: () => {\n void refetch();\n },\n });\n\n const records = data?.provenanceRecords ?? [];\n\n return (\n <div className=\"space-y-4 p-4\">\n <h1 className=\"flex items-center gap-2 text-2xl font-semibold\">\n <ShieldCheck className=\"h-6 w-6\" /> <GradientText>Provenance</GradientText>\n </h1>\n <PagePurpose>\n Prove an asset&apos;s history is tamper-proof. Record cryptographic attestations of key lifecycle\n events to a blockchain network so ownership, custody and condition can be independently\n verified later — essential for high-value, regulated or resold assets.\n </PagePurpose>\n <EmphasisPanel>\n <h2 className=\"text-sm font-semibold mb-3\">Record an attestation</h2>\n <form\n className=\"grid gap-3 md:grid-cols-3\"\n onSubmit={(event) => {\n event.preventDefault();\n const hash = `${assetId}-${Date.now()}`;\n void recordProvenance({\n variables: {\n input: { assetId, hash, chainNetwork, metadata: { source: 'assethandler-ui' } },\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 <input\n className=\"rounded-md border px-3 py-2\"\n value={chainNetwork}\n onChange={(event) => setChainNetwork(event.target.value)}\n aria-label=\"Chain network\"\n />\n <button\n className=\"rounded-md bg-action-primary-bg px-3 py-2 text-action-primary-text\"\n disabled={recording}\n type=\"submit\"\n >\n {recording ? 'Recording...' : 'Record Attestation'}\n </button>\n </form>\n </EmphasisPanel>\n <div className=\"rounded-lg border\">\n <div className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-xs font-semibold uppercase tracking-wide text-text-secondary\">\n <span>Asset</span>\n <span>Network</span>\n <span>Hash</span>\n <span>Tx</span>\n <span>Attested At</span>\n </div>\n {loading && records.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 && records.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No provenance records yet\"\n description=\"Record an attestation above to start an immutable, verifiable history for your assets.\"\n />\n ) : null}\n {records.map((record) => (\n <div\n key={record.id}\n className=\"grid grid-cols-5 gap-3 border-b px-4 py-3 text-sm last:border-b-0\"\n >\n <span>{record.assetId}</span>\n <span>{record.chainNetwork}</span>\n <span className=\"truncate\">{record.hash}</span>\n <span className=\"truncate text-text-secondary\">{record.txHash ?? 'pending'}</span>\n <span className=\"text-text-secondary\">\n {new Date(record.attestedAt).toLocaleString()}\n </span>\n </div>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;AAMA,IAAM,IAA2B,CAAG;;;;;;;;;;;;GAc9B,IAA6B,CAAG;;;;;;;AAQtC,SAAgB,IAAiB;CAC/B,IAAM,CAAC,GAAS,KAAc,EAAS,UAAU,EAC3C,CAAC,GAAc,KAAmB,EAAS,eAAe,EAE1D,EAAE,SAAM,YAAS,eAAY,EAUhC,GAA0B,EAAE,aAAa,qBAAqB,CAAC,EAE5D,CAAC,GAAkB,EAAE,SAAS,OAAe,EAAY,GAA4B,EACzF,mBAAmB;AACZ,KAAS;IAEjB,CAAC,EAEI,IAAU,GAAM,qBAAqB,EAAE;AAE7C,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,MAAD;IAAI,WAAU;cAAd;KACE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA;;KAAC,kBAAC,GAAD,EAAA,UAAc,cAAyB,CAAA;KACxE;;GACL,kBAAC,GAAD,EAAA,UAAa,+PAIC,CAAA;GACd,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAA6B;IAA0B,CAAA,EACrE,kBAAC,QAAD;IACE,WAAU;IACV,WAAW,MAAU;AAGhB,KAFL,EAAM,gBAAgB,EAEjB,EAAiB,EACpB,WAAW,EACT,OAAO;MAAE;MAAS,MAHT,GAAG,EAAQ,GAAG,KAAK,KAAK;MAGT;MAAc,UAAU,EAAE,QAAQ,mBAAmB;MAAE,EAChF,EACF,CAAC;;cATJ;KAYE,kBAAC,SAAD;MACE,WAAU;MACV,OAAO;MACP,WAAW,MAAU,EAAW,EAAM,OAAO,MAAM;MACnD,cAAW;MACX,CAAA;KACF,kBAAC,SAAD;MACE,WAAU;MACV,OAAO;MACP,WAAW,MAAU,EAAgB,EAAM,OAAO,MAAM;MACxD,cAAW;MACX,CAAA;KACF,kBAAC,UAAD;MACE,WAAU;MACV,UAAU;MACV,MAAK;gBAEJ,IAAY,iBAAiB;MACvB,CAAA;KACJ;MACO,EAAA,CAAA;GAChB,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,QAAD,EAAA,UAAM,SAAY,CAAA;OAClB,kBAAC,QAAD,EAAA,UAAM,WAAc,CAAA;OACpB,kBAAC,QAAD,EAAA,UAAM,QAAW,CAAA;OACjB,kBAAC,QAAD,EAAA,UAAM,MAAS,CAAA;OACf,kBAAC,QAAD,EAAA,UAAM,eAAkB,CAAA;OACpB;;KACL,KAAW,EAAQ,WAAW,IAC7B,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,EAAQ,WAAW,IAC9B,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,CAAA,GACA;KACH,EAAQ,KAAK,MACZ,kBAAC,OAAD;MAEE,WAAU;gBAFZ;OAIE,kBAAC,QAAD,EAAA,UAAO,EAAO,SAAe,CAAA;OAC7B,kBAAC,QAAD,EAAA,UAAO,EAAO,cAAoB,CAAA;OAClC,kBAAC,QAAD;QAAM,WAAU;kBAAY,EAAO;QAAY,CAAA;OAC/C,kBAAC,QAAD;QAAM,WAAU;kBAAgC,EAAO,UAAU;QAAiB,CAAA;OAClF,kBAAC,QAAD;QAAM,WAAU;kBACb,IAAI,KAAK,EAAO,WAAW,CAAC,gBAAgB;QACxC,CAAA;OACH;QAVC,EAAO,GAUR,CACN;KACE;;GACF"}