@burdenoff/microfe-assethandler 2026.731.1 → 2026.805.1
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/AssetHandlerRoutes.js +1 -1
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/hooks/useAssetHandlerNavigate.d.ts +1 -1
- package/dist/assethandler/hooks/useAssetHandlerNavigate.d.ts.map +1 -1
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js +1 -1
- package/dist/assethandler/hooks/useAssetHandlerNavigate.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DashboardPage as e } from "./pages/DashboardPage.js";
|
|
2
2
|
import { Suspense as t, lazy as n } from "react";
|
|
3
3
|
import { Loader2 as r } from "lucide-react";
|
|
4
|
-
import { Navigate as i, Route as a, Routes as o } from "react-router
|
|
4
|
+
import { Navigate as i, Route as a, Routes as o } from "react-router";
|
|
5
5
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
6
|
//#region src/assethandler/AssetHandlerRoutes.tsx
|
|
7
7
|
var l = n(() => import("./pages/AssetsAssetCategoriesPage.js").then((e) => ({ default: e.AssetsAssetCategoriesPage }))), u = n(() => import("./pages/AssetsAssetCheckInOutPage.js").then((e) => ({ default: e.AssetsAssetCheckInOutPage }))), d = n(() => import("./pages/AssetsAssetCreatePage.js").then((e) => ({ default: e.AssetsAssetCreatePage }))), f = n(() => import("./pages/AssetsAssetDetailPage.js").then((e) => ({ default: e.AssetsAssetDetailPage }))), p = n(() => import("./pages/AssetsAssetListPage.js").then((e) => ({ default: e.AssetsAssetListPage }))), m = n(() => import("./pages/AssetsAssetTrackingPage.js").then((e) => ({ default: e.AssetsAssetTrackingPage }))), h = n(() => import("./pages/AnalyticsPage.js").then((e) => ({ default: e.AnalyticsPage }))), g = n(() => import("./pages/FinanceBudgetDetailPage.js").then((e) => ({ default: e.FinanceBudgetDetailPage }))), _ = n(() => import("./pages/FinanceFinanceHubPage.js").then((e) => ({ default: e.FinanceFinanceHubPage }))), v = n(() => import("./pages/FinanceInvoiceDetailPage.js").then((e) => ({ default: e.FinanceInvoiceDetailPage }))), y = n(() => import("./pages/ItilChangeDetailPage.js").then((e) => ({ default: e.ItilChangeDetailPage }))), b = n(() => import("./pages/ItilChangeManagementPage.js").then((e) => ({ default: e.ItilChangeManagementPage }))), x = n(() => import("./pages/ItilItilhubPage.js").then((e) => ({ default: e.ItilItilhubPage }))), S = n(() => import("./pages/ItilIncidentDetailPage.js").then((e) => ({ default: e.ItilIncidentDetailPage }))), C = n(() => import("./pages/ItilIncidentManagementPage.js").then((e) => ({ default: e.ItilIncidentManagementPage }))), w = n(() => import("./pages/ItilProblemDetailPage.js").then((e) => ({ default: e.ItilProblemDetailPage }))), T = n(() => import("./pages/ItilProblemManagementPage.js").then((e) => ({ default: e.ItilProblemManagementPage }))), E = n(() => import("./pages/MaintenanceMaintenanceCalendarPage.js").then((e) => ({ default: e.MaintenanceMaintenanceCalendarPage }))), D = n(() => import("./pages/MaintenanceMaintenanceSchedulerPage.js").then((e) => ({ default: e.MaintenanceMaintenanceSchedulerPage }))), O = n(() => import("./pages/OperationsMaintenanceDetailPage.js").then((e) => ({ default: e.OperationsMaintenanceDetailPage }))), k = n(() => import("./pages/OperationsOperationsHubPage.js").then((e) => ({ default: e.OperationsOperationsHubPage }))), A = n(() => import("./pages/OperationsWorkOrderDetailPage.js").then((e) => ({ default: e.OperationsWorkOrderDetailPage }))), j = n(() => import("./pages/PortfolioPortfolioOverviewPage.js").then((e) => ({ default: e.PortfolioPortfolioOverviewPage }))), M = n(() => import("./pages/SecurityComplianceDetailPage.js").then((e) => ({ default: e.SecurityComplianceDetailPage }))), N = n(() => import("./pages/SecurityPolicyDetailPage.js").then((e) => ({ default: e.SecurityPolicyDetailPage }))), P = n(() => import("./pages/SecuritySecurityEventDetailPage.js").then((e) => ({ default: e.SecuritySecurityEventDetailPage }))), F = n(() => import("./pages/SecuritySecurityHubPage.js").then((e) => ({ default: e.SecuritySecurityHubPage }))), I = n(() => import("./pages/TransactionsTransactionDetailPage.js").then((e) => ({ default: e.TransactionsTransactionDetailPage }))), L = n(() => import("./pages/TransactionsTransactionListPage.js").then((e) => ({ default: e.TransactionsTransactionListPage }))), R = n(() => import("./pages/AiPredictionsPage.js").then((e) => ({ default: e.AiPredictionsPage }))), z = n(() => import("./pages/CmdbBrowserPage.js").then((e) => ({ default: e.CmdbBrowserPage }))), B = n(() => import("./pages/DiscoveryJobsPage.js").then((e) => ({ default: e.DiscoveryJobsPage }))), V = n(() => import("./pages/DigitalTwinPage.js").then((e) => ({ default: e.DigitalTwinPage }))), H = n(() => import("./pages/EsgDashboardPage.js").then((e) => ({ default: e.EsgDashboardPage }))), U = n(() => import("./pages/KnowledgeBasePage.js").then((e) => ({ default: e.KnowledgeBasePage }))), W = n(() => import("./pages/IotDevicesPage.js").then((e) => ({ default: e.IotDevicesPage }))), G = n(() => import("./pages/ProvenancePage.js").then((e) => ({ default: e.ProvenancePage }))), K = n(() => import("./pages/SamLicensesPage.js").then((e) => ({ default: e.SamLicensesPage }))), q = n(() => import("./pages/ReportsDashboardPage.js").then((e) => ({ default: e.ReportsDashboardPage })));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetHandlerRoutes.js","names":[],"sources":["../../src/assethandler/AssetHandlerRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Navigate, Route, Routes } from 'react-router-dom';\nimport { Loader2 } from 'lucide-react';\nimport { DashboardPage as IndexPage } from './pages/DashboardPage';\n\nconst AssetsAssetCategoriesPage = lazy(() =>\n import('./pages/AssetsAssetCategoriesPage').then((m) => ({\n default: m.AssetsAssetCategoriesPage,\n }))\n);\nconst AssetsAssetCheckInOutPage = lazy(() =>\n import('./pages/AssetsAssetCheckInOutPage').then((m) => ({\n default: m.AssetsAssetCheckInOutPage,\n }))\n);\nconst AssetsAssetCreatePage = lazy(() =>\n import('./pages/AssetsAssetCreatePage').then((m) => ({ default: m.AssetsAssetCreatePage }))\n);\nconst AssetsAssetDetailPage = lazy(() =>\n import('./pages/AssetsAssetDetailPage').then((m) => ({ default: m.AssetsAssetDetailPage }))\n);\nconst AssetsAssetListPage = lazy(() =>\n import('./pages/AssetsAssetListPage').then((m) => ({ default: m.AssetsAssetListPage }))\n);\nconst AssetsAssetTrackingPage = lazy(() =>\n import('./pages/AssetsAssetTrackingPage').then((m) => ({ default: m.AssetsAssetTrackingPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst FinanceBudgetDetailPage = lazy(() =>\n import('./pages/FinanceBudgetDetailPage').then((m) => ({ default: m.FinanceBudgetDetailPage }))\n);\nconst FinanceFinanceHubPage = lazy(() =>\n import('./pages/FinanceFinanceHubPage').then((m) => ({ default: m.FinanceFinanceHubPage }))\n);\nconst FinanceInvoiceDetailPage = lazy(() =>\n import('./pages/FinanceInvoiceDetailPage').then((m) => ({ default: m.FinanceInvoiceDetailPage }))\n);\nconst ItilChangeDetailPage = lazy(() =>\n import('./pages/ItilChangeDetailPage').then((m) => ({ default: m.ItilChangeDetailPage }))\n);\nconst ItilChangeManagementPage = lazy(() =>\n import('./pages/ItilChangeManagementPage').then((m) => ({ default: m.ItilChangeManagementPage }))\n);\nconst ItilItilhubPage = lazy(() =>\n import('./pages/ItilItilhubPage').then((m) => ({ default: m.ItilItilhubPage }))\n);\nconst ItilIncidentDetailPage = lazy(() =>\n import('./pages/ItilIncidentDetailPage').then((m) => ({ default: m.ItilIncidentDetailPage }))\n);\nconst ItilIncidentManagementPage = lazy(() =>\n import('./pages/ItilIncidentManagementPage').then((m) => ({\n default: m.ItilIncidentManagementPage,\n }))\n);\nconst ItilProblemDetailPage = lazy(() =>\n import('./pages/ItilProblemDetailPage').then((m) => ({ default: m.ItilProblemDetailPage }))\n);\nconst ItilProblemManagementPage = lazy(() =>\n import('./pages/ItilProblemManagementPage').then((m) => ({\n default: m.ItilProblemManagementPage,\n }))\n);\nconst MaintenanceMaintenanceCalendarPage = lazy(() =>\n import('./pages/MaintenanceMaintenanceCalendarPage').then((m) => ({\n default: m.MaintenanceMaintenanceCalendarPage,\n }))\n);\nconst MaintenanceMaintenanceSchedulerPage = lazy(() =>\n import('./pages/MaintenanceMaintenanceSchedulerPage').then((m) => ({\n default: m.MaintenanceMaintenanceSchedulerPage,\n }))\n);\nconst OperationsMaintenanceDetailPage = lazy(() =>\n import('./pages/OperationsMaintenanceDetailPage').then((m) => ({\n default: m.OperationsMaintenanceDetailPage,\n }))\n);\nconst OperationsOperationsHubPage = lazy(() =>\n import('./pages/OperationsOperationsHubPage').then((m) => ({\n default: m.OperationsOperationsHubPage,\n }))\n);\nconst OperationsWorkOrderDetailPage = lazy(() =>\n import('./pages/OperationsWorkOrderDetailPage').then((m) => ({\n default: m.OperationsWorkOrderDetailPage,\n }))\n);\nconst PortfolioPortfolioOverviewPage = lazy(() =>\n import('./pages/PortfolioPortfolioOverviewPage').then((m) => ({\n default: m.PortfolioPortfolioOverviewPage,\n }))\n);\nconst SecurityComplianceDetailPage = lazy(() =>\n import('./pages/SecurityComplianceDetailPage').then((m) => ({\n default: m.SecurityComplianceDetailPage,\n }))\n);\nconst SecurityPolicyDetailPage = lazy(() =>\n import('./pages/SecurityPolicyDetailPage').then((m) => ({ default: m.SecurityPolicyDetailPage }))\n);\nconst SecuritySecurityEventDetailPage = lazy(() =>\n import('./pages/SecuritySecurityEventDetailPage').then((m) => ({\n default: m.SecuritySecurityEventDetailPage,\n }))\n);\nconst SecuritySecurityHubPage = lazy(() =>\n import('./pages/SecuritySecurityHubPage').then((m) => ({ default: m.SecuritySecurityHubPage }))\n);\nconst TransactionsTransactionDetailPage = lazy(() =>\n import('./pages/TransactionsTransactionDetailPage').then((m) => ({\n default: m.TransactionsTransactionDetailPage,\n }))\n);\nconst TransactionsTransactionListPage = lazy(() =>\n import('./pages/TransactionsTransactionListPage').then((m) => ({\n default: m.TransactionsTransactionListPage,\n }))\n);\nconst AiPredictionsPage = lazy(() =>\n import('./pages/AiPredictionsPage').then((m) => ({ default: m.AiPredictionsPage }))\n);\nconst CmdbBrowserPage = lazy(() =>\n import('./pages/CmdbBrowserPage').then((m) => ({ default: m.CmdbBrowserPage }))\n);\nconst DiscoveryJobsPage = lazy(() =>\n import('./pages/DiscoveryJobsPage').then((m) => ({ default: m.DiscoveryJobsPage }))\n);\nconst DigitalTwinPage = lazy(() =>\n import('./pages/DigitalTwinPage').then((m) => ({ default: m.DigitalTwinPage }))\n);\n// Re-routed (BOFF-3948): esgMetrics/upsertEsgMetric and knowledgeArticles/\n// createKnowledgeArticle are now real fields owned by wspace-assethandler-svc,\n// so these two pages resolve against live data instead of crashing on a GraphQL\n// validation error.\nconst EsgDashboardPage = lazy(() =>\n import('./pages/EsgDashboardPage').then((m) => ({ default: m.EsgDashboardPage }))\n);\nconst KnowledgeBasePage = lazy(() =>\n import('./pages/KnowledgeBasePage').then((m) => ({ default: m.KnowledgeBasePage }))\n);\nconst IotDevicesPage = lazy(() =>\n import('./pages/IotDevicesPage').then((m) => ({ default: m.IotDevicesPage }))\n);\nconst ProvenancePage = lazy(() =>\n import('./pages/ProvenancePage').then((m) => ({ default: m.ProvenancePage }))\n);\nconst SamLicensesPage = lazy(() =>\n import('./pages/SamLicensesPage').then((m) => ({ default: m.SamLicensesPage }))\n);\nconst ReportsDashboardPage = lazy(() =>\n import('./pages/ReportsDashboardPage').then((m) => ({ default: m.ReportsDashboardPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function AssetHandlerRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<IndexPage />} />\n <Route path=\"assets/asset-categories\" element={<AssetsAssetCategoriesPage />} />\n <Route path=\"assets/asset-check-in-out\" element={<AssetsAssetCheckInOutPage />} />\n <Route path=\"assets/asset-create\" element={<AssetsAssetCreatePage />} />\n <Route path=\"assets/:assetId\" element={<AssetsAssetDetailPage />} />\n <Route path=\"assets/asset-list\" element={<AssetsAssetListPage />} />\n <Route path=\"assets/asset-tracking\" element={<AssetsAssetTrackingPage />} />\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n <Route path=\"finance/budgets/:budgetId\" element={<FinanceBudgetDetailPage />} />\n <Route path=\"finance/finance-hub\" element={<FinanceFinanceHubPage />} />\n <Route path=\"finance/invoices/:invoiceId\" element={<FinanceInvoiceDetailPage />} />\n <Route path=\"itil/changes/:changeId\" element={<ItilChangeDetailPage />} />\n <Route path=\"itil/change-management\" element={<ItilChangeManagementPage />} />\n <Route path=\"itil/itilhub\" element={<ItilItilhubPage />} />\n <Route path=\"itil/incidents/:incidentId\" element={<ItilIncidentDetailPage />} />\n <Route path=\"itil/incident-management\" element={<ItilIncidentManagementPage />} />\n <Route path=\"itil/problems/:problemId\" element={<ItilProblemDetailPage />} />\n <Route path=\"itil/problem-management\" element={<ItilProblemManagementPage />} />\n <Route\n path=\"maintenance/maintenance-calendar\"\n element={<MaintenanceMaintenanceCalendarPage />}\n />\n <Route\n path=\"maintenance/maintenance-scheduler\"\n element={<MaintenanceMaintenanceSchedulerPage />}\n />\n <Route\n path=\"operations/maintenance/:maintenanceId\"\n element={<OperationsMaintenanceDetailPage />}\n />\n <Route path=\"operations/operations-hub\" element={<OperationsOperationsHubPage />} />\n <Route\n path=\"operations/work-orders/:workOrderId\"\n element={<OperationsWorkOrderDetailPage />}\n />\n <Route path=\"portfolio/portfolio-overview\" element={<PortfolioPortfolioOverviewPage />} />\n <Route path=\"reports\" element={<Navigate to=\"reports-dashboard\" replace />} />\n <Route path=\"reports/reports-dashboard\" element={<ReportsDashboardPage />} />\n <Route path=\"security/compliance/:frameworkId\" element={<SecurityComplianceDetailPage />} />\n <Route path=\"security/policies/:policyId\" element={<SecurityPolicyDetailPage />} />\n <Route path=\"security/events/:eventId\" element={<SecuritySecurityEventDetailPage />} />\n <Route path=\"security/security-hub\" element={<SecuritySecurityHubPage />} />\n <Route path=\"transactions/:transactionId\" element={<TransactionsTransactionDetailPage />} />\n <Route path=\"transactions/transaction-list\" element={<TransactionsTransactionListPage />} />\n <Route path=\"advanced/iot-devices\" element={<IotDevicesPage />} />\n <Route path=\"advanced/digital-twin\" element={<DigitalTwinPage />} />\n <Route path=\"advanced/sam-licenses\" element={<SamLicensesPage />} />\n <Route path=\"advanced/cmdb-browser\" element={<CmdbBrowserPage />} />\n <Route path=\"advanced/discovery-jobs\" element={<DiscoveryJobsPage />} />\n <Route path=\"advanced/knowledge-base\" element={<KnowledgeBasePage />} />\n <Route path=\"advanced/esg-dashboard\" element={<EsgDashboardPage />} />\n <Route path=\"advanced/provenance\" element={<ProvenancePage />} />\n <Route path=\"advanced/ai-predictions\" element={<AiPredictionsPage />} />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetHandlerRoutes.js","names":[],"sources":["../../src/assethandler/AssetHandlerRoutes.tsx"],"sourcesContent":["import { lazy, Suspense } from 'react';\nimport { Navigate, Route, Routes } from 'react-router';\nimport { Loader2 } from 'lucide-react';\nimport { DashboardPage as IndexPage } from './pages/DashboardPage';\n\nconst AssetsAssetCategoriesPage = lazy(() =>\n import('./pages/AssetsAssetCategoriesPage').then((m) => ({\n default: m.AssetsAssetCategoriesPage,\n }))\n);\nconst AssetsAssetCheckInOutPage = lazy(() =>\n import('./pages/AssetsAssetCheckInOutPage').then((m) => ({\n default: m.AssetsAssetCheckInOutPage,\n }))\n);\nconst AssetsAssetCreatePage = lazy(() =>\n import('./pages/AssetsAssetCreatePage').then((m) => ({ default: m.AssetsAssetCreatePage }))\n);\nconst AssetsAssetDetailPage = lazy(() =>\n import('./pages/AssetsAssetDetailPage').then((m) => ({ default: m.AssetsAssetDetailPage }))\n);\nconst AssetsAssetListPage = lazy(() =>\n import('./pages/AssetsAssetListPage').then((m) => ({ default: m.AssetsAssetListPage }))\n);\nconst AssetsAssetTrackingPage = lazy(() =>\n import('./pages/AssetsAssetTrackingPage').then((m) => ({ default: m.AssetsAssetTrackingPage }))\n);\nconst AnalyticsPage = lazy(() =>\n import('./pages/AnalyticsPage').then((m) => ({ default: m.AnalyticsPage }))\n);\nconst FinanceBudgetDetailPage = lazy(() =>\n import('./pages/FinanceBudgetDetailPage').then((m) => ({ default: m.FinanceBudgetDetailPage }))\n);\nconst FinanceFinanceHubPage = lazy(() =>\n import('./pages/FinanceFinanceHubPage').then((m) => ({ default: m.FinanceFinanceHubPage }))\n);\nconst FinanceInvoiceDetailPage = lazy(() =>\n import('./pages/FinanceInvoiceDetailPage').then((m) => ({ default: m.FinanceInvoiceDetailPage }))\n);\nconst ItilChangeDetailPage = lazy(() =>\n import('./pages/ItilChangeDetailPage').then((m) => ({ default: m.ItilChangeDetailPage }))\n);\nconst ItilChangeManagementPage = lazy(() =>\n import('./pages/ItilChangeManagementPage').then((m) => ({ default: m.ItilChangeManagementPage }))\n);\nconst ItilItilhubPage = lazy(() =>\n import('./pages/ItilItilhubPage').then((m) => ({ default: m.ItilItilhubPage }))\n);\nconst ItilIncidentDetailPage = lazy(() =>\n import('./pages/ItilIncidentDetailPage').then((m) => ({ default: m.ItilIncidentDetailPage }))\n);\nconst ItilIncidentManagementPage = lazy(() =>\n import('./pages/ItilIncidentManagementPage').then((m) => ({\n default: m.ItilIncidentManagementPage,\n }))\n);\nconst ItilProblemDetailPage = lazy(() =>\n import('./pages/ItilProblemDetailPage').then((m) => ({ default: m.ItilProblemDetailPage }))\n);\nconst ItilProblemManagementPage = lazy(() =>\n import('./pages/ItilProblemManagementPage').then((m) => ({\n default: m.ItilProblemManagementPage,\n }))\n);\nconst MaintenanceMaintenanceCalendarPage = lazy(() =>\n import('./pages/MaintenanceMaintenanceCalendarPage').then((m) => ({\n default: m.MaintenanceMaintenanceCalendarPage,\n }))\n);\nconst MaintenanceMaintenanceSchedulerPage = lazy(() =>\n import('./pages/MaintenanceMaintenanceSchedulerPage').then((m) => ({\n default: m.MaintenanceMaintenanceSchedulerPage,\n }))\n);\nconst OperationsMaintenanceDetailPage = lazy(() =>\n import('./pages/OperationsMaintenanceDetailPage').then((m) => ({\n default: m.OperationsMaintenanceDetailPage,\n }))\n);\nconst OperationsOperationsHubPage = lazy(() =>\n import('./pages/OperationsOperationsHubPage').then((m) => ({\n default: m.OperationsOperationsHubPage,\n }))\n);\nconst OperationsWorkOrderDetailPage = lazy(() =>\n import('./pages/OperationsWorkOrderDetailPage').then((m) => ({\n default: m.OperationsWorkOrderDetailPage,\n }))\n);\nconst PortfolioPortfolioOverviewPage = lazy(() =>\n import('./pages/PortfolioPortfolioOverviewPage').then((m) => ({\n default: m.PortfolioPortfolioOverviewPage,\n }))\n);\nconst SecurityComplianceDetailPage = lazy(() =>\n import('./pages/SecurityComplianceDetailPage').then((m) => ({\n default: m.SecurityComplianceDetailPage,\n }))\n);\nconst SecurityPolicyDetailPage = lazy(() =>\n import('./pages/SecurityPolicyDetailPage').then((m) => ({ default: m.SecurityPolicyDetailPage }))\n);\nconst SecuritySecurityEventDetailPage = lazy(() =>\n import('./pages/SecuritySecurityEventDetailPage').then((m) => ({\n default: m.SecuritySecurityEventDetailPage,\n }))\n);\nconst SecuritySecurityHubPage = lazy(() =>\n import('./pages/SecuritySecurityHubPage').then((m) => ({ default: m.SecuritySecurityHubPage }))\n);\nconst TransactionsTransactionDetailPage = lazy(() =>\n import('./pages/TransactionsTransactionDetailPage').then((m) => ({\n default: m.TransactionsTransactionDetailPage,\n }))\n);\nconst TransactionsTransactionListPage = lazy(() =>\n import('./pages/TransactionsTransactionListPage').then((m) => ({\n default: m.TransactionsTransactionListPage,\n }))\n);\nconst AiPredictionsPage = lazy(() =>\n import('./pages/AiPredictionsPage').then((m) => ({ default: m.AiPredictionsPage }))\n);\nconst CmdbBrowserPage = lazy(() =>\n import('./pages/CmdbBrowserPage').then((m) => ({ default: m.CmdbBrowserPage }))\n);\nconst DiscoveryJobsPage = lazy(() =>\n import('./pages/DiscoveryJobsPage').then((m) => ({ default: m.DiscoveryJobsPage }))\n);\nconst DigitalTwinPage = lazy(() =>\n import('./pages/DigitalTwinPage').then((m) => ({ default: m.DigitalTwinPage }))\n);\n// Re-routed (BOFF-3948): esgMetrics/upsertEsgMetric and knowledgeArticles/\n// createKnowledgeArticle are now real fields owned by wspace-assethandler-svc,\n// so these two pages resolve against live data instead of crashing on a GraphQL\n// validation error.\nconst EsgDashboardPage = lazy(() =>\n import('./pages/EsgDashboardPage').then((m) => ({ default: m.EsgDashboardPage }))\n);\nconst KnowledgeBasePage = lazy(() =>\n import('./pages/KnowledgeBasePage').then((m) => ({ default: m.KnowledgeBasePage }))\n);\nconst IotDevicesPage = lazy(() =>\n import('./pages/IotDevicesPage').then((m) => ({ default: m.IotDevicesPage }))\n);\nconst ProvenancePage = lazy(() =>\n import('./pages/ProvenancePage').then((m) => ({ default: m.ProvenancePage }))\n);\nconst SamLicensesPage = lazy(() =>\n import('./pages/SamLicensesPage').then((m) => ({ default: m.SamLicensesPage }))\n);\nconst ReportsDashboardPage = lazy(() =>\n import('./pages/ReportsDashboardPage').then((m) => ({ default: m.ReportsDashboardPage }))\n);\n\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[320px] items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-primary\" />\n </div>\n );\n}\n\nexport function AssetHandlerRoutes() {\n return (\n <Suspense fallback={<PageLoader />}>\n <Routes>\n <Route index element={<IndexPage />} />\n <Route path=\"assets/asset-categories\" element={<AssetsAssetCategoriesPage />} />\n <Route path=\"assets/asset-check-in-out\" element={<AssetsAssetCheckInOutPage />} />\n <Route path=\"assets/asset-create\" element={<AssetsAssetCreatePage />} />\n <Route path=\"assets/:assetId\" element={<AssetsAssetDetailPage />} />\n <Route path=\"assets/asset-list\" element={<AssetsAssetListPage />} />\n <Route path=\"assets/asset-tracking\" element={<AssetsAssetTrackingPage />} />\n <Route path=\"analytics\" element={<AnalyticsPage />} />\n <Route path=\"finance/budgets/:budgetId\" element={<FinanceBudgetDetailPage />} />\n <Route path=\"finance/finance-hub\" element={<FinanceFinanceHubPage />} />\n <Route path=\"finance/invoices/:invoiceId\" element={<FinanceInvoiceDetailPage />} />\n <Route path=\"itil/changes/:changeId\" element={<ItilChangeDetailPage />} />\n <Route path=\"itil/change-management\" element={<ItilChangeManagementPage />} />\n <Route path=\"itil/itilhub\" element={<ItilItilhubPage />} />\n <Route path=\"itil/incidents/:incidentId\" element={<ItilIncidentDetailPage />} />\n <Route path=\"itil/incident-management\" element={<ItilIncidentManagementPage />} />\n <Route path=\"itil/problems/:problemId\" element={<ItilProblemDetailPage />} />\n <Route path=\"itil/problem-management\" element={<ItilProblemManagementPage />} />\n <Route\n path=\"maintenance/maintenance-calendar\"\n element={<MaintenanceMaintenanceCalendarPage />}\n />\n <Route\n path=\"maintenance/maintenance-scheduler\"\n element={<MaintenanceMaintenanceSchedulerPage />}\n />\n <Route\n path=\"operations/maintenance/:maintenanceId\"\n element={<OperationsMaintenanceDetailPage />}\n />\n <Route path=\"operations/operations-hub\" element={<OperationsOperationsHubPage />} />\n <Route\n path=\"operations/work-orders/:workOrderId\"\n element={<OperationsWorkOrderDetailPage />}\n />\n <Route path=\"portfolio/portfolio-overview\" element={<PortfolioPortfolioOverviewPage />} />\n <Route path=\"reports\" element={<Navigate to=\"reports-dashboard\" replace />} />\n <Route path=\"reports/reports-dashboard\" element={<ReportsDashboardPage />} />\n <Route path=\"security/compliance/:frameworkId\" element={<SecurityComplianceDetailPage />} />\n <Route path=\"security/policies/:policyId\" element={<SecurityPolicyDetailPage />} />\n <Route path=\"security/events/:eventId\" element={<SecuritySecurityEventDetailPage />} />\n <Route path=\"security/security-hub\" element={<SecuritySecurityHubPage />} />\n <Route path=\"transactions/:transactionId\" element={<TransactionsTransactionDetailPage />} />\n <Route path=\"transactions/transaction-list\" element={<TransactionsTransactionListPage />} />\n <Route path=\"advanced/iot-devices\" element={<IotDevicesPage />} />\n <Route path=\"advanced/digital-twin\" element={<DigitalTwinPage />} />\n <Route path=\"advanced/sam-licenses\" element={<SamLicensesPage />} />\n <Route path=\"advanced/cmdb-browser\" element={<CmdbBrowserPage />} />\n <Route path=\"advanced/discovery-jobs\" element={<DiscoveryJobsPage />} />\n <Route path=\"advanced/knowledge-base\" element={<KnowledgeBasePage />} />\n <Route path=\"advanced/esg-dashboard\" element={<EsgDashboardPage />} />\n <Route path=\"advanced/provenance\" element={<ProvenancePage />} />\n <Route path=\"advanced/ai-predictions\" element={<AiPredictionsPage />} />\n <Route path=\"*\" element={<Navigate to=\"\" replace />} />\n </Routes>\n </Suspense>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssetHandlerNavigate.d.ts","sourceRoot":"","sources":["../../../src/assethandler/hooks/useAssetHandlerNavigate.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"useAssetHandlerNavigate.d.ts","sourceRoot":"","sources":["../../../src/assethandler/hooks/useAssetHandlerNavigate.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAIjE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,SAK9B,MAAM,GAAG,MAAM,YAAY,eAAe,UAUlD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useAssetHandler as e } from "../providers/AssetHandlerProvider.js";
|
|
2
2
|
import { joinPath as t } from "../utils/navigation.js";
|
|
3
3
|
import { useCallback as n } from "react";
|
|
4
|
-
import { useNavigate as r } from "react-router
|
|
4
|
+
import { useNavigate as r } from "react-router";
|
|
5
5
|
//#region src/assethandler/hooks/useAssetHandlerNavigate.ts
|
|
6
6
|
function i() {
|
|
7
7
|
let i = r(), { basePath: a = "/" } = e();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAssetHandlerNavigate.js","names":[],"sources":["../../../src/assethandler/hooks/useAssetHandlerNavigate.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useNavigate, type NavigateOptions } from 'react-router
|
|
1
|
+
{"version":3,"file":"useAssetHandlerNavigate.js","names":[],"sources":["../../../src/assethandler/hooks/useAssetHandlerNavigate.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useNavigate, type NavigateOptions } from 'react-router';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\nimport { joinPath } from '../utils/navigation';\n\n/**\n * Base-path-aware navigation for in-MFE links.\n *\n * The AssetHandler MFE is mounted under a host base path (e.g. `/assethandler`)\n * when integrated into an app shell, or at `/` when running standalone. React\n * Router's `navigate('/assets/...')` resolves against the HOST router root, so\n * an absolute in-MFE path would escape the mount and land on a nonexistent host\n * route (which the shell bounces to `/dashboard`).\n *\n * This hook prefixes the active `basePath` onto absolute string targets so\n * `navigate('/assets/asset-create')` correctly resolves to\n * `/assethandler/assets/asset-create` when integrated and `/assets/asset-create`\n * when standalone. Relative paths and numeric deltas (`navigate(-1)`) pass\n * through untouched.\n */\nexport function useAssetHandlerNavigate() {\n const navigate = useNavigate();\n const { basePath = '/' } = useAssetHandler();\n\n return useCallback(\n (to: string | number, options?: NavigateOptions) => {\n if (typeof to === 'number') {\n navigate(to);\n return;\n }\n const resolved = to.startsWith('/') ? joinPath(basePath, to) : to;\n navigate(resolved, options);\n },\n [navigate, basePath]\n );\n}\n"],"mappings":";;;;;AAoBA,SAAgB,IAA0B;CACxC,IAAM,IAAW,GAAa,EACxB,EAAE,cAAW,QAAQ,GAAiB;AAE5C,QAAO,GACJ,GAAqB,MAA8B;AAClD,MAAI,OAAO,KAAO,UAAU;AAC1B,KAAS,EAAG;AACZ;;AAGF,IADiB,EAAG,WAAW,IAAI,GAAG,EAAS,GAAU,EAAG,GAAG,GAC5C,EAAQ;IAE7B,CAAC,GAAU,EAAS,CACrB"}
|
|
@@ -15,7 +15,7 @@ import { ChartCard as c } from "../components/ChartCard.js";
|
|
|
15
15
|
import "../components/index.js";
|
|
16
16
|
import { useState as l } from "react";
|
|
17
17
|
import { Archive as ae, ArrowLeft as oe, Building2 as se, Calendar as ce, DollarSign as le, Hash as ue, Layers as de, MapPin as fe, Pencil as pe, ShieldCheck as me, Tag as he, Trash2 as ge, TrendingDown as _e, Truck as ve, User as ye, Wrench as u } from "lucide-react";
|
|
18
|
-
import { useParams as be } from "react-router
|
|
18
|
+
import { useParams as be } from "react-router";
|
|
19
19
|
import { gql as d } from "@apollo/client";
|
|
20
20
|
import { useMutation as f, useQuery as xe } from "@apollo/client/react";
|
|
21
21
|
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n TrendingDown,\n Hash,\n Building2,\n Truck,\n ShieldCheck,\n Layers,\n} from 'lucide-react';\nimport { useParams } from 'react-router-dom';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { useCopy } from '../hooks/useCopy';\nimport { notify } from '../utils/toast';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\nimport {\n StatTile,\n ChartCard,\n TrendChart,\n BarsChart,\n DonutChart,\n formatCurrencyCompact,\n} from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n unitsOfProductionCapacity\n unitsProduced\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\nconst money = (value: number | null | undefined): string =>\n value == null ? '—' : `$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 2 })}`;\n\n// Soonest future scheduled date among the given (already status-filtered) records.\n// Records with no / past / unparseable dates are ignored; returns undefined when none.\nfunction nextServiceDate(records: { scheduledDate?: string }[]): string | undefined {\n const now = Date.now();\n return records\n .map((record) => record.scheduledDate)\n .filter((date): date is string => date != null && new Date(date).getTime() >= now)\n .sort((a, b) => new Date(a).getTime() - new Date(b).getTime())[0];\n}\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance (200%)',\n DECLINING_BALANCE: 'Declining balance (150%)',\n SUM_OF_YEARS_DIGITS: \"Sum of years' digits\",\n UNITS_OF_PRODUCTION: 'Units of production',\n NONE: 'None',\n};\n\n// Soft, semantic status pill — matches the mock's soft pills.\nconst statusPill: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\n// Pure book-value schedule from real backend fields — empty when inputs missing.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method.\nfunction buildDepreciationSeries(input: {\n purchaseValue?: number | null;\n salvageValue?: number | null;\n usefulLifeMonths?: number | null;\n method?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = (input.method ?? 'straight_line').toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n unitsOfProductionCapacity:\n asset.unitsOfProductionCapacity != null ? String(asset.unitsOfProductionCapacity) : '',\n unitsProduced: asset.unitsProduced != null ? String(asset.unitsProduced) : '',\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const tc = useCopy();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel=\"Asset\"\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n backLabel=\"Back to inventory\"\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n // Soonest upcoming (future) scheduled service among the open records, if any.\n const nextServiceAt = nextServiceDate(openMaintenance);\n const isDisposed = asset.status === 'disposed';\n\n // Real derived depreciation schedule (empty if the asset lacks financial inputs).\n const depreciationSeries = buildDepreciationSeries({\n purchaseValue: asset.purchaseValue,\n salvageValue: asset.salvageValue,\n usefulLifeMonths: asset.usefulLifeMonths,\n method: asset.depreciationMethod,\n unitsOfProductionCapacity: asset.unitsOfProductionCapacity,\n unitsProduced: asset.unitsProduced,\n });\n const bookValueSpark = depreciationSeries.map((p) => p.bookValue);\n\n // Real maintenance cost history for this asset (per record, over scheduled date).\n const maintenanceCostData = assetMaintenance\n .filter((m) => (m.actualCost ?? m.estimatedCost) != null)\n .map((m) => ({\n label: m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString(undefined, {\n month: 'short',\n year: '2-digit',\n })\n : m.title.slice(0, 12),\n cost: m.actualCost ?? m.estimatedCost ?? 0,\n }));\n const maintenanceSpend = assetMaintenance.reduce(\n (sum, m) => sum + (m.actualCost ?? m.estimatedCost ?? 0),\n 0\n );\n // TCO composition — only when we have a real purchase value + some maintenance spend.\n const tcoSlices =\n asset.purchaseValue != null && maintenanceSpend > 0\n ? [\n {\n name: 'Purchase',\n value: asset.purchaseValue,\n color: 'var(--color-accent-primary)',\n },\n { name: 'Maintenance', value: maintenanceSpend, color: 'var(--color-status-info-bg)' },\n ]\n : [];\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(editForm.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(editForm.unitsProduced),\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\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>{asset.name}</GradientText>\n </h1>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${statusPill[asset.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {asset.status.replace(/_/g, ' ')}\n </span>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The complete profile of a single asset — its identity, condition, location, assignment,\n financials and maintenance history. Use this page as the asset's home base: edit its\n details, track its book value, and dispose of it when it reaches end of life.\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n hero\n label=\"Current value\"\n value={money(asset.currentValue)}\n delta={asset.purchaseValue != null ? `of ${money(asset.purchaseValue)}` : undefined}\n deltaDirection=\"neutral\"\n spark={bookValueSpark.length > 1 ? bookValueSpark : undefined}\n icon={DollarSign}\n />\n <StatTile\n label=\"Maintenance records\"\n value={assetMaintenance.length}\n delta={openMaintenance.length > 0 ? `${openMaintenance.length} open` : undefined}\n deltaTone=\"neutral\"\n deltaDirection=\"neutral\"\n icon={Wrench}\n />\n <StatTile\n label=\"Registered\"\n value={asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n icon={Calendar}\n />\n <StatTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"min-w-0 lg:col-span-2\">\n <Tabs defaultValue=\"details\">\n <TabsList className=\"max-w-full justify-start overflow-x-auto\">\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"mt-4 space-y-4\">\n {asset.description ? (\n <FieldTile label=\"Description\" value={asset.description} full />\n ) : null}\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <FieldTile label=\"Asset Tag\" value={asset.assetNumber} icon={Hash} mono />\n <FieldTile\n label=\"Serial Number\"\n value={asset.serialNumber || '—'}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Category\"\n value={asset.category.replace(/_/g, ' ')}\n icon={Layers}\n capitalize\n />\n <FieldTile label=\"Condition\" icon={ShieldCheck}>\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </FieldTile>\n <FieldTile label=\"Assigned To\" value={asset.assignedTo || '—'} icon={User} />\n <FieldTile\n label={tc('assethandler.asset.detail.nextService', 'Next Service')}\n value={nextServiceAt ? new Date(nextServiceAt).toLocaleDateString() : '—'}\n icon={Wrench}\n />\n <FieldTile label=\"Department\" value={asset.department || '—'} icon={Building2} />\n <FieldTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n <FieldTile label=\"Supplier\" value={asset.supplier || '—'} icon={Truck} />\n <FieldTile\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n icon={Calendar}\n />\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile label=\"Purchase Value\" value={money(asset.purchaseValue)} />\n <StatTile hero label=\"Current Book Value\" value={money(asset.currentValue)} />\n <StatTile\n label=\"Accum. Depreciation\"\n value={money(asset.accumulatedDepreciation)}\n />\n <StatTile\n label=\"Total Cost of Ownership\"\n value={money(asset.totalCostOfOwnership)}\n />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Depreciation & book value\"\n subtitle=\"Projected book value over the useful life\"\n icon={TrendingDown}\n >\n {depreciationSeries.length > 0 ? (\n <TrendChart\n data={depreciationSeries}\n xKey=\"year\"\n height={260}\n valueFormat={formatCurrencyCompact('USD')}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"py-12 text-center text-sm text-text-secondary\">\n Add purchase value, useful life and salvage value to see the depreciation\n schedule.\n </div>\n )}\n </ChartCard>\n\n <ChartCard title=\"Key facts\" subtitle=\"Purchase & depreciation terms\">\n <dl className=\"overflow-hidden rounded-lg border border-border-seam text-sm\">\n <LedgerRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n striped\n />\n <LedgerRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <LedgerRow label=\"Salvage Value\" value={money(asset.salvageValue)} striped />\n <LedgerRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <LedgerRow label=\"Supplier\" value={asset.supplier || '—'} striped />\n <LedgerRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry\n ? new Date(asset.warrantyExpiry).toLocaleDateString()\n : '—'\n }\n />\n </dl>\n </ChartCard>\n </div>\n\n {tcoSlices.length > 0 ? (\n <ChartCard\n title=\"Total cost of ownership\"\n subtitle=\"What drives lifetime cost\"\n icon={DollarSign}\n >\n <DonutChart\n data={tcoSlices}\n centerLabel=\"TCO\"\n centerValue={tcoSlices.reduce((s, x) => s + x.value, 0)}\n valueFormat={formatCurrencyCompact('USD')}\n height={220}\n />\n </ChartCard>\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4 space-y-4\">\n {maintenanceCostData.length > 0 ? (\n <ChartCard\n title=\"Maintenance cost history\"\n subtitle=\"Recorded cost per maintenance event\"\n icon={Wrench}\n >\n <BarsChart\n data={maintenanceCostData}\n xKey=\"label\"\n height={220}\n valueFormat={formatCurrencyCompact('USD')}\n series={[{ key: 'cost', label: 'Cost' }]}\n />\n </ChartCard>\n ) : null}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"py-8 text-center text-text-secondary\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n m.status === 'completed'\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-warning-bg-subtle text-status-warning-text'\n }`}\n >\n {m.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"mt-1 font-medium\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"mt-2 flex gap-4 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString()\n : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Persistent right rail — Tags + Activity (mirrors the mock) */}\n <aside className=\"space-y-6\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"space-y-3 p-5\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Tag className=\"h-4 w-4 text-text-secondary\" />\n Tags\n </h3>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-action-primary-bg\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </GlassCard>\n\n <ActivityTimeline resourceId={asset.id} />\n </aside>\n </div>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset's details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {editForm.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <>\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsOfProductionCapacity}\n onChange={(e) => setEdit('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Units Produced To Date</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsProduced}\n onChange={(e) => setEdit('unitsProduced', e.target.value)}\n />\n </div>\n </>\n ) : null}\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\n// A single labelled field rendered as its own clean card (mock's field grid).\n// Machine values (serial, tags, supplier) render verbatim — no blanket capitalize.\nfunction FieldTile({\n label,\n value,\n icon: Icon,\n mono,\n capitalize,\n full,\n children,\n}: {\n label: string;\n value?: string;\n icon?: React.ComponentType<{ className?: string }>;\n mono?: boolean;\n capitalize?: boolean;\n full?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div\n className={`rounded-lg border border-border-seam bg-bg-surface p-3.5 ${full ? 'sm:col-span-2 xl:col-span-3' : ''}`}\n >\n <p className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n {Icon ? <Icon className=\"h-3.5 w-3.5\" /> : null}\n {label}\n </p>\n {children ? (\n <div className=\"mt-1.5\">{children}</div>\n ) : (\n <p\n className={`mt-1 break-words font-medium ${mono ? 'font-mono text-sm' : ''} ${capitalize ? 'capitalize' : ''}`}\n >\n {value}\n </p>\n )}\n </div>\n );\n}\n\n// A striped ledger row for the financial key-facts panel.\nfunction LedgerRow({ label, value, striped }: { label: string; value: string; striped?: boolean }) {\n return (\n <div\n className={`flex items-center justify-between gap-4 px-3.5 py-2.5 ${striped ? 'bg-bg-sunken/40' : ''}`}\n >\n <dt className=\"shrink-0 text-text-secondary\">{label}</dt>\n <dd className=\"truncate text-right font-medium\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AssetsAssetDetailPage.js","names":[],"sources":["../../../src/assethandler/pages/AssetsAssetDetailPage.tsx"],"sourcesContent":["import { useAssetHandlerNavigate } from '../hooks/useAssetHandlerNavigate';\nimport type React from 'react';\nimport { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n ResponsiveDialog,\n ResponsiveDialogContent,\n ResponsiveDialogDescription,\n ResponsiveDialogFooter,\n ResponsiveDialogHeader,\n ResponsiveDialogTitle,\n Input,\n Label,\n Textarea,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GlassCard,\n} from '@burdenoff/fe-libs/ui';\nimport {\n ArrowLeft,\n MapPin,\n Calendar,\n Tag,\n User,\n Wrench,\n Pencil,\n Trash2,\n Archive,\n DollarSign,\n TrendingDown,\n Hash,\n Building2,\n Truck,\n ShieldCheck,\n Layers,\n} from 'lucide-react';\nimport { useParams } from 'react-router';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { useCopy } from '../hooks/useCopy';\nimport { notify } from '../utils/toast';\nimport { AttachmentsPanel, CommentsPanel, ActivityTimeline, NotFoundState } from '../components';\nimport {\n StatTile,\n ChartCard,\n TrendChart,\n BarsChart,\n DonutChart,\n formatCurrencyCompact,\n} from '../components';\n\nconst ASSET_QUERY = gql`\n query AssetHandlerAsset($id: ID!) {\n asset(id: $id) {\n id\n assetNumber\n name\n description\n category\n status\n condition\n serialNumber\n locationName\n assignedTo\n tags\n createdAt\n updatedAt\n purchaseValue\n purchaseDate\n usefulLifeMonths\n salvageValue\n depreciationMethod\n unitsOfProductionCapacity\n unitsProduced\n department\n warrantyExpiry\n supplier\n disposalDate\n disposalMethod\n disposalNotes\n currentValue\n accumulatedDepreciation\n totalCostOfOwnership\n }\n }\n`;\n\ninterface AssetRecord {\n id: string;\n assetNumber: string;\n name: string;\n description?: string | null;\n category: string;\n status: string;\n condition: string;\n serialNumber?: string | null;\n locationName?: string | null;\n assignedTo?: string | null;\n tags: string[];\n createdAt: string;\n updatedAt: string;\n purchaseValue?: number | null;\n purchaseDate?: string | null;\n usefulLifeMonths?: number | null;\n salvageValue?: number | null;\n depreciationMethod?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n department?: string | null;\n warrantyExpiry?: string | null;\n supplier?: string | null;\n disposalDate?: string | null;\n disposalMethod?: string | null;\n disposalNotes?: string | null;\n currentValue?: number | null;\n accumulatedDepreciation?: number | null;\n totalCostOfOwnership?: number | null;\n}\n\ninterface AssetQueryResult {\n asset: AssetRecord | null;\n}\n\nconst UPDATE_ASSET_MUTATION = gql`\n mutation AssetHandlerUpdateAsset($id: ID!, $input: UpdateAssetInput!) {\n updateAsset(id: $id, input: $input) {\n id\n }\n }\n`;\n\nconst DISPOSE_ASSET_MUTATION = gql`\n mutation AssetHandlerDisposeAsset($id: ID!, $input: DisposeAssetInput!) {\n disposeAsset(id: $id, input: $input) {\n id\n status\n }\n }\n`;\n\nconst DELETE_ASSET_MUTATION = gql`\n mutation AssetHandlerDeleteAsset($id: ID!) {\n deleteAsset(id: $id)\n }\n`;\n\nconst conditionColors: Record<string, string> = {\n excellent: 'text-status-success-text bg-status-success-bg-subtle',\n good: 'text-status-info-text bg-status-info-bg-subtle',\n fair: 'text-status-warning-text bg-status-warning-bg-subtle',\n poor: 'text-status-warning-text bg-status-warning-bg-subtle',\n damaged: 'text-status-error-text bg-status-error-bg-subtle',\n};\n\nconst money = (value: number | null | undefined): string =>\n value == null ? '—' : `$${Number(value).toLocaleString(undefined, { maximumFractionDigits: 2 })}`;\n\n// Soonest future scheduled date among the given (already status-filtered) records.\n// Records with no / past / unparseable dates are ignored; returns undefined when none.\nfunction nextServiceDate(records: { scheduledDate?: string }[]): string | undefined {\n const now = Date.now();\n return records\n .map((record) => record.scheduledDate)\n .filter((date): date is string => date != null && new Date(date).getTime() >= now)\n .sort((a, b) => new Date(a).getTime() - new Date(b).getTime())[0];\n}\n\nconst depreciationLabels: Record<string, string> = {\n STRAIGHT_LINE: 'Straight line',\n REDUCING_BALANCE: 'Reducing balance (200%)',\n DECLINING_BALANCE: 'Declining balance (150%)',\n SUM_OF_YEARS_DIGITS: \"Sum of years' digits\",\n UNITS_OF_PRODUCTION: 'Units of production',\n NONE: 'None',\n};\n\n// Soft, semantic status pill — matches the mock's soft pills.\nconst statusPill: Record<string, string> = {\n active: 'bg-status-success-bg-subtle text-status-success-text',\n maintenance: 'bg-status-warning-bg-subtle text-status-warning-text',\n inactive: 'bg-bg-sunken text-text-secondary',\n retired: 'bg-bg-sunken text-text-secondary',\n disposed: 'bg-status-error-bg-subtle text-status-error-text',\n};\n\n// Pure book-value schedule from real backend fields — empty when inputs missing.\n// Mirrors wspace-assethandler-svc's computeDepreciation formulas per method.\nfunction buildDepreciationSeries(input: {\n purchaseValue?: number | null;\n salvageValue?: number | null;\n usefulLifeMonths?: number | null;\n method?: string | null;\n unitsOfProductionCapacity?: number | null;\n unitsProduced?: number | null;\n}): { year: number; bookValue: number }[] {\n const pv = input.purchaseValue;\n const life = input.usefulLifeMonths;\n if (!pv || pv <= 0 || !life || life <= 0) return [];\n const salvage = Math.max(0, Math.min(input.salvageValue ?? 0, pv));\n const method = (input.method ?? 'straight_line').toLowerCase();\n const years = Math.max(1, Math.round(life / 12));\n\n if (method === 'units_of_production') {\n const capacity = input.unitsOfProductionCapacity;\n const produced = Math.max(0, input.unitsProduced ?? 0);\n if (!capacity || capacity <= 0) return [];\n const bvAtProduced = Math.max(\n pv - (pv - salvage) * (Math.min(produced, capacity) / capacity),\n salvage\n );\n return [\n { year: 0, bookValue: Math.round(pv) },\n { year: years, bookValue: Math.round(bvAtProduced) },\n ];\n }\n\n const points: { year: number; bookValue: number }[] = [];\n for (let y = 0; y <= years; y += 1) {\n let bv: number;\n if (method === 'reducing_balance') {\n const rate = salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.9, 2 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'declining_balance') {\n const rate =\n salvage > 0 ? 1 - Math.pow(salvage / pv, 1 / years) : Math.min(0.75, 1.5 / years);\n bv = Math.max(pv * Math.pow(1 - rate, y), salvage);\n } else if (method === 'sum_of_years_digits') {\n const syd = (years * (years + 1)) / 2;\n const cumulative = syd > 0 ? (pv - salvage) * ((y * years - (y * (y - 1)) / 2) / syd) : 0;\n bv = Math.max(pv - cumulative, salvage);\n } else if (method === 'none') {\n bv = pv;\n } else {\n bv = Math.max(pv - (pv - salvage) * (y / years), salvage);\n }\n points.push({ year: y, bookValue: Math.round(bv) });\n }\n return points;\n}\n\ninterface EditForm {\n name: string;\n description: string;\n category: string;\n status: string;\n condition: string;\n serialNumber: string;\n locationName: string;\n assignedTo: string;\n department: string;\n supplier: string;\n purchaseValue: string;\n salvageValue: string;\n usefulLifeMonths: string;\n depreciationMethod: string;\n unitsOfProductionCapacity: string;\n unitsProduced: string;\n}\n\nfunction toEditForm(asset: AssetRecord): EditForm {\n return {\n name: asset.name,\n description: asset.description ?? '',\n category: asset.category,\n status: asset.status.toUpperCase(),\n condition: asset.condition.toUpperCase(),\n serialNumber: asset.serialNumber ?? '',\n locationName: asset.locationName ?? '',\n assignedTo: asset.assignedTo ?? '',\n department: asset.department ?? '',\n supplier: asset.supplier ?? '',\n purchaseValue: asset.purchaseValue != null ? String(asset.purchaseValue) : '',\n salvageValue: asset.salvageValue != null ? String(asset.salvageValue) : '',\n usefulLifeMonths: asset.usefulLifeMonths != null ? String(asset.usefulLifeMonths) : '',\n depreciationMethod: (asset.depreciationMethod ?? 'STRAIGHT_LINE').toUpperCase(),\n unitsOfProductionCapacity:\n asset.unitsOfProductionCapacity != null ? String(asset.unitsOfProductionCapacity) : '',\n unitsProduced: asset.unitsProduced != null ? String(asset.unitsProduced) : '',\n };\n}\n\nexport function AssetsAssetDetailPage() {\n const navigate = useAssetHandlerNavigate();\n const { assetId } = useParams<{ assetId: string }>();\n const { maintenanceRecords } = useAssetHandlerStore();\n const tc = useCopy();\n\n const { data, loading, refetch } = useQuery<AssetQueryResult>(ASSET_QUERY, {\n variables: { id: assetId ?? '' },\n skip: !assetId,\n fetchPolicy: 'cache-and-network',\n });\n\n const [showEdit, setShowEdit] = useState(false);\n const [showDispose, setShowDispose] = useState(false);\n const [showDelete, setShowDelete] = useState(false);\n const [editForm, setEditForm] = useState<EditForm | null>(null);\n const [disposeForm, setDisposeForm] = useState({ disposalDate: '', method: '', notes: '' });\n\n const [updateAsset, { loading: updating }] = useMutation(UPDATE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset updated', 'Your changes have been saved.');\n setShowEdit(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not update asset', error.message),\n });\n\n const [disposeAsset, { loading: disposing }] = useMutation(DISPOSE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset disposed', 'The asset has been marked as disposed.');\n setShowDispose(false);\n void refetch();\n },\n onError: (error) => notify.error('Could not dispose asset', error.message),\n });\n\n const [deleteAsset, { loading: deleting }] = useMutation(DELETE_ASSET_MUTATION, {\n refetchQueries: ['AssetHandlerBootstrap'],\n onCompleted: () => {\n notify.success('Asset deleted', 'The asset has been removed from the inventory.');\n navigate('/assets/asset-list');\n },\n onError: (error) => notify.error('Could not delete asset', error.message),\n });\n\n if (loading && !data) {\n return (\n <div className=\"space-y-3 p-6\">\n {Array.from({ length: 6 }).map((_, i) => (\n <div key={i} className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\" />\n ))}\n </div>\n );\n }\n\n const raw = data?.asset;\n if (!raw) {\n return (\n <NotFoundState\n entityLabel=\"Asset\"\n description=\"This asset may have been disposed or removed. Return to the inventory to find it.\"\n backLabel=\"Back to inventory\"\n onBack={() => navigate('/assets/asset-list')}\n />\n );\n }\n\n const asset = {\n ...raw,\n status: raw.status.toLowerCase(),\n condition: raw.condition.toLowerCase(),\n category: raw.category.toLowerCase(),\n };\n const assetMaintenance = maintenanceRecords.filter((m) => m.assetId === asset.id);\n const openMaintenance = assetMaintenance.filter(\n (m) => m.status !== 'completed' && m.status !== 'cancelled'\n );\n // Soonest upcoming (future) scheduled service among the open records, if any.\n const nextServiceAt = nextServiceDate(openMaintenance);\n const isDisposed = asset.status === 'disposed';\n\n // Real derived depreciation schedule (empty if the asset lacks financial inputs).\n const depreciationSeries = buildDepreciationSeries({\n purchaseValue: asset.purchaseValue,\n salvageValue: asset.salvageValue,\n usefulLifeMonths: asset.usefulLifeMonths,\n method: asset.depreciationMethod,\n unitsOfProductionCapacity: asset.unitsOfProductionCapacity,\n unitsProduced: asset.unitsProduced,\n });\n const bookValueSpark = depreciationSeries.map((p) => p.bookValue);\n\n // Real maintenance cost history for this asset (per record, over scheduled date).\n const maintenanceCostData = assetMaintenance\n .filter((m) => (m.actualCost ?? m.estimatedCost) != null)\n .map((m) => ({\n label: m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString(undefined, {\n month: 'short',\n year: '2-digit',\n })\n : m.title.slice(0, 12),\n cost: m.actualCost ?? m.estimatedCost ?? 0,\n }));\n const maintenanceSpend = assetMaintenance.reduce(\n (sum, m) => sum + (m.actualCost ?? m.estimatedCost ?? 0),\n 0\n );\n // TCO composition — only when we have a real purchase value + some maintenance spend.\n const tcoSlices =\n asset.purchaseValue != null && maintenanceSpend > 0\n ? [\n {\n name: 'Purchase',\n value: asset.purchaseValue,\n color: 'var(--color-accent-primary)',\n },\n { name: 'Maintenance', value: maintenanceSpend, color: 'var(--color-status-info-bg)' },\n ]\n : [];\n\n const openEdit = () => {\n setEditForm(toEditForm(raw));\n setShowEdit(true);\n };\n\n const submitEdit = (event: React.FormEvent) => {\n event.preventDefault();\n if (!editForm) return;\n if (!editForm.name.trim()) {\n notify.warning('Name required', 'An asset must have a name.');\n return;\n }\n const optionalNumber = (value: string): number | null => {\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const parsed = Number(trimmed);\n return Number.isNaN(parsed) ? null : parsed;\n };\n void updateAsset({\n variables: {\n id: asset.id,\n input: {\n name: editForm.name.trim(),\n description: editForm.description.trim() || null,\n category: editForm.category.trim(),\n status: editForm.status,\n condition: editForm.condition,\n serialNumber: editForm.serialNumber.trim() || null,\n locationName: editForm.locationName.trim() || null,\n assignedTo: editForm.assignedTo.trim() || null,\n department: editForm.department.trim() || null,\n supplier: editForm.supplier.trim() || null,\n purchaseValue: optionalNumber(editForm.purchaseValue),\n salvageValue: optionalNumber(editForm.salvageValue),\n usefulLifeMonths: optionalNumber(editForm.usefulLifeMonths),\n depreciationMethod: editForm.depreciationMethod,\n unitsOfProductionCapacity: optionalNumber(editForm.unitsOfProductionCapacity),\n unitsProduced: optionalNumber(editForm.unitsProduced),\n },\n },\n });\n };\n\n const submitDispose = (event: React.FormEvent) => {\n event.preventDefault();\n void disposeAsset({\n variables: {\n id: asset.id,\n input: {\n disposalDate: disposeForm.disposalDate\n ? new Date(disposeForm.disposalDate).toISOString()\n : new Date().toISOString(),\n method: disposeForm.method.trim() || null,\n notes: disposeForm.notes.trim() || null,\n },\n },\n });\n };\n\n const setEdit = (field: keyof EditForm, value: string) =>\n setEditForm((prev) => (prev ? { ...prev, [field]: value } : prev));\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"flex items-center gap-4\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"Go back\"\n onClick={() => navigate('/assets/asset-list')}\n >\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>{asset.name}</GradientText>\n </h1>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${statusPill[asset.status] ?? 'bg-bg-sunken text-text-secondary'}`}\n >\n {asset.status.replace(/_/g, ' ')}\n </span>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </div>\n <p className=\"text-sm text-text-secondary mt-1\">\n {asset.assetNumber}\n {asset.serialNumber ? <> · SN: {asset.serialNumber}</> : null}\n </p>\n </div>\n </div>\n <div className=\"flex items-center gap-2\">\n <Button size=\"sm\" variant=\"outline\" onClick={openEdit}>\n <Pencil className=\"mr-2 h-4 w-4\" />\n Edit\n </Button>\n {!isDisposed ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => setShowDispose(true)}>\n <Archive className=\"mr-2 h-4 w-4\" />\n Dispose\n </Button>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"outline\"\n className=\"text-status-error-text\"\n onClick={() => setShowDelete(true)}\n >\n <Trash2 className=\"mr-2 h-4 w-4\" />\n Delete\n </Button>\n </div>\n </div>\n\n <PagePurpose>\n The complete profile of a single asset — its identity, condition, location, assignment,\n financials and maintenance history. Use this page as the asset's home base: edit its\n details, track its book value, and dispose of it when it reaches end of life.\n </PagePurpose>\n\n {isDisposed ? (\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm font-medium\">\n <Archive className=\"h-4 w-4\" />\n This asset was disposed\n {asset.disposalDate ? ` on ${new Date(asset.disposalDate).toLocaleDateString()}` : ''}\n </div>\n {asset.disposalMethod ? (\n <p className=\"mt-1 text-sm text-text-secondary\">Method: {asset.disposalMethod}</p>\n ) : null}\n {asset.disposalNotes ? (\n <p className=\"mt-1 text-sm text-text-secondary\">{asset.disposalNotes}</p>\n ) : null}\n </EmphasisPanel>\n ) : null}\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <StatTile\n hero\n label=\"Current value\"\n value={money(asset.currentValue)}\n delta={asset.purchaseValue != null ? `of ${money(asset.purchaseValue)}` : undefined}\n deltaDirection=\"neutral\"\n spark={bookValueSpark.length > 1 ? bookValueSpark : undefined}\n icon={DollarSign}\n />\n <StatTile\n label=\"Maintenance records\"\n value={assetMaintenance.length}\n delta={openMaintenance.length > 0 ? `${openMaintenance.length} open` : undefined}\n deltaTone=\"neutral\"\n deltaDirection=\"neutral\"\n icon={Wrench}\n />\n <StatTile\n label=\"Registered\"\n value={asset.createdAt ? new Date(asset.createdAt).toLocaleDateString() : '—'}\n icon={Calendar}\n />\n <StatTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"min-w-0 lg:col-span-2\">\n <Tabs defaultValue=\"details\">\n <TabsList className=\"max-w-full justify-start overflow-x-auto\">\n <TabsTrigger value=\"details\">Details</TabsTrigger>\n <TabsTrigger value=\"financial\">Financial</TabsTrigger>\n <TabsTrigger value=\"maintenance\">Maintenance</TabsTrigger>\n <TabsTrigger value=\"discussion\">Discussion</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"details\" className=\"mt-4 space-y-4\">\n {asset.description ? (\n <FieldTile label=\"Description\" value={asset.description} full />\n ) : null}\n <div className=\"grid gap-3 sm:grid-cols-2 xl:grid-cols-3\">\n <FieldTile label=\"Asset Tag\" value={asset.assetNumber} icon={Hash} mono />\n <FieldTile\n label=\"Serial Number\"\n value={asset.serialNumber || '—'}\n icon={Hash}\n mono\n />\n <FieldTile\n label=\"Category\"\n value={asset.category.replace(/_/g, ' ')}\n icon={Layers}\n capitalize\n />\n <FieldTile label=\"Condition\" icon={ShieldCheck}>\n <span\n className={`inline-flex rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${conditionColors[asset.condition] ?? ''}`}\n >\n {asset.condition}\n </span>\n </FieldTile>\n <FieldTile label=\"Assigned To\" value={asset.assignedTo || '—'} icon={User} />\n <FieldTile\n label={tc('assethandler.asset.detail.nextService', 'Next Service')}\n value={nextServiceAt ? new Date(nextServiceAt).toLocaleDateString() : '—'}\n icon={Wrench}\n />\n <FieldTile label=\"Department\" value={asset.department || '—'} icon={Building2} />\n <FieldTile label=\"Location\" value={asset.locationName || '—'} icon={MapPin} />\n <FieldTile label=\"Supplier\" value={asset.supplier || '—'} icon={Truck} />\n <FieldTile\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry ? new Date(asset.warrantyExpiry).toLocaleDateString() : '—'\n }\n icon={Calendar}\n />\n </div>\n <AttachmentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n\n <TabsContent value=\"financial\" className=\"mt-4 space-y-6\">\n <div className=\"grid gap-4 sm:grid-cols-2 xl:grid-cols-4\">\n <StatTile label=\"Purchase Value\" value={money(asset.purchaseValue)} />\n <StatTile hero label=\"Current Book Value\" value={money(asset.currentValue)} />\n <StatTile\n label=\"Accum. Depreciation\"\n value={money(asset.accumulatedDepreciation)}\n />\n <StatTile\n label=\"Total Cost of Ownership\"\n value={money(asset.totalCostOfOwnership)}\n />\n </div>\n\n <div className=\"grid gap-4 lg:grid-cols-2\">\n <ChartCard\n title=\"Depreciation & book value\"\n subtitle=\"Projected book value over the useful life\"\n icon={TrendingDown}\n >\n {depreciationSeries.length > 0 ? (\n <TrendChart\n data={depreciationSeries}\n xKey=\"year\"\n height={260}\n valueFormat={formatCurrencyCompact('USD')}\n xTickFormat={(v) => `${v}y`}\n series={[{ key: 'bookValue', label: 'Book value' }]}\n />\n ) : (\n <div className=\"py-12 text-center text-sm text-text-secondary\">\n Add purchase value, useful life and salvage value to see the depreciation\n schedule.\n </div>\n )}\n </ChartCard>\n\n <ChartCard title=\"Key facts\" subtitle=\"Purchase & depreciation terms\">\n <dl className=\"overflow-hidden rounded-lg border border-border-seam text-sm\">\n <LedgerRow\n label=\"Purchase Date\"\n value={\n asset.purchaseDate ? new Date(asset.purchaseDate).toLocaleDateString() : '—'\n }\n striped\n />\n <LedgerRow\n label=\"Useful Life\"\n value={asset.usefulLifeMonths ? `${asset.usefulLifeMonths} months` : '—'}\n />\n <LedgerRow label=\"Salvage Value\" value={money(asset.salvageValue)} striped />\n <LedgerRow\n label=\"Depreciation Method\"\n value={\n asset.depreciationMethod\n ? (depreciationLabels[asset.depreciationMethod.toUpperCase()] ??\n asset.depreciationMethod)\n : '—'\n }\n />\n <LedgerRow label=\"Supplier\" value={asset.supplier || '—'} striped />\n <LedgerRow\n label=\"Warranty Expiry\"\n value={\n asset.warrantyExpiry\n ? new Date(asset.warrantyExpiry).toLocaleDateString()\n : '—'\n }\n />\n </dl>\n </ChartCard>\n </div>\n\n {tcoSlices.length > 0 ? (\n <ChartCard\n title=\"Total cost of ownership\"\n subtitle=\"What drives lifetime cost\"\n icon={DollarSign}\n >\n <DonutChart\n data={tcoSlices}\n centerLabel=\"TCO\"\n centerValue={tcoSlices.reduce((s, x) => s + x.value, 0)}\n valueFormat={formatCurrencyCompact('USD')}\n height={220}\n />\n </ChartCard>\n ) : null}\n </TabsContent>\n\n <TabsContent value=\"maintenance\" className=\"mt-4 space-y-4\">\n {maintenanceCostData.length > 0 ? (\n <ChartCard\n title=\"Maintenance cost history\"\n subtitle=\"Recorded cost per maintenance event\"\n icon={Wrench}\n >\n <BarsChart\n data={maintenanceCostData}\n xKey=\"label\"\n height={220}\n valueFormat={formatCurrencyCompact('USD')}\n series={[{ key: 'cost', label: 'Cost' }]}\n />\n </ChartCard>\n ) : null}\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Wrench className=\"h-4 w-4\" />\n Maintenance History\n </CardTitle>\n <CardDescription>{assetMaintenance.length} records found</CardDescription>\n </CardHeader>\n <CardContent>\n {assetMaintenance.length === 0 ? (\n <p className=\"py-8 text-center text-text-secondary\">\n No maintenance records for this asset.\n </p>\n ) : (\n <div className=\"space-y-3\">\n {assetMaintenance.map((m) => (\n <div key={m.id} className=\"flex items-start gap-4 rounded-lg border p-4\">\n <div className=\"flex-1\">\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"outline\" className=\"capitalize\">\n {m.type}\n </Badge>\n <span\n className={`rounded-full px-2.5 py-0.5 text-xs font-medium capitalize ${\n m.status === 'completed'\n ? 'bg-status-success-bg-subtle text-status-success-text'\n : 'bg-status-warning-bg-subtle text-status-warning-text'\n }`}\n >\n {m.status.replace(/_/g, ' ')}\n </span>\n </div>\n <p className=\"mt-1 font-medium\">{m.title}</p>\n <p className=\"text-sm text-text-secondary\">{m.description}</p>\n <div className=\"mt-2 flex gap-4 text-xs text-text-secondary\">\n <span>\n Scheduled:{' '}\n {m.scheduledDate\n ? new Date(m.scheduledDate).toLocaleDateString()\n : '—'}\n </span>\n {m.actualCost != null || m.estimatedCost != null ? (\n <span>Cost: {money(m.actualCost ?? m.estimatedCost)}</span>\n ) : null}\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"discussion\" className=\"mt-4\">\n <CommentsPanel entityType=\"assethandler-asset\" entityId={asset.id} />\n </TabsContent>\n </Tabs>\n </div>\n\n {/* Persistent right rail — Tags + Activity (mirrors the mock) */}\n <aside className=\"space-y-6\">\n <GlassCard treatment=\"glass\" className=\"border-border-seam\">\n <div className=\"space-y-3 p-5\">\n <h3 className=\"flex items-center gap-2 text-sm font-semibold\">\n <Tag className=\"h-4 w-4 text-text-secondary\" />\n Tags\n </h3>\n {asset.tags.length === 0 ? (\n <p className=\"text-xs text-text-secondary\">No tags yet</p>\n ) : (\n <div className=\"flex flex-wrap gap-1.5\">\n {asset.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded-full bg-action-primary-bg/10 px-2.5 py-0.5 text-xs font-medium text-action-primary-bg\"\n >\n {tag}\n </span>\n ))}\n </div>\n )}\n </div>\n </GlassCard>\n\n <ActivityTimeline resourceId={asset.id} />\n </aside>\n </div>\n\n {/* Edit dialog */}\n <ResponsiveDialog open={showEdit} onOpenChange={setShowEdit}>\n <ResponsiveDialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-2xl\">\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Edit asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Update this asset's details and financials.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n {editForm ? (\n <form className=\"space-y-4\" onSubmit={submitEdit}>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Name</Label>\n <Input value={editForm.name} onChange={(e) => setEdit('name', e.target.value)} />\n </div>\n <div className=\"space-y-2\">\n <Label>Category</Label>\n <Input\n value={editForm.category}\n onChange={(e) => setEdit('category', e.target.value)}\n />\n </div>\n </div>\n <div className=\"space-y-2\">\n <Label>Description</Label>\n <Textarea\n value={editForm.description}\n onChange={(e) => setEdit('description', e.target.value)}\n rows={2}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-3\">\n <div className=\"space-y-2\">\n <Label>Status</Label>\n <Select value={editForm.status} onValueChange={(v) => setEdit('status', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"ACTIVE\">Active</SelectItem>\n <SelectItem value=\"INACTIVE\">Inactive</SelectItem>\n <SelectItem value=\"MAINTENANCE\">Maintenance</SelectItem>\n <SelectItem value=\"RETIRED\">Retired</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Condition</Label>\n <Select value={editForm.condition} onValueChange={(v) => setEdit('condition', v)}>\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"EXCELLENT\">Excellent</SelectItem>\n <SelectItem value=\"GOOD\">Good</SelectItem>\n <SelectItem value=\"FAIR\">Fair</SelectItem>\n <SelectItem value=\"POOR\">Poor</SelectItem>\n <SelectItem value=\"DAMAGED\">Damaged</SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-2\">\n <Label>Department</Label>\n <Input\n value={editForm.department}\n onChange={(e) => setEdit('department', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2\">\n <div className=\"space-y-2\">\n <Label>Serial Number</Label>\n <Input\n value={editForm.serialNumber}\n onChange={(e) => setEdit('serialNumber', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Assigned To</Label>\n <Input\n value={editForm.assignedTo}\n onChange={(e) => setEdit('assignedTo', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Location</Label>\n <Input\n value={editForm.locationName}\n onChange={(e) => setEdit('locationName', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Supplier</Label>\n <Input\n value={editForm.supplier}\n onChange={(e) => setEdit('supplier', e.target.value)}\n />\n </div>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\n <div className=\"space-y-2\">\n <Label>Purchase Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.purchaseValue}\n onChange={(e) => setEdit('purchaseValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Salvage Value</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"0.01\"\n value={editForm.salvageValue}\n onChange={(e) => setEdit('salvageValue', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Useful Life (mo)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.usefulLifeMonths}\n onChange={(e) => setEdit('usefulLifeMonths', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Depreciation</Label>\n <Select\n value={editForm.depreciationMethod}\n onValueChange={(v) => setEdit('depreciationMethod', v)}\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"STRAIGHT_LINE\">Straight line</SelectItem>\n <SelectItem value=\"REDUCING_BALANCE\">Reducing balance (200%)</SelectItem>\n <SelectItem value=\"DECLINING_BALANCE\">Declining balance (150%)</SelectItem>\n <SelectItem value=\"SUM_OF_YEARS_DIGITS\">Sum of years' digits</SelectItem>\n <SelectItem value=\"UNITS_OF_PRODUCTION\">Units of production</SelectItem>\n <SelectItem value=\"NONE\">None</SelectItem>\n </SelectContent>\n </Select>\n </div>\n {editForm.depreciationMethod === 'UNITS_OF_PRODUCTION' ? (\n <>\n <div className=\"space-y-2\">\n <Label>Lifetime Capacity (units)</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsOfProductionCapacity}\n onChange={(e) => setEdit('unitsOfProductionCapacity', e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Units Produced To Date</Label>\n <Input\n type=\"number\"\n min=\"0\"\n step=\"1\"\n value={editForm.unitsProduced}\n onChange={(e) => setEdit('unitsProduced', e.target.value)}\n />\n </div>\n </>\n ) : null}\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowEdit(false)}\n disabled={updating}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={updating}>\n {updating ? 'Saving…' : 'Save changes'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n ) : null}\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Dispose dialog */}\n <ResponsiveDialog open={showDispose} onOpenChange={setShowDispose}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Dispose asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n Record the disposal of this asset. It will be marked as disposed and removed from\n active inventory.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <form className=\"space-y-4\" onSubmit={submitDispose}>\n <div className=\"space-y-2\">\n <Label>Disposal Date</Label>\n <Input\n type=\"date\"\n value={disposeForm.disposalDate}\n onChange={(e) =>\n setDisposeForm((prev) => ({ ...prev, disposalDate: e.target.value }))\n }\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Method</Label>\n <Input\n placeholder=\"e.g., Sold, Recycled, Scrapped\"\n value={disposeForm.method}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, method: e.target.value }))}\n />\n </div>\n <div className=\"space-y-2\">\n <Label>Notes</Label>\n <Textarea\n placeholder=\"Optional details about the disposal\"\n value={disposeForm.notes}\n onChange={(e) => setDisposeForm((prev) => ({ ...prev, notes: e.target.value }))}\n rows={2}\n />\n </div>\n <ResponsiveDialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setShowDispose(false)}\n disabled={disposing}\n >\n Cancel\n </Button>\n <Button type=\"submit\" disabled={disposing}>\n {disposing ? 'Disposing…' : 'Confirm disposal'}\n </Button>\n </ResponsiveDialogFooter>\n </form>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n\n {/* Delete dialog */}\n <ResponsiveDialog open={showDelete} onOpenChange={setShowDelete}>\n <ResponsiveDialogContent>\n <ResponsiveDialogHeader>\n <ResponsiveDialogTitle>Delete asset</ResponsiveDialogTitle>\n <ResponsiveDialogDescription>\n This removes <span className=\"font-medium\">{asset.name}</span> from the inventory.\n This action cannot be undone.\n </ResponsiveDialogDescription>\n </ResponsiveDialogHeader>\n <ResponsiveDialogFooter>\n <Button variant=\"outline\" onClick={() => setShowDelete(false)} disabled={deleting}>\n Cancel\n </Button>\n <Button\n variant=\"destructive\"\n onClick={() => void deleteAsset({ variables: { id: asset.id } })}\n disabled={deleting}\n >\n {deleting ? 'Deleting…' : 'Delete asset'}\n </Button>\n </ResponsiveDialogFooter>\n </ResponsiveDialogContent>\n </ResponsiveDialog>\n </div>\n );\n}\n\n// A single labelled field rendered as its own clean card (mock's field grid).\n// Machine values (serial, tags, supplier) render verbatim — no blanket capitalize.\nfunction FieldTile({\n label,\n value,\n icon: Icon,\n mono,\n capitalize,\n full,\n children,\n}: {\n label: string;\n value?: string;\n icon?: React.ComponentType<{ className?: string }>;\n mono?: boolean;\n capitalize?: boolean;\n full?: boolean;\n children?: React.ReactNode;\n}) {\n return (\n <div\n className={`rounded-lg border border-border-seam bg-bg-surface p-3.5 ${full ? 'sm:col-span-2 xl:col-span-3' : ''}`}\n >\n <p className=\"flex items-center gap-1.5 text-xs text-text-secondary\">\n {Icon ? <Icon className=\"h-3.5 w-3.5\" /> : null}\n {label}\n </p>\n {children ? (\n <div className=\"mt-1.5\">{children}</div>\n ) : (\n <p\n className={`mt-1 break-words font-medium ${mono ? 'font-mono text-sm' : ''} ${capitalize ? 'capitalize' : ''}`}\n >\n {value}\n </p>\n )}\n </div>\n );\n}\n\n// A striped ledger row for the financial key-facts panel.\nfunction LedgerRow({ label, value, striped }: { label: string; value: string; striped?: boolean }) {\n return (\n <div\n className={`flex items-center justify-between gap-4 px-3.5 py-2.5 ${striped ? 'bg-bg-sunken/40' : ''}`}\n >\n <dt className=\"shrink-0 text-text-secondary\">{label}</dt>\n <dd className=\"truncate text-right font-medium\">{value}</dd>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { NotFoundState as r } from "../components/NotFoundState.js";
|
|
|
5
5
|
import "../components/index.js";
|
|
6
6
|
import { useState as i } from "react";
|
|
7
7
|
import { ArrowLeft as ee, Edit as a, Loader2 as o } from "lucide-react";
|
|
8
|
-
import { useParams as te } from "react-router
|
|
8
|
+
import { useParams as te } from "react-router";
|
|
9
9
|
import { gql as s } from "@apollo/client";
|
|
10
10
|
import { useMutation as c, useQuery as l } from "@apollo/client/react";
|
|
11
11
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|