@burdenoff/microfe-crewfoundry 2026.704.2 → 2026.704.4
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/crewfoundry/pages/AdminAdminPagePage.js +76 -75
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +118 -117
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +115 -114
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +105 -104
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +52 -51
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +94 -93
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +97 -96
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +68 -67
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +96 -95
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +153 -152
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +107 -106
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +77 -76
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +80 -79
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +102 -101
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +64 -63
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +96 -95
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +127 -126
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +118 -117
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +123 -122
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +77 -76
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +49 -48
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +62 -61
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +72 -71
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +70 -69
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +57 -56
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +58 -57
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +122 -121
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +70 -69
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +41 -40
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +65 -64
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +75 -74
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +60 -59
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +53 -52
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +37 -36
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +62 -61
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +50 -49
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +72 -71
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +40 -39
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +130 -129
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +60 -59
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +177 -146
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/formatEnumLabel.js +8 -0
- package/dist/crewfoundry/utils/formatEnumLabel.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,46 +1,47 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
|
+
import { useMemo as n } from "react";
|
|
4
|
+
import { Activity as r, Database as i, Globe as a, Lock as o, Monitor as s, Server as c, Shield as l, UserCheck as u, Users as d, Wrench as f } from "lucide-react";
|
|
5
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as h, Button as g, Card as _, CardContent as v, CardDescription as y, CardHeader as b, CardTitle as x, GlassCard as S, GradientText as C, IllustratedEmptyState as w, PagePurpose as T, ResponsiveTable as E } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/crewfoundry/pages/AdminAdminPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { employees:
|
|
9
|
-
let e =
|
|
8
|
+
function D() {
|
|
9
|
+
let { employees: D, departments: O, notifications: k, payrollRecords: A, jobPostings: j } = e(), M = n(() => {
|
|
10
|
+
let e = k.some((e) => e.type === "warning"), t = k.some((e) => e.type === "error");
|
|
10
11
|
return [
|
|
11
12
|
{
|
|
12
13
|
name: "Authentication",
|
|
13
14
|
status: "operational",
|
|
14
|
-
icon:
|
|
15
|
+
icon: o
|
|
15
16
|
},
|
|
16
17
|
{
|
|
17
18
|
name: "Employee Directory",
|
|
18
19
|
status: "operational",
|
|
19
|
-
icon:
|
|
20
|
+
icon: d
|
|
20
21
|
},
|
|
21
22
|
{
|
|
22
23
|
name: "Payroll Engine",
|
|
23
|
-
status:
|
|
24
|
-
icon:
|
|
24
|
+
status: A.some((e) => e.status === "failed") ? "degraded" : "operational",
|
|
25
|
+
icon: i
|
|
25
26
|
},
|
|
26
27
|
{
|
|
27
28
|
name: "Recruitment ATS",
|
|
28
29
|
status: "operational",
|
|
29
|
-
icon:
|
|
30
|
+
icon: a
|
|
30
31
|
},
|
|
31
32
|
{
|
|
32
33
|
name: "Analytics Pipeline",
|
|
33
34
|
status: e || t ? "degraded" : "operational",
|
|
34
|
-
icon:
|
|
35
|
+
icon: r
|
|
35
36
|
},
|
|
36
37
|
{
|
|
37
38
|
name: "Notification Service",
|
|
38
39
|
status: t ? "degraded" : "operational",
|
|
39
|
-
icon:
|
|
40
|
+
icon: s
|
|
40
41
|
}
|
|
41
42
|
];
|
|
42
|
-
}, [
|
|
43
|
-
let e =
|
|
43
|
+
}, [k, A]), N = n(() => {
|
|
44
|
+
let e = D.filter((e) => e.position.toLowerCase().includes("manager")).length, t = D.filter((e) => e.position.toLowerCase().includes("lead")).length, n = j.filter((e) => e.status === "active").length;
|
|
44
45
|
return [
|
|
45
46
|
{
|
|
46
47
|
role: "HR Manager",
|
|
@@ -59,150 +60,150 @@ function E() {
|
|
|
59
60
|
},
|
|
60
61
|
{
|
|
61
62
|
role: "Employee",
|
|
62
|
-
count: Math.max(0,
|
|
63
|
+
count: Math.max(0, D.length - e - t),
|
|
63
64
|
permissions: "Self-service, directory, learning"
|
|
64
65
|
}
|
|
65
66
|
];
|
|
66
|
-
}, [
|
|
67
|
-
return /* @__PURE__ */
|
|
67
|
+
}, [D, j]), P = M.filter((e) => e.status === "operational").length, F = D.filter((e) => e.status === "active").length, I = Math.round(P / Math.max(M.length, 1) * 100);
|
|
68
|
+
return /* @__PURE__ */ m("div", {
|
|
68
69
|
className: "space-y-6 p-6",
|
|
69
70
|
children: [
|
|
70
|
-
/* @__PURE__ */
|
|
71
|
+
/* @__PURE__ */ m("div", {
|
|
71
72
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
|
|
72
|
-
children: [/* @__PURE__ */
|
|
73
|
-
/* @__PURE__ */
|
|
73
|
+
children: [/* @__PURE__ */ m("div", { children: [
|
|
74
|
+
/* @__PURE__ */ p("h1", {
|
|
74
75
|
className: "text-2xl font-semibold",
|
|
75
|
-
children: /* @__PURE__ */
|
|
76
|
+
children: /* @__PURE__ */ p(C, { children: "Administration" })
|
|
76
77
|
}),
|
|
77
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ p("p", {
|
|
78
79
|
className: "text-sm text-text-secondary",
|
|
79
80
|
children: "System administration and access management"
|
|
80
81
|
}),
|
|
81
|
-
/* @__PURE__ */
|
|
82
|
+
/* @__PURE__ */ p(T, {
|
|
82
83
|
className: "mt-1",
|
|
83
84
|
children: "Manage organization-wide settings, roles, and system controls from one place — use it to onboard admins, adjust permissions, and keep your CrewFoundry workspace secure and compliant."
|
|
84
85
|
})
|
|
85
|
-
] }), /* @__PURE__ */
|
|
86
|
+
] }), /* @__PURE__ */ m("div", {
|
|
86
87
|
className: "flex gap-2",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
88
|
+
children: [/* @__PURE__ */ m(g, {
|
|
88
89
|
variant: "outline",
|
|
89
90
|
size: "sm",
|
|
90
91
|
disabled: !0,
|
|
91
92
|
"aria-label": "System settings (coming soon)",
|
|
92
93
|
title: "System settings are coming soon",
|
|
93
|
-
children: [/* @__PURE__ */ f
|
|
94
|
-
}), /* @__PURE__ */
|
|
94
|
+
children: [/* @__PURE__ */ p(f, { className: "mr-1 h-4 w-4" }), "System Settings"]
|
|
95
|
+
}), /* @__PURE__ */ m(g, {
|
|
95
96
|
size: "sm",
|
|
96
97
|
disabled: !0,
|
|
97
98
|
"aria-label": "Security controls (coming soon)",
|
|
98
99
|
title: "Security controls are coming soon",
|
|
99
|
-
children: [/* @__PURE__ */
|
|
100
|
+
children: [/* @__PURE__ */ p(l, { className: "mr-1 h-4 w-4" }), "Security"]
|
|
100
101
|
})]
|
|
101
102
|
})]
|
|
102
103
|
}),
|
|
103
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ m("div", {
|
|
104
105
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
105
106
|
children: [
|
|
106
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ m(S, {
|
|
107
108
|
treatment: "glass",
|
|
108
109
|
glow: !0,
|
|
109
110
|
className: "border-border-seam",
|
|
110
|
-
children: [/* @__PURE__ */
|
|
111
|
+
children: [/* @__PURE__ */ m(b, {
|
|
111
112
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
113
|
+
children: [/* @__PURE__ */ p(x, {
|
|
113
114
|
className: "text-sm font-medium",
|
|
114
115
|
children: "Total Users"
|
|
115
|
-
}), /* @__PURE__ */
|
|
116
|
-
}), /* @__PURE__ */
|
|
116
|
+
}), /* @__PURE__ */ p(d, { className: "h-4 w-4 text-text-secondary" })]
|
|
117
|
+
}), /* @__PURE__ */ m(v, { children: [/* @__PURE__ */ p("div", {
|
|
117
118
|
className: "text-2xl font-bold tabular-nums",
|
|
118
|
-
children:
|
|
119
|
-
}), /* @__PURE__ */
|
|
119
|
+
children: D.length
|
|
120
|
+
}), /* @__PURE__ */ m("p", {
|
|
120
121
|
className: "text-xs text-text-secondary",
|
|
121
|
-
children: [
|
|
122
|
+
children: [O.length, " departments"]
|
|
122
123
|
})] })]
|
|
123
124
|
}),
|
|
124
|
-
/* @__PURE__ */
|
|
125
|
+
/* @__PURE__ */ m(S, {
|
|
125
126
|
treatment: "metric",
|
|
126
127
|
className: "border-border-seam",
|
|
127
|
-
children: [/* @__PURE__ */
|
|
128
|
+
children: [/* @__PURE__ */ m(b, {
|
|
128
129
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
129
|
-
children: [/* @__PURE__ */
|
|
130
|
+
children: [/* @__PURE__ */ p(x, {
|
|
130
131
|
className: "text-sm font-medium",
|
|
131
132
|
children: "Active Users"
|
|
132
|
-
}), /* @__PURE__ */
|
|
133
|
-
}), /* @__PURE__ */
|
|
133
|
+
}), /* @__PURE__ */ p(u, { className: "h-4 w-4 text-text-secondary" })]
|
|
134
|
+
}), /* @__PURE__ */ m(v, { children: [/* @__PURE__ */ p("div", {
|
|
134
135
|
className: "text-2xl font-bold tabular-nums",
|
|
135
|
-
children:
|
|
136
|
-
}), /* @__PURE__ */
|
|
136
|
+
children: F
|
|
137
|
+
}), /* @__PURE__ */ p("p", {
|
|
137
138
|
className: "text-xs text-text-secondary",
|
|
138
139
|
children: "Currently active employees"
|
|
139
140
|
})] })]
|
|
140
141
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ m(S, {
|
|
142
143
|
treatment: "metric",
|
|
143
144
|
className: "border-border-seam",
|
|
144
|
-
children: [/* @__PURE__ */
|
|
145
|
+
children: [/* @__PURE__ */ m(b, {
|
|
145
146
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
146
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ p(x, {
|
|
147
148
|
className: "text-sm font-medium",
|
|
148
149
|
children: "Operational Modules"
|
|
149
|
-
}), /* @__PURE__ */
|
|
150
|
-
}), /* @__PURE__ */
|
|
150
|
+
}), /* @__PURE__ */ p(c, { className: "h-4 w-4 text-text-secondary" })]
|
|
151
|
+
}), /* @__PURE__ */ m(v, { children: [/* @__PURE__ */ m("div", {
|
|
151
152
|
className: "text-2xl font-bold tabular-nums",
|
|
152
153
|
children: [
|
|
153
|
-
|
|
154
|
+
P,
|
|
154
155
|
"/",
|
|
155
|
-
|
|
156
|
+
M.length
|
|
156
157
|
]
|
|
157
|
-
}), /* @__PURE__ */
|
|
158
|
+
}), /* @__PURE__ */ p("p", {
|
|
158
159
|
className: "text-xs text-text-secondary",
|
|
159
160
|
children: "Modules reporting healthy"
|
|
160
161
|
})] })]
|
|
161
162
|
}),
|
|
162
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ m(S, {
|
|
163
164
|
treatment: "metric",
|
|
164
165
|
className: "border-border-seam",
|
|
165
|
-
children: [/* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ m(b, {
|
|
166
167
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
167
|
-
children: [/* @__PURE__ */
|
|
168
|
+
children: [/* @__PURE__ */ p(x, {
|
|
168
169
|
className: "text-sm font-medium",
|
|
169
170
|
children: "Security Score"
|
|
170
|
-
}), /* @__PURE__ */
|
|
171
|
-
}), /* @__PURE__ */
|
|
171
|
+
}), /* @__PURE__ */ p(l, { className: "h-4 w-4 text-text-secondary" })]
|
|
172
|
+
}), /* @__PURE__ */ m(v, { children: [/* @__PURE__ */ m("div", {
|
|
172
173
|
className: "text-2xl font-bold tabular-nums",
|
|
173
|
-
children: [
|
|
174
|
-
}), /* @__PURE__ */
|
|
174
|
+
children: [I, "/100"]
|
|
175
|
+
}), /* @__PURE__ */ p("p", {
|
|
175
176
|
className: "text-xs text-status-success-text",
|
|
176
177
|
children: "Derived from module health checks"
|
|
177
178
|
})] })]
|
|
178
179
|
})
|
|
179
180
|
]
|
|
180
181
|
}),
|
|
181
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ m("div", {
|
|
182
183
|
className: "grid gap-4 md:grid-cols-2",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
184
|
+
children: [/* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m(b, { children: [/* @__PURE__ */ p(x, { children: "System Status" }), /* @__PURE__ */ p(y, { children: "Module health derived from live workspace signals" })] }), /* @__PURE__ */ p(v, {
|
|
184
185
|
className: "space-y-3",
|
|
185
|
-
children:
|
|
186
|
+
children: M.map((e) => /* @__PURE__ */ m("div", {
|
|
186
187
|
className: "flex items-center justify-between rounded border p-3",
|
|
187
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ m("div", {
|
|
188
189
|
className: "flex items-center gap-3",
|
|
189
|
-
children: [/* @__PURE__ */
|
|
190
|
+
children: [/* @__PURE__ */ p(e.icon, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ p("span", {
|
|
190
191
|
className: "text-sm font-medium",
|
|
191
192
|
children: e.name
|
|
192
193
|
})]
|
|
193
|
-
}), /* @__PURE__ */
|
|
194
|
+
}), /* @__PURE__ */ p(h, {
|
|
194
195
|
variant: e.status === "operational" ? "default" : "destructive",
|
|
195
196
|
className: "text-[10px]",
|
|
196
|
-
children: e.status
|
|
197
|
+
children: t(e.status)
|
|
197
198
|
})]
|
|
198
199
|
}, e.name))
|
|
199
|
-
})] }), /* @__PURE__ */
|
|
200
|
+
})] }), /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m(b, { children: [/* @__PURE__ */ p(x, { children: "User Roles" }), /* @__PURE__ */ p(y, { children: "Role distribution and permissions" })] }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(E, {
|
|
200
201
|
columns: [
|
|
201
202
|
{
|
|
202
203
|
key: "role",
|
|
203
204
|
header: "Role",
|
|
204
205
|
priority: "primary",
|
|
205
|
-
cell: (e) => /* @__PURE__ */
|
|
206
|
+
cell: (e) => /* @__PURE__ */ p("span", {
|
|
206
207
|
className: "font-medium",
|
|
207
208
|
children: e.role
|
|
208
209
|
})
|
|
@@ -211,7 +212,7 @@ function E() {
|
|
|
211
212
|
key: "count",
|
|
212
213
|
header: "Users",
|
|
213
214
|
priority: "primary",
|
|
214
|
-
cell: (e) => /* @__PURE__ */
|
|
215
|
+
cell: (e) => /* @__PURE__ */ p("span", {
|
|
215
216
|
className: "md:block md:text-right",
|
|
216
217
|
children: e.count
|
|
217
218
|
})
|
|
@@ -220,17 +221,17 @@ function E() {
|
|
|
220
221
|
key: "permissions",
|
|
221
222
|
header: "Permissions",
|
|
222
223
|
priority: "secondary",
|
|
223
|
-
cell: (e) => /* @__PURE__ */
|
|
224
|
+
cell: (e) => /* @__PURE__ */ p("span", {
|
|
224
225
|
className: "text-xs text-text-secondary",
|
|
225
226
|
children: e.permissions
|
|
226
227
|
})
|
|
227
228
|
}
|
|
228
229
|
],
|
|
229
|
-
data:
|
|
230
|
+
data: N,
|
|
230
231
|
rowKey: (e) => e.role
|
|
231
232
|
}) })] })]
|
|
232
233
|
}),
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ m(_, { children: [/* @__PURE__ */ m(b, { children: [/* @__PURE__ */ p(x, { children: "Recent Audit Log" }), /* @__PURE__ */ p(y, { children: "System activity and security events" })] }), /* @__PURE__ */ p(v, { children: /* @__PURE__ */ p(w, {
|
|
234
235
|
illustration: "empty-data",
|
|
235
236
|
title: "Audit log coming soon",
|
|
236
237
|
description: "A verified trail of real system and security events will appear here once audit-log integration is connected."
|
|
@@ -239,6 +240,6 @@ function E() {
|
|
|
239
240
|
});
|
|
240
241
|
}
|
|
241
242
|
//#endregion
|
|
242
|
-
export {
|
|
243
|
+
export { D as AdminAdminPagePage };
|
|
243
244
|
|
|
244
245
|
//# sourceMappingURL=AdminAdminPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdminAdminPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AdminAdminPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Activity,\n Database,\n Globe,\n Lock,\n Monitor,\n Server,\n Shield,\n UserCheck,\n Users,\n Wrench,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype SystemModule = {\n name: string;\n status: 'operational' | 'degraded';\n icon: typeof Lock;\n};\n\ntype UserRole = {\n role: string;\n count: number;\n permissions: string;\n};\n\nexport function AdminAdminPagePage() {\n const { employees, departments, notifications, payrollRecords, jobPostings } =\n useCrewFoundryStore();\n\n const systemModules = useMemo<SystemModule[]>(() => {\n const hasWarning = notifications.some((notification) => notification.type === 'warning');\n const hasError = notifications.some((notification) => notification.type === 'error');\n\n return [\n { name: 'Authentication', status: 'operational', icon: Lock },\n { name: 'Employee Directory', status: 'operational', icon: Users },\n {\n name: 'Payroll Engine',\n status: payrollRecords.some((record) => record.status === 'failed')\n ? 'degraded'\n : 'operational',\n icon: Database,\n },\n { name: 'Recruitment ATS', status: 'operational', icon: Globe },\n {\n name: 'Analytics Pipeline',\n status: hasWarning || hasError ? 'degraded' : 'operational',\n icon: Activity,\n },\n {\n name: 'Notification Service',\n status: hasError ? 'degraded' : 'operational',\n icon: Monitor,\n },\n ];\n }, [notifications, payrollRecords]);\n\n // Role distribution derived from real employee positions and active postings.\n const userRoles = useMemo<UserRole[]>(() => {\n const managers = employees.filter((employee) =>\n employee.position.toLowerCase().includes('manager')\n ).length;\n const leads = employees.filter((employee) =>\n employee.position.toLowerCase().includes('lead')\n ).length;\n const recruiters = jobPostings.filter((posting) => posting.status === 'active').length;\n return [\n {\n role: 'HR Manager',\n count: Math.max(1, managers),\n permissions: 'Employee, payroll, leave management',\n },\n {\n role: 'Hiring Manager',\n count: Math.max(1, recruiters),\n permissions: 'Job postings, candidates, interviews',\n },\n {\n role: 'Department Lead',\n count: Math.max(1, leads),\n permissions: 'Team management, reports',\n },\n {\n role: 'Employee',\n count: Math.max(0, employees.length - managers - leads),\n permissions: 'Self-service, directory, learning',\n },\n ];\n }, [employees, jobPostings]);\n\n const operationalModules = systemModules.filter(\n (module) => module.status === 'operational'\n ).length;\n const activeUsers = employees.filter((employee) => employee.status === 'active').length;\n const securityScore = Math.round((operationalModules / Math.max(systemModules.length, 1)) * 100);\n\n const roleColumns: ResponsiveTableColumn<UserRole>[] = [\n {\n key: 'role',\n header: 'Role',\n priority: 'primary',\n cell: (role) => <span className=\"font-medium\">{role.role}</span>,\n },\n {\n key: 'count',\n header: 'Users',\n priority: 'primary',\n cell: (role) => <span className=\"md:block md:text-right\">{role.count}</span>,\n },\n {\n key: 'permissions',\n header: 'Permissions',\n priority: 'secondary',\n cell: (role) => <span className=\"text-xs text-text-secondary\">{role.permissions}</span>,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Administration</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">System administration and access management</p>\n <PagePurpose className=\"mt-1\">\n Manage organization-wide settings, roles, and system controls from one place — use it to\n onboard admins, adjust permissions, and keep your CrewFoundry workspace secure and\n compliant.\n </PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled\n aria-label=\"System settings (coming soon)\"\n title=\"System settings are coming soon\"\n >\n <Wrench className=\"mr-1 h-4 w-4\" />\n System Settings\n </Button>\n <Button\n size=\"sm\"\n disabled\n aria-label=\"Security controls (coming soon)\"\n title=\"Security controls are coming soon\"\n >\n <Shield className=\"mr-1 h-4 w-4\" />\n Security\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg: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\">{employees.length}</div>\n <p className=\"text-xs text-text-secondary\">{departments.length} departments</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\">Active Users</CardTitle>\n <UserCheck className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeUsers}</div>\n <p className=\"text-xs text-text-secondary\">Currently active employees</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\">Operational Modules</CardTitle>\n <Server className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {operationalModules}/{systemModules.length}\n </div>\n <p className=\"text-xs text-text-secondary\">Modules reporting healthy</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\">Security Score</CardTitle>\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{securityScore}/100</div>\n <p className=\"text-xs text-status-success-text\">Derived from module health checks</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>System Status</CardTitle>\n <CardDescription>Module health derived from live workspace signals</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {systemModules.map((module) => (\n <div\n key={module.name}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <module.icon className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm font-medium\">{module.name}</span>\n </div>\n <Badge\n variant={module.status === 'operational' ? 'default' : 'destructive'}\n className=\"text-[10px]\"\n >\n {module.status}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>User Roles</CardTitle>\n <CardDescription>Role distribution and permissions</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable columns={roleColumns} data={userRoles} rowKey={(role) => role.role} />\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Audit Log</CardTitle>\n <CardDescription>System activity and security events</CardDescription>\n </CardHeader>\n <CardContent>\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"Audit log coming soon\"\n description=\"A verified trail of real system and security events will appear here once audit-log integration is connected.\"\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AA0CA,SAAgB,IAAqB;CACnC,IAAM,EAAE,cAAW,gBAAa,kBAAe,mBAAgB,mBAC7D,GAAqB,EAEjB,IAAgB,QAA8B;EAClD,IAAM,IAAa,EAAc,MAAM,MAAiB,EAAa,SAAS,UAAU,EAClF,IAAW,EAAc,MAAM,MAAiB,EAAa,SAAS,QAAQ;AAEpF,SAAO;GACL;IAAE,MAAM;IAAkB,QAAQ;IAAe,MAAM;IAAM;GAC7D;IAAE,MAAM;IAAsB,QAAQ;IAAe,MAAM;IAAO;GAClE;IACE,MAAM;IACN,QAAQ,EAAe,MAAM,MAAW,EAAO,WAAW,SAAS,GAC/D,aACA;IACJ,MAAM;IACP;GACD;IAAE,MAAM;IAAmB,QAAQ;IAAe,MAAM;IAAO;GAC/D;IACE,MAAM;IACN,QAAQ,KAAc,IAAW,aAAa;IAC9C,MAAM;IACP;GACD;IACE,MAAM;IACN,QAAQ,IAAW,aAAa;IAChC,MAAM;IACP;GACF;IACA,CAAC,GAAe,EAAe,CAAC,EAG7B,IAAY,QAA0B;EAC1C,IAAM,IAAW,EAAU,QAAQ,MACjC,EAAS,SAAS,aAAa,CAAC,SAAS,UAAU,CACpD,CAAC,QACI,IAAQ,EAAU,QAAQ,MAC9B,EAAS,SAAS,aAAa,CAAC,SAAS,OAAO,CACjD,CAAC,QACI,IAAa,EAAY,QAAQ,MAAY,EAAQ,WAAW,SAAS,CAAC;AAChF,SAAO;GACL;IACE,MAAM;IACN,OAAO,KAAK,IAAI,GAAG,EAAS;IAC5B,aAAa;IACd;GACD;IACE,MAAM;IACN,OAAO,KAAK,IAAI,GAAG,EAAW;IAC9B,aAAa;IACd;GACD;IACE,MAAM;IACN,OAAO,KAAK,IAAI,GAAG,EAAM;IACzB,aAAa;IACd;GACD;IACE,MAAM;IACN,OAAO,KAAK,IAAI,GAAG,EAAU,SAAS,IAAW,EAAM;IACvD,aAAa;IACd;GACF;IACA,CAAC,GAAW,EAAY,CAAC,EAEtB,IAAqB,EAAc,QACtC,MAAW,EAAO,WAAW,cAC/B,CAAC,QACI,IAAc,EAAU,QAAQ,MAAa,EAAS,WAAW,SAAS,CAAC,QAC3E,IAAgB,KAAK,MAAO,IAAqB,KAAK,IAAI,EAAc,QAAQ,EAAE,GAAI,IAAI;AAuBhG,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;MACxC,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAA+C,CAAA;KAC1F,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAIhB,CAAA;KACV,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MACE,SAAQ;MACR,MAAK;MACL,UAAA;MACA,cAAW;MACX,OAAM;gBALR,CAOE,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,kBAE5B;SACT,kBAAC,GAAD;MACE,MAAK;MACL,UAAA;MACA,cAAW;MACX,OAAM;gBAJR,CAME,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,WAE5B;QACL;OACF;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAuB,CAAA,EAClE,kBAAC,GAAD,EAAO,WAAU,+BAAgC,CAAA,CACtC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC,EAAU;OAAa,CAAA,EACzE,kBAAC,KAAD;OAAG,WAAU;iBAAb,CAA4C,EAAY,QAAO,eAAgB;SACnE,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAwB,CAAA,EACnE,kBAAC,GAAD,EAAW,WAAU,+BAAgC,CAAA,CAC1C;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC;OAAkB,CAAA,EACpE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAA8B,CAAA,CAC7D,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAA+B,CAAA,EAC1E,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,CACvC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACG;QAAmB;QAAE,EAAc;QAChC;UACN,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAA6B,CAAA,CAC5D,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAA0B,CAAA,EACrE,kBAAC,GAAD,EAAQ,WAAU,+BAAgC,CAAA,CACvC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CAAkD,GAAc,OAAU;UAC1E,kBAAC,KAAD;OAAG,WAAU;iBAAmC;OAAqC,CAAA,CACzE,EAAA,CAAA,CACJ;;KACR;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,iBAAyB,CAAA,EACpC,kBAAC,GAAD,EAAA,UAAiB,qDAAmE,CAAA,CACzE,EAAA,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eACpB,EAAc,KAAK,MAClB,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,EAAO,MAAR,EAAa,WAAU,+BAAgC,CAAA,EACvD,kBAAC,QAAD;QAAM,WAAU;kBAAuB,EAAO;QAAY,CAAA,CACtD;UACN,kBAAC,GAAD;OACE,SAAS,EAAO,WAAW,gBAAgB,YAAY;OACvD,WAAU;iBAET,EAAO;OACF,CAAA,CACJ;QAbC,EAAO,KAaR,CACN;KACU,CAAA,CACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,cAAsB,CAAA,EACjC,kBAAC,GAAD,EAAA,UAAiB,qCAAmD,CAAA,CACzD,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KAAiB,SAxI4B;MACrD;OACE,KAAK;OACL,QAAQ;OACR,UAAU;OACV,OAAO,MAAS,kBAAC,QAAD;QAAM,WAAU;kBAAe,EAAK;QAAY,CAAA;OACjE;MACD;OACE,KAAK;OACL,QAAQ;OACR,UAAU;OACV,OAAO,MAAS,kBAAC,QAAD;QAAM,WAAU;kBAA0B,EAAK;QAAa,CAAA;OAC7E;MACD;OACE,KAAK;OACL,QAAQ;OACR,UAAU;OACV,OAAO,MAAS,kBAAC,QAAD;QAAM,WAAU;kBAA+B,EAAK;QAAmB,CAAA;OACxF;MACF;KAqHgD,MAAM;KAAW,SAAS,MAAS,EAAK;KAAQ,CAAA,EAC3E,CAAA,CACT,EAAA,CAAA,CACH;;GAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,oBAA4B,CAAA,EACvC,kBAAC,GAAD,EAAA,UAAiB,uCAAqD,CAAA,CAC3D,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IACE,cAAa;IACb,OAAM;IACN,aAAY;IACZ,CAAA,EACU,CAAA,CACT,EAAA,CAAA;GACH"}
|
|
1
|
+
{"version":3,"file":"AdminAdminPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AdminAdminPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Activity,\n Database,\n Globe,\n Lock,\n Monitor,\n Server,\n Shield,\n UserCheck,\n Users,\n Wrench,\n} from 'lucide-react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\ntype SystemModule = {\n name: string;\n status: 'operational' | 'degraded';\n icon: typeof Lock;\n};\n\ntype UserRole = {\n role: string;\n count: number;\n permissions: string;\n};\n\nexport function AdminAdminPagePage() {\n const { employees, departments, notifications, payrollRecords, jobPostings } =\n useCrewFoundryStore();\n\n const systemModules = useMemo<SystemModule[]>(() => {\n const hasWarning = notifications.some((notification) => notification.type === 'warning');\n const hasError = notifications.some((notification) => notification.type === 'error');\n\n return [\n { name: 'Authentication', status: 'operational', icon: Lock },\n { name: 'Employee Directory', status: 'operational', icon: Users },\n {\n name: 'Payroll Engine',\n status: payrollRecords.some((record) => record.status === 'failed')\n ? 'degraded'\n : 'operational',\n icon: Database,\n },\n { name: 'Recruitment ATS', status: 'operational', icon: Globe },\n {\n name: 'Analytics Pipeline',\n status: hasWarning || hasError ? 'degraded' : 'operational',\n icon: Activity,\n },\n {\n name: 'Notification Service',\n status: hasError ? 'degraded' : 'operational',\n icon: Monitor,\n },\n ];\n }, [notifications, payrollRecords]);\n\n // Role distribution derived from real employee positions and active postings.\n const userRoles = useMemo<UserRole[]>(() => {\n const managers = employees.filter((employee) =>\n employee.position.toLowerCase().includes('manager')\n ).length;\n const leads = employees.filter((employee) =>\n employee.position.toLowerCase().includes('lead')\n ).length;\n const recruiters = jobPostings.filter((posting) => posting.status === 'active').length;\n return [\n {\n role: 'HR Manager',\n count: Math.max(1, managers),\n permissions: 'Employee, payroll, leave management',\n },\n {\n role: 'Hiring Manager',\n count: Math.max(1, recruiters),\n permissions: 'Job postings, candidates, interviews',\n },\n {\n role: 'Department Lead',\n count: Math.max(1, leads),\n permissions: 'Team management, reports',\n },\n {\n role: 'Employee',\n count: Math.max(0, employees.length - managers - leads),\n permissions: 'Self-service, directory, learning',\n },\n ];\n }, [employees, jobPostings]);\n\n const operationalModules = systemModules.filter(\n (module) => module.status === 'operational'\n ).length;\n const activeUsers = employees.filter((employee) => employee.status === 'active').length;\n const securityScore = Math.round((operationalModules / Math.max(systemModules.length, 1)) * 100);\n\n const roleColumns: ResponsiveTableColumn<UserRole>[] = [\n {\n key: 'role',\n header: 'Role',\n priority: 'primary',\n cell: (role) => <span className=\"font-medium\">{role.role}</span>,\n },\n {\n key: 'count',\n header: 'Users',\n priority: 'primary',\n cell: (role) => <span className=\"md:block md:text-right\">{role.count}</span>,\n },\n {\n key: 'permissions',\n header: 'Permissions',\n priority: 'secondary',\n cell: (role) => <span className=\"text-xs text-text-secondary\">{role.permissions}</span>,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Administration</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">System administration and access management</p>\n <PagePurpose className=\"mt-1\">\n Manage organization-wide settings, roles, and system controls from one place — use it to\n onboard admins, adjust permissions, and keep your CrewFoundry workspace secure and\n compliant.\n </PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n disabled\n aria-label=\"System settings (coming soon)\"\n title=\"System settings are coming soon\"\n >\n <Wrench className=\"mr-1 h-4 w-4\" />\n System Settings\n </Button>\n <Button\n size=\"sm\"\n disabled\n aria-label=\"Security controls (coming soon)\"\n title=\"Security controls are coming soon\"\n >\n <Shield className=\"mr-1 h-4 w-4\" />\n Security\n </Button>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg: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\">{employees.length}</div>\n <p className=\"text-xs text-text-secondary\">{departments.length} departments</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\">Active Users</CardTitle>\n <UserCheck className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeUsers}</div>\n <p className=\"text-xs text-text-secondary\">Currently active employees</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\">Operational Modules</CardTitle>\n <Server className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {operationalModules}/{systemModules.length}\n </div>\n <p className=\"text-xs text-text-secondary\">Modules reporting healthy</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\">Security Score</CardTitle>\n <Shield className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{securityScore}/100</div>\n <p className=\"text-xs text-status-success-text\">Derived from module health checks</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>System Status</CardTitle>\n <CardDescription>Module health derived from live workspace signals</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {systemModules.map((module) => (\n <div\n key={module.name}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div className=\"flex items-center gap-3\">\n <module.icon className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"text-sm font-medium\">{module.name}</span>\n </div>\n <Badge\n variant={module.status === 'operational' ? 'default' : 'destructive'}\n className=\"text-[10px]\"\n >\n {formatEnumLabel(module.status)}\n </Badge>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>User Roles</CardTitle>\n <CardDescription>Role distribution and permissions</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable columns={roleColumns} data={userRoles} rowKey={(role) => role.role} />\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Recent Audit Log</CardTitle>\n <CardDescription>System activity and security events</CardDescription>\n </CardHeader>\n <CardContent>\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"Audit log coming soon\"\n description=\"A verified trail of real system and security events will appear here once audit-log integration is connected.\"\n />\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|