@burdenoff/microfe-crewfoundry 2026.624.1 → 2026.625.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/crewfoundry/pages/AdminAdminPagePage.js +100 -76
  2. package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
  3. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +118 -94
  4. package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
  5. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +105 -81
  6. package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
  7. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +134 -110
  8. package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -97
  10. package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
  12. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +74 -54
  14. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
  16. package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
  18. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +87 -68
  20. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  21. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
  22. package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
  23. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +81 -61
  24. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  25. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +71 -51
  26. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  27. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +82 -58
  28. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  29. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +46 -39
  30. package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
  31. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
  32. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  33. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +104 -80
  34. package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
  35. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +219 -151
  36. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  37. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +183 -142
  38. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  39. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +121 -97
  40. package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
  41. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +57 -46
  42. package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
  43. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +91 -67
  44. package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
  45. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
  46. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  47. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +55 -48
  48. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  49. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +70 -50
  50. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  51. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +140 -97
  52. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/HiringJobsPagePage.js +101 -85
  54. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +68 -48
  56. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +99 -71
  58. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +97 -73
  60. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/HrPayrollPagePage.js +100 -76
  62. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  63. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +93 -69
  64. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  65. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +65 -45
  66. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
  68. package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +117 -72
  70. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +66 -54
  72. package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +36 -20
  74. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +90 -66
  76. package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
  77. package/dist/crewfoundry/pages/LearningLearningPagePage.js +81 -57
  78. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  79. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +90 -65
  80. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  81. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
  82. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  83. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +83 -59
  84. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  85. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +68 -48
  86. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  87. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +80 -60
  88. package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
  89. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +153 -118
  90. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
  91. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +42 -37
  92. package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
  93. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +67 -47
  94. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  95. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
  96. package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
  97. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +76 -57
  98. package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
  99. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
  100. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  101. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +138 -93
  102. package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
  103. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +98 -53
  104. package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
  105. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +69 -49
  106. package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
  107. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
  108. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  109. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +76 -52
  110. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  111. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
  112. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  113. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +85 -65
  114. package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
  115. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
  116. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  117. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +108 -73
  118. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  119. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
  120. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  121. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +67 -47
  122. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  123. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +108 -63
  124. package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
  125. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
  126. package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
  127. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
  128. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  129. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
  130. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  131. package/package.json +2 -2
@@ -2,30 +2,37 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useState as t } from "react";
3
3
  import { MapPin as n, Plus as r, Search as i, Star as a, UserCheck as o, Users as s } from "lucide-react";
4
4
  import { jsx as c, jsxs as l } from "react/jsx-runtime";
5
- import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, Input as g } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, IllustratedEmptyState as v, Input as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/HrEmployeesPagePage.tsx
7
- function _() {
8
- let { employees: _ } = e(), [v, y] = t(""), [b, x] = t("all"), S = [...new Set(_.map((e) => e.department))], C = _.filter((e) => {
9
- let t = `${e.firstName} ${e.lastName} ${e.email} ${e.position}`.toLowerCase().includes(v.toLowerCase()), n = b === "all" || e.department === b;
7
+ function x() {
8
+ let { employees: x } = e(), [S, C] = t(""), [w, T] = t("all"), E = [...new Set(x.map((e) => e.department))], D = x.filter((e) => {
9
+ let t = `${e.firstName} ${e.lastName} ${e.email} ${e.position}`.toLowerCase().includes(S.toLowerCase()), n = w === "all" || e.department === w;
10
10
  return t && n;
11
- }), w = _.filter((e) => e.status === "active").length, T = _.filter((e) => e.status === "on_leave").length;
11
+ }), O = x.filter((e) => e.status === "active").length, k = x.filter((e) => e.status === "on_leave").length;
12
12
  return /* @__PURE__ */ l("div", {
13
13
  className: "space-y-6 p-6",
14
14
  children: [
15
15
  /* @__PURE__ */ l("div", {
16
16
  className: "flex items-center justify-between",
17
- children: [/* @__PURE__ */ l("div", { children: [/* @__PURE__ */ c("h1", {
18
- className: "text-2xl font-semibold",
19
- children: "Employee Directory"
20
- }), /* @__PURE__ */ l("p", {
21
- className: "text-sm text-text-secondary",
22
- children: [
23
- _.length,
24
- " employees across ",
25
- S.length,
26
- " departments"
27
- ]
28
- })] }), /* @__PURE__ */ l(d, {
17
+ children: [/* @__PURE__ */ l("div", { children: [
18
+ /* @__PURE__ */ c("h1", {
19
+ className: "text-2xl font-semibold",
20
+ children: /* @__PURE__ */ c(_, { children: "Employee Directory" })
21
+ }),
22
+ /* @__PURE__ */ l("p", {
23
+ className: "text-sm text-text-secondary",
24
+ children: [
25
+ x.length,
26
+ " employees across ",
27
+ E.length,
28
+ " departments"
29
+ ]
30
+ }),
31
+ /* @__PURE__ */ c(b, {
32
+ className: "mt-1",
33
+ children: "Your complete employee directory — search, filter, and review everyone on the team along with their role, department, and status."
34
+ })
35
+ ] }), /* @__PURE__ */ l(d, {
29
36
  size: "sm",
30
37
  children: [/* @__PURE__ */ c(r, { className: "h-4 w-4 mr-1" }), "Add Employee"]
31
38
  })]
@@ -33,69 +40,86 @@ function _() {
33
40
  /* @__PURE__ */ l("div", {
34
41
  className: "grid gap-4 md:grid-cols-4",
35
42
  children: [
36
- /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(m, {
37
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
38
- children: [/* @__PURE__ */ c(h, {
39
- className: "text-sm font-medium",
40
- children: "Total"
41
- }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-text-secondary" })]
42
- }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
43
- className: "text-2xl font-bold",
44
- children: _.length
45
- }) })] }),
46
- /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(m, {
47
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
48
- children: [/* @__PURE__ */ c(h, {
49
- className: "text-sm font-medium",
50
- children: "Active"
51
- }), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-green-500" })]
52
- }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
53
- className: "text-2xl font-bold",
54
- children: w
55
- }) })] }),
56
- /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(m, {
57
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
58
- children: [/* @__PURE__ */ c(h, {
59
- className: "text-sm font-medium",
60
- children: "On Leave"
61
- }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-yellow-500" })]
62
- }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
63
- className: "text-2xl font-bold",
64
- children: T
65
- }) })] }),
66
- /* @__PURE__ */ l(f, { children: [/* @__PURE__ */ l(m, {
67
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
68
- children: [/* @__PURE__ */ c(h, {
69
- className: "text-sm font-medium",
70
- children: "Avg Rating"
71
- }), /* @__PURE__ */ c(a, { className: "h-4 w-4 text-yellow-500" })]
72
- }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
73
- className: "text-2xl font-bold",
74
- children: (_.reduce((e, t) => e + t.performanceScore, 0) / _.length).toFixed(1)
75
- }) })] })
43
+ /* @__PURE__ */ l(g, {
44
+ treatment: "glass",
45
+ glow: !0,
46
+ className: "border-border-seam",
47
+ children: [/* @__PURE__ */ l(m, {
48
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
49
+ children: [/* @__PURE__ */ c(h, {
50
+ className: "text-sm font-medium",
51
+ children: "Total"
52
+ }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-text-secondary" })]
53
+ }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
54
+ className: "text-2xl font-bold tabular-nums",
55
+ children: x.length
56
+ }) })]
57
+ }),
58
+ /* @__PURE__ */ l(g, {
59
+ treatment: "metric",
60
+ className: "border-border-seam",
61
+ children: [/* @__PURE__ */ l(m, {
62
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
63
+ children: [/* @__PURE__ */ c(h, {
64
+ className: "text-sm font-medium",
65
+ children: "Active"
66
+ }), /* @__PURE__ */ c(o, { className: "h-4 w-4 text-status-success-text" })]
67
+ }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
68
+ className: "text-2xl font-bold tabular-nums",
69
+ children: O
70
+ }) })]
71
+ }),
72
+ /* @__PURE__ */ l(g, {
73
+ treatment: "metric",
74
+ className: "border-border-seam",
75
+ children: [/* @__PURE__ */ l(m, {
76
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
77
+ children: [/* @__PURE__ */ c(h, {
78
+ className: "text-sm font-medium",
79
+ children: "On Leave"
80
+ }), /* @__PURE__ */ c(s, { className: "h-4 w-4 text-status-warning-text" })]
81
+ }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
82
+ className: "text-2xl font-bold tabular-nums",
83
+ children: k
84
+ }) })]
85
+ }),
86
+ /* @__PURE__ */ l(g, {
87
+ treatment: "metric",
88
+ className: "border-border-seam",
89
+ children: [/* @__PURE__ */ l(m, {
90
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
91
+ children: [/* @__PURE__ */ c(h, {
92
+ className: "text-sm font-medium",
93
+ children: "Avg Rating"
94
+ }), /* @__PURE__ */ c(a, { className: "h-4 w-4 text-status-warning-text" })]
95
+ }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ c("div", {
96
+ className: "text-2xl font-bold tabular-nums",
97
+ children: (x.reduce((e, t) => e + t.performanceScore, 0) / x.length).toFixed(1)
98
+ }) })]
99
+ })
76
100
  ]
77
101
  }),
78
102
  /* @__PURE__ */ l("div", {
79
103
  className: "flex gap-3",
80
104
  children: [/* @__PURE__ */ l("div", {
81
105
  className: "relative flex-1 max-w-sm",
82
- children: [/* @__PURE__ */ c(i, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ c(g, {
106
+ children: [/* @__PURE__ */ c(i, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ c(y, {
83
107
  placeholder: "Search employees...",
84
108
  className: "pl-9",
85
- value: v,
86
- onChange: (e) => y(e.target.value)
109
+ value: S,
110
+ onChange: (e) => C(e.target.value)
87
111
  })]
88
112
  }), /* @__PURE__ */ l("div", {
89
113
  className: "flex gap-1",
90
114
  children: [/* @__PURE__ */ c(d, {
91
- variant: b === "all" ? "default" : "outline",
115
+ variant: w === "all" ? "default" : "outline",
92
116
  size: "sm",
93
- onClick: () => x("all"),
117
+ onClick: () => T("all"),
94
118
  children: "All"
95
- }), S.slice(0, 5).map((e) => /* @__PURE__ */ c(d, {
96
- variant: b === e ? "default" : "outline",
119
+ }), E.slice(0, 5).map((e) => /* @__PURE__ */ c(d, {
120
+ variant: w === e ? "default" : "outline",
97
121
  size: "sm",
98
- onClick: () => x(e),
122
+ onClick: () => T(e),
99
123
  children: e
100
124
  }, e))]
101
125
  })]
@@ -124,7 +148,7 @@ function _() {
124
148
  })
125
149
  ]
126
150
  }),
127
- C.map((e) => /* @__PURE__ */ l("div", {
151
+ D.map((e) => /* @__PURE__ */ l("div", {
128
152
  className: "grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50",
129
153
  children: [
130
154
  /* @__PURE__ */ l("div", { children: [/* @__PURE__ */ l("p", {
@@ -156,7 +180,7 @@ function _() {
156
180
  }),
157
181
  /* @__PURE__ */ l("div", {
158
182
  className: "flex items-center justify-center gap-1",
159
- children: [/* @__PURE__ */ c(a, { className: "h-3 w-3 text-yellow-500" }), /* @__PURE__ */ c("span", { children: e.performanceScore })]
183
+ children: [/* @__PURE__ */ c(a, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ c("span", { children: e.performanceScore })]
160
184
  }),
161
185
  /* @__PURE__ */ c("div", {
162
186
  className: "text-center",
@@ -168,9 +192,13 @@ function _() {
168
192
  })
169
193
  ]
170
194
  }, e.id)),
171
- C.length === 0 && /* @__PURE__ */ c("div", {
172
- className: "p-8 text-center text-sm text-text-secondary",
173
- children: "No employees match your search criteria."
195
+ D.length === 0 && /* @__PURE__ */ c("div", {
196
+ className: "p-6",
197
+ children: /* @__PURE__ */ c(v, {
198
+ illustration: "empty-people",
199
+ title: "No employees match",
200
+ description: "Try a different search term or department filter."
201
+ })
174
202
  })
175
203
  ]
176
204
  }) })
@@ -178,6 +206,6 @@ function _() {
178
206
  });
179
207
  }
180
208
  //#endregion
181
- export { _ as HrEmployeesPagePage };
209
+ export { x as HrEmployeesPagePage };
182
210
 
183
211
  //# sourceMappingURL=HrEmployeesPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HrEmployeesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrEmployeesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport { Mail, MapPin, Phone, Plus, Search, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrEmployeesPagePage() {\n const { employees } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [filterDept, setFilterDept] = useState<string>('all');\n\n const departments = [...new Set(employees.map((e) => e.department))];\n const filtered = employees.filter((e) => {\n const matchSearch = `${e.firstName} ${e.lastName} ${e.email} ${e.position}`\n .toLowerCase()\n .includes(search.toLowerCase());\n const matchDept = filterDept === 'all' || e.department === filterDept;\n return matchSearch && matchDept;\n });\n\n const activeCount = employees.filter((e) => e.status === 'active').length;\n const onLeaveCount = employees.filter((e) => e.status === 'on_leave').length;\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\">Employee Directory</h1>\n <p className=\"text-sm text-text-secondary\">\n {employees.length} employees across {departments.length} departments\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Employee\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{employees.length}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n <UserCheck className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{activeCount}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">On Leave</CardTitle>\n <Users className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{onLeaveCount}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Avg Rating</CardTitle>\n <Star className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {(employees.reduce((s, e) => s + e.performanceScore, 0) / employees.length).toFixed(\n 1\n )}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"flex gap-3\">\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search employees...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\">\n <Button\n variant={filterDept === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterDept('all')}\n >\n All\n </Button>\n {departments.slice(0, 5).map((dept) => (\n <Button\n key={dept}\n variant={filterDept === dept ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterDept(dept)}\n >\n {dept}\n </Button>\n ))}\n </div>\n </div>\n\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b p-4\">\n <span>Name</span>\n <span>Position</span>\n <span>Department</span>\n <span>Location</span>\n <span className=\"text-right\">Salary</span>\n <span className=\"text-center\">Rating</span>\n <span className=\"text-center\">Status</span>\n </div>\n {filtered.map((emp) => (\n <div\n key={emp.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <div>\n <p className=\"font-medium\">\n {emp.firstName} {emp.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{emp.email}</p>\n </div>\n <span className=\"text-text-secondary\">{emp.position}</span>\n <span>{emp.department}</span>\n <div className=\"flex items-center gap-1 text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n <span className=\"truncate text-xs\">{emp.location}</span>\n </div>\n <span className=\"text-right\">${emp.salary.toLocaleString()}</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-yellow-500\" />\n <span>{emp.performanceScore}</span>\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n emp.status === 'active'\n ? 'default'\n : emp.status === 'on_leave'\n ? 'secondary'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {emp.status.replace('_', ' ')}\n </Badge>\n </div>\n </div>\n ))}\n {filtered.length === 0 && (\n <div className=\"p-8 text-center text-sm text-text-secondary\">\n No employees match your search criteria.\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HrEmployeesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrEmployeesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Mail, MapPin, Phone, Plus, Search, Star, UserCheck, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HrEmployeesPagePage() {\n const { employees } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const [filterDept, setFilterDept] = useState<string>('all');\n\n const departments = [...new Set(employees.map((e) => e.department))];\n const filtered = employees.filter((e) => {\n const matchSearch = `${e.firstName} ${e.lastName} ${e.email} ${e.position}`\n .toLowerCase()\n .includes(search.toLowerCase());\n const matchDept = filterDept === 'all' || e.department === filterDept;\n return matchSearch && matchDept;\n });\n\n const activeCount = employees.filter((e) => e.status === 'active').length;\n const onLeaveCount = employees.filter((e) => e.status === 'on_leave').length;\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 Directory</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {employees.length} employees across {departments.length} departments\n </p>\n <PagePurpose className=\"mt-1\">Your complete employee directory — search, filter, and review everyone on the team along with their role, department, and status.</PagePurpose>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Employee\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{employees.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active</CardTitle>\n <UserCheck className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeCount}</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\">On Leave</CardTitle>\n <Users className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{onLeaveCount}</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 Rating</CardTitle>\n <Star className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {(employees.reduce((s, e) => s + e.performanceScore, 0) / employees.length).toFixed(\n 1\n )}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"flex gap-3\">\n <div className=\"relative flex-1 max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search employees...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"flex gap-1\">\n <Button\n variant={filterDept === 'all' ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterDept('all')}\n >\n All\n </Button>\n {departments.slice(0, 5).map((dept) => (\n <Button\n key={dept}\n variant={filterDept === dept ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setFilterDept(dept)}\n >\n {dept}\n </Button>\n ))}\n </div>\n </div>\n\n <Card>\n <CardContent className=\"p-0\">\n <div className=\"grid grid-cols-7 gap-2 text-xs font-medium text-text-secondary border-b p-4\">\n <span>Name</span>\n <span>Position</span>\n <span>Department</span>\n <span>Location</span>\n <span className=\"text-right\">Salary</span>\n <span className=\"text-center\">Rating</span>\n <span className=\"text-center\">Status</span>\n </div>\n {filtered.map((emp) => (\n <div\n key={emp.id}\n className=\"grid grid-cols-7 gap-2 py-3 px-4 border-b last:border-0 text-sm hover:bg-bg-sunken/50\"\n >\n <div>\n <p className=\"font-medium\">\n {emp.firstName} {emp.lastName}\n </p>\n <p className=\"text-xs text-text-secondary\">{emp.email}</p>\n </div>\n <span className=\"text-text-secondary\">{emp.position}</span>\n <span>{emp.department}</span>\n <div className=\"flex items-center gap-1 text-text-secondary\">\n <MapPin className=\"h-3 w-3\" />\n <span className=\"truncate text-xs\">{emp.location}</span>\n </div>\n <span className=\"text-right\">${emp.salary.toLocaleString()}</span>\n <div className=\"flex items-center justify-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span>{emp.performanceScore}</span>\n </div>\n <div className=\"text-center\">\n <Badge\n variant={\n emp.status === 'active'\n ? 'default'\n : emp.status === 'on_leave'\n ? 'secondary'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {emp.status.replace('_', ' ')}\n </Badge>\n </div>\n </div>\n ))}\n {filtered.length === 0 && (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-people\"\n title=\"No employees match\"\n description=\"Try a different search term or department filter.\"\n />\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -2,11 +2,11 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
2
  import { useMemo as t } from "react";
3
3
  import { Calendar as n, CheckCircle as r, Clock as i, XCircle as a } from "lucide-react";
4
4
  import { jsx as o, jsxs as s } from "react/jsx-runtime";
5
- import { Badge as c, Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
5
+ import { Badge as c, Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
6
6
  //#region src/crewfoundry/pages/HrLeaveManagementPagePage.tsx
7
- var h = (e) => e.split("_").map((e) => e[0]?.toUpperCase() + e.slice(1)).join(" ");
8
- function g() {
9
- let { leaveRequests: g } = e(), _ = g.filter((e) => e.status === "pending").length, v = g.filter((e) => e.status === "approved").length, y = g.filter((e) => e.status === "approved").reduce((e, t) => e + t.days, 0), b = t(() => {
7
+ var v = (e) => e.split("_").map((e) => e[0]?.toUpperCase() + e.slice(1)).join(" ");
8
+ function y() {
9
+ let { leaveRequests: y } = e(), b = y.filter((e) => e.status === "pending").length, x = y.filter((e) => e.status === "approved").length, S = y.filter((e) => e.status === "approved").reduce((e, t) => e + t.days, 0), C = t(() => {
10
10
  let e = {
11
11
  annual: 20,
12
12
  sick: 12,
@@ -14,32 +14,39 @@ function g() {
14
14
  maternity: 90,
15
15
  paternity: 30,
16
16
  unpaid: 15
17
- }, t = g.filter((e) => e.status === "approved").reduce((e, t) => (e[t.type] = (e[t.type] || 0) + t.days, e), {});
17
+ }, t = y.filter((e) => e.status === "approved").reduce((e, t) => (e[t.type] = (e[t.type] || 0) + t.days, e), {});
18
18
  return Object.entries(e).map(([e, n]) => {
19
19
  let r = t[e] || 0;
20
20
  return {
21
- type: h(e),
21
+ type: v(e),
22
22
  total: n,
23
23
  used: r,
24
24
  remaining: Math.max(n - r, 0)
25
25
  };
26
26
  });
27
- }, [g]), x = t(() => {
27
+ }, [y]), w = t(() => {
28
28
  let e = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
29
- return g.filter((t) => t.status === "approved" && t.startDate <= e && t.endDate >= e).length;
30
- }, [g]);
29
+ return y.filter((t) => t.status === "approved" && t.startDate <= e && t.endDate >= e).length;
30
+ }, [y]);
31
31
  return /* @__PURE__ */ s("div", {
32
32
  className: "space-y-6 p-6",
33
33
  children: [
34
34
  /* @__PURE__ */ s("div", {
35
35
  className: "flex items-center justify-between",
36
- children: [/* @__PURE__ */ s("div", { children: [/* @__PURE__ */ o("h1", {
37
- className: "text-2xl font-semibold",
38
- children: "Leave Management"
39
- }), /* @__PURE__ */ o("p", {
40
- className: "text-sm text-text-secondary",
41
- children: "Track and manage employee leave requests"
42
- })] }), /* @__PURE__ */ s(l, {
36
+ children: [/* @__PURE__ */ s("div", { children: [
37
+ /* @__PURE__ */ o("h1", {
38
+ className: "text-2xl font-semibold",
39
+ children: /* @__PURE__ */ o(g, { children: "Leave Management" })
40
+ }),
41
+ /* @__PURE__ */ o("p", {
42
+ className: "text-sm text-text-secondary",
43
+ children: "Track and manage employee leave requests"
44
+ }),
45
+ /* @__PURE__ */ o(_, {
46
+ className: "mt-1",
47
+ children: "Handle time-off in one place — review and approve leave requests and keep an eye on team availability and balances."
48
+ })
49
+ ] }), /* @__PURE__ */ s(l, {
43
50
  size: "sm",
44
51
  children: [/* @__PURE__ */ o(n, { className: "mr-1 h-4 w-4" }), "Request Leave"]
45
52
  })]
@@ -47,65 +54,82 @@ function g() {
47
54
  /* @__PURE__ */ s("div", {
48
55
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
49
56
  children: [
50
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
51
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
52
- children: [/* @__PURE__ */ o(m, {
53
- className: "text-sm font-medium",
54
- children: "Pending"
55
- }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-yellow-500" })]
56
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
57
- className: "text-2xl font-bold",
58
- children: _
59
- }), /* @__PURE__ */ o("p", {
60
- className: "text-xs text-text-secondary",
61
- children: "Awaiting approval"
62
- })] })] }),
63
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
64
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
65
- children: [/* @__PURE__ */ o(m, {
66
- className: "text-sm font-medium",
67
- children: "Approved"
68
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-green-500" })]
69
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
70
- className: "text-2xl font-bold",
71
- children: v
72
- }), /* @__PURE__ */ o("p", {
73
- className: "text-xs text-text-secondary",
74
- children: "Current period"
75
- })] })] }),
76
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
77
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
78
- children: [/* @__PURE__ */ o(m, {
79
- className: "text-sm font-medium",
80
- children: "Days Used"
81
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-text-secondary" })]
82
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
83
- className: "text-2xl font-bold",
84
- children: y
85
- }), /* @__PURE__ */ o("p", {
86
- className: "text-xs text-text-secondary",
87
- children: "Total approved days"
88
- })] })] }),
89
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, {
90
- className: "flex flex-row items-center justify-between space-y-0 pb-2",
91
- children: [/* @__PURE__ */ o(m, {
92
- className: "text-sm font-medium",
93
- children: "On Leave Today"
94
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-text-secondary" })]
95
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
96
- className: "text-2xl font-bold",
97
- children: x
98
- }), /* @__PURE__ */ o("p", {
99
- className: "text-xs text-text-secondary",
100
- children: "Out of office"
101
- })] })] })
57
+ /* @__PURE__ */ s(h, {
58
+ treatment: "glass",
59
+ glow: !0,
60
+ className: "border-border-seam",
61
+ children: [/* @__PURE__ */ s(p, {
62
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
63
+ children: [/* @__PURE__ */ o(m, {
64
+ className: "text-sm font-medium",
65
+ children: "Pending"
66
+ }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-warning-text" })]
67
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
68
+ className: "text-2xl font-bold tabular-nums",
69
+ children: b
70
+ }), /* @__PURE__ */ o("p", {
71
+ className: "text-xs text-text-secondary",
72
+ children: "Awaiting approval"
73
+ })] })]
74
+ }),
75
+ /* @__PURE__ */ s(h, {
76
+ treatment: "metric",
77
+ className: "border-border-seam",
78
+ children: [/* @__PURE__ */ s(p, {
79
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
80
+ children: [/* @__PURE__ */ o(m, {
81
+ className: "text-sm font-medium",
82
+ children: "Approved"
83
+ }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" })]
84
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
85
+ className: "text-2xl font-bold tabular-nums",
86
+ children: x
87
+ }), /* @__PURE__ */ o("p", {
88
+ className: "text-xs text-text-secondary",
89
+ children: "Current period"
90
+ })] })]
91
+ }),
92
+ /* @__PURE__ */ s(h, {
93
+ treatment: "metric",
94
+ className: "border-border-seam",
95
+ children: [/* @__PURE__ */ s(p, {
96
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
97
+ children: [/* @__PURE__ */ o(m, {
98
+ className: "text-sm font-medium",
99
+ children: "Days Used"
100
+ }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-text-secondary" })]
101
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
102
+ className: "text-2xl font-bold tabular-nums",
103
+ children: S
104
+ }), /* @__PURE__ */ o("p", {
105
+ className: "text-xs text-text-secondary",
106
+ children: "Total approved days"
107
+ })] })]
108
+ }),
109
+ /* @__PURE__ */ s(h, {
110
+ treatment: "metric",
111
+ className: "border-border-seam",
112
+ children: [/* @__PURE__ */ s(p, {
113
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
114
+ children: [/* @__PURE__ */ o(m, {
115
+ className: "text-sm font-medium",
116
+ children: "On Leave Today"
117
+ }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-text-secondary" })]
118
+ }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
119
+ className: "text-2xl font-bold tabular-nums",
120
+ children: w
121
+ }), /* @__PURE__ */ o("p", {
122
+ className: "text-xs text-text-secondary",
123
+ children: "Out of office"
124
+ })] })]
125
+ })
102
126
  ]
103
127
  }),
104
128
  /* @__PURE__ */ s("div", {
105
129
  className: "grid gap-4 md:grid-cols-2",
106
130
  children: [/* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Leave Balances" }), /* @__PURE__ */ o(f, { children: "Company-wide leave allocation overview" })] }), /* @__PURE__ */ o(d, {
107
131
  className: "space-y-4",
108
- children: b.map((e) => {
132
+ children: C.map((e) => {
109
133
  let t = Math.round(e.used / Math.max(e.total, 1) * 100);
110
134
  return /* @__PURE__ */ s("div", {
111
135
  className: "space-y-1",
@@ -123,7 +147,7 @@ function g() {
123
147
  }), /* @__PURE__ */ o("div", {
124
148
  className: "h-2 overflow-hidden rounded bg-bg-sunken",
125
149
  children: /* @__PURE__ */ o("div", {
126
- className: `h-2 rounded ${t > 80 ? "bg-red-500" : t > 50 ? "bg-yellow-500" : "bg-green-500"}`,
150
+ className: `h-2 rounded ${t > 80 ? "bg-status-error-text" : t > 50 ? "bg-status-warning-text" : "bg-status-success-text"}`,
127
151
  style: { width: `${t}%` }
128
152
  })
129
153
  })]
@@ -131,7 +155,7 @@ function g() {
131
155
  })
132
156
  })] }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Pending Approvals" }), /* @__PURE__ */ o(f, { children: "Leave requests waiting for your review" })] }), /* @__PURE__ */ o(d, {
133
157
  className: "space-y-3",
134
- children: g.filter((e) => e.status === "pending").map((e) => /* @__PURE__ */ s("div", {
158
+ children: y.filter((e) => e.status === "pending").map((e) => /* @__PURE__ */ s("div", {
135
159
  className: "flex items-center justify-between rounded border p-3",
136
160
  children: [/* @__PURE__ */ s("div", { children: [
137
161
  /* @__PURE__ */ o("p", {
@@ -187,7 +211,7 @@ function g() {
187
211
  children: "Status"
188
212
  })
189
213
  ]
190
- }), g.map((e) => /* @__PURE__ */ s("div", {
214
+ }), y.map((e) => /* @__PURE__ */ s("div", {
191
215
  className: "grid grid-cols-7 gap-2 border-b py-2 text-sm last:border-0",
192
216
  children: [
193
217
  /* @__PURE__ */ o("span", {
@@ -233,6 +257,6 @@ function g() {
233
257
  });
234
258
  }
235
259
  //#endregion
236
- export { g as HrLeaveManagementPagePage };
260
+ export { y as HrLeaveManagementPagePage };
237
261
 
238
262
  //# sourceMappingURL=HrLeaveManagementPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HrLeaveManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrLeaveManagementPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, CheckCircle, Clock, XCircle } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype LeaveBalance = {\n type: string;\n total: number;\n used: number;\n remaining: number;\n};\n\nconst toLabel = (value: string): string =>\n value\n .split('_')\n .map((part) => part[0]?.toUpperCase() + part.slice(1))\n .join(' ');\n\nexport function HrLeaveManagementPagePage() {\n const { leaveRequests } = useCrewFoundryStore();\n\n const pendingCount = leaveRequests.filter((leave) => leave.status === 'pending').length;\n const approvedCount = leaveRequests.filter((leave) => leave.status === 'approved').length;\n const totalDays = leaveRequests\n .filter((leave) => leave.status === 'approved')\n .reduce((sum, leave) => sum + leave.days, 0);\n\n const leaveBalances = useMemo<LeaveBalance[]>(() => {\n const entitlementByType: Record<string, number> = {\n annual: 20,\n sick: 12,\n personal: 5,\n maternity: 90,\n paternity: 30,\n unpaid: 15,\n };\n\n const usedByType = leaveRequests\n .filter((leave) => leave.status === 'approved')\n .reduce<Record<string, number>>((acc, leave) => {\n acc[leave.type] = (acc[leave.type] || 0) + leave.days;\n return acc;\n }, {});\n\n return Object.entries(entitlementByType).map(([type, total]) => {\n const used = usedByType[type] || 0;\n return {\n type: toLabel(type),\n total,\n used,\n remaining: Math.max(total - used, 0),\n };\n });\n }, [leaveRequests]);\n\n const onLeaveToday = useMemo(() => {\n const today = new Date().toISOString().split('T')[0];\n return leaveRequests.filter(\n (leave) => leave.status === 'approved' && leave.startDate <= today && leave.endDate >= today\n ).length;\n }, [leaveRequests]);\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\">Leave Management</h1>\n <p className=\"text-sm text-text-secondary\">Track and manage employee leave requests</p>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-1 h-4 w-4\" />\n Request Leave\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{pendingCount}</div>\n <p className=\"text-xs text-text-secondary\">Awaiting approval</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Approved</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{approvedCount}</div>\n <p className=\"text-xs text-text-secondary\">Current period</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Days Used</CardTitle>\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{totalDays}</div>\n <p className=\"text-xs text-text-secondary\">Total approved days</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">On Leave Today</CardTitle>\n <XCircle className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{onLeaveToday}</div>\n <p className=\"text-xs text-text-secondary\">Out of office</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Leave Balances</CardTitle>\n <CardDescription>Company-wide leave allocation overview</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {leaveBalances.map((balance) => {\n const usedPct = Math.round((balance.used / Math.max(balance.total, 1)) * 100);\n return (\n <div key={balance.type} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{balance.type}</span>\n <span>\n {balance.used}/{balance.total} days used\n </span>\n </div>\n <div className=\"h-2 overflow-hidden rounded bg-bg-sunken\">\n <div\n className={`h-2 rounded ${\n usedPct > 80\n ? 'bg-red-500'\n : usedPct > 50\n ? 'bg-yellow-500'\n : 'bg-green-500'\n }`}\n style={{ width: `${usedPct}%` }}\n />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Pending Approvals</CardTitle>\n <CardDescription>Leave requests waiting for your review</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {leaveRequests\n .filter((leave) => leave.status === 'pending')\n .map((leave) => (\n <div\n key={leave.id}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{leave.employeeName}</p>\n <p className=\"text-xs text-text-secondary\">\n {leave.type} · {leave.days} days · {leave.startDate} to {leave.endDate}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">{leave.reason}</p>\n </div>\n <div className=\"flex gap-1\">\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs\">\n Reject\n </Button>\n <Button size=\"sm\" className=\"h-7 text-xs\">\n Approve\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Leave Requests</CardTitle>\n <CardDescription>Complete leave request history</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-2 grid grid-cols-7 gap-2 border-b pb-2 text-xs font-medium text-text-secondary\">\n <span>Employee</span>\n <span>Department</span>\n <span>Type</span>\n <span>Period</span>\n <span className=\"text-right\">Days</span>\n <span>Reason</span>\n <span className=\"text-center\">Status</span>\n </div>\n {leaveRequests.map((leave) => (\n <div\n key={leave.id}\n className=\"grid grid-cols-7 gap-2 border-b py-2 text-sm last:border-0\"\n >\n <span className=\"font-medium\">{leave.employeeName}</span>\n <span className=\"text-text-secondary\">{leave.department}</span>\n <Badge variant=\"outline\" className=\"w-fit text-[10px]\">\n {leave.type}\n </Badge>\n <span className=\"text-xs\">\n {leave.startDate} — {leave.endDate}\n </span>\n <span className=\"text-right\">{leave.days}</span>\n <span className=\"truncate text-xs text-text-secondary\">{leave.reason}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n leave.status === 'approved'\n ? 'default'\n : leave.status === 'pending'\n ? 'secondary'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {leave.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HrLeaveManagementPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HrLeaveManagementPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Calendar, CheckCircle, Clock, XCircle } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype LeaveBalance = {\n type: string;\n total: number;\n used: number;\n remaining: number;\n};\n\nconst toLabel = (value: string): string =>\n value\n .split('_')\n .map((part) => part[0]?.toUpperCase() + part.slice(1))\n .join(' ');\n\nexport function HrLeaveManagementPagePage() {\n const { leaveRequests } = useCrewFoundryStore();\n\n const pendingCount = leaveRequests.filter((leave) => leave.status === 'pending').length;\n const approvedCount = leaveRequests.filter((leave) => leave.status === 'approved').length;\n const totalDays = leaveRequests\n .filter((leave) => leave.status === 'approved')\n .reduce((sum, leave) => sum + leave.days, 0);\n\n const leaveBalances = useMemo<LeaveBalance[]>(() => {\n const entitlementByType: Record<string, number> = {\n annual: 20,\n sick: 12,\n personal: 5,\n maternity: 90,\n paternity: 30,\n unpaid: 15,\n };\n\n const usedByType = leaveRequests\n .filter((leave) => leave.status === 'approved')\n .reduce<Record<string, number>>((acc, leave) => {\n acc[leave.type] = (acc[leave.type] || 0) + leave.days;\n return acc;\n }, {});\n\n return Object.entries(entitlementByType).map(([type, total]) => {\n const used = usedByType[type] || 0;\n return {\n type: toLabel(type),\n total,\n used,\n remaining: Math.max(total - used, 0),\n };\n });\n }, [leaveRequests]);\n\n const onLeaveToday = useMemo(() => {\n const today = new Date().toISOString().split('T')[0];\n return leaveRequests.filter(\n (leave) => leave.status === 'approved' && leave.startDate <= today && leave.endDate >= today\n ).length;\n }, [leaveRequests]);\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>Leave Management</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Track and manage employee leave requests</p>\n <PagePurpose className=\"mt-1\">Handle time-off in one place — review and approve leave requests and keep an eye on team availability and balances.</PagePurpose>\n </div>\n <Button size=\"sm\">\n <Calendar className=\"mr-1 h-4 w-4\" />\n Request Leave\n </Button>\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\">Pending</CardTitle>\n <Clock className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{pendingCount}</div>\n <p className=\"text-xs text-text-secondary\">Awaiting approval</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\">Approved</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{approvedCount}</div>\n <p className=\"text-xs text-text-secondary\">Current period</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\">Days Used</CardTitle>\n <Calendar className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalDays}</div>\n <p className=\"text-xs text-text-secondary\">Total approved days</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\">On Leave Today</CardTitle>\n <XCircle className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{onLeaveToday}</div>\n <p className=\"text-xs text-text-secondary\">Out of office</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Leave Balances</CardTitle>\n <CardDescription>Company-wide leave allocation overview</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {leaveBalances.map((balance) => {\n const usedPct = Math.round((balance.used / Math.max(balance.total, 1)) * 100);\n return (\n <div key={balance.type} className=\"space-y-1\">\n <div className=\"flex justify-between text-sm\">\n <span className=\"font-medium\">{balance.type}</span>\n <span>\n {balance.used}/{balance.total} days used\n </span>\n </div>\n <div className=\"h-2 overflow-hidden rounded bg-bg-sunken\">\n <div\n className={`h-2 rounded ${\n usedPct > 80\n ? 'bg-status-error-text'\n : usedPct > 50\n ? 'bg-status-warning-text'\n : 'bg-status-success-text'\n }`}\n style={{ width: `${usedPct}%` }}\n />\n </div>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Pending Approvals</CardTitle>\n <CardDescription>Leave requests waiting for your review</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {leaveRequests\n .filter((leave) => leave.status === 'pending')\n .map((leave) => (\n <div\n key={leave.id}\n className=\"flex items-center justify-between rounded border p-3\"\n >\n <div>\n <p className=\"text-sm font-medium\">{leave.employeeName}</p>\n <p className=\"text-xs text-text-secondary\">\n {leave.type} · {leave.days} days · {leave.startDate} to {leave.endDate}\n </p>\n <p className=\"mt-1 text-xs text-text-secondary\">{leave.reason}</p>\n </div>\n <div className=\"flex gap-1\">\n <Button size=\"sm\" variant=\"outline\" className=\"h-7 text-xs\">\n Reject\n </Button>\n <Button size=\"sm\" className=\"h-7 text-xs\">\n Approve\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Leave Requests</CardTitle>\n <CardDescription>Complete leave request history</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"mb-2 grid grid-cols-7 gap-2 border-b pb-2 text-xs font-medium text-text-secondary\">\n <span>Employee</span>\n <span>Department</span>\n <span>Type</span>\n <span>Period</span>\n <span className=\"text-right\">Days</span>\n <span>Reason</span>\n <span className=\"text-center\">Status</span>\n </div>\n {leaveRequests.map((leave) => (\n <div\n key={leave.id}\n className=\"grid grid-cols-7 gap-2 border-b py-2 text-sm last:border-0\"\n >\n <span className=\"font-medium\">{leave.employeeName}</span>\n <span className=\"text-text-secondary\">{leave.department}</span>\n <Badge variant=\"outline\" className=\"w-fit text-[10px]\">\n {leave.type}\n </Badge>\n <span className=\"text-xs\">\n {leave.startDate} — {leave.endDate}\n </span>\n <span className=\"text-right\">{leave.days}</span>\n <span className=\"truncate text-xs text-text-secondary\">{leave.reason}</span>\n <div className=\"text-center\">\n <Badge\n variant={\n leave.status === 'approved'\n ? 'default'\n : leave.status === 'pending'\n ? 'secondary'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {leave.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}