@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.
Files changed (127) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +117 -164
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
  12. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
  14. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
  16. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
  18. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
  20. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
  22. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
  24. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
  26. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
  28. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
  30. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
  32. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
  34. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
  36. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
  38. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  39. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
  40. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
  42. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
  44. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
  46. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
  48. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
  50. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
  52. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
  54. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
  56. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
  58. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
  60. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
  62. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
  64. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
  66. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
  68. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
  70. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
  72. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
  74. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
  76. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
  78. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
  80. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
  82. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
  84. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
  86. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
  88. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
  92. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
  94. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
  96. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
  98. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
  100. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
  102. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
  104. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
  106. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
  108. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
  110. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
  112. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
  114. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
  116. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
  118. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
  120. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
  122. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
  124. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
  126. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  127. 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, TrendingUp as s, UserCheck as c } from "lucide-react";
4
- import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
- import { Badge as d, Card as f, CardContent as p, CardDescription as m, CardHeader as h, CardTitle as g, GlassCard as _, GradientText as v, PagePurpose as y } from "@burdenoff/fe-libs/ui";
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 b() {
8
- let { employees: b, departments: x } = e(), S = t(() => {
9
- let e = Math.max(b.length, 1), t = (e) => Math.max(0, ((/* @__PURE__ */ new Date("2026-03-01")).getTime() - new Date(e).getTime()) / (1e3 * 60 * 60 * 24 * 365));
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 = b.filter((e) => {
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
- }, [b]), C = t(() => {
48
- let e = x.map((e) => {
49
- let t = b.filter((t) => t.department === e.name), n = t.length > 0 ? t.reduce((e, t) => e + t.performanceScore, 0) / t.length : 0;
50
- return {
51
- department: e.name,
52
- score: n
53
- };
54
- }), t = b.length > 0 ? b.reduce((e, t) => e + t.performanceScore, 0) / b.length : 0, n = b.length > 0 ? Math.min(5, Math.max(3, b.reduce((e, t) => e + t.salary, 0) / b.length / 3e4)) : 0;
55
- return [
56
- {
57
- driver: "Workforce Performance",
58
- score: Number(t.toFixed(1)),
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
- }), k = b.reduce((e, t) => (e[t.location] = (e[t.location] || 0) + 1, e), {});
96
- return /* @__PURE__ */ u("div", {
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__ */ l("div", {
109
+ /* @__PURE__ */ c("div", {
100
110
  className: "flex items-center justify-between",
101
- children: /* @__PURE__ */ u("div", { children: [
102
- /* @__PURE__ */ l("h1", {
111
+ children: /* @__PURE__ */ l("div", { children: [
112
+ /* @__PURE__ */ c("h1", {
103
113
  className: "text-2xl font-semibold",
104
- children: /* @__PURE__ */ l(v, { children: "Employee Analytics" })
114
+ children: /* @__PURE__ */ c(_, { children: "Employee Analytics" })
105
115
  }),
106
- /* @__PURE__ */ l("p", {
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__ */ l(y, {
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__ */ u("div", {
126
+ /* @__PURE__ */ l("div", {
117
127
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
118
128
  children: [
119
- /* @__PURE__ */ u(_, {
129
+ /* @__PURE__ */ l(g, {
120
130
  treatment: "glass",
121
131
  glow: !0,
122
132
  className: "border-border-seam",
123
- children: [/* @__PURE__ */ u(h, {
133
+ children: [/* @__PURE__ */ l(m, {
124
134
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
125
- children: [/* @__PURE__ */ l(g, {
135
+ children: [/* @__PURE__ */ c(h, {
126
136
  className: "text-sm font-medium",
127
137
  children: "Active Employees"
128
- }), /* @__PURE__ */ l(c, { className: "h-4 w-4 text-text-secondary" })]
129
- }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l("div", {
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: E
132
- }), /* @__PURE__ */ u("p", {
141
+ children: O
142
+ }), /* @__PURE__ */ l("p", {
133
143
  className: "text-xs text-text-secondary",
134
- children: [D, " currently on leave"]
144
+ children: [k, " currently on leave"]
135
145
  })] })]
136
146
  }),
137
- /* @__PURE__ */ u(_, {
147
+ /* @__PURE__ */ l(g, {
138
148
  treatment: "metric",
139
149
  className: "border-border-seam",
140
- children: [/* @__PURE__ */ u(h, {
150
+ children: [/* @__PURE__ */ l(m, {
141
151
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
142
- children: [/* @__PURE__ */ l(g, {
152
+ children: [/* @__PURE__ */ c(h, {
143
153
  className: "text-sm font-medium",
144
154
  children: "Avg Performance"
145
- }), /* @__PURE__ */ l(o, { className: "h-4 w-4 text-text-secondary" })]
146
- }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u("div", {
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: [w, "/5.0"]
149
- }), /* @__PURE__ */ u("div", {
150
- className: "flex items-center text-xs text-status-success-text",
151
- children: [/* @__PURE__ */ l(s, { className: "h-3 w-3 mr-1" }), "+0.2 from last quarter"]
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__ */ u(_, {
168
+ /* @__PURE__ */ l(g, {
155
169
  treatment: "metric",
156
170
  className: "border-border-seam",
157
- children: [/* @__PURE__ */ u(h, {
171
+ children: [/* @__PURE__ */ l(m, {
158
172
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
159
- children: [/* @__PURE__ */ l(g, {
173
+ children: [/* @__PURE__ */ c(h, {
160
174
  className: "text-sm font-medium",
161
175
  children: "Avg Compensation"
162
- }), /* @__PURE__ */ l(r, { className: "h-4 w-4 text-text-secondary" })]
163
- }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u("div", {
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: ["$", T.toLocaleString()]
166
- }), /* @__PURE__ */ l("p", {
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__ */ u(_, {
185
+ /* @__PURE__ */ l(g, {
172
186
  treatment: "metric",
173
187
  className: "border-border-seam",
174
- children: [/* @__PURE__ */ u(h, {
188
+ children: [/* @__PURE__ */ l(m, {
175
189
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
176
- children: [/* @__PURE__ */ l(g, {
190
+ children: [/* @__PURE__ */ c(h, {
177
191
  className: "text-sm font-medium",
178
192
  children: "Avg Tenure"
179
- }), /* @__PURE__ */ l(i, { className: "h-4 w-4 text-text-secondary" })]
180
- }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l("div", {
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: "2.4 yrs"
196
+ children: [w.toFixed(1), " yrs"]
183
197
  }), /* @__PURE__ */ l("p", {
184
198
  className: "text-xs text-text-secondary",
185
- children: "Median: 2.1 years"
199
+ children: [
200
+ "Median: ",
201
+ T.toFixed(1),
202
+ " years"
203
+ ]
186
204
  })] })]
187
205
  })
188
206
  ]
189
207
  }),
190
- /* @__PURE__ */ u("div", {
208
+ /* @__PURE__ */ l("div", {
191
209
  className: "grid gap-4 md:grid-cols-2",
192
- children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(h, { children: [/* @__PURE__ */ l(g, { children: "Department Performance" }), /* @__PURE__ */ l(m, { children: "Average performance score and compensation by department" })] }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u("div", {
193
- className: "grid grid-cols-4 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
194
- children: [
195
- /* @__PURE__ */ l("span", { children: "Department" }),
196
- /* @__PURE__ */ l("span", {
197
- className: "text-right",
198
- children: "Headcount"
199
- }),
200
- /* @__PURE__ */ l("span", {
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__ */ u("div", {
220
+ /* @__PURE__ */ l("div", {
259
221
  className: "grid gap-4 md:grid-cols-2",
260
- children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(h, { children: /* @__PURE__ */ u(g, {
222
+ children: [/* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
261
223
  className: "flex items-center gap-2",
262
- children: [/* @__PURE__ */ l(i, { className: "h-4 w-4" }), "Tenure Distribution"]
263
- }) }), /* @__PURE__ */ l(p, {
224
+ children: [/* @__PURE__ */ c(i, { className: "h-4 w-4" }), "Tenure Distribution"]
225
+ }) }), /* @__PURE__ */ c(f, {
264
226
  className: "space-y-3",
265
- children: S.map((e) => /* @__PURE__ */ u("div", {
227
+ children: C.map((e) => /* @__PURE__ */ l("div", {
266
228
  className: "flex items-center gap-3",
267
229
  children: [
268
- /* @__PURE__ */ l("span", {
230
+ /* @__PURE__ */ c("span", {
269
231
  className: "w-20 text-sm text-text-secondary",
270
232
  children: e.range
271
233
  }),
272
- /* @__PURE__ */ l("div", {
234
+ /* @__PURE__ */ c("div", {
273
235
  className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
274
- children: /* @__PURE__ */ l("div", {
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__ */ l("span", {
241
+ /* @__PURE__ */ c("span", {
280
242
  className: "text-sm font-medium w-10 text-right",
281
243
  children: e.count
282
244
  }),
283
- /* @__PURE__ */ u("span", {
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__ */ u(f, { children: [/* @__PURE__ */ l(h, { children: /* @__PURE__ */ u(g, {
251
+ })] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
290
252
  className: "flex items-center gap-2",
291
- children: [/* @__PURE__ */ l(a, { className: "h-4 w-4" }), "Location Distribution"]
292
- }) }), /* @__PURE__ */ l(p, {
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(k).sort(([, e], [, t]) => t - e).map(([e, t]) => /* @__PURE__ */ u("div", {
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__ */ l("span", {
258
+ children: [/* @__PURE__ */ c("span", {
297
259
  className: "text-sm",
298
260
  children: e
299
- }), /* @__PURE__ */ u("div", {
261
+ }), /* @__PURE__ */ l("div", {
300
262
  className: "flex items-center gap-2",
301
- children: [/* @__PURE__ */ l("span", {
263
+ children: [/* @__PURE__ */ c("span", {
302
264
  className: "text-sm font-medium",
303
265
  children: t
304
- }), /* @__PURE__ */ u(d, {
266
+ }), /* @__PURE__ */ l(u, {
305
267
  variant: "outline",
306
268
  className: "text-[10px]",
307
- children: [Math.round(t / b.length * 100), "%"]
269
+ children: [Math.round(t / Math.max(x.length, 1) * 100), "%"]
308
270
  })]
309
271
  })]
310
272
  }, e))
311
273
  })] })]
312
274
  }),
313
- /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(h, { children: /* @__PURE__ */ u(g, {
275
+ /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ l(h, {
314
276
  className: "flex items-center gap-2",
315
- children: [/* @__PURE__ */ l(n, { className: "h-4 w-4 text-status-warning-text" }), "Key Insights"]
316
- }) }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ u("div", {
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__ */ u("div", {
281
+ /* @__PURE__ */ l("div", {
320
282
  className: "rounded border p-3",
321
- children: [/* @__PURE__ */ l("p", {
283
+ children: [/* @__PURE__ */ c("p", {
322
284
  className: "text-sm font-medium",
323
285
  children: "Highest Performance"
324
- }), /* @__PURE__ */ u("p", {
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__ */ u("div", {
291
+ /* @__PURE__ */ l("div", {
334
292
  className: "rounded border p-3",
335
- children: [/* @__PURE__ */ l("p", {
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: "12 employees flagged as flight risk based on engagement signals"
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__ */ u("div", {
306
+ /* @__PURE__ */ l("div", {
344
307
  className: "rounded border p-3",
345
- children: [/* @__PURE__ */ l("p", {
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: "3 departments below market median, review recommended in Q2"
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 { b as AnalyticsEmployeeAnalyticsPagePage };
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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"}