@burdenoff/microfe-assethandler 2026.703.2 → 2026.703.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/AssetHandlerRoot.js +18 -18
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js +19 -0
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -0
- package/dist/assethandler/pages/AiPredictionsPage.js +29 -29
- package/dist/assethandler/pages/AnalyticsPage.js +154 -154
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +48 -48
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +84 -84
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +82 -82
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +104 -103
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +132 -132
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +52 -52
- package/dist/assethandler/pages/CmdbBrowserPage.js +27 -27
- package/dist/assethandler/pages/DashboardPage.js +119 -119
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +22 -22
- package/dist/assethandler/pages/DiscoveryJobsPage.js +35 -35
- package/dist/assethandler/pages/EsgDashboardPage.js +32 -32
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +57 -56
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +98 -98
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +58 -57
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +29 -29
- package/dist/assethandler/pages/ItilChangeDetailPage.js +76 -75
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +49 -49
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +63 -62
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +72 -72
- package/dist/assethandler/pages/ItilItilhubPage.js +112 -112
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +61 -60
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +46 -46
- package/dist/assethandler/pages/KnowledgeBasePage.js +28 -28
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +52 -52
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +29 -29
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +58 -57
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +80 -80
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +49 -48
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +52 -52
- package/dist/assethandler/pages/ProvenancePage.js +36 -36
- package/dist/assethandler/pages/SamLicensesPage.js +27 -27
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +39 -38
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +50 -49
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +47 -46
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +104 -104
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +74 -73
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +77 -77
- package/dist/assethandler/providers/AssetHandlerProvider.js +12 -12
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FinanceBudgetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceBudgetDetailPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit } from 'lucide-react';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function FinanceBudgetDetailPage() {\n const navigate = useNavigate();\n const { budgetId } = useParams<{ budgetId: string }>();\n const { budgets, transactions } = useAssetHandlerStore();\n const budget = budgets.find((item) => item.id === budgetId) ?? budgets[0];\n\n if (!budget)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Budget not found\"\n description=\"This budget may have been archived or removed. Return to the finance hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/finance/finance-hub')}>\n Back to finance\n </Button>\n }\n />\n </div>\n );\n\n const relatedTxns = transactions.filter((t) => t.category === budget.category);\n const utilizationPct = Math.round((budget.spent / budget.allocated) * 100);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/finance/finance-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{budget.name}</GradientText>\n </h1>\n <Badge\n variant={\n budget.status === 'over_budget'\n ? 'destructive'\n : budget.status === 'under_budget'\n ? 'secondary'\n : 'default'\n }\n >\n {budget.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {budget.department} · {budget.period}\n </p>\n </div>\n </div>\n <Button size=\"sm\">\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Budget\n </Button>\n </div>\n\n <PagePurpose>\n Drill into a single budget to see exactly how it is being consumed: what was allocated, what\n has been spent, what remains, and every transaction charged against it. Use it to catch\n overruns early and decide whether to reallocate, cut spend or top up.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Allocated</p>\n <p className=\"text-2xl font-bold tabular-nums\">${budget.allocated.toLocaleString()}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Spent</p>\n <p className=\"text-2xl font-bold tabular-nums\">${budget.spent.toLocaleString()}</p>\n <p className=\"text-xs text-text-secondary\">{utilizationPct}% utilized</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Remaining</p>\n <p\n className={`text-2xl font-bold ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n ${budget.remaining.toLocaleString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Budget Utilization</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${budget.status === 'over_budget' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{ width: `${Math.min(utilizationPct, 100)}%` }}\n />\n </div>\n <p className=\"text-sm text-text-secondary mt-2\">\n {utilizationPct}% of ${budget.allocated.toLocaleString()} allocated budget consumed\n </p>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Related Transactions</CardTitle>\n <CardDescription>Transactions in {budget.category} category</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {relatedTxns.map((txn) => (\n <tr key={txn.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-right font-medium\">\n ${Math.abs(txn.amount).toLocaleString()}\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {relatedTxns.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No related transactions\"\n description={`No spend has been charged to the ${budget.category} category yet.`}\n />\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FinanceBudgetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceBudgetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { ArrowLeft, Edit } from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function FinanceBudgetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { budgetId } = useParams<{ budgetId: string }>();\n const { budgets, transactions } = useAssetHandlerStore();\n const budget = budgets.find((item) => item.id === budgetId) ?? budgets[0];\n\n if (!budget)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Budget not found\"\n description=\"This budget may have been archived or removed. Return to the finance hub to find it.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/finance/finance-hub')}>\n Back to finance\n </Button>\n }\n />\n </div>\n );\n\n const relatedTxns = transactions.filter((t) => t.category === budget.category);\n const utilizationPct = Math.round((budget.spent / budget.allocated) * 100);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <Button variant=\"ghost\" size=\"icon\" onClick={() => navigate('/finance/finance-hub')}>\n <ArrowLeft className=\"h-4 w-4\" />\n </Button>\n <div>\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-2xl font-bold\">\n <GradientText>{budget.name}</GradientText>\n </h1>\n <Badge\n variant={\n budget.status === 'over_budget'\n ? 'destructive'\n : budget.status === 'under_budget'\n ? 'secondary'\n : 'default'\n }\n >\n {budget.status.replace('_', ' ')}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {budget.department} · {budget.period}\n </p>\n </div>\n </div>\n <Button size=\"sm\">\n <Edit className=\"mr-2 h-4 w-4\" />\n Edit Budget\n </Button>\n </div>\n\n <PagePurpose>\n Drill into a single budget to see exactly how it is being consumed: what was allocated, what\n has been spent, what remains, and every transaction charged against it. Use it to catch\n overruns early and decide whether to reallocate, cut spend or top up.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Allocated</p>\n <p className=\"text-2xl font-bold tabular-nums\">${budget.allocated.toLocaleString()}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Spent</p>\n <p className=\"text-2xl font-bold tabular-nums\">${budget.spent.toLocaleString()}</p>\n <p className=\"text-xs text-text-secondary\">{utilizationPct}% utilized</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <p className=\"text-sm text-text-secondary\">Remaining</p>\n <p\n className={`text-2xl font-bold ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n ${budget.remaining.toLocaleString()}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <EmphasisPanel>\n <CardHeader className=\"px-0 pt-0\">\n <CardTitle>Budget Utilization</CardTitle>\n </CardHeader>\n <CardContent className=\"px-0 pb-0\">\n <div className=\"h-4 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full transition-all ${budget.status === 'over_budget' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{ width: `${Math.min(utilizationPct, 100)}%` }}\n />\n </div>\n <p className=\"text-sm text-text-secondary mt-2\">\n {utilizationPct}% of ${budget.allocated.toLocaleString()} allocated budget consumed\n </p>\n </CardContent>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Related Transactions</CardTitle>\n <CardDescription>Transactions in {budget.category} category</CardDescription>\n </CardHeader>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {relatedTxns.map((txn) => (\n <tr key={txn.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-right font-medium\">\n ${Math.abs(txn.amount).toLocaleString()}\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n {relatedTxns.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No related transactions\"\n description={`No spend has been charged to the ${budget.category} category yet.`}\n />\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { useAssetHandlerNavigate as t } from "../hooks/useAssetHandlerNavigate.js";
|
|
3
|
+
import { CreditCard as n, DollarSign as r, Download as i, Receipt as a, TrendingDown as o } from "lucide-react";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as l, CTAOverflowMenu as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, EmphasisPanel as g, GradientText as _, IllustratedEmptyState as v, NextSteps as y, PagePurpose as b, Tabs as x, TabsContent as S, TabsList as C, TabsTrigger as w } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/assethandler/pages/FinanceFinanceHubPage.tsx
|
|
7
7
|
function T() {
|
|
8
|
-
let T =
|
|
9
|
-
return /* @__PURE__ */
|
|
8
|
+
let T = t(), { transactions: E, budgets: D, invoices: O } = e(), k = E.filter((e) => e.amount > 0).reduce((e, t) => e + t.amount, 0), A = E.filter((e) => e.status === "pending"), j = D.filter((e) => e.status === "over_budget"), M = O.filter((e) => e.status === "overdue");
|
|
9
|
+
return /* @__PURE__ */ c("div", {
|
|
10
10
|
className: "space-y-6 p-6",
|
|
11
11
|
children: [
|
|
12
|
-
/* @__PURE__ */
|
|
12
|
+
/* @__PURE__ */ c("div", {
|
|
13
13
|
className: "flex items-center justify-between",
|
|
14
|
-
children: [/* @__PURE__ */
|
|
14
|
+
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
|
|
15
15
|
className: "text-2xl font-bold",
|
|
16
|
-
children: /* @__PURE__ */
|
|
17
|
-
}), /* @__PURE__ */
|
|
16
|
+
children: /* @__PURE__ */ s(_, { children: "Finance Hub" })
|
|
17
|
+
}), /* @__PURE__ */ s("p", {
|
|
18
18
|
className: "text-sm text-text-secondary",
|
|
19
19
|
children: "Financial management for IT assets"
|
|
20
|
-
})] }), /* @__PURE__ */
|
|
20
|
+
})] }), /* @__PURE__ */ s(u, {
|
|
21
21
|
primary: {
|
|
22
22
|
label: "New Transaction",
|
|
23
23
|
onSelect: () => {}
|
|
@@ -25,12 +25,12 @@ function T() {
|
|
|
25
25
|
actions: [{
|
|
26
26
|
label: "Export",
|
|
27
27
|
onSelect: () => {},
|
|
28
|
-
icon: /* @__PURE__ */
|
|
28
|
+
icon: /* @__PURE__ */ s(i, { className: "h-4 w-4" })
|
|
29
29
|
}]
|
|
30
30
|
})]
|
|
31
31
|
}),
|
|
32
|
-
/* @__PURE__ */
|
|
33
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ s(b, { children: "The money side of your asset estate: track spend, keep departmental budgets on course, and stay on top of vendor invoices. Use this hub to spot over-budget areas and overdue invoices early — so asset costs stay predictable and nothing slips past its due date." }),
|
|
33
|
+
/* @__PURE__ */ s(y, {
|
|
34
34
|
storageKey: "assethandler-finance-hub",
|
|
35
35
|
steps: [
|
|
36
36
|
{
|
|
@@ -53,141 +53,141 @@ function T() {
|
|
|
53
53
|
}
|
|
54
54
|
]
|
|
55
55
|
}),
|
|
56
|
-
/* @__PURE__ */
|
|
56
|
+
/* @__PURE__ */ c("div", {
|
|
57
57
|
className: "grid gap-4 md:grid-cols-4",
|
|
58
58
|
children: [
|
|
59
|
-
/* @__PURE__ */
|
|
59
|
+
/* @__PURE__ */ c(g, { children: [/* @__PURE__ */ c("div", {
|
|
60
60
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
62
|
-
}), /* @__PURE__ */
|
|
61
|
+
children: [/* @__PURE__ */ s(r, { className: "h-4 w-4" }), "Total Spend"]
|
|
62
|
+
}), /* @__PURE__ */ c("p", {
|
|
63
63
|
className: "text-2xl font-bold mt-1 tabular-nums",
|
|
64
64
|
children: ["$", k.toLocaleString()]
|
|
65
65
|
})] }),
|
|
66
|
-
/* @__PURE__ */
|
|
66
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
67
67
|
className: "pt-4",
|
|
68
|
-
children: [/* @__PURE__ */
|
|
68
|
+
children: [/* @__PURE__ */ c("div", {
|
|
69
69
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
70
|
-
children: [/* @__PURE__ */
|
|
71
|
-
}), /* @__PURE__ */
|
|
70
|
+
children: [/* @__PURE__ */ s(n, { className: "h-4 w-4" }), "Pending"]
|
|
71
|
+
}), /* @__PURE__ */ s("p", {
|
|
72
72
|
className: "text-2xl font-bold mt-1 text-status-info-text",
|
|
73
73
|
children: A.length
|
|
74
74
|
})]
|
|
75
75
|
}) }),
|
|
76
|
-
/* @__PURE__ */
|
|
76
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
77
77
|
className: "pt-4",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
78
|
+
children: [/* @__PURE__ */ c("div", {
|
|
79
79
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
81
|
-
}), /* @__PURE__ */
|
|
80
|
+
children: [/* @__PURE__ */ s(o, { className: "h-4 w-4" }), "Over Budget"]
|
|
81
|
+
}), /* @__PURE__ */ s("p", {
|
|
82
82
|
className: "text-2xl font-bold mt-1 text-status-error-text",
|
|
83
83
|
children: j.length
|
|
84
84
|
})]
|
|
85
85
|
}) }),
|
|
86
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
87
87
|
className: "pt-4",
|
|
88
|
-
children: [/* @__PURE__ */
|
|
88
|
+
children: [/* @__PURE__ */ c("div", {
|
|
89
89
|
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
91
|
-
}), /* @__PURE__ */
|
|
90
|
+
children: [/* @__PURE__ */ s(a, { className: "h-4 w-4" }), "Overdue Invoices"]
|
|
91
|
+
}), /* @__PURE__ */ s("p", {
|
|
92
92
|
className: "text-2xl font-bold mt-1 text-status-warning-text",
|
|
93
93
|
children: M.length
|
|
94
94
|
})]
|
|
95
95
|
}) })
|
|
96
96
|
]
|
|
97
97
|
}),
|
|
98
|
-
/* @__PURE__ */
|
|
98
|
+
/* @__PURE__ */ c(x, {
|
|
99
99
|
defaultValue: "transactions",
|
|
100
100
|
children: [
|
|
101
|
-
/* @__PURE__ */
|
|
102
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ c(C, { children: [
|
|
102
|
+
/* @__PURE__ */ s(w, {
|
|
103
103
|
value: "transactions",
|
|
104
104
|
children: "Transactions"
|
|
105
105
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ s(w, {
|
|
107
107
|
value: "budgets",
|
|
108
108
|
children: "Budgets"
|
|
109
109
|
}),
|
|
110
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ s(w, {
|
|
111
111
|
value: "invoices",
|
|
112
112
|
children: "Invoices"
|
|
113
113
|
})
|
|
114
114
|
] }),
|
|
115
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ s(S, {
|
|
116
116
|
value: "transactions",
|
|
117
117
|
className: "mt-4",
|
|
118
|
-
children: E.length === 0 ? /* @__PURE__ */
|
|
118
|
+
children: E.length === 0 ? /* @__PURE__ */ s(v, {
|
|
119
119
|
illustration: "empty-data",
|
|
120
120
|
title: "No transactions yet",
|
|
121
121
|
description: "Asset-related spend and reimbursements will appear here as they are recorded."
|
|
122
|
-
}) : /* @__PURE__ */
|
|
122
|
+
}) : /* @__PURE__ */ s(d, { children: /* @__PURE__ */ s(f, {
|
|
123
123
|
className: "p-0",
|
|
124
|
-
children: /* @__PURE__ */
|
|
124
|
+
children: /* @__PURE__ */ s("div", {
|
|
125
125
|
className: "overflow-x-auto",
|
|
126
|
-
children: /* @__PURE__ */
|
|
126
|
+
children: /* @__PURE__ */ c("table", {
|
|
127
127
|
className: "w-full text-sm",
|
|
128
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ s("thead", { children: /* @__PURE__ */ c("tr", {
|
|
129
129
|
className: "border-b bg-bg-sunken/50",
|
|
130
130
|
children: [
|
|
131
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ s("th", {
|
|
132
132
|
className: "text-left p-3 font-medium",
|
|
133
133
|
children: "ID"
|
|
134
134
|
}),
|
|
135
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ s("th", {
|
|
136
136
|
className: "text-left p-3 font-medium",
|
|
137
137
|
children: "Type"
|
|
138
138
|
}),
|
|
139
|
-
/* @__PURE__ */
|
|
139
|
+
/* @__PURE__ */ s("th", {
|
|
140
140
|
className: "text-left p-3 font-medium",
|
|
141
141
|
children: "Description"
|
|
142
142
|
}),
|
|
143
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ s("th", {
|
|
144
144
|
className: "text-left p-3 font-medium",
|
|
145
145
|
children: "Department"
|
|
146
146
|
}),
|
|
147
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ s("th", {
|
|
148
148
|
className: "text-right p-3 font-medium",
|
|
149
149
|
children: "Amount"
|
|
150
150
|
}),
|
|
151
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ s("th", {
|
|
152
152
|
className: "text-left p-3 font-medium",
|
|
153
153
|
children: "Status"
|
|
154
154
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
155
|
+
/* @__PURE__ */ s("th", {
|
|
156
156
|
className: "text-left p-3 font-medium",
|
|
157
157
|
children: "Date"
|
|
158
158
|
})
|
|
159
159
|
]
|
|
160
|
-
}) }), /* @__PURE__ */
|
|
160
|
+
}) }), /* @__PURE__ */ s("tbody", { children: E.map((e) => /* @__PURE__ */ c("tr", {
|
|
161
161
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
162
162
|
children: [
|
|
163
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ s("td", {
|
|
164
164
|
className: "p-3 font-mono text-xs",
|
|
165
165
|
children: e.id
|
|
166
166
|
}),
|
|
167
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ s("td", {
|
|
168
168
|
className: "p-3 capitalize",
|
|
169
169
|
children: e.type
|
|
170
170
|
}),
|
|
171
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ s("td", {
|
|
172
172
|
className: "p-3 truncate max-w-xs",
|
|
173
173
|
children: e.description
|
|
174
174
|
}),
|
|
175
|
-
/* @__PURE__ */
|
|
175
|
+
/* @__PURE__ */ s("td", {
|
|
176
176
|
className: "p-3 text-xs",
|
|
177
177
|
children: e.department
|
|
178
178
|
}),
|
|
179
|
-
/* @__PURE__ */
|
|
179
|
+
/* @__PURE__ */ c("td", {
|
|
180
180
|
className: `p-3 text-right font-medium ${e.amount < 0 ? "text-status-error-text" : ""}`,
|
|
181
181
|
children: ["$", Math.abs(e.amount).toLocaleString()]
|
|
182
182
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
183
|
+
/* @__PURE__ */ s("td", {
|
|
184
184
|
className: "p-3",
|
|
185
|
-
children: /* @__PURE__ */
|
|
185
|
+
children: /* @__PURE__ */ s(l, {
|
|
186
186
|
variant: "outline",
|
|
187
187
|
children: e.status
|
|
188
188
|
})
|
|
189
189
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
190
|
+
/* @__PURE__ */ s("td", {
|
|
191
191
|
className: "p-3 text-xs",
|
|
192
192
|
children: new Date(e.date).toLocaleDateString()
|
|
193
193
|
})
|
|
@@ -197,72 +197,72 @@ function T() {
|
|
|
197
197
|
})
|
|
198
198
|
}) })
|
|
199
199
|
}),
|
|
200
|
-
/* @__PURE__ */
|
|
200
|
+
/* @__PURE__ */ s(S, {
|
|
201
201
|
value: "budgets",
|
|
202
202
|
className: "mt-4",
|
|
203
|
-
children: D.length === 0 ? /* @__PURE__ */
|
|
203
|
+
children: D.length === 0 ? /* @__PURE__ */ s(v, {
|
|
204
204
|
illustration: "empty-generic",
|
|
205
205
|
title: "No budgets defined",
|
|
206
206
|
description: "Create departmental budgets to track allocated vs. actual asset spend."
|
|
207
|
-
}) : /* @__PURE__ */
|
|
207
|
+
}) : /* @__PURE__ */ s("div", {
|
|
208
208
|
className: "grid gap-4 md:grid-cols-2",
|
|
209
|
-
children: D.map((e) => /* @__PURE__ */
|
|
209
|
+
children: D.map((e) => /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c(m, {
|
|
210
210
|
className: "pb-2",
|
|
211
|
-
children: [/* @__PURE__ */
|
|
211
|
+
children: [/* @__PURE__ */ c("div", {
|
|
212
212
|
className: "flex items-center justify-between",
|
|
213
|
-
children: [/* @__PURE__ */
|
|
213
|
+
children: [/* @__PURE__ */ s(h, {
|
|
214
214
|
className: "text-base",
|
|
215
215
|
children: e.name
|
|
216
|
-
}), /* @__PURE__ */
|
|
216
|
+
}), /* @__PURE__ */ s(l, {
|
|
217
217
|
variant: e.status === "over_budget" ? "destructive" : e.status === "under_budget" ? "secondary" : "default",
|
|
218
218
|
children: e.status.replace("_", " ")
|
|
219
219
|
})]
|
|
220
|
-
}), /* @__PURE__ */
|
|
220
|
+
}), /* @__PURE__ */ c(p, { children: [
|
|
221
221
|
e.department,
|
|
222
222
|
" · ",
|
|
223
223
|
e.period
|
|
224
224
|
] })]
|
|
225
|
-
}), /* @__PURE__ */
|
|
225
|
+
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ c("div", {
|
|
226
226
|
className: "space-y-3",
|
|
227
227
|
children: [
|
|
228
|
-
/* @__PURE__ */
|
|
228
|
+
/* @__PURE__ */ c("div", {
|
|
229
229
|
className: "flex justify-between text-sm",
|
|
230
|
-
children: [/* @__PURE__ */
|
|
230
|
+
children: [/* @__PURE__ */ s("span", {
|
|
231
231
|
className: "text-text-secondary",
|
|
232
232
|
children: "Allocated"
|
|
233
|
-
}), /* @__PURE__ */
|
|
233
|
+
}), /* @__PURE__ */ c("span", {
|
|
234
234
|
className: "font-medium",
|
|
235
235
|
children: ["$", e.allocated.toLocaleString()]
|
|
236
236
|
})]
|
|
237
237
|
}),
|
|
238
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ c("div", {
|
|
239
239
|
className: "flex justify-between text-sm",
|
|
240
|
-
children: [/* @__PURE__ */
|
|
240
|
+
children: [/* @__PURE__ */ s("span", {
|
|
241
241
|
className: "text-text-secondary",
|
|
242
242
|
children: "Spent"
|
|
243
|
-
}), /* @__PURE__ */
|
|
243
|
+
}), /* @__PURE__ */ c("span", {
|
|
244
244
|
className: "font-medium",
|
|
245
245
|
children: ["$", e.spent.toLocaleString()]
|
|
246
246
|
})]
|
|
247
247
|
}),
|
|
248
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ c("div", {
|
|
249
249
|
className: "flex justify-between text-sm",
|
|
250
|
-
children: [/* @__PURE__ */
|
|
250
|
+
children: [/* @__PURE__ */ s("span", {
|
|
251
251
|
className: "text-text-secondary",
|
|
252
252
|
children: "Remaining"
|
|
253
|
-
}), /* @__PURE__ */
|
|
253
|
+
}), /* @__PURE__ */ c("span", {
|
|
254
254
|
className: `font-medium ${e.remaining < 0 ? "text-status-error-text" : "text-status-success-text"}`,
|
|
255
255
|
children: ["$", e.remaining.toLocaleString()]
|
|
256
256
|
})]
|
|
257
257
|
}),
|
|
258
|
-
/* @__PURE__ */
|
|
258
|
+
/* @__PURE__ */ s("div", {
|
|
259
259
|
className: "h-2 rounded-full bg-bg-sunken overflow-hidden",
|
|
260
|
-
children: /* @__PURE__ */
|
|
260
|
+
children: /* @__PURE__ */ s("div", {
|
|
261
261
|
className: `h-full rounded-full ${e.status === "over_budget" ? "bg-status-error-bg" : "bg-action-primary-bg"}`,
|
|
262
262
|
style: { width: `${Math.min(e.spent / e.allocated * 100, 100)}%` }
|
|
263
263
|
})
|
|
264
264
|
}),
|
|
265
|
-
/* @__PURE__ */
|
|
265
|
+
/* @__PURE__ */ c("p", {
|
|
266
266
|
className: "text-xs text-text-secondary text-right",
|
|
267
267
|
children: [Math.round(e.spent / e.allocated * 100), "% utilized"]
|
|
268
268
|
})
|
|
@@ -270,73 +270,73 @@ function T() {
|
|
|
270
270
|
}) })] }, e.id))
|
|
271
271
|
})
|
|
272
272
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
273
|
+
/* @__PURE__ */ s(S, {
|
|
274
274
|
value: "invoices",
|
|
275
275
|
className: "mt-4",
|
|
276
|
-
children: O.length === 0 ? /* @__PURE__ */
|
|
276
|
+
children: O.length === 0 ? /* @__PURE__ */ s(v, {
|
|
277
277
|
illustration: "empty-files",
|
|
278
278
|
title: "No invoices",
|
|
279
279
|
description: "Vendor invoices for asset purchases and services will be listed here."
|
|
280
|
-
}) : /* @__PURE__ */
|
|
280
|
+
}) : /* @__PURE__ */ s(d, { children: /* @__PURE__ */ s(f, {
|
|
281
281
|
className: "p-0",
|
|
282
|
-
children: /* @__PURE__ */
|
|
282
|
+
children: /* @__PURE__ */ s("div", {
|
|
283
283
|
className: "overflow-x-auto",
|
|
284
|
-
children: /* @__PURE__ */
|
|
284
|
+
children: /* @__PURE__ */ c("table", {
|
|
285
285
|
className: "w-full text-sm",
|
|
286
|
-
children: [/* @__PURE__ */
|
|
286
|
+
children: [/* @__PURE__ */ s("thead", { children: /* @__PURE__ */ c("tr", {
|
|
287
287
|
className: "border-b bg-bg-sunken/50",
|
|
288
288
|
children: [
|
|
289
|
-
/* @__PURE__ */
|
|
289
|
+
/* @__PURE__ */ s("th", {
|
|
290
290
|
className: "text-left p-3 font-medium",
|
|
291
291
|
children: "Invoice #"
|
|
292
292
|
}),
|
|
293
|
-
/* @__PURE__ */
|
|
293
|
+
/* @__PURE__ */ s("th", {
|
|
294
294
|
className: "text-left p-3 font-medium",
|
|
295
295
|
children: "Vendor"
|
|
296
296
|
}),
|
|
297
|
-
/* @__PURE__ */
|
|
297
|
+
/* @__PURE__ */ s("th", {
|
|
298
298
|
className: "text-right p-3 font-medium",
|
|
299
299
|
children: "Amount"
|
|
300
300
|
}),
|
|
301
|
-
/* @__PURE__ */
|
|
301
|
+
/* @__PURE__ */ s("th", {
|
|
302
302
|
className: "text-left p-3 font-medium",
|
|
303
303
|
children: "Issue Date"
|
|
304
304
|
}),
|
|
305
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ s("th", {
|
|
306
306
|
className: "text-left p-3 font-medium",
|
|
307
307
|
children: "Due Date"
|
|
308
308
|
}),
|
|
309
|
-
/* @__PURE__ */
|
|
309
|
+
/* @__PURE__ */ s("th", {
|
|
310
310
|
className: "text-left p-3 font-medium",
|
|
311
311
|
children: "Status"
|
|
312
312
|
})
|
|
313
313
|
]
|
|
314
|
-
}) }), /* @__PURE__ */
|
|
314
|
+
}) }), /* @__PURE__ */ s("tbody", { children: O.map((e) => /* @__PURE__ */ c("tr", {
|
|
315
315
|
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
316
316
|
children: [
|
|
317
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ s("td", {
|
|
318
318
|
className: "p-3 font-mono text-xs",
|
|
319
319
|
children: e.number
|
|
320
320
|
}),
|
|
321
|
-
/* @__PURE__ */
|
|
321
|
+
/* @__PURE__ */ s("td", {
|
|
322
322
|
className: "p-3",
|
|
323
323
|
children: e.vendor
|
|
324
324
|
}),
|
|
325
|
-
/* @__PURE__ */
|
|
325
|
+
/* @__PURE__ */ c("td", {
|
|
326
326
|
className: "p-3 text-right font-medium",
|
|
327
327
|
children: ["$", e.amount.toLocaleString()]
|
|
328
328
|
}),
|
|
329
|
-
/* @__PURE__ */
|
|
329
|
+
/* @__PURE__ */ s("td", {
|
|
330
330
|
className: "p-3 text-xs",
|
|
331
331
|
children: e.issueDate
|
|
332
332
|
}),
|
|
333
|
-
/* @__PURE__ */
|
|
333
|
+
/* @__PURE__ */ s("td", {
|
|
334
334
|
className: "p-3 text-xs",
|
|
335
335
|
children: e.dueDate
|
|
336
336
|
}),
|
|
337
|
-
/* @__PURE__ */
|
|
337
|
+
/* @__PURE__ */ s("td", {
|
|
338
338
|
className: "p-3",
|
|
339
|
-
children: /* @__PURE__ */
|
|
339
|
+
children: /* @__PURE__ */ s(l, {
|
|
340
340
|
variant: e.status === "overdue" ? "destructive" : e.status === "paid" ? "default" : "outline",
|
|
341
341
|
children: e.status
|
|
342
342
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FinanceFinanceHubPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceFinanceHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n CTAOverflowMenu,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { DollarSign, TrendingDown, Receipt, CreditCard, Download } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function FinanceFinanceHubPage() {\n const navigate = useNavigate();\n const { transactions, budgets, invoices } = useAssetHandlerStore();\n\n const totalSpend = transactions.filter((t) => t.amount > 0).reduce((s, t) => s + t.amount, 0);\n const pendingTxns = transactions.filter((t) => t.status === 'pending');\n const overBudget = budgets.filter((b) => b.status === 'over_budget');\n const overdueInvoices = invoices.filter((i) => i.status === 'overdue');\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Finance Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Financial management for IT assets</p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'New Transaction', onSelect: () => {} }}\n actions={[\n { label: 'Export', onSelect: () => {}, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <PagePurpose>\n The money side of your asset estate: track spend, keep departmental budgets on course, and\n stay on top of vendor invoices. Use this hub to spot over-budget areas and overdue invoices\n early — so asset costs stay predictable and nothing slips past its due date.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-finance-hub\"\n steps={[\n {\n id: 'transactions',\n label: 'Review recent transactions',\n description: 'Check spend and approve anything still pending.',\n onClick: () => navigate('/transactions/transaction-list'),\n },\n {\n id: 'budgets',\n label: 'Review reporting dashboard',\n description: 'See budget health and spend trends across departments.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n {\n id: 'reports',\n label: 'Build a finance report',\n description: 'Turn spend and budget data into a shareable report.',\n onClick: () => navigate('/reports/report-builder'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <DollarSign className=\"h-4 w-4\" />\n Total Spend\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">${totalSpend.toLocaleString()}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <CreditCard className=\"h-4 w-4\" />\n Pending\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-info-text\">{pendingTxns.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <TrendingDown className=\"h-4 w-4\" />\n Over Budget\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">{overBudget.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Receipt className=\"h-4 w-4\" />\n Overdue Invoices\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-warning-text\">\n {overdueInvoices.length}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"transactions\">\n <TabsList>\n <TabsTrigger value=\"transactions\">Transactions</TabsTrigger>\n <TabsTrigger value=\"budgets\">Budgets</TabsTrigger>\n <TabsTrigger value=\"invoices\">Invoices</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"transactions\" className=\"mt-4\">\n {transactions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No transactions yet\"\n description=\"Asset-related spend and reimbursements will appear here as they are recorded.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-left p-3 font-medium\">Department</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {transactions.map((txn) => (\n <tr key={txn.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 capitalize\">{txn.type}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-xs\">{txn.department}</td>\n <td\n className={`p-3 text-right font-medium ${txn.amount < 0 ? 'text-status-error-text' : ''}`}\n >\n ${Math.abs(txn.amount).toLocaleString()}\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"budgets\" className=\"mt-4\">\n {budgets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No budgets defined\"\n description=\"Create departmental budgets to track allocated vs. actual asset spend.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {budgets.map((budget) => (\n <Card key={budget.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{budget.name}</CardTitle>\n <Badge\n variant={\n budget.status === 'over_budget'\n ? 'destructive'\n : budget.status === 'under_budget'\n ? 'secondary'\n : 'default'\n }\n >\n {budget.status.replace('_', ' ')}\n </Badge>\n </div>\n <CardDescription>\n {budget.department} · {budget.period}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Allocated</span>\n <span className=\"font-medium\">${budget.allocated.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Spent</span>\n <span className=\"font-medium\">${budget.spent.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Remaining</span>\n <span\n className={`font-medium ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n ${budget.remaining.toLocaleString()}\n </span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${budget.status === 'over_budget' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{\n width: `${Math.min((budget.spent / budget.allocated) * 100, 100)}%`,\n }}\n />\n </div>\n <p className=\"text-xs text-text-secondary text-right\">\n {Math.round((budget.spent / budget.allocated) * 100)}% utilized\n </p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"invoices\" className=\"mt-4\">\n {invoices.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No invoices\"\n description=\"Vendor invoices for asset purchases and services will be listed here.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Invoice #</th>\n <th className=\"text-left p-3 font-medium\">Vendor</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Issue Date</th>\n <th className=\"text-left p-3 font-medium\">Due Date</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {invoices.map((inv) => (\n <tr key={inv.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{inv.number}</td>\n <td className=\"p-3\">{inv.vendor}</td>\n <td className=\"p-3 text-right font-medium\">\n ${inv.amount.toLocaleString()}\n </td>\n <td className=\"p-3 text-xs\">{inv.issueDate}</td>\n <td className=\"p-3 text-xs\">{inv.dueDate}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n inv.status === 'overdue'\n ? 'destructive'\n : inv.status === 'paid'\n ? 'default'\n : 'outline'\n }\n >\n {inv.status}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":";;;;;;AAsBA,SAAgB,IAAwB;CACtC,IAAM,IAAW,GAAa,EACxB,EAAE,iBAAc,YAAS,gBAAa,GAAsB,EAE5D,IAAa,EAAa,QAAQ,MAAM,EAAE,SAAS,EAAE,CAAC,QAAQ,GAAG,MAAM,IAAI,EAAE,QAAQ,EAAE,EACvF,IAAc,EAAa,QAAQ,MAAM,EAAE,WAAW,UAAU,EAChE,IAAa,EAAQ,QAAQ,MAAM,EAAE,WAAW,cAAc,EAC9D,IAAkB,EAAS,QAAQ,MAAM,EAAE,WAAW,UAAU;AAEtE,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,eAA0B,CAAA;KACrC,CAAA,EACL,kBAAC,KAAD;KAAG,WAAU;eAA8B;KAAsC,CAAA,CAC7E,EAAA,CAAA,EACN,kBAAC,GAAD;KACE,SAAS;MAAE,OAAO;MAAmB,gBAAgB;MAAI;KACzD,SAAS,CACP;MAAE,OAAO;MAAU,gBAAgB;MAAI,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MAAE,CAChF;KACD,CAAA,CACE;;GAEN,kBAAC,GAAD,EAAA,UAAa,uQAIC,CAAA;GAEd,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,iCAAiC;MAC1D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,6BAA6B;MACtD;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,eAAe,EAAS,0BAA0B;MACnD;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EAAA,cAE9B;SACN,kBAAC,KAAD;MAAG,WAAU;gBAAb,CAAoD,KAAE,EAAW,gBAAgB,CAAK;QACxE,EAAA,CAAA;KAChB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAY,WAAU,WAAY,CAAA,EAAA,UAE9B;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAiD,EAAY;OAAW,CAAA,CACzE;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA,EAAA,cAEhC;UACN,kBAAC,KAAD;OAAG,WAAU;iBAAkD,EAAW;OAAW,CAAA,CACzE;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA,EAAA,mBAE3B;UACN,kBAAC,KAAD;OAAG,WAAU;iBACV,EAAgB;OACf,CAAA,CACQ;SACT,CAAA;KACH;;GAEN,kBAAC,GAAD;IAAM,cAAa;cAAnB;KACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,GAAD;OAAa,OAAM;iBAAe;OAA0B,CAAA;MAC5D,kBAAC,GAAD;OAAa,OAAM;iBAAU;OAAqB,CAAA;MAClD,kBAAC,GAAD;OAAa,OAAM;iBAAW;OAAsB,CAAA;MAC3C,EAAA,CAAA;KAEX,kBAAC,GAAD;MAAa,OAAM;MAAe,WAAU;gBACzC,EAAa,WAAW,IACvB,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAO,CAAA;WACjD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAgB,CAAA;WAC1D,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAe,CAAA;WACzD,kBAAC,MAAD;YAAI,WAAU;sBAA6B;YAAW,CAAA;WACtD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAS,CAAA;WAChD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAa,KAAK,MACjB,kBAAC,MAAD;UAAiB,WAAU;oBAA3B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAI;YAAQ,CAAA;WACnD,kBAAC,MAAD;YAAI,WAAU;sBAAkB,EAAI;YAAU,CAAA;WAC9C,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAI;YAAiB,CAAA;WAC5D,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAgB,CAAA;WACjD,kBAAC,MAAD;YACE,WAAW,8BAA8B,EAAI,SAAS,IAAI,2BAA2B;sBADvF,CAEC,KACG,KAAK,IAAI,EAAI,OAAO,CAAC,gBAAgB,CACpC;;WACL,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aAAO,SAAQ;uBAAW,EAAI;aAAe,CAAA;YAC1C,CAAA;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,IAAI,KAAK,EAAI,KAAK,CAAC,oBAAoB;YAAM,CAAA;WACvE;YAdI,EAAI,GAcR,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MAEG,CAAA;KAEd,kBAAC,GAAD;MAAa,OAAM;MAAU,WAAU;gBACpC,EAAQ,WAAW,IAClB,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAQ,KAAK,MACZ,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;QAAY,WAAU;kBAAtB,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,GAAD;UAAW,WAAU;oBAAa,EAAO;UAAiB,CAAA,EAC1D,kBAAC,GAAD;UACE,SACE,EAAO,WAAW,gBACd,gBACA,EAAO,WAAW,iBAChB,cACA;oBAGP,EAAO,OAAO,QAAQ,KAAK,IAAI;UAC1B,CAAA,CACJ;YACN,kBAAC,GAAD,EAAA,UAAA;SACG,EAAO;SAAW;SAAW,EAAO;SACrB,EAAA,CAAA,CACP;WACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAgB,CAAA,EACtD,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CAA8B,KAAE,EAAO,UAAU,gBAAgB,CAAQ;aACrE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAY,CAAA,EAClD,kBAAC,QAAD;WAAM,WAAU;qBAAhB,CAA8B,KAAE,EAAO,MAAM,gBAAgB,CAAQ;aACjE;;SACN,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,QAAD;WAAM,WAAU;qBAAsB;WAAgB,CAAA,EACtD,kBAAC,QAAD;WACE,WAAW,eAAe,EAAO,YAAY,IAAI,2BAA2B;qBAD9E,CAEC,KACG,EAAO,UAAU,gBAAgB,CAC9B;aACH;;SACN,kBAAC,OAAD;UAAK,WAAU;oBACb,kBAAC,OAAD;WACE,WAAW,uBAAuB,EAAO,WAAW,gBAAgB,uBAAuB;WAC3F,OAAO,EACL,OAAO,GAAG,KAAK,IAAK,EAAO,QAAQ,EAAO,YAAa,KAAK,IAAI,CAAC,IAClE;WACD,CAAA;UACE,CAAA;SACN,kBAAC,KAAD;UAAG,WAAU;oBAAb,CACG,KAAK,MAAO,EAAO,QAAQ,EAAO,YAAa,IAAI,EAAC,aACnD;;SACA;WACM,CAAA,CACT,EAAA,EAnDI,EAAO,GAmDX,CACP;OACE,CAAA;MAEI,CAAA;KAEd,kBAAC,GAAD;MAAa,OAAM;MAAW,WAAU;gBACrC,EAAS,WAAW,IACnB,kBAAC,GAAD;OACE,cAAa;OACb,OAAM;OACN,aAAY;OACZ,CAAA,GAEF,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;OAAa,WAAU;iBACrB,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,SAAD;SAAO,WAAU;mBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;UAAI,WAAU;oBAAd;WACE,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAc,CAAA;WACxD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WACrD,kBAAC,MAAD;YAAI,WAAU;sBAA6B;YAAW,CAAA;WACtD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAe,CAAA;WACzD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAa,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAA4B;YAAW,CAAA;WAClD;aACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAS,KAAK,MACb,kBAAC,MAAD;UAAiB,WAAU;oBAA3B;WACE,kBAAC,MAAD;YAAI,WAAU;sBAAyB,EAAI;YAAY,CAAA;WACvD,kBAAC,MAAD;YAAI,WAAU;sBAAO,EAAI;YAAY,CAAA;WACrC,kBAAC,MAAD;YAAI,WAAU;sBAAd,CAA2C,KACvC,EAAI,OAAO,gBAAgB,CAC1B;;WACL,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAe,CAAA;WAChD,kBAAC,MAAD;YAAI,WAAU;sBAAe,EAAI;YAAa,CAAA;WAC9C,kBAAC,MAAD;YAAI,WAAU;sBACZ,kBAAC,GAAD;aACE,SACE,EAAI,WAAW,YACX,gBACA,EAAI,WAAW,SACb,YACA;uBAGP,EAAI;aACC,CAAA;YACL,CAAA;WACF;YArBI,EAAI,GAqBR,CACL,EACI,CAAA,CACF;;QACJ,CAAA;OACM,CAAA,EACT,CAAA;MAEG,CAAA;KACT;;GACH"}
|
|
1
|
+
{"version":3,"file":"FinanceFinanceHubPage.js","names":[],"sources":["../../../src/assethandler/pages/FinanceFinanceHubPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n CTAOverflowMenu,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { DollarSign, TrendingDown, Receipt, CreditCard, Download } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function FinanceFinanceHubPage() {\n const navigate = useAssetHandlerNavigate();\n const { transactions, budgets, invoices } = useAssetHandlerStore();\n\n const totalSpend = transactions.filter((t) => t.amount > 0).reduce((s, t) => s + t.amount, 0);\n const pendingTxns = transactions.filter((t) => t.status === 'pending');\n const overBudget = budgets.filter((b) => b.status === 'over_budget');\n const overdueInvoices = invoices.filter((i) => i.status === 'overdue');\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Finance Hub</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Financial management for IT assets</p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'New Transaction', onSelect: () => {} }}\n actions={[\n { label: 'Export', onSelect: () => {}, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <PagePurpose>\n The money side of your asset estate: track spend, keep departmental budgets on course, and\n stay on top of vendor invoices. Use this hub to spot over-budget areas and overdue invoices\n early — so asset costs stay predictable and nothing slips past its due date.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-finance-hub\"\n steps={[\n {\n id: 'transactions',\n label: 'Review recent transactions',\n description: 'Check spend and approve anything still pending.',\n onClick: () => navigate('/transactions/transaction-list'),\n },\n {\n id: 'budgets',\n label: 'Review reporting dashboard',\n description: 'See budget health and spend trends across departments.',\n onClick: () => navigate('/reports/reports-dashboard'),\n },\n {\n id: 'reports',\n label: 'Build a finance report',\n description: 'Turn spend and budget data into a shareable report.',\n onClick: () => navigate('/reports/report-builder'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <DollarSign className=\"h-4 w-4\" />\n Total Spend\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">${totalSpend.toLocaleString()}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <CreditCard className=\"h-4 w-4\" />\n Pending\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-info-text\">{pendingTxns.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <TrendingDown className=\"h-4 w-4\" />\n Over Budget\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-error-text\">{overBudget.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Receipt className=\"h-4 w-4\" />\n Overdue Invoices\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-warning-text\">\n {overdueInvoices.length}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <Tabs defaultValue=\"transactions\">\n <TabsList>\n <TabsTrigger value=\"transactions\">Transactions</TabsTrigger>\n <TabsTrigger value=\"budgets\">Budgets</TabsTrigger>\n <TabsTrigger value=\"invoices\">Invoices</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"transactions\" className=\"mt-4\">\n {transactions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No transactions yet\"\n description=\"Asset-related spend and reimbursements will appear here as they are recorded.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">ID</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Description</th>\n <th className=\"text-left p-3 font-medium\">Department</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Date</th>\n </tr>\n </thead>\n <tbody>\n {transactions.map((txn) => (\n <tr key={txn.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{txn.id}</td>\n <td className=\"p-3 capitalize\">{txn.type}</td>\n <td className=\"p-3 truncate max-w-xs\">{txn.description}</td>\n <td className=\"p-3 text-xs\">{txn.department}</td>\n <td\n className={`p-3 text-right font-medium ${txn.amount < 0 ? 'text-status-error-text' : ''}`}\n >\n ${Math.abs(txn.amount).toLocaleString()}\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{txn.status}</Badge>\n </td>\n <td className=\"p-3 text-xs\">{new Date(txn.date).toLocaleDateString()}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"budgets\" className=\"mt-4\">\n {budgets.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No budgets defined\"\n description=\"Create departmental budgets to track allocated vs. actual asset spend.\"\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-2\">\n {budgets.map((budget) => (\n <Card key={budget.id}>\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{budget.name}</CardTitle>\n <Badge\n variant={\n budget.status === 'over_budget'\n ? 'destructive'\n : budget.status === 'under_budget'\n ? 'secondary'\n : 'default'\n }\n >\n {budget.status.replace('_', ' ')}\n </Badge>\n </div>\n <CardDescription>\n {budget.department} · {budget.period}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Allocated</span>\n <span className=\"font-medium\">${budget.allocated.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Spent</span>\n <span className=\"font-medium\">${budget.spent.toLocaleString()}</span>\n </div>\n <div className=\"flex justify-between text-sm\">\n <span className=\"text-text-secondary\">Remaining</span>\n <span\n className={`font-medium ${budget.remaining < 0 ? 'text-status-error-text' : 'text-status-success-text'}`}\n >\n ${budget.remaining.toLocaleString()}\n </span>\n </div>\n <div className=\"h-2 rounded-full bg-bg-sunken overflow-hidden\">\n <div\n className={`h-full rounded-full ${budget.status === 'over_budget' ? 'bg-status-error-bg' : 'bg-action-primary-bg'}`}\n style={{\n width: `${Math.min((budget.spent / budget.allocated) * 100, 100)}%`,\n }}\n />\n </div>\n <p className=\"text-xs text-text-secondary text-right\">\n {Math.round((budget.spent / budget.allocated) * 100)}% utilized\n </p>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </TabsContent>\n\n <TabsContent value=\"invoices\" className=\"mt-4\">\n {invoices.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No invoices\"\n description=\"Vendor invoices for asset purchases and services will be listed here.\"\n />\n ) : (\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Invoice #</th>\n <th className=\"text-left p-3 font-medium\">Vendor</th>\n <th className=\"text-right p-3 font-medium\">Amount</th>\n <th className=\"text-left p-3 font-medium\">Issue Date</th>\n <th className=\"text-left p-3 font-medium\">Due Date</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n </tr>\n </thead>\n <tbody>\n {invoices.map((inv) => (\n <tr key={inv.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3 font-mono text-xs\">{inv.number}</td>\n <td className=\"p-3\">{inv.vendor}</td>\n <td className=\"p-3 text-right font-medium\">\n ${inv.amount.toLocaleString()}\n </td>\n <td className=\"p-3 text-xs\">{inv.issueDate}</td>\n <td className=\"p-3 text-xs\">{inv.dueDate}</td>\n <td className=\"p-3\">\n <Badge\n variant={\n inv.status === 'overdue'\n ? 'destructive'\n : inv.status === 'paid'\n ? 'default'\n : 'outline'\n }\n >\n {inv.status}\n </Badge>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|