@burdenoff/microfe-crewfoundry 2026.626.1 → 2026.703.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.
- package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
- package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.js +220 -0
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
- package/dist/crewfoundry/components/forms/formValues.js +20 -0
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +339 -52
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,84 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
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 =
|
|
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:
|
|
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
|
-
}, [
|
|
99
|
+
}, [D]), V = o(() => {
|
|
28
100
|
let e = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
29
|
-
return
|
|
30
|
-
}, [
|
|
31
|
-
|
|
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__ */
|
|
129
|
+
/* @__PURE__ */ f("div", {
|
|
35
130
|
className: "flex items-center justify-between",
|
|
36
|
-
children: [/* @__PURE__ */
|
|
37
|
-
/* @__PURE__ */
|
|
131
|
+
children: [/* @__PURE__ */ f("div", { children: [
|
|
132
|
+
/* @__PURE__ */ d("h1", {
|
|
38
133
|
className: "text-2xl font-semibold",
|
|
39
|
-
children: /* @__PURE__ */
|
|
134
|
+
children: /* @__PURE__ */ d(x, { children: "Leave Management" })
|
|
40
135
|
}),
|
|
41
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
144
|
+
] }), /* @__PURE__ */ f(m, {
|
|
50
145
|
size: "sm",
|
|
51
|
-
|
|
146
|
+
onClick: () => N.openModal(),
|
|
147
|
+
children: [/* @__PURE__ */ d(s, { className: "mr-1 h-4 w-4" }), "Request Leave"]
|
|
52
148
|
})]
|
|
53
149
|
}),
|
|
54
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ f("div", {
|
|
55
151
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
56
152
|
children: [
|
|
57
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ f(b, {
|
|
58
154
|
treatment: "glass",
|
|
59
155
|
glow: !0,
|
|
60
156
|
className: "border-border-seam",
|
|
61
|
-
children: [/* @__PURE__ */
|
|
157
|
+
children: [/* @__PURE__ */ f(v, {
|
|
62
158
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
63
|
-
children: [/* @__PURE__ */
|
|
159
|
+
children: [/* @__PURE__ */ d(y, {
|
|
64
160
|
className: "text-sm font-medium",
|
|
65
161
|
children: "Pending"
|
|
66
|
-
}), /* @__PURE__ */
|
|
67
|
-
}), /* @__PURE__ */
|
|
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:
|
|
70
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
171
|
+
/* @__PURE__ */ f(b, {
|
|
76
172
|
treatment: "metric",
|
|
77
173
|
className: "border-border-seam",
|
|
78
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ f(v, {
|
|
79
175
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
80
|
-
children: [/* @__PURE__ */
|
|
176
|
+
children: [/* @__PURE__ */ d(y, {
|
|
81
177
|
className: "text-sm font-medium",
|
|
82
178
|
children: "Approved"
|
|
83
|
-
}), /* @__PURE__ */
|
|
84
|
-
}), /* @__PURE__ */
|
|
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:
|
|
87
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
188
|
+
/* @__PURE__ */ f(b, {
|
|
93
189
|
treatment: "metric",
|
|
94
190
|
className: "border-border-seam",
|
|
95
|
-
children: [/* @__PURE__ */
|
|
191
|
+
children: [/* @__PURE__ */ f(v, {
|
|
96
192
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
97
|
-
children: [/* @__PURE__ */
|
|
193
|
+
children: [/* @__PURE__ */ d(y, {
|
|
98
194
|
className: "text-sm font-medium",
|
|
99
195
|
children: "Days Used"
|
|
100
|
-
}), /* @__PURE__ */
|
|
101
|
-
}), /* @__PURE__ */
|
|
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:
|
|
104
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
205
|
+
/* @__PURE__ */ f(b, {
|
|
110
206
|
treatment: "metric",
|
|
111
207
|
className: "border-border-seam",
|
|
112
|
-
children: [/* @__PURE__ */
|
|
208
|
+
children: [/* @__PURE__ */ f(v, {
|
|
113
209
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
114
|
-
children: [/* @__PURE__ */
|
|
210
|
+
children: [/* @__PURE__ */ d(y, {
|
|
115
211
|
className: "text-sm font-medium",
|
|
116
212
|
children: "On Leave Today"
|
|
117
|
-
}), /* @__PURE__ */
|
|
118
|
-
}), /* @__PURE__ */
|
|
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:
|
|
121
|
-
}), /* @__PURE__ */
|
|
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__ */
|
|
224
|
+
/* @__PURE__ */ f("div", {
|
|
129
225
|
className: "grid gap-4 md:grid-cols-2",
|
|
130
|
-
children: [/* @__PURE__ */
|
|
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:
|
|
228
|
+
children: B.map((e) => {
|
|
133
229
|
let t = Math.round(e.used / Math.max(e.total, 1) * 100);
|
|
134
|
-
return /* @__PURE__ */
|
|
230
|
+
return /* @__PURE__ */ f("div", {
|
|
135
231
|
className: "space-y-1",
|
|
136
|
-
children: [/* @__PURE__ */
|
|
232
|
+
children: [/* @__PURE__ */ f("div", {
|
|
137
233
|
className: "flex justify-between text-sm",
|
|
138
|
-
children: [/* @__PURE__ */
|
|
234
|
+
children: [/* @__PURE__ */ d("span", {
|
|
139
235
|
className: "font-medium",
|
|
140
236
|
children: e.type
|
|
141
|
-
}), /* @__PURE__ */
|
|
237
|
+
}), /* @__PURE__ */ f("span", { children: [
|
|
142
238
|
e.used,
|
|
143
239
|
"/",
|
|
144
240
|
e.total,
|
|
145
241
|
" days used"
|
|
146
242
|
] })]
|
|
147
|
-
}), /* @__PURE__ */
|
|
243
|
+
}), /* @__PURE__ */ d("div", {
|
|
148
244
|
className: "h-2 overflow-hidden rounded bg-bg-sunken",
|
|
149
|
-
children: /* @__PURE__ */
|
|
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__ */
|
|
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:
|
|
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__ */
|
|
161
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
273
|
+
/* @__PURE__ */ d("p", {
|
|
178
274
|
className: "mt-1 text-xs text-text-secondary",
|
|
179
275
|
children: e.reason
|
|
180
276
|
})
|
|
181
|
-
] }), /* @__PURE__ */
|
|
277
|
+
] }), /* @__PURE__ */ f("div", {
|
|
182
278
|
className: "flex gap-1",
|
|
183
|
-
children: [/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
201
|
-
/* @__PURE__ */
|
|
202
|
-
/* @__PURE__ */
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
-
/* @__PURE__ */
|
|
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__ */
|
|
209
|
-
/* @__PURE__ */
|
|
309
|
+
/* @__PURE__ */ d("span", { children: "Reason" }),
|
|
310
|
+
/* @__PURE__ */ d("span", {
|
|
210
311
|
className: "text-center",
|
|
211
312
|
children: "Status"
|
|
212
313
|
})
|
|
213
314
|
]
|
|
214
|
-
}),
|
|
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__ */
|
|
318
|
+
/* @__PURE__ */ d("span", {
|
|
218
319
|
className: "font-medium",
|
|
219
320
|
children: e.employeeName
|
|
220
321
|
}),
|
|
221
|
-
/* @__PURE__ */
|
|
322
|
+
/* @__PURE__ */ d("span", {
|
|
222
323
|
className: "text-text-secondary",
|
|
223
324
|
children: e.department
|
|
224
325
|
}),
|
|
225
|
-
/* @__PURE__ */
|
|
326
|
+
/* @__PURE__ */ d(p, {
|
|
226
327
|
variant: "outline",
|
|
227
328
|
className: "w-fit text-[10px]",
|
|
228
329
|
children: e.type
|
|
229
330
|
}),
|
|
230
|
-
/* @__PURE__ */
|
|
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__ */
|
|
339
|
+
/* @__PURE__ */ d("span", {
|
|
239
340
|
className: "text-right",
|
|
240
341
|
children: e.days
|
|
241
342
|
}),
|
|
242
|
-
/* @__PURE__ */
|
|
343
|
+
/* @__PURE__ */ d("span", {
|
|
243
344
|
className: "truncate text-xs text-text-secondary",
|
|
244
345
|
children: e.reason
|
|
245
346
|
}),
|
|
246
|
-
/* @__PURE__ */
|
|
347
|
+
/* @__PURE__ */ d("div", {
|
|
247
348
|
className: "text-center",
|
|
248
|
-
children: /* @__PURE__ */
|
|
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 {
|
|
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":";;;;;;;;;AA0BA,IAAM,IAAqB;CACzB;EAAE,OAAO;EAAU,OAAO;EAAU;CACpC;EAAE,OAAO;EAAQ,OAAO;EAAQ;CAChC;EAAE,OAAO;EAAY,OAAO;EAAY;CACxC;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAa,OAAO;EAAa;CAC1C;EAAE,OAAO;EAAU,OAAO;EAAU;CACrC,EAEK,KAAW,MACf,EACG,MAAM,IAAI,CACV,KAAK,MAAS,EAAK,IAAI,aAAa,GAAG,EAAK,MAAM,EAAE,CAAC,CACrD,KAAK,IAAI;AAEd,SAAgB,IAA4B;CAC1C,IAAM,EAAE,kBAAe,cAAW,oBAAiB,0BAAuB,GAAqB,EACzF,EAAE,iBAAc,GAAa,EAC7B,EAAE,mBAAgB,GAAS,EAC3B,IAAO,GAAoB,EAE3B,IACJ,GAAa,QACb,CAAC,GAAa,WAAW,GAAa,SAAS,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI,IACzE,GAAa,SACb,WAEI,IAAkB,QAEpB,EAAU,KAAK,OAAc;EAC3B,OAAO,GAAG,EAAS,UAAU,GAAG,EAAS;EACzC,OAAO,EAAS;EACjB,EAAE,EACL,CAAC,EAAU,CACZ,EAEK,IAAc,QACZ;EACJ;GACE,MAAM;GACN,OAAO;GACP,MAAM;GACN,UAAU;GACV,SAAS;GACT,SAAS;GACV;EACD;GAAE,MAAM;GAAQ,OAAO;GAAc,MAAM;GAAU,UAAU;GAAM,SAAS;GAAoB;EAClG;GAAE,MAAM;GAAQ,OAAO;GAAkB,MAAM;GAAU,UAAU;GAAM;EACzE;GAAE,MAAM;GAAa,OAAO;GAAc,MAAM;GAAQ,UAAU;GAAM;EACxE;GAAE,MAAM;GAAW,OAAO;GAAY,MAAM;GAAQ,UAAU;GAAM;EACpE;GAAE,MAAM;GAAU,OAAO;GAAU,MAAM;GAAY,UAAU;GAAM,SAAS;GAAG;EAClF,EACD,CAAC,EAAgB,CAClB,EAEK,IAAe,EAAc,QAAQ,MAAU,EAAM,WAAW,UAAU,CAAC,QAC3E,IAAgB,EAAc,QAAQ,MAAU,EAAM,WAAW,WAAW,CAAC,QAC7E,IAAY,EACf,QAAQ,MAAU,EAAM,WAAW,WAAW,CAC9C,QAAQ,GAAK,MAAU,IAAM,EAAM,MAAM,EAAE,EAExC,IAAgB,QAA8B;EAClD,IAAM,IAA4C;GAChD,QAAQ;GACR,MAAM;GACN,UAAU;GACV,WAAW;GACX,WAAW;GACX,QAAQ;GACT,EAEK,IAAa,EAChB,QAAQ,MAAU,EAAM,WAAW,WAAW,CAC9C,QAAgC,GAAK,OACpC,EAAI,EAAM,SAAS,EAAI,EAAM,SAAS,KAAK,EAAM,MAC1C,IACN,EAAE,CAAC;AAER,SAAO,OAAO,QAAQ,EAAkB,CAAC,KAAK,CAAC,GAAM,OAAW;GAC9D,IAAM,IAAO,EAAW,MAAS;AACjC,UAAO;IACL,MAAM,EAAQ,EAAK;IACnB;IACA;IACA,WAAW,KAAK,IAAI,IAAQ,GAAM,EAAE;IACrC;IACD;IACD,CAAC,EAAc,CAAC,EAEb,IAAe,QAAc;EACjC,IAAM,qBAAQ,IAAI,MAAM,EAAC,aAAa,CAAC,MAAM,IAAI,CAAC;AAClD,SAAO,EAAc,QAClB,MAAU,EAAM,WAAW,cAAc,EAAM,aAAa,KAAS,EAAM,WAAW,EACxF,CAAC;IACD,CAAC,EAAc,CAAC,EAEb,IAAe,OAAO,MAAuB;EACjD,IAAM,IAAa,EAAQ,GAAQ,aAAa,EAC1C,IAAW,EAAU,MAAM,MAAS,EAAK,OAAO,EAAW;AAajE,QAAM,EAZwB;GAC5B,IAAI,GAAa;GACjB;GACA,cAAc,IAAW,GAAG,EAAS,UAAU,GAAG,EAAS,aAAa;GACxE,YAAY,GAAU,cAAc;GACpC,MAAM,EAAQ,GAAQ,OAAO;GAC7B,WAAW,EAAQ,GAAQ,YAAY;GACvC,SAAS,EAAQ,GAAQ,UAAU;GACnC,MAAM,EAAU,GAAQ,OAAO;GAC/B,QAAQ;GACR,QAAQ,EAAQ,GAAQ,SAAS;GAClC,CAC6B;IAG1B,IAAiB,OAAO,GAAqB,MAAoC;AACrF,MAAI;AACF,SAAM,EAAmB,EAAM,IAAI;IAAE;IAAQ;IAAc,CAAC;WACrD,GAAO;AACd,KAAU,aAAiB,QAAQ,EAAM,UAAU,kCAAkC,QAAQ;;;AAIjG,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAc,oBAA+B,CAAA;MAC1C,CAAA;KACL,kBAAC,KAAD;MAAG,WAAU;gBAA8B;MAA4C,CAAA;KACvF,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAAiI,CAAA;KAC3J,EAAA,CAAA,EACN,kBAAC,GAAD;KAAQ,MAAK;KAAK,eAAe,EAAK,WAAW;eAAjD,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,gBAE9B;OACL;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD;MAAW,WAAU;MAAQ,MAAA;MAAK,WAAU;gBAA5C,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAmB,CAAA,EAC9D,kBAAC,GAAD,EAAO,WAAU,oCAAqC,CAAA,CAC3C;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC;OAAmB,CAAA,EACrE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAqB,CAAA,CACpD,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAoB,CAAA,EAC/D,kBAAC,GAAD,EAAa,WAAU,oCAAqC,CAAA,CACjD;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC;OAAoB,CAAA,EACtE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAkB,CAAA,CACjD,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAAqB,CAAA,EAChE,kBAAC,GAAD,EAAU,WAAU,+BAAgC,CAAA,CACzC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC;OAAgB,CAAA,EAClE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAuB,CAAA,CACtD,EAAA,CAAA,CACJ;;KACZ,kBAAC,GAAD;MAAW,WAAU;MAAS,WAAU;gBAAxC,CACE,kBAAC,GAAD;OAAY,WAAU;iBAAtB,CACE,kBAAC,GAAD;QAAW,WAAU;kBAAsB;QAA0B,CAAA,EACrE,kBAAC,GAAD,EAAS,WAAU,+BAAgC,CAAA,CACxC;UACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAmC;OAAmB,CAAA,EACrE,kBAAC,KAAD;OAAG,WAAU;iBAA8B;OAAiB,CAAA,CAChD,EAAA,CAAA,CACJ;;KACR;;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,kBAA0B,CAAA,EACrC,kBAAC,GAAD,EAAA,UAAiB,0CAAwD,CAAA,CAC9D,EAAA,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eACpB,EAAc,KAAK,MAAY;MAC9B,IAAM,IAAU,KAAK,MAAO,EAAQ,OAAO,KAAK,IAAI,EAAQ,OAAO,EAAE,GAAI,IAAI;AAC7E,aACE,kBAAC,OAAD;OAAwB,WAAU;iBAAlC,CACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAe,EAAQ;SAAY,CAAA,EACnD,kBAAC,QAAD,EAAA,UAAA;SACG,EAAQ;SAAK;SAAE,EAAQ;SAAM;SACzB,EAAA,CAAA,CACH;WACN,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,OAAD;SACE,WAAW,eACT,IAAU,KACN,yBACA,IAAU,KACR,2BACA;SAER,OAAO,EAAE,OAAO,GAAG,EAAQ,IAAI;SAC/B,CAAA;QACE,CAAA,CACF;SAnBI,EAAQ,KAmBZ;OAER;KACU,CAAA,CACT,EAAA,CAAA,EAEP,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,qBAA6B,CAAA,EACxC,kBAAC,GAAD,EAAA,UAAiB,0CAAwD,CAAA,CAC9D,EAAA,CAAA,EACb,kBAAC,GAAD;KAAa,WAAU;eAAvB,CACG,EACE,QAAQ,MAAU,EAAM,WAAW,UAAU,CAC7C,KAAK,MACJ,kBAAC,OAAD;MAEE,WAAU;gBAFZ,CAIE,kBAAC,OAAD,EAAA,UAAA;OACE,kBAAC,KAAD;QAAG,WAAU;kBAAuB,EAAM;QAAiB,CAAA;OAC3D,kBAAC,KAAD;QAAG,WAAU;kBAAb;SACG,EAAM;SAAK;SAAI,EAAM;SAAK;SAAS,EAAM;SAAU;SAAK,EAAM;SAC7D;;OACJ,kBAAC,KAAD;QAAG,WAAU;kBAAoC,EAAM;QAAW,CAAA;OAC9D,EAAA,CAAA,EACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,MAAK;QACL,SAAQ;QACR,WAAU;QACV,eAAe,EAAe,GAAO,WAAW;kBACjD;QAEQ,CAAA,EACT,kBAAC,GAAD;QACE,MAAK;QACL,WAAU;QACV,eAAe,EAAe,GAAO,WAAW;kBACjD;QAEQ,CAAA,CACL;SACF;QA3BC,EAAM,GA2BP,CACN,EACH,MAAiB,KAChB,kBAAC,KAAD;MAAG,WAAU;gBAA+C;MAExD,CAAA,CAEM;OACT,EAAA,CAAA,CACH;;GAEN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UAAW,sBAA8B,CAAA,EACzC,kBAAC,GAAD,EAAA,UAAiB,kCAAgD,CAAA,CACtD,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,QAAD,EAAA,UAAM,YAAe,CAAA;KACrB,kBAAC,QAAD,EAAA,UAAM,cAAiB,CAAA;KACvB,kBAAC,QAAD,EAAA,UAAM,QAAW,CAAA;KACjB,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;KACnB,kBAAC,QAAD;MAAM,WAAU;gBAAa;MAAW,CAAA;KACxC,kBAAC,QAAD,EAAA,UAAM,UAAa,CAAA;KACnB,kBAAC,QAAD;MAAM,WAAU;gBAAc;MAAa,CAAA;KACvC;OACL,EAAc,KAAK,MAClB,kBAAC,OAAD;IAEE,WAAU;cAFZ;KAIE,kBAAC,QAAD;MAAM,WAAU;gBAAe,EAAM;MAAoB,CAAA;KACzD,kBAAC,QAAD;MAAM,WAAU;gBAAuB,EAAM;MAAkB,CAAA;KAC/D,kBAAC,GAAD;MAAO,SAAQ;MAAU,WAAU;gBAChC,EAAM;MACD,CAAA;KACR,kBAAC,QAAD;MAAM,WAAU;gBAAhB;OACG,EAAM;OAAU;OAAI,EAAM;OACtB;;KACP,kBAAC,QAAD;MAAM,WAAU;gBAAc,EAAM;MAAY,CAAA;KAChD,kBAAC,QAAD;MAAM,WAAU;gBAAwC,EAAM;MAAc,CAAA;KAC5E,kBAAC,OAAD;MAAK,WAAU;gBACb,kBAAC,GAAD;OACE,SACE,EAAM,WAAW,aACb,YACA,EAAM,WAAW,YACf,cACA;OAER,WAAU;iBAET,EAAM;OACD,CAAA;MACJ,CAAA;KACF;MA3BC,EAAM,GA2BP,CACN,CACU,EAAA,CAAA,CACT,EAAA,CAAA;GAEP,kBAAC,GAAD;IACE,MAAM,EAAK;IACX,cAAc,EAAK;IACnB,OAAM;IACN,aAAY;IACZ,QAAQ;IACR,aAAY;IACZ,UAAU;IACV,CAAA;GACE"}
|