@burdenoff/microfe-crewfoundry 2026.625.2 → 2026.703.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
  2. package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
  3. package/dist/crewfoundry/components/forms/FormModal.js +220 -0
  4. package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
  5. package/dist/crewfoundry/components/forms/formValues.js +20 -0
  6. package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
  7. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
  8. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
  10. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
  12. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
  14. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
  16. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
  18. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  20. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
  21. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  22. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
  23. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  24. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
  25. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  26. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
  27. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  28. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
  29. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  30. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
  31. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  32. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
  33. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  34. package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
  35. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  36. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
  37. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  38. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
  39. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  40. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
  41. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  42. package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
  43. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  44. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
  45. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  46. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
  47. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  48. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
  49. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  50. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
  51. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  52. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
  54. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
  56. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
  58. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
  60. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  62. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
  63. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  64. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
  65. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
  68. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
  70. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
  72. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
  74. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  76. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
  77. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
  79. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  80. package/dist/crewfoundry/store/crewfoundryStore.js +306 -51
  81. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  82. package/package.json +1 -1
@@ -1,12 +1,84 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { useMemo as t } from "react";
3
- import { Calendar as n, CheckCircle as r, Clock as i, XCircle as a } from "lucide-react";
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, GlassCard as h, GradientText as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
2
+ import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
3
+ import { getNumber as r, getText as i, newClientId as a } from "../components/forms/formValues.js";
4
+ import { useMemo as o } from "react";
5
+ import { Calendar as s, CheckCircle as c, Clock as l, XCircle as u } from "lucide-react";
6
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
7
+ import { Badge as p, Button as m, Card as h, CardContent as g, CardDescription as _, CardHeader as v, CardTitle as y, GlassCard as b, GradientText as x, PagePurpose as S } from "@burdenoff/fe-libs/ui";
8
+ import { useAuth as C, useGlobalUi as w } from "@burdenoff/fe-libs/shared/providers/shell";
6
9
  //#region src/crewfoundry/pages/HrLeaveManagementPagePage.tsx
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
+ var T = [
11
+ {
12
+ label: "Annual",
13
+ value: "annual"
14
+ },
15
+ {
16
+ label: "Sick",
17
+ value: "sick"
18
+ },
19
+ {
20
+ label: "Personal",
21
+ value: "personal"
22
+ },
23
+ {
24
+ label: "Maternity",
25
+ value: "maternity"
26
+ },
27
+ {
28
+ label: "Paternity",
29
+ value: "paternity"
30
+ },
31
+ {
32
+ label: "Unpaid",
33
+ value: "unpaid"
34
+ }
35
+ ], E = (e) => e.split("_").map((e) => e[0]?.toUpperCase() + e.slice(1)).join(" ");
36
+ function D() {
37
+ let { leaveRequests: D, employees: O, addLeaveRequest: k, updateLeaveRequest: A } = e(), { showToast: j } = w(), { currentUser: M } = C(), N = n(), P = M?.name || [M?.firstName, M?.lastName].filter(Boolean).join(" ") || M?.email || "Manager", F = o(() => O.map((e) => ({
38
+ label: `${e.firstName} ${e.lastName}`,
39
+ value: e.id
40
+ })), [O]), I = o(() => [
41
+ {
42
+ name: "employeeId",
43
+ label: "Employee",
44
+ type: "select",
45
+ required: !0,
46
+ options: F,
47
+ colSpan: 2
48
+ },
49
+ {
50
+ name: "type",
51
+ label: "Leave type",
52
+ type: "select",
53
+ required: !0,
54
+ options: T
55
+ },
56
+ {
57
+ name: "days",
58
+ label: "Number of days",
59
+ type: "number",
60
+ required: !0
61
+ },
62
+ {
63
+ name: "startDate",
64
+ label: "Start date",
65
+ type: "date",
66
+ required: !0
67
+ },
68
+ {
69
+ name: "endDate",
70
+ label: "End date",
71
+ type: "date",
72
+ required: !0
73
+ },
74
+ {
75
+ name: "reason",
76
+ label: "Reason",
77
+ type: "textarea",
78
+ required: !0,
79
+ colSpan: 2
80
+ }
81
+ ], [F]), L = D.filter((e) => e.status === "pending").length, R = D.filter((e) => e.status === "approved").length, z = D.filter((e) => e.status === "approved").reduce((e, t) => e + t.days, 0), B = o(() => {
10
82
  let e = {
11
83
  annual: 20,
12
84
  sick: 12,
@@ -14,155 +86,179 @@ function y() {
14
86
  maternity: 90,
15
87
  paternity: 30,
16
88
  unpaid: 15
17
- }, t = y.filter((e) => e.status === "approved").reduce((e, t) => (e[t.type] = (e[t.type] || 0) + t.days, e), {});
89
+ }, t = D.filter((e) => e.status === "approved").reduce((e, t) => (e[t.type] = (e[t.type] || 0) + t.days, e), {});
18
90
  return Object.entries(e).map(([e, n]) => {
19
91
  let r = t[e] || 0;
20
92
  return {
21
- type: v(e),
93
+ type: E(e),
22
94
  total: n,
23
95
  used: r,
24
96
  remaining: Math.max(n - r, 0)
25
97
  };
26
98
  });
27
- }, [y]), w = t(() => {
99
+ }, [D]), V = o(() => {
28
100
  let e = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
29
- return y.filter((t) => t.status === "approved" && t.startDate <= e && t.endDate >= e).length;
30
- }, [y]);
31
- return /* @__PURE__ */ s("div", {
101
+ return D.filter((t) => t.status === "approved" && t.startDate <= e && t.endDate >= e).length;
102
+ }, [D]), H = async (e) => {
103
+ let t = i(e, "employeeId"), n = O.find((e) => e.id === t);
104
+ await k({
105
+ id: a(),
106
+ employeeId: t,
107
+ employeeName: n ? `${n.firstName} ${n.lastName}` : "",
108
+ department: n?.department ?? "",
109
+ type: i(e, "type"),
110
+ startDate: i(e, "startDate"),
111
+ endDate: i(e, "endDate"),
112
+ days: r(e, "days"),
113
+ status: "pending",
114
+ reason: i(e, "reason")
115
+ });
116
+ }, U = async (e, t) => {
117
+ try {
118
+ await A(e.id, {
119
+ status: t,
120
+ approverName: P
121
+ });
122
+ } catch (e) {
123
+ j(e instanceof Error ? e.message : "Unable to update leave request", "error");
124
+ }
125
+ };
126
+ return /* @__PURE__ */ f("div", {
32
127
  className: "space-y-6 p-6",
33
128
  children: [
34
- /* @__PURE__ */ s("div", {
129
+ /* @__PURE__ */ f("div", {
35
130
  className: "flex items-center justify-between",
36
- children: [/* @__PURE__ */ s("div", { children: [
37
- /* @__PURE__ */ o("h1", {
131
+ children: [/* @__PURE__ */ f("div", { children: [
132
+ /* @__PURE__ */ d("h1", {
38
133
  className: "text-2xl font-semibold",
39
- children: /* @__PURE__ */ o(g, { children: "Leave Management" })
134
+ children: /* @__PURE__ */ d(x, { children: "Leave Management" })
40
135
  }),
41
- /* @__PURE__ */ o("p", {
136
+ /* @__PURE__ */ d("p", {
42
137
  className: "text-sm text-text-secondary",
43
138
  children: "Track and manage employee leave requests"
44
139
  }),
45
- /* @__PURE__ */ o(_, {
140
+ /* @__PURE__ */ d(S, {
46
141
  className: "mt-1",
47
142
  children: "Handle time-off in one place — review and approve leave requests and keep an eye on team availability and balances."
48
143
  })
49
- ] }), /* @__PURE__ */ s(l, {
144
+ ] }), /* @__PURE__ */ f(m, {
50
145
  size: "sm",
51
- children: [/* @__PURE__ */ o(n, { className: "mr-1 h-4 w-4" }), "Request Leave"]
146
+ onClick: () => N.openModal(),
147
+ children: [/* @__PURE__ */ d(s, { className: "mr-1 h-4 w-4" }), "Request Leave"]
52
148
  })]
53
149
  }),
54
- /* @__PURE__ */ s("div", {
150
+ /* @__PURE__ */ f("div", {
55
151
  className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
56
152
  children: [
57
- /* @__PURE__ */ s(h, {
153
+ /* @__PURE__ */ f(b, {
58
154
  treatment: "glass",
59
155
  glow: !0,
60
156
  className: "border-border-seam",
61
- children: [/* @__PURE__ */ s(p, {
157
+ children: [/* @__PURE__ */ f(v, {
62
158
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
63
- children: [/* @__PURE__ */ o(m, {
159
+ children: [/* @__PURE__ */ d(y, {
64
160
  className: "text-sm font-medium",
65
161
  children: "Pending"
66
- }), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-warning-text" })]
67
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
162
+ }), /* @__PURE__ */ d(l, { className: "h-4 w-4 text-status-warning-text" })]
163
+ }), /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ d("div", {
68
164
  className: "text-2xl font-bold tabular-nums",
69
- children: b
70
- }), /* @__PURE__ */ o("p", {
165
+ children: L
166
+ }), /* @__PURE__ */ d("p", {
71
167
  className: "text-xs text-text-secondary",
72
168
  children: "Awaiting approval"
73
169
  })] })]
74
170
  }),
75
- /* @__PURE__ */ s(h, {
171
+ /* @__PURE__ */ f(b, {
76
172
  treatment: "metric",
77
173
  className: "border-border-seam",
78
- children: [/* @__PURE__ */ s(p, {
174
+ children: [/* @__PURE__ */ f(v, {
79
175
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
80
- children: [/* @__PURE__ */ o(m, {
176
+ children: [/* @__PURE__ */ d(y, {
81
177
  className: "text-sm font-medium",
82
178
  children: "Approved"
83
- }), /* @__PURE__ */ o(r, { className: "h-4 w-4 text-status-success-text" })]
84
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
179
+ }), /* @__PURE__ */ d(c, { className: "h-4 w-4 text-status-success-text" })]
180
+ }), /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ d("div", {
85
181
  className: "text-2xl font-bold tabular-nums",
86
- children: x
87
- }), /* @__PURE__ */ o("p", {
182
+ children: R
183
+ }), /* @__PURE__ */ d("p", {
88
184
  className: "text-xs text-text-secondary",
89
185
  children: "Current period"
90
186
  })] })]
91
187
  }),
92
- /* @__PURE__ */ s(h, {
188
+ /* @__PURE__ */ f(b, {
93
189
  treatment: "metric",
94
190
  className: "border-border-seam",
95
- children: [/* @__PURE__ */ s(p, {
191
+ children: [/* @__PURE__ */ f(v, {
96
192
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
97
- children: [/* @__PURE__ */ o(m, {
193
+ children: [/* @__PURE__ */ d(y, {
98
194
  className: "text-sm font-medium",
99
195
  children: "Days Used"
100
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-text-secondary" })]
101
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
196
+ }), /* @__PURE__ */ d(s, { className: "h-4 w-4 text-text-secondary" })]
197
+ }), /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ d("div", {
102
198
  className: "text-2xl font-bold tabular-nums",
103
- children: S
104
- }), /* @__PURE__ */ o("p", {
199
+ children: z
200
+ }), /* @__PURE__ */ d("p", {
105
201
  className: "text-xs text-text-secondary",
106
202
  children: "Total approved days"
107
203
  })] })]
108
204
  }),
109
- /* @__PURE__ */ s(h, {
205
+ /* @__PURE__ */ f(b, {
110
206
  treatment: "metric",
111
207
  className: "border-border-seam",
112
- children: [/* @__PURE__ */ s(p, {
208
+ children: [/* @__PURE__ */ f(v, {
113
209
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
114
- children: [/* @__PURE__ */ o(m, {
210
+ children: [/* @__PURE__ */ d(y, {
115
211
  className: "text-sm font-medium",
116
212
  children: "On Leave Today"
117
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-text-secondary" })]
118
- }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ o("div", {
213
+ }), /* @__PURE__ */ d(u, { className: "h-4 w-4 text-text-secondary" })]
214
+ }), /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ d("div", {
119
215
  className: "text-2xl font-bold tabular-nums",
120
- children: w
121
- }), /* @__PURE__ */ o("p", {
216
+ children: V
217
+ }), /* @__PURE__ */ d("p", {
122
218
  className: "text-xs text-text-secondary",
123
219
  children: "Out of office"
124
220
  })] })]
125
221
  })
126
222
  ]
127
223
  }),
128
- /* @__PURE__ */ s("div", {
224
+ /* @__PURE__ */ f("div", {
129
225
  className: "grid gap-4 md:grid-cols-2",
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, {
226
+ children: [/* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Leave Balances" }), /* @__PURE__ */ d(_, { children: "Company-wide leave allocation overview" })] }), /* @__PURE__ */ d(g, {
131
227
  className: "space-y-4",
132
- children: C.map((e) => {
228
+ children: B.map((e) => {
133
229
  let t = Math.round(e.used / Math.max(e.total, 1) * 100);
134
- return /* @__PURE__ */ s("div", {
230
+ return /* @__PURE__ */ f("div", {
135
231
  className: "space-y-1",
136
- children: [/* @__PURE__ */ s("div", {
232
+ children: [/* @__PURE__ */ f("div", {
137
233
  className: "flex justify-between text-sm",
138
- children: [/* @__PURE__ */ o("span", {
234
+ children: [/* @__PURE__ */ d("span", {
139
235
  className: "font-medium",
140
236
  children: e.type
141
- }), /* @__PURE__ */ s("span", { children: [
237
+ }), /* @__PURE__ */ f("span", { children: [
142
238
  e.used,
143
239
  "/",
144
240
  e.total,
145
241
  " days used"
146
242
  ] })]
147
- }), /* @__PURE__ */ o("div", {
243
+ }), /* @__PURE__ */ d("div", {
148
244
  className: "h-2 overflow-hidden rounded bg-bg-sunken",
149
- children: /* @__PURE__ */ o("div", {
245
+ children: /* @__PURE__ */ d("div", {
150
246
  className: `h-2 rounded ${t > 80 ? "bg-status-error-text" : t > 50 ? "bg-status-warning-text" : "bg-status-success-text"}`,
151
247
  style: { width: `${t}%` }
152
248
  })
153
249
  })]
154
250
  }, e.type);
155
251
  })
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, {
252
+ })] }), /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Pending Approvals" }), /* @__PURE__ */ d(_, { children: "Leave requests waiting for your review" })] }), /* @__PURE__ */ f(g, {
157
253
  className: "space-y-3",
158
- children: y.filter((e) => e.status === "pending").map((e) => /* @__PURE__ */ s("div", {
254
+ children: [D.filter((e) => e.status === "pending").map((e) => /* @__PURE__ */ f("div", {
159
255
  className: "flex items-center justify-between rounded border p-3",
160
- children: [/* @__PURE__ */ s("div", { children: [
161
- /* @__PURE__ */ o("p", {
256
+ children: [/* @__PURE__ */ f("div", { children: [
257
+ /* @__PURE__ */ d("p", {
162
258
  className: "text-sm font-medium",
163
259
  children: e.employeeName
164
260
  }),
165
- /* @__PURE__ */ s("p", {
261
+ /* @__PURE__ */ f("p", {
166
262
  className: "text-xs text-text-secondary",
167
263
  children: [
168
264
  e.type,
@@ -174,60 +270,65 @@ function y() {
174
270
  e.endDate
175
271
  ]
176
272
  }),
177
- /* @__PURE__ */ o("p", {
273
+ /* @__PURE__ */ d("p", {
178
274
  className: "mt-1 text-xs text-text-secondary",
179
275
  children: e.reason
180
276
  })
181
- ] }), /* @__PURE__ */ s("div", {
277
+ ] }), /* @__PURE__ */ f("div", {
182
278
  className: "flex gap-1",
183
- children: [/* @__PURE__ */ o(l, {
279
+ children: [/* @__PURE__ */ d(m, {
184
280
  size: "sm",
185
281
  variant: "outline",
186
282
  className: "h-7 text-xs",
283
+ onClick: () => U(e, "rejected"),
187
284
  children: "Reject"
188
- }), /* @__PURE__ */ o(l, {
285
+ }), /* @__PURE__ */ d(m, {
189
286
  size: "sm",
190
287
  className: "h-7 text-xs",
288
+ onClick: () => U(e, "approved"),
191
289
  children: "Approve"
192
290
  })]
193
291
  })]
194
- }, e.id))
292
+ }, e.id)), L === 0 && /* @__PURE__ */ d("p", {
293
+ className: "py-6 text-center text-sm text-text-secondary",
294
+ children: "No leave requests are awaiting approval."
295
+ })]
195
296
  })] })]
196
297
  }),
197
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "All Leave Requests" }), /* @__PURE__ */ o(f, { children: "Complete leave request history" })] }), /* @__PURE__ */ s(d, { children: [/* @__PURE__ */ s("div", {
298
+ /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "All Leave Requests" }), /* @__PURE__ */ d(_, { children: "Complete leave request history" })] }), /* @__PURE__ */ f(g, { children: [/* @__PURE__ */ f("div", {
198
299
  className: "mb-2 grid grid-cols-7 gap-2 border-b pb-2 text-xs font-medium text-text-secondary",
199
300
  children: [
200
- /* @__PURE__ */ o("span", { children: "Employee" }),
201
- /* @__PURE__ */ o("span", { children: "Department" }),
202
- /* @__PURE__ */ o("span", { children: "Type" }),
203
- /* @__PURE__ */ o("span", { children: "Period" }),
204
- /* @__PURE__ */ o("span", {
301
+ /* @__PURE__ */ d("span", { children: "Employee" }),
302
+ /* @__PURE__ */ d("span", { children: "Department" }),
303
+ /* @__PURE__ */ d("span", { children: "Type" }),
304
+ /* @__PURE__ */ d("span", { children: "Period" }),
305
+ /* @__PURE__ */ d("span", {
205
306
  className: "text-right",
206
307
  children: "Days"
207
308
  }),
208
- /* @__PURE__ */ o("span", { children: "Reason" }),
209
- /* @__PURE__ */ o("span", {
309
+ /* @__PURE__ */ d("span", { children: "Reason" }),
310
+ /* @__PURE__ */ d("span", {
210
311
  className: "text-center",
211
312
  children: "Status"
212
313
  })
213
314
  ]
214
- }), y.map((e) => /* @__PURE__ */ s("div", {
315
+ }), D.map((e) => /* @__PURE__ */ f("div", {
215
316
  className: "grid grid-cols-7 gap-2 border-b py-2 text-sm last:border-0",
216
317
  children: [
217
- /* @__PURE__ */ o("span", {
318
+ /* @__PURE__ */ d("span", {
218
319
  className: "font-medium",
219
320
  children: e.employeeName
220
321
  }),
221
- /* @__PURE__ */ o("span", {
322
+ /* @__PURE__ */ d("span", {
222
323
  className: "text-text-secondary",
223
324
  children: e.department
224
325
  }),
225
- /* @__PURE__ */ o(c, {
326
+ /* @__PURE__ */ d(p, {
226
327
  variant: "outline",
227
328
  className: "w-fit text-[10px]",
228
329
  children: e.type
229
330
  }),
230
- /* @__PURE__ */ s("span", {
331
+ /* @__PURE__ */ f("span", {
231
332
  className: "text-xs",
232
333
  children: [
233
334
  e.startDate,
@@ -235,28 +336,37 @@ function y() {
235
336
  e.endDate
236
337
  ]
237
338
  }),
238
- /* @__PURE__ */ o("span", {
339
+ /* @__PURE__ */ d("span", {
239
340
  className: "text-right",
240
341
  children: e.days
241
342
  }),
242
- /* @__PURE__ */ o("span", {
343
+ /* @__PURE__ */ d("span", {
243
344
  className: "truncate text-xs text-text-secondary",
244
345
  children: e.reason
245
346
  }),
246
- /* @__PURE__ */ o("div", {
347
+ /* @__PURE__ */ d("div", {
247
348
  className: "text-center",
248
- children: /* @__PURE__ */ o(c, {
349
+ children: /* @__PURE__ */ d(p, {
249
350
  variant: e.status === "approved" ? "default" : e.status === "pending" ? "secondary" : "destructive",
250
351
  className: "text-[10px]",
251
352
  children: e.status
252
353
  })
253
354
  })
254
355
  ]
255
- }, e.id))] })] })
356
+ }, e.id))] })] }),
357
+ /* @__PURE__ */ d(t, {
358
+ open: N.open,
359
+ onOpenChange: N.onOpenChange,
360
+ title: "Request leave",
361
+ description: "Submit a new time-off request for review.",
362
+ fields: I,
363
+ submitLabel: "Submit request",
364
+ onSubmit: H
365
+ })
256
366
  ]
257
367
  });
258
368
  }
259
369
  //#endregion
260
- export { y as HrLeaveManagementPagePage };
370
+ export { D as HrLeaveManagementPagePage };
261
371
 
262
372
  //# 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 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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"}
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 { useAuth, useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Calendar, CheckCircle, Clock, XCircle } from 'lucide-react';\nimport { useCrewFoundryStore, type LeaveRequest } from '../store/crewfoundryStore';\nimport { FormModal, useFormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { getNumber, getText, newClientId } from '../components/forms/formValues';\n\ntype LeaveBalance = {\n type: string;\n total: number;\n used: number;\n remaining: number;\n};\n\nconst LEAVE_TYPE_OPTIONS = [\n { label: 'Annual', value: 'annual' },\n { label: 'Sick', value: 'sick' },\n { label: 'Personal', value: 'personal' },\n { label: 'Maternity', value: 'maternity' },\n { label: 'Paternity', value: 'paternity' },\n { label: 'Unpaid', value: 'unpaid' },\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, employees, addLeaveRequest, updateLeaveRequest } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const { currentUser } = useAuth();\n const form = useFormModal<void>();\n\n const approverName =\n currentUser?.name ||\n [currentUser?.firstName, currentUser?.lastName].filter(Boolean).join(' ') ||\n currentUser?.email ||\n 'Manager';\n\n const employeeOptions = useMemo(\n () =>\n employees.map((employee) => ({\n label: `${employee.firstName} ${employee.lastName}`,\n value: employee.id,\n })),\n [employees]\n );\n\n const leaveFields = useMemo<FieldConfig[]>(\n () => [\n {\n name: 'employeeId',\n label: 'Employee',\n type: 'select',\n required: true,\n options: employeeOptions,\n colSpan: 2,\n },\n { name: 'type', label: 'Leave type', type: 'select', required: true, options: LEAVE_TYPE_OPTIONS },\n { name: 'days', label: 'Number of days', type: 'number', required: true },\n { name: 'startDate', label: 'Start date', type: 'date', required: true },\n { name: 'endDate', label: 'End date', type: 'date', required: true },\n { name: 'reason', label: 'Reason', type: 'textarea', required: true, colSpan: 2 },\n ],\n [employeeOptions]\n );\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 const handleSubmit = async (values: FormValues) => {\n const employeeId = getText(values, 'employeeId');\n const employee = employees.find((item) => item.id === employeeId);\n const payload: LeaveRequest = {\n id: newClientId(),\n employeeId,\n employeeName: employee ? `${employee.firstName} ${employee.lastName}` : '',\n department: employee?.department ?? '',\n type: getText(values, 'type') as LeaveRequest['type'],\n startDate: getText(values, 'startDate'),\n endDate: getText(values, 'endDate'),\n days: getNumber(values, 'days'),\n status: 'pending',\n reason: getText(values, 'reason'),\n };\n await addLeaveRequest(payload);\n };\n\n const handleDecision = async (leave: LeaveRequest, status: 'approved' | 'rejected') => {\n try {\n await updateLeaveRequest(leave.id, { status, approverName });\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to update leave request', 'error');\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>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\" onClick={() => form.openModal()}>\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\n size=\"sm\"\n variant=\"outline\"\n className=\"h-7 text-xs\"\n onClick={() => handleDecision(leave, 'rejected')}\n >\n Reject\n </Button>\n <Button\n size=\"sm\"\n className=\"h-7 text-xs\"\n onClick={() => handleDecision(leave, 'approved')}\n >\n Approve\n </Button>\n </div>\n </div>\n ))}\n {pendingCount === 0 && (\n <p className=\"py-6 text-center text-sm text-text-secondary\">\n No leave requests are awaiting approval.\n </p>\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\n <FormModal\n open={form.open}\n onOpenChange={form.onOpenChange}\n title=\"Request leave\"\n description=\"Submit a new time-off request for review.\"\n fields={leaveFields}\n submitLabel=\"Submit request\"\n onSubmit={handleSubmit}\n />\n </div>\n );\n}\n"],"mappings":"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"}