@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.
- package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +538 -534
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/AuditTrailPage.js +93 -91
- package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
- package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
- package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +157 -126
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +34 -35
- package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +56 -53
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
- package/dist/assethandler/pages/SamLicensesPage.js +32 -33
- package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/pages/UsersPage.js +108 -99
- package/dist/assethandler/pages/UsersPage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
- 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,
|
|
4
|
-
import { jsx as
|
|
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
|
|
7
|
-
let { portfolio:
|
|
8
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
11
|
+
/* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("h1", {
|
|
12
12
|
className: "text-2xl font-semibold",
|
|
13
|
-
children: /* @__PURE__ */
|
|
14
|
-
}), /* @__PURE__ */
|
|
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("
|
|
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__ */
|
|
22
|
+
/* @__PURE__ */ b(u, {
|
|
22
23
|
treatment: "metric",
|
|
23
24
|
className: "border-border-seam",
|
|
24
|
-
children: [/* @__PURE__ */
|
|
25
|
+
children: [/* @__PURE__ */ b(c, {
|
|
25
26
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
26
|
-
children: [/* @__PURE__ */
|
|
27
|
+
children: [/* @__PURE__ */ y(l, {
|
|
27
28
|
className: "text-sm font-medium",
|
|
28
29
|
children: "Total Assets"
|
|
29
|
-
}), /* @__PURE__ */
|
|
30
|
-
}), /* @__PURE__ */
|
|
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:
|
|
33
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
39
|
-
treatment: "
|
|
39
|
+
/* @__PURE__ */ b(u, {
|
|
40
|
+
treatment: "glass",
|
|
41
|
+
glow: !0,
|
|
40
42
|
className: "border-border-seam",
|
|
41
|
-
children: [/* @__PURE__ */
|
|
43
|
+
children: [/* @__PURE__ */ b(c, {
|
|
42
44
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
43
|
-
children: [/* @__PURE__ */
|
|
45
|
+
children: [/* @__PURE__ */ y(l, {
|
|
44
46
|
className: "text-sm font-medium",
|
|
45
47
|
children: "Total Value"
|
|
46
|
-
}), /* @__PURE__ */
|
|
47
|
-
}), /* @__PURE__ */
|
|
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:
|
|
50
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
57
|
+
/* @__PURE__ */ b(u, {
|
|
56
58
|
treatment: "metric",
|
|
57
59
|
className: "border-border-seam",
|
|
58
|
-
children: [/* @__PURE__ */
|
|
60
|
+
children: [/* @__PURE__ */ b(c, {
|
|
59
61
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
60
|
-
children: [/* @__PURE__ */
|
|
62
|
+
children: [/* @__PURE__ */ y(l, {
|
|
61
63
|
className: "text-sm font-medium",
|
|
62
64
|
children: "Current Value"
|
|
63
|
-
}), /* @__PURE__ */
|
|
64
|
-
}), /* @__PURE__ */
|
|
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:
|
|
67
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
74
|
+
/* @__PURE__ */ b(u, {
|
|
73
75
|
treatment: "metric",
|
|
74
76
|
className: "border-border-seam",
|
|
75
|
-
children: [/* @__PURE__ */
|
|
77
|
+
children: [/* @__PURE__ */ b(c, {
|
|
76
78
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
79
|
+
children: [/* @__PURE__ */ y(l, {
|
|
78
80
|
className: "text-sm font-medium",
|
|
79
81
|
children: "Depreciation"
|
|
80
|
-
}), /* @__PURE__ */
|
|
81
|
-
}), /* @__PURE__ */
|
|
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: [
|
|
84
|
-
}), /* @__PURE__ */
|
|
85
|
+
children: [S, "%"]
|
|
86
|
+
}), /* @__PURE__ */ b("p", {
|
|
85
87
|
className: "text-xs text-text-secondary",
|
|
86
|
-
children: [
|
|
88
|
+
children: [C(x.totalValue - x.depreciatedValue), " total loss"]
|
|
87
89
|
})] })]
|
|
88
90
|
})
|
|
89
91
|
]
|
|
90
92
|
}),
|
|
91
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ b("div", {
|
|
92
94
|
className: "grid gap-6 md:grid-cols-2",
|
|
93
95
|
children: [
|
|
94
|
-
/* @__PURE__ */
|
|
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:
|
|
98
|
+
children: x.byCategory.map((e) => /* @__PURE__ */ b("div", {
|
|
97
99
|
className: "space-y-1",
|
|
98
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ b("div", {
|
|
99
101
|
className: "flex items-center justify-between text-sm",
|
|
100
|
-
children: [/* @__PURE__ */
|
|
102
|
+
children: [/* @__PURE__ */ y("span", {
|
|
101
103
|
className: "font-medium capitalize",
|
|
102
104
|
children: e.category.replace(/_/g, " ")
|
|
103
|
-
}), /* @__PURE__ */
|
|
105
|
+
}), /* @__PURE__ */ b("span", {
|
|
104
106
|
className: "text-text-secondary",
|
|
105
107
|
children: [
|
|
106
108
|
e.count,
|
|
107
109
|
" assets - ",
|
|
108
|
-
|
|
110
|
+
C(e.value)
|
|
109
111
|
]
|
|
110
112
|
})]
|
|
111
|
-
}), /* @__PURE__ */
|
|
113
|
+
}), /* @__PURE__ */ y("div", {
|
|
112
114
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
113
|
-
children: /* @__PURE__ */
|
|
115
|
+
children: /* @__PURE__ */ y("div", {
|
|
114
116
|
className: "h-3 bg-action-primary-bg rounded",
|
|
115
|
-
style: { width: `${Math.round(e.value /
|
|
117
|
+
style: { width: `${Math.round(e.value / w * 100)}%` }
|
|
116
118
|
})
|
|
117
119
|
})]
|
|
118
120
|
}, e.category))
|
|
119
121
|
})] }),
|
|
120
|
-
/* @__PURE__ */
|
|
121
|
-
/* @__PURE__ */
|
|
122
|
-
/* @__PURE__ */
|
|
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__ */
|
|
128
|
+
/* @__PURE__ */ y(g, {
|
|
127
129
|
className: "text-right",
|
|
128
130
|
children: "Value"
|
|
129
131
|
})
|
|
130
|
-
] }) }), /* @__PURE__ */
|
|
131
|
-
/* @__PURE__ */
|
|
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__ */
|
|
137
|
+
/* @__PURE__ */ y(h, {
|
|
136
138
|
className: "text-right",
|
|
137
139
|
children: e.count
|
|
138
140
|
}),
|
|
139
|
-
/* @__PURE__ */
|
|
141
|
+
/* @__PURE__ */ y(h, {
|
|
140
142
|
className: "text-right",
|
|
141
|
-
children:
|
|
143
|
+
children: C(e.value)
|
|
142
144
|
})
|
|
143
145
|
] }, e.department)) })] }) })] }),
|
|
144
|
-
/* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
162
|
+
children: x.depreciationTrend.map((e) => /* @__PURE__ */ b("div", {
|
|
161
163
|
className: "flex items-center gap-3",
|
|
162
164
|
children: [
|
|
163
|
-
/* @__PURE__ */
|
|
165
|
+
/* @__PURE__ */ y("span", {
|
|
164
166
|
className: "w-10 text-xs text-text-secondary",
|
|
165
167
|
children: e.month
|
|
166
168
|
}),
|
|
167
|
-
/* @__PURE__ */
|
|
169
|
+
/* @__PURE__ */ y("div", {
|
|
168
170
|
className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
|
|
169
|
-
children: /* @__PURE__ */
|
|
171
|
+
children: /* @__PURE__ */ y("div", {
|
|
170
172
|
className: "h-4 bg-status-warning-bg rounded",
|
|
171
|
-
style: { width: `${Math.round(e.value /
|
|
173
|
+
style: { width: `${Math.round(e.value / T * 100)}%` }
|
|
172
174
|
})
|
|
173
175
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
176
|
+
/* @__PURE__ */ y("span", {
|
|
175
177
|
className: "text-xs font-medium w-16 text-right",
|
|
176
|
-
children:
|
|
178
|
+
children: C(e.value)
|
|
177
179
|
})
|
|
178
180
|
]
|
|
179
181
|
}, e.month))
|
|
180
182
|
})] }),
|
|
181
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ b(o, {
|
|
182
184
|
className: "md:col-span-2",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
185
|
+
children: [/* @__PURE__ */ y(c, { children: /* @__PURE__ */ y(l, { children: "Acquisition Trend" }) }), /* @__PURE__ */ y(s, {
|
|
184
186
|
className: "space-y-2",
|
|
185
|
-
children:
|
|
187
|
+
children: x.acquisitionTrend.map((e) => /* @__PURE__ */ b("div", {
|
|
186
188
|
className: "flex items-center gap-3",
|
|
187
189
|
children: [
|
|
188
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ y("span", {
|
|
189
191
|
className: "w-10 text-xs text-text-secondary",
|
|
190
192
|
children: e.month
|
|
191
193
|
}),
|
|
192
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ y("div", {
|
|
193
195
|
className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
|
|
194
|
-
children: /* @__PURE__ */
|
|
196
|
+
children: /* @__PURE__ */ y("div", {
|
|
195
197
|
className: "h-4 bg-status-success-bg rounded",
|
|
196
|
-
style: { width: `${Math.round(e.value /
|
|
198
|
+
style: { width: `${Math.round(e.value / E * 100)}%` }
|
|
197
199
|
})
|
|
198
200
|
}),
|
|
199
|
-
/* @__PURE__ */
|
|
201
|
+
/* @__PURE__ */ b("span", {
|
|
200
202
|
className: "text-xs w-12 text-right",
|
|
201
203
|
children: [e.count, " units"]
|
|
202
204
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
205
|
+
/* @__PURE__ */ y("span", {
|
|
204
206
|
className: "text-xs font-medium w-16 text-right",
|
|
205
|
-
children:
|
|
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 {
|
|
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":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { useState as e } from "react";
|
|
2
2
|
import { ShieldCheck as t } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { gql as
|
|
6
|
-
import { useMutation as
|
|
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
|
|
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
|
-
`,
|
|
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
|
|
28
|
-
let [
|
|
29
|
-
|
|
30
|
-
} }),
|
|
31
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
34
|
+
/* @__PURE__ */ s("h1", {
|
|
35
35
|
className: "flex items-center gap-2 text-2xl font-semibold",
|
|
36
36
|
children: [
|
|
37
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ o(t, { className: "h-6 w-6" }),
|
|
38
38
|
" ",
|
|
39
|
-
/* @__PURE__ */ r
|
|
39
|
+
/* @__PURE__ */ o(r, { children: "Provenance" })
|
|
40
40
|
]
|
|
41
41
|
}),
|
|
42
|
-
/* @__PURE__ */
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
/* @__PURE__ */
|
|
47
|
-
className: "grid gap-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(),
|
|
50
|
-
assetId:
|
|
51
|
-
hash: `${
|
|
52
|
-
chainNetwork:
|
|
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__ */
|
|
57
|
+
/* @__PURE__ */ o("input", {
|
|
58
58
|
className: "rounded-md border px-3 py-2",
|
|
59
|
-
value:
|
|
60
|
-
onChange: (e) =>
|
|
59
|
+
value: c,
|
|
60
|
+
onChange: (e) => p(e.target.value),
|
|
61
|
+
"aria-label": "Asset ID"
|
|
61
62
|
}),
|
|
62
|
-
/* @__PURE__ */
|
|
63
|
+
/* @__PURE__ */ o("input", {
|
|
63
64
|
className: "rounded-md border px-3 py-2",
|
|
64
|
-
value:
|
|
65
|
-
onChange: (e) =>
|
|
65
|
+
value: m,
|
|
66
|
+
onChange: (e) => h(e.target.value),
|
|
67
|
+
"aria-label": "Chain network"
|
|
66
68
|
}),
|
|
67
|
-
/* @__PURE__ */
|
|
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:
|
|
73
|
+
children: b ? "Recording..." : "Record Attestation"
|
|
72
74
|
})
|
|
73
75
|
]
|
|
74
|
-
}),
|
|
75
|
-
/* @__PURE__ */
|
|
76
|
+
})] }),
|
|
77
|
+
/* @__PURE__ */ s("div", {
|
|
76
78
|
className: "rounded-lg border",
|
|
77
79
|
children: [
|
|
78
|
-
/* @__PURE__ */
|
|
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__ */
|
|
82
|
-
/* @__PURE__ */
|
|
83
|
-
/* @__PURE__ */
|
|
84
|
-
/* @__PURE__ */
|
|
85
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
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__ */
|
|
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
|
-
!
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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__ */
|
|
100
|
-
/* @__PURE__ */
|
|
101
|
-
/* @__PURE__ */
|
|
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__ */
|
|
108
|
+
/* @__PURE__ */ o("span", {
|
|
106
109
|
className: "truncate text-text-secondary",
|
|
107
110
|
children: e.txHash ?? "pending"
|
|
108
111
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
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 {
|
|
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 <
|
|
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'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"}
|