@burdenoff/microfe-crewfoundry 2026.704.6 → 2026.704.7

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 (148) hide show
  1. package/dist/crewfoundry/CrewFoundryRoutes.js +51 -43
  2. package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
  3. package/dist/crewfoundry/components/forms/formValues.js +5 -2
  4. package/dist/crewfoundry/components/forms/formValues.js.map +1 -1
  5. package/dist/crewfoundry/components/viz/AllocationBar.js +68 -0
  6. package/dist/crewfoundry/components/viz/AllocationBar.js.map +1 -0
  7. package/dist/crewfoundry/components/viz/AreaChart.js +102 -0
  8. package/dist/crewfoundry/components/viz/AreaChart.js.map +1 -0
  9. package/dist/crewfoundry/components/viz/AvatarStack.js +36 -0
  10. package/dist/crewfoundry/components/viz/AvatarStack.js.map +1 -0
  11. package/dist/crewfoundry/components/viz/BarChart.js +83 -0
  12. package/dist/crewfoundry/components/viz/BarChart.js.map +1 -0
  13. package/dist/crewfoundry/components/viz/CertificateCard.js +118 -0
  14. package/dist/crewfoundry/components/viz/CertificateCard.js.map +1 -0
  15. package/dist/crewfoundry/components/viz/DonutChart.js +109 -0
  16. package/dist/crewfoundry/components/viz/DonutChart.js.map +1 -0
  17. package/dist/crewfoundry/components/viz/HBarFunnel.js +54 -0
  18. package/dist/crewfoundry/components/viz/HBarFunnel.js.map +1 -0
  19. package/dist/crewfoundry/components/viz/Heatmap.js +91 -0
  20. package/dist/crewfoundry/components/viz/Heatmap.js.map +1 -0
  21. package/dist/crewfoundry/components/viz/KanbanBoard.js +50 -0
  22. package/dist/crewfoundry/components/viz/KanbanBoard.js.map +1 -0
  23. package/dist/crewfoundry/components/viz/LineChart.js +123 -0
  24. package/dist/crewfoundry/components/viz/LineChart.js.map +1 -0
  25. package/dist/crewfoundry/components/viz/OrgTree.js +83 -0
  26. package/dist/crewfoundry/components/viz/OrgTree.js.map +1 -0
  27. package/dist/crewfoundry/components/viz/PathSteps.js +68 -0
  28. package/dist/crewfoundry/components/viz/PathSteps.js.map +1 -0
  29. package/dist/crewfoundry/components/viz/ProgressRing.js +68 -0
  30. package/dist/crewfoundry/components/viz/ProgressRing.js.map +1 -0
  31. package/dist/crewfoundry/components/viz/RatingStars.js +51 -0
  32. package/dist/crewfoundry/components/viz/RatingStars.js.map +1 -0
  33. package/dist/crewfoundry/components/viz/SegmentedTabs.js +69 -0
  34. package/dist/crewfoundry/components/viz/SegmentedTabs.js.map +1 -0
  35. package/dist/crewfoundry/components/viz/SkillBar.js +3 -0
  36. package/dist/crewfoundry/components/viz/Sparkline.js +74 -0
  37. package/dist/crewfoundry/components/viz/Sparkline.js.map +1 -0
  38. package/dist/crewfoundry/components/viz/StatCard.js +60 -0
  39. package/dist/crewfoundry/components/viz/StatCard.js.map +1 -0
  40. package/dist/crewfoundry/components/viz/StepProgress.js +3 -0
  41. package/dist/crewfoundry/components/viz/Timeline.js +66 -0
  42. package/dist/crewfoundry/components/viz/Timeline.js.map +1 -0
  43. package/dist/crewfoundry/components/viz/index.js +23 -0
  44. package/dist/crewfoundry/components/viz/lib/Avatar.js +30 -0
  45. package/dist/crewfoundry/components/viz/lib/Avatar.js.map +1 -0
  46. package/dist/crewfoundry/components/viz/lib/CartesianFrame.js +119 -0
  47. package/dist/crewfoundry/components/viz/lib/CartesianFrame.js.map +1 -0
  48. package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js +35 -0
  49. package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js.map +1 -0
  50. package/dist/crewfoundry/components/viz/lib/format.js +21 -0
  51. package/dist/crewfoundry/components/viz/lib/format.js.map +1 -0
  52. package/dist/crewfoundry/components/viz/lib/geometry.js +69 -0
  53. package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -0
  54. package/dist/crewfoundry/components/viz/lib/hooks.js +39 -0
  55. package/dist/crewfoundry/components/viz/lib/hooks.js.map +1 -0
  56. package/dist/crewfoundry/components/viz/lib/palette.js +27 -0
  57. package/dist/crewfoundry/components/viz/lib/palette.js.map +1 -0
  58. package/dist/crewfoundry/lib/analytics.js +323 -0
  59. package/dist/crewfoundry/lib/analytics.js.map +1 -0
  60. package/dist/crewfoundry/lib/companyFinance.js +16 -0
  61. package/dist/crewfoundry/lib/companyFinance.js.map +1 -0
  62. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +226 -283
  63. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  64. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +107 -120
  65. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +122 -162
  67. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  68. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -158
  69. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  70. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +316 -211
  71. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  72. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +75 -27
  73. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  74. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +167 -165
  75. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  76. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +168 -109
  77. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +401 -290
  79. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  80. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +84 -75
  81. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  82. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +368 -174
  83. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  84. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +236 -201
  85. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  86. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +369 -196
  87. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  88. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +269 -270
  89. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  90. package/dist/crewfoundry/pages/HiringJobsPagePage.js +210 -110
  91. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  92. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +216 -178
  93. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  94. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +385 -0
  95. package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -0
  96. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +189 -130
  97. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  98. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +397 -241
  99. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  100. package/dist/crewfoundry/pages/HrPayrollPagePage.js +262 -147
  101. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  102. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +345 -167
  103. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  104. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +98 -24
  105. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  106. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +1 -1
  107. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  108. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +289 -108
  109. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  110. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +221 -114
  111. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  112. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +134 -135
  113. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  114. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +148 -97
  115. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  116. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +264 -157
  117. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  118. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +85 -93
  119. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  120. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +211 -122
  121. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  122. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +94 -54
  123. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  124. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +289 -140
  125. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  126. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +169 -79
  127. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  128. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +296 -125
  129. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  130. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +187 -0
  131. package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -0
  132. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +140 -78
  133. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  134. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +93 -43
  135. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  136. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +250 -98
  137. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  138. package/dist/crewfoundry/store/crewfoundryStore.js +1 -1
  139. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  140. package/dist/crewfoundry/utils/cn.js +10 -0
  141. package/dist/crewfoundry/utils/cn.js.map +1 -0
  142. package/dist/crewfoundry/utils/courseProgress.js +46 -0
  143. package/dist/crewfoundry/utils/courseProgress.js.map +1 -0
  144. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  145. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  146. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  147. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  148. package/package.json +1 -1
@@ -1,352 +1,463 @@
1
1
  import { useCrewFoundry as e } from "../providers/CrewFoundryProvider.js";
2
2
  import { useCrewFoundryStore as t } from "../store/crewfoundryStore.js";
3
3
  import { formatEnumLabel as n } from "../utils/formatEnumLabel.js";
4
- import { useState as ee } from "react";
5
- import { Activity as r, Briefcase as i, Calendar as te, TrendingUp as a, Users as o } from "lucide-react";
6
- import { useNavigate as ne } from "react-router-dom";
7
- import { jsx as s, jsxs as c } from "react/jsx-runtime";
8
- import { AuroraBackground as re, Badge as l, Button as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, EmphasisPanel as ie, GlassCard as g, GradientText as ae, IllustratedEmptyState as _, NextSteps as v, PagePurpose as y, Pagination as b } from "@burdenoff/fe-libs/ui";
9
- import { usePagination as x } from "@burdenoff/fe-libs/shared/hooks";
10
- import { useGlobalUi as S } from "@burdenoff/fe-libs/shared/providers/shell";
11
- import { useI18n as oe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
4
+ import { getInitials as r } from "../components/viz/lib/format.js";
5
+ import { AreaChart as i } from "../components/viz/AreaChart.js";
6
+ import { HBarFunnel as ee } from "../components/viz/HBarFunnel.js";
7
+ import { StatCard as a } from "../components/viz/StatCard.js";
8
+ import "../components/viz/index.js";
9
+ import { headcountByMonth as te, momDelta as ne } from "../lib/analytics.js";
10
+ import { useMemo as o, useState as s } from "react";
11
+ import { Activity as c, Briefcase as l, Calendar as u, FolderPlus as re, Plus as ie, TrendingUp as ae, UserPlus as d, Users as f } from "lucide-react";
12
+ import { useNavigate as oe } from "react-router-dom";
13
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
14
+ import { AuroraBackground as se, Badge as h, Button as g, Card as _, CardContent as v, CardHeader as y, CardTitle as b, DropdownMenu as ce, DropdownMenuContent as le, DropdownMenuItem as x, DropdownMenuLabel as ue, DropdownMenuSeparator as S, DropdownMenuTrigger as C, GradientText as de, IllustratedEmptyState as w, NextSteps as fe, PagePurpose as pe, Pagination as me } from "@burdenoff/fe-libs/ui";
15
+ import { usePagination as he } from "@burdenoff/fe-libs/shared/hooks";
16
+ import { useGlobalUi as ge } from "@burdenoff/fe-libs/shared/providers/shell";
17
+ import { useI18n as _e } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
12
18
  //#region src/crewfoundry/pages/DashboardDashboardPagePage.tsx
13
- function C() {
14
- let { t: C } = oe(), w = ne(), { showToast: T } = S(), { currentUser: E } = e(), { employees: D, jobPostings: O, interviews: se, leaveRequests: k, notifications: A, projects: j, updateLeaveRequest: M } = t(), [N, P] = ee(null), F = E?.name || [E?.firstName, E?.lastName].filter(Boolean).join(" ") || E?.email || "Manager", I = async (e, t) => {
15
- P(e);
19
+ function T(e) {
20
+ let t = e.map((e) => e ? new Date(e) : null).filter((e) => e !== null && !Number.isNaN(e.getTime())).map((e) => e.getUTCFullYear() * 12 + e.getUTCMonth());
21
+ if (t.length === 0) return [];
22
+ let n = Math.min(...t), r = Math.max(...t), i = [];
23
+ for (let e = n; e <= r; e += 1) i.push(t.filter((t) => t <= e).length);
24
+ return i;
25
+ }
26
+ function E(e) {
27
+ if (e.length < 2) return;
28
+ let t = e[e.length - 1], n = e[e.length - 2];
29
+ if (!(n <= 0)) return Math.round((t - n) / n * 100);
30
+ }
31
+ function D({ name: e, size: t = 38 }) {
32
+ return /* @__PURE__ */ p("span", {
33
+ "aria-hidden": "true",
34
+ className: "inline-flex shrink-0 items-center justify-center rounded-full bg-bg-elevated font-medium text-text-secondary",
35
+ style: {
36
+ width: t,
37
+ height: t,
38
+ fontSize: Math.round(t * .36)
39
+ },
40
+ children: r(e)
41
+ });
42
+ }
43
+ var ve = [
44
+ "new",
45
+ "screening",
46
+ "interview",
47
+ "assessment",
48
+ "offer",
49
+ "hired"
50
+ ];
51
+ function O() {
52
+ let { t: r } = _e(), O = oe(), { showToast: k } = ge(), { currentUser: A } = e(), { employees: j, jobPostings: M, interviews: N, leaveRequests: P, projects: F, candidates: I, announcements: L, updateLeaveRequest: ye } = t(), [R, z] = s(null), [be, xe] = s({}), Se = A?.name || [A?.firstName, A?.lastName].filter(Boolean).join(" ") || A?.email || "Manager", B = async (e, t) => {
53
+ z(e);
16
54
  try {
17
- await M(e, {
55
+ await ye(e, {
18
56
  status: t,
19
- approverName: F
20
- }), T(t === "approved" ? "Leave approved" : "Leave rejected", "success");
57
+ approverName: Se
58
+ }), k(t === "approved" ? "Leave approved" : "Leave rejected", "success");
21
59
  } catch (e) {
22
- T(e instanceof Error ? e.message : "Unable to update leave request", "error");
60
+ k(e instanceof Error ? e.message : "Unable to update leave request", "error");
23
61
  } finally {
24
- P(null);
62
+ z(null);
25
63
  }
26
- }, L = (e, t) => {
27
- let n = C(e);
64
+ }, V = (e, t) => {
65
+ let n = r(e);
28
66
  return n === e ? t : n;
29
- }, R = D.filter((e) => e.status === "active").length, z = D.filter((e) => e.status === "on_leave").length, B = O.filter((e) => e.status === "active").length, V = O.reduce((e, t) => e + t.applicants, 0), H = k.filter((e) => e.status === "pending").length, U = A.filter((e) => !e.read).length, W = j.filter((e) => e.status === "active").length, G = (D.reduce((e, t) => e + t.performanceScore, 0) / Math.max(D.length, 1)).toFixed(1), K = D.reduce((e, t) => (e[t.department] = (e[t.department] || 0) + 1, e), {}), q = Object.values(K), ce = q.length ? Math.max(...q) : 1, J = [...se].filter((e) => e.status === "scheduled").sort((e, t) => `${e.date} ${e.time}`.localeCompare(`${t.date} ${t.time}`)), Y = J.slice(0, 5), X = [...k].sort((e, t) => e.status === "pending" && t.status !== "pending" ? -1 : t.status === "pending" && e.status !== "pending" ? 1 : t.startDate.localeCompare(e.startDate)), { page: Z, pageSize: Q, offset: $, setPage: le } = x({ initialPageSize: 6 }), ue = X.slice($, $ + Q);
30
- return /* @__PURE__ */ c("div", {
67
+ }, Ce = j.filter((e) => e.status === "active").length, we = j.filter((e) => e.status === "on_leave").length, Te = M.filter((e) => e.status === "active").length, Ee = M.reduce((e, t) => e + t.applicants, 0), De = P.filter((e) => e.status === "pending").length, Oe = F.filter((e) => e.status === "active").length, ke = (j.reduce((e, t) => e + t.performanceScore, 0) / Math.max(j.length, 1)).toFixed(1), H = o(() => te(j), [j]), Ae = H.map((e) => e.value), je = ne(H).deltaPercent, U = o(() => T(M.filter((e) => e.status === "active").map((e) => e.postedDate)), [M]), W = o(() => T(F.filter((e) => e.status === "active").map((e) => e.startDate)), [F]), G = o(() => {
68
+ let e = (e) => ve.indexOf(e), t = (t) => I.filter((n) => e(n.status) >= t).length;
69
+ return {
70
+ applied: I.length,
71
+ screening: t(1),
72
+ interview: t(2),
73
+ offer: t(4),
74
+ hired: t(5)
75
+ };
76
+ }, [I]), Me = [
77
+ {
78
+ label: V("crewfoundry.dashboard.pipeline.applied", "Applied"),
79
+ value: G.applied
80
+ },
81
+ {
82
+ label: V("crewfoundry.dashboard.pipeline.screening", "Screening"),
83
+ value: G.screening
84
+ },
85
+ {
86
+ label: V("crewfoundry.dashboard.pipeline.interview", "Interview"),
87
+ value: G.interview
88
+ },
89
+ {
90
+ label: V("crewfoundry.dashboard.pipeline.offer", "Offer"),
91
+ value: G.offer
92
+ },
93
+ {
94
+ label: V("crewfoundry.dashboard.pipeline.hired", "Hired"),
95
+ value: G.hired
96
+ }
97
+ ], Ne = o(() => {
98
+ let e = /* @__PURE__ */ new Map();
99
+ for (let t of j) e.set(`${t.firstName} ${t.lastName}`.trim().toLowerCase(), t.avatar);
100
+ return e;
101
+ }, [j]), K = [...N].filter((e) => e.status === "scheduled").sort((e, t) => `${e.date} ${e.time}`.localeCompare(`${t.date} ${t.time}`)), q = K.slice(0, 5), J = o(() => [...L].sort((e, t) => e.isPinned === t.isPinned ? t.createdAt.localeCompare(e.createdAt) : e.isPinned ? -1 : 1), [L]), Y = J.slice(0, 4), X = [...P].sort((e, t) => e.status === "pending" && t.status !== "pending" ? -1 : t.status === "pending" && e.status !== "pending" ? 1 : t.startDate.localeCompare(e.startDate)), { page: Z, pageSize: Q, offset: $, setPage: Pe } = he({ initialPageSize: 6 }), Fe = X.slice($, $ + Q);
102
+ return /* @__PURE__ */ m("div", {
31
103
  className: "space-y-6 p-6",
32
104
  children: [
33
- /* @__PURE__ */ c("div", {
105
+ /* @__PURE__ */ m("div", {
34
106
  className: "relative overflow-hidden rounded-xl border border-border-seam bg-gloss-card p-6",
35
- children: [/* @__PURE__ */ s(re, { intensity: "subtle" }), /* @__PURE__ */ s("div", {
107
+ children: [/* @__PURE__ */ p(se, { intensity: "subtle" }), /* @__PURE__ */ m("div", {
36
108
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
37
- children: /* @__PURE__ */ c("div", { children: [
38
- /* @__PURE__ */ s("h1", {
109
+ children: [/* @__PURE__ */ m("div", { children: [
110
+ /* @__PURE__ */ p("h1", {
39
111
  className: "text-2xl font-semibold",
40
- children: /* @__PURE__ */ s(ae, { children: L("crewfoundry.dashboard.title", "Workforce Dashboard") })
112
+ children: /* @__PURE__ */ p(de, { children: V("crewfoundry.dashboard.title", "Command Center") })
41
113
  }),
42
- /* @__PURE__ */ s("p", {
114
+ /* @__PURE__ */ p("p", {
43
115
  className: "text-sm text-text-secondary",
44
- children: L("crewfoundry.dashboard.subtitle", "Overview of your organization's workforce metrics")
116
+ children: V("crewfoundry.dashboard.subtitle", "Your workforce at a glance")
45
117
  }),
46
- /* @__PURE__ */ s(y, {
118
+ /* @__PURE__ */ p(pe, {
47
119
  className: "mt-2",
48
- children: L("crewfoundry.dashboard.purpose", "Your workforce command center — see headcount, hiring, performance, and projects at a glance, then jump straight to the area that needs your attention.")
120
+ children: V("crewfoundry.dashboard.purpose", "Your workforce command center — see headcount, hiring, performance, and projects at a glance, then jump straight to the area that needs your attention.")
121
+ })
122
+ ] }), /* @__PURE__ */ m(ce, { children: [/* @__PURE__ */ p(C, {
123
+ asChild: !0,
124
+ children: /* @__PURE__ */ m(g, {
125
+ className: "self-start",
126
+ children: [/* @__PURE__ */ p(ie, { className: "mr-1 h-4 w-4" }), V("crewfoundry.dashboard.new", "New")]
49
127
  })
50
- ] })
128
+ }), /* @__PURE__ */ m(le, {
129
+ align: "end",
130
+ className: "w-52",
131
+ children: [
132
+ /* @__PURE__ */ p(ue, { children: V("crewfoundry.dashboard.newMenu", "Create") }),
133
+ /* @__PURE__ */ p(S, {}),
134
+ /* @__PURE__ */ m(x, {
135
+ onClick: () => O("../hr/employees-page"),
136
+ children: [/* @__PURE__ */ p(d, { className: "mr-2 h-4 w-4" }), V("crewfoundry.dashboard.newEmployee", "Add employee")]
137
+ }),
138
+ /* @__PURE__ */ m(x, {
139
+ onClick: () => O("../hiring/create-job-page"),
140
+ children: [/* @__PURE__ */ p(l, { className: "mr-2 h-4 w-4" }), V("crewfoundry.dashboard.newJob", "Post a job")]
141
+ }),
142
+ /* @__PURE__ */ m(x, {
143
+ onClick: () => O("../projects/projects-page"),
144
+ children: [/* @__PURE__ */ p(re, { className: "mr-2 h-4 w-4" }), V("crewfoundry.dashboard.newProject", "New project")]
145
+ })
146
+ ]
147
+ })] })]
51
148
  })]
52
149
  }),
53
- /* @__PURE__ */ s(v, {
150
+ /* @__PURE__ */ p(fe, {
54
151
  storageKey: "crewfoundry-dashboard",
55
152
  steps: [
56
153
  {
57
154
  id: "employees",
58
- label: L("crewfoundry.dashboard.next.employees", "Review your team"),
59
- description: L("crewfoundry.dashboard.next.employeesDesc", "Open the employee directory to see who is active and on leave."),
60
- icon: /* @__PURE__ */ s(o, { className: "h-4 w-4" }),
61
- onClick: () => w("../hr/employees-page")
155
+ label: V("crewfoundry.dashboard.next.employees", "Review your team"),
156
+ description: V("crewfoundry.dashboard.next.employeesDesc", "Open the employee directory to see who is active and on leave."),
157
+ icon: /* @__PURE__ */ p(f, { className: "h-4 w-4" }),
158
+ onClick: () => O("../hr/employees-page")
62
159
  },
63
160
  {
64
161
  id: "hiring",
65
- label: L("crewfoundry.dashboard.next.hiring", "Post a new job"),
66
- description: L("crewfoundry.dashboard.next.hiringDesc", "Create an opening to start collecting applicants."),
67
- icon: /* @__PURE__ */ s(i, { className: "h-4 w-4" }),
68
- onClick: () => w("../hiring/create-job-page")
162
+ label: V("crewfoundry.dashboard.next.hiring", "Post a new job"),
163
+ description: V("crewfoundry.dashboard.next.hiringDesc", "Create an opening to start collecting applicants."),
164
+ icon: /* @__PURE__ */ p(l, { className: "h-4 w-4" }),
165
+ onClick: () => O("../hiring/create-job-page")
69
166
  },
70
167
  {
71
168
  id: "projects",
72
- label: L("crewfoundry.dashboard.next.projects", "Check active projects"),
73
- description: L("crewfoundry.dashboard.next.projectsDesc", "Track progress and budgets across in-flight work."),
74
- icon: /* @__PURE__ */ s(r, { className: "h-4 w-4" }),
75
- onClick: () => w("../projects/projects-page")
169
+ label: V("crewfoundry.dashboard.next.projects", "Check active projects"),
170
+ description: V("crewfoundry.dashboard.next.projectsDesc", "Track progress and budgets across in-flight work."),
171
+ icon: /* @__PURE__ */ p(c, { className: "h-4 w-4" }),
172
+ onClick: () => O("../projects/projects-page")
76
173
  }
77
174
  ]
78
175
  }),
79
- /* @__PURE__ */ c("div", {
80
- className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
176
+ /* @__PURE__ */ m("div", {
177
+ className: "grid gap-4 lg:grid-cols-12",
81
178
  children: [
82
- /* @__PURE__ */ c(g, {
83
- treatment: "glass",
84
- glow: !0,
85
- className: "border-border-seam",
86
- children: [/* @__PURE__ */ c(m, {
87
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
88
- children: [/* @__PURE__ */ s(h, {
89
- className: "text-sm font-medium",
90
- children: L("crewfoundry.dashboard.stats.totalEmployees", "Total Employees")
91
- }), /* @__PURE__ */ s(o, { className: "h-4 w-4 text-text-secondary" })]
92
- }), /* @__PURE__ */ c(f, { children: [/* @__PURE__ */ s("div", {
93
- className: "text-2xl font-bold tabular-nums",
94
- children: D.length
95
- }), /* @__PURE__ */ c("p", {
96
- className: "text-xs text-text-secondary",
97
- children: [
98
- R,
99
- " ",
100
- L("crewfoundry.dashboard.stats.active", "active"),
101
- ", ",
102
- z,
103
- " ",
104
- L("crewfoundry.dashboard.stats.onLeave", "on leave")
105
- ]
106
- })] })]
107
- }),
108
- /* @__PURE__ */ c(g, {
109
- treatment: "metric",
110
- className: "border-border-seam",
111
- children: [/* @__PURE__ */ c(m, {
112
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
113
- children: [/* @__PURE__ */ s(h, {
114
- className: "text-sm font-medium",
115
- children: L("crewfoundry.dashboard.stats.openPositions", "Open Positions")
116
- }), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
117
- }), /* @__PURE__ */ c(f, { children: [/* @__PURE__ */ s("div", {
118
- className: "text-2xl font-bold tabular-nums",
119
- children: B
120
- }), /* @__PURE__ */ c("p", {
121
- className: "text-xs text-text-secondary",
122
- children: [
123
- V,
124
- " ",
125
- L("crewfoundry.dashboard.stats.totalApplicants", "total applicants")
126
- ]
127
- })] })]
179
+ /* @__PURE__ */ m("div", {
180
+ className: "grid gap-4 sm:grid-cols-2 lg:col-span-5",
181
+ children: [
182
+ /* @__PURE__ */ p(a, {
183
+ label: V("crewfoundry.dashboard.stats.totalEmployees", "Total Employees"),
184
+ value: j.length,
185
+ delta: je || void 0,
186
+ deltaLabel: V("crewfoundry.dashboard.stats.fromLastMonth", "from last month"),
187
+ icon: /* @__PURE__ */ p(f, { className: "h-4 w-4" }),
188
+ sparkline: Ae,
189
+ sparklineVariant: "area"
190
+ }),
191
+ /* @__PURE__ */ p(a, {
192
+ label: V("crewfoundry.dashboard.stats.openPositions", "Open Positions"),
193
+ value: Te,
194
+ delta: E(U),
195
+ deltaLabel: V("crewfoundry.dashboard.stats.fromLastMonth", "from last month"),
196
+ icon: /* @__PURE__ */ p(l, { className: "h-4 w-4" }),
197
+ sparkline: U,
198
+ sparklineVariant: "area"
199
+ }),
200
+ /* @__PURE__ */ p(a, {
201
+ label: V("crewfoundry.dashboard.stats.activeProjects", "Active Projects"),
202
+ value: Oe,
203
+ delta: E(W),
204
+ deltaLabel: V("crewfoundry.dashboard.stats.fromLastMonth", "from last month"),
205
+ icon: /* @__PURE__ */ p(c, { className: "h-4 w-4" }),
206
+ sparkline: W,
207
+ sparklineVariant: "area"
208
+ }),
209
+ /* @__PURE__ */ p(a, {
210
+ label: V("crewfoundry.dashboard.stats.avgPerformance", "Avg Performance"),
211
+ value: `${ke}`,
212
+ icon: /* @__PURE__ */ p(ae, { className: "h-4 w-4" })
213
+ })
214
+ ]
128
215
  }),
129
- /* @__PURE__ */ c(g, {
130
- treatment: "metric",
131
- className: "border-border-seam",
132
- children: [/* @__PURE__ */ c(m, {
133
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
134
- children: [/* @__PURE__ */ s(h, {
135
- className: "text-sm font-medium",
136
- children: L("crewfoundry.dashboard.stats.avgPerformance", "Avg Performance")
137
- }), /* @__PURE__ */ s(a, { className: "h-4 w-4 text-text-secondary" })]
138
- }), /* @__PURE__ */ c(f, { children: [/* @__PURE__ */ c("div", {
139
- className: "text-2xl font-bold tabular-nums",
140
- children: [G, "/5"]
141
- }), /* @__PURE__ */ s("p", {
142
- className: "text-xs text-text-secondary",
143
- children: L("crewfoundry.dashboard.stats.performanceTrend", `Team average across ${D.length} employees`)
144
- })] })]
216
+ /* @__PURE__ */ m(_, {
217
+ className: "lg:col-span-4",
218
+ children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, {
219
+ className: "text-base",
220
+ children: V("crewfoundry.dashboard.headcountGrowth.title", "Headcount growth")
221
+ }) }), /* @__PURE__ */ p(v, { children: H.length > 1 ? /* @__PURE__ */ p(i, {
222
+ series: H,
223
+ height: 210,
224
+ title: "Cumulative headcount by month"
225
+ }) : /* @__PURE__ */ p(w, {
226
+ illustration: "empty-data",
227
+ title: V("crewfoundry.dashboard.headcountGrowth.emptyTitle", "Not enough history"),
228
+ description: V("crewfoundry.dashboard.headcountGrowth.emptyDescription", "Headcount growth appears once employees span more than one hiring month.")
229
+ }) })]
145
230
  }),
146
- /* @__PURE__ */ c(g, {
147
- treatment: "metric",
148
- className: "border-border-seam",
149
- children: [/* @__PURE__ */ c(m, {
150
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
151
- children: [/* @__PURE__ */ s(h, {
152
- className: "text-sm font-medium",
153
- children: L("crewfoundry.dashboard.stats.activeProjects", "Active Projects")
154
- }), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-text-secondary" })]
155
- }), /* @__PURE__ */ c(f, { children: [/* @__PURE__ */ s("div", {
156
- className: "text-2xl font-bold tabular-nums",
157
- children: W
158
- }), /* @__PURE__ */ c("p", {
159
- className: "text-xs text-text-secondary",
231
+ /* @__PURE__ */ m(_, {
232
+ className: "lg:col-span-3",
233
+ children: [/* @__PURE__ */ p(y, {
234
+ className: "flex flex-row items-center justify-between space-y-0",
235
+ children: /* @__PURE__ */ p(b, {
236
+ className: "text-base",
237
+ children: V("crewfoundry.dashboard.upcomingInterviews.title", "Upcoming interviews")
238
+ })
239
+ }), /* @__PURE__ */ m(v, {
240
+ className: "space-y-3",
160
241
  children: [
161
- H,
162
- " ",
163
- L("crewfoundry.dashboard.stats.pendingLeaveRequests", "pending leave requests")
242
+ q.length === 0 && /* @__PURE__ */ p(w, {
243
+ illustration: "empty-data",
244
+ title: V("crewfoundry.dashboard.upcomingInterviews.emptyTitle", "No interviews scheduled"),
245
+ description: V("crewfoundry.dashboard.upcomingInterviews.emptyDescription", "Scheduled interviews will appear here.")
246
+ }),
247
+ q.map((e) => {
248
+ let t = Ne.get(e.candidateName.trim().toLowerCase());
249
+ return /* @__PURE__ */ m("div", {
250
+ className: "flex items-center gap-3",
251
+ children: [
252
+ t ? /* @__PURE__ */ p("img", {
253
+ src: t,
254
+ alt: "",
255
+ className: "h-9 w-9 shrink-0 rounded-full object-cover"
256
+ }) : /* @__PURE__ */ p(D, { name: e.candidateName }),
257
+ /* @__PURE__ */ m("div", {
258
+ className: "min-w-0 flex-1",
259
+ children: [/* @__PURE__ */ p("p", {
260
+ className: "truncate text-sm font-medium",
261
+ children: e.candidateName
262
+ }), /* @__PURE__ */ p("p", {
263
+ className: "truncate text-xs text-text-secondary",
264
+ children: e.position
265
+ })]
266
+ }),
267
+ /* @__PURE__ */ m("div", {
268
+ className: "flex shrink-0 items-center gap-1.5 text-right",
269
+ children: [/* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
270
+ className: "text-xs font-medium",
271
+ children: e.time
272
+ }), /* @__PURE__ */ p("p", {
273
+ className: "text-[10px] text-text-secondary",
274
+ children: e.date
275
+ })] }), /* @__PURE__ */ p(u, { className: "h-3.5 w-3.5 text-text-secondary" })]
276
+ })
277
+ ]
278
+ }, e.id);
279
+ }),
280
+ K.length > q.length && /* @__PURE__ */ p(g, {
281
+ variant: "ghost",
282
+ size: "sm",
283
+ className: "w-full",
284
+ onClick: () => O("../hiring/interviews-page"),
285
+ children: V("crewfoundry.dashboard.upcomingInterviews.viewAll", "View All")
286
+ })
164
287
  ]
165
- })] })]
288
+ })]
166
289
  })
167
290
  ]
168
291
  }),
169
- /* @__PURE__ */ c("div", {
170
- className: "grid gap-4 md:grid-cols-7",
171
- children: [/* @__PURE__ */ c(ie, {
172
- className: "col-span-4",
173
- children: [
174
- /* @__PURE__ */ s("div", {
175
- className: "mb-1 text-lg font-semibold",
176
- children: L("crewfoundry.dashboard.departmentHeadcount.title", "Department Headcount")
177
- }),
178
- /* @__PURE__ */ s("p", {
179
- className: "mb-4 text-sm text-text-secondary",
180
- children: L("crewfoundry.dashboard.departmentHeadcount.description", "Employee distribution across departments")
181
- }),
182
- /* @__PURE__ */ s("div", {
183
- className: "space-y-3",
184
- children: Object.entries(K).sort(([, e], [, t]) => t - e).map(([e, t]) => /* @__PURE__ */ c("div", {
185
- className: "flex items-center gap-3",
292
+ /* @__PURE__ */ m("div", {
293
+ className: "grid gap-4 lg:grid-cols-12",
294
+ children: [/* @__PURE__ */ m(_, {
295
+ className: "lg:col-span-8",
296
+ children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, {
297
+ className: "text-base",
298
+ children: V("crewfoundry.dashboard.pipeline.title", "Hiring pipeline")
299
+ }) }), /* @__PURE__ */ p(v, { children: I.length > 0 ? /* @__PURE__ */ p(ee, {
300
+ stages: Me,
301
+ valueFormatter: (e) => `${e}`
302
+ }) : /* @__PURE__ */ p(w, {
303
+ illustration: "empty-data",
304
+ title: V("crewfoundry.dashboard.pipeline.emptyTitle", "No candidates yet"),
305
+ description: V("crewfoundry.dashboard.pipeline.emptyDescription", "Your hiring funnel appears here once candidates enter the pipeline.")
306
+ }) })]
307
+ }), /* @__PURE__ */ m(_, {
308
+ className: "lg:col-span-4",
309
+ children: [/* @__PURE__ */ m(y, {
310
+ className: "flex flex-row items-center justify-between space-y-0",
311
+ children: [/* @__PURE__ */ p(b, {
312
+ className: "text-base",
313
+ children: V("crewfoundry.dashboard.announcements.title", "Announcements")
314
+ }), J.length > Y.length && /* @__PURE__ */ p(g, {
315
+ variant: "ghost",
316
+ size: "sm",
317
+ onClick: () => O("../communications/announcements-page"),
318
+ children: V("crewfoundry.dashboard.announcements.viewAll", "View All")
319
+ })]
320
+ }), /* @__PURE__ */ m(v, {
321
+ className: "space-y-4",
322
+ children: [Y.length === 0 && /* @__PURE__ */ p(w, {
323
+ illustration: "empty-data",
324
+ title: V("crewfoundry.dashboard.announcements.emptyTitle", "No announcements"),
325
+ description: V("crewfoundry.dashboard.announcements.emptyDescription", "Company announcements will appear here.")
326
+ }), Y.map((e) => {
327
+ let t = be[e.id], n = e.content.length > 120;
328
+ return /* @__PURE__ */ m("div", {
329
+ className: "space-y-1",
186
330
  children: [
187
- /* @__PURE__ */ s("span", {
188
- className: "w-24 text-sm text-text-secondary truncate",
189
- children: e
331
+ /* @__PURE__ */ m("div", {
332
+ className: "flex items-center gap-2",
333
+ children: [/* @__PURE__ */ p("p", {
334
+ className: "text-sm font-medium",
335
+ children: e.title
336
+ }), e.isPinned && /* @__PURE__ */ p(h, {
337
+ variant: "outline",
338
+ className: "text-[10px]",
339
+ children: V("crewfoundry.dashboard.announcements.pinned", "Pinned")
340
+ })]
190
341
  }),
191
- /* @__PURE__ */ s("div", {
192
- className: "flex-1 h-4 bg-bg-sunken rounded overflow-hidden",
193
- children: /* @__PURE__ */ s("div", {
194
- className: "h-4 bg-action-primary-bg rounded",
195
- style: { width: `${Math.round(t / ce * 100)}%` }
196
- })
342
+ /* @__PURE__ */ m("p", {
343
+ className: "text-xs text-text-secondary",
344
+ children: [
345
+ e.createdAt,
346
+ " · ",
347
+ e.author
348
+ ]
349
+ }),
350
+ /* @__PURE__ */ p("p", {
351
+ className: "text-sm text-text-secondary",
352
+ children: t || !n ? e.content : `${e.content.slice(0, 120)}…`
197
353
  }),
198
- /* @__PURE__ */ s("span", {
199
- className: "text-sm font-medium w-8 text-right tabular-nums",
200
- children: t
354
+ n && /* @__PURE__ */ p("button", {
355
+ type: "button",
356
+ className: "text-xs font-medium text-action-primary-bg hover:underline",
357
+ onClick: () => xe((t) => ({
358
+ ...t,
359
+ [e.id]: !t[e.id]
360
+ })),
361
+ children: t ? V("crewfoundry.dashboard.announcements.readLess", "Read Less") : V("crewfoundry.dashboard.announcements.readMore", "Read More")
201
362
  })
202
363
  ]
203
- }, e))
204
- })
205
- ]
206
- }), /* @__PURE__ */ c(d, {
207
- className: "col-span-3",
208
- children: [/* @__PURE__ */ c(m, {
209
- className: "flex flex-row items-center justify-between",
210
- children: [/* @__PURE__ */ s(h, { children: L("crewfoundry.dashboard.notifications.title", "Recent Notifications") }), /* @__PURE__ */ c(l, {
211
- variant: "secondary",
212
- children: [
213
- U,
214
- " ",
215
- L("crewfoundry.dashboard.notifications.unread", "unread")
216
- ]
364
+ }, e.id);
217
365
  })]
218
- }), /* @__PURE__ */ s(f, {
219
- className: "space-y-4",
220
- children: A.slice(0, 5).map((e) => /* @__PURE__ */ c("div", {
221
- className: "flex items-start gap-3",
222
- children: [/* @__PURE__ */ s("div", { className: `mt-1 h-2 w-2 rounded-full flex-shrink-0 motion-safe:animate-vc-glow-pulse ${e.type === "success" ? "bg-status-success-text" : e.type === "warning" ? "bg-status-warning-text" : e.type === "error" ? "bg-status-error-text" : "bg-status-info-text"}` }), /* @__PURE__ */ c("div", {
223
- className: "flex-1 min-w-0",
224
- children: [/* @__PURE__ */ s("p", {
225
- className: `text-sm ${e.read ? "text-text-secondary" : "font-medium"}`,
226
- children: e.title
227
- }), /* @__PURE__ */ s("p", {
228
- className: "text-xs text-text-secondary truncate",
229
- children: e.message
230
- })]
231
- })]
232
- }, e.id))
233
366
  })]
234
367
  })]
235
368
  }),
236
- /* @__PURE__ */ c("div", {
237
- className: "grid gap-4 md:grid-cols-2",
238
- children: [/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c(m, { children: [/* @__PURE__ */ s(h, { children: L("crewfoundry.dashboard.upcomingInterviews.title", "Upcoming Interviews") }), /* @__PURE__ */ s(p, { children: L("crewfoundry.dashboard.upcomingInterviews.description", "Scheduled for this week") })] }), /* @__PURE__ */ c(f, {
239
- className: "space-y-3",
240
- children: [
241
- Y.length === 0 && /* @__PURE__ */ s(_, {
242
- illustration: "empty-data",
243
- title: L("crewfoundry.dashboard.upcomingInterviews.emptyTitle", "No interviews scheduled"),
244
- description: L("crewfoundry.dashboard.upcomingInterviews.emptyDescription", "Scheduled interviews will appear here.")
245
- }),
246
- Y.map((e) => /* @__PURE__ */ c("div", {
247
- className: "flex items-center justify-between rounded border p-3",
248
- children: [/* @__PURE__ */ c("div", {
249
- className: "min-w-0",
250
- children: [/* @__PURE__ */ s("p", {
251
- className: "text-sm font-medium truncate",
252
- children: e.candidateName
253
- }), /* @__PURE__ */ s("p", {
254
- className: "text-xs text-text-secondary truncate",
255
- children: e.position
256
- })]
257
- }), /* @__PURE__ */ c("div", {
258
- className: "flex items-center gap-2 flex-shrink-0",
259
- children: [/* @__PURE__ */ c("div", {
260
- className: "text-right",
261
- children: [/* @__PURE__ */ s("p", {
262
- className: "text-xs font-medium",
263
- children: e.date
264
- }), /* @__PURE__ */ s("p", {
265
- className: "text-xs text-text-secondary",
266
- children: e.time
369
+ /* @__PURE__ */ m(_, { children: [/* @__PURE__ */ p(y, { children: /* @__PURE__ */ p(b, {
370
+ className: "text-base",
371
+ children: V("crewfoundry.dashboard.leaveRequests.title", "Recent Leave Requests")
372
+ }) }), /* @__PURE__ */ m(v, {
373
+ className: "space-y-3",
374
+ children: [
375
+ P.length === 0 && /* @__PURE__ */ p(w, {
376
+ illustration: "empty-data",
377
+ title: V("crewfoundry.dashboard.leaveRequests.emptyTitle", "No leave requests"),
378
+ description: V("crewfoundry.dashboard.leaveRequests.emptyDescription", "Pending leave requests will appear here.")
379
+ }),
380
+ Fe.map((e) => /* @__PURE__ */ m("div", {
381
+ className: "flex items-center justify-between rounded border p-3",
382
+ children: [/* @__PURE__ */ m("div", {
383
+ className: "flex items-center gap-3",
384
+ children: [/* @__PURE__ */ p(D, {
385
+ name: e.employeeName,
386
+ size: 34
387
+ }), /* @__PURE__ */ m("div", { children: [/* @__PURE__ */ p("p", {
388
+ className: "text-sm font-medium",
389
+ children: e.employeeName
390
+ }), /* @__PURE__ */ m("div", {
391
+ className: "flex items-center gap-2 text-xs text-text-secondary",
392
+ children: [/* @__PURE__ */ p(u, { className: "h-3 w-3" }), /* @__PURE__ */ m("span", { children: [
393
+ e.startDate,
394
+ " - ",
395
+ e.endDate
396
+ ] })]
397
+ })] })]
398
+ }), /* @__PURE__ */ m("div", {
399
+ className: "flex items-center gap-2",
400
+ children: [
401
+ e.status === "pending" && /* @__PURE__ */ m("div", {
402
+ className: "flex gap-1",
403
+ children: [/* @__PURE__ */ p(g, {
404
+ size: "sm",
405
+ variant: "outline",
406
+ className: "h-7 text-xs",
407
+ disabled: R === e.id,
408
+ onClick: () => void B(e.id, "rejected"),
409
+ children: V("crewfoundry.dashboard.leaveRequests.reject", "Reject")
410
+ }), /* @__PURE__ */ p(g, {
411
+ size: "sm",
412
+ className: "h-7 text-xs",
413
+ disabled: R === e.id,
414
+ onClick: () => void B(e.id, "approved"),
415
+ children: V("crewfoundry.dashboard.leaveRequests.approve", "Approve")
267
416
  })]
268
- }), /* @__PURE__ */ s(l, {
417
+ }),
418
+ /* @__PURE__ */ p(h, {
419
+ variant: e.status === "approved" ? "default" : e.status === "pending" ? "secondary" : "destructive",
420
+ children: n(e.status)
421
+ }),
422
+ /* @__PURE__ */ p(h, {
269
423
  variant: "outline",
270
- className: "text-[10px]",
271
424
  children: n(e.type)
272
- })]
273
- })]
274
- }, e.id)),
275
- J.length > Y.length && /* @__PURE__ */ s(u, {
276
- variant: "ghost",
277
- size: "sm",
278
- className: "w-full",
279
- onClick: () => w("../hiring/interviews-page"),
280
- children: L("crewfoundry.dashboard.upcomingInterviews.viewAll", "View all interviews")
281
- })
282
- ]
283
- })] }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c(m, { children: [/* @__PURE__ */ s(h, { children: L("crewfoundry.dashboard.leaveRequests.title", "Recent Leave Requests") }), /* @__PURE__ */ s(p, { children: L("crewfoundry.dashboard.leaveRequests.description", "Pending approval") })] }), /* @__PURE__ */ c(f, {
284
- className: "space-y-3",
285
- children: [
286
- k.length === 0 && /* @__PURE__ */ s(_, {
287
- illustration: "empty-data",
288
- title: L("crewfoundry.dashboard.leaveRequests.emptyTitle", "No leave requests"),
289
- description: L("crewfoundry.dashboard.leaveRequests.emptyDescription", "Pending leave requests will appear here.")
290
- }),
291
- ue.map((e) => /* @__PURE__ */ c("div", {
292
- className: "flex items-center justify-between rounded border p-3",
293
- children: [/* @__PURE__ */ s("div", {
294
- className: "flex items-center gap-3",
295
- children: /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
296
- className: "text-sm font-medium",
297
- children: e.employeeName
298
- }), /* @__PURE__ */ c("div", {
299
- className: "flex items-center gap-2 text-xs text-text-secondary",
300
- children: [/* @__PURE__ */ s(te, { className: "h-3 w-3" }), /* @__PURE__ */ c("span", { children: [
301
- e.startDate,
302
- " - ",
303
- e.endDate
304
- ] })]
305
- })] })
306
- }), /* @__PURE__ */ c("div", {
307
- className: "flex items-center gap-2",
308
- children: [
309
- e.status === "pending" && /* @__PURE__ */ c("div", {
310
- className: "flex gap-1",
311
- children: [/* @__PURE__ */ s(u, {
312
- size: "sm",
313
- variant: "outline",
314
- className: "h-7 text-xs",
315
- disabled: N === e.id,
316
- onClick: () => void I(e.id, "rejected"),
317
- children: L("crewfoundry.dashboard.leaveRequests.reject", "Reject")
318
- }), /* @__PURE__ */ s(u, {
319
- size: "sm",
320
- className: "h-7 text-xs",
321
- disabled: N === e.id,
322
- onClick: () => void I(e.id, "approved"),
323
- children: L("crewfoundry.dashboard.leaveRequests.approve", "Approve")
324
- })]
325
- }),
326
- /* @__PURE__ */ s(l, {
327
- variant: e.status === "approved" ? "default" : e.status === "pending" ? "secondary" : "destructive",
328
- children: n(e.status)
329
- }),
330
- /* @__PURE__ */ s(l, {
331
- variant: "outline",
332
- children: n(e.type)
333
- })
334
- ]
335
- })]
336
- }, e.id)),
337
- X.length > Q && /* @__PURE__ */ s(b, {
338
- page: Z,
339
- pageSize: Q,
340
- totalItems: X.length,
341
- onPageChange: le
342
- })
343
- ]
344
- })] })]
425
+ })
426
+ ]
427
+ })]
428
+ }, e.id)),
429
+ X.length > Q && /* @__PURE__ */ p(me, {
430
+ page: Z,
431
+ pageSize: Q,
432
+ totalItems: X.length,
433
+ onPageChange: Pe
434
+ })
435
+ ]
436
+ })] }),
437
+ /* @__PURE__ */ m("p", {
438
+ className: "text-center text-xs text-text-muted",
439
+ children: [
440
+ Ce,
441
+ " ",
442
+ V("crewfoundry.dashboard.stats.active", "active"),
443
+ " · ",
444
+ we,
445
+ " ",
446
+ V("crewfoundry.dashboard.stats.onLeave", "on leave"),
447
+ " · ",
448
+ Ee,
449
+ " ",
450
+ V("crewfoundry.dashboard.stats.totalApplicants", "total applicants"),
451
+ " · ",
452
+ De,
453
+ " ",
454
+ V("crewfoundry.dashboard.stats.pendingLeaveRequests", "pending leave requests")
455
+ ]
345
456
  })
346
457
  ]
347
458
  });
348
459
  }
349
460
  //#endregion
350
- export { C as DashboardDashboardPagePage };
461
+ export { O as DashboardDashboardPagePage };
351
462
 
352
463
  //# sourceMappingURL=DashboardDashboardPagePage.js.map