@burdenoff/microfe-assethandler 2026.626.1 → 2026.703.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/AssetHandlerRoot.js +0 -24
- package/dist/assethandler/AssetHandlerRoot.js.map +1 -1
- package/dist/assethandler/AssetHandlerRoutes.js +92 -160
- package/dist/assethandler/AssetHandlerRoutes.js.map +1 -1
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +367 -402
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +29 -26
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +278 -164
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +200 -242
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +192 -286
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +204 -296
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +38 -42
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +212 -236
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +41 -85
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +1 -2
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +37 -86
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +82 -98
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +6 -22
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +4 -34
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +105 -150
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +116 -152
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/providers/AssetHandlerProvider.js.map +1 -1
- package/dist/assethandler/store/assethandlerStore.js +68 -2206
- package/dist/assethandler/store/assethandlerStore.js.map +1 -1
- package/dist/assethandler/utils/toast.js +33 -0
- package/dist/assethandler/utils/toast.js.map +1 -0
- package/package.json +5 -4
- package/dist/assethandler/pages/AssetsAssetEditPage.js +0 -353
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +0 -1
- package/dist/assethandler/pages/AuditTrailPage.js +0 -215
- package/dist/assethandler/pages/AuditTrailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +0 -177
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +0 -162
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +0 -143
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +0 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +0 -163
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +0 -208
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +0 -236
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +0 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +0 -144
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +0 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +0 -149
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +0 -1
- package/dist/assethandler/pages/UsersPage.js +0 -208
- package/dist/assethandler/pages/UsersPage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +0 -220
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +0 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +0 -373
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +0 -264
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +0 -206
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +0 -171
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +0 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +0 -173
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsReportsDashboardPage.js","names":[],"sources":["../../../src/assethandler/pages/ReportsReportsDashboardPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport {\n FileText,\n Clock,\n Download,\n Plus,\n CheckCircle,\n XCircle,\n Loader2,\n} from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function ReportsReportsDashboardPage() {\n const navigate = useNavigate();\n const { reports, reportExecutions } = useAssetHandlerStore();\n\n const completed = reportExecutions.filter((e) => e.status === 'completed');\n const running = reportExecutions.filter((e) => e.status === 'running');\n const failed = reportExecutions.filter((e) => e.status === 'failed');\n const scheduled = reports.filter((r) => r.schedule);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Reports Dashboard</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Overview of all reports and executions</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n New Report\n </Button>\n </div>\n\n <PagePurpose>\n Your reporting home base — see every report you can run, what is scheduled, and the status\n of recent runs. Use it to launch a report, grab a finished export, or jump into the builder\n to create a new one, all from one place.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-reports-dashboard\"\n steps={[\n {\n id: 'build',\n label: 'Build a new report',\n description: 'Pick data, columns and filters in the report builder.',\n onClick: () => navigate('/reports/report-builder'),\n },\n {\n id: 'browse',\n label: 'Browse saved reports',\n description: 'Run or schedule a report you have already defined.',\n onClick: () => navigate('/reports/reports-list'),\n },\n {\n id: 'analytics',\n label: 'Explore analytics',\n description: 'See ready-made insights across the asset estate.',\n onClick: () => navigate('/analytics'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <FileText className=\"h-4 w-4\" />\n Total Reports\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">{reports.length}</p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Scheduled\n </div>\n <p className=\"text-2xl font-bold mt-1\">{scheduled.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <CheckCircle className=\"h-4 w-4\" />\n Completed\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-success-text\">{completed.length}</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Loader2 className=\"h-4 w-4\" />\n Running\n </div>\n <p className=\"text-2xl font-bold mt-1 text-status-info-text\">{running.length}</p>\n </CardContent>\n </Card>\n </div>\n\n {/* Recent Executions */}\n <Card>\n <CardHeader>\n <CardTitle>Recent Executions</CardTitle>\n </CardHeader>\n <CardContent className=\"p-0\">\n {reportExecutions.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"No report runs yet\"\n description=\"Run a report and its execution history will appear here, ready to download.\"\n />\n ) : (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Report</th>\n <th className=\"text-left p-3 font-medium\">Executed By</th>\n <th className=\"text-left p-3 font-medium\">Status</th>\n <th className=\"text-left p-3 font-medium\">Format</th>\n <th className=\"text-left p-3 font-medium\">Duration</th>\n <th className=\"text-left p-3 font-medium\">Time</th>\n <th className=\"p-3\"></th>\n </tr>\n </thead>\n <tbody>\n {reportExecutions.map((exec) => (\n <tr key={exec.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3 font-medium\">{exec.reportName}</td>\n <td className=\"p-3 text-xs\">{exec.executedBy}</td>\n <td className=\"p-3\">\n {exec.status === 'completed' && (\n <Badge variant=\"default\">\n <CheckCircle className=\"mr-1 h-3 w-3\" />\n Completed\n </Badge>\n )}\n {exec.status === 'running' && (\n <Badge variant=\"secondary\">\n <Loader2 className=\"mr-1 h-3 w-3 animate-spin\" />\n Running\n </Badge>\n )}\n {exec.status === 'failed' && (\n <Badge variant=\"destructive\">\n <XCircle className=\"mr-1 h-3 w-3\" />\n Failed\n </Badge>\n )}\n {exec.status === 'queued' && <Badge variant=\"outline\">Queued</Badge>}\n </td>\n <td className=\"p-3 text-xs\">{exec.format}</td>\n <td className=\"p-3 text-xs\">{exec.duration}s</td>\n <td className=\"p-3 text-xs\">{new Date(exec.executedAt).toLocaleString()}</td>\n <td className=\"p-3\">\n {exec.status === 'completed' && (\n <Button variant=\"ghost\" size=\"sm\">\n <Download className=\"h-3 w-3\" />\n </Button>\n )}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n </CardContent>\n </Card>\n\n {/* Report Configs */}\n <Card>\n <CardHeader>\n <CardTitle>Available Reports</CardTitle>\n </CardHeader>\n <CardContent>\n {reports.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No reports defined\"\n description=\"Create your first report in the builder to make it available here.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/reports/report-builder')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n New Report\n </Button>\n }\n />\n ) : (\n <div className=\"grid gap-3 md:grid-cols-2 lg:grid-cols-3\">\n {reports.map((report) => (\n <div\n key={report.id}\n className=\"rounded-lg border p-4 hover:shadow-sm transition-shadow cursor-pointer\"\n >\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-xs\">\n {report.type}\n </Badge>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {report.category}\n </Badge>\n </div>\n <h4 className=\"font-medium mt-2\">{report.name}</h4>\n <p className=\"text-xs text-text-secondary mt-1\">{report.description}</p>\n <div className=\"flex items-center gap-2 mt-2 text-xs text-text-secondary\">\n {report.schedule && <span>Schedule: {report.schedule}</span>}\n {report.lastRun && (\n <span>· Last: {new Date(report.lastRun).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import { Play as t, Plus as n, Search as r } from "lucide-react";
|
|
3
|
-
import { useNavigate as i } from "react-router-dom";
|
|
4
|
-
import { Badge as a, Button as o, CardContent as s, GlassCard as c, GradientText as l, IllustratedEmptyState as u, Input as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
|
|
5
|
-
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
|
-
//#region src/assethandler/pages/ReportsReportsListPage.tsx
|
|
7
|
-
function h() {
|
|
8
|
-
let h = i(), { reports: g } = e();
|
|
9
|
-
return /* @__PURE__ */ m("div", {
|
|
10
|
-
className: "space-y-6 p-6",
|
|
11
|
-
children: [
|
|
12
|
-
/* @__PURE__ */ m("div", {
|
|
13
|
-
className: "flex items-center justify-between",
|
|
14
|
-
children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("h1", {
|
|
15
|
-
className: "text-2xl font-bold",
|
|
16
|
-
children: /* @__PURE__ */ p(l, { children: "Reports List" })
|
|
17
|
-
}), /* @__PURE__ */ m("p", {
|
|
18
|
-
className: "text-sm text-text-secondary",
|
|
19
|
-
children: [g.length, " configured reports"]
|
|
20
|
-
})] }), /* @__PURE__ */ m(o, {
|
|
21
|
-
size: "sm",
|
|
22
|
-
children: [/* @__PURE__ */ p(n, { className: "mr-2 h-4 w-4" }), "Create Report"]
|
|
23
|
-
})]
|
|
24
|
-
}),
|
|
25
|
-
/* @__PURE__ */ p(f, { children: "Every report your team has saved, in one searchable list. Run a report on demand, see when it last ran and how it is scheduled, and jump in to refine it — so the insight you need is always a click away." }),
|
|
26
|
-
/* @__PURE__ */ m("div", {
|
|
27
|
-
className: "relative max-w-md",
|
|
28
|
-
children: [/* @__PURE__ */ p(r, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ p(d, {
|
|
29
|
-
placeholder: "Search reports...",
|
|
30
|
-
className: "pl-9"
|
|
31
|
-
})]
|
|
32
|
-
}),
|
|
33
|
-
g.length === 0 ? /* @__PURE__ */ p(u, {
|
|
34
|
-
illustration: "empty-files",
|
|
35
|
-
title: "No reports yet",
|
|
36
|
-
description: "Create your first report to run and schedule it from here.",
|
|
37
|
-
action: /* @__PURE__ */ m(o, {
|
|
38
|
-
size: "sm",
|
|
39
|
-
onClick: () => h("/reports/report-builder"),
|
|
40
|
-
children: [/* @__PURE__ */ p(n, { className: "mr-2 h-4 w-4" }), "Create Report"]
|
|
41
|
-
})
|
|
42
|
-
}) : /* @__PURE__ */ p(c, {
|
|
43
|
-
treatment: "glass",
|
|
44
|
-
glow: !0,
|
|
45
|
-
className: "overflow-hidden border-border-seam",
|
|
46
|
-
children: /* @__PURE__ */ p(s, {
|
|
47
|
-
className: "p-0",
|
|
48
|
-
children: /* @__PURE__ */ p("div", {
|
|
49
|
-
className: "overflow-x-auto",
|
|
50
|
-
children: /* @__PURE__ */ m("table", {
|
|
51
|
-
className: "w-full text-sm",
|
|
52
|
-
children: [/* @__PURE__ */ p("thead", { children: /* @__PURE__ */ m("tr", {
|
|
53
|
-
className: "border-b bg-bg-sunken/50",
|
|
54
|
-
children: [
|
|
55
|
-
/* @__PURE__ */ p("th", {
|
|
56
|
-
className: "text-left p-3 font-medium",
|
|
57
|
-
children: "Name"
|
|
58
|
-
}),
|
|
59
|
-
/* @__PURE__ */ p("th", {
|
|
60
|
-
className: "text-left p-3 font-medium",
|
|
61
|
-
children: "Category"
|
|
62
|
-
}),
|
|
63
|
-
/* @__PURE__ */ p("th", {
|
|
64
|
-
className: "text-left p-3 font-medium",
|
|
65
|
-
children: "Type"
|
|
66
|
-
}),
|
|
67
|
-
/* @__PURE__ */ p("th", {
|
|
68
|
-
className: "text-left p-3 font-medium",
|
|
69
|
-
children: "Schedule"
|
|
70
|
-
}),
|
|
71
|
-
/* @__PURE__ */ p("th", {
|
|
72
|
-
className: "text-left p-3 font-medium",
|
|
73
|
-
children: "Last Run"
|
|
74
|
-
}),
|
|
75
|
-
/* @__PURE__ */ p("th", {
|
|
76
|
-
className: "text-left p-3 font-medium",
|
|
77
|
-
children: "Tags"
|
|
78
|
-
}),
|
|
79
|
-
/* @__PURE__ */ p("th", { className: "p-3" })
|
|
80
|
-
]
|
|
81
|
-
}) }), /* @__PURE__ */ p("tbody", { children: g.map((e) => /* @__PURE__ */ m("tr", {
|
|
82
|
-
className: "border-b hover:bg-bg-sunken/50 cursor-pointer",
|
|
83
|
-
children: [
|
|
84
|
-
/* @__PURE__ */ m("td", {
|
|
85
|
-
className: "p-3",
|
|
86
|
-
children: [/* @__PURE__ */ p("p", {
|
|
87
|
-
className: "font-medium",
|
|
88
|
-
children: e.name
|
|
89
|
-
}), /* @__PURE__ */ p("p", {
|
|
90
|
-
className: "text-xs text-text-secondary",
|
|
91
|
-
children: e.description
|
|
92
|
-
})]
|
|
93
|
-
}),
|
|
94
|
-
/* @__PURE__ */ p("td", {
|
|
95
|
-
className: "p-3",
|
|
96
|
-
children: /* @__PURE__ */ p(a, {
|
|
97
|
-
variant: "outline",
|
|
98
|
-
children: e.category
|
|
99
|
-
})
|
|
100
|
-
}),
|
|
101
|
-
/* @__PURE__ */ p("td", {
|
|
102
|
-
className: "p-3 capitalize text-xs",
|
|
103
|
-
children: e.type
|
|
104
|
-
}),
|
|
105
|
-
/* @__PURE__ */ p("td", {
|
|
106
|
-
className: "p-3 text-xs",
|
|
107
|
-
children: e.schedule || "Manual"
|
|
108
|
-
}),
|
|
109
|
-
/* @__PURE__ */ p("td", {
|
|
110
|
-
className: "p-3 text-xs",
|
|
111
|
-
children: e.lastRun ? new Date(e.lastRun).toLocaleDateString() : "Never"
|
|
112
|
-
}),
|
|
113
|
-
/* @__PURE__ */ p("td", {
|
|
114
|
-
className: "p-3",
|
|
115
|
-
children: /* @__PURE__ */ p("div", {
|
|
116
|
-
className: "flex flex-wrap gap-1",
|
|
117
|
-
children: e.tags.map((e) => /* @__PURE__ */ p(a, {
|
|
118
|
-
variant: "secondary",
|
|
119
|
-
className: "text-[10px]",
|
|
120
|
-
children: e
|
|
121
|
-
}, e))
|
|
122
|
-
})
|
|
123
|
-
}),
|
|
124
|
-
/* @__PURE__ */ p("td", {
|
|
125
|
-
className: "p-3",
|
|
126
|
-
children: /* @__PURE__ */ p(o, {
|
|
127
|
-
variant: "ghost",
|
|
128
|
-
size: "sm",
|
|
129
|
-
children: /* @__PURE__ */ p(t, { className: "h-3 w-3" })
|
|
130
|
-
})
|
|
131
|
-
})
|
|
132
|
-
]
|
|
133
|
-
}, e.id)) })]
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
})
|
|
137
|
-
})
|
|
138
|
-
]
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
//#endregion
|
|
142
|
-
export { h as ReportsReportsListPage };
|
|
143
|
-
|
|
144
|
-
//# sourceMappingURL=ReportsReportsListPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ReportsReportsListPage.js","names":[],"sources":["../../../src/assethandler/pages/ReportsReportsListPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n CardContent,\n Input,\n GradientText,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Plus, Search, Play } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function ReportsReportsListPage() {\n const navigate = useNavigate();\n const { reports } = useAssetHandlerStore();\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Reports List</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{reports.length} configured reports</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Report\n </Button>\n </div>\n\n <PagePurpose>\n Every report your team has saved, in one searchable list. Run a report on demand, see when\n it last ran and how it is scheduled, and jump in to refine it — so the insight you need is\n always a click away.\n </PagePurpose>\n\n <div className=\"relative max-w-md\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input placeholder=\"Search reports...\" className=\"pl-9\" />\n </div>\n\n {reports.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-files\"\n title=\"No reports yet\"\n description=\"Create your first report to run and schedule it from here.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/reports/report-builder')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Report\n </Button>\n }\n />\n ) : (\n <GlassCard treatment=\"glass\" glow className=\"overflow-hidden border-border-seam\">\n <CardContent className=\"p-0\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-bg-sunken/50\">\n <th className=\"text-left p-3 font-medium\">Name</th>\n <th className=\"text-left p-3 font-medium\">Category</th>\n <th className=\"text-left p-3 font-medium\">Type</th>\n <th className=\"text-left p-3 font-medium\">Schedule</th>\n <th className=\"text-left p-3 font-medium\">Last Run</th>\n <th className=\"text-left p-3 font-medium\">Tags</th>\n <th className=\"p-3\"></th>\n </tr>\n </thead>\n <tbody>\n {reports.map((report) => (\n <tr key={report.id} className=\"border-b hover:bg-bg-sunken/50 cursor-pointer\">\n <td className=\"p-3\">\n <p className=\"font-medium\">{report.name}</p>\n <p className=\"text-xs text-text-secondary\">{report.description}</p>\n </td>\n <td className=\"p-3\">\n <Badge variant=\"outline\">{report.category}</Badge>\n </td>\n <td className=\"p-3 capitalize text-xs\">{report.type}</td>\n <td className=\"p-3 text-xs\">{report.schedule || 'Manual'}</td>\n <td className=\"p-3 text-xs\">\n {report.lastRun ? new Date(report.lastRun).toLocaleDateString() : 'Never'}\n </td>\n <td className=\"p-3\">\n <div className=\"flex flex-wrap gap-1\">\n {report.tags.map((t) => (\n <Badge key={t} variant=\"secondary\" className=\"text-[10px]\">\n {t}\n </Badge>\n ))}\n </div>\n </td>\n <td className=\"p-3\">\n <Button variant=\"ghost\" size=\"sm\">\n <Play className=\"h-3 w-3\" />\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </CardContent>\n </GlassCard>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import { Clock as t, Database as n, HardDrive as r, Plus as i, RefreshCw as a } from "lucide-react";
|
|
3
|
-
import { Badge as o, Button as s, Card as c, CardContent as l, EmphasisPanel as u, GradientText as d, IllustratedEmptyState as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
|
|
4
|
-
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
5
|
-
//#region src/assethandler/pages/SecurityScheduleBackupPage.tsx
|
|
6
|
-
function g() {
|
|
7
|
-
let { backupSchedules: g } = e();
|
|
8
|
-
return /* @__PURE__ */ h("div", {
|
|
9
|
-
className: "space-y-6 p-6",
|
|
10
|
-
children: [
|
|
11
|
-
/* @__PURE__ */ h("div", {
|
|
12
|
-
className: "flex items-center justify-between",
|
|
13
|
-
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
|
|
14
|
-
className: "text-2xl font-bold",
|
|
15
|
-
children: /* @__PURE__ */ m(d, { children: "Backup Schedules" })
|
|
16
|
-
}), /* @__PURE__ */ m("p", {
|
|
17
|
-
className: "text-sm text-text-secondary",
|
|
18
|
-
children: "Manage data backup and recovery schedules"
|
|
19
|
-
})] }), /* @__PURE__ */ h(s, {
|
|
20
|
-
size: "sm",
|
|
21
|
-
children: [/* @__PURE__ */ m(i, { className: "mr-2 h-4 w-4" }), "New Schedule"]
|
|
22
|
-
})]
|
|
23
|
-
}),
|
|
24
|
-
/* @__PURE__ */ m(p, { children: "Protect your asset data against loss. Define recurring backups — what, where, how often and how long to keep them — and run them on demand. Use this page to confirm backups are succeeding and that recovery points exist before you ever need them." }),
|
|
25
|
-
/* @__PURE__ */ h("div", {
|
|
26
|
-
className: "grid gap-4 md:grid-cols-3",
|
|
27
|
-
children: [
|
|
28
|
-
/* @__PURE__ */ h(u, { children: [/* @__PURE__ */ h("div", {
|
|
29
|
-
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
30
|
-
children: [/* @__PURE__ */ m(n, { className: "h-4 w-4" }), "Active Schedules"]
|
|
31
|
-
}), /* @__PURE__ */ m("p", {
|
|
32
|
-
className: "text-2xl font-bold mt-1 tabular-nums",
|
|
33
|
-
children: g.filter((e) => e.status === "active").length
|
|
34
|
-
})] }),
|
|
35
|
-
/* @__PURE__ */ m(c, { children: /* @__PURE__ */ h(l, {
|
|
36
|
-
className: "pt-4",
|
|
37
|
-
children: [/* @__PURE__ */ h("div", {
|
|
38
|
-
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
39
|
-
children: [/* @__PURE__ */ m(r, { className: "h-4 w-4" }), "Total Size"]
|
|
40
|
-
}), /* @__PURE__ */ m("p", {
|
|
41
|
-
className: "text-2xl font-bold mt-1",
|
|
42
|
-
children: g[g.length - 1]?.size || "N/A"
|
|
43
|
-
})]
|
|
44
|
-
}) }),
|
|
45
|
-
/* @__PURE__ */ m(c, { children: /* @__PURE__ */ h(l, {
|
|
46
|
-
className: "pt-4",
|
|
47
|
-
children: [/* @__PURE__ */ h("div", {
|
|
48
|
-
className: "flex items-center gap-2 text-sm text-text-secondary",
|
|
49
|
-
children: [/* @__PURE__ */ m(t, { className: "h-4 w-4" }), "Schedules"]
|
|
50
|
-
}), /* @__PURE__ */ m("p", {
|
|
51
|
-
className: "text-2xl font-bold mt-1",
|
|
52
|
-
children: g.length
|
|
53
|
-
})]
|
|
54
|
-
}) })
|
|
55
|
-
]
|
|
56
|
-
}),
|
|
57
|
-
g.length === 0 ? /* @__PURE__ */ m(f, {
|
|
58
|
-
illustration: "empty-generic",
|
|
59
|
-
title: "No backup schedules",
|
|
60
|
-
description: "Create a backup schedule to protect critical asset data on a recurring basis.",
|
|
61
|
-
action: /* @__PURE__ */ h(s, {
|
|
62
|
-
size: "sm",
|
|
63
|
-
children: [/* @__PURE__ */ m(i, { className: "mr-2 h-4 w-4" }), "New Schedule"]
|
|
64
|
-
})
|
|
65
|
-
}) : /* @__PURE__ */ m("div", {
|
|
66
|
-
className: "grid gap-4 md:grid-cols-1",
|
|
67
|
-
children: g.map((e) => /* @__PURE__ */ m(c, { children: /* @__PURE__ */ h(l, {
|
|
68
|
-
className: "pt-4",
|
|
69
|
-
children: [
|
|
70
|
-
/* @__PURE__ */ h("div", {
|
|
71
|
-
className: "flex items-center justify-between",
|
|
72
|
-
children: [/* @__PURE__ */ h("div", {
|
|
73
|
-
className: "flex items-center gap-4",
|
|
74
|
-
children: [/* @__PURE__ */ m("div", {
|
|
75
|
-
className: `p-2 rounded-lg ${e.status === "active" ? "bg-status-success-bg-subtle text-status-success-text" : e.status === "failed" ? "bg-status-error-bg-subtle text-status-error-text" : "bg-bg-sunken text-text-secondary"}`,
|
|
76
|
-
children: /* @__PURE__ */ m(n, { className: "h-5 w-5" })
|
|
77
|
-
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h3", {
|
|
78
|
-
className: "font-medium",
|
|
79
|
-
children: e.name
|
|
80
|
-
}), /* @__PURE__ */ m("p", {
|
|
81
|
-
className: "text-sm text-text-secondary",
|
|
82
|
-
children: e.destination
|
|
83
|
-
})] })]
|
|
84
|
-
}), /* @__PURE__ */ h("div", {
|
|
85
|
-
className: "flex items-center gap-3",
|
|
86
|
-
children: [/* @__PURE__ */ m(o, {
|
|
87
|
-
variant: e.status === "active" ? "default" : e.status === "failed" ? "destructive" : "secondary",
|
|
88
|
-
children: e.status
|
|
89
|
-
}), /* @__PURE__ */ h(s, {
|
|
90
|
-
variant: "outline",
|
|
91
|
-
size: "sm",
|
|
92
|
-
children: [/* @__PURE__ */ m(a, { className: "mr-2 h-3 w-3" }), "Run Now"]
|
|
93
|
-
})]
|
|
94
|
-
})]
|
|
95
|
-
}),
|
|
96
|
-
/* @__PURE__ */ h("div", {
|
|
97
|
-
className: "grid grid-cols-5 gap-4 mt-4 text-sm",
|
|
98
|
-
children: [
|
|
99
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("span", {
|
|
100
|
-
className: "text-text-secondary",
|
|
101
|
-
children: "Frequency"
|
|
102
|
-
}), /* @__PURE__ */ m("p", {
|
|
103
|
-
className: "font-medium capitalize",
|
|
104
|
-
children: e.frequency
|
|
105
|
-
})] }),
|
|
106
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("span", {
|
|
107
|
-
className: "text-text-secondary",
|
|
108
|
-
children: "Time"
|
|
109
|
-
}), /* @__PURE__ */ m("p", {
|
|
110
|
-
className: "font-medium",
|
|
111
|
-
children: e.time
|
|
112
|
-
})] }),
|
|
113
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("span", {
|
|
114
|
-
className: "text-text-secondary",
|
|
115
|
-
children: "Retention"
|
|
116
|
-
}), /* @__PURE__ */ h("p", {
|
|
117
|
-
className: "font-medium",
|
|
118
|
-
children: [e.retention, " days"]
|
|
119
|
-
})] }),
|
|
120
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("span", {
|
|
121
|
-
className: "text-text-secondary",
|
|
122
|
-
children: "Last Run"
|
|
123
|
-
}), /* @__PURE__ */ m("p", {
|
|
124
|
-
className: "font-medium text-xs",
|
|
125
|
-
children: e.lastRun ? new Date(e.lastRun).toLocaleString() : "Never"
|
|
126
|
-
})] }),
|
|
127
|
-
/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("span", {
|
|
128
|
-
className: "text-text-secondary",
|
|
129
|
-
children: "Next Run"
|
|
130
|
-
}), /* @__PURE__ */ m("p", {
|
|
131
|
-
className: "font-medium text-xs",
|
|
132
|
-
children: new Date(e.nextRun).toLocaleString()
|
|
133
|
-
})] })
|
|
134
|
-
]
|
|
135
|
-
}),
|
|
136
|
-
e.size && /* @__PURE__ */ h("p", {
|
|
137
|
-
className: "text-xs text-text-secondary mt-2",
|
|
138
|
-
children: ["Size: ", e.size]
|
|
139
|
-
})
|
|
140
|
-
]
|
|
141
|
-
}) }, e.id))
|
|
142
|
-
})
|
|
143
|
-
]
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
//#endregion
|
|
147
|
-
export { g as SecurityScheduleBackupPage };
|
|
148
|
-
|
|
149
|
-
//# sourceMappingURL=SecurityScheduleBackupPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SecurityScheduleBackupPage.js","names":[],"sources":["../../../src/assethandler/pages/SecurityScheduleBackupPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n GradientText,\n EmphasisPanel,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Database, Plus, Clock, HardDrive, RefreshCw } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nexport function SecurityScheduleBackupPage() {\n const { backupSchedules } = useAssetHandlerStore();\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold\">\n <GradientText>Backup Schedules</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Manage data backup and recovery schedules</p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n New Schedule\n </Button>\n </div>\n\n <PagePurpose>\n Protect your asset data against loss. Define recurring backups — what, where, how often and\n how long to keep them — and run them on demand. Use this page to confirm backups are\n succeeding and that recovery points exist before you ever need them.\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <EmphasisPanel>\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Database className=\"h-4 w-4\" />\n Active Schedules\n </div>\n <p className=\"text-2xl font-bold mt-1 tabular-nums\">\n {backupSchedules.filter((b) => b.status === 'active').length}\n </p>\n </EmphasisPanel>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <HardDrive className=\"h-4 w-4\" />\n Total Size\n </div>\n <p className=\"text-2xl font-bold mt-1\">\n {backupSchedules[backupSchedules.length - 1]?.size || 'N/A'}\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-2 text-sm text-text-secondary\">\n <Clock className=\"h-4 w-4\" />\n Schedules\n </div>\n <p className=\"text-2xl font-bold mt-1\">{backupSchedules.length}</p>\n </CardContent>\n </Card>\n </div>\n\n {backupSchedules.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No backup schedules\"\n description=\"Create a backup schedule to protect critical asset data on a recurring basis.\"\n action={\n <Button size=\"sm\">\n <Plus className=\"mr-2 h-4 w-4\" />\n New Schedule\n </Button>\n }\n />\n ) : (\n <div className=\"grid gap-4 md:grid-cols-1\">\n {backupSchedules.map((backup) => (\n <Card key={backup.id}>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-4\">\n <div\n className={`p-2 rounded-lg ${backup.status === 'active' ? 'bg-status-success-bg-subtle text-status-success-text' : backup.status === 'failed' ? 'bg-status-error-bg-subtle text-status-error-text' : 'bg-bg-sunken text-text-secondary'}`}\n >\n <Database className=\"h-5 w-5\" />\n </div>\n <div>\n <h3 className=\"font-medium\">{backup.name}</h3>\n <p className=\"text-sm text-text-secondary\">{backup.destination}</p>\n </div>\n </div>\n <div className=\"flex items-center gap-3\">\n <Badge\n variant={\n backup.status === 'active'\n ? 'default'\n : backup.status === 'failed'\n ? 'destructive'\n : 'secondary'\n }\n >\n {backup.status}\n </Badge>\n <Button variant=\"outline\" size=\"sm\">\n <RefreshCw className=\"mr-2 h-3 w-3\" />\n Run Now\n </Button>\n </div>\n </div>\n <div className=\"grid grid-cols-5 gap-4 mt-4 text-sm\">\n <div>\n <span className=\"text-text-secondary\">Frequency</span>\n <p className=\"font-medium capitalize\">{backup.frequency}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Time</span>\n <p className=\"font-medium\">{backup.time}</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Retention</span>\n <p className=\"font-medium\">{backup.retention} days</p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Last Run</span>\n <p className=\"font-medium text-xs\">\n {backup.lastRun ? new Date(backup.lastRun).toLocaleString() : 'Never'}\n </p>\n </div>\n <div>\n <span className=\"text-text-secondary\">Next Run</span>\n <p className=\"font-medium text-xs\">{new Date(backup.nextRun).toLocaleString()}</p>\n </div>\n </div>\n {backup.size && (\n <p className=\"text-xs text-text-secondary mt-2\">Size: {backup.size}</p>\n )}\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,208 +0,0 @@
|
|
|
1
|
-
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
|
-
import { tWithFallback as t } from "../utils/i18n.js";
|
|
3
|
-
import { useState as n } from "react";
|
|
4
|
-
import { Building as r, Filter as i, Plus as a, Search as o, Shield as s, UserCheck as c, Users as l } from "lucide-react";
|
|
5
|
-
import { useNavigate as u } from "react-router-dom";
|
|
6
|
-
import { Badge as d, Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, GlassCard as _, GradientText as v, IllustratedEmptyState as y, Input as b, PagePurpose as x, Select as S, SelectContent as C, SelectItem as w, SelectTrigger as T, SelectValue as E, Table as D, TableBody as O, TableCell as k, TableHead as A, TableHeader as j, TableRow as M } from "@burdenoff/fe-libs/ui";
|
|
7
|
-
import { useI18n as N } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
8
|
-
import { jsx as P, jsxs as F } from "react/jsx-runtime";
|
|
9
|
-
//#region src/assethandler/pages/UsersPage.tsx
|
|
10
|
-
var I = {
|
|
11
|
-
admin: "destructive",
|
|
12
|
-
manager: "default",
|
|
13
|
-
technician: "secondary",
|
|
14
|
-
viewer: "outline",
|
|
15
|
-
auditor: "secondary"
|
|
16
|
-
}, L = {
|
|
17
|
-
active: "default",
|
|
18
|
-
inactive: "secondary",
|
|
19
|
-
suspended: "destructive",
|
|
20
|
-
pending: "outline"
|
|
21
|
-
};
|
|
22
|
-
function R() {
|
|
23
|
-
let { t: R } = N(), z = u(), { users: B } = e(), [V, H] = n(""), [U, W] = n("all"), G = B.filter((e) => {
|
|
24
|
-
if (U !== "all" && e.role !== U) return !1;
|
|
25
|
-
if (V) {
|
|
26
|
-
let t = V.toLowerCase();
|
|
27
|
-
return e.firstName.toLowerCase().includes(t) || e.lastName.toLowerCase().includes(t) || e.email.toLowerCase().includes(t);
|
|
28
|
-
}
|
|
29
|
-
return !0;
|
|
30
|
-
}), K = B.filter((e) => e.status === "active").length, q = B.filter((e) => e.role === "admin").length, J = [...new Set(B.map((e) => e.department))].length;
|
|
31
|
-
return /* @__PURE__ */ F("div", {
|
|
32
|
-
className: "space-y-6 p-6",
|
|
33
|
-
children: [
|
|
34
|
-
/* @__PURE__ */ F("div", {
|
|
35
|
-
className: "flex items-center justify-between",
|
|
36
|
-
children: [/* @__PURE__ */ F("div", { children: [/* @__PURE__ */ P("h1", {
|
|
37
|
-
className: "text-2xl font-semibold",
|
|
38
|
-
children: /* @__PURE__ */ P(v, { children: t(R, "assethandler.users.title", "Users") })
|
|
39
|
-
}), /* @__PURE__ */ P("p", {
|
|
40
|
-
className: "text-sm text-text-secondary",
|
|
41
|
-
children: t(R, "assethandler.users.description", "Manage user accounts, roles, and access permissions.")
|
|
42
|
-
})] }), /* @__PURE__ */ F(f, {
|
|
43
|
-
size: "sm",
|
|
44
|
-
onClick: () => z("/users/user-create"),
|
|
45
|
-
children: [/* @__PURE__ */ P(a, { className: "mr-2 h-4 w-4" }), t(R, "assethandler.users.actions.addUser", "Add User")]
|
|
46
|
-
})]
|
|
47
|
-
}),
|
|
48
|
-
/* @__PURE__ */ P(x, { children: t(R, "assethandler.users.purpose", "The directory of everyone who uses Asset Handler — their role, department, status and how many assets they hold. Use it to onboard and offboard people, adjust access, and see at a glance who is responsible for what.") }),
|
|
49
|
-
/* @__PURE__ */ F("div", {
|
|
50
|
-
className: "grid gap-4 md:grid-cols-4",
|
|
51
|
-
children: [
|
|
52
|
-
/* @__PURE__ */ F(_, {
|
|
53
|
-
treatment: "glass",
|
|
54
|
-
glow: !0,
|
|
55
|
-
className: "border-border-seam",
|
|
56
|
-
children: [/* @__PURE__ */ F(h, {
|
|
57
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
58
|
-
children: [/* @__PURE__ */ P(g, {
|
|
59
|
-
className: "text-sm font-medium",
|
|
60
|
-
children: t(R, "assethandler.users.stats.totalUsers", "Total Users")
|
|
61
|
-
}), /* @__PURE__ */ P(l, { className: "h-4 w-4 text-text-secondary" })]
|
|
62
|
-
}), /* @__PURE__ */ P(m, { children: /* @__PURE__ */ P("div", {
|
|
63
|
-
className: "text-2xl font-bold tabular-nums",
|
|
64
|
-
children: B.length
|
|
65
|
-
}) })]
|
|
66
|
-
}),
|
|
67
|
-
/* @__PURE__ */ F(_, {
|
|
68
|
-
treatment: "metric",
|
|
69
|
-
className: "border-border-seam",
|
|
70
|
-
children: [/* @__PURE__ */ F(h, {
|
|
71
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
72
|
-
children: [/* @__PURE__ */ P(g, {
|
|
73
|
-
className: "text-sm font-medium",
|
|
74
|
-
children: t(R, "assethandler.users.stats.activeUsers", "Active Users")
|
|
75
|
-
}), /* @__PURE__ */ P(c, { className: "h-4 w-4 text-status-success-text" })]
|
|
76
|
-
}), /* @__PURE__ */ P(m, { children: /* @__PURE__ */ P("div", {
|
|
77
|
-
className: "text-2xl font-bold tabular-nums",
|
|
78
|
-
children: K
|
|
79
|
-
}) })]
|
|
80
|
-
}),
|
|
81
|
-
/* @__PURE__ */ F(_, {
|
|
82
|
-
treatment: "metric",
|
|
83
|
-
className: "border-border-seam",
|
|
84
|
-
children: [/* @__PURE__ */ F(h, {
|
|
85
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
86
|
-
children: [/* @__PURE__ */ P(g, {
|
|
87
|
-
className: "text-sm font-medium",
|
|
88
|
-
children: t(R, "assethandler.users.stats.administrators", "Administrators")
|
|
89
|
-
}), /* @__PURE__ */ P(s, { className: "h-4 w-4 text-status-error-text" })]
|
|
90
|
-
}), /* @__PURE__ */ P(m, { children: /* @__PURE__ */ P("div", {
|
|
91
|
-
className: "text-2xl font-bold tabular-nums",
|
|
92
|
-
children: q
|
|
93
|
-
}) })]
|
|
94
|
-
}),
|
|
95
|
-
/* @__PURE__ */ F(_, {
|
|
96
|
-
treatment: "metric",
|
|
97
|
-
className: "border-border-seam",
|
|
98
|
-
children: [/* @__PURE__ */ F(h, {
|
|
99
|
-
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
100
|
-
children: [/* @__PURE__ */ P(g, {
|
|
101
|
-
className: "text-sm font-medium",
|
|
102
|
-
children: t(R, "assethandler.users.stats.departments", "Departments")
|
|
103
|
-
}), /* @__PURE__ */ P(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
104
|
-
}), /* @__PURE__ */ P(m, { children: /* @__PURE__ */ P("div", {
|
|
105
|
-
className: "text-2xl font-bold tabular-nums",
|
|
106
|
-
children: J
|
|
107
|
-
}) })]
|
|
108
|
-
})
|
|
109
|
-
]
|
|
110
|
-
}),
|
|
111
|
-
/* @__PURE__ */ F(p, { children: [/* @__PURE__ */ P(h, { children: /* @__PURE__ */ F("div", {
|
|
112
|
-
className: "flex items-center justify-between",
|
|
113
|
-
children: [/* @__PURE__ */ P(g, { children: t(R, "assethandler.users.table.title", "All Users") }), /* @__PURE__ */ F("div", {
|
|
114
|
-
className: "flex items-center gap-2",
|
|
115
|
-
children: [/* @__PURE__ */ F("div", {
|
|
116
|
-
className: "relative",
|
|
117
|
-
children: [/* @__PURE__ */ P(o, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ P(b, {
|
|
118
|
-
placeholder: t(R, "assethandler.users.search.placeholder", "Search users..."),
|
|
119
|
-
value: V,
|
|
120
|
-
onChange: (e) => H(e.target.value),
|
|
121
|
-
className: "pl-9 w-[220px]"
|
|
122
|
-
})]
|
|
123
|
-
}), /* @__PURE__ */ F(S, {
|
|
124
|
-
value: U,
|
|
125
|
-
onValueChange: W,
|
|
126
|
-
children: [/* @__PURE__ */ F(T, {
|
|
127
|
-
className: "w-[150px]",
|
|
128
|
-
children: [/* @__PURE__ */ P(i, { className: "mr-2 h-4 w-4" }), /* @__PURE__ */ P(E, { placeholder: t(R, "assethandler.users.filters.role.placeholder", "Role") })]
|
|
129
|
-
}), /* @__PURE__ */ F(C, { children: [
|
|
130
|
-
/* @__PURE__ */ P(w, {
|
|
131
|
-
value: "all",
|
|
132
|
-
children: t(R, "assethandler.users.filters.role.all", "All Roles")
|
|
133
|
-
}),
|
|
134
|
-
/* @__PURE__ */ P(w, {
|
|
135
|
-
value: "admin",
|
|
136
|
-
children: t(R, "assethandler.users.filters.role.admin", "Admin")
|
|
137
|
-
}),
|
|
138
|
-
/* @__PURE__ */ P(w, {
|
|
139
|
-
value: "manager",
|
|
140
|
-
children: t(R, "assethandler.users.filters.role.manager", "Manager")
|
|
141
|
-
}),
|
|
142
|
-
/* @__PURE__ */ P(w, {
|
|
143
|
-
value: "technician",
|
|
144
|
-
children: t(R, "assethandler.users.filters.role.technician", "Technician")
|
|
145
|
-
}),
|
|
146
|
-
/* @__PURE__ */ P(w, {
|
|
147
|
-
value: "viewer",
|
|
148
|
-
children: t(R, "assethandler.users.filters.role.viewer", "Viewer")
|
|
149
|
-
}),
|
|
150
|
-
/* @__PURE__ */ P(w, {
|
|
151
|
-
value: "auditor",
|
|
152
|
-
children: t(R, "assethandler.users.filters.role.auditor", "Auditor")
|
|
153
|
-
})
|
|
154
|
-
] })]
|
|
155
|
-
})]
|
|
156
|
-
})]
|
|
157
|
-
}) }), /* @__PURE__ */ F(m, { children: [/* @__PURE__ */ F(D, { children: [/* @__PURE__ */ P(j, { children: /* @__PURE__ */ F(M, { children: [
|
|
158
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.name", "Name") }),
|
|
159
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.email", "Email") }),
|
|
160
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.role", "Role") }),
|
|
161
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.department", "Department") }),
|
|
162
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.status", "Status") }),
|
|
163
|
-
/* @__PURE__ */ P(A, { children: t(R, "assethandler.users.table.lastLogin", "Last Login") }),
|
|
164
|
-
/* @__PURE__ */ P(A, {
|
|
165
|
-
className: "text-right",
|
|
166
|
-
children: t(R, "assethandler.users.table.assets", "Assets")
|
|
167
|
-
})
|
|
168
|
-
] }) }), /* @__PURE__ */ P(O, { children: G.map((e) => /* @__PURE__ */ F(M, { children: [
|
|
169
|
-
/* @__PURE__ */ F(k, {
|
|
170
|
-
className: "font-medium",
|
|
171
|
-
children: [
|
|
172
|
-
e.firstName,
|
|
173
|
-
" ",
|
|
174
|
-
e.lastName
|
|
175
|
-
]
|
|
176
|
-
}),
|
|
177
|
-
/* @__PURE__ */ P(k, { children: e.email }),
|
|
178
|
-
/* @__PURE__ */ P(k, { children: /* @__PURE__ */ P(d, {
|
|
179
|
-
variant: I[e.role] || "secondary",
|
|
180
|
-
children: e.role
|
|
181
|
-
}) }),
|
|
182
|
-
/* @__PURE__ */ P(k, { children: e.department }),
|
|
183
|
-
/* @__PURE__ */ P(k, { children: /* @__PURE__ */ P(d, {
|
|
184
|
-
variant: L[e.status] || "secondary",
|
|
185
|
-
children: e.status
|
|
186
|
-
}) }),
|
|
187
|
-
/* @__PURE__ */ P(k, { children: new Date(e.lastLogin).toLocaleDateString() }),
|
|
188
|
-
/* @__PURE__ */ P(k, {
|
|
189
|
-
className: "text-right",
|
|
190
|
-
children: e.assetsAssigned
|
|
191
|
-
})
|
|
192
|
-
] }, e.id)) })] }), G.length === 0 && /* @__PURE__ */ P(y, {
|
|
193
|
-
illustration: "empty-people",
|
|
194
|
-
title: t(R, "assethandler.users.empty", "No users found"),
|
|
195
|
-
description: "No users match your search or filters. Add a user or clear the filters to see results.",
|
|
196
|
-
action: /* @__PURE__ */ F(f, {
|
|
197
|
-
size: "sm",
|
|
198
|
-
onClick: () => z("/users/user-create"),
|
|
199
|
-
children: [/* @__PURE__ */ P(a, { className: "mr-2 h-4 w-4" }), t(R, "assethandler.users.actions.addUser", "Add User")]
|
|
200
|
-
})
|
|
201
|
-
})] })] })
|
|
202
|
-
]
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
//#endregion
|
|
206
|
-
export { R as UsersPage };
|
|
207
|
-
|
|
208
|
-
//# sourceMappingURL=UsersPage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UsersPage.js","names":[],"sources":["../../../src/assethandler/pages/UsersPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n GradientText,\n GlassCard,\n PagePurpose,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Plus, Search, Filter, Users, UserCheck, Shield, Building } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\nimport { tWithFallback } from '../utils/i18n';\n\nconst roleColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n admin: 'destructive',\n manager: 'default',\n technician: 'secondary',\n viewer: 'outline',\n auditor: 'secondary',\n};\n\nconst statusColors: Record<string, 'default' | 'secondary' | 'destructive' | 'outline'> = {\n active: 'default',\n inactive: 'secondary',\n suspended: 'destructive',\n pending: 'outline',\n};\n\nexport function UsersPage() {\n const { t } = useI18n();\n const navigate = useNavigate();\n const { users } = useAssetHandlerStore();\n const [search, setSearch] = useState('');\n const [roleFilter, setRoleFilter] = useState('all');\n\n const filtered = users.filter((u) => {\n if (roleFilter !== 'all' && u.role !== roleFilter) return false;\n if (search) {\n const q = search.toLowerCase();\n return (\n u.firstName.toLowerCase().includes(q) ||\n u.lastName.toLowerCase().includes(q) ||\n u.email.toLowerCase().includes(q)\n );\n }\n return true;\n });\n\n const activeUsers = users.filter((u) => u.status === 'active').length;\n const adminCount = users.filter((u) => u.role === 'admin').length;\n const departments = [...new Set(users.map((u) => u.department))].length;\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{tWithFallback(t, 'assethandler.users.title', 'Users')}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {tWithFallback(\n t,\n 'assethandler.users.description',\n 'Manage user accounts, roles, and access permissions.'\n )}\n </p>\n </div>\n <Button size=\"sm\" onClick={() => navigate('/users/user-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {tWithFallback(t, 'assethandler.users.actions.addUser', 'Add User')}\n </Button>\n </div>\n\n <PagePurpose>\n {tWithFallback(\n t,\n 'assethandler.users.purpose',\n 'The directory of everyone who uses Asset Handler — their role, department, status and how many assets they hold. Use it to onboard and offboard people, adjust access, and see at a glance who is responsible for what.'\n )}\n </PagePurpose>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">\n {tWithFallback(t, 'assethandler.users.stats.totalUsers', 'Total Users')}\n </CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{users.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">\n {tWithFallback(t, 'assethandler.users.stats.activeUsers', 'Active Users')}\n </CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeUsers}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">\n {tWithFallback(t, 'assethandler.users.stats.administrators', 'Administrators')}\n </CardTitle>\n <Shield className=\"h-4 w-4 text-status-error-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{adminCount}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">\n {tWithFallback(t, 'assethandler.users.stats.departments', 'Departments')}\n </CardTitle>\n <Building className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{departments}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>{tWithFallback(t, 'assethandler.users.table.title', 'All Users')}</CardTitle>\n <div className=\"flex items-center gap-2\">\n <div className=\"relative\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder={tWithFallback(\n t,\n 'assethandler.users.search.placeholder',\n 'Search users...'\n )}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9 w-[220px]\"\n />\n </div>\n <Select value={roleFilter} onValueChange={setRoleFilter}>\n <SelectTrigger className=\"w-[150px]\">\n <Filter className=\"mr-2 h-4 w-4\" />\n <SelectValue\n placeholder={tWithFallback(\n t,\n 'assethandler.users.filters.role.placeholder',\n 'Role'\n )}\n />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"all\">\n {tWithFallback(t, 'assethandler.users.filters.role.all', 'All Roles')}\n </SelectItem>\n <SelectItem value=\"admin\">\n {tWithFallback(t, 'assethandler.users.filters.role.admin', 'Admin')}\n </SelectItem>\n <SelectItem value=\"manager\">\n {tWithFallback(t, 'assethandler.users.filters.role.manager', 'Manager')}\n </SelectItem>\n <SelectItem value=\"technician\">\n {tWithFallback(t, 'assethandler.users.filters.role.technician', 'Technician')}\n </SelectItem>\n <SelectItem value=\"viewer\">\n {tWithFallback(t, 'assethandler.users.filters.role.viewer', 'Viewer')}\n </SelectItem>\n <SelectItem value=\"auditor\">\n {tWithFallback(t, 'assethandler.users.filters.role.auditor', 'Auditor')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>{tWithFallback(t, 'assethandler.users.table.name', 'Name')}</TableHead>\n <TableHead>{tWithFallback(t, 'assethandler.users.table.email', 'Email')}</TableHead>\n <TableHead>{tWithFallback(t, 'assethandler.users.table.role', 'Role')}</TableHead>\n <TableHead>\n {tWithFallback(t, 'assethandler.users.table.department', 'Department')}\n </TableHead>\n <TableHead>\n {tWithFallback(t, 'assethandler.users.table.status', 'Status')}\n </TableHead>\n <TableHead>\n {tWithFallback(t, 'assethandler.users.table.lastLogin', 'Last Login')}\n </TableHead>\n <TableHead className=\"text-right\">\n {tWithFallback(t, 'assethandler.users.table.assets', 'Assets')}\n </TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {filtered.map((user) => (\n <TableRow key={user.id}>\n <TableCell className=\"font-medium\">\n {user.firstName} {user.lastName}\n </TableCell>\n <TableCell>{user.email}</TableCell>\n <TableCell>\n <Badge variant={roleColors[user.role] || 'secondary'}>{user.role}</Badge>\n </TableCell>\n <TableCell>{user.department}</TableCell>\n <TableCell>\n <Badge variant={statusColors[user.status] || 'secondary'}>{user.status}</Badge>\n </TableCell>\n <TableCell>{new Date(user.lastLogin).toLocaleDateString()}</TableCell>\n <TableCell className=\"text-right\">{user.assetsAssigned}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n {filtered.length === 0 && (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title={tWithFallback(t, 'assethandler.users.empty', 'No users found')}\n description=\"No users match your search or filters. Add a user or clear the filters to see results.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/users/user-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n {tWithFallback(t, 'assethandler.users.actions.addUser', 'Add User')}\n </Button>\n }\n />\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|