@burdenoff/microfe-crewfoundry 2026.625.2 → 2026.703.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +306 -51
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,170 +1,317 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
1
|
+
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
+
import { newClientId as t } from "../components/forms/formValues.js";
|
|
3
|
+
import { useState as n } from "react";
|
|
4
|
+
import { Briefcase as r, Plus as i, Save as a, X as o } from "lucide-react";
|
|
5
|
+
import { useNavigate as ee } from "react-router-dom";
|
|
6
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
|
+
import { Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, EmphasisPanel as h, GradientText as g, Input as _, PagePurpose as v, Textarea as y } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { useGlobalUi as b } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
5
9
|
//#region src/crewfoundry/pages/HiringCreateJobPagePage.tsx
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
},
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
var x = "flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50", S = [
|
|
11
|
+
{
|
|
12
|
+
label: "Full time",
|
|
13
|
+
value: "full_time"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
label: "Part time",
|
|
17
|
+
value: "part_time"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
label: "Contract",
|
|
21
|
+
value: "contract"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
label: "Remote",
|
|
25
|
+
value: "remote"
|
|
26
|
+
}
|
|
27
|
+
], C = [
|
|
28
|
+
{
|
|
29
|
+
label: "Entry",
|
|
30
|
+
value: "entry"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
label: "Mid",
|
|
34
|
+
value: "mid"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
label: "Senior",
|
|
38
|
+
value: "senior"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
label: "Lead",
|
|
42
|
+
value: "lead"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
label: "Executive",
|
|
46
|
+
value: "executive"
|
|
47
|
+
}
|
|
48
|
+
];
|
|
49
|
+
function w() {
|
|
50
|
+
let w = ee(), { showToast: T } = b(), E = e((e) => e.addJobPosting), [D, O] = n(""), [k, A] = n(""), [j, M] = n(""), [N, te] = n(""), [P, F] = n("full_time"), [I, L] = n("mid"), [R, z] = n(""), [B, V] = n(""), [H, U] = n(""), [W, G] = n([""]), [K, q] = n([""]), [J, Y] = n(!1), X = () => G([...W, ""]), Z = () => q([...K, ""]), Q = (e, t) => {
|
|
51
|
+
let n = [...W];
|
|
52
|
+
n[e] = t, G(n);
|
|
53
|
+
}, ne = (e, t) => {
|
|
54
|
+
let n = [...K];
|
|
55
|
+
n[e] = t, q(n);
|
|
56
|
+
}, re = (e) => G(W.filter((t, n) => n !== e)), ie = (e) => q(K.filter((t, n) => n !== e)), $ = async (e) => {
|
|
57
|
+
if (J) return;
|
|
58
|
+
if (!D.trim()) {
|
|
59
|
+
T("Job Title is required", "warning");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
if (!k.trim()) {
|
|
63
|
+
T("Department is required", "warning");
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
let n = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10), r = {
|
|
67
|
+
id: t(),
|
|
68
|
+
title: D.trim(),
|
|
69
|
+
department: k.trim(),
|
|
70
|
+
location: j.trim(),
|
|
71
|
+
type: P,
|
|
72
|
+
experienceLevel: I,
|
|
73
|
+
salaryMin: R.trim() === "" ? 0 : Number(R),
|
|
74
|
+
salaryMax: B.trim() === "" ? 0 : Number(B),
|
|
75
|
+
status: e,
|
|
76
|
+
applicants: 0,
|
|
77
|
+
postedDate: n,
|
|
78
|
+
deadline: H.trim() === "" ? n : H,
|
|
79
|
+
description: N.trim(),
|
|
80
|
+
requirements: W.map((e) => e.trim()).filter(Boolean),
|
|
81
|
+
benefits: K.map((e) => e.trim()).filter(Boolean)
|
|
82
|
+
};
|
|
83
|
+
Y(!0);
|
|
84
|
+
try {
|
|
85
|
+
await E(r), T(e === "draft" ? "Draft saved" : "Job published", "success"), w("../jobs-page");
|
|
86
|
+
} catch (e) {
|
|
87
|
+
T(e instanceof Error ? e.message : "Unable to save job posting", "error");
|
|
88
|
+
} finally {
|
|
89
|
+
Y(!1);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return /* @__PURE__ */ c("div", {
|
|
15
93
|
className: "space-y-6 p-6 max-w-3xl",
|
|
16
94
|
children: [
|
|
17
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ s("div", {
|
|
18
96
|
className: "flex items-center justify-between",
|
|
19
|
-
children: /* @__PURE__ */
|
|
20
|
-
/* @__PURE__ */
|
|
97
|
+
children: /* @__PURE__ */ c("div", { children: [
|
|
98
|
+
/* @__PURE__ */ s("h1", {
|
|
21
99
|
className: "text-2xl font-semibold",
|
|
22
|
-
children: /* @__PURE__ */
|
|
100
|
+
children: /* @__PURE__ */ s(g, { children: "Create Job Posting" })
|
|
23
101
|
}),
|
|
24
|
-
/* @__PURE__ */
|
|
102
|
+
/* @__PURE__ */ s("p", {
|
|
25
103
|
className: "text-sm text-text-secondary",
|
|
26
104
|
children: "Fill in the details for a new position"
|
|
27
105
|
}),
|
|
28
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ s(v, {
|
|
29
107
|
className: "mt-1",
|
|
30
108
|
children: "Create a new job posting — define the role, requirements, and compensation here to start attracting and collecting applicants."
|
|
31
109
|
})
|
|
32
110
|
] })
|
|
33
111
|
}),
|
|
34
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ c(h, { children: [/* @__PURE__ */ c("div", {
|
|
35
113
|
className: "mb-4 flex items-center gap-2 text-lg font-semibold",
|
|
36
|
-
children: [/* @__PURE__ */
|
|
37
|
-
}), /* @__PURE__ */
|
|
114
|
+
children: [/* @__PURE__ */ s(r, { className: "h-5 w-5" }), "Job Details"]
|
|
115
|
+
}), /* @__PURE__ */ c("div", {
|
|
38
116
|
className: "space-y-4",
|
|
39
117
|
children: [
|
|
40
|
-
/* @__PURE__ */
|
|
118
|
+
/* @__PURE__ */ c("div", {
|
|
41
119
|
className: "space-y-2",
|
|
42
|
-
children: [/* @__PURE__ */
|
|
120
|
+
children: [/* @__PURE__ */ s("label", {
|
|
43
121
|
className: "text-sm font-medium",
|
|
122
|
+
htmlFor: "job-title",
|
|
44
123
|
children: "Job Title"
|
|
45
|
-
}), /* @__PURE__ */
|
|
124
|
+
}), /* @__PURE__ */ s(_, {
|
|
125
|
+
id: "job-title",
|
|
46
126
|
placeholder: "e.g. Senior Frontend Developer",
|
|
47
|
-
value:
|
|
48
|
-
onChange: (e) =>
|
|
127
|
+
value: D,
|
|
128
|
+
onChange: (e) => O(e.target.value)
|
|
49
129
|
})]
|
|
50
130
|
}),
|
|
51
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ c("div", {
|
|
52
132
|
className: "grid grid-cols-2 gap-4",
|
|
53
|
-
children: [/* @__PURE__ */
|
|
133
|
+
children: [/* @__PURE__ */ c("div", {
|
|
54
134
|
className: "space-y-2",
|
|
55
|
-
children: [/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ s("label", {
|
|
56
136
|
className: "text-sm font-medium",
|
|
137
|
+
htmlFor: "job-department",
|
|
57
138
|
children: "Department"
|
|
58
|
-
}), /* @__PURE__ */
|
|
139
|
+
}), /* @__PURE__ */ s(_, {
|
|
140
|
+
id: "job-department",
|
|
59
141
|
placeholder: "e.g. Engineering",
|
|
60
|
-
value:
|
|
61
|
-
onChange: (e) =>
|
|
142
|
+
value: k,
|
|
143
|
+
onChange: (e) => A(e.target.value)
|
|
62
144
|
})]
|
|
63
|
-
}), /* @__PURE__ */
|
|
145
|
+
}), /* @__PURE__ */ c("div", {
|
|
64
146
|
className: "space-y-2",
|
|
65
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ s("label", {
|
|
66
148
|
className: "text-sm font-medium",
|
|
149
|
+
htmlFor: "job-location",
|
|
67
150
|
children: "Location"
|
|
68
|
-
}), /* @__PURE__ */
|
|
151
|
+
}), /* @__PURE__ */ s(_, {
|
|
152
|
+
id: "job-location",
|
|
69
153
|
placeholder: "e.g. San Francisco, CA",
|
|
70
|
-
value:
|
|
71
|
-
onChange: (e) =>
|
|
154
|
+
value: j,
|
|
155
|
+
onChange: (e) => M(e.target.value)
|
|
72
156
|
})]
|
|
73
157
|
})]
|
|
74
158
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
159
|
+
/* @__PURE__ */ c("div", {
|
|
76
160
|
className: "grid grid-cols-2 gap-4",
|
|
77
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ c("div", {
|
|
78
162
|
className: "space-y-2",
|
|
79
|
-
children: [/* @__PURE__ */
|
|
163
|
+
children: [/* @__PURE__ */ s("label", {
|
|
80
164
|
className: "text-sm font-medium",
|
|
165
|
+
htmlFor: "job-type",
|
|
166
|
+
children: "Employment Type"
|
|
167
|
+
}), /* @__PURE__ */ s("select", {
|
|
168
|
+
id: "job-type",
|
|
169
|
+
className: x,
|
|
170
|
+
value: P,
|
|
171
|
+
onChange: (e) => F(e.target.value),
|
|
172
|
+
children: S.map((e) => /* @__PURE__ */ s("option", {
|
|
173
|
+
value: e.value,
|
|
174
|
+
children: e.label
|
|
175
|
+
}, e.value))
|
|
176
|
+
})]
|
|
177
|
+
}), /* @__PURE__ */ c("div", {
|
|
178
|
+
className: "space-y-2",
|
|
179
|
+
children: [/* @__PURE__ */ s("label", {
|
|
180
|
+
className: "text-sm font-medium",
|
|
181
|
+
htmlFor: "job-experience",
|
|
182
|
+
children: "Experience Level"
|
|
183
|
+
}), /* @__PURE__ */ s("select", {
|
|
184
|
+
id: "job-experience",
|
|
185
|
+
className: x,
|
|
186
|
+
value: I,
|
|
187
|
+
onChange: (e) => L(e.target.value),
|
|
188
|
+
children: C.map((e) => /* @__PURE__ */ s("option", {
|
|
189
|
+
value: e.value,
|
|
190
|
+
children: e.label
|
|
191
|
+
}, e.value))
|
|
192
|
+
})]
|
|
193
|
+
})]
|
|
194
|
+
}),
|
|
195
|
+
/* @__PURE__ */ c("div", {
|
|
196
|
+
className: "grid grid-cols-2 gap-4",
|
|
197
|
+
children: [/* @__PURE__ */ c("div", {
|
|
198
|
+
className: "space-y-2",
|
|
199
|
+
children: [/* @__PURE__ */ s("label", {
|
|
200
|
+
className: "text-sm font-medium",
|
|
201
|
+
htmlFor: "job-salary-min",
|
|
81
202
|
children: "Salary Min ($)"
|
|
82
|
-
}), /* @__PURE__ */
|
|
203
|
+
}), /* @__PURE__ */ s(_, {
|
|
204
|
+
id: "job-salary-min",
|
|
83
205
|
type: "number",
|
|
84
206
|
placeholder: "e.g. 120000",
|
|
85
|
-
value:
|
|
86
|
-
onChange: (e) =>
|
|
207
|
+
value: R,
|
|
208
|
+
onChange: (e) => z(e.target.value)
|
|
87
209
|
})]
|
|
88
|
-
}), /* @__PURE__ */
|
|
210
|
+
}), /* @__PURE__ */ c("div", {
|
|
89
211
|
className: "space-y-2",
|
|
90
|
-
children: [/* @__PURE__ */
|
|
212
|
+
children: [/* @__PURE__ */ s("label", {
|
|
91
213
|
className: "text-sm font-medium",
|
|
214
|
+
htmlFor: "job-salary-max",
|
|
92
215
|
children: "Salary Max ($)"
|
|
93
|
-
}), /* @__PURE__ */
|
|
216
|
+
}), /* @__PURE__ */ s(_, {
|
|
217
|
+
id: "job-salary-max",
|
|
94
218
|
type: "number",
|
|
95
219
|
placeholder: "e.g. 180000",
|
|
96
|
-
value:
|
|
97
|
-
onChange: (e) =>
|
|
220
|
+
value: B,
|
|
221
|
+
onChange: (e) => V(e.target.value)
|
|
98
222
|
})]
|
|
99
223
|
})]
|
|
100
224
|
}),
|
|
101
|
-
/* @__PURE__ */
|
|
225
|
+
/* @__PURE__ */ c("div", {
|
|
102
226
|
className: "space-y-2",
|
|
103
|
-
children: [/* @__PURE__ */
|
|
227
|
+
children: [/* @__PURE__ */ s("label", {
|
|
104
228
|
className: "text-sm font-medium",
|
|
229
|
+
htmlFor: "job-deadline",
|
|
230
|
+
children: "Application Deadline"
|
|
231
|
+
}), /* @__PURE__ */ s(_, {
|
|
232
|
+
id: "job-deadline",
|
|
233
|
+
type: "date",
|
|
234
|
+
value: H,
|
|
235
|
+
onChange: (e) => U(e.target.value)
|
|
236
|
+
})]
|
|
237
|
+
}),
|
|
238
|
+
/* @__PURE__ */ c("div", {
|
|
239
|
+
className: "space-y-2",
|
|
240
|
+
children: [/* @__PURE__ */ s("label", {
|
|
241
|
+
className: "text-sm font-medium",
|
|
242
|
+
htmlFor: "job-description",
|
|
105
243
|
children: "Description"
|
|
106
|
-
}), /* @__PURE__ */
|
|
244
|
+
}), /* @__PURE__ */ s(y, {
|
|
245
|
+
id: "job-description",
|
|
107
246
|
placeholder: "Describe the role, responsibilities, and ideal candidate...",
|
|
108
247
|
rows: 4,
|
|
109
|
-
value:
|
|
110
|
-
onChange: (e) =>
|
|
248
|
+
value: N,
|
|
249
|
+
onChange: (e) => te(e.target.value)
|
|
111
250
|
})]
|
|
112
251
|
})
|
|
113
252
|
]
|
|
114
253
|
})] }),
|
|
115
|
-
/* @__PURE__ */
|
|
254
|
+
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Requirements" }), /* @__PURE__ */ s(f, { children: "List the key requirements for this role" })] }), /* @__PURE__ */ c(d, {
|
|
116
255
|
className: "space-y-3",
|
|
117
|
-
children: [
|
|
256
|
+
children: [W.map((e, t) => /* @__PURE__ */ c("div", {
|
|
118
257
|
className: "flex gap-2",
|
|
119
|
-
children: [/* @__PURE__ */
|
|
258
|
+
children: [/* @__PURE__ */ s(_, {
|
|
120
259
|
placeholder: `Requirement ${t + 1}`,
|
|
121
260
|
value: e,
|
|
122
|
-
onChange: (e) =>
|
|
123
|
-
}), /* @__PURE__ */
|
|
261
|
+
onChange: (e) => Q(t, e.target.value)
|
|
262
|
+
}), /* @__PURE__ */ s(l, {
|
|
124
263
|
variant: "outline",
|
|
125
264
|
size: "sm",
|
|
126
|
-
|
|
127
|
-
|
|
265
|
+
"aria-label": `Remove requirement ${t + 1}`,
|
|
266
|
+
onClick: () => re(t),
|
|
267
|
+
children: /* @__PURE__ */ s(o, { className: "h-4 w-4" })
|
|
128
268
|
})]
|
|
129
|
-
}, t)), /* @__PURE__ */
|
|
269
|
+
}, t)), /* @__PURE__ */ c(l, {
|
|
130
270
|
variant: "outline",
|
|
131
271
|
size: "sm",
|
|
132
|
-
onClick:
|
|
133
|
-
children: [/* @__PURE__ */
|
|
272
|
+
onClick: X,
|
|
273
|
+
children: [/* @__PURE__ */ s(i, { className: "h-4 w-4 mr-1" }), "Add Requirement"]
|
|
134
274
|
})]
|
|
135
275
|
})] }),
|
|
136
|
-
/* @__PURE__ */
|
|
276
|
+
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Benefits" }), /* @__PURE__ */ s(f, { children: "What does this position offer?" })] }), /* @__PURE__ */ c(d, {
|
|
137
277
|
className: "space-y-3",
|
|
138
|
-
children: [
|
|
278
|
+
children: [K.map((e, t) => /* @__PURE__ */ c("div", {
|
|
139
279
|
className: "flex gap-2",
|
|
140
|
-
children: [/* @__PURE__ */
|
|
280
|
+
children: [/* @__PURE__ */ s(_, {
|
|
141
281
|
placeholder: `Benefit ${t + 1}`,
|
|
142
282
|
value: e,
|
|
143
|
-
onChange: (e) =>
|
|
144
|
-
}), /* @__PURE__ */
|
|
283
|
+
onChange: (e) => ne(t, e.target.value)
|
|
284
|
+
}), /* @__PURE__ */ s(l, {
|
|
145
285
|
variant: "outline",
|
|
146
286
|
size: "sm",
|
|
147
|
-
|
|
148
|
-
|
|
287
|
+
"aria-label": `Remove benefit ${t + 1}`,
|
|
288
|
+
onClick: () => ie(t),
|
|
289
|
+
children: /* @__PURE__ */ s(o, { className: "h-4 w-4" })
|
|
149
290
|
})]
|
|
150
|
-
}, t)), /* @__PURE__ */
|
|
291
|
+
}, t)), /* @__PURE__ */ c(l, {
|
|
151
292
|
variant: "outline",
|
|
152
293
|
size: "sm",
|
|
153
|
-
onClick:
|
|
154
|
-
children: [/* @__PURE__ */
|
|
294
|
+
onClick: Z,
|
|
295
|
+
children: [/* @__PURE__ */ s(i, { className: "h-4 w-4 mr-1" }), "Add Benefit"]
|
|
155
296
|
})]
|
|
156
297
|
})] }),
|
|
157
|
-
/* @__PURE__ */
|
|
298
|
+
/* @__PURE__ */ c("div", {
|
|
158
299
|
className: "flex justify-end gap-2",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
300
|
+
children: [/* @__PURE__ */ s(l, {
|
|
160
301
|
variant: "outline",
|
|
302
|
+
disabled: J,
|
|
303
|
+
onClick: () => $("draft"),
|
|
161
304
|
children: "Save as Draft"
|
|
162
|
-
}), /* @__PURE__ */
|
|
305
|
+
}), /* @__PURE__ */ c(l, {
|
|
306
|
+
disabled: J,
|
|
307
|
+
onClick: () => $("active"),
|
|
308
|
+
children: [/* @__PURE__ */ s(a, { className: "h-4 w-4 mr-1" }), J ? "Saving…" : "Publish Job"]
|
|
309
|
+
})]
|
|
163
310
|
})
|
|
164
311
|
]
|
|
165
312
|
});
|
|
166
313
|
}
|
|
167
314
|
//#endregion
|
|
168
|
-
export {
|
|
315
|
+
export { w as HiringCreateJobPagePage };
|
|
169
316
|
|
|
170
317
|
//# sourceMappingURL=HiringCreateJobPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HiringCreateJobPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCreateJobPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { Briefcase, Plus, Save, X } from 'lucide-react';\n\nexport function HiringCreateJobPagePage() {\n const [title, setTitle] = useState('');\n const [department, setDepartment] = useState('');\n const [location, setLocation] = useState('');\n const [description, setDescription] = useState('');\n const [salaryMin, setSalaryMin] = useState('');\n const [salaryMax, setSalaryMax] = useState('');\n const [requirements, setRequirements] = useState<string[]>(['']);\n const [benefits, setBenefits] = useState<string[]>(['']);\n\n const addRequirement = () => setRequirements([...requirements, '']);\n const addBenefit = () => setBenefits([...benefits, '']);\n const updateRequirement = (idx: number, value: string) => {\n const updated = [...requirements];\n updated[idx] = value;\n setRequirements(updated);\n };\n const updateBenefit = (idx: number, value: string) => {\n const updated = [...benefits];\n updated[idx] = value;\n setBenefits(updated);\n };\n const removeRequirement = (idx: number) =>\n setRequirements(requirements.filter((_, i) => i !== idx));\n const removeBenefit = (idx: number) => setBenefits(benefits.filter((_, i) => i !== idx));\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Create Job Posting</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Fill in the details for a new position</p>\n <PagePurpose className=\"mt-1\">Create a new job posting — define the role, requirements, and compensation here to start attracting and collecting applicants.</PagePurpose>\n </div>\n </div>\n\n <EmphasisPanel>\n <div className=\"mb-4 flex items-center gap-2 text-lg font-semibold\">\n <Briefcase className=\"h-5 w-5\" />\n Job Details\n </div>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Job Title</label>\n <Input\n placeholder=\"e.g. Senior Frontend Developer\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Department</label>\n <Input\n placeholder=\"e.g. Engineering\"\n value={department}\n onChange={(e) => setDepartment(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Location</label>\n <Input\n placeholder=\"e.g. San Francisco, CA\"\n value={location}\n onChange={(e) => setLocation(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Salary Min ($)</label>\n <Input\n type=\"number\"\n placeholder=\"e.g. 120000\"\n value={salaryMin}\n onChange={(e) => setSalaryMin(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Salary Max ($)</label>\n <Input\n type=\"number\"\n placeholder=\"e.g. 180000\"\n value={salaryMax}\n onChange={(e) => setSalaryMax(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Description</label>\n <Textarea\n placeholder=\"Describe the role, responsibilities, and ideal candidate...\"\n rows={4}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Requirements</CardTitle>\n <CardDescription>List the key requirements for this role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {requirements.map((req, idx) => (\n <div key={idx} className=\"flex gap-2\">\n <Input\n placeholder={`Requirement ${idx + 1}`}\n value={req}\n onChange={(e) => updateRequirement(idx, e.target.value)}\n />\n <Button variant=\"outline\" size=\"sm\" onClick={() => removeRequirement(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addRequirement}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Requirement\n </Button>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Benefits</CardTitle>\n <CardDescription>What does this position offer?</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {benefits.map((ben, idx) => (\n <div key={idx} className=\"flex gap-2\">\n <Input\n placeholder={`Benefit ${idx + 1}`}\n value={ben}\n onChange={(e) => updateBenefit(idx, e.target.value)}\n />\n <Button variant=\"outline\" size=\"sm\" onClick={() => removeBenefit(idx)}>\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addBenefit}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Benefit\n </Button>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\">Save as Draft</Button>\n <Button>\n <Save className=\"h-4 w-4 mr-1\" />\n Publish Job\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HiringCreateJobPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringCreateJobPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n Input,\n PagePurpose,\n Textarea,\n} from '@burdenoff/fe-libs/ui';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Briefcase, Plus, Save, X } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type JobPosting } from '../store/crewfoundryStore';\nimport { newClientId } from '../components/forms/formValues';\n\n// Native <select> styled with the same semantic tokens as fe-libs Input.\nconst SELECT_CLASS =\n 'flex h-10 w-full rounded-input border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary transition-colors duration-200 focus-visible:border-border-focus focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50';\n\nconst JOB_TYPE_OPTIONS: { label: string; value: JobPosting['type'] }[] = [\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\nconst EXPERIENCE_OPTIONS: { label: string; value: JobPosting['experienceLevel'] }[] = [\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\nexport function HiringCreateJobPagePage() {\n const navigate = useNavigate();\n const { showToast } = useGlobalUi();\n const addJobPosting = useCrewFoundryStore((state) => state.addJobPosting);\n\n const [title, setTitle] = useState('');\n const [department, setDepartment] = useState('');\n const [location, setLocation] = useState('');\n const [description, setDescription] = useState('');\n const [type, setType] = useState<JobPosting['type']>('full_time');\n const [experienceLevel, setExperienceLevel] = useState<JobPosting['experienceLevel']>('mid');\n const [salaryMin, setSalaryMin] = useState('');\n const [salaryMax, setSalaryMax] = useState('');\n const [deadline, setDeadline] = useState('');\n const [requirements, setRequirements] = useState<string[]>(['']);\n const [benefits, setBenefits] = useState<string[]>(['']);\n const [submitting, setSubmitting] = useState(false);\n\n const addRequirement = () => setRequirements([...requirements, '']);\n const addBenefit = () => setBenefits([...benefits, '']);\n const updateRequirement = (idx: number, value: string) => {\n const updated = [...requirements];\n updated[idx] = value;\n setRequirements(updated);\n };\n const updateBenefit = (idx: number, value: string) => {\n const updated = [...benefits];\n updated[idx] = value;\n setBenefits(updated);\n };\n const removeRequirement = (idx: number) =>\n setRequirements(requirements.filter((_, i) => i !== idx));\n const removeBenefit = (idx: number) => setBenefits(benefits.filter((_, i) => i !== idx));\n\n const submit = async (status: JobPosting['status']) => {\n if (submitting) {\n return;\n }\n if (!title.trim()) {\n showToast('Job Title is required', 'warning');\n return;\n }\n if (!department.trim()) {\n showToast('Department is required', 'warning');\n return;\n }\n const today = new Date().toISOString().slice(0, 10);\n const job: JobPosting = {\n id: newClientId(),\n title: title.trim(),\n department: department.trim(),\n location: location.trim(),\n type,\n experienceLevel,\n salaryMin: salaryMin.trim() === '' ? 0 : Number(salaryMin),\n salaryMax: salaryMax.trim() === '' ? 0 : Number(salaryMax),\n status,\n applicants: 0,\n postedDate: today,\n deadline: deadline.trim() === '' ? today : deadline,\n description: description.trim(),\n requirements: requirements.map((item) => item.trim()).filter(Boolean),\n benefits: benefits.map((item) => item.trim()).filter(Boolean),\n };\n\n setSubmitting(true);\n try {\n await addJobPosting(job);\n showToast(status === 'draft' ? 'Draft saved' : 'Job published', 'success');\n navigate('../jobs-page');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to save job posting', 'error');\n } finally {\n setSubmitting(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-3xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Create Job Posting</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Fill in the details for a new position</p>\n <PagePurpose className=\"mt-1\">Create a new job posting — define the role, requirements, and compensation here to start attracting and collecting applicants.</PagePurpose>\n </div>\n </div>\n\n <EmphasisPanel>\n <div className=\"mb-4 flex items-center gap-2 text-lg font-semibold\">\n <Briefcase className=\"h-5 w-5\" />\n Job Details\n </div>\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-title\">\n Job Title\n </label>\n <Input\n id=\"job-title\"\n placeholder=\"e.g. Senior Frontend Developer\"\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n />\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-department\">\n Department\n </label>\n <Input\n id=\"job-department\"\n placeholder=\"e.g. Engineering\"\n value={department}\n onChange={(e) => setDepartment(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-location\">\n Location\n </label>\n <Input\n id=\"job-location\"\n placeholder=\"e.g. San Francisco, CA\"\n value={location}\n onChange={(e) => setLocation(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-type\">\n Employment Type\n </label>\n <select\n id=\"job-type\"\n className={SELECT_CLASS}\n value={type}\n onChange={(e) => setType(e.target.value as JobPosting['type'])}\n >\n {JOB_TYPE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-experience\">\n Experience Level\n </label>\n <select\n id=\"job-experience\"\n className={SELECT_CLASS}\n value={experienceLevel}\n onChange={(e) =>\n setExperienceLevel(e.target.value as JobPosting['experienceLevel'])\n }\n >\n {EXPERIENCE_OPTIONS.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-salary-min\">\n Salary Min ($)\n </label>\n <Input\n id=\"job-salary-min\"\n type=\"number\"\n placeholder=\"e.g. 120000\"\n value={salaryMin}\n onChange={(e) => setSalaryMin(e.target.value)}\n />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-salary-max\">\n Salary Max ($)\n </label>\n <Input\n id=\"job-salary-max\"\n type=\"number\"\n placeholder=\"e.g. 180000\"\n value={salaryMax}\n onChange={(e) => setSalaryMax(e.target.value)}\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-deadline\">\n Application Deadline\n </label>\n <Input\n id=\"job-deadline\"\n type=\"date\"\n value={deadline}\n onChange={(e) => setDeadline(e.target.value)}\n />\n </div>\n\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\" htmlFor=\"job-description\">\n Description\n </label>\n <Textarea\n id=\"job-description\"\n placeholder=\"Describe the role, responsibilities, and ideal candidate...\"\n rows={4}\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n />\n </div>\n </div>\n </EmphasisPanel>\n\n <Card>\n <CardHeader>\n <CardTitle>Requirements</CardTitle>\n <CardDescription>List the key requirements for this role</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {requirements.map((req, idx) => (\n <div key={idx} className=\"flex gap-2\">\n <Input\n placeholder={`Requirement ${idx + 1}`}\n value={req}\n onChange={(e) => updateRequirement(idx, e.target.value)}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Remove requirement ${idx + 1}`}\n onClick={() => removeRequirement(idx)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addRequirement}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Requirement\n </Button>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Benefits</CardTitle>\n <CardDescription>What does this position offer?</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {benefits.map((ben, idx) => (\n <div key={idx} className=\"flex gap-2\">\n <Input\n placeholder={`Benefit ${idx + 1}`}\n value={ben}\n onChange={(e) => updateBenefit(idx, e.target.value)}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n aria-label={`Remove benefit ${idx + 1}`}\n onClick={() => removeBenefit(idx)}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n ))}\n <Button variant=\"outline\" size=\"sm\" onClick={addBenefit}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Add Benefit\n </Button>\n </CardContent>\n </Card>\n\n <div className=\"flex justify-end gap-2\">\n <Button variant=\"outline\" disabled={submitting} onClick={() => submit('draft')}>\n Save as Draft\n </Button>\n <Button disabled={submitting} onClick={() => submit('active')}>\n <Save className=\"h-4 w-4 mr-1\" />\n {submitting ? 'Saving…' : 'Publish Job'}\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|