@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.
Files changed (82) hide show
  1. package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
  2. package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
  3. package/dist/crewfoundry/components/forms/FormModal.js +220 -0
  4. package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
  5. package/dist/crewfoundry/components/forms/formValues.js +20 -0
  6. package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
  7. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
  8. package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
  9. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
  10. package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
  11. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
  12. package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
  13. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
  14. package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
  15. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
  16. package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
  17. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
  18. package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
  19. package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
  20. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
  21. package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
  22. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
  23. package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
  24. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
  25. package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
  26. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
  27. package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
  28. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
  29. package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
  30. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
  31. package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
  32. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
  33. package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
  34. package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
  35. package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
  36. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
  37. package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
  38. package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
  39. package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
  40. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
  41. package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
  42. package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
  43. package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
  44. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
  45. package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
  46. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
  47. package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
  48. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
  49. package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
  50. package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
  51. package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
  52. package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
  53. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
  54. package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
  55. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
  56. package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
  57. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
  58. package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
  59. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
  60. package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
  61. package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
  62. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
  63. package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
  64. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
  65. package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
  66. package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
  67. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
  68. package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
  69. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
  70. package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
  71. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
  72. package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
  73. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
  74. package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
  75. package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
  76. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
  77. package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
  78. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
  79. package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
  80. package/dist/crewfoundry/store/crewfoundryStore.js +339 -52
  81. package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
  82. package/package.json +1 -1
@@ -1,142 +1,249 @@
1
1
  import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
2
- import { Calendar as t, Clock as n, Plus as r, Star as i, Video as a } from "lucide-react";
3
- import { jsx as o, jsxs as s } from "react/jsx-runtime";
4
- import { Badge as c, Button as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g, PagePurpose as _ } from "@burdenoff/fe-libs/ui";
2
+ import { FormModal as t } from "../components/forms/FormModal.js";
3
+ import { getText as n, newClientId as r } from "../components/forms/formValues.js";
4
+ import { useMemo as i, useState as a } from "react";
5
+ import { Calendar as o, Clock as s, Plus as c, Star as l, Video 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 { useGlobalUi as C } from "@burdenoff/fe-libs/shared/providers/shell";
5
9
  //#region src/crewfoundry/pages/HiringInterviewsPagePage.tsx
6
- function v() {
7
- let { interviews: v } = e(), y = v.filter((e) => e.status === "scheduled"), b = v.filter((e) => e.status === "completed");
8
- return /* @__PURE__ */ s("div", {
10
+ var w = [
11
+ {
12
+ label: "Phone",
13
+ value: "phone"
14
+ },
15
+ {
16
+ label: "Video",
17
+ value: "video"
18
+ },
19
+ {
20
+ label: "Onsite",
21
+ value: "onsite"
22
+ },
23
+ {
24
+ label: "Panel",
25
+ value: "panel"
26
+ },
27
+ {
28
+ label: "Technical",
29
+ value: "technical"
30
+ }
31
+ ], T = [
32
+ {
33
+ name: "status",
34
+ label: "Status",
35
+ type: "select",
36
+ options: [
37
+ {
38
+ label: "Scheduled",
39
+ value: "scheduled"
40
+ },
41
+ {
42
+ label: "Completed",
43
+ value: "completed"
44
+ },
45
+ {
46
+ label: "Cancelled",
47
+ value: "cancelled"
48
+ },
49
+ {
50
+ label: "No show",
51
+ value: "no_show"
52
+ }
53
+ ],
54
+ required: !0
55
+ },
56
+ {
57
+ name: "rating",
58
+ label: "Rating (out of 5)",
59
+ type: "number"
60
+ },
61
+ {
62
+ name: "feedback",
63
+ label: "Feedback",
64
+ type: "textarea",
65
+ colSpan: 2
66
+ }
67
+ ];
68
+ function E() {
69
+ let { showToast: E } = C(), { interviews: D, candidates: O, addInterview: k, updateInterview: A } = e(), [j, M] = a(!1), [N, P] = a(null), F = D.filter((e) => e.status === "scheduled"), I = D.filter((e) => e.status === "completed"), L = i(() => [
70
+ {
71
+ name: "candidateId",
72
+ label: "Candidate",
73
+ type: "select",
74
+ required: !0,
75
+ placeholder: O.length ? "Select a candidate…" : "No candidates available",
76
+ options: O.map((e) => ({
77
+ label: `${e.firstName} ${e.lastName} — ${e.position}`,
78
+ value: e.id
79
+ }))
80
+ },
81
+ {
82
+ name: "interviewerName",
83
+ label: "Interviewer",
84
+ type: "text",
85
+ required: !0
86
+ },
87
+ {
88
+ name: "date",
89
+ label: "Date",
90
+ type: "date",
91
+ required: !0
92
+ },
93
+ {
94
+ name: "time",
95
+ label: "Time",
96
+ type: "text",
97
+ required: !0,
98
+ placeholder: "e.g. 10:30 AM"
99
+ },
100
+ {
101
+ name: "type",
102
+ label: "Type",
103
+ type: "select",
104
+ required: !0,
105
+ options: w
106
+ }
107
+ ], [O]);
108
+ return /* @__PURE__ */ f("div", {
9
109
  className: "space-y-6 p-6",
10
110
  children: [
11
- /* @__PURE__ */ s("div", {
111
+ /* @__PURE__ */ f("div", {
12
112
  className: "flex items-center justify-between",
13
- children: [/* @__PURE__ */ s("div", { children: [
14
- /* @__PURE__ */ o("h1", {
113
+ children: [/* @__PURE__ */ f("div", { children: [
114
+ /* @__PURE__ */ d("h1", {
15
115
  className: "text-2xl font-semibold",
16
- children: /* @__PURE__ */ o(g, { children: "Interviews" })
116
+ children: /* @__PURE__ */ d(x, { children: "Interviews" })
17
117
  }),
18
- /* @__PURE__ */ s("p", {
118
+ /* @__PURE__ */ f("p", {
19
119
  className: "text-sm text-text-secondary",
20
120
  children: [
21
- y.length,
121
+ F.length,
22
122
  " upcoming · ",
23
- b.length,
123
+ I.length,
24
124
  " completed"
25
125
  ]
26
126
  }),
27
- /* @__PURE__ */ o(_, {
127
+ /* @__PURE__ */ d(S, {
28
128
  className: "mt-1",
29
129
  children: "Schedule and track interviews across your hiring pipeline — keep everyone aligned on who's meeting which candidate and when."
30
130
  })
31
- ] }), /* @__PURE__ */ s(l, {
131
+ ] }), /* @__PURE__ */ f(m, {
32
132
  size: "sm",
33
- children: [/* @__PURE__ */ o(r, { className: "h-4 w-4 mr-1" }), "Schedule Interview"]
133
+ onClick: () => M(!0),
134
+ children: [/* @__PURE__ */ d(c, { className: "h-4 w-4 mr-1" }), "Schedule Interview"]
34
135
  })]
35
136
  }),
36
- /* @__PURE__ */ s("div", {
137
+ /* @__PURE__ */ f("div", {
37
138
  className: "grid gap-4 md:grid-cols-3",
38
139
  children: [
39
- /* @__PURE__ */ s(h, {
140
+ /* @__PURE__ */ f(b, {
40
141
  treatment: "glass",
41
142
  glow: !0,
42
143
  className: "border-border-seam",
43
- children: [/* @__PURE__ */ s(p, {
144
+ children: [/* @__PURE__ */ f(v, {
44
145
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
45
- children: [/* @__PURE__ */ o(m, {
146
+ children: [/* @__PURE__ */ d(y, {
46
147
  className: "text-sm font-medium",
47
148
  children: "Scheduled"
48
- }), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-status-info-text" })]
49
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
149
+ }), /* @__PURE__ */ d(o, { className: "h-4 w-4 text-status-info-text" })]
150
+ }), /* @__PURE__ */ d(g, { children: /* @__PURE__ */ d("div", {
50
151
  className: "text-2xl font-bold tabular-nums",
51
- children: y.length
152
+ children: F.length
52
153
  }) })]
53
154
  }),
54
- /* @__PURE__ */ s(h, {
155
+ /* @__PURE__ */ f(b, {
55
156
  treatment: "metric",
56
157
  className: "border-border-seam",
57
- children: [/* @__PURE__ */ s(p, {
158
+ children: [/* @__PURE__ */ f(v, {
58
159
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
59
- children: [/* @__PURE__ */ o(m, {
160
+ children: [/* @__PURE__ */ d(y, {
60
161
  className: "text-sm font-medium",
61
162
  children: "Completed"
62
- }), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-success-text" })]
63
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
163
+ }), /* @__PURE__ */ d(s, { className: "h-4 w-4 text-status-success-text" })]
164
+ }), /* @__PURE__ */ d(g, { children: /* @__PURE__ */ d("div", {
64
165
  className: "text-2xl font-bold tabular-nums",
65
- children: b.length
166
+ children: I.length
66
167
  }) })]
67
168
  }),
68
- /* @__PURE__ */ s(h, {
169
+ /* @__PURE__ */ f(b, {
69
170
  treatment: "metric",
70
171
  className: "border-border-seam",
71
- children: [/* @__PURE__ */ s(p, {
172
+ children: [/* @__PURE__ */ f(v, {
72
173
  className: "flex flex-row items-center justify-between space-y-0 pb-2",
73
- children: [/* @__PURE__ */ o(m, {
174
+ children: [/* @__PURE__ */ d(y, {
74
175
  className: "text-sm font-medium",
75
176
  children: "This Week"
76
- }), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-text-secondary" })]
77
- }), /* @__PURE__ */ o(d, { children: /* @__PURE__ */ o("div", {
177
+ }), /* @__PURE__ */ d(u, { className: "h-4 w-4 text-text-secondary" })]
178
+ }), /* @__PURE__ */ d(g, { children: /* @__PURE__ */ d("div", {
78
179
  className: "text-2xl font-bold tabular-nums",
79
- children: y.length
180
+ children: F.length
80
181
  }) })]
81
182
  })
82
183
  ]
83
184
  }),
84
- /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Upcoming Interviews" }), /* @__PURE__ */ o(f, { children: "Scheduled interviews for the coming days" })] }), /* @__PURE__ */ o(d, {
185
+ /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Upcoming Interviews" }), /* @__PURE__ */ d(_, { children: "Scheduled interviews for the coming days" })] }), /* @__PURE__ */ d(g, {
85
186
  className: "space-y-3",
86
- children: y.map((e) => /* @__PURE__ */ s("div", {
187
+ children: F.map((e) => /* @__PURE__ */ f("div", {
87
188
  className: "flex items-center justify-between rounded border p-4",
88
- children: [/* @__PURE__ */ s("div", { children: [
89
- /* @__PURE__ */ o("p", {
189
+ children: [/* @__PURE__ */ f("div", { children: [
190
+ /* @__PURE__ */ d("p", {
90
191
  className: "text-sm font-medium",
91
192
  children: e.candidateName
92
193
  }),
93
- /* @__PURE__ */ o("p", {
194
+ /* @__PURE__ */ d("p", {
94
195
  className: "text-xs text-text-secondary",
95
196
  children: e.position
96
197
  }),
97
- /* @__PURE__ */ s("p", {
198
+ /* @__PURE__ */ f("p", {
98
199
  className: "text-xs text-text-secondary mt-1",
99
200
  children: ["Interviewer: ", e.interviewerName]
100
201
  })
101
- ] }), /* @__PURE__ */ s("div", {
202
+ ] }), /* @__PURE__ */ f("div", {
102
203
  className: "flex items-center gap-3",
103
204
  children: [
104
- /* @__PURE__ */ s("div", {
205
+ /* @__PURE__ */ f("div", {
105
206
  className: "text-right",
106
- children: [/* @__PURE__ */ o("p", {
207
+ children: [/* @__PURE__ */ d("p", {
107
208
  className: "text-sm font-medium",
108
209
  children: e.date
109
- }), /* @__PURE__ */ o("p", {
210
+ }), /* @__PURE__ */ d("p", {
110
211
  className: "text-xs text-text-secondary",
111
212
  children: e.time
112
213
  })]
113
214
  }),
114
- /* @__PURE__ */ o(c, {
215
+ /* @__PURE__ */ d(p, {
115
216
  variant: "outline",
116
217
  children: e.type
117
218
  }),
118
- /* @__PURE__ */ o(c, {
219
+ /* @__PURE__ */ d(p, {
119
220
  variant: "secondary",
120
221
  children: e.status
222
+ }),
223
+ /* @__PURE__ */ d(m, {
224
+ variant: "outline",
225
+ size: "sm",
226
+ onClick: () => P(e),
227
+ children: "Record outcome"
121
228
  })
122
229
  ]
123
230
  })]
124
231
  }, e.id))
125
232
  })] }),
126
- b.length > 0 && /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s(p, { children: [/* @__PURE__ */ o(m, { children: "Completed Interviews" }), /* @__PURE__ */ o(f, { children: "Recent interview feedback" })] }), /* @__PURE__ */ o(d, {
233
+ I.length > 0 && /* @__PURE__ */ f(h, { children: [/* @__PURE__ */ f(v, { children: [/* @__PURE__ */ d(y, { children: "Completed Interviews" }), /* @__PURE__ */ d(_, { children: "Recent interview feedback" })] }), /* @__PURE__ */ d(g, {
127
234
  className: "space-y-3",
128
- children: b.map((e) => /* @__PURE__ */ s("div", {
235
+ children: I.map((e) => /* @__PURE__ */ f("div", {
129
236
  className: "flex items-center justify-between rounded border p-4",
130
- children: [/* @__PURE__ */ s("div", { children: [
131
- /* @__PURE__ */ o("p", {
237
+ children: [/* @__PURE__ */ f("div", { children: [
238
+ /* @__PURE__ */ d("p", {
132
239
  className: "text-sm font-medium",
133
240
  children: e.candidateName
134
241
  }),
135
- /* @__PURE__ */ o("p", {
242
+ /* @__PURE__ */ d("p", {
136
243
  className: "text-xs text-text-secondary",
137
244
  children: e.position
138
245
  }),
139
- e.feedback && /* @__PURE__ */ s("p", {
246
+ e.feedback && /* @__PURE__ */ f("p", {
140
247
  className: "text-xs text-text-secondary mt-1 italic",
141
248
  children: [
142
249
  "\"",
@@ -144,25 +251,72 @@ function v() {
144
251
  "\""
145
252
  ]
146
253
  })
147
- ] }), /* @__PURE__ */ s("div", {
254
+ ] }), /* @__PURE__ */ f("div", {
148
255
  className: "flex items-center gap-3",
149
- children: [e.rating && /* @__PURE__ */ s("div", {
256
+ children: [e.rating && /* @__PURE__ */ f("div", {
150
257
  className: "flex items-center gap-1",
151
- children: [/* @__PURE__ */ o(i, { className: "h-4 w-4 text-status-warning-text" }), /* @__PURE__ */ s("span", {
258
+ children: [/* @__PURE__ */ d(l, { className: "h-4 w-4 text-status-warning-text" }), /* @__PURE__ */ f("span", {
152
259
  className: "text-sm font-medium",
153
260
  children: [e.rating, "/5"]
154
261
  })]
155
- }), /* @__PURE__ */ o(c, {
262
+ }), /* @__PURE__ */ d(p, {
156
263
  variant: "default",
157
264
  children: "completed"
158
265
  })]
159
266
  })]
160
267
  }, e.id))
161
- })] })
268
+ })] }),
269
+ /* @__PURE__ */ d(t, {
270
+ open: j,
271
+ onOpenChange: M,
272
+ title: "Schedule Interview",
273
+ description: "Set up a conversation with a candidate in your pipeline.",
274
+ fields: L,
275
+ submitLabel: "Schedule",
276
+ onSubmit: async (e) => {
277
+ let t = O.find((t) => t.id === n(e, "candidateId"));
278
+ if (!t) throw Error("Please select a candidate");
279
+ await k({
280
+ id: r(),
281
+ candidateId: t.id,
282
+ candidateName: `${t.firstName} ${t.lastName}`,
283
+ position: t.position,
284
+ interviewerName: n(e, "interviewerName"),
285
+ date: n(e, "date"),
286
+ time: n(e, "time"),
287
+ type: e.type,
288
+ status: "scheduled"
289
+ }), E("Interview scheduled", "success");
290
+ }
291
+ }),
292
+ /* @__PURE__ */ d(t, {
293
+ open: N !== null,
294
+ onOpenChange: (e) => {
295
+ e || P(null);
296
+ },
297
+ title: "Record Interview Outcome",
298
+ description: N ? `${N.candidateName} — ${N.position}` : void 0,
299
+ fields: T,
300
+ initialValues: N ? {
301
+ status: N.status,
302
+ rating: N.rating ?? "",
303
+ feedback: N.feedback ?? ""
304
+ } : void 0,
305
+ submitLabel: "Save outcome",
306
+ onSubmit: async (e) => {
307
+ if (!N) return;
308
+ let t = e.rating, r = typeof t == "number" || typeof t == "string" && t.trim() !== "";
309
+ await A(N.id, {
310
+ status: e.status,
311
+ feedback: n(e, "feedback"),
312
+ ...r ? { rating: Number(t) } : {}
313
+ }), E("Interview updated", "success");
314
+ }
315
+ })
162
316
  ]
163
317
  });
164
318
  }
165
319
  //#endregion
166
- export { v as HiringInterviewsPagePage };
320
+ export { E as HiringInterviewsPagePage };
167
321
 
168
322
  //# sourceMappingURL=HiringInterviewsPagePage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HiringInterviewsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringInterviewsPagePage.tsx"],"sourcesContent":["import {\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, Clock, Plus, Star, Video } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function HiringInterviewsPagePage() {\n const { interviews } = useCrewFoundryStore();\n\n const scheduled = interviews.filter((i) => i.status === 'scheduled');\n const completed = interviews.filter((i) => i.status === 'completed');\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>Interviews</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {scheduled.length} upcoming · {completed.length} completed\n </p>\n <PagePurpose className=\"mt-1\">Schedule and track interviews across your hiring pipeline — keep everyone aligned on who&apos;s meeting which candidate and when.</PagePurpose>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n Schedule Interview\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\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\">Scheduled</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{scheduled.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <Clock className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{completed.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">This Week</CardTitle>\n <Video className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{scheduled.length}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Upcoming Interviews</CardTitle>\n <CardDescription>Scheduled interviews for the coming days</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {scheduled.map((interview) => (\n <div\n key={interview.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{interview.candidateName}</p>\n <p className=\"text-xs text-text-secondary\">{interview.position}</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n Interviewer: {interview.interviewerName}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{interview.date}</p>\n <p className=\"text-xs text-text-secondary\">{interview.time}</p>\n </div>\n <Badge variant=\"outline\">{interview.type}</Badge>\n <Badge variant=\"secondary\">{interview.status}</Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {completed.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Completed Interviews</CardTitle>\n <CardDescription>Recent interview feedback</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completed.map((interview) => (\n <div\n key={interview.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{interview.candidateName}</p>\n <p className=\"text-xs text-text-secondary\">{interview.position}</p>\n {interview.feedback && (\n <p className=\"text-xs text-text-secondary mt-1 italic\">\n &quot;{interview.feedback}&quot;\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n {interview.rating && (\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-4 w-4 text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{interview.rating}/5</span>\n </div>\n )}\n <Badge variant=\"default\">completed</Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"HiringInterviewsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/HiringInterviewsPagePage.tsx"],"sourcesContent":["import { useMemo, useState } 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 { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Calendar, Clock, Plus, Star, Video } from 'lucide-react';\nimport { useCrewFoundryStore, type Interview } from '../store/crewfoundryStore';\nimport { FormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\nimport { getText, newClientId } from '../components/forms/formValues';\n\nconst INTERVIEW_TYPE_OPTIONS: FieldConfig['options'] = [\n { label: 'Phone', value: 'phone' },\n { label: 'Video', value: 'video' },\n { label: 'Onsite', value: 'onsite' },\n { label: 'Panel', value: 'panel' },\n { label: 'Technical', value: 'technical' },\n];\n\nconst INTERVIEW_STATUS_OPTIONS: FieldConfig['options'] = [\n { label: 'Scheduled', value: 'scheduled' },\n { label: 'Completed', value: 'completed' },\n { label: 'Cancelled', value: 'cancelled' },\n { label: 'No show', value: 'no_show' },\n];\n\nconst UPDATE_FIELDS: FieldConfig[] = [\n { name: 'status', label: 'Status', type: 'select', options: INTERVIEW_STATUS_OPTIONS, required: true },\n { name: 'rating', label: 'Rating (out of 5)', type: 'number' },\n { name: 'feedback', label: 'Feedback', type: 'textarea', colSpan: 2 },\n];\n\nexport function HiringInterviewsPagePage() {\n const { showToast } = useGlobalUi();\n const { interviews, candidates, addInterview, updateInterview } = useCrewFoundryStore();\n const [scheduleOpen, setScheduleOpen] = useState(false);\n const [updateTarget, setUpdateTarget] = useState<Interview | null>(null);\n\n const scheduled = interviews.filter((i) => i.status === 'scheduled');\n const completed = interviews.filter((i) => i.status === 'completed');\n\n const scheduleFields = useMemo<FieldConfig[]>(\n () => [\n {\n name: 'candidateId',\n label: 'Candidate',\n type: 'select',\n required: true,\n placeholder: candidates.length ? 'Select a candidate…' : 'No candidates available',\n options: candidates.map((c) => ({\n label: `${c.firstName} ${c.lastName} — ${c.position}`,\n value: c.id,\n })),\n },\n { name: 'interviewerName', label: 'Interviewer', type: 'text', required: true },\n { name: 'date', label: 'Date', type: 'date', required: true },\n { name: 'time', label: 'Time', type: 'text', required: true, placeholder: 'e.g. 10:30 AM' },\n { name: 'type', label: 'Type', type: 'select', required: true, options: INTERVIEW_TYPE_OPTIONS },\n ],\n [candidates]\n );\n\n const handleSchedule = async (values: FormValues) => {\n const candidate = candidates.find((c) => c.id === getText(values, 'candidateId'));\n if (!candidate) {\n throw new Error('Please select a candidate');\n }\n await addInterview({\n id: newClientId(),\n candidateId: candidate.id,\n candidateName: `${candidate.firstName} ${candidate.lastName}`,\n position: candidate.position,\n interviewerName: getText(values, 'interviewerName'),\n date: getText(values, 'date'),\n time: getText(values, 'time'),\n type: values.type as Interview['type'],\n status: 'scheduled',\n });\n showToast('Interview scheduled', 'success');\n };\n\n const handleUpdate = async (values: FormValues) => {\n if (!updateTarget) {\n return;\n }\n const ratingRaw = values.rating;\n const hasRating =\n typeof ratingRaw === 'number' ||\n (typeof ratingRaw === 'string' && ratingRaw.trim() !== '');\n await updateInterview(updateTarget.id, {\n status: values.status as Interview['status'],\n feedback: getText(values, 'feedback'),\n ...(hasRating ? { rating: Number(ratingRaw) } : {}),\n });\n showToast('Interview updated', 'success');\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>Interviews</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {scheduled.length} upcoming · {completed.length} completed\n </p>\n <PagePurpose className=\"mt-1\">Schedule and track interviews across your hiring pipeline — keep everyone aligned on who&apos;s meeting which candidate and when.</PagePurpose>\n </div>\n <Button size=\"sm\" onClick={() => setScheduleOpen(true)}>\n <Plus className=\"h-4 w-4 mr-1\" />\n Schedule Interview\n </Button>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\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\">Scheduled</CardTitle>\n <Calendar className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{scheduled.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <Clock className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{completed.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">This Week</CardTitle>\n <Video className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{scheduled.length}</div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Upcoming Interviews</CardTitle>\n <CardDescription>Scheduled interviews for the coming days</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {scheduled.map((interview) => (\n <div\n key={interview.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{interview.candidateName}</p>\n <p className=\"text-xs text-text-secondary\">{interview.position}</p>\n <p className=\"text-xs text-text-secondary mt-1\">\n Interviewer: {interview.interviewerName}\n </p>\n </div>\n <div className=\"flex items-center gap-3\">\n <div className=\"text-right\">\n <p className=\"text-sm font-medium\">{interview.date}</p>\n <p className=\"text-xs text-text-secondary\">{interview.time}</p>\n </div>\n <Badge variant=\"outline\">{interview.type}</Badge>\n <Badge variant=\"secondary\">{interview.status}</Badge>\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => setUpdateTarget(interview)}\n >\n Record outcome\n </Button>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n {completed.length > 0 && (\n <Card>\n <CardHeader>\n <CardTitle>Completed Interviews</CardTitle>\n <CardDescription>Recent interview feedback</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completed.map((interview) => (\n <div\n key={interview.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{interview.candidateName}</p>\n <p className=\"text-xs text-text-secondary\">{interview.position}</p>\n {interview.feedback && (\n <p className=\"text-xs text-text-secondary mt-1 italic\">\n &quot;{interview.feedback}&quot;\n </p>\n )}\n </div>\n <div className=\"flex items-center gap-3\">\n {interview.rating && (\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-4 w-4 text-status-warning-text\" />\n <span className=\"text-sm font-medium\">{interview.rating}/5</span>\n </div>\n )}\n <Badge variant=\"default\">completed</Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )}\n\n <FormModal\n open={scheduleOpen}\n onOpenChange={setScheduleOpen}\n title=\"Schedule Interview\"\n description=\"Set up a conversation with a candidate in your pipeline.\"\n fields={scheduleFields}\n submitLabel=\"Schedule\"\n onSubmit={handleSchedule}\n />\n <FormModal\n open={updateTarget !== null}\n onOpenChange={(open) => {\n if (!open) {\n setUpdateTarget(null);\n }\n }}\n title=\"Record Interview Outcome\"\n description={updateTarget ? `${updateTarget.candidateName} — ${updateTarget.position}` : undefined}\n fields={UPDATE_FIELDS}\n initialValues={\n updateTarget\n ? {\n status: updateTarget.status,\n rating: updateTarget.rating ?? '',\n feedback: updateTarget.feedback ?? '',\n }\n : undefined\n }\n submitLabel=\"Save outcome\"\n onSubmit={handleUpdate}\n />\n </div>\n );\n}\n"],"mappings":"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"}