@burdenoff/microfe-assethandler 2026.625.1 → 2026.625.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assethandler/pages/AiPredictionsPage.js +42 -41
- package/dist/assethandler/pages/AiPredictionsPage.js.map +1 -1
- package/dist/assethandler/pages/AnalyticsPage.js +538 -534
- package/dist/assethandler/pages/AnalyticsPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js +135 -125
- package/dist/assethandler/pages/AssetsAssetCategoriesPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js +90 -92
- package/dist/assethandler/pages/AssetsAssetCheckInOutPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetCreatePage.js +131 -124
- package/dist/assethandler/pages/AssetsAssetCreatePage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetDetailPage.js +214 -185
- package/dist/assethandler/pages/AssetsAssetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetEditPage.js +168 -156
- package/dist/assethandler/pages/AssetsAssetEditPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetListPage.js +207 -187
- package/dist/assethandler/pages/AssetsAssetListPage.js.map +1 -1
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js +82 -71
- package/dist/assethandler/pages/AssetsAssetTrackingPage.js.map +1 -1
- package/dist/assethandler/pages/AuditTrailPage.js +93 -91
- package/dist/assethandler/pages/AuditTrailPage.js.map +1 -1
- package/dist/assethandler/pages/CmdbBrowserPage.js +32 -33
- package/dist/assethandler/pages/CmdbBrowserPage.js.map +1 -1
- package/dist/assethandler/pages/DashboardPage.js +157 -126
- package/dist/assethandler/pages/DashboardPage.js.map +1 -1
- package/dist/assethandler/pages/DigitalTwinPage.js +25 -26
- package/dist/assethandler/pages/DigitalTwinPage.js.map +1 -1
- package/dist/assethandler/pages/DiscoveryJobsPage.js +50 -50
- package/dist/assethandler/pages/DiscoveryJobsPage.js.map +1 -1
- package/dist/assethandler/pages/EsgDashboardPage.js +43 -42
- package/dist/assethandler/pages/EsgDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js +96 -82
- package/dist/assethandler/pages/FinanceBudgetDetailPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceFinanceHubPage.js +137 -103
- package/dist/assethandler/pages/FinanceFinanceHubPage.js.map +1 -1
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js +77 -66
- package/dist/assethandler/pages/FinanceInvoiceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/IotDevicesPage.js +34 -35
- package/dist/assethandler/pages/IotDevicesPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeDetailPage.js +236 -199
- package/dist/assethandler/pages/ItilChangeDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilChangeManagementPage.js +66 -64
- package/dist/assethandler/pages/ItilChangeManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentDetailPage.js +237 -200
- package/dist/assethandler/pages/ItilIncidentDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilIncidentManagementPage.js +99 -97
- package/dist/assethandler/pages/ItilIncidentManagementPage.js.map +1 -1
- package/dist/assethandler/pages/ItilItilhubPage.js +166 -122
- package/dist/assethandler/pages/ItilItilhubPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemDetailPage.js +193 -156
- package/dist/assethandler/pages/ItilProblemDetailPage.js.map +1 -1
- package/dist/assethandler/pages/ItilProblemManagementPage.js +63 -61
- package/dist/assethandler/pages/ItilProblemManagementPage.js.map +1 -1
- package/dist/assethandler/pages/KnowledgeBasePage.js +45 -43
- package/dist/assethandler/pages/KnowledgeBasePage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js +70 -68
- package/dist/assethandler/pages/MaintenanceMaintenanceCalendarPage.js.map +1 -1
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js +77 -62
- package/dist/assethandler/pages/MaintenanceMaintenanceSchedulerPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js +162 -151
- package/dist/assethandler/pages/MarketplaceMarketplaceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js +64 -57
- package/dist/assethandler/pages/MarketplaceMarketplaceListPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js +125 -108
- package/dist/assethandler/pages/MarketplaceMarketplaceOrdersPage.js.map +1 -1
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js +67 -61
- package/dist/assethandler/pages/MarketplaceMarketplaceSellPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js +203 -166
- package/dist/assethandler/pages/OperationsMaintenanceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsOperationsHubPage.js +125 -95
- package/dist/assethandler/pages/OperationsOperationsHubPage.js.map +1 -1
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js +165 -151
- package/dist/assethandler/pages/OperationsWorkOrderDetailPage.js.map +1 -1
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js +83 -81
- package/dist/assethandler/pages/PortfolioPortfolioOverviewPage.js.map +1 -1
- package/dist/assethandler/pages/ProvenancePage.js +56 -53
- package/dist/assethandler/pages/ProvenancePage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportBuilderPage.js +80 -73
- package/dist/assethandler/pages/ReportsReportBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js +112 -77
- package/dist/assethandler/pages/ReportsReportsDashboardPage.js.map +1 -1
- package/dist/assethandler/pages/ReportsReportsListPage.js +119 -103
- package/dist/assethandler/pages/ReportsReportsListPage.js.map +1 -1
- package/dist/assethandler/pages/SamLicensesPage.js +32 -33
- package/dist/assethandler/pages/SamLicensesPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js +60 -52
- package/dist/assethandler/pages/SecurityComplianceDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js +134 -117
- package/dist/assethandler/pages/SecurityPolicyDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js +63 -57
- package/dist/assethandler/pages/SecurityScheduleBackupPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js +131 -117
- package/dist/assethandler/pages/SecuritySecurityEventDetailPage.js.map +1 -1
- package/dist/assethandler/pages/SecuritySecurityHubPage.js +147 -113
- package/dist/assethandler/pages/SecuritySecurityHubPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js +235 -218
- package/dist/assethandler/pages/TransactionsTransactionDetailPage.js.map +1 -1
- package/dist/assethandler/pages/TransactionsTransactionListPage.js +118 -116
- package/dist/assethandler/pages/TransactionsTransactionListPage.js.map +1 -1
- package/dist/assethandler/pages/UsersPage.js +108 -99
- package/dist/assethandler/pages/UsersPage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserCreatePage.js +74 -67
- package/dist/assethandler/pages/UsersUserCreatePage.js.map +1 -1
- package/dist/assethandler/pages/UsersUserManagementHubPage.js +128 -93
- package/dist/assethandler/pages/UsersUserManagementHubPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js +211 -193
- package/dist/assethandler/pages/WorkflowsWorkflowBuilderPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js +88 -86
- package/dist/assethandler/pages/WorkflowsWorkflowExecutionsPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js +68 -60
- package/dist/assethandler/pages/WorkflowsWorkflowListPage.js.map +1 -1
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js +71 -68
- package/dist/assethandler/pages/WorkflowsWorkflowTemplatesPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { useAssetHandlerStore as e } from "../store/assethandlerStore.js";
|
|
2
2
|
import { Activity as t, Download as n, Key as r, Plus as i, Shield as a, Upload as o, UserCheck as s, Users as c } from "lucide-react";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { useNavigate as l } from "react-router-dom";
|
|
4
|
+
import { Badge as u, Button as d, CTAOverflowMenu as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, GlassCard as _, GradientText as v, IllustratedEmptyState as y, NextSteps as b, PagePurpose as x, Table as S, TableBody as C, TableCell as w, TableHead as T, TableHeader as E, TableRow as D, Tabs as O, TabsContent as k, TabsList as A, TabsTrigger as j } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { jsx as M, jsxs as N } from "react/jsx-runtime";
|
|
5
6
|
//#region src/assethandler/pages/UsersUserManagementHubPage.tsx
|
|
6
|
-
var
|
|
7
|
+
var P = {
|
|
7
8
|
admin: {
|
|
8
9
|
description: "Full system access with all permissions",
|
|
9
10
|
permCount: 11,
|
|
@@ -29,7 +30,7 @@ var A = {
|
|
|
29
30
|
permCount: 4,
|
|
30
31
|
color: "bg-action-primary-bg/10 text-action-primary-bg"
|
|
31
32
|
}
|
|
32
|
-
},
|
|
33
|
+
}, F = [
|
|
33
34
|
{
|
|
34
35
|
module: "Assets",
|
|
35
36
|
admin: "Full",
|
|
@@ -94,138 +95,172 @@ var A = {
|
|
|
94
95
|
viewer: "Read",
|
|
95
96
|
auditor: "Read"
|
|
96
97
|
}
|
|
97
|
-
],
|
|
98
|
-
function
|
|
99
|
-
let { users:
|
|
100
|
-
return /* @__PURE__ */
|
|
98
|
+
], I = Date.now() - 864e5;
|
|
99
|
+
function L() {
|
|
100
|
+
let L = l(), { users: R } = e(), z = R.filter((e) => e.status === "active").length, B = R.filter((e) => new Date(e.lastLogin).getTime() > I).length, V = R.reduce((e, t) => (e[t.role] = (e[t.role] || 0) + 1, e), {});
|
|
101
|
+
return /* @__PURE__ */ N("div", {
|
|
101
102
|
className: "space-y-6 p-6",
|
|
102
103
|
children: [
|
|
103
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ N("div", {
|
|
104
105
|
className: "flex items-center justify-between",
|
|
105
|
-
children: [/* @__PURE__ */
|
|
106
|
+
children: [/* @__PURE__ */ N("div", { children: [/* @__PURE__ */ M("h1", {
|
|
106
107
|
className: "text-2xl font-semibold",
|
|
107
|
-
children: /* @__PURE__ */
|
|
108
|
-
}), /* @__PURE__ */
|
|
108
|
+
children: /* @__PURE__ */ M(v, { children: "User Management" })
|
|
109
|
+
}), /* @__PURE__ */ M("p", {
|
|
109
110
|
className: "text-sm text-text-secondary",
|
|
110
111
|
children: "Manage users, roles, and access permissions across the organization."
|
|
111
|
-
})] }), /* @__PURE__ */
|
|
112
|
+
})] }), /* @__PURE__ */ M(f, {
|
|
112
113
|
primary: {
|
|
113
114
|
label: "Add User",
|
|
114
115
|
onSelect: () => {},
|
|
115
|
-
icon: /* @__PURE__ */
|
|
116
|
+
icon: /* @__PURE__ */ M(i, { className: "h-4 w-4" })
|
|
116
117
|
},
|
|
117
118
|
actions: [{
|
|
118
119
|
label: "Bulk Import",
|
|
119
120
|
onSelect: () => {},
|
|
120
|
-
icon: /* @__PURE__ */
|
|
121
|
+
icon: /* @__PURE__ */ M(o, { className: "h-4 w-4" })
|
|
121
122
|
}, {
|
|
122
123
|
label: "Export",
|
|
123
124
|
onSelect: () => {},
|
|
124
|
-
icon: /* @__PURE__ */
|
|
125
|
+
icon: /* @__PURE__ */ M(n, { className: "h-4 w-4" })
|
|
125
126
|
}]
|
|
126
127
|
})]
|
|
127
128
|
}),
|
|
128
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ M(x, { children: "Control who can do what across Asset Handler. Add and offboard users, assign roles, and review the permission matrix so people see exactly the assets, reports and actions their job needs — keeping access least-privilege and audit-friendly." }),
|
|
130
|
+
/* @__PURE__ */ M(b, {
|
|
131
|
+
storageKey: "assethandler-users-hub",
|
|
132
|
+
steps: [
|
|
133
|
+
{
|
|
134
|
+
id: "add-user",
|
|
135
|
+
label: "Add a user",
|
|
136
|
+
description: "Invite a teammate and assign their starting role.",
|
|
137
|
+
onClick: () => L("/users/user-create")
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
id: "directory",
|
|
141
|
+
label: "Browse the user directory",
|
|
142
|
+
description: "See everyone, their status and assigned assets.",
|
|
143
|
+
onClick: () => L("/users")
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
id: "audit",
|
|
147
|
+
label: "Check the audit trail",
|
|
148
|
+
description: "See who accessed or changed assets recently.",
|
|
149
|
+
onClick: () => L("/audit-trail")
|
|
150
|
+
}
|
|
151
|
+
]
|
|
152
|
+
}),
|
|
153
|
+
/* @__PURE__ */ N("div", {
|
|
129
154
|
className: "grid gap-4 md:grid-cols-4",
|
|
130
155
|
children: [
|
|
131
|
-
/* @__PURE__ */
|
|
132
|
-
treatment: "
|
|
156
|
+
/* @__PURE__ */ N(_, {
|
|
157
|
+
treatment: "glass",
|
|
158
|
+
glow: !0,
|
|
133
159
|
className: "border-border-seam",
|
|
134
|
-
children: [/* @__PURE__ */
|
|
160
|
+
children: [/* @__PURE__ */ N(h, {
|
|
135
161
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
136
|
-
children: [/* @__PURE__ */
|
|
162
|
+
children: [/* @__PURE__ */ M(g, {
|
|
137
163
|
className: "text-sm font-medium",
|
|
138
164
|
children: "Total Users"
|
|
139
|
-
}), /* @__PURE__ */
|
|
140
|
-
}), /* @__PURE__ */
|
|
165
|
+
}), /* @__PURE__ */ M(c, { className: "h-4 w-4 text-text-secondary" })]
|
|
166
|
+
}), /* @__PURE__ */ M(m, { children: /* @__PURE__ */ M("div", {
|
|
141
167
|
className: "text-2xl font-bold tabular-nums",
|
|
142
|
-
children:
|
|
168
|
+
children: R.length
|
|
143
169
|
}) })]
|
|
144
170
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
171
|
+
/* @__PURE__ */ N(_, {
|
|
146
172
|
treatment: "metric",
|
|
147
173
|
className: "border-border-seam",
|
|
148
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ N(h, {
|
|
149
175
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
150
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ M(g, {
|
|
151
177
|
className: "text-sm font-medium",
|
|
152
178
|
children: "Active"
|
|
153
|
-
}), /* @__PURE__ */
|
|
154
|
-
}), /* @__PURE__ */
|
|
179
|
+
}), /* @__PURE__ */ M(s, { className: "h-4 w-4 text-status-success-text" })]
|
|
180
|
+
}), /* @__PURE__ */ N(m, { children: [/* @__PURE__ */ M("div", {
|
|
155
181
|
className: "text-2xl font-bold tabular-nums",
|
|
156
|
-
children:
|
|
157
|
-
}), /* @__PURE__ */
|
|
182
|
+
children: z
|
|
183
|
+
}), /* @__PURE__ */ N("p", {
|
|
158
184
|
className: "text-xs text-text-secondary",
|
|
159
|
-
children: [Math.round(
|
|
185
|
+
children: [Math.round(z / R.length * 100), "% of total"]
|
|
160
186
|
})] })]
|
|
161
187
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
188
|
+
/* @__PURE__ */ N(_, {
|
|
163
189
|
treatment: "metric",
|
|
164
190
|
className: "border-border-seam",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
191
|
+
children: [/* @__PURE__ */ N(h, {
|
|
166
192
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
167
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ M(g, {
|
|
168
194
|
className: "text-sm font-medium",
|
|
169
195
|
children: "Roles Defined"
|
|
170
|
-
}), /* @__PURE__ */
|
|
171
|
-
}), /* @__PURE__ */
|
|
196
|
+
}), /* @__PURE__ */ M(a, { className: "h-4 w-4 text-text-secondary" })]
|
|
197
|
+
}), /* @__PURE__ */ M(m, { children: /* @__PURE__ */ M("div", {
|
|
172
198
|
className: "text-2xl font-bold tabular-nums",
|
|
173
|
-
children: Object.keys(
|
|
199
|
+
children: Object.keys(P).length
|
|
174
200
|
}) })]
|
|
175
201
|
}),
|
|
176
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ N(_, {
|
|
177
203
|
treatment: "metric",
|
|
178
204
|
className: "border-border-seam",
|
|
179
|
-
children: [/* @__PURE__ */
|
|
205
|
+
children: [/* @__PURE__ */ N(h, {
|
|
180
206
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
181
|
-
children: [/* @__PURE__ */
|
|
207
|
+
children: [/* @__PURE__ */ M(g, {
|
|
182
208
|
className: "text-sm font-medium",
|
|
183
209
|
children: "Recent Activity"
|
|
184
|
-
}), /* @__PURE__ */
|
|
185
|
-
}), /* @__PURE__ */
|
|
210
|
+
}), /* @__PURE__ */ M(t, { className: "h-4 w-4 text-text-secondary" })]
|
|
211
|
+
}), /* @__PURE__ */ N(m, { children: [/* @__PURE__ */ M("div", {
|
|
186
212
|
className: "text-2xl font-bold tabular-nums",
|
|
187
|
-
children:
|
|
188
|
-
}), /* @__PURE__ */
|
|
213
|
+
children: B
|
|
214
|
+
}), /* @__PURE__ */ M("p", {
|
|
189
215
|
className: "text-xs text-text-secondary",
|
|
190
216
|
children: "Logged in last 24h"
|
|
191
217
|
})] })]
|
|
192
218
|
})
|
|
193
219
|
]
|
|
194
220
|
}),
|
|
195
|
-
/* @__PURE__ */
|
|
221
|
+
/* @__PURE__ */ N(O, {
|
|
196
222
|
defaultValue: "users",
|
|
197
223
|
children: [
|
|
198
|
-
/* @__PURE__ */
|
|
199
|
-
/* @__PURE__ */
|
|
224
|
+
/* @__PURE__ */ N(A, { children: [
|
|
225
|
+
/* @__PURE__ */ M(j, {
|
|
200
226
|
value: "users",
|
|
201
227
|
children: "Users"
|
|
202
228
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
229
|
+
/* @__PURE__ */ M(j, {
|
|
204
230
|
value: "roles",
|
|
205
231
|
children: "Roles"
|
|
206
232
|
}),
|
|
207
|
-
/* @__PURE__ */
|
|
233
|
+
/* @__PURE__ */ M(j, {
|
|
208
234
|
value: "permissions",
|
|
209
235
|
children: "Permissions Matrix"
|
|
210
236
|
})
|
|
211
237
|
] }),
|
|
212
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ M(k, {
|
|
213
239
|
value: "users",
|
|
214
240
|
className: "mt-4",
|
|
215
|
-
children:
|
|
241
|
+
children: R.length === 0 ? /* @__PURE__ */ M(y, {
|
|
242
|
+
illustration: "empty-people",
|
|
243
|
+
title: "No users yet",
|
|
244
|
+
description: "Add your first user to start managing access to Asset Handler.",
|
|
245
|
+
action: /* @__PURE__ */ N(d, {
|
|
246
|
+
size: "sm",
|
|
247
|
+
onClick: () => L("/users/user-create"),
|
|
248
|
+
children: [/* @__PURE__ */ M(i, { className: "mr-2 h-4 w-4" }), "Add User"]
|
|
249
|
+
})
|
|
250
|
+
}) : /* @__PURE__ */ M(p, { children: /* @__PURE__ */ M(m, {
|
|
216
251
|
className: "pt-6",
|
|
217
|
-
children: /* @__PURE__ */
|
|
218
|
-
/* @__PURE__ */
|
|
219
|
-
/* @__PURE__ */
|
|
220
|
-
/* @__PURE__ */
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
223
|
-
/* @__PURE__ */
|
|
252
|
+
children: /* @__PURE__ */ N(S, { children: [/* @__PURE__ */ M(E, { children: /* @__PURE__ */ N(D, { children: [
|
|
253
|
+
/* @__PURE__ */ M(T, { children: "Name" }),
|
|
254
|
+
/* @__PURE__ */ M(T, { children: "Email" }),
|
|
255
|
+
/* @__PURE__ */ M(T, { children: "Role" }),
|
|
256
|
+
/* @__PURE__ */ M(T, { children: "Department" }),
|
|
257
|
+
/* @__PURE__ */ M(T, { children: "Status" }),
|
|
258
|
+
/* @__PURE__ */ M(T, {
|
|
224
259
|
className: "text-right",
|
|
225
260
|
children: "Assets"
|
|
226
261
|
})
|
|
227
|
-
] }) }), /* @__PURE__ */
|
|
228
|
-
/* @__PURE__ */
|
|
262
|
+
] }) }), /* @__PURE__ */ M(C, { children: R.map((e) => /* @__PURE__ */ N(D, { children: [
|
|
263
|
+
/* @__PURE__ */ N(w, {
|
|
229
264
|
className: "font-medium",
|
|
230
265
|
children: [
|
|
231
266
|
e.firstName,
|
|
@@ -233,49 +268,49 @@ function N() {
|
|
|
233
268
|
e.lastName
|
|
234
269
|
]
|
|
235
270
|
}),
|
|
236
|
-
/* @__PURE__ */
|
|
237
|
-
/* @__PURE__ */
|
|
271
|
+
/* @__PURE__ */ M(w, { children: e.email }),
|
|
272
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
238
273
|
variant: e.role === "admin" ? "destructive" : "secondary",
|
|
239
274
|
children: e.role
|
|
240
275
|
}) }),
|
|
241
|
-
/* @__PURE__ */
|
|
242
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ M(w, { children: e.department }),
|
|
277
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
243
278
|
variant: e.status === "active" ? "default" : "outline",
|
|
244
279
|
children: e.status
|
|
245
280
|
}) }),
|
|
246
|
-
/* @__PURE__ */
|
|
281
|
+
/* @__PURE__ */ M(w, {
|
|
247
282
|
className: "text-right",
|
|
248
283
|
children: e.assetsAssigned
|
|
249
284
|
})
|
|
250
285
|
] }, e.id)) })] })
|
|
251
286
|
}) })
|
|
252
287
|
}),
|
|
253
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ M(k, {
|
|
254
289
|
value: "roles",
|
|
255
290
|
className: "mt-4",
|
|
256
|
-
children: /* @__PURE__ */
|
|
291
|
+
children: /* @__PURE__ */ M("div", {
|
|
257
292
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
258
|
-
children: Object.entries(
|
|
293
|
+
children: Object.entries(P).map(([e, t]) => /* @__PURE__ */ N(p, { children: [/* @__PURE__ */ M(h, { children: /* @__PURE__ */ N("div", {
|
|
259
294
|
className: "flex items-center justify-between",
|
|
260
|
-
children: [/* @__PURE__ */
|
|
295
|
+
children: [/* @__PURE__ */ M(g, {
|
|
261
296
|
className: "text-lg capitalize",
|
|
262
297
|
children: e
|
|
263
|
-
}), /* @__PURE__ */
|
|
298
|
+
}), /* @__PURE__ */ N(u, {
|
|
264
299
|
variant: "outline",
|
|
265
|
-
children: [
|
|
300
|
+
children: [V[e] || 0, " users"]
|
|
266
301
|
})]
|
|
267
|
-
}) }), /* @__PURE__ */
|
|
302
|
+
}) }), /* @__PURE__ */ N(m, {
|
|
268
303
|
className: "space-y-3",
|
|
269
304
|
children: [
|
|
270
|
-
/* @__PURE__ */
|
|
305
|
+
/* @__PURE__ */ M("p", {
|
|
271
306
|
className: "text-sm text-text-secondary",
|
|
272
307
|
children: t.description
|
|
273
308
|
}),
|
|
274
|
-
/* @__PURE__ */
|
|
309
|
+
/* @__PURE__ */ N("div", {
|
|
275
310
|
className: "flex items-center gap-2 text-sm",
|
|
276
|
-
children: [/* @__PURE__ */
|
|
311
|
+
children: [/* @__PURE__ */ M(r, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ N("span", { children: [t.permCount, " permissions"] })]
|
|
277
312
|
}),
|
|
278
|
-
/* @__PURE__ */
|
|
313
|
+
/* @__PURE__ */ M(d, {
|
|
279
314
|
variant: "outline",
|
|
280
315
|
size: "sm",
|
|
281
316
|
className: "w-full",
|
|
@@ -285,42 +320,42 @@ function N() {
|
|
|
285
320
|
})] }, e))
|
|
286
321
|
})
|
|
287
322
|
}),
|
|
288
|
-
/* @__PURE__ */
|
|
323
|
+
/* @__PURE__ */ M(k, {
|
|
289
324
|
value: "permissions",
|
|
290
325
|
className: "mt-4",
|
|
291
|
-
children: /* @__PURE__ */
|
|
292
|
-
/* @__PURE__ */
|
|
293
|
-
/* @__PURE__ */
|
|
294
|
-
/* @__PURE__ */
|
|
295
|
-
/* @__PURE__ */
|
|
296
|
-
/* @__PURE__ */
|
|
297
|
-
/* @__PURE__ */
|
|
298
|
-
] }) }), /* @__PURE__ */
|
|
299
|
-
/* @__PURE__ */
|
|
326
|
+
children: /* @__PURE__ */ N(p, { children: [/* @__PURE__ */ M(h, { children: /* @__PURE__ */ M(g, { children: "Permission Matrix" }) }), /* @__PURE__ */ M(m, { children: /* @__PURE__ */ N(S, { children: [/* @__PURE__ */ M(E, { children: /* @__PURE__ */ N(D, { children: [
|
|
327
|
+
/* @__PURE__ */ M(T, { children: "Module" }),
|
|
328
|
+
/* @__PURE__ */ M(T, { children: "Admin" }),
|
|
329
|
+
/* @__PURE__ */ M(T, { children: "Manager" }),
|
|
330
|
+
/* @__PURE__ */ M(T, { children: "Technician" }),
|
|
331
|
+
/* @__PURE__ */ M(T, { children: "Viewer" }),
|
|
332
|
+
/* @__PURE__ */ M(T, { children: "Auditor" })
|
|
333
|
+
] }) }), /* @__PURE__ */ M(C, { children: F.map((e) => /* @__PURE__ */ N(D, { children: [
|
|
334
|
+
/* @__PURE__ */ M(w, {
|
|
300
335
|
className: "font-medium",
|
|
301
336
|
children: e.module
|
|
302
337
|
}),
|
|
303
|
-
/* @__PURE__ */
|
|
338
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
304
339
|
variant: e.admin === "Full" ? "default" : "outline",
|
|
305
340
|
className: "text-xs",
|
|
306
341
|
children: e.admin
|
|
307
342
|
}) }),
|
|
308
|
-
/* @__PURE__ */
|
|
343
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
309
344
|
variant: e.manager === "Full" ? "default" : e.manager === "—" ? "outline" : "secondary",
|
|
310
345
|
className: "text-xs",
|
|
311
346
|
children: e.manager
|
|
312
347
|
}) }),
|
|
313
|
-
/* @__PURE__ */
|
|
348
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
314
349
|
variant: e.technician === "Full" ? "default" : e.technician === "—" ? "outline" : "secondary",
|
|
315
350
|
className: "text-xs",
|
|
316
351
|
children: e.technician
|
|
317
352
|
}) }),
|
|
318
|
-
/* @__PURE__ */
|
|
353
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
319
354
|
variant: e.viewer === "—" ? "outline" : "secondary",
|
|
320
355
|
className: "text-xs",
|
|
321
356
|
children: e.viewer
|
|
322
357
|
}) }),
|
|
323
|
-
/* @__PURE__ */
|
|
358
|
+
/* @__PURE__ */ M(w, { children: /* @__PURE__ */ M(u, {
|
|
324
359
|
variant: e.auditor === "Full" ? "default" : e.auditor === "—" ? "outline" : "secondary",
|
|
325
360
|
className: "text-xs",
|
|
326
361
|
children: e.auditor
|
|
@@ -333,6 +368,6 @@ function N() {
|
|
|
333
368
|
});
|
|
334
369
|
}
|
|
335
370
|
//#endregion
|
|
336
|
-
export {
|
|
371
|
+
export { L as UsersUserManagementHubPage };
|
|
337
372
|
|
|
338
373
|
//# sourceMappingURL=UsersUserManagementHubPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersUserManagementHubPage.js","names":[],"sources":["../../../src/assethandler/pages/UsersUserManagementHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n GradientText,\n GlassCard,\n CTAOverflowMenu,\n} from '@burdenoff/fe-libs/ui';\nimport { Users, UserCheck, Shield, Upload, Download, Plus, Activity, Key } from 'lucide-react';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst roleDescriptions: Record<string, { description: string; permCount: number; color: string }> =\n {\n admin: {\n description: 'Full system access with all permissions',\n permCount: 11,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n manager: {\n description: 'Department-level management and reporting',\n permCount: 6,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n technician: {\n description: 'Asset maintenance and operational tasks',\n permCount: 4,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n viewer: {\n description: 'Read-only access to assets and reports',\n permCount: 2,\n color: 'bg-bg-sunken text-text-secondary',\n },\n auditor: {\n description: 'Audit trail access and compliance reporting',\n permCount: 4,\n color: 'bg-action-primary-bg/10 text-action-primary-bg',\n },\n };\n\nconst permissionMatrix = [\n {\n module: 'Assets',\n admin: 'Full',\n manager: 'Full',\n technician: 'Read/Update',\n viewer: 'Read',\n auditor: 'Read',\n },\n { module: 'Users', admin: 'Full', manager: 'Read', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Reports',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: 'Read',\n auditor: 'Full',\n },\n {\n module: 'Maintenance',\n admin: 'Full',\n manager: 'Full',\n technician: 'Full',\n viewer: '—',\n auditor: '—',\n },\n { module: 'Audit', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: 'Full' },\n {\n module: 'Compliance',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: '—',\n auditor: 'Full',\n },\n { module: 'Settings', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Finance',\n admin: 'Full',\n manager: 'Full',\n technician: '—',\n viewer: 'Read',\n auditor: 'Read',\n },\n];\n\nconst RECENT_LOGIN_CUTOFF = Date.now() - 86400000;\n\nexport function UsersUserManagementHubPage() {\n const { users } = useAssetHandlerStore();\n\n const activeUsers = users.filter((u) => u.status === 'active').length;\n const recentActivityCount = users.filter(\n (u) => new Date(u.lastLogin).getTime() > RECENT_LOGIN_CUTOFF\n ).length;\n const roleCounts = users.reduce<Record<string, number>>((acc, u) => {\n acc[u.role] = (acc[u.role] || 0) + 1;\n return acc;\n }, {});\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>User Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Manage users, roles, and access permissions across the organization.\n </p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'Add User', onSelect: () => {}, icon: <Plus className=\"h-4 w-4\" /> }}\n actions={[\n { label: 'Bulk Import', onSelect: () => {}, icon: <Upload className=\"h-4 w-4\" /> },\n { label: 'Export', onSelect: () => {}, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Users</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\">Active</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 <p className=\"text-xs text-text-secondary\">\n {Math.round((activeUsers / users.length) * 100)}% of total\n </p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Roles Defined</CardTitle>\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {Object.keys(roleDescriptions).length}\n </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\">Recent Activity</CardTitle>\n <Activity className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{recentActivityCount}</div>\n <p className=\"text-xs text-text-secondary\">Logged in last 24h</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Tabs defaultValue=\"users\">\n <TabsList>\n <TabsTrigger value=\"users\">Users</TabsTrigger>\n <TabsTrigger value=\"roles\">Roles</TabsTrigger>\n <TabsTrigger value=\"permissions\">Permissions Matrix</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"users\" className=\"mt-4\">\n <Card>\n <CardContent className=\"pt-6\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Email</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Department</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Assets</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.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={user.role === 'admin' ? 'destructive' : 'secondary'}>\n {user.role}\n </Badge>\n </TableCell>\n <TableCell>{user.department}</TableCell>\n <TableCell>\n <Badge variant={user.status === 'active' ? 'default' : 'outline'}>\n {user.status}\n </Badge>\n </TableCell>\n <TableCell className=\"text-right\">{user.assetsAssigned}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n </TabsContent>\n\n <TabsContent value=\"roles\" className=\"mt-4\">\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {Object.entries(roleDescriptions).map(([role, info]) => (\n <Card key={role}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-lg capitalize\">{role}</CardTitle>\n <Badge variant=\"outline\">{roleCounts[role] || 0} users</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">{info.description}</p>\n <div className=\"flex items-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-text-secondary\" />\n <span>{info.permCount} permissions</span>\n </div>\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">\n Edit Role\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"permissions\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle>Permission Matrix</CardTitle>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Module</TableHead>\n <TableHead>Admin</TableHead>\n <TableHead>Manager</TableHead>\n <TableHead>Technician</TableHead>\n <TableHead>Viewer</TableHead>\n <TableHead>Auditor</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {permissionMatrix.map((row) => (\n <TableRow key={row.module}>\n <TableCell className=\"font-medium\">{row.module}</TableCell>\n <TableCell>\n <Badge\n variant={row.admin === 'Full' ? 'default' : 'outline'}\n className=\"text-xs\"\n >\n {row.admin}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.manager === 'Full'\n ? 'default'\n : row.manager === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.manager}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.technician === 'Full'\n ? 'default'\n : row.technician === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.technician}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={row.viewer === '—' ? 'outline' : 'secondary'}\n className=\"text-xs\"\n >\n {row.viewer}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.auditor === 'Full'\n ? 'default'\n : row.auditor === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.auditor}\n </Badge>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UsersUserManagementHubPage.js","names":[],"sources":["../../../src/assethandler/pages/UsersUserManagementHubPage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n Table,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n GradientText,\n GlassCard,\n CTAOverflowMenu,\n PagePurpose,\n NextSteps,\n IllustratedEmptyState,\n} from '@burdenoff/fe-libs/ui';\nimport { Users, UserCheck, Shield, Upload, Download, Plus, Activity, Key } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useAssetHandlerStore } from '../store/assethandlerStore';\n\nconst roleDescriptions: Record<string, { description: string; permCount: number; color: string }> =\n {\n admin: {\n description: 'Full system access with all permissions',\n permCount: 11,\n color: 'bg-status-error-bg-subtle text-status-error-text',\n },\n manager: {\n description: 'Department-level management and reporting',\n permCount: 6,\n color: 'bg-status-info-bg-subtle text-status-info-text',\n },\n technician: {\n description: 'Asset maintenance and operational tasks',\n permCount: 4,\n color: 'bg-status-success-bg-subtle text-status-success-text',\n },\n viewer: {\n description: 'Read-only access to assets and reports',\n permCount: 2,\n color: 'bg-bg-sunken text-text-secondary',\n },\n auditor: {\n description: 'Audit trail access and compliance reporting',\n permCount: 4,\n color: 'bg-action-primary-bg/10 text-action-primary-bg',\n },\n };\n\nconst permissionMatrix = [\n {\n module: 'Assets',\n admin: 'Full',\n manager: 'Full',\n technician: 'Read/Update',\n viewer: 'Read',\n auditor: 'Read',\n },\n { module: 'Users', admin: 'Full', manager: 'Read', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Reports',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: 'Read',\n auditor: 'Full',\n },\n {\n module: 'Maintenance',\n admin: 'Full',\n manager: 'Full',\n technician: 'Full',\n viewer: '—',\n auditor: '—',\n },\n { module: 'Audit', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: 'Full' },\n {\n module: 'Compliance',\n admin: 'Full',\n manager: 'Read',\n technician: '—',\n viewer: '—',\n auditor: 'Full',\n },\n { module: 'Settings', admin: 'Full', manager: '—', technician: '—', viewer: '—', auditor: '—' },\n {\n module: 'Finance',\n admin: 'Full',\n manager: 'Full',\n technician: '—',\n viewer: 'Read',\n auditor: 'Read',\n },\n];\n\nconst RECENT_LOGIN_CUTOFF = Date.now() - 86400000;\n\nexport function UsersUserManagementHubPage() {\n const navigate = useNavigate();\n const { users } = useAssetHandlerStore();\n\n const activeUsers = users.filter((u) => u.status === 'active').length;\n const recentActivityCount = users.filter(\n (u) => new Date(u.lastLogin).getTime() > RECENT_LOGIN_CUTOFF\n ).length;\n const roleCounts = users.reduce<Record<string, number>>((acc, u) => {\n acc[u.role] = (acc[u.role] || 0) + 1;\n return acc;\n }, {});\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>User Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Manage users, roles, and access permissions across the organization.\n </p>\n </div>\n <CTAOverflowMenu\n primary={{ label: 'Add User', onSelect: () => {}, icon: <Plus className=\"h-4 w-4\" /> }}\n actions={[\n { label: 'Bulk Import', onSelect: () => {}, icon: <Upload className=\"h-4 w-4\" /> },\n { label: 'Export', onSelect: () => {}, icon: <Download className=\"h-4 w-4\" /> },\n ]}\n />\n </div>\n\n <PagePurpose>\n Control who can do what across Asset Handler. Add and offboard users, assign roles, and\n review the permission matrix so people see exactly the assets, reports and actions their job\n needs — keeping access least-privilege and audit-friendly.\n </PagePurpose>\n\n <NextSteps\n storageKey=\"assethandler-users-hub\"\n steps={[\n {\n id: 'add-user',\n label: 'Add a user',\n description: 'Invite a teammate and assign their starting role.',\n onClick: () => navigate('/users/user-create'),\n },\n {\n id: 'directory',\n label: 'Browse the user directory',\n description: 'See everyone, their status and assigned assets.',\n onClick: () => navigate('/users'),\n },\n {\n id: 'audit',\n label: 'Check the audit trail',\n description: 'See who accessed or changed assets recently.',\n onClick: () => navigate('/audit-trail'),\n },\n ]}\n />\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\">Total Users</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\">Active</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 <p className=\"text-xs text-text-secondary\">\n {Math.round((activeUsers / users.length) * 100)}% of total\n </p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Roles Defined</CardTitle>\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {Object.keys(roleDescriptions).length}\n </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\">Recent Activity</CardTitle>\n <Activity className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{recentActivityCount}</div>\n <p className=\"text-xs text-text-secondary\">Logged in last 24h</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <Tabs defaultValue=\"users\">\n <TabsList>\n <TabsTrigger value=\"users\">Users</TabsTrigger>\n <TabsTrigger value=\"roles\">Roles</TabsTrigger>\n <TabsTrigger value=\"permissions\">Permissions Matrix</TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"users\" className=\"mt-4\">\n {users.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No users yet\"\n description=\"Add your first user to start managing access to Asset Handler.\"\n action={\n <Button size=\"sm\" onClick={() => navigate('/users/user-create')}>\n <Plus className=\"mr-2 h-4 w-4\" />\n Add User\n </Button>\n }\n />\n ) : (\n <Card>\n <CardContent className=\"pt-6\">\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Name</TableHead>\n <TableHead>Email</TableHead>\n <TableHead>Role</TableHead>\n <TableHead>Department</TableHead>\n <TableHead>Status</TableHead>\n <TableHead className=\"text-right\">Assets</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {users.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={user.role === 'admin' ? 'destructive' : 'secondary'}>\n {user.role}\n </Badge>\n </TableCell>\n <TableCell>{user.department}</TableCell>\n <TableCell>\n <Badge variant={user.status === 'active' ? 'default' : 'outline'}>\n {user.status}\n </Badge>\n </TableCell>\n <TableCell className=\"text-right\">{user.assetsAssigned}</TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n )}\n </TabsContent>\n\n <TabsContent value=\"roles\" className=\"mt-4\">\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {Object.entries(roleDescriptions).map(([role, info]) => (\n <Card key={role}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-lg capitalize\">{role}</CardTitle>\n <Badge variant=\"outline\">{roleCounts[role] || 0} users</Badge>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">{info.description}</p>\n <div className=\"flex items-center gap-2 text-sm\">\n <Key className=\"h-4 w-4 text-text-secondary\" />\n <span>{info.permCount} permissions</span>\n </div>\n <Button variant=\"outline\" size=\"sm\" className=\"w-full\">\n Edit Role\n </Button>\n </CardContent>\n </Card>\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"permissions\" className=\"mt-4\">\n <Card>\n <CardHeader>\n <CardTitle>Permission Matrix</CardTitle>\n </CardHeader>\n <CardContent>\n <Table>\n <TableHeader>\n <TableRow>\n <TableHead>Module</TableHead>\n <TableHead>Admin</TableHead>\n <TableHead>Manager</TableHead>\n <TableHead>Technician</TableHead>\n <TableHead>Viewer</TableHead>\n <TableHead>Auditor</TableHead>\n </TableRow>\n </TableHeader>\n <TableBody>\n {permissionMatrix.map((row) => (\n <TableRow key={row.module}>\n <TableCell className=\"font-medium\">{row.module}</TableCell>\n <TableCell>\n <Badge\n variant={row.admin === 'Full' ? 'default' : 'outline'}\n className=\"text-xs\"\n >\n {row.admin}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.manager === 'Full'\n ? 'default'\n : row.manager === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.manager}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.technician === 'Full'\n ? 'default'\n : row.technician === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.technician}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={row.viewer === '—' ? 'outline' : 'secondary'}\n className=\"text-xs\"\n >\n {row.viewer}\n </Badge>\n </TableCell>\n <TableCell>\n <Badge\n variant={\n row.auditor === 'Full'\n ? 'default'\n : row.auditor === '—'\n ? 'outline'\n : 'secondary'\n }\n className=\"text-xs\"\n >\n {row.auditor}\n </Badge>\n </TableCell>\n </TableRow>\n ))}\n </TableBody>\n </Table>\n </CardContent>\n </Card>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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"}
|