@burdenoff/microfe-crewfoundry 2026.704.3 → 2026.704.4
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/pages/AdminAdminPagePage.js +76 -75
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +118 -117
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +115 -114
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +105 -104
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +52 -51
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +94 -93
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +97 -96
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +68 -67
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +96 -95
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +153 -152
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +107 -106
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +77 -76
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +80 -79
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +102 -101
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +64 -63
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +96 -95
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +127 -126
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +118 -117
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +123 -122
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +77 -76
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +49 -48
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +62 -61
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +72 -71
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +70 -69
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +57 -56
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +58 -57
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +122 -121
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +70 -69
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +41 -40
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +65 -64
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +75 -74
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +60 -59
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +53 -52
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +37 -36
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +126 -125
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +62 -61
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +50 -49
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +72 -71
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +40 -39
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +130 -129
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +60 -59
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +177 -146
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/formatEnumLabel.js +8 -0
- package/dist/crewfoundry/utils/formatEnumLabel.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
2
|
+
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
|
+
import { FormModal as n } from "../components/forms/FormModal.js";
|
|
4
|
+
import { ConfirmDialog as r } from "../components/forms/ConfirmDialog.js";
|
|
5
|
+
import { getNumber as i, getTags as a, getText as o } from "../components/forms/formValues.js";
|
|
6
|
+
import { useState as s } from "react";
|
|
7
|
+
import { Briefcase as c, Calendar as l, CheckCircle as u, DollarSign as d, MapPin as f, Pencil as p, Share2 as m, Trash2 as h, Users as g } from "lucide-react";
|
|
8
|
+
import { useNavigate as _, useSearchParams as v } from "react-router-dom";
|
|
9
|
+
import { jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
10
|
+
import { Badge as x, Button as S, Card as C, CardContent as w, CardDescription as T, CardHeader as E, CardTitle as D, GlassCard as O, GradientText as k, IllustratedEmptyState as A, NextSteps as j, PagePurpose as M, ResponsiveTable as N } from "@burdenoff/fe-libs/ui";
|
|
11
|
+
import { useGlobalUi as P } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
11
12
|
//#region src/crewfoundry/pages/HiringJobDetailsPagePage.tsx
|
|
12
|
-
var
|
|
13
|
+
var F = [
|
|
13
14
|
{
|
|
14
15
|
name: "title",
|
|
15
16
|
label: "Job Title",
|
|
@@ -137,12 +138,12 @@ var P = [
|
|
|
137
138
|
label: "Benefits",
|
|
138
139
|
type: "tags"
|
|
139
140
|
}
|
|
140
|
-
],
|
|
141
|
+
], I = [
|
|
141
142
|
{
|
|
142
143
|
key: "name",
|
|
143
144
|
header: "Name",
|
|
144
145
|
priority: "primary",
|
|
145
|
-
cell: (e) => /* @__PURE__ */
|
|
146
|
+
cell: (e) => /* @__PURE__ */ b("span", {
|
|
146
147
|
className: "font-medium",
|
|
147
148
|
children: [
|
|
148
149
|
e.firstName,
|
|
@@ -155,7 +156,7 @@ var P = [
|
|
|
155
156
|
key: "source",
|
|
156
157
|
header: "Source",
|
|
157
158
|
priority: "secondary",
|
|
158
|
-
cell: (e) => /* @__PURE__ */
|
|
159
|
+
cell: (e) => /* @__PURE__ */ y("span", {
|
|
159
160
|
className: "text-text-secondary",
|
|
160
161
|
children: e.source
|
|
161
162
|
})
|
|
@@ -164,206 +165,206 @@ var P = [
|
|
|
164
165
|
key: "experience",
|
|
165
166
|
header: "Experience",
|
|
166
167
|
priority: "secondary",
|
|
167
|
-
cell: (e) => /* @__PURE__ */
|
|
168
|
+
cell: (e) => /* @__PURE__ */ b("span", { children: [e.experience, " yrs"] })
|
|
168
169
|
},
|
|
169
170
|
{
|
|
170
171
|
key: "rating",
|
|
171
172
|
header: "Rating",
|
|
172
173
|
priority: "secondary",
|
|
173
|
-
cell: (e) => /* @__PURE__ */
|
|
174
|
+
cell: (e) => /* @__PURE__ */ b("span", { children: [e.rating, "/5"] })
|
|
174
175
|
},
|
|
175
176
|
{
|
|
176
177
|
key: "status",
|
|
177
178
|
header: "Status",
|
|
178
179
|
priority: "secondary",
|
|
179
|
-
cell: (e) => /* @__PURE__ */
|
|
180
|
+
cell: (e) => /* @__PURE__ */ y(x, {
|
|
180
181
|
variant: e.status === "hired" ? "default" : "secondary",
|
|
181
182
|
className: "text-[10px]",
|
|
182
|
-
children: e.status
|
|
183
|
+
children: t(e.status)
|
|
183
184
|
})
|
|
184
185
|
}
|
|
185
186
|
];
|
|
186
|
-
function
|
|
187
|
-
let
|
|
188
|
-
if (!
|
|
187
|
+
function L() {
|
|
188
|
+
let L = _(), [R] = v(), { showToast: z } = P(), { jobPostings: B, candidates: V, updateJobPosting: H, removeJobPosting: U } = e(), W = R.get("id"), G = W ? B.find((e) => e.id === W) : B[0], [K, q] = s(!1), [J, Y] = s(!1);
|
|
189
|
+
if (!G) return /* @__PURE__ */ y("div", {
|
|
189
190
|
className: "p-6",
|
|
190
|
-
children: /* @__PURE__ */
|
|
191
|
+
children: /* @__PURE__ */ y(A, {
|
|
191
192
|
illustration: "empty-search",
|
|
192
193
|
title: "No job posting found",
|
|
193
194
|
description: "This job posting is no longer available."
|
|
194
195
|
})
|
|
195
196
|
});
|
|
196
|
-
let
|
|
197
|
-
title:
|
|
198
|
-
department:
|
|
199
|
-
location:
|
|
200
|
-
type:
|
|
201
|
-
experienceLevel:
|
|
202
|
-
status:
|
|
203
|
-
salaryMin:
|
|
204
|
-
salaryMax:
|
|
205
|
-
deadline:
|
|
206
|
-
description:
|
|
207
|
-
requirements:
|
|
208
|
-
benefits:
|
|
197
|
+
let X = V.filter((e) => e.position === G.title), Z = {
|
|
198
|
+
title: G.title,
|
|
199
|
+
department: G.department,
|
|
200
|
+
location: G.location,
|
|
201
|
+
type: G.type,
|
|
202
|
+
experienceLevel: G.experienceLevel,
|
|
203
|
+
status: G.status,
|
|
204
|
+
salaryMin: G.salaryMin,
|
|
205
|
+
salaryMax: G.salaryMax,
|
|
206
|
+
deadline: G.deadline,
|
|
207
|
+
description: G.description,
|
|
208
|
+
requirements: G.requirements,
|
|
209
|
+
benefits: G.benefits
|
|
209
210
|
};
|
|
210
|
-
return /* @__PURE__ */
|
|
211
|
+
return /* @__PURE__ */ b("div", {
|
|
211
212
|
className: "space-y-6 p-6 max-w-4xl",
|
|
212
213
|
children: [
|
|
213
|
-
/* @__PURE__ */
|
|
214
|
+
/* @__PURE__ */ b("div", {
|
|
214
215
|
className: "flex items-center justify-between",
|
|
215
|
-
children: [/* @__PURE__ */
|
|
216
|
-
/* @__PURE__ */
|
|
216
|
+
children: [/* @__PURE__ */ b("div", { children: [
|
|
217
|
+
/* @__PURE__ */ b("div", {
|
|
217
218
|
className: "flex items-center gap-2 mb-1",
|
|
218
|
-
children: [/* @__PURE__ */
|
|
219
|
+
children: [/* @__PURE__ */ y("h1", {
|
|
219
220
|
className: "text-2xl font-semibold",
|
|
220
|
-
children: /* @__PURE__ */
|
|
221
|
-
}), /* @__PURE__ */
|
|
222
|
-
variant:
|
|
223
|
-
children:
|
|
221
|
+
children: /* @__PURE__ */ y(k, { children: G.title })
|
|
222
|
+
}), /* @__PURE__ */ y(x, {
|
|
223
|
+
variant: G.status === "active" ? "default" : "secondary",
|
|
224
|
+
children: t(G.status)
|
|
224
225
|
})]
|
|
225
226
|
}),
|
|
226
|
-
/* @__PURE__ */
|
|
227
|
+
/* @__PURE__ */ b("div", {
|
|
227
228
|
className: "flex items-center gap-4 text-sm text-text-secondary",
|
|
228
229
|
children: [
|
|
229
|
-
/* @__PURE__ */
|
|
230
|
+
/* @__PURE__ */ b("span", {
|
|
230
231
|
className: "flex items-center gap-1",
|
|
231
|
-
children: [/* @__PURE__ */
|
|
232
|
+
children: [/* @__PURE__ */ y(c, { className: "h-3 w-3" }), G.department]
|
|
232
233
|
}),
|
|
233
|
-
/* @__PURE__ */
|
|
234
|
+
/* @__PURE__ */ b("span", {
|
|
234
235
|
className: "flex items-center gap-1",
|
|
235
|
-
children: [/* @__PURE__ */
|
|
236
|
+
children: [/* @__PURE__ */ y(f, { className: "h-3 w-3" }), G.location]
|
|
236
237
|
}),
|
|
237
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ b("span", {
|
|
238
239
|
className: "flex items-center gap-1",
|
|
239
240
|
children: [
|
|
240
|
-
/* @__PURE__ */
|
|
241
|
+
/* @__PURE__ */ y(l, { className: "h-3 w-3" }),
|
|
241
242
|
"Posted ",
|
|
242
|
-
|
|
243
|
+
G.postedDate
|
|
243
244
|
]
|
|
244
245
|
})
|
|
245
246
|
]
|
|
246
247
|
}),
|
|
247
|
-
/* @__PURE__ */
|
|
248
|
+
/* @__PURE__ */ y(M, {
|
|
248
249
|
className: "mt-2",
|
|
249
250
|
children: "Everything about this role in one place — review applicants, requirements, and compensation here to decide who to interview and keep the posting current."
|
|
250
251
|
})
|
|
251
|
-
] }), /* @__PURE__ */
|
|
252
|
+
] }), /* @__PURE__ */ b("div", {
|
|
252
253
|
className: "flex gap-2",
|
|
253
254
|
children: [
|
|
254
|
-
/* @__PURE__ */
|
|
255
|
+
/* @__PURE__ */ b(S, {
|
|
255
256
|
variant: "outline",
|
|
256
257
|
size: "sm",
|
|
257
|
-
onClick: () =>
|
|
258
|
-
children: [/* @__PURE__ */
|
|
258
|
+
onClick: () => z("Sharing job postings is coming soon", "info"),
|
|
259
|
+
children: [/* @__PURE__ */ y(m, { className: "h-4 w-4 mr-1" }), "Share"]
|
|
259
260
|
}),
|
|
260
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ b(S, {
|
|
261
262
|
variant: "outline",
|
|
262
263
|
size: "sm",
|
|
263
|
-
onClick: () =>
|
|
264
|
-
children: [/* @__PURE__ */
|
|
264
|
+
onClick: () => q(!0),
|
|
265
|
+
children: [/* @__PURE__ */ y(p, { className: "h-4 w-4 mr-1" }), "Edit Posting"]
|
|
265
266
|
}),
|
|
266
|
-
/* @__PURE__ */
|
|
267
|
+
/* @__PURE__ */ y(S, {
|
|
267
268
|
variant: "destructive",
|
|
268
269
|
size: "sm",
|
|
269
270
|
"aria-label": "Delete job posting",
|
|
270
|
-
onClick: () =>
|
|
271
|
-
children: /* @__PURE__ */
|
|
271
|
+
onClick: () => Y(!0),
|
|
272
|
+
children: /* @__PURE__ */ y(h, { className: "h-4 w-4" })
|
|
272
273
|
})
|
|
273
274
|
]
|
|
274
275
|
})]
|
|
275
276
|
}),
|
|
276
|
-
/* @__PURE__ */
|
|
277
|
+
/* @__PURE__ */ y(j, {
|
|
277
278
|
storageKey: "crewfoundry-job-details",
|
|
278
279
|
steps: [
|
|
279
280
|
{
|
|
280
281
|
id: "applicants",
|
|
281
282
|
label: "Review applicants",
|
|
282
283
|
description: "Screen the candidates who applied for this role.",
|
|
283
|
-
icon: /* @__PURE__ */
|
|
284
|
-
onClick: () =>
|
|
284
|
+
icon: /* @__PURE__ */ y(g, { className: "h-4 w-4" }),
|
|
285
|
+
onClick: () => L("../../hiring/applications-page")
|
|
285
286
|
},
|
|
286
287
|
{
|
|
287
288
|
id: "interviews",
|
|
288
289
|
label: "Schedule interviews",
|
|
289
290
|
description: "Set up conversations with promising candidates.",
|
|
290
|
-
icon: /* @__PURE__ */
|
|
291
|
-
onClick: () =>
|
|
291
|
+
icon: /* @__PURE__ */ y(l, { className: "h-4 w-4" }),
|
|
292
|
+
onClick: () => L("../../hiring/interviews-page")
|
|
292
293
|
},
|
|
293
294
|
{
|
|
294
295
|
id: "candidates",
|
|
295
296
|
label: "Browse your talent pool",
|
|
296
297
|
description: "Source more candidates that fit this position.",
|
|
297
|
-
icon: /* @__PURE__ */
|
|
298
|
-
onClick: () =>
|
|
298
|
+
icon: /* @__PURE__ */ y(c, { className: "h-4 w-4" }),
|
|
299
|
+
onClick: () => L("../../hiring/candidates-page")
|
|
299
300
|
}
|
|
300
301
|
]
|
|
301
302
|
}),
|
|
302
|
-
/* @__PURE__ */
|
|
303
|
+
/* @__PURE__ */ b("div", {
|
|
303
304
|
className: "grid gap-4 md:grid-cols-4",
|
|
304
305
|
children: [
|
|
305
|
-
/* @__PURE__ */
|
|
306
|
+
/* @__PURE__ */ y(O, {
|
|
306
307
|
treatment: "glass",
|
|
307
308
|
glow: !0,
|
|
308
309
|
className: "border-border-seam",
|
|
309
|
-
children: /* @__PURE__ */
|
|
310
|
+
children: /* @__PURE__ */ b(w, {
|
|
310
311
|
className: "p-4 text-center",
|
|
311
312
|
children: [
|
|
312
|
-
/* @__PURE__ */
|
|
313
|
-
/* @__PURE__ */
|
|
313
|
+
/* @__PURE__ */ y(g, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
314
|
+
/* @__PURE__ */ y("p", {
|
|
314
315
|
className: "text-2xl font-bold tabular-nums",
|
|
315
|
-
children:
|
|
316
|
+
children: G.applicants
|
|
316
317
|
}),
|
|
317
|
-
/* @__PURE__ */
|
|
318
|
+
/* @__PURE__ */ y("p", {
|
|
318
319
|
className: "text-xs text-text-secondary",
|
|
319
320
|
children: "Applicants"
|
|
320
321
|
})
|
|
321
322
|
]
|
|
322
323
|
})
|
|
323
324
|
}),
|
|
324
|
-
/* @__PURE__ */
|
|
325
|
+
/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
325
326
|
className: "p-4 text-center",
|
|
326
327
|
children: [
|
|
327
|
-
/* @__PURE__ */
|
|
328
|
-
/* @__PURE__ */
|
|
328
|
+
/* @__PURE__ */ y(d, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
329
|
+
/* @__PURE__ */ b("p", {
|
|
329
330
|
className: "text-lg font-bold",
|
|
330
331
|
children: [
|
|
331
332
|
"$",
|
|
332
|
-
(
|
|
333
|
+
(G.salaryMin / 1e3).toFixed(0),
|
|
333
334
|
"K-$",
|
|
334
|
-
(
|
|
335
|
+
(G.salaryMax / 1e3).toFixed(0),
|
|
335
336
|
"K"
|
|
336
337
|
]
|
|
337
338
|
}),
|
|
338
|
-
/* @__PURE__ */
|
|
339
|
+
/* @__PURE__ */ y("p", {
|
|
339
340
|
className: "text-xs text-text-secondary",
|
|
340
341
|
children: "Salary Range"
|
|
341
342
|
})
|
|
342
343
|
]
|
|
343
344
|
}) }),
|
|
344
|
-
/* @__PURE__ */
|
|
345
|
+
/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
345
346
|
className: "p-4 text-center",
|
|
346
347
|
children: [
|
|
347
|
-
/* @__PURE__ */
|
|
348
|
-
/* @__PURE__ */
|
|
348
|
+
/* @__PURE__ */ y(l, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
349
|
+
/* @__PURE__ */ y("p", {
|
|
349
350
|
className: "text-lg font-bold",
|
|
350
|
-
children:
|
|
351
|
+
children: G.deadline
|
|
351
352
|
}),
|
|
352
|
-
/* @__PURE__ */
|
|
353
|
+
/* @__PURE__ */ y("p", {
|
|
353
354
|
className: "text-xs text-text-secondary",
|
|
354
355
|
children: "Deadline"
|
|
355
356
|
})
|
|
356
357
|
]
|
|
357
358
|
}) }),
|
|
358
|
-
/* @__PURE__ */
|
|
359
|
+
/* @__PURE__ */ y(C, { children: /* @__PURE__ */ b(w, {
|
|
359
360
|
className: "p-4 text-center",
|
|
360
361
|
children: [
|
|
361
|
-
/* @__PURE__ */
|
|
362
|
-
/* @__PURE__ */
|
|
362
|
+
/* @__PURE__ */ y(u, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
363
|
+
/* @__PURE__ */ y("p", {
|
|
363
364
|
className: "text-lg font-bold",
|
|
364
|
-
children:
|
|
365
|
+
children: t(G.experienceLevel)
|
|
365
366
|
}),
|
|
366
|
-
/* @__PURE__ */
|
|
367
|
+
/* @__PURE__ */ y("p", {
|
|
367
368
|
className: "text-xs text-text-secondary",
|
|
368
369
|
children: "Level"
|
|
369
370
|
})
|
|
@@ -371,72 +372,72 @@ function I() {
|
|
|
371
372
|
}) })
|
|
372
373
|
]
|
|
373
374
|
}),
|
|
374
|
-
/* @__PURE__ */
|
|
375
|
+
/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Description" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("p", {
|
|
375
376
|
className: "text-sm text-text-secondary",
|
|
376
|
-
children:
|
|
377
|
+
children: G.description
|
|
377
378
|
}) })] }),
|
|
378
|
-
/* @__PURE__ */
|
|
379
|
+
/* @__PURE__ */ b("div", {
|
|
379
380
|
className: "grid gap-4 md:grid-cols-2",
|
|
380
|
-
children: [/* @__PURE__ */
|
|
381
|
+
children: [/* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Requirements" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("ul", {
|
|
381
382
|
className: "space-y-2",
|
|
382
|
-
children:
|
|
383
|
+
children: G.requirements.map((e, t) => /* @__PURE__ */ b("li", {
|
|
383
384
|
className: "flex items-start gap-2 text-sm",
|
|
384
|
-
children: [/* @__PURE__ */
|
|
385
|
+
children: [/* @__PURE__ */ y(u, { className: "h-4 w-4 text-status-success-text mt-0.5 flex-shrink-0" }), e]
|
|
385
386
|
}, t))
|
|
386
|
-
}) })] }), /* @__PURE__ */
|
|
387
|
+
}) })] }), /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ y(E, { children: /* @__PURE__ */ y(D, { children: "Benefits" }) }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y("ul", {
|
|
387
388
|
className: "space-y-2",
|
|
388
|
-
children:
|
|
389
|
+
children: G.benefits.map((e, t) => /* @__PURE__ */ b("li", {
|
|
389
390
|
className: "flex items-start gap-2 text-sm",
|
|
390
|
-
children: [/* @__PURE__ */
|
|
391
|
+
children: [/* @__PURE__ */ y(u, { className: "h-4 w-4 text-status-info-text mt-0.5 flex-shrink-0" }), e]
|
|
391
392
|
}, t))
|
|
392
393
|
}) })] })]
|
|
393
394
|
}),
|
|
394
|
-
|
|
395
|
-
data:
|
|
395
|
+
X.length > 0 && /* @__PURE__ */ b(C, { children: [/* @__PURE__ */ b(E, { children: [/* @__PURE__ */ y(D, { children: "Applicants for this Role" }), /* @__PURE__ */ b(T, { children: [X.length, " candidates"] })] }), /* @__PURE__ */ y(w, { children: /* @__PURE__ */ y(N, {
|
|
396
|
+
data: X,
|
|
396
397
|
rowKey: (e) => e.id,
|
|
397
|
-
columns:
|
|
398
|
+
columns: I
|
|
398
399
|
}) })] }),
|
|
399
|
-
/* @__PURE__ */
|
|
400
|
-
open:
|
|
401
|
-
onOpenChange:
|
|
400
|
+
/* @__PURE__ */ y(n, {
|
|
401
|
+
open: K,
|
|
402
|
+
onOpenChange: q,
|
|
402
403
|
title: "Edit Job Posting",
|
|
403
404
|
description: "Update the role details, compensation, and status.",
|
|
404
|
-
fields:
|
|
405
|
-
initialValues:
|
|
405
|
+
fields: F,
|
|
406
|
+
initialValues: Z,
|
|
406
407
|
submitLabel: "Save changes",
|
|
407
408
|
onSubmit: async (e) => {
|
|
408
409
|
let t = {
|
|
409
|
-
title:
|
|
410
|
-
department:
|
|
411
|
-
location:
|
|
410
|
+
title: o(e, "title"),
|
|
411
|
+
department: o(e, "department"),
|
|
412
|
+
location: o(e, "location"),
|
|
412
413
|
type: e.type,
|
|
413
414
|
experienceLevel: e.experienceLevel,
|
|
414
415
|
status: e.status,
|
|
415
|
-
salaryMin:
|
|
416
|
-
salaryMax:
|
|
417
|
-
deadline:
|
|
418
|
-
description:
|
|
419
|
-
requirements:
|
|
420
|
-
benefits:
|
|
416
|
+
salaryMin: i(e, "salaryMin"),
|
|
417
|
+
salaryMax: i(e, "salaryMax"),
|
|
418
|
+
deadline: o(e, "deadline"),
|
|
419
|
+
description: o(e, "description"),
|
|
420
|
+
requirements: a(e, "requirements"),
|
|
421
|
+
benefits: a(e, "benefits")
|
|
421
422
|
};
|
|
422
|
-
await
|
|
423
|
+
await H(G.id, t), z("Job posting updated", "success");
|
|
423
424
|
}
|
|
424
425
|
}),
|
|
425
|
-
/* @__PURE__ */
|
|
426
|
-
open:
|
|
427
|
-
onOpenChange:
|
|
426
|
+
/* @__PURE__ */ y(r, {
|
|
427
|
+
open: J,
|
|
428
|
+
onOpenChange: Y,
|
|
428
429
|
title: "Delete job posting",
|
|
429
|
-
description: `Permanently remove “${
|
|
430
|
+
description: `Permanently remove “${G.title}”? This cannot be undone.`,
|
|
430
431
|
confirmLabel: "Delete",
|
|
431
432
|
destructive: !0,
|
|
432
433
|
onConfirm: async () => {
|
|
433
|
-
await
|
|
434
|
+
await U(G.id), z("Job posting deleted", "success"), L("../../hiring/jobs-page");
|
|
434
435
|
}
|
|
435
436
|
})
|
|
436
437
|
]
|
|
437
438
|
});
|
|
438
439
|
}
|
|
439
440
|
//#endregion
|
|
440
|
-
export {
|
|
441
|
+
export { L as HiringJobDetailsPagePage };
|
|
441
442
|
|
|
442
443
|
//# sourceMappingURL=HiringJobDetailsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringJobDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringJobDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport {\n Briefcase,\n Calendar,\n CheckCircle,\n DollarSign,\n MapPin,\n Pencil,\n Share2,\n Trash2,\n Users,\n} from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore, type Candidate, type JobPosting } from '../store/crewfoundryStore';\nimport { FormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { ConfirmDialog } from '../components/forms/ConfirmDialog';\nimport { getNumber, getTags, getText } from '../components/forms/formValues';\n\nconst JOB_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Job Title', type: 'text', required: true, colSpan: 2 },\n { name: 'department', label: 'Department', type: 'text', required: true },\n { name: 'location', label: 'Location', type: 'text', required: true },\n {\n name: 'type',\n label: 'Employment Type',\n type: 'select',\n options: [\n { label: 'Full time', value: 'full_time' },\n { label: 'Part time', value: 'part_time' },\n { label: 'Contract', value: 'contract' },\n { label: 'Remote', value: 'remote' },\n ],\n },\n {\n name: 'experienceLevel',\n label: 'Experience Level',\n type: 'select',\n options: [\n { label: 'Entry', value: 'entry' },\n { label: 'Mid', value: 'mid' },\n { label: 'Senior', value: 'senior' },\n { label: 'Lead', value: 'lead' },\n { label: 'Executive', value: 'executive' },\n ],\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Draft', value: 'draft' },\n { label: 'Active', value: 'active' },\n { label: 'Paused', value: 'paused' },\n { label: 'Closed', value: 'closed' },\n { label: 'Filled', value: 'filled' },\n ],\n },\n { name: 'salaryMin', label: 'Salary Min ($)', type: 'number' },\n { name: 'salaryMax', label: 'Salary Max ($)', type: 'number' },\n { name: 'deadline', label: 'Application Deadline', type: 'date' },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n { name: 'requirements', label: 'Requirements', type: 'tags' },\n { name: 'benefits', label: 'Benefits', type: 'tags' },\n];\n\nconst APPLICANT_COLUMNS: ResponsiveTableColumn<Candidate>[] = [\n {\n key: 'name',\n header: 'Name',\n priority: 'primary',\n cell: (c) => (\n <span className=\"font-medium\">\n {c.firstName} {c.lastName}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n priority: 'secondary',\n cell: (c) => <span className=\"text-text-secondary\">{c.source}</span>,\n },\n {\n key: 'experience',\n header: 'Experience',\n priority: 'secondary',\n cell: (c) => <span>{c.experience} yrs</span>,\n },\n {\n key: 'rating',\n header: 'Rating',\n priority: 'secondary',\n cell: (c) => <span>{c.rating}/5</span>,\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'secondary',\n cell: (c) => (\n <Badge variant={c.status === 'hired' ? 'default' : 'secondary'} className=\"text-[10px]\">\n {c.status}\n </Badge>\n ),\n },\n];\n\nexport function HiringJobDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const { jobPostings, candidates, updateJobPosting, removeJobPosting } = useCrewFoundryStore();\n const jobId = searchParams.get('id');\n const job = jobId ? jobPostings.find((j) => j.id === jobId) : jobPostings[0];\n const [editOpen, setEditOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n\n if (!job) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No job posting found\"\n description=\"This job posting is no longer available.\"\n />\n </div>\n );\n }\n\n const jobCandidates = candidates.filter((c) => c.position === job.title);\n\n const editInitial: FormValues = {\n title: job.title,\n department: job.department,\n location: job.location,\n type: job.type,\n experienceLevel: job.experienceLevel,\n status: job.status,\n salaryMin: job.salaryMin,\n salaryMax: job.salaryMax,\n deadline: job.deadline,\n description: job.description,\n requirements: job.requirements,\n benefits: job.benefits,\n };\n\n const handleEditSubmit = async (values: FormValues) => {\n const updates: Partial<JobPosting> = {\n title: getText(values, 'title'),\n department: getText(values, 'department'),\n location: getText(values, 'location'),\n type: values.type as JobPosting['type'],\n experienceLevel: values.experienceLevel as JobPosting['experienceLevel'],\n status: values.status as JobPosting['status'],\n salaryMin: getNumber(values, 'salaryMin'),\n salaryMax: getNumber(values, 'salaryMax'),\n deadline: getText(values, 'deadline'),\n description: getText(values, 'description'),\n requirements: getTags(values, 'requirements'),\n benefits: getTags(values, 'benefits'),\n };\n await updateJobPosting(job.id, updates);\n showToast('Job posting updated', 'success');\n };\n\n const handleDelete = async () => {\n await removeJobPosting(job.id);\n showToast('Job posting deleted', 'success');\n navigate('../../hiring/jobs-page');\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{job.title}</GradientText>\n </h1>\n <Badge variant={job.status === 'active' ? 'default' : 'secondary'}>{job.status}</Badge>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Briefcase className=\"h-3 w-3\" />\n {job.department}\n </span>\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {job.location}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n Posted {job.postedDate}\n </span>\n </div>\n <PagePurpose className=\"mt-2\">\n Everything about this role in one place — review applicants, requirements, and\n compensation here to decide who to interview and keep the posting current.\n </PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => showToast('Sharing job postings is coming soon', 'info')}\n >\n <Share2 className=\"h-4 w-4 mr-1\" />\n Share\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setEditOpen(true)}>\n <Pencil className=\"h-4 w-4 mr-1\" />\n Edit Posting\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n aria-label=\"Delete job posting\"\n onClick={() => setDeleteOpen(true)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-job-details\"\n steps={[\n {\n id: 'applicants',\n label: 'Review applicants',\n description: 'Screen the candidates who applied for this role.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/applications-page'),\n },\n {\n id: 'interviews',\n label: 'Schedule interviews',\n description: 'Set up conversations with promising candidates.',\n icon: <Calendar className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/interviews-page'),\n },\n {\n id: 'candidates',\n label: 'Browse your talent pool',\n description: 'Source more candidates that fit this position.',\n icon: <Briefcase className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/candidates-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-2xl font-bold tabular-nums\">{job.applicants}</p>\n <p className=\"text-xs text-text-secondary\">Applicants</p>\n </CardContent>\n </GlassCard>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">\n ${(job.salaryMin / 1000).toFixed(0)}K-${(job.salaryMax / 1000).toFixed(0)}K\n </p>\n <p className=\"text-xs text-text-secondary\">Salary Range</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{job.deadline}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <CheckCircle className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{job.experienceLevel}</p>\n <p className=\"text-xs text-text-secondary\">Level</p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">{job.description}</p>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Requirements</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-2\">\n {job.requirements.map((req, idx) => (\n <li key={idx} className=\"flex items-start gap-2 text-sm\">\n <CheckCircle className=\"h-4 w-4 text-status-success-text mt-0.5 flex-shrink-0\" />\n {req}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Benefits</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-2\">\n {job.benefits.map((ben, idx) => (\n <li key={idx} className=\"flex items-start gap-2 text-sm\">\n <CheckCircle className=\"h-4 w-4 text-status-info-text mt-0.5 flex-shrink-0\" />\n {ben}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n </div>\n\n {jobCandidates.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Applicants for this Role</CardTitle>\n <CardDescription>{jobCandidates.length} candidates</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable\n data={jobCandidates}\n rowKey={(c) => c.id}\n columns={APPLICANT_COLUMNS}\n />\n </CardContent>\n </Card>\n )}\n\n <FormModal\n open={editOpen}\n onOpenChange={setEditOpen}\n title=\"Edit Job Posting\"\n description=\"Update the role details, compensation, and status.\"\n fields={JOB_FIELDS}\n initialValues={editInitial}\n submitLabel=\"Save changes\"\n onSubmit={handleEditSubmit}\n />\n <ConfirmDialog\n open={deleteOpen}\n onOpenChange={setDeleteOpen}\n title=\"Delete job posting\"\n description={`Permanently remove “${job.title}”? This cannot be undone.`}\n confirmLabel=\"Delete\"\n destructive\n onConfirm={handleDelete}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HiringJobDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringJobDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n ResponsiveTable,\n type ResponsiveTableColumn,\n} from '@burdenoff/fe-libs/ui';\nimport { useState } from 'react';\nimport {\n Briefcase,\n Calendar,\n CheckCircle,\n DollarSign,\n MapPin,\n Pencil,\n Share2,\n Trash2,\n Users,\n} from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore, type Candidate, type JobPosting } from '../store/crewfoundryStore';\nimport { FormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { ConfirmDialog } from '../components/forms/ConfirmDialog';\nimport { getNumber, getTags, getText } from '../components/forms/formValues';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nconst JOB_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Job Title', type: 'text', required: true, colSpan: 2 },\n { name: 'department', label: 'Department', type: 'text', required: true },\n { name: 'location', label: 'Location', type: 'text', required: true },\n {\n name: 'type',\n label: 'Employment Type',\n type: 'select',\n options: [\n { label: 'Full time', value: 'full_time' },\n { label: 'Part time', value: 'part_time' },\n { label: 'Contract', value: 'contract' },\n { label: 'Remote', value: 'remote' },\n ],\n },\n {\n name: 'experienceLevel',\n label: 'Experience Level',\n type: 'select',\n options: [\n { label: 'Entry', value: 'entry' },\n { label: 'Mid', value: 'mid' },\n { label: 'Senior', value: 'senior' },\n { label: 'Lead', value: 'lead' },\n { label: 'Executive', value: 'executive' },\n ],\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n options: [\n { label: 'Draft', value: 'draft' },\n { label: 'Active', value: 'active' },\n { label: 'Paused', value: 'paused' },\n { label: 'Closed', value: 'closed' },\n { label: 'Filled', value: 'filled' },\n ],\n },\n { name: 'salaryMin', label: 'Salary Min ($)', type: 'number' },\n { name: 'salaryMax', label: 'Salary Max ($)', type: 'number' },\n { name: 'deadline', label: 'Application Deadline', type: 'date' },\n { name: 'description', label: 'Description', type: 'textarea', colSpan: 2 },\n { name: 'requirements', label: 'Requirements', type: 'tags' },\n { name: 'benefits', label: 'Benefits', type: 'tags' },\n];\n\nconst APPLICANT_COLUMNS: ResponsiveTableColumn<Candidate>[] = [\n {\n key: 'name',\n header: 'Name',\n priority: 'primary',\n cell: (c) => (\n <span className=\"font-medium\">\n {c.firstName} {c.lastName}\n </span>\n ),\n },\n {\n key: 'source',\n header: 'Source',\n priority: 'secondary',\n cell: (c) => <span className=\"text-text-secondary\">{c.source}</span>,\n },\n {\n key: 'experience',\n header: 'Experience',\n priority: 'secondary',\n cell: (c) => <span>{c.experience} yrs</span>,\n },\n {\n key: 'rating',\n header: 'Rating',\n priority: 'secondary',\n cell: (c) => <span>{c.rating}/5</span>,\n },\n {\n key: 'status',\n header: 'Status',\n priority: 'secondary',\n cell: (c) => (\n <Badge variant={c.status === 'hired' ? 'default' : 'secondary'} className=\"text-[10px]\">\n {formatEnumLabel(c.status)}\n </Badge>\n ),\n },\n];\n\nexport function HiringJobDetailsPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { showToast } = useGlobalUi();\n const { jobPostings, candidates, updateJobPosting, removeJobPosting } = useCrewFoundryStore();\n const jobId = searchParams.get('id');\n const job = jobId ? jobPostings.find((j) => j.id === jobId) : jobPostings[0];\n const [editOpen, setEditOpen] = useState(false);\n const [deleteOpen, setDeleteOpen] = useState(false);\n\n if (!job) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No job posting found\"\n description=\"This job posting is no longer available.\"\n />\n </div>\n );\n }\n\n const jobCandidates = candidates.filter((c) => c.position === job.title);\n\n const editInitial: FormValues = {\n title: job.title,\n department: job.department,\n location: job.location,\n type: job.type,\n experienceLevel: job.experienceLevel,\n status: job.status,\n salaryMin: job.salaryMin,\n salaryMax: job.salaryMax,\n deadline: job.deadline,\n description: job.description,\n requirements: job.requirements,\n benefits: job.benefits,\n };\n\n const handleEditSubmit = async (values: FormValues) => {\n const updates: Partial<JobPosting> = {\n title: getText(values, 'title'),\n department: getText(values, 'department'),\n location: getText(values, 'location'),\n type: values.type as JobPosting['type'],\n experienceLevel: values.experienceLevel as JobPosting['experienceLevel'],\n status: values.status as JobPosting['status'],\n salaryMin: getNumber(values, 'salaryMin'),\n salaryMax: getNumber(values, 'salaryMax'),\n deadline: getText(values, 'deadline'),\n description: getText(values, 'description'),\n requirements: getTags(values, 'requirements'),\n benefits: getTags(values, 'benefits'),\n };\n await updateJobPosting(job.id, updates);\n showToast('Job posting updated', 'success');\n };\n\n const handleDelete = async () => {\n await removeJobPosting(job.id);\n showToast('Job posting deleted', 'success');\n navigate('../../hiring/jobs-page');\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{job.title}</GradientText>\n </h1>\n <Badge variant={job.status === 'active' ? 'default' : 'secondary'}>{formatEnumLabel(job.status)}</Badge>\n </div>\n <div className=\"flex items-center gap-4 text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Briefcase className=\"h-3 w-3\" />\n {job.department}\n </span>\n <span className=\"flex items-center gap-1\">\n <MapPin className=\"h-3 w-3\" />\n {job.location}\n </span>\n <span className=\"flex items-center gap-1\">\n <Calendar className=\"h-3 w-3\" />\n Posted {job.postedDate}\n </span>\n </div>\n <PagePurpose className=\"mt-2\">\n Everything about this role in one place — review applicants, requirements, and\n compensation here to decide who to interview and keep the posting current.\n </PagePurpose>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => showToast('Sharing job postings is coming soon', 'info')}\n >\n <Share2 className=\"h-4 w-4 mr-1\" />\n Share\n </Button>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setEditOpen(true)}>\n <Pencil className=\"h-4 w-4 mr-1\" />\n Edit Posting\n </Button>\n <Button\n variant=\"destructive\"\n size=\"sm\"\n aria-label=\"Delete job posting\"\n onClick={() => setDeleteOpen(true)}\n >\n <Trash2 className=\"h-4 w-4\" />\n </Button>\n </div>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-job-details\"\n steps={[\n {\n id: 'applicants',\n label: 'Review applicants',\n description: 'Screen the candidates who applied for this role.',\n icon: <Users className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/applications-page'),\n },\n {\n id: 'interviews',\n label: 'Schedule interviews',\n description: 'Set up conversations with promising candidates.',\n icon: <Calendar className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/interviews-page'),\n },\n {\n id: 'candidates',\n label: 'Browse your talent pool',\n description: 'Source more candidates that fit this position.',\n icon: <Briefcase className=\"h-4 w-4\" />,\n onClick: () => navigate('../../hiring/candidates-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-2xl font-bold tabular-nums\">{job.applicants}</p>\n <p className=\"text-xs text-text-secondary\">Applicants</p>\n </CardContent>\n </GlassCard>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <DollarSign className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">\n ${(job.salaryMin / 1000).toFixed(0)}K-${(job.salaryMax / 1000).toFixed(0)}K\n </p>\n <p className=\"text-xs text-text-secondary\">Salary Range</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Calendar className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{job.deadline}</p>\n <p className=\"text-xs text-text-secondary\">Deadline</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <CheckCircle className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{formatEnumLabel(job.experienceLevel)}</p>\n <p className=\"text-xs text-text-secondary\">Level</p>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Description</CardTitle>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">{job.description}</p>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>Requirements</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-2\">\n {job.requirements.map((req, idx) => (\n <li key={idx} className=\"flex items-start gap-2 text-sm\">\n <CheckCircle className=\"h-4 w-4 text-status-success-text mt-0.5 flex-shrink-0\" />\n {req}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n <Card>\n <CardHeader>\n <CardTitle>Benefits</CardTitle>\n </CardHeader>\n <CardContent>\n <ul className=\"space-y-2\">\n {job.benefits.map((ben, idx) => (\n <li key={idx} className=\"flex items-start gap-2 text-sm\">\n <CheckCircle className=\"h-4 w-4 text-status-info-text mt-0.5 flex-shrink-0\" />\n {ben}\n </li>\n ))}\n </ul>\n </CardContent>\n </Card>\n </div>\n\n {jobCandidates.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Applicants for this Role</CardTitle>\n <CardDescription>{jobCandidates.length} candidates</CardDescription>\n </CardHeader>\n <CardContent>\n <ResponsiveTable\n data={jobCandidates}\n rowKey={(c) => c.id}\n columns={APPLICANT_COLUMNS}\n />\n </CardContent>\n </Card>\n )}\n\n <FormModal\n open={editOpen}\n onOpenChange={setEditOpen}\n title=\"Edit Job Posting\"\n description=\"Update the role details, compensation, and status.\"\n fields={JOB_FIELDS}\n initialValues={editInitial}\n submitLabel=\"Save changes\"\n onSubmit={handleEditSubmit}\n />\n <ConfirmDialog\n open={deleteOpen}\n onOpenChange={setDeleteOpen}\n title=\"Delete job posting\"\n description={`Permanently remove “${job.title}”? This cannot be undone.`}\n confirmLabel=\"Delete\"\n destructive\n onConfirm={handleDelete}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|