@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +117 -164
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
|
-
import { Award as n, BarChart3 as r, Clock as i, MapPin as a, Star as o,
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Badge as
|
|
3
|
+
import { Award as n, BarChart3 as r, Clock as i, MapPin as a, Star as o, UserCheck as s } from "lucide-react";
|
|
4
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, IllustratedEmptyState as v, PagePurpose as y, ResponsiveTable as b } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { employees:
|
|
9
|
-
let e = Math.max(
|
|
7
|
+
function x() {
|
|
8
|
+
let { employees: x, departments: S } = e(), C = t(() => {
|
|
9
|
+
let e = Math.max(x.length, 1), t = (e) => Math.max(0, ((/* @__PURE__ */ new Date("2026-03-01")).getTime() - new Date(e).getTime()) / (1e3 * 60 * 60 * 24 * 365));
|
|
10
10
|
return [
|
|
11
11
|
{
|
|
12
12
|
range: "< 1 year",
|
|
@@ -34,7 +34,7 @@ function b() {
|
|
|
34
34
|
max: Infinity
|
|
35
35
|
}
|
|
36
36
|
].map((n) => {
|
|
37
|
-
let r =
|
|
37
|
+
let r = x.filter((e) => {
|
|
38
38
|
let r = t(e.startDate);
|
|
39
39
|
return r >= n.min && r < n.max;
|
|
40
40
|
}).length;
|
|
@@ -44,310 +44,278 @@ function b() {
|
|
|
44
44
|
percentage: Math.round(r / e * 100)
|
|
45
45
|
};
|
|
46
46
|
});
|
|
47
|
-
}, [
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
trend: "+0.2"
|
|
60
|
-
},
|
|
61
|
-
{
|
|
62
|
-
driver: "Career Growth",
|
|
63
|
-
score: Number((e.reduce((e, n) => e + (n.score > t ? 4.6 : 4), 0) / Math.max(e.length, 1)).toFixed(1)),
|
|
64
|
-
trend: "+0.1"
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
driver: "Compensation",
|
|
68
|
-
score: Number(n.toFixed(1)),
|
|
69
|
-
trend: "+0.2"
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
driver: "Management Quality",
|
|
73
|
-
score: Number((e.reduce((e, t) => e + Math.min(5, t.score + .4), 0) / Math.max(e.length, 1)).toFixed(1)),
|
|
74
|
-
trend: "+0.3"
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
driver: "Company Culture",
|
|
78
|
-
score: Number(Math.min(5, t + .5).toFixed(1)),
|
|
79
|
-
trend: "+0.2"
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
driver: "Learning Opportunities",
|
|
83
|
-
score: Number(Math.min(5, t + .3).toFixed(1)),
|
|
84
|
-
trend: "+0.4"
|
|
85
|
-
}
|
|
86
|
-
];
|
|
87
|
-
}, [x, b]), w = (b.reduce((e, t) => e + t.performanceScore, 0) / b.length).toFixed(1), T = Math.round(b.reduce((e, t) => e + t.salary, 0) / b.length), E = b.filter((e) => e.status === "active").length, D = b.filter((e) => e.status === "on_leave").length, O = x.map((e) => {
|
|
88
|
-
let t = b.filter((t) => t.department === e.name), n = t.length > 0 ? (t.reduce((e, t) => e + t.performanceScore, 0) / t.length).toFixed(1) : "0", r = t.length > 0 ? Math.round(t.reduce((e, t) => e + t.salary, 0) / t.length) : 0;
|
|
47
|
+
}, [x]), { avgTenure: w, medianTenure: T } = t(() => {
|
|
48
|
+
if (x.length === 0) return {
|
|
49
|
+
avgTenure: 0,
|
|
50
|
+
medianTenure: 0
|
|
51
|
+
};
|
|
52
|
+
let e = (e) => Math.max(0, ((/* @__PURE__ */ new Date("2026-03-01")).getTime() - new Date(e).getTime()) / (1e3 * 60 * 60 * 24 * 365)), t = x.map((t) => e(t.startDate)).sort((e, t) => e - t), n = t.reduce((e, t) => e + t, 0) / t.length, r = Math.floor(t.length / 2);
|
|
53
|
+
return {
|
|
54
|
+
avgTenure: n,
|
|
55
|
+
medianTenure: t.length % 2 == 1 ? t[r] : (t[r - 1] + t[r]) / 2
|
|
56
|
+
};
|
|
57
|
+
}, [x]), E = (x.reduce((e, t) => e + t.performanceScore, 0) / Math.max(x.length, 1)).toFixed(1), D = Math.round(x.reduce((e, t) => e + t.salary, 0) / Math.max(x.length, 1)), O = x.filter((e) => e.status === "active").length, k = x.filter((e) => e.status === "on_leave").length, A = S.map((e) => {
|
|
58
|
+
let t = x.filter((t) => t.department === e.name), n = t.length > 0 ? (t.reduce((e, t) => e + t.performanceScore, 0) / t.length).toFixed(1) : "0", r = t.length > 0 ? Math.round(t.reduce((e, t) => e + t.salary, 0) / t.length) : 0;
|
|
89
59
|
return {
|
|
90
60
|
name: e.name,
|
|
91
61
|
headcount: t.length,
|
|
92
62
|
avgScore: n,
|
|
93
63
|
avgSalary: r
|
|
94
64
|
};
|
|
95
|
-
}),
|
|
96
|
-
|
|
65
|
+
}), j = [...A].sort((e, t) => Number(t.avgScore) - Number(e.avgScore)), M = j[0], N = x.filter((e) => e.performanceScore < 3.5).length, P = A.filter((e) => e.headcount > 0), F = [...P].map((e) => e.avgSalary).sort((e, t) => e - t), I = F.length > 0 ? F[Math.floor(F.length / 2)] : 0, L = P.filter((e) => e.avgSalary < I).length, R = [
|
|
66
|
+
{
|
|
67
|
+
key: "name",
|
|
68
|
+
header: "Department",
|
|
69
|
+
priority: "primary",
|
|
70
|
+
cell: (e) => /* @__PURE__ */ c("span", {
|
|
71
|
+
className: "font-medium",
|
|
72
|
+
children: e.name
|
|
73
|
+
})
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
key: "headcount",
|
|
77
|
+
header: "Headcount",
|
|
78
|
+
priority: "secondary",
|
|
79
|
+
cell: (e) => /* @__PURE__ */ c("span", {
|
|
80
|
+
className: "md:block md:text-right",
|
|
81
|
+
children: e.headcount
|
|
82
|
+
})
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
key: "avgScore",
|
|
86
|
+
header: "Avg Score",
|
|
87
|
+
priority: "primary",
|
|
88
|
+
cell: (e) => /* @__PURE__ */ c("span", {
|
|
89
|
+
className: "md:block md:text-right",
|
|
90
|
+
children: /* @__PURE__ */ c(u, {
|
|
91
|
+
variant: Number(e.avgScore) >= 4.5 ? "default" : "secondary",
|
|
92
|
+
children: e.avgScore
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
key: "avgSalary",
|
|
98
|
+
header: "Avg Salary",
|
|
99
|
+
priority: "secondary",
|
|
100
|
+
cell: (e) => /* @__PURE__ */ l("span", {
|
|
101
|
+
className: "md:block md:text-right",
|
|
102
|
+
children: ["$", e.avgSalary.toLocaleString()]
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
], z = x.reduce((e, t) => (e[t.location] = (e[t.location] || 0) + 1, e), {});
|
|
106
|
+
return /* @__PURE__ */ l("div", {
|
|
97
107
|
className: "space-y-6 p-6",
|
|
98
108
|
children: [
|
|
99
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ c("div", {
|
|
100
110
|
className: "flex items-center justify-between",
|
|
101
|
-
children: /* @__PURE__ */
|
|
102
|
-
/* @__PURE__ */
|
|
111
|
+
children: /* @__PURE__ */ l("div", { children: [
|
|
112
|
+
/* @__PURE__ */ c("h1", {
|
|
103
113
|
className: "text-2xl font-semibold",
|
|
104
|
-
children: /* @__PURE__ */
|
|
114
|
+
children: /* @__PURE__ */ c(_, { children: "Employee Analytics" })
|
|
105
115
|
}),
|
|
106
|
-
/* @__PURE__ */
|
|
116
|
+
/* @__PURE__ */ c("p", {
|
|
107
117
|
className: "text-sm text-text-secondary",
|
|
108
118
|
children: "Deep-dive into employee performance, engagement, and demographics"
|
|
109
119
|
}),
|
|
110
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ c(y, {
|
|
111
121
|
className: "mt-1",
|
|
112
122
|
children: "See how individual employees and teams are performing over time — use these insights for reviews, recognition, and targeted coaching."
|
|
113
123
|
})
|
|
114
124
|
] })
|
|
115
125
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ l("div", {
|
|
117
127
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
118
128
|
children: [
|
|
119
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ l(g, {
|
|
120
130
|
treatment: "glass",
|
|
121
131
|
glow: !0,
|
|
122
132
|
className: "border-border-seam",
|
|
123
|
-
children: [/* @__PURE__ */
|
|
133
|
+
children: [/* @__PURE__ */ l(m, {
|
|
124
134
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
125
|
-
children: [/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ c(h, {
|
|
126
136
|
className: "text-sm font-medium",
|
|
127
137
|
children: "Active Employees"
|
|
128
|
-
}), /* @__PURE__ */
|
|
129
|
-
}), /* @__PURE__ */
|
|
138
|
+
}), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-text-secondary" })]
|
|
139
|
+
}), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c("div", {
|
|
130
140
|
className: "text-2xl font-bold tabular-nums",
|
|
131
|
-
children:
|
|
132
|
-
}), /* @__PURE__ */
|
|
141
|
+
children: O
|
|
142
|
+
}), /* @__PURE__ */ l("p", {
|
|
133
143
|
className: "text-xs text-text-secondary",
|
|
134
|
-
children: [
|
|
144
|
+
children: [k, " currently on leave"]
|
|
135
145
|
})] })]
|
|
136
146
|
}),
|
|
137
|
-
/* @__PURE__ */
|
|
147
|
+
/* @__PURE__ */ l(g, {
|
|
138
148
|
treatment: "metric",
|
|
139
149
|
className: "border-border-seam",
|
|
140
|
-
children: [/* @__PURE__ */
|
|
150
|
+
children: [/* @__PURE__ */ l(m, {
|
|
141
151
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
142
|
-
children: [/* @__PURE__ */
|
|
152
|
+
children: [/* @__PURE__ */ c(h, {
|
|
143
153
|
className: "text-sm font-medium",
|
|
144
154
|
children: "Avg Performance"
|
|
145
|
-
}), /* @__PURE__ */
|
|
146
|
-
}), /* @__PURE__ */
|
|
155
|
+
}), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-text-secondary" })]
|
|
156
|
+
}), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
|
|
147
157
|
className: "text-2xl font-bold tabular-nums",
|
|
148
|
-
children: [
|
|
149
|
-
}), /* @__PURE__ */
|
|
150
|
-
className: "
|
|
151
|
-
children: [
|
|
158
|
+
children: [E, "/5.0"]
|
|
159
|
+
}), /* @__PURE__ */ l("p", {
|
|
160
|
+
className: "text-xs text-text-secondary",
|
|
161
|
+
children: [
|
|
162
|
+
"Across ",
|
|
163
|
+
x.length,
|
|
164
|
+
" employees"
|
|
165
|
+
]
|
|
152
166
|
})] })]
|
|
153
167
|
}),
|
|
154
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ l(g, {
|
|
155
169
|
treatment: "metric",
|
|
156
170
|
className: "border-border-seam",
|
|
157
|
-
children: [/* @__PURE__ */
|
|
171
|
+
children: [/* @__PURE__ */ l(m, {
|
|
158
172
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
173
|
+
children: [/* @__PURE__ */ c(h, {
|
|
160
174
|
className: "text-sm font-medium",
|
|
161
175
|
children: "Avg Compensation"
|
|
162
|
-
}), /* @__PURE__ */
|
|
163
|
-
}), /* @__PURE__ */
|
|
176
|
+
}), /* @__PURE__ */ c(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
177
|
+
}), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
|
|
164
178
|
className: "text-2xl font-bold tabular-nums",
|
|
165
|
-
children: ["$",
|
|
166
|
-
}), /* @__PURE__ */
|
|
179
|
+
children: ["$", D.toLocaleString()]
|
|
180
|
+
}), /* @__PURE__ */ c("p", {
|
|
167
181
|
className: "text-xs text-text-secondary",
|
|
168
182
|
children: "Across all departments"
|
|
169
183
|
})] })]
|
|
170
184
|
}),
|
|
171
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ l(g, {
|
|
172
186
|
treatment: "metric",
|
|
173
187
|
className: "border-border-seam",
|
|
174
|
-
children: [/* @__PURE__ */
|
|
188
|
+
children: [/* @__PURE__ */ l(m, {
|
|
175
189
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
176
|
-
children: [/* @__PURE__ */
|
|
190
|
+
children: [/* @__PURE__ */ c(h, {
|
|
177
191
|
className: "text-sm font-medium",
|
|
178
192
|
children: "Avg Tenure"
|
|
179
|
-
}), /* @__PURE__ */
|
|
180
|
-
}), /* @__PURE__ */
|
|
193
|
+
}), /* @__PURE__ */ c(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
194
|
+
}), /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l("div", {
|
|
181
195
|
className: "text-2xl font-bold tabular-nums",
|
|
182
|
-
children:
|
|
196
|
+
children: [w.toFixed(1), " yrs"]
|
|
183
197
|
}), /* @__PURE__ */ l("p", {
|
|
184
198
|
className: "text-xs text-text-secondary",
|
|
185
|
-
children:
|
|
199
|
+
children: [
|
|
200
|
+
"Median: ",
|
|
201
|
+
T.toFixed(1),
|
|
202
|
+
" years"
|
|
203
|
+
]
|
|
186
204
|
})] })]
|
|
187
205
|
})
|
|
188
206
|
]
|
|
189
207
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ l("div", {
|
|
191
209
|
className: "grid gap-4 md:grid-cols-2",
|
|
192
|
-
children: [/* @__PURE__ */
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
className: "text-right",
|
|
202
|
-
children: "Avg Score"
|
|
203
|
-
}),
|
|
204
|
-
/* @__PURE__ */ l("span", {
|
|
205
|
-
className: "text-right",
|
|
206
|
-
children: "Avg Salary"
|
|
207
|
-
})
|
|
208
|
-
]
|
|
209
|
-
}), O.sort((e, t) => Number(t.avgScore) - Number(e.avgScore)).map((e) => /* @__PURE__ */ u("div", {
|
|
210
|
-
className: "grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm",
|
|
211
|
-
children: [
|
|
212
|
-
/* @__PURE__ */ l("span", {
|
|
213
|
-
className: "font-medium",
|
|
214
|
-
children: e.name
|
|
215
|
-
}),
|
|
216
|
-
/* @__PURE__ */ l("span", {
|
|
217
|
-
className: "text-right",
|
|
218
|
-
children: e.headcount
|
|
219
|
-
}),
|
|
220
|
-
/* @__PURE__ */ l("div", {
|
|
221
|
-
className: "text-right",
|
|
222
|
-
children: /* @__PURE__ */ l(d, {
|
|
223
|
-
variant: Number(e.avgScore) >= 4.5 ? "default" : "secondary",
|
|
224
|
-
children: e.avgScore
|
|
225
|
-
})
|
|
226
|
-
}),
|
|
227
|
-
/* @__PURE__ */ u("span", {
|
|
228
|
-
className: "text-right",
|
|
229
|
-
children: ["$", e.avgSalary.toLocaleString()]
|
|
230
|
-
})
|
|
231
|
-
]
|
|
232
|
-
}, e.name))] })] }), /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(h, { children: [/* @__PURE__ */ l(g, { children: "Engagement Drivers" }), /* @__PURE__ */ l(m, { children: "Employee satisfaction by category" })] }), /* @__PURE__ */ l(p, {
|
|
233
|
-
className: "space-y-4",
|
|
234
|
-
children: C.sort((e, t) => t.score - e.score).map((e) => /* @__PURE__ */ u("div", {
|
|
235
|
-
className: "space-y-1",
|
|
236
|
-
children: [/* @__PURE__ */ u("div", {
|
|
237
|
-
className: "flex justify-between text-sm",
|
|
238
|
-
children: [/* @__PURE__ */ l("span", { children: e.driver }), /* @__PURE__ */ u("div", {
|
|
239
|
-
className: "flex items-center gap-2",
|
|
240
|
-
children: [/* @__PURE__ */ u("span", {
|
|
241
|
-
className: "font-medium",
|
|
242
|
-
children: [e.score, "/5"]
|
|
243
|
-
}), /* @__PURE__ */ l("span", {
|
|
244
|
-
className: "text-xs text-status-success-text",
|
|
245
|
-
children: e.trend
|
|
246
|
-
})]
|
|
247
|
-
})]
|
|
248
|
-
}), /* @__PURE__ */ l("div", {
|
|
249
|
-
className: "h-2 bg-bg-sunken rounded overflow-hidden",
|
|
250
|
-
children: /* @__PURE__ */ l("div", {
|
|
251
|
-
className: `h-2 rounded ${e.score >= 4.5 ? "bg-status-success-text" : e.score >= 4 ? "bg-status-info-text" : "bg-status-warning-text"}`,
|
|
252
|
-
style: { width: `${e.score / 5 * 100}%` }
|
|
253
|
-
})
|
|
254
|
-
})]
|
|
255
|
-
}, e.driver))
|
|
256
|
-
})] })]
|
|
210
|
+
children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Department Performance" }), /* @__PURE__ */ c(p, { children: "Average performance score and compensation by department" })] }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c(b, {
|
|
211
|
+
columns: R,
|
|
212
|
+
data: j,
|
|
213
|
+
rowKey: (e) => e.name
|
|
214
|
+
}) })] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ l(m, { children: [/* @__PURE__ */ c(h, { children: "Engagement Drivers" }), /* @__PURE__ */ c(p, { children: "Employee satisfaction by category" })] }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ c(v, {
|
|
215
|
+
illustration: "empty-data",
|
|
216
|
+
title: "Engagement surveys coming soon",
|
|
217
|
+
description: "Satisfaction and engagement drivers will appear here once the employee survey integration is connected — we don't show estimated scores."
|
|
218
|
+
}) })] })]
|
|
257
219
|
}),
|
|
258
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ l("div", {
|
|
259
221
|
className: "grid gap-4 md:grid-cols-2",
|
|
260
|
-
children: [/* @__PURE__ */
|
|
222
|
+
children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
|
|
261
223
|
className: "flex items-center gap-2",
|
|
262
|
-
children: [/* @__PURE__ */
|
|
263
|
-
}) }), /* @__PURE__ */
|
|
224
|
+
children: [/* @__PURE__ */ c(i, { className: "h-4 w-4" }), "Tenure Distribution"]
|
|
225
|
+
}) }), /* @__PURE__ */ c(f, {
|
|
264
226
|
className: "space-y-3",
|
|
265
|
-
children:
|
|
227
|
+
children: C.map((e) => /* @__PURE__ */ l("div", {
|
|
266
228
|
className: "flex items-center gap-3",
|
|
267
229
|
children: [
|
|
268
|
-
/* @__PURE__ */
|
|
230
|
+
/* @__PURE__ */ c("span", {
|
|
269
231
|
className: "w-20 text-sm text-text-secondary",
|
|
270
232
|
children: e.range
|
|
271
233
|
}),
|
|
272
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ c("div", {
|
|
273
235
|
className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
|
|
274
|
-
children: /* @__PURE__ */
|
|
236
|
+
children: /* @__PURE__ */ c("div", {
|
|
275
237
|
className: "h-4 bg-action-primary-bg/70 rounded",
|
|
276
238
|
style: { width: `${e.percentage}%` }
|
|
277
239
|
})
|
|
278
240
|
}),
|
|
279
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ c("span", {
|
|
280
242
|
className: "text-sm font-medium w-10 text-right",
|
|
281
243
|
children: e.count
|
|
282
244
|
}),
|
|
283
|
-
/* @__PURE__ */
|
|
245
|
+
/* @__PURE__ */ l("span", {
|
|
284
246
|
className: "text-xs text-text-secondary w-10 text-right",
|
|
285
247
|
children: [e.percentage, "%"]
|
|
286
248
|
})
|
|
287
249
|
]
|
|
288
250
|
}, e.range))
|
|
289
|
-
})] }), /* @__PURE__ */
|
|
251
|
+
})] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
|
|
290
252
|
className: "flex items-center gap-2",
|
|
291
|
-
children: [/* @__PURE__ */
|
|
292
|
-
}) }), /* @__PURE__ */
|
|
253
|
+
children: [/* @__PURE__ */ c(a, { className: "h-4 w-4" }), "Location Distribution"]
|
|
254
|
+
}) }), /* @__PURE__ */ c(f, {
|
|
293
255
|
className: "space-y-3",
|
|
294
|
-
children: Object.entries(
|
|
256
|
+
children: Object.entries(z).sort(([, e], [, t]) => t - e).map(([e, t]) => /* @__PURE__ */ l("div", {
|
|
295
257
|
className: "flex items-center justify-between py-1",
|
|
296
|
-
children: [/* @__PURE__ */
|
|
258
|
+
children: [/* @__PURE__ */ c("span", {
|
|
297
259
|
className: "text-sm",
|
|
298
260
|
children: e
|
|
299
|
-
}), /* @__PURE__ */
|
|
261
|
+
}), /* @__PURE__ */ l("div", {
|
|
300
262
|
className: "flex items-center gap-2",
|
|
301
|
-
children: [/* @__PURE__ */
|
|
263
|
+
children: [/* @__PURE__ */ c("span", {
|
|
302
264
|
className: "text-sm font-medium",
|
|
303
265
|
children: t
|
|
304
|
-
}), /* @__PURE__ */ u
|
|
266
|
+
}), /* @__PURE__ */ l(u, {
|
|
305
267
|
variant: "outline",
|
|
306
268
|
className: "text-[10px]",
|
|
307
|
-
children: [Math.round(t /
|
|
269
|
+
children: [Math.round(t / Math.max(x.length, 1) * 100), "%"]
|
|
308
270
|
})]
|
|
309
271
|
})]
|
|
310
272
|
}, e))
|
|
311
273
|
})] })]
|
|
312
274
|
}),
|
|
313
|
-
/* @__PURE__ */
|
|
275
|
+
/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
|
|
314
276
|
className: "flex items-center gap-2",
|
|
315
|
-
children: [/* @__PURE__ */
|
|
316
|
-
}) }), /* @__PURE__ */
|
|
277
|
+
children: [/* @__PURE__ */ c(n, { className: "h-4 w-4 text-status-warning-text" }), "Key Insights"]
|
|
278
|
+
}) }), /* @__PURE__ */ c(f, { children: /* @__PURE__ */ l("div", {
|
|
317
279
|
className: "grid gap-3 md:grid-cols-3",
|
|
318
280
|
children: [
|
|
319
|
-
/* @__PURE__ */
|
|
281
|
+
/* @__PURE__ */ l("div", {
|
|
320
282
|
className: "rounded border p-3",
|
|
321
|
-
children: [/* @__PURE__ */
|
|
283
|
+
children: [/* @__PURE__ */ c("p", {
|
|
322
284
|
className: "text-sm font-medium",
|
|
323
285
|
children: "Highest Performance"
|
|
324
|
-
}), /* @__PURE__ */
|
|
286
|
+
}), /* @__PURE__ */ c("p", {
|
|
325
287
|
className: "text-xs text-text-secondary mt-1",
|
|
326
|
-
children:
|
|
327
|
-
"Engineering department leads with avg score of",
|
|
328
|
-
" ",
|
|
329
|
-
O.find((e) => e.name === "Engineering")?.avgScore || "N/A"
|
|
330
|
-
]
|
|
288
|
+
children: M ? `${M.name} leads with an average score of ${M.avgScore}` : "No department performance data yet"
|
|
331
289
|
})]
|
|
332
290
|
}),
|
|
333
|
-
/* @__PURE__ */
|
|
291
|
+
/* @__PURE__ */ l("div", {
|
|
334
292
|
className: "rounded border p-3",
|
|
335
|
-
children: [/* @__PURE__ */
|
|
293
|
+
children: [/* @__PURE__ */ c("p", {
|
|
336
294
|
className: "text-sm font-medium",
|
|
337
295
|
children: "Retention Risk"
|
|
338
296
|
}), /* @__PURE__ */ l("p", {
|
|
339
297
|
className: "text-xs text-text-secondary mt-1",
|
|
340
|
-
children:
|
|
298
|
+
children: [
|
|
299
|
+
N,
|
|
300
|
+
" employee",
|
|
301
|
+
N === 1 ? "" : "s",
|
|
302
|
+
" below a 3.5 performance score — a potential flight risk"
|
|
303
|
+
]
|
|
341
304
|
})]
|
|
342
305
|
}),
|
|
343
|
-
/* @__PURE__ */
|
|
306
|
+
/* @__PURE__ */ l("div", {
|
|
344
307
|
className: "rounded border p-3",
|
|
345
|
-
children: [/* @__PURE__ */
|
|
308
|
+
children: [/* @__PURE__ */ c("p", {
|
|
346
309
|
className: "text-sm font-medium",
|
|
347
310
|
children: "Compensation Gap"
|
|
348
311
|
}), /* @__PURE__ */ l("p", {
|
|
349
312
|
className: "text-xs text-text-secondary mt-1",
|
|
350
|
-
children:
|
|
313
|
+
children: [
|
|
314
|
+
L,
|
|
315
|
+
" department",
|
|
316
|
+
L === 1 ? "" : "s",
|
|
317
|
+
" below the median department salary"
|
|
318
|
+
]
|
|
351
319
|
})]
|
|
352
320
|
})
|
|
353
321
|
]
|
|
@@ -356,6 +324,6 @@ function b() {
|
|
|
356
324
|
});
|
|
357
325
|
}
|
|
358
326
|
//#endregion
|
|
359
|
-
export {
|
|
327
|
+
export { x as AnalyticsEmployeeAnalyticsPagePage };
|
|
360
328
|
|
|
361
329
|
//# sourceMappingURL=AnalyticsEmployeeAnalyticsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsEmployeeAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Award, BarChart3, Clock, MapPin, Star, TrendingUp, UserCheck } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function AnalyticsEmployeeAnalyticsPagePage() {\n const { employees, departments } = useCrewFoundryStore();\n\n const tenureDistribution = useMemo(() => {\n const total = Math.max(employees.length, 1);\n const getYears = (startDate: string) =>\n Math.max(\n 0,\n (new Date('2026-03-01').getTime() - new Date(startDate).getTime()) /\n (1000 * 60 * 60 * 24 * 365)\n );\n const buckets = [\n { range: '< 1 year', min: 0, max: 1 },\n { range: '1-2 years', min: 1, max: 2 },\n { range: '2-3 years', min: 2, max: 3 },\n { range: '3-4 years', min: 3, max: 4 },\n { range: '4+ years', min: 4, max: Infinity },\n ];\n return buckets.map((bucket) => {\n const count = employees.filter((employee) => {\n const years = getYears(employee.startDate);\n return years >= bucket.min && years < bucket.max;\n }).length;\n return { range: bucket.range, count, percentage: Math.round((count / total) * 100) };\n });\n }, [employees]);\n\n const engagementDrivers = useMemo(() => {\n const byDept = departments.map((department) => {\n const deptEmployees = employees.filter((employee) => employee.department === department.name);\n const score =\n deptEmployees.length > 0\n ? deptEmployees.reduce((sum, employee) => sum + employee.performanceScore, 0) /\n deptEmployees.length\n : 0;\n return { department: department.name, score };\n });\n\n const avgScore =\n employees.length > 0\n ? employees.reduce((sum, employee) => sum + employee.performanceScore, 0) / employees.length\n : 0;\n\n const compScore =\n employees.length > 0\n ? Math.min(\n 5,\n Math.max(\n 3,\n employees.reduce((sum, employee) => sum + employee.salary, 0) /\n employees.length /\n 30000\n )\n )\n : 0;\n\n return [\n { driver: 'Workforce Performance', score: Number(avgScore.toFixed(1)), trend: '+0.2' },\n {\n driver: 'Career Growth',\n score: Number(\n (\n byDept.reduce((sum, entry) => sum + (entry.score > avgScore ? 4.6 : 4.0), 0) /\n Math.max(byDept.length, 1)\n ).toFixed(1)\n ),\n trend: '+0.1',\n },\n { driver: 'Compensation', score: Number(compScore.toFixed(1)), trend: '+0.2' },\n {\n driver: 'Management Quality',\n score: Number(\n (\n byDept.reduce((sum, entry) => sum + Math.min(5, entry.score + 0.4), 0) /\n Math.max(byDept.length, 1)\n ).toFixed(1)\n ),\n trend: '+0.3',\n },\n {\n driver: 'Company Culture',\n score: Number(Math.min(5, avgScore + 0.5).toFixed(1)),\n trend: '+0.2',\n },\n {\n driver: 'Learning Opportunities',\n score: Number(Math.min(5, avgScore + 0.3).toFixed(1)),\n trend: '+0.4',\n },\n ];\n }, [departments, employees]);\n\n const avgPerformance = (\n employees.reduce((sum, e) => sum + e.performanceScore, 0) / employees.length\n ).toFixed(1);\n const avgSalary = Math.round(employees.reduce((sum, e) => sum + e.salary, 0) / employees.length);\n const activeCount = employees.filter((e) => e.status === 'active').length;\n const onLeaveCount = employees.filter((e) => e.status === 'on_leave').length;\n\n const deptPerformance = departments.map((dept) => {\n const deptEmps = employees.filter((e) => e.department === dept.name);\n const avgScore =\n deptEmps.length > 0\n ? (deptEmps.reduce((s, e) => s + e.performanceScore, 0) / deptEmps.length).toFixed(1)\n : '0';\n const avgSal =\n deptEmps.length > 0\n ? Math.round(deptEmps.reduce((s, e) => s + e.salary, 0) / deptEmps.length)\n : 0;\n return { name: dept.name, headcount: deptEmps.length, avgScore, avgSalary: avgSal };\n });\n\n const locationBreakdown = employees.reduce<Record<string, number>>((acc, e) => {\n acc[e.location] = (acc[e.location] || 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>Employee Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Deep-dive into employee performance, engagement, and demographics\n </p>\n <PagePurpose className=\"mt-1\">See how individual employees and teams are performing over time — use these insights for reviews, recognition, and targeted coaching.</PagePurpose>\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\">Active Employees</CardTitle>\n <UserCheck className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeCount}</div>\n <p className=\"text-xs text-text-secondary\">{onLeaveCount} currently on leave</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\">Avg Performance</CardTitle>\n <Star className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{avgPerformance}/5.0</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <TrendingUp className=\"h-3 w-3 mr-1\" />\n +0.2 from last quarter\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\">Avg Compensation</CardTitle>\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${avgSalary.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">Across all 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\">Avg Tenure</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">2.4 yrs</div>\n <p className=\"text-xs text-text-secondary\">Median: 2.1 years</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Department Performance</CardTitle>\n <CardDescription>\n Average performance score and compensation by department\n </CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Department</span>\n <span className=\"text-right\">Headcount</span>\n <span className=\"text-right\">Avg Score</span>\n <span className=\"text-right\">Avg Salary</span>\n </div>\n {deptPerformance\n .sort((a, b) => Number(b.avgScore) - Number(a.avgScore))\n .map((dept) => (\n <div\n key={dept.name}\n className=\"grid grid-cols-4 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{dept.name}</span>\n <span className=\"text-right\">{dept.headcount}</span>\n <div className=\"text-right\">\n <Badge variant={Number(dept.avgScore) >= 4.5 ? 'default' : 'secondary'}>\n {dept.avgScore}\n </Badge>\n </div>\n <span className=\"text-right\">${dept.avgSalary.toLocaleString()}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Engagement Drivers</CardTitle>\n <CardDescription>Employee satisfaction by category</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {engagementDrivers\n .sort((a, b) => b.score - a.score)\n .map((driver) => (\n <div key={driver.driver} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span>{driver.driver}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium\">{driver.score}/5</span>\n <span className=\"text-xs text-status-success-text\">{driver.trend}</span>\n </div>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-2 rounded ${driver.score >= 4.5 ? 'bg-status-success-text' : driver.score >= 4 ? 'bg-status-info-text' : 'bg-status-warning-text'}`}\n style={{ width: `${(driver.score / 5) * 100}%` }}\n />\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4\" />\n Tenure Distribution\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {tenureDistribution.map((t) => (\n <div key={t.range} className=\"flex items-center gap-3\">\n <span className=\"w-20 text-sm text-text-secondary\">{t.range}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg/70 rounded\"\n style={{ width: `${t.percentage}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{t.count}</span>\n <span className=\"text-xs text-text-secondary w-10 text-right\">{t.percentage}%</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n Location Distribution\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(locationBreakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([loc, count]) => (\n <div key={loc} className=\"flex items-center justify-between py-1\">\n <span className=\"text-sm\">{loc}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{count}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {Math.round((count / employees.length) * 100)}%\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Award className=\"h-4 w-4 text-status-warning-text\" />\n Key Insights\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 md:grid-cols-3\">\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Highest Performance</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n Engineering department leads with avg score of{' '}\n {deptPerformance.find((d) => d.name === 'Engineering')?.avgScore || 'N/A'}\n </p>\n </div>\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Retention Risk</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n 12 employees flagged as flight risk based on engagement signals\n </p>\n </div>\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Compensation Gap</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n 3 departments below market median, review recommended in Q2\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnalyticsEmployeeAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\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 { Award, BarChart3, Clock, MapPin, Star, UserCheck } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype DeptPerformanceRow = {\n name: string;\n headcount: number;\n avgScore: string;\n avgSalary: number;\n};\n\nexport function AnalyticsEmployeeAnalyticsPagePage() {\n const { employees, departments } = useCrewFoundryStore();\n\n const tenureDistribution = useMemo(() => {\n const total = Math.max(employees.length, 1);\n const getYears = (startDate: string) =>\n Math.max(\n 0,\n (new Date('2026-03-01').getTime() - new Date(startDate).getTime()) /\n (1000 * 60 * 60 * 24 * 365)\n );\n const buckets = [\n { range: '< 1 year', min: 0, max: 1 },\n { range: '1-2 years', min: 1, max: 2 },\n { range: '2-3 years', min: 2, max: 3 },\n { range: '3-4 years', min: 3, max: 4 },\n { range: '4+ years', min: 4, max: Infinity },\n ];\n return buckets.map((bucket) => {\n const count = employees.filter((employee) => {\n const years = getYears(employee.startDate);\n return years >= bucket.min && years < bucket.max;\n }).length;\n return { range: bucket.range, count, percentage: Math.round((count / total) * 100) };\n });\n }, [employees]);\n\n // Real average and median tenure derived from employee start dates.\n const { avgTenure, medianTenure } = useMemo(() => {\n if (employees.length === 0) {\n return { avgTenure: 0, medianTenure: 0 };\n }\n const getYears = (startDate: string) =>\n Math.max(\n 0,\n (new Date('2026-03-01').getTime() - new Date(startDate).getTime()) /\n (1000 * 60 * 60 * 24 * 365)\n );\n const years = employees.map((employee) => getYears(employee.startDate)).sort((a, b) => a - b);\n const avg = years.reduce((sum, value) => sum + value, 0) / years.length;\n const mid = Math.floor(years.length / 2);\n const median =\n years.length % 2 === 1 ? years[mid] : (years[mid - 1] + years[mid]) / 2;\n return { avgTenure: avg, medianTenure: median };\n }, [employees]);\n\n const avgPerformance = (\n employees.reduce((sum, e) => sum + e.performanceScore, 0) / Math.max(employees.length, 1)\n ).toFixed(1);\n const avgSalary = Math.round(\n employees.reduce((sum, e) => sum + e.salary, 0) / Math.max(employees.length, 1)\n );\n const activeCount = employees.filter((e) => e.status === 'active').length;\n const onLeaveCount = employees.filter((e) => e.status === 'on_leave').length;\n\n const deptPerformance: DeptPerformanceRow[] = departments.map((dept) => {\n const deptEmps = employees.filter((e) => e.department === dept.name);\n const avgScore =\n deptEmps.length > 0\n ? (deptEmps.reduce((s, e) => s + e.performanceScore, 0) / deptEmps.length).toFixed(1)\n : '0';\n const avgSal =\n deptEmps.length > 0\n ? Math.round(deptEmps.reduce((s, e) => s + e.salary, 0) / deptEmps.length)\n : 0;\n return { name: dept.name, headcount: deptEmps.length, avgScore, avgSalary: avgSal };\n });\n\n const sortedDeptPerformance = [...deptPerformance].sort(\n (a, b) => Number(b.avgScore) - Number(a.avgScore)\n );\n\n // Real key-insight figures.\n const topDept = sortedDeptPerformance[0];\n const flightRiskCount = employees.filter((e) => e.performanceScore < 3.5).length;\n const deptsWithStaff = deptPerformance.filter((d) => d.headcount > 0);\n const sortedSalaries = [...deptsWithStaff].map((d) => d.avgSalary).sort((a, b) => a - b);\n const medianDeptSalary =\n sortedSalaries.length > 0 ? sortedSalaries[Math.floor(sortedSalaries.length / 2)] : 0;\n const belowMedianDeptCount = deptsWithStaff.filter(\n (d) => d.avgSalary < medianDeptSalary\n ).length;\n\n const deptPerformanceColumns: ResponsiveTableColumn<DeptPerformanceRow>[] = [\n {\n key: 'name',\n header: 'Department',\n priority: 'primary',\n cell: (dept) => <span className=\"font-medium\">{dept.name}</span>,\n },\n {\n key: 'headcount',\n header: 'Headcount',\n priority: 'secondary',\n cell: (dept) => <span className=\"md:block md:text-right\">{dept.headcount}</span>,\n },\n {\n key: 'avgScore',\n header: 'Avg Score',\n priority: 'primary',\n cell: (dept) => (\n <span className=\"md:block md:text-right\">\n <Badge variant={Number(dept.avgScore) >= 4.5 ? 'default' : 'secondary'}>\n {dept.avgScore}\n </Badge>\n </span>\n ),\n },\n {\n key: 'avgSalary',\n header: 'Avg Salary',\n priority: 'secondary',\n cell: (dept) => (\n <span className=\"md:block md:text-right\">${dept.avgSalary.toLocaleString()}</span>\n ),\n },\n ];\n\n const locationBreakdown = employees.reduce<Record<string, number>>((acc, e) => {\n acc[e.location] = (acc[e.location] || 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>Employee Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Deep-dive into employee performance, engagement, and demographics\n </p>\n <PagePurpose className=\"mt-1\">See how individual employees and teams are performing over time — use these insights for reviews, recognition, and targeted coaching.</PagePurpose>\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\">Active Employees</CardTitle>\n <UserCheck className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeCount}</div>\n <p className=\"text-xs text-text-secondary\">{onLeaveCount} currently on leave</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\">Avg Performance</CardTitle>\n <Star className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{avgPerformance}/5.0</div>\n <p className=\"text-xs text-text-secondary\">Across {employees.length} 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\">Avg Compensation</CardTitle>\n <BarChart3 className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">${avgSalary.toLocaleString()}</div>\n <p className=\"text-xs text-text-secondary\">Across all 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\">Avg Tenure</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{avgTenure.toFixed(1)} yrs</div>\n <p className=\"text-xs text-text-secondary\">Median: {medianTenure.toFixed(1)} years</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Department Performance</CardTitle>\n <CardDescription>\n Average performance score and compensation by department\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable\n columns={deptPerformanceColumns}\n data={sortedDeptPerformance}\n rowKey={(dept) => dept.name}\n />\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Engagement Drivers</CardTitle>\n <CardDescription>Employee satisfaction by category</CardDescription>\n </CardHeader>\n <CardContent>\n <IllustratedEmptyState\n illustration=\"empty-data\"\n title=\"Engagement surveys coming soon\"\n description=\"Satisfaction and engagement drivers will appear here once the employee survey integration is connected — we don't show estimated scores.\"\n />\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Clock className=\"h-4 w-4\" />\n Tenure Distribution\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {tenureDistribution.map((t) => (\n <div key={t.range} className=\"flex items-center gap-3\">\n <span className=\"w-20 text-sm text-text-secondary\">{t.range}</span>\n <div className=\"flex-1 h-4 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-4 bg-action-primary-bg/70 rounded\"\n style={{ width: `${t.percentage}%` }}\n />\n </div>\n <span className=\"text-sm font-medium w-10 text-right\">{t.count}</span>\n <span className=\"text-xs text-text-secondary w-10 text-right\">{t.percentage}%</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <MapPin className=\"h-4 w-4\" />\n Location Distribution\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {Object.entries(locationBreakdown)\n .sort(([, a], [, b]) => b - a)\n .map(([loc, count]) => (\n <div key={loc} className=\"flex items-center justify-between py-1\">\n <span className=\"text-sm\">{loc}</span>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{count}</span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {Math.round((count / Math.max(employees.length, 1)) * 100)}%\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2\">\n <Award className=\"h-4 w-4 text-status-warning-text\" />\n Key Insights\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 md:grid-cols-3\">\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Highest Performance</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n {topDept\n ? `${topDept.name} leads with an average score of ${topDept.avgScore}`\n : 'No department performance data yet'}\n </p>\n </div>\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Retention Risk</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n {flightRiskCount} employee{flightRiskCount === 1 ? '' : 's'} below a 3.5 performance\n score — a potential flight risk\n </p>\n </div>\n <div className=\"rounded border p-3\">\n <p className=\"text-sm font-medium\">Compensation Gap</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n {belowMedianDeptCount} department{belowMedianDeptCount === 1 ? '' : 's'} below the\n median department salary\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|