@burdenoff/microfe-assethandler 2026.703.4 → 2026.703.6
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 +16 -5
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/components/ActivityTimeline.js +70 -0
- package/dist/assethandler/components/ActivityTimeline.js.map +1 -0
- package/dist/assethandler/components/AttachmentsPanel.js +204 -0
- package/dist/assethandler/components/AttachmentsPanel.js.map +1 -0
- package/dist/assethandler/components/CommentsPanel.js +137 -0
- package/dist/assethandler/components/CommentsPanel.js.map +1 -0
- package/dist/assethandler/components/NotFoundState.js +25 -0
- package/dist/assethandler/components/NotFoundState.js.map +1 -0
- package/dist/assethandler/components/Pagination.js +90 -0
- package/dist/assethandler/components/Pagination.js.map +1 -0
- package/dist/assethandler/components/index.js +5 -0
- package/dist/assethandler/pages/AnalyticsPage.js +398 -200
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +62 -68
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +158 -4
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +685 -181
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +184 -167
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +105 -134
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +272 -85
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +602 -153
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +139 -95
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +269 -149
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsDashboardPage.js +530 -0
- package/dist/assethandler/pages/ReportsDashboardPage.js.map +1 -0
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +216 -165
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +157 -132
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js +24 -3
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js +28 -4
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/csv.js +16 -0
- package/dist/assethandler/utils/csv.js.map +1 -0
- package/package.json +1 -1
|
@@ -4,16 +4,16 @@ import { Loader2 as r } from "lucide-react";
|
|
|
4
4
|
import { Navigate as i, Route as a, Routes as o } from "react-router-dom";
|
|
5
5
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
6
6
|
//#region src/assethandler/AssetHandlerRoutes.tsx
|
|
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/IotDevicesPage.js").then((e) => ({ default: e.IotDevicesPage }))), W = n(() => import("./pages/KnowledgeBasePage.js").then((e) => ({ default: e.KnowledgeBasePage }))), G = n(() => import("./pages/ProvenancePage.js").then((e) => ({ default: e.ProvenancePage }))), K = n(() => import("./pages/SamLicensesPage.js").then((e) => ({ default: e.SamLicensesPage })));
|
|
8
|
-
function
|
|
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/IotDevicesPage.js").then((e) => ({ default: e.IotDevicesPage }))), W = n(() => import("./pages/KnowledgeBasePage.js").then((e) => ({ default: e.KnowledgeBasePage }))), 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 })));
|
|
8
|
+
function J() {
|
|
9
9
|
return /* @__PURE__ */ s("div", {
|
|
10
10
|
className: "flex min-h-[320px] items-center justify-center",
|
|
11
11
|
children: /* @__PURE__ */ s(r, { className: "h-8 w-8 animate-spin text-primary" })
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
|
-
function
|
|
14
|
+
function Y() {
|
|
15
15
|
return /* @__PURE__ */ s(t, {
|
|
16
|
-
fallback: /* @__PURE__ */ s(
|
|
16
|
+
fallback: /* @__PURE__ */ s(J, {}),
|
|
17
17
|
children: /* @__PURE__ */ c(o, { children: [
|
|
18
18
|
/* @__PURE__ */ s(a, {
|
|
19
19
|
index: !0,
|
|
@@ -111,6 +111,17 @@ function J() {
|
|
|
111
111
|
path: "portfolio/portfolio-overview",
|
|
112
112
|
element: /* @__PURE__ */ s(j, {})
|
|
113
113
|
}),
|
|
114
|
+
/* @__PURE__ */ s(a, {
|
|
115
|
+
path: "reports",
|
|
116
|
+
element: /* @__PURE__ */ s(i, {
|
|
117
|
+
to: "reports-dashboard",
|
|
118
|
+
replace: !0
|
|
119
|
+
})
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ s(a, {
|
|
122
|
+
path: "reports/reports-dashboard",
|
|
123
|
+
element: /* @__PURE__ */ s(q, {})
|
|
124
|
+
}),
|
|
114
125
|
/* @__PURE__ */ s(a, {
|
|
115
126
|
path: "security/compliance/:frameworkId",
|
|
116
127
|
element: /* @__PURE__ */ s(M, {})
|
|
@@ -182,6 +193,6 @@ function J() {
|
|
|
182
193
|
});
|
|
183
194
|
}
|
|
184
195
|
//#endregion
|
|
185
|
-
export {
|
|
196
|
+
export { Y as AssetHandlerRoutes };
|
|
186
197
|
|
|
187
198
|
//# sourceMappingURL=AssetHandlerRoutes.js.map
|
|
@@ -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);\nconst EsgDashboardPage = lazy(() =>\n import('./pages/EsgDashboardPage').then((m) => ({ default: m.EsgDashboardPage }))\n);\nconst IotDevicesPage = lazy(() =>\n import('./pages/IotDevicesPage').then((m) => ({ default: m.IotDevicesPage }))\n);\nconst KnowledgeBasePage = lazy(() =>\n import('./pages/KnowledgeBasePage').then((m) => ({ default: m.KnowledgeBasePage }))\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);\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=\"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/provenance\" element={<ProvenancePage />} />\n <Route path=\"advanced/esg-dashboard\" element={<EsgDashboardPage />} />\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-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);\nconst EsgDashboardPage = lazy(() =>\n import('./pages/EsgDashboardPage').then((m) => ({ default: m.EsgDashboardPage }))\n);\nconst IotDevicesPage = lazy(() =>\n import('./pages/IotDevicesPage').then((m) => ({ default: m.IotDevicesPage }))\n);\nconst KnowledgeBasePage = lazy(() =>\n import('./pages/KnowledgeBasePage').then((m) => ({ default: m.KnowledgeBasePage }))\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/provenance\" element={<ProvenancePage />} />\n <Route path=\"advanced/esg-dashboard\" element={<EsgDashboardPage />} />\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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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { useAssetHandler as e } from "../providers/AssetHandlerProvider.js";
|
|
2
|
+
import { useMemo as t } from "react";
|
|
3
|
+
import { Activity as n } from "lucide-react";
|
|
4
|
+
import { gql as r } from "@apollo/client";
|
|
5
|
+
import { useQuery as i } from "@apollo/client/react";
|
|
6
|
+
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
7
|
+
import { Card as s, CardContent as c, CardHeader as l, CardTitle as u, IllustratedEmptyState as d } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
//#region src/assethandler/components/ActivityTimeline.tsx
|
|
9
|
+
var f = r`
|
|
10
|
+
query AssetHandlerResourceActivities($filter: ActivityLogFilter) {
|
|
11
|
+
getActivities(filter: $filter) {
|
|
12
|
+
id
|
|
13
|
+
action
|
|
14
|
+
description
|
|
15
|
+
timestamp
|
|
16
|
+
userId
|
|
17
|
+
resourceType
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
`;
|
|
21
|
+
function p({ resourceId: r, limit: p = 20 }) {
|
|
22
|
+
let { workspaceId: m } = e(), { data: h, loading: g } = i(f, {
|
|
23
|
+
variables: { filter: {
|
|
24
|
+
resourceId: r,
|
|
25
|
+
...m ? { workspaceId: m } : {},
|
|
26
|
+
limit: p
|
|
27
|
+
} },
|
|
28
|
+
fetchPolicy: "cache-and-network",
|
|
29
|
+
errorPolicy: "all",
|
|
30
|
+
skip: !r
|
|
31
|
+
}), _ = t(() => h?.getActivities ?? [], [h]);
|
|
32
|
+
return /* @__PURE__ */ o(s, { children: [/* @__PURE__ */ a(l, { children: /* @__PURE__ */ o(u, {
|
|
33
|
+
className: "flex items-center gap-2 text-base",
|
|
34
|
+
children: [/* @__PURE__ */ a(n, { className: "h-4 w-4" }), "Activity"]
|
|
35
|
+
}) }), /* @__PURE__ */ a(c, { children: g && _.length === 0 ? /* @__PURE__ */ a("div", {
|
|
36
|
+
className: "space-y-2",
|
|
37
|
+
children: Array.from({ length: 4 }).map((e, t) => /* @__PURE__ */ a("div", { className: "h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
38
|
+
}) : _.length === 0 ? /* @__PURE__ */ a(d, {
|
|
39
|
+
illustration: "empty-notifications",
|
|
40
|
+
title: "No activity yet",
|
|
41
|
+
description: "Changes to this record — updates, status changes and assignments — will show up here."
|
|
42
|
+
}) : /* @__PURE__ */ a("ol", {
|
|
43
|
+
className: "relative space-y-4 border-l border-border-subtle pl-4",
|
|
44
|
+
children: _.map((e) => /* @__PURE__ */ o("li", {
|
|
45
|
+
className: "relative",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ a("span", {
|
|
48
|
+
className: "absolute -left-[1.3125rem] top-1.5 h-2 w-2 rounded-full bg-primary",
|
|
49
|
+
"aria-hidden": "true"
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ a("p", {
|
|
52
|
+
className: "text-sm font-medium capitalize",
|
|
53
|
+
children: e.action.replace(/[._]/g, " ")
|
|
54
|
+
}),
|
|
55
|
+
e.description ? /* @__PURE__ */ a("p", {
|
|
56
|
+
className: "text-sm text-text-secondary",
|
|
57
|
+
children: e.description
|
|
58
|
+
}) : null,
|
|
59
|
+
/* @__PURE__ */ a("p", {
|
|
60
|
+
className: "mt-0.5 text-xs text-text-secondary",
|
|
61
|
+
children: new Date(e.timestamp).toLocaleString()
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
}, e.id))
|
|
65
|
+
}) })] });
|
|
66
|
+
}
|
|
67
|
+
//#endregion
|
|
68
|
+
export { p as ActivityTimeline };
|
|
69
|
+
|
|
70
|
+
//# sourceMappingURL=ActivityTimeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityTimeline.js","names":[],"sources":["../../../src/assethandler/components/ActivityTimeline.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { gql } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Activity } from 'lucide-react';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\n\n/**\n * Recent activity for a single AssetHandler resource, sourced from the\n * federated wspace-activity-svc `getActivities` query (fed by be-sdk\n * `trackOperation` on the backend). Read-only, with a graceful empty state.\n */\nexport interface ActivityTimelineProps {\n resourceId: string;\n /** Optional cap on rows shown. Defaults to 20. */\n limit?: number;\n}\n\ninterface ActivityLogNode {\n id: string;\n action: string;\n description?: string | null;\n timestamp: string;\n userId: string;\n resourceType?: string | null;\n}\n\ninterface GetActivitiesResult {\n getActivities: ActivityLogNode[];\n}\n\nconst GET_ACTIVITIES_QUERY = gql`\n query AssetHandlerResourceActivities($filter: ActivityLogFilter) {\n getActivities(filter: $filter) {\n id\n action\n description\n timestamp\n userId\n resourceType\n }\n }\n`;\n\nexport function ActivityTimeline({ resourceId, limit = 20 }: ActivityTimelineProps) {\n const { workspaceId } = useAssetHandler();\n\n const { data, loading } = useQuery<GetActivitiesResult>(GET_ACTIVITIES_QUERY, {\n variables: {\n filter: {\n resourceId,\n ...(workspaceId ? { workspaceId } : {}),\n limit,\n },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !resourceId,\n });\n\n const activities = useMemo(() => data?.getActivities ?? [], [data]);\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Activity className=\"h-4 w-4\" />\n Activity\n </CardTitle>\n </CardHeader>\n <CardContent>\n {loading && activities.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 4 }).map((_, i) => (\n <div\n key={i}\n className=\"h-10 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : activities.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No activity yet\"\n description=\"Changes to this record — updates, status changes and assignments — will show up here.\"\n />\n ) : (\n <ol className=\"relative space-y-4 border-l border-border-subtle pl-4\">\n {activities.map((item) => (\n <li key={item.id} className=\"relative\">\n <span\n className=\"absolute -left-[1.3125rem] top-1.5 h-2 w-2 rounded-full bg-primary\"\n aria-hidden=\"true\"\n />\n <p className=\"text-sm font-medium capitalize\">\n {item.action.replace(/[._]/g, ' ')}\n </p>\n {item.description ? (\n <p className=\"text-sm text-text-secondary\">{item.description}</p>\n ) : null}\n <p className=\"mt-0.5 text-xs text-text-secondary\">\n {new Date(item.timestamp).toLocaleString()}\n </p>\n </li>\n ))}\n </ol>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;AAqCA,IAAM,IAAuB,CAAG;;;;;;;;;;;;AAahC,SAAgB,EAAiB,EAAE,eAAY,WAAQ,MAA6B;CAClF,IAAM,EAAE,mBAAgB,GAAiB,EAEnC,EAAE,SAAM,eAAY,EAA8B,GAAsB;EAC5E,WAAW,EACT,QAAQ;GACN;GACA,GAAI,IAAc,EAAE,gBAAa,GAAG,EAAE;GACtC;GACD,EACF;EACD,aAAa;EACb,aAAa;EACb,MAAM,CAAC;EACR,CAAC,EAEI,IAAa,QAAc,GAAM,iBAAiB,EAAE,EAAE,CAAC,EAAK,CAAC;AAEnE,QACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;EAAW,WAAU;YAArB,CACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA,EAAA,WAEtB;KACD,CAAA,EACb,kBAAC,GAAD,EAAA,UACG,KAAW,EAAW,WAAW,IAChC,kBAAC,OAAD;EAAK,WAAU;YACZ,MAAM,KAAK,EAAE,QAAQ,GAAG,CAAC,CAAC,KAAK,GAAG,MACjC,kBAAC,OAAD,EAEE,WAAU,+DACV,EAFK,EAEL,CACF;EACE,CAAA,GACJ,EAAW,WAAW,IACxB,kBAAC,GAAD;EACE,cAAa;EACb,OAAM;EACN,aAAY;EACZ,CAAA,GAEF,kBAAC,MAAD;EAAI,WAAU;YACX,EAAW,KAAK,MACf,kBAAC,MAAD;GAAkB,WAAU;aAA5B;IACE,kBAAC,QAAD;KACE,WAAU;KACV,eAAY;KACZ,CAAA;IACF,kBAAC,KAAD;KAAG,WAAU;eACV,EAAK,OAAO,QAAQ,SAAS,IAAI;KAChC,CAAA;IACH,EAAK,cACJ,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAK;KAAgB,CAAA,GAC/D;IACJ,kBAAC,KAAD;KAAG,WAAU;eACV,IAAI,KAAK,EAAK,UAAU,CAAC,gBAAgB;KACxC,CAAA;IACD;KAdI,EAAK,GAcT,CACL;EACC,CAAA,EAEK,CAAA,CACT,EAAA,CAAA"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { notify as e } from "../utils/toast.js";
|
|
2
|
+
import { useMemo as t, useRef as n, useState as r } from "react";
|
|
3
|
+
import { Download as i, FileText as a, Link2 as o, Loader2 as s, Paperclip as c, Upload as l } from "lucide-react";
|
|
4
|
+
import { gql as u } from "@apollo/client";
|
|
5
|
+
import { useMutation as d, useQuery as f } from "@apollo/client/react";
|
|
6
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
7
|
+
import { Button as h, Card as g, CardContent as _, CardHeader as v, CardTitle as y, IllustratedEmptyState as b } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
//#region src/assethandler/components/AttachmentsPanel.tsx
|
|
9
|
+
var x = u`
|
|
10
|
+
query AssetHandlerGetFiles($pagination: PaginationInput, $sort: FileSortInput) {
|
|
11
|
+
getFiles(pagination: $pagination, sort: $sort) {
|
|
12
|
+
total
|
|
13
|
+
hasMore
|
|
14
|
+
files {
|
|
15
|
+
id
|
|
16
|
+
name
|
|
17
|
+
extension
|
|
18
|
+
mimeType
|
|
19
|
+
size
|
|
20
|
+
downloadUrl
|
|
21
|
+
createdAt
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
`, S = u`
|
|
26
|
+
mutation AssetHandlerInitiateUpload($input: InitiateUploadInput!) {
|
|
27
|
+
initiateUpload(input: $input) {
|
|
28
|
+
uploadUrl
|
|
29
|
+
session {
|
|
30
|
+
id
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
`, C = u`
|
|
35
|
+
mutation AssetHandlerCompleteUpload($input: CompleteUploadInput!) {
|
|
36
|
+
completeUpload(input: $input) {
|
|
37
|
+
fileId
|
|
38
|
+
file {
|
|
39
|
+
id
|
|
40
|
+
name
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`, w = u`
|
|
45
|
+
mutation AssetHandlerCreateFileShareLink($input: CreateShareGrantLinkInput!) {
|
|
46
|
+
createFileShareLink(input: $input) {
|
|
47
|
+
id
|
|
48
|
+
shareUrl
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
function T(e) {
|
|
53
|
+
if (!e) return "0 B";
|
|
54
|
+
let t = [
|
|
55
|
+
"B",
|
|
56
|
+
"KB",
|
|
57
|
+
"MB",
|
|
58
|
+
"GB"
|
|
59
|
+
], n = Math.min(Math.floor(Math.log(e) / Math.log(1024)), t.length - 1);
|
|
60
|
+
return `${(e / 1024 ** n).toFixed(n === 0 ? 0 : 1)} ${t[n]}`;
|
|
61
|
+
}
|
|
62
|
+
function E(e) {
|
|
63
|
+
let t = e.lastIndexOf(".");
|
|
64
|
+
return t >= 0 ? e.slice(t + 1).toLowerCase() : "bin";
|
|
65
|
+
}
|
|
66
|
+
function D({ entityType: u, entityId: D }) {
|
|
67
|
+
let O = n(null), [k, A] = r(!1), [j, M] = r(null), { data: N, loading: P, refetch: F } = f(x, {
|
|
68
|
+
variables: {
|
|
69
|
+
pagination: {
|
|
70
|
+
limit: 25,
|
|
71
|
+
offset: 0
|
|
72
|
+
},
|
|
73
|
+
sort: {
|
|
74
|
+
field: "CREATED_AT",
|
|
75
|
+
order: "DESC"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
fetchPolicy: "cache-and-network",
|
|
79
|
+
errorPolicy: "all"
|
|
80
|
+
}), [I] = d(S), [L] = d(C), [R] = d(w), z = t(() => N?.getFiles.files ?? [], [N]), B = async (t) => {
|
|
81
|
+
let n = t.target.files?.[0];
|
|
82
|
+
if (t.target.value = "", n) {
|
|
83
|
+
A(!0);
|
|
84
|
+
try {
|
|
85
|
+
let t = await I({ variables: { input: {
|
|
86
|
+
fileName: n.name,
|
|
87
|
+
extension: E(n.name),
|
|
88
|
+
fileSize: n.size,
|
|
89
|
+
mimeType: n.type || "application/octet-stream",
|
|
90
|
+
visibility: "WORKSPACE"
|
|
91
|
+
} } }), r = t.data?.initiateUpload.uploadUrl, i = t.data?.initiateUpload.session.id;
|
|
92
|
+
if (!r || !i) throw Error("Upload could not be initialised.");
|
|
93
|
+
let a = await fetch(r, {
|
|
94
|
+
method: "PUT",
|
|
95
|
+
body: n,
|
|
96
|
+
headers: { "Content-Type": n.type || "application/octet-stream" }
|
|
97
|
+
});
|
|
98
|
+
if (!a.ok) throw Error(`Storage rejected the upload (HTTP ${a.status}).`);
|
|
99
|
+
await L({ variables: { input: {
|
|
100
|
+
sessionId: i,
|
|
101
|
+
fileSize: n.size
|
|
102
|
+
} } }), e.success("File uploaded", `${n.name} is now available on this record.`), await F();
|
|
103
|
+
} catch (t) {
|
|
104
|
+
e.error("Upload failed", t instanceof Error ? t.message : "The file could not be uploaded.");
|
|
105
|
+
} finally {
|
|
106
|
+
A(!1);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}, V = async (t) => {
|
|
110
|
+
M(t);
|
|
111
|
+
try {
|
|
112
|
+
let n = (await R({ variables: { input: {
|
|
113
|
+
resourceId: t,
|
|
114
|
+
role: "VIEWER"
|
|
115
|
+
} } })).data?.createFileShareLink.shareUrl;
|
|
116
|
+
if (!n) throw Error("No share link was returned.");
|
|
117
|
+
navigator.clipboard?.writeText ? (await navigator.clipboard.writeText(n), e.success("Share link copied", "A view-only link is on your clipboard.")) : e.info("Share link ready", n);
|
|
118
|
+
} catch (t) {
|
|
119
|
+
e.error("Could not create share link", t instanceof Error ? t.message : "Please try again.");
|
|
120
|
+
} finally {
|
|
121
|
+
M(null);
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
return /* @__PURE__ */ m(g, { children: [/* @__PURE__ */ m(v, {
|
|
125
|
+
className: "flex flex-row items-center justify-between gap-2 space-y-0",
|
|
126
|
+
children: [/* @__PURE__ */ m(y, {
|
|
127
|
+
className: "flex items-center gap-2 text-base",
|
|
128
|
+
children: [
|
|
129
|
+
/* @__PURE__ */ p(c, { className: "h-4 w-4" }),
|
|
130
|
+
"Attachments",
|
|
131
|
+
N?.getFiles.total ? /* @__PURE__ */ m("span", {
|
|
132
|
+
className: "text-sm font-normal text-text-secondary",
|
|
133
|
+
children: [
|
|
134
|
+
"(",
|
|
135
|
+
N.getFiles.total,
|
|
136
|
+
")"
|
|
137
|
+
]
|
|
138
|
+
}) : null
|
|
139
|
+
]
|
|
140
|
+
}), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("input", {
|
|
141
|
+
ref: O,
|
|
142
|
+
type: "file",
|
|
143
|
+
className: "hidden",
|
|
144
|
+
onChange: (e) => void B(e),
|
|
145
|
+
"aria-label": `Upload a file for ${u} ${D}`
|
|
146
|
+
}), /* @__PURE__ */ m(h, {
|
|
147
|
+
size: "sm",
|
|
148
|
+
variant: "outline",
|
|
149
|
+
disabled: k,
|
|
150
|
+
onClick: () => O.current?.click(),
|
|
151
|
+
children: [k ? /* @__PURE__ */ p(s, { className: "mr-2 h-3.5 w-3.5 animate-spin" }) : /* @__PURE__ */ p(l, { className: "mr-2 h-3.5 w-3.5" }), k ? "Uploading…" : "Upload"]
|
|
152
|
+
})] })]
|
|
153
|
+
}), /* @__PURE__ */ p(_, { children: P && z.length === 0 ? /* @__PURE__ */ p("div", {
|
|
154
|
+
className: "space-y-2",
|
|
155
|
+
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ p("div", { className: "h-12 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
156
|
+
}) : z.length === 0 ? /* @__PURE__ */ p(b, {
|
|
157
|
+
illustration: "empty-data",
|
|
158
|
+
title: "No files yet",
|
|
159
|
+
description: "Upload photos, receipts, warranties or documents to keep them with this record."
|
|
160
|
+
}) : /* @__PURE__ */ p("ul", {
|
|
161
|
+
className: "divide-y divide-border-subtle",
|
|
162
|
+
children: z.map((e) => /* @__PURE__ */ m("li", {
|
|
163
|
+
className: "flex items-center gap-3 py-2.5",
|
|
164
|
+
children: [
|
|
165
|
+
/* @__PURE__ */ p(a, { className: "h-5 w-5 shrink-0 text-text-secondary" }),
|
|
166
|
+
/* @__PURE__ */ m("div", {
|
|
167
|
+
className: "min-w-0 flex-1",
|
|
168
|
+
children: [/* @__PURE__ */ p("p", {
|
|
169
|
+
className: "truncate text-sm font-medium",
|
|
170
|
+
children: e.name
|
|
171
|
+
}), /* @__PURE__ */ m("p", {
|
|
172
|
+
className: "text-xs text-text-secondary",
|
|
173
|
+
children: [
|
|
174
|
+
T(Number(e.size)),
|
|
175
|
+
" ·",
|
|
176
|
+
" ",
|
|
177
|
+
new Date(e.createdAt).toLocaleDateString()
|
|
178
|
+
]
|
|
179
|
+
})]
|
|
180
|
+
}),
|
|
181
|
+
e.downloadUrl ? /* @__PURE__ */ p("a", {
|
|
182
|
+
href: e.downloadUrl,
|
|
183
|
+
target: "_blank",
|
|
184
|
+
rel: "noreferrer",
|
|
185
|
+
className: "text-text-secondary hover:text-text-primary",
|
|
186
|
+
"aria-label": `Download ${e.name}`,
|
|
187
|
+
children: /* @__PURE__ */ p(i, { className: "h-4 w-4" })
|
|
188
|
+
}) : null,
|
|
189
|
+
/* @__PURE__ */ p(h, {
|
|
190
|
+
size: "sm",
|
|
191
|
+
variant: "ghost",
|
|
192
|
+
disabled: j === e.id,
|
|
193
|
+
onClick: () => void V(e.id),
|
|
194
|
+
"aria-label": `Share ${e.name}`,
|
|
195
|
+
children: j === e.id ? /* @__PURE__ */ p(s, { className: "h-3.5 w-3.5 animate-spin" }) : /* @__PURE__ */ p(o, { className: "h-3.5 w-3.5" })
|
|
196
|
+
})
|
|
197
|
+
]
|
|
198
|
+
}, e.id))
|
|
199
|
+
}) })] });
|
|
200
|
+
}
|
|
201
|
+
//#endregion
|
|
202
|
+
export { D as AttachmentsPanel };
|
|
203
|
+
|
|
204
|
+
//# sourceMappingURL=AttachmentsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AttachmentsPanel.js","names":[],"sources":["../../../src/assethandler/components/AttachmentsPanel.tsx"],"sourcesContent":["import { useMemo, useRef, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Paperclip, Upload, Link2, FileText, Loader2, Download } from 'lucide-react';\nimport { notify } from '../utils/toast';\n\n/**\n * Attach and reference files for an AssetHandler entity, backed by the\n * federated wspace-files-svc (same wspace gateway/Apollo client). Fully real —\n * lists workspace files via `getFiles`, uploads new files through the\n * `initiateUpload` → presigned PUT → `completeUpload` flow, and mints public\n * share links via `createFileShareLink`. No mock data.\n *\n * `entityType`/`entityId` scope the panel to the record it is mounted on and\n * are used for context labelling; uploaded files land in the workspace file\n * store so they can be shared and reused.\n */\nexport interface AttachmentsPanelProps {\n entityType: string;\n entityId: string;\n}\n\ninterface FileNode {\n id: string;\n name: string;\n extension: string;\n mimeType: string;\n size: number;\n downloadUrl?: string | null;\n createdAt: string;\n}\n\ninterface GetFilesResult {\n getFiles: {\n files: FileNode[];\n total: number;\n hasMore: boolean;\n };\n}\n\nconst GET_FILES_QUERY = gql`\n query AssetHandlerGetFiles($pagination: PaginationInput, $sort: FileSortInput) {\n getFiles(pagination: $pagination, sort: $sort) {\n total\n hasMore\n files {\n id\n name\n extension\n mimeType\n size\n downloadUrl\n createdAt\n }\n }\n }\n`;\n\nconst INITIATE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerInitiateUpload($input: InitiateUploadInput!) {\n initiateUpload(input: $input) {\n uploadUrl\n session {\n id\n }\n }\n }\n`;\n\nconst COMPLETE_UPLOAD_MUTATION = gql`\n mutation AssetHandlerCompleteUpload($input: CompleteUploadInput!) {\n completeUpload(input: $input) {\n fileId\n file {\n id\n name\n }\n }\n }\n`;\n\nconst CREATE_SHARE_LINK_MUTATION = gql`\n mutation AssetHandlerCreateFileShareLink($input: CreateShareGrantLinkInput!) {\n createFileShareLink(input: $input) {\n id\n shareUrl\n }\n }\n`;\n\nfunction formatSize(bytes: number): string {\n if (!bytes) return '0 B';\n const units = ['B', 'KB', 'MB', 'GB'];\n const exponent = Math.min(Math.floor(Math.log(bytes) / Math.log(1024)), units.length - 1);\n const value = bytes / Math.pow(1024, exponent);\n return `${value.toFixed(exponent === 0 ? 0 : 1)} ${units[exponent]}`;\n}\n\nfunction extensionOf(fileName: string): string {\n const dot = fileName.lastIndexOf('.');\n return dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : 'bin';\n}\n\nexport function AttachmentsPanel({ entityType, entityId }: AttachmentsPanelProps) {\n const fileInputRef = useRef<HTMLInputElement>(null);\n const [uploading, setUploading] = useState(false);\n const [sharingId, setSharingId] = useState<string | null>(null);\n\n const { data, loading, refetch } = useQuery<GetFilesResult>(GET_FILES_QUERY, {\n variables: {\n pagination: { limit: 25, offset: 0 },\n sort: { field: 'CREATED_AT', order: 'DESC' },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n });\n\n const [initiateUpload] = useMutation<{\n initiateUpload: { uploadUrl?: string | null; session: { id: string } };\n }>(INITIATE_UPLOAD_MUTATION);\n const [completeUpload] = useMutation(COMPLETE_UPLOAD_MUTATION);\n const [createShareLink] = useMutation<{\n createFileShareLink: { id: string; shareUrl?: string | null };\n }>(CREATE_SHARE_LINK_MUTATION);\n\n const files = useMemo(() => data?.getFiles.files ?? [], [data]);\n\n const handleFileSelected = async (event: React.ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n // Reset the input so selecting the same file again re-triggers change.\n event.target.value = '';\n if (!file) return;\n\n setUploading(true);\n try {\n const initiated = await initiateUpload({\n variables: {\n input: {\n fileName: file.name,\n extension: extensionOf(file.name),\n fileSize: file.size,\n mimeType: file.type || 'application/octet-stream',\n visibility: 'WORKSPACE',\n },\n },\n });\n\n const uploadUrl = initiated.data?.initiateUpload.uploadUrl;\n const sessionId = initiated.data?.initiateUpload.session.id;\n if (!uploadUrl || !sessionId) {\n throw new Error('Upload could not be initialised.');\n }\n\n const putResponse = await fetch(uploadUrl, {\n method: 'PUT',\n body: file,\n headers: { 'Content-Type': file.type || 'application/octet-stream' },\n });\n if (!putResponse.ok) {\n throw new Error(`Storage rejected the upload (HTTP ${putResponse.status}).`);\n }\n\n await completeUpload({\n variables: { input: { sessionId, fileSize: file.size } },\n });\n\n notify.success('File uploaded', `${file.name} is now available on this record.`);\n await refetch();\n } catch (error) {\n notify.error(\n 'Upload failed',\n error instanceof Error ? error.message : 'The file could not be uploaded.'\n );\n } finally {\n setUploading(false);\n }\n };\n\n const handleShare = async (fileId: string) => {\n setSharingId(fileId);\n try {\n const result = await createShareLink({\n variables: { input: { resourceId: fileId, role: 'VIEWER' } },\n });\n const url = result.data?.createFileShareLink.shareUrl;\n if (!url) {\n throw new Error('No share link was returned.');\n }\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(url);\n notify.success('Share link copied', 'A view-only link is on your clipboard.');\n } else {\n notify.info('Share link ready', url);\n }\n } catch (error) {\n notify.error(\n 'Could not create share link',\n error instanceof Error ? error.message : 'Please try again.'\n );\n } finally {\n setSharingId(null);\n }\n };\n\n return (\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between gap-2 space-y-0\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Paperclip className=\"h-4 w-4\" />\n Attachments\n {data?.getFiles.total ? (\n <span className=\"text-sm font-normal text-text-secondary\">({data.getFiles.total})</span>\n ) : null}\n </CardTitle>\n <div>\n <input\n ref={fileInputRef}\n type=\"file\"\n className=\"hidden\"\n onChange={(event) => void handleFileSelected(event)}\n aria-label={`Upload a file for ${entityType} ${entityId}`}\n />\n <Button\n size=\"sm\"\n variant=\"outline\"\n disabled={uploading}\n onClick={() => fileInputRef.current?.click()}\n >\n {uploading ? (\n <Loader2 className=\"mr-2 h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Upload className=\"mr-2 h-3.5 w-3.5\" />\n )}\n {uploading ? 'Uploading…' : 'Upload'}\n </Button>\n </div>\n </CardHeader>\n <CardContent>\n {loading && files.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"h-12 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : files.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No files yet\"\n description=\"Upload photos, receipts, warranties or documents to keep them with this record.\"\n />\n ) : (\n <ul className=\"divide-y divide-border-subtle\">\n {files.map((file) => (\n <li key={file.id} className=\"flex items-center gap-3 py-2.5\">\n <FileText className=\"h-5 w-5 shrink-0 text-text-secondary\" />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{file.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {formatSize(Number(file.size))} ·{' '}\n {new Date(file.createdAt).toLocaleDateString()}\n </p>\n </div>\n {file.downloadUrl ? (\n <a\n href={file.downloadUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className=\"text-text-secondary hover:text-text-primary\"\n aria-label={`Download ${file.name}`}\n >\n <Download className=\"h-4 w-4\" />\n </a>\n ) : null}\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={sharingId === file.id}\n onClick={() => void handleShare(file.id)}\n aria-label={`Share ${file.name}`}\n >\n {sharingId === file.id ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin\" />\n ) : (\n <Link2 className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { useAssetHandler as e } from "../providers/AssetHandlerProvider.js";
|
|
2
|
+
import { notify as t } from "../utils/toast.js";
|
|
3
|
+
import { useMemo as n, useState as r } from "react";
|
|
4
|
+
import { MessageSquare as i, Send as a } from "lucide-react";
|
|
5
|
+
import { gql as o } from "@apollo/client";
|
|
6
|
+
import { useMutation as s, useQuery as c } from "@apollo/client/react";
|
|
7
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
8
|
+
import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, IllustratedEmptyState as g, Separator as _, Textarea as v } from "@burdenoff/fe-libs/ui";
|
|
9
|
+
//#region src/assethandler/components/CommentsPanel.tsx
|
|
10
|
+
var y = o`
|
|
11
|
+
query AssetHandlerEntityComments($input: GetCommentsInput!) {
|
|
12
|
+
getEntityComments(input: $input) {
|
|
13
|
+
total
|
|
14
|
+
hasMore
|
|
15
|
+
items {
|
|
16
|
+
id
|
|
17
|
+
authorId
|
|
18
|
+
createdAt
|
|
19
|
+
edited
|
|
20
|
+
content {
|
|
21
|
+
text
|
|
22
|
+
markdown
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
`, b = o`
|
|
28
|
+
mutation AssetHandlerCreateEntityComment($input: CreateEntityCommentInput!) {
|
|
29
|
+
createEntityComment(input: $input) {
|
|
30
|
+
id
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
function x(e, t) {
|
|
35
|
+
return t && e === t ? "You" : `User ${e.slice(0, 8)}`;
|
|
36
|
+
}
|
|
37
|
+
function S({ entityType: o, entityId: S }) {
|
|
38
|
+
let { currentUser: C } = e(), [w, T] = r(""), { data: E, loading: D, refetch: O } = c(y, {
|
|
39
|
+
variables: { input: {
|
|
40
|
+
entityType: o,
|
|
41
|
+
entityId: S,
|
|
42
|
+
take: 50,
|
|
43
|
+
sortBy: "createdAt",
|
|
44
|
+
sortOrder: "desc"
|
|
45
|
+
} },
|
|
46
|
+
fetchPolicy: "cache-and-network",
|
|
47
|
+
errorPolicy: "all",
|
|
48
|
+
skip: !S
|
|
49
|
+
}), [k, { loading: A }] = s(b, {
|
|
50
|
+
onCompleted: () => {
|
|
51
|
+
T(""), t.success("Comment added", "Your comment is now part of the thread."), O();
|
|
52
|
+
},
|
|
53
|
+
onError: (e) => t.error("Could not post comment", e.message)
|
|
54
|
+
}), j = n(() => E?.getEntityComments.items ?? [], [E]);
|
|
55
|
+
return /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, {
|
|
56
|
+
className: "flex items-center gap-2 text-base",
|
|
57
|
+
children: [
|
|
58
|
+
/* @__PURE__ */ l(i, { className: "h-4 w-4" }),
|
|
59
|
+
"Discussion",
|
|
60
|
+
E?.getEntityComments.total ? /* @__PURE__ */ u("span", {
|
|
61
|
+
className: "text-sm font-normal text-text-secondary",
|
|
62
|
+
children: [
|
|
63
|
+
"(",
|
|
64
|
+
E.getEntityComments.total,
|
|
65
|
+
")"
|
|
66
|
+
]
|
|
67
|
+
}) : null
|
|
68
|
+
]
|
|
69
|
+
}) }), /* @__PURE__ */ u(p, {
|
|
70
|
+
className: "space-y-4",
|
|
71
|
+
children: [
|
|
72
|
+
/* @__PURE__ */ u("form", {
|
|
73
|
+
className: "space-y-2",
|
|
74
|
+
onSubmit: (e) => {
|
|
75
|
+
e.preventDefault();
|
|
76
|
+
let n = w.trim();
|
|
77
|
+
if (!n) {
|
|
78
|
+
t.warning("Nothing to post", "Write a comment before submitting.");
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
k({ variables: { input: {
|
|
82
|
+
entityType: o,
|
|
83
|
+
entityId: S,
|
|
84
|
+
contentType: "TEXT",
|
|
85
|
+
content: { text: n }
|
|
86
|
+
} } });
|
|
87
|
+
},
|
|
88
|
+
children: [/* @__PURE__ */ l(v, {
|
|
89
|
+
placeholder: "Add a comment…",
|
|
90
|
+
value: w,
|
|
91
|
+
onChange: (e) => T(e.target.value),
|
|
92
|
+
rows: 3,
|
|
93
|
+
"aria-label": "New comment"
|
|
94
|
+
}), /* @__PURE__ */ l("div", {
|
|
95
|
+
className: "flex justify-end",
|
|
96
|
+
children: /* @__PURE__ */ u(d, {
|
|
97
|
+
type: "submit",
|
|
98
|
+
size: "sm",
|
|
99
|
+
disabled: A || !w.trim(),
|
|
100
|
+
children: [/* @__PURE__ */ l(a, { className: "mr-2 h-3.5 w-3.5" }), A ? "Posting…" : "Post comment"]
|
|
101
|
+
})
|
|
102
|
+
})]
|
|
103
|
+
}),
|
|
104
|
+
/* @__PURE__ */ l(_, {}),
|
|
105
|
+
D && j.length === 0 ? /* @__PURE__ */ l("div", {
|
|
106
|
+
className: "space-y-2",
|
|
107
|
+
children: Array.from({ length: 3 }).map((e, t) => /* @__PURE__ */ l("div", { className: "h-14 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer" }, t))
|
|
108
|
+
}) : j.length === 0 ? /* @__PURE__ */ l(g, {
|
|
109
|
+
illustration: "empty-notifications",
|
|
110
|
+
title: "No comments yet",
|
|
111
|
+
description: "Start the conversation — notes and decisions logged here stay with the record."
|
|
112
|
+
}) : /* @__PURE__ */ l("ul", {
|
|
113
|
+
className: "space-y-3",
|
|
114
|
+
children: j.map((e) => /* @__PURE__ */ u("li", {
|
|
115
|
+
className: "rounded-lg border border-border-subtle p-3",
|
|
116
|
+
children: [/* @__PURE__ */ u("div", {
|
|
117
|
+
className: "flex items-center justify-between gap-2",
|
|
118
|
+
children: [/* @__PURE__ */ l("span", {
|
|
119
|
+
className: "text-sm font-medium",
|
|
120
|
+
children: x(e.authorId, C?.id)
|
|
121
|
+
}), /* @__PURE__ */ u("span", {
|
|
122
|
+
className: "text-xs text-text-secondary",
|
|
123
|
+
children: [new Date(e.createdAt).toLocaleString(), e.edited ? " · edited" : ""]
|
|
124
|
+
})]
|
|
125
|
+
}), /* @__PURE__ */ l("p", {
|
|
126
|
+
className: "mt-1 whitespace-pre-wrap text-sm text-text-secondary",
|
|
127
|
+
children: e.content?.text ?? e.content?.markdown ?? ""
|
|
128
|
+
})]
|
|
129
|
+
}, e.id))
|
|
130
|
+
})
|
|
131
|
+
]
|
|
132
|
+
})] });
|
|
133
|
+
}
|
|
134
|
+
//#endregion
|
|
135
|
+
export { S as CommentsPanel };
|
|
136
|
+
|
|
137
|
+
//# sourceMappingURL=CommentsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommentsPanel.js","names":[],"sources":["../../../src/assethandler/components/CommentsPanel.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport { gql } from '@apollo/client';\nimport { useMutation, useQuery } from '@apollo/client/react';\nimport {\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Textarea,\n IllustratedEmptyState,\n Separator,\n} from '@burdenoff/fe-libs/ui';\nimport { MessageSquare, Send } from 'lucide-react';\nimport { useAssetHandler } from '../providers/AssetHandlerProvider';\nimport { notify } from '../utils/toast';\n\n/**\n * Discussion thread for any AssetHandler entity, backed by the federated\n * wspace-conversations-svc `EntityComment` graph (same wspace gateway/Apollo\n * client). Real create + list — no mocks.\n *\n * `entityType` is the conversations-svc discriminator, e.g. \"assethandler-asset\"\n * or \"assethandler-incident\"; `entityId` is the record id.\n */\nexport interface CommentsPanelProps {\n entityType: string;\n entityId: string;\n}\n\ninterface EntityCommentNode {\n id: string;\n authorId: string;\n createdAt: string;\n edited: boolean;\n content: { text?: string | null; markdown?: string | null } | null;\n}\n\ninterface EntityCommentsResult {\n getEntityComments: {\n items: EntityCommentNode[];\n total: number;\n hasMore: boolean;\n };\n}\n\nconst ENTITY_COMMENTS_QUERY = gql`\n query AssetHandlerEntityComments($input: GetCommentsInput!) {\n getEntityComments(input: $input) {\n total\n hasMore\n items {\n id\n authorId\n createdAt\n edited\n content {\n text\n markdown\n }\n }\n }\n }\n`;\n\nconst CREATE_ENTITY_COMMENT_MUTATION = gql`\n mutation AssetHandlerCreateEntityComment($input: CreateEntityCommentInput!) {\n createEntityComment(input: $input) {\n id\n }\n }\n`;\n\nfunction authorLabel(authorId: string, currentUserId?: string): string {\n if (currentUserId && authorId === currentUserId) return 'You';\n // Present a short, stable handle from the actor id.\n return `User ${authorId.slice(0, 8)}`;\n}\n\nexport function CommentsPanel({ entityType, entityId }: CommentsPanelProps) {\n const { currentUser } = useAssetHandler();\n const [draft, setDraft] = useState('');\n\n const { data, loading, refetch } = useQuery<EntityCommentsResult>(ENTITY_COMMENTS_QUERY, {\n variables: {\n input: {\n entityType,\n entityId,\n take: 50,\n sortBy: 'createdAt',\n sortOrder: 'desc',\n },\n },\n fetchPolicy: 'cache-and-network',\n errorPolicy: 'all',\n skip: !entityId,\n });\n\n const [createComment, { loading: posting }] = useMutation(CREATE_ENTITY_COMMENT_MUTATION, {\n onCompleted: () => {\n setDraft('');\n notify.success('Comment added', 'Your comment is now part of the thread.');\n void refetch();\n },\n onError: (error) => notify.error('Could not post comment', error.message),\n });\n\n const comments = useMemo(() => data?.getEntityComments.items ?? [], [data]);\n\n const submit = (event: React.FormEvent) => {\n event.preventDefault();\n const text = draft.trim();\n if (!text) {\n notify.warning('Nothing to post', 'Write a comment before submitting.');\n return;\n }\n void createComment({\n variables: {\n input: {\n entityType,\n entityId,\n contentType: 'TEXT',\n content: { text },\n },\n },\n });\n };\n\n return (\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <MessageSquare className=\"h-4 w-4\" />\n Discussion\n {data?.getEntityComments.total ? (\n <span className=\"text-sm font-normal text-text-secondary\">\n ({data.getEntityComments.total})\n </span>\n ) : null}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <form className=\"space-y-2\" onSubmit={submit}>\n <Textarea\n placeholder=\"Add a comment…\"\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n rows={3}\n aria-label=\"New comment\"\n />\n <div className=\"flex justify-end\">\n <Button type=\"submit\" size=\"sm\" disabled={posting || !draft.trim()}>\n <Send className=\"mr-2 h-3.5 w-3.5\" />\n {posting ? 'Posting…' : 'Post comment'}\n </Button>\n </div>\n </form>\n\n <Separator />\n\n {loading && comments.length === 0 ? (\n <div className=\"space-y-2\">\n {Array.from({ length: 3 }).map((_, i) => (\n <div\n key={i}\n className=\"h-14 rounded-md bg-bg-sunken motion-safe:animate-vc-shimmer\"\n />\n ))}\n </div>\n ) : comments.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-notifications\"\n title=\"No comments yet\"\n description=\"Start the conversation — notes and decisions logged here stay with the record.\"\n />\n ) : (\n <ul className=\"space-y-3\">\n {comments.map((comment) => (\n <li key={comment.id} className=\"rounded-lg border border-border-subtle p-3\">\n <div className=\"flex items-center justify-between gap-2\">\n <span className=\"text-sm font-medium\">\n {authorLabel(comment.authorId, currentUser?.id)}\n </span>\n <span className=\"text-xs text-text-secondary\">\n {new Date(comment.createdAt).toLocaleString()}\n {comment.edited ? ' · edited' : ''}\n </span>\n </div>\n <p className=\"mt-1 whitespace-pre-wrap text-sm text-text-secondary\">\n {comment.content?.text ?? comment.content?.markdown ?? ''}\n </p>\n </li>\n ))}\n </ul>\n )}\n </CardContent>\n </Card>\n );\n}\n"],"mappings":"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"}
|