@burdenoff/microfe-crewfoundry 2026.608.1 → 2026.625.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/pages/AdminAdminPagePage.js +94 -78
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +112 -96
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +101 -85
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +131 -115
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +116 -100
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +15 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +63 -51
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +16 -16
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +26 -26
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +28 -28
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +10 -10
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +71 -59
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +59 -47
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +77 -61
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +40 -40
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +13 -13
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +102 -86
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +173 -139
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +59 -59
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +113 -97
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +45 -45
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +85 -69
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +23 -23
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +40 -40
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +59 -47
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +52 -48
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +31 -26
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +61 -49
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +83 -67
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +90 -74
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +90 -74
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +83 -67
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +54 -42
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +16 -16
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +39 -35
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +24 -24
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +14 -14
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +81 -65
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +73 -57
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +28 -28
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +12 -12
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -59
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +57 -45
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +71 -59
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +48 -48
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +44 -43
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +58 -46
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +16 -16
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +23 -23
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +9 -9
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +43 -39
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +59 -47
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +13 -13
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +66 -50
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +18 -18
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +74 -62
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +21 -21
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +47 -43
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +20 -20
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +58 -46
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +38 -34
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +14 -14
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +67 -67
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +16 -16
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -2,10 +2,10 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { Briefcase as n, Clock as r, Target as i, TrendingUp as a, Users as o } from "lucide-react";
|
|
4
4
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { Badge as l, Card as u, CardContent as d, CardDescription as f, CardHeader as p, CardTitle as m, GlassCard as h, GradientText as g } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { jobPostings:
|
|
7
|
+
function _() {
|
|
8
|
+
let { jobPostings: _, candidates: v, interviews: y } = e(), b = t(() => [
|
|
9
9
|
"Sep",
|
|
10
10
|
"Oct",
|
|
11
11
|
"Nov",
|
|
@@ -13,7 +13,7 @@ function h() {
|
|
|
13
13
|
"Jan",
|
|
14
14
|
"Feb"
|
|
15
15
|
].map((e, t) => {
|
|
16
|
-
let n =
|
|
16
|
+
let n = y.filter((t) => new Date(t.date).toLocaleString("en-US", { month: "short" }) === e).length, r = v.filter((t) => new Date(t.appliedDate).toLocaleString("en-US", { month: "short" }) === e), i = r.filter((e) => e.status === "offer").length, a = r.filter((e) => e.status === "hired").length, o = r.length + _.reduce((e, t) => e + t.applicants, 0) / 6;
|
|
17
17
|
return {
|
|
18
18
|
month: e,
|
|
19
19
|
applications: Math.round(o - t * 3),
|
|
@@ -22,11 +22,11 @@ function h() {
|
|
|
22
22
|
hires: a
|
|
23
23
|
};
|
|
24
24
|
}), [
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
]),
|
|
29
|
-
let e =
|
|
25
|
+
v,
|
|
26
|
+
y,
|
|
27
|
+
_
|
|
28
|
+
]), x = t(() => {
|
|
29
|
+
let e = v.reduce((e, t) => {
|
|
30
30
|
let n = t.source || "Unknown", r = e[n] || {
|
|
31
31
|
applications: 0,
|
|
32
32
|
hires: 0
|
|
@@ -38,45 +38,45 @@ function h() {
|
|
|
38
38
|
applications: t.applications,
|
|
39
39
|
hires: t.hires,
|
|
40
40
|
conversionRate: Number((t.hires / Math.max(t.applications, 1) * 100).toFixed(1)),
|
|
41
|
-
costPerHire: Math.round(
|
|
41
|
+
costPerHire: Math.round(_.reduce((e, t) => e + t.salaryMin * .02, 0) / Math.max(t.hires, 1))
|
|
42
42
|
}));
|
|
43
|
-
}, [
|
|
43
|
+
}, [v, _]), S = _.filter((e) => e.status === "active"), C = _.reduce((e, t) => e + t.applicants, 0), w = y.filter((e) => e.status === "scheduled").length, T = y.filter((e) => e.status === "completed").length, E = v.filter((e) => e.status === "offer").length, D = v.filter((e) => e.status === "hired").length, O = Math.max(1, ...b.map((e) => e.applications)), k = [
|
|
44
44
|
{
|
|
45
45
|
status: "New",
|
|
46
|
-
count:
|
|
47
|
-
color: "bg-
|
|
46
|
+
count: v.filter((e) => e.status === "new").length,
|
|
47
|
+
color: "bg-text-secondary"
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
status: "Screening",
|
|
51
|
-
count:
|
|
52
|
-
color: "bg-
|
|
51
|
+
count: v.filter((e) => e.status === "screening").length,
|
|
52
|
+
color: "bg-status-info-text"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
status: "Interview",
|
|
56
|
-
count:
|
|
57
|
-
color: "bg-
|
|
56
|
+
count: v.filter((e) => e.status === "interview").length,
|
|
57
|
+
color: "bg-status-info-text"
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
status: "Assessment",
|
|
61
|
-
count:
|
|
62
|
-
color: "bg-
|
|
61
|
+
count: v.filter((e) => e.status === "assessment").length,
|
|
62
|
+
color: "bg-action-primary-bg"
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
status: "Offer",
|
|
66
|
-
count:
|
|
67
|
-
color: "bg-
|
|
66
|
+
count: E,
|
|
67
|
+
color: "bg-status-warning-text"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
status: "Hired",
|
|
71
|
-
count:
|
|
72
|
-
color: "bg-
|
|
71
|
+
count: D,
|
|
72
|
+
color: "bg-status-success-text"
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
status: "Rejected",
|
|
76
|
-
count:
|
|
77
|
-
color: "bg-
|
|
76
|
+
count: v.filter((e) => e.status === "rejected").length,
|
|
77
|
+
color: "bg-status-error-text"
|
|
78
78
|
}
|
|
79
|
-
],
|
|
79
|
+
], A = k.reduce((e, t) => e + t.count, 0);
|
|
80
80
|
return /* @__PURE__ */ c("div", {
|
|
81
81
|
className: "space-y-6 p-6",
|
|
82
82
|
children: [
|
|
@@ -84,72 +84,88 @@ function h() {
|
|
|
84
84
|
className: "flex items-center justify-between",
|
|
85
85
|
children: /* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("h1", {
|
|
86
86
|
className: "text-2xl font-semibold",
|
|
87
|
-
children: "Hiring Analytics"
|
|
87
|
+
children: /* @__PURE__ */ s(g, { children: "Hiring Analytics" })
|
|
88
88
|
}), /* @__PURE__ */ s("p", {
|
|
89
|
-
className: "text-sm text-
|
|
89
|
+
className: "text-sm text-text-secondary",
|
|
90
90
|
children: "Recruitment performance and pipeline analysis"
|
|
91
91
|
})] })
|
|
92
92
|
}),
|
|
93
93
|
/* @__PURE__ */ c("div", {
|
|
94
94
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
95
95
|
children: [
|
|
96
|
-
/* @__PURE__ */ c(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
className: "
|
|
133
|
-
children: [
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
className: "text-
|
|
144
|
-
children:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
96
|
+
/* @__PURE__ */ c(h, {
|
|
97
|
+
treatment: "metric",
|
|
98
|
+
className: "border-border-seam",
|
|
99
|
+
children: [/* @__PURE__ */ c(p, {
|
|
100
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
101
|
+
children: [/* @__PURE__ */ s(m, {
|
|
102
|
+
className: "text-sm font-medium",
|
|
103
|
+
children: "Active Postings"
|
|
104
|
+
}), /* @__PURE__ */ s(n, { className: "h-4 w-4 text-text-secondary" })]
|
|
105
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
106
|
+
className: "text-2xl font-bold tabular-nums",
|
|
107
|
+
children: S.length
|
|
108
|
+
}), /* @__PURE__ */ c("p", {
|
|
109
|
+
className: "text-xs text-text-secondary",
|
|
110
|
+
children: [C, " total applicants"]
|
|
111
|
+
})] })]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ c(h, {
|
|
114
|
+
treatment: "metric",
|
|
115
|
+
className: "border-border-seam",
|
|
116
|
+
children: [/* @__PURE__ */ c(p, {
|
|
117
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
118
|
+
children: [/* @__PURE__ */ s(m, {
|
|
119
|
+
className: "text-sm font-medium",
|
|
120
|
+
children: "Time to Fill"
|
|
121
|
+
}), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-text-secondary" })]
|
|
122
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
123
|
+
className: "text-2xl font-bold tabular-nums",
|
|
124
|
+
children: "28 days"
|
|
125
|
+
}), /* @__PURE__ */ c("div", {
|
|
126
|
+
className: "flex items-center text-xs text-status-success-text",
|
|
127
|
+
children: [/* @__PURE__ */ s(a, { className: "h-3 w-3 mr-1" }), "-3 days from last quarter"]
|
|
128
|
+
})] })]
|
|
129
|
+
}),
|
|
130
|
+
/* @__PURE__ */ c(h, {
|
|
131
|
+
treatment: "metric",
|
|
132
|
+
className: "border-border-seam",
|
|
133
|
+
children: [/* @__PURE__ */ c(p, {
|
|
134
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
135
|
+
children: [/* @__PURE__ */ s(m, {
|
|
136
|
+
className: "text-sm font-medium",
|
|
137
|
+
children: "Interview to Offer"
|
|
138
|
+
}), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
139
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
140
|
+
className: "text-2xl font-bold tabular-nums",
|
|
141
|
+
children: "32%"
|
|
142
|
+
}), /* @__PURE__ */ c("p", {
|
|
143
|
+
className: "text-xs text-text-secondary",
|
|
144
|
+
children: [
|
|
145
|
+
w,
|
|
146
|
+
" scheduled, ",
|
|
147
|
+
T,
|
|
148
|
+
" completed"
|
|
149
|
+
]
|
|
150
|
+
})] })]
|
|
151
|
+
}),
|
|
152
|
+
/* @__PURE__ */ c(h, {
|
|
153
|
+
treatment: "metric",
|
|
154
|
+
className: "border-border-seam",
|
|
155
|
+
children: [/* @__PURE__ */ c(p, {
|
|
156
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
157
|
+
children: [/* @__PURE__ */ s(m, {
|
|
158
|
+
className: "text-sm font-medium",
|
|
159
|
+
children: "Offer Acceptance"
|
|
160
|
+
}), /* @__PURE__ */ s(o, { className: "h-4 w-4 text-text-secondary" })]
|
|
161
|
+
}), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s("div", {
|
|
162
|
+
className: "text-2xl font-bold tabular-nums",
|
|
163
|
+
children: "87%"
|
|
164
|
+
}), /* @__PURE__ */ c("p", {
|
|
165
|
+
className: "text-xs text-text-secondary",
|
|
166
|
+
children: [D, " hired this quarter"]
|
|
167
|
+
})] })]
|
|
168
|
+
})
|
|
153
169
|
]
|
|
154
170
|
}),
|
|
155
171
|
/* @__PURE__ */ c("div", {
|
|
@@ -158,18 +174,18 @@ function h() {
|
|
|
158
174
|
className: "col-span-4",
|
|
159
175
|
children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Monthly Hiring Activity" }), /* @__PURE__ */ s(f, { children: "Applications, interviews, and hires over time" })] }), /* @__PURE__ */ s(d, {
|
|
160
176
|
className: "space-y-3",
|
|
161
|
-
children:
|
|
177
|
+
children: b.map((e) => /* @__PURE__ */ c("div", {
|
|
162
178
|
className: "flex items-center gap-3",
|
|
163
179
|
children: [
|
|
164
180
|
/* @__PURE__ */ s("span", {
|
|
165
|
-
className: "w-10 text-sm text-
|
|
181
|
+
className: "w-10 text-sm text-text-secondary",
|
|
166
182
|
children: e.month
|
|
167
183
|
}),
|
|
168
184
|
/* @__PURE__ */ s("div", {
|
|
169
|
-
className: "flex-1 h-5 bg-
|
|
185
|
+
className: "flex-1 h-5 bg-bg-sunken rounded overflow-hidden",
|
|
170
186
|
children: /* @__PURE__ */ s("div", {
|
|
171
|
-
className: "h-5 bg-primary rounded",
|
|
172
|
-
style: { width: `${Math.round(e.applications / (
|
|
187
|
+
className: "h-5 bg-action-primary-bg rounded",
|
|
188
|
+
style: { width: `${Math.round(e.applications / (O + 20) * 100)}%` }
|
|
173
189
|
})
|
|
174
190
|
}),
|
|
175
191
|
/* @__PURE__ */ c("div", {
|
|
@@ -199,7 +215,7 @@ function h() {
|
|
|
199
215
|
className: "col-span-3",
|
|
200
216
|
children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Pipeline Status" }), /* @__PURE__ */ s(f, { children: "Current candidate distribution" })] }), /* @__PURE__ */ s(d, {
|
|
201
217
|
className: "space-y-3",
|
|
202
|
-
children:
|
|
218
|
+
children: k.map((e) => /* @__PURE__ */ c("div", {
|
|
203
219
|
className: "flex items-center gap-3",
|
|
204
220
|
children: [
|
|
205
221
|
/* @__PURE__ */ s("div", { className: `h-3 w-3 rounded-full ${e.color}` }),
|
|
@@ -208,10 +224,10 @@ function h() {
|
|
|
208
224
|
children: e.status
|
|
209
225
|
}),
|
|
210
226
|
/* @__PURE__ */ s("div", {
|
|
211
|
-
className: "flex-1 h-3 bg-
|
|
227
|
+
className: "flex-1 h-3 bg-bg-sunken rounded overflow-hidden",
|
|
212
228
|
children: /* @__PURE__ */ s("div", {
|
|
213
229
|
className: `h-3 rounded ${e.color}`,
|
|
214
|
-
style: { width: `${
|
|
230
|
+
style: { width: `${A > 0 ? Math.max(Math.round(e.count / A * 100), 3) : 3}%` }
|
|
215
231
|
})
|
|
216
232
|
}),
|
|
217
233
|
/* @__PURE__ */ s("span", {
|
|
@@ -224,7 +240,7 @@ function h() {
|
|
|
224
240
|
})]
|
|
225
241
|
}),
|
|
226
242
|
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Source Effectiveness" }), /* @__PURE__ */ s(f, { children: "Recruitment channel performance comparison" })] }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
227
|
-
className: "grid grid-cols-5 gap-2 text-xs font-medium text-
|
|
243
|
+
className: "grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
228
244
|
children: [
|
|
229
245
|
/* @__PURE__ */ s("span", { children: "Source" }),
|
|
230
246
|
/* @__PURE__ */ s("span", {
|
|
@@ -244,7 +260,7 @@ function h() {
|
|
|
244
260
|
children: "Cost/Hire"
|
|
245
261
|
})
|
|
246
262
|
]
|
|
247
|
-
}),
|
|
263
|
+
}), x.sort((e, t) => t.conversionRate - e.conversionRate).map((e) => /* @__PURE__ */ c("div", {
|
|
248
264
|
className: "grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm",
|
|
249
265
|
children: [
|
|
250
266
|
/* @__PURE__ */ s("span", {
|
|
@@ -274,7 +290,7 @@ function h() {
|
|
|
274
290
|
]
|
|
275
291
|
}, e.source))] })] }),
|
|
276
292
|
/* @__PURE__ */ c(u, { children: [/* @__PURE__ */ c(p, { children: [/* @__PURE__ */ s(m, { children: "Open Positions Detail" }), /* @__PURE__ */ s(f, { children: "Active job postings and applicant counts" })] }), /* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c("div", {
|
|
277
|
-
className: "grid grid-cols-6 gap-2 text-xs font-medium text-
|
|
293
|
+
className: "grid grid-cols-6 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2",
|
|
278
294
|
children: [
|
|
279
295
|
/* @__PURE__ */ s("span", { children: "Position" }),
|
|
280
296
|
/* @__PURE__ */ s("span", { children: "Department" }),
|
|
@@ -292,7 +308,7 @@ function h() {
|
|
|
292
308
|
children: "Status"
|
|
293
309
|
})
|
|
294
310
|
]
|
|
295
|
-
}),
|
|
311
|
+
}), _.map((e) => /* @__PURE__ */ c("div", {
|
|
296
312
|
className: "grid grid-cols-6 gap-2 py-2 border-b last:border-0 text-sm",
|
|
297
313
|
children: [
|
|
298
314
|
/* @__PURE__ */ s("span", {
|
|
@@ -300,7 +316,7 @@ function h() {
|
|
|
300
316
|
children: e.title
|
|
301
317
|
}),
|
|
302
318
|
/* @__PURE__ */ s("span", {
|
|
303
|
-
className: "text-
|
|
319
|
+
className: "text-text-secondary",
|
|
304
320
|
children: e.department
|
|
305
321
|
}),
|
|
306
322
|
/* @__PURE__ */ s(l, {
|
|
@@ -313,7 +329,7 @@ function h() {
|
|
|
313
329
|
children: e.applicants
|
|
314
330
|
}),
|
|
315
331
|
/* @__PURE__ */ c("span", {
|
|
316
|
-
className: "text-right text-
|
|
332
|
+
className: "text-right text-text-secondary",
|
|
317
333
|
children: [
|
|
318
334
|
"$",
|
|
319
335
|
(e.salaryMin / 1e3).toFixed(0),
|
|
@@ -336,6 +352,6 @@ function h() {
|
|
|
336
352
|
});
|
|
337
353
|
}
|
|
338
354
|
//#endregion
|
|
339
|
-
export {
|
|
355
|
+
export { _ as AnalyticsHiringAnalyticsPagePage };
|
|
340
356
|
|
|
341
357
|
//# sourceMappingURL=AnalyticsHiringAnalyticsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnalyticsHiringAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { Briefcase, Clock, Target, TrendingUp, Users } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function AnalyticsHiringAnalyticsPagePage() {\n const { jobPostings, candidates, interviews } = useCrewFoundryStore();\n\n const hiringMetrics = useMemo(() => {\n const months = ['Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb'];\n return months.map((month, index) => {\n const monthInterviews = interviews.filter(\n (interview) =>\n new Date(interview.date).toLocaleString('en-US', { month: 'short' }) === month\n ).length;\n const monthCandidates = candidates.filter(\n (candidate) =>\n new Date(candidate.appliedDate).toLocaleString('en-US', { month: 'short' }) === month\n );\n const offers = monthCandidates.filter((candidate) => candidate.status === 'offer').length;\n const hires = monthCandidates.filter((candidate) => candidate.status === 'hired').length;\n const applications =\n monthCandidates.length +\n jobPostings.reduce((sum, posting) => sum + posting.applicants, 0) / 6;\n return {\n month,\n applications: Math.round(applications - index * 3),\n interviews: monthInterviews,\n offers,\n hires,\n };\n });\n }, [candidates, interviews, jobPostings]);\n\n const sourceEffectiveness = useMemo(() => {\n const grouped = candidates.reduce<Record<string, { applications: number; hires: number }>>(\n (acc, candidate) => {\n const source = candidate.source || 'Unknown';\n const value = acc[source] || { applications: 0, hires: 0 };\n value.applications += 1;\n if (candidate.status === 'hired') {\n value.hires += 1;\n }\n acc[source] = value;\n return acc;\n },\n {}\n );\n\n return Object.entries(grouped).map(([source, value]) => ({\n source,\n applications: value.applications,\n hires: value.hires,\n conversionRate: Number(((value.hires / Math.max(value.applications, 1)) * 100).toFixed(1)),\n costPerHire: Math.round(\n jobPostings.reduce((sum, posting) => sum + posting.salaryMin * 0.02, 0) /\n Math.max(value.hires, 1)\n ),\n }));\n }, [candidates, jobPostings]);\n\n const activeJobs = jobPostings.filter((j) => j.status === 'active');\n const totalApplicants = jobPostings.reduce((s, j) => s + j.applicants, 0);\n const scheduledInterviews = interviews.filter((i) => i.status === 'scheduled').length;\n const completedInterviews = interviews.filter((i) => i.status === 'completed').length;\n const offeredCandidates = candidates.filter((c) => c.status === 'offer').length;\n const hiredCandidates = candidates.filter((c) => c.status === 'hired').length;\n\n const maxApplications = Math.max(1, ...hiringMetrics.map((m) => m.applications));\n\n const statusPipeline = [\n {\n status: 'New',\n count: candidates.filter((c) => c.status === 'new').length,\n color: 'bg-gray-500',\n },\n {\n status: 'Screening',\n count: candidates.filter((c) => c.status === 'screening').length,\n color: 'bg-blue-500',\n },\n {\n status: 'Interview',\n count: candidates.filter((c) => c.status === 'interview').length,\n color: 'bg-indigo-500',\n },\n {\n status: 'Assessment',\n count: candidates.filter((c) => c.status === 'assessment').length,\n color: 'bg-purple-500',\n },\n { status: 'Offer', count: offeredCandidates, color: 'bg-orange-500' },\n { status: 'Hired', count: hiredCandidates, color: 'bg-green-500' },\n {\n status: 'Rejected',\n count: candidates.filter((c) => c.status === 'rejected').length,\n color: 'bg-red-500',\n },\n ];\n const totalPipeline = statusPipeline.reduce((s, p) => s + p.count, 0);\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\">Hiring Analytics</h1>\n <p className=\"text-sm text-muted-foreground\">\n Recruitment performance and pipeline analysis\n </p>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Active Postings</CardTitle>\n <Briefcase className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{activeJobs.length}</div>\n <p className=\"text-xs text-muted-foreground\">{totalApplicants} total applicants</p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Time to Fill</CardTitle>\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">28 days</div>\n <div className=\"flex items-center text-xs text-green-600\">\n <TrendingUp className=\"h-3 w-3 mr-1\" />\n -3 days from last quarter\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Interview to Offer</CardTitle>\n <Target className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">32%</div>\n <p className=\"text-xs text-muted-foreground\">\n {scheduledInterviews} scheduled, {completedInterviews} completed\n </p>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Offer Acceptance</CardTitle>\n <Users className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">87%</div>\n <p className=\"text-xs text-muted-foreground\">{hiredCandidates} hired this quarter</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-7\">\n <Card className=\"col-span-4\">\n <CardHeader>\n <CardTitle>Monthly Hiring Activity</CardTitle>\n <CardDescription>Applications, interviews, and hires over time</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {hiringMetrics.map((m) => (\n <div key={m.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-muted-foreground\">{m.month}</span>\n <div className=\"flex-1 h-5 bg-muted rounded overflow-hidden\">\n <div\n className=\"h-5 bg-primary rounded\"\n style={{\n width: `${Math.round((m.applications / (maxApplications + 20)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"flex gap-1 w-48 justify-end\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {m.applications} apps\n </Badge>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {m.interviews} int\n </Badge>\n <Badge variant=\"default\" className=\"text-[10px]\">\n {m.hires} hired\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"col-span-3\">\n <CardHeader>\n <CardTitle>Pipeline Status</CardTitle>\n <CardDescription>Current candidate distribution</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {statusPipeline.map((stage) => (\n <div key={stage.status} className=\"flex items-center gap-3\">\n <div className={`h-3 w-3 rounded-full ${stage.color}`} />\n <span className=\"w-20 text-sm\">{stage.status}</span>\n <div className=\"flex-1 h-3 bg-muted rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${stage.color}`}\n style={{\n width: `${totalPipeline > 0 ? Math.max(Math.round((stage.count / totalPipeline) * 100), 3) : 3}%`,\n }}\n />\n </div>\n <span className=\"text-sm font-medium w-6 text-right\">{stage.count}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Source Effectiveness</CardTitle>\n <CardDescription>Recruitment channel performance comparison</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-5 gap-2 text-xs font-medium text-muted-foreground border-b pb-2 mb-2\">\n <span>Source</span>\n <span className=\"text-right\">Applications</span>\n <span className=\"text-right\">Hires</span>\n <span className=\"text-right\">Conversion</span>\n <span className=\"text-right\">Cost/Hire</span>\n </div>\n {sourceEffectiveness\n .sort((a, b) => b.conversionRate - a.conversionRate)\n .map((src) => (\n <div\n key={src.source}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{src.source}</span>\n <span className=\"text-right\">{src.applications}</span>\n <span className=\"text-right\">{src.hires}</span>\n <span className=\"text-right\">\n <Badge\n variant={src.conversionRate >= 5 ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {src.conversionRate}%\n </Badge>\n </span>\n <span className=\"text-right\">${src.costPerHire.toLocaleString()}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Open Positions Detail</CardTitle>\n <CardDescription>Active job postings and applicant counts</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-6 gap-2 text-xs font-medium text-muted-foreground border-b pb-2 mb-2\">\n <span>Position</span>\n <span>Department</span>\n <span>Level</span>\n <span className=\"text-right\">Applicants</span>\n <span className=\"text-right\">Salary Range</span>\n <span className=\"text-right\">Status</span>\n </div>\n {jobPostings.map((job) => (\n <div\n key={job.id}\n className=\"grid grid-cols-6 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium truncate\">{job.title}</span>\n <span className=\"text-muted-foreground\">{job.department}</span>\n <Badge variant=\"outline\" className=\"w-fit text-[10px]\">\n {job.experienceLevel}\n </Badge>\n <span className=\"text-right\">{job.applicants}</span>\n <span className=\"text-right text-muted-foreground\">\n ${(job.salaryMin / 1000).toFixed(0)}K-${(job.salaryMax / 1000).toFixed(0)}K\n </span>\n <div className=\"text-right\">\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AnalyticsHiringAnalyticsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Briefcase, Clock, Target, TrendingUp, Users } from 'lucide-react';\nimport { useMemo } from 'react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function AnalyticsHiringAnalyticsPagePage() {\n const { jobPostings, candidates, interviews } = useCrewFoundryStore();\n\n const hiringMetrics = useMemo(() => {\n const months = ['Sep', 'Oct', 'Nov', 'Dec', 'Jan', 'Feb'];\n return months.map((month, index) => {\n const monthInterviews = interviews.filter(\n (interview) =>\n new Date(interview.date).toLocaleString('en-US', { month: 'short' }) === month\n ).length;\n const monthCandidates = candidates.filter(\n (candidate) =>\n new Date(candidate.appliedDate).toLocaleString('en-US', { month: 'short' }) === month\n );\n const offers = monthCandidates.filter((candidate) => candidate.status === 'offer').length;\n const hires = monthCandidates.filter((candidate) => candidate.status === 'hired').length;\n const applications =\n monthCandidates.length +\n jobPostings.reduce((sum, posting) => sum + posting.applicants, 0) / 6;\n return {\n month,\n applications: Math.round(applications - index * 3),\n interviews: monthInterviews,\n offers,\n hires,\n };\n });\n }, [candidates, interviews, jobPostings]);\n\n const sourceEffectiveness = useMemo(() => {\n const grouped = candidates.reduce<Record<string, { applications: number; hires: number }>>(\n (acc, candidate) => {\n const source = candidate.source || 'Unknown';\n const value = acc[source] || { applications: 0, hires: 0 };\n value.applications += 1;\n if (candidate.status === 'hired') {\n value.hires += 1;\n }\n acc[source] = value;\n return acc;\n },\n {}\n );\n\n return Object.entries(grouped).map(([source, value]) => ({\n source,\n applications: value.applications,\n hires: value.hires,\n conversionRate: Number(((value.hires / Math.max(value.applications, 1)) * 100).toFixed(1)),\n costPerHire: Math.round(\n jobPostings.reduce((sum, posting) => sum + posting.salaryMin * 0.02, 0) /\n Math.max(value.hires, 1)\n ),\n }));\n }, [candidates, jobPostings]);\n\n const activeJobs = jobPostings.filter((j) => j.status === 'active');\n const totalApplicants = jobPostings.reduce((s, j) => s + j.applicants, 0);\n const scheduledInterviews = interviews.filter((i) => i.status === 'scheduled').length;\n const completedInterviews = interviews.filter((i) => i.status === 'completed').length;\n const offeredCandidates = candidates.filter((c) => c.status === 'offer').length;\n const hiredCandidates = candidates.filter((c) => c.status === 'hired').length;\n\n const maxApplications = Math.max(1, ...hiringMetrics.map((m) => m.applications));\n\n const statusPipeline = [\n {\n status: 'New',\n count: candidates.filter((c) => c.status === 'new').length,\n color: 'bg-text-secondary',\n },\n {\n status: 'Screening',\n count: candidates.filter((c) => c.status === 'screening').length,\n color: 'bg-status-info-text',\n },\n {\n status: 'Interview',\n count: candidates.filter((c) => c.status === 'interview').length,\n color: 'bg-status-info-text',\n },\n {\n status: 'Assessment',\n count: candidates.filter((c) => c.status === 'assessment').length,\n color: 'bg-action-primary-bg',\n },\n { status: 'Offer', count: offeredCandidates, color: 'bg-status-warning-text' },\n { status: 'Hired', count: hiredCandidates, color: 'bg-status-success-text' },\n {\n status: 'Rejected',\n count: candidates.filter((c) => c.status === 'rejected').length,\n color: 'bg-status-error-text',\n },\n ];\n const totalPipeline = statusPipeline.reduce((s, p) => s + p.count, 0);\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>Hiring Analytics</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Recruitment performance and pipeline analysis\n </p>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\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\">Active Postings</CardTitle>\n <Briefcase className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{activeJobs.length}</div>\n <p className=\"text-xs text-text-secondary\">{totalApplicants} total applicants</p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Time to Fill</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">28 days</div>\n <div className=\"flex items-center text-xs text-status-success-text\">\n <TrendingUp className=\"h-3 w-3 mr-1\" />\n -3 days from last quarter\n </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\">Interview to Offer</CardTitle>\n <Target className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">32%</div>\n <p className=\"text-xs text-text-secondary\">\n {scheduledInterviews} scheduled, {completedInterviews} completed\n </p>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Offer Acceptance</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">87%</div>\n <p className=\"text-xs text-text-secondary\">{hiredCandidates} hired this quarter</p>\n </CardContent>\n </GlassCard>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-7\">\n <Card className=\"col-span-4\">\n <CardHeader>\n <CardTitle>Monthly Hiring Activity</CardTitle>\n <CardDescription>Applications, interviews, and hires over time</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {hiringMetrics.map((m) => (\n <div key={m.month} className=\"flex items-center gap-3\">\n <span className=\"w-10 text-sm text-text-secondary\">{m.month}</span>\n <div className=\"flex-1 h-5 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-5 bg-action-primary-bg rounded\"\n style={{\n width: `${Math.round((m.applications / (maxApplications + 20)) * 100)}%`,\n }}\n />\n </div>\n <div className=\"flex gap-1 w-48 justify-end\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {m.applications} apps\n </Badge>\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {m.interviews} int\n </Badge>\n <Badge variant=\"default\" className=\"text-[10px]\">\n {m.hires} hired\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card className=\"col-span-3\">\n <CardHeader>\n <CardTitle>Pipeline Status</CardTitle>\n <CardDescription>Current candidate distribution</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {statusPipeline.map((stage) => (\n <div key={stage.status} className=\"flex items-center gap-3\">\n <div className={`h-3 w-3 rounded-full ${stage.color}`} />\n <span className=\"w-20 text-sm\">{stage.status}</span>\n <div className=\"flex-1 h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className={`h-3 rounded ${stage.color}`}\n style={{\n width: `${totalPipeline > 0 ? Math.max(Math.round((stage.count / totalPipeline) * 100), 3) : 3}%`,\n }}\n />\n </div>\n <span className=\"text-sm font-medium w-6 text-right\">{stage.count}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>Source Effectiveness</CardTitle>\n <CardDescription>Recruitment channel performance comparison</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-5 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Source</span>\n <span className=\"text-right\">Applications</span>\n <span className=\"text-right\">Hires</span>\n <span className=\"text-right\">Conversion</span>\n <span className=\"text-right\">Cost/Hire</span>\n </div>\n {sourceEffectiveness\n .sort((a, b) => b.conversionRate - a.conversionRate)\n .map((src) => (\n <div\n key={src.source}\n className=\"grid grid-cols-5 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium\">{src.source}</span>\n <span className=\"text-right\">{src.applications}</span>\n <span className=\"text-right\">{src.hires}</span>\n <span className=\"text-right\">\n <Badge\n variant={src.conversionRate >= 5 ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {src.conversionRate}%\n </Badge>\n </span>\n <span className=\"text-right\">${src.costPerHire.toLocaleString()}</span>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Open Positions Detail</CardTitle>\n <CardDescription>Active job postings and applicant counts</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"grid grid-cols-6 gap-2 text-xs font-medium text-text-secondary border-b pb-2 mb-2\">\n <span>Position</span>\n <span>Department</span>\n <span>Level</span>\n <span className=\"text-right\">Applicants</span>\n <span className=\"text-right\">Salary Range</span>\n <span className=\"text-right\">Status</span>\n </div>\n {jobPostings.map((job) => (\n <div\n key={job.id}\n className=\"grid grid-cols-6 gap-2 py-2 border-b last:border-0 text-sm\"\n >\n <span className=\"font-medium truncate\">{job.title}</span>\n <span className=\"text-text-secondary\">{job.department}</span>\n <Badge variant=\"outline\" className=\"w-fit text-[10px]\">\n {job.experienceLevel}\n </Badge>\n <span className=\"text-right\">{job.applicants}</span>\n <span className=\"text-right text-text-secondary\">\n ${(job.salaryMin / 1000).toFixed(0)}K-${(job.salaryMax / 1000).toFixed(0)}K\n </span>\n <div className=\"text-right\">\n <Badge\n variant={job.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {job.status}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { Eye as t, Pin as n, Plus as r } from "lucide-react";
|
|
3
3
|
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as o, Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
import { Badge as o, Button as s, Card as c, CardContent as l, CardHeader as u, CardTitle as d, GradientText as f } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/CommunicationsAnnouncementsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { announcements:
|
|
6
|
+
function p() {
|
|
7
|
+
let { announcements: p } = e(), m = p.filter((e) => e.isPinned), h = p.filter((e) => !e.isPinned);
|
|
8
8
|
return /* @__PURE__ */ a("div", {
|
|
9
9
|
className: "space-y-6 p-6",
|
|
10
10
|
children: [
|
|
@@ -12,22 +12,22 @@ function f() {
|
|
|
12
12
|
className: "flex items-center justify-between",
|
|
13
13
|
children: [/* @__PURE__ */ a("div", { children: [/* @__PURE__ */ i("h1", {
|
|
14
14
|
className: "text-2xl font-semibold",
|
|
15
|
-
children: "Announcements"
|
|
15
|
+
children: /* @__PURE__ */ i(f, { children: "Announcements" })
|
|
16
16
|
}), /* @__PURE__ */ a("p", {
|
|
17
|
-
className: "text-sm text-
|
|
18
|
-
children: [
|
|
17
|
+
className: "text-sm text-text-secondary",
|
|
18
|
+
children: [p.length, " company announcements"]
|
|
19
19
|
})] }), /* @__PURE__ */ a(s, {
|
|
20
20
|
size: "sm",
|
|
21
21
|
children: [/* @__PURE__ */ i(r, { className: "h-4 w-4 mr-1" }), "New Announcement"]
|
|
22
22
|
})]
|
|
23
23
|
}),
|
|
24
|
-
|
|
24
|
+
m.length > 0 && /* @__PURE__ */ a("div", {
|
|
25
25
|
className: "space-y-3",
|
|
26
26
|
children: [/* @__PURE__ */ a("h2", {
|
|
27
27
|
className: "text-sm font-medium flex items-center gap-1",
|
|
28
28
|
children: [/* @__PURE__ */ i(n, { className: "h-4 w-4" }), "Pinned"]
|
|
29
|
-
}),
|
|
30
|
-
className: "border-
|
|
29
|
+
}), m.map((e) => /* @__PURE__ */ a(c, {
|
|
30
|
+
className: "border-status-warning-text/30 bg-status-warning-bg/30",
|
|
31
31
|
children: [/* @__PURE__ */ i(u, { children: /* @__PURE__ */ a("div", {
|
|
32
32
|
className: "flex items-center justify-between",
|
|
33
33
|
children: [/* @__PURE__ */ i(d, {
|
|
@@ -46,10 +46,10 @@ function f() {
|
|
|
46
46
|
})]
|
|
47
47
|
})]
|
|
48
48
|
}) }), /* @__PURE__ */ a(l, { children: [/* @__PURE__ */ i("p", {
|
|
49
|
-
className: "text-sm text-
|
|
49
|
+
className: "text-sm text-text-secondary",
|
|
50
50
|
children: e.content
|
|
51
51
|
}), /* @__PURE__ */ a("div", {
|
|
52
|
-
className: "flex items-center justify-between mt-3 text-xs text-
|
|
52
|
+
className: "flex items-center justify-between mt-3 text-xs text-text-secondary",
|
|
53
53
|
children: [/* @__PURE__ */ a("span", { children: [
|
|
54
54
|
e.author,
|
|
55
55
|
" · ",
|
|
@@ -66,7 +66,7 @@ function f() {
|
|
|
66
66
|
}),
|
|
67
67
|
/* @__PURE__ */ i("div", {
|
|
68
68
|
className: "space-y-3",
|
|
69
|
-
children:
|
|
69
|
+
children: h.map((e) => /* @__PURE__ */ a(c, { children: [/* @__PURE__ */ i(u, { children: /* @__PURE__ */ a("div", {
|
|
70
70
|
className: "flex items-center justify-between",
|
|
71
71
|
children: [/* @__PURE__ */ i(d, {
|
|
72
72
|
className: "text-base",
|
|
@@ -85,11 +85,11 @@ function f() {
|
|
|
85
85
|
})]
|
|
86
86
|
}) }), /* @__PURE__ */ a(l, { children: [
|
|
87
87
|
/* @__PURE__ */ i("p", {
|
|
88
|
-
className: "text-sm text-
|
|
88
|
+
className: "text-sm text-text-secondary",
|
|
89
89
|
children: e.content
|
|
90
90
|
}),
|
|
91
91
|
/* @__PURE__ */ a("div", {
|
|
92
|
-
className: "flex items-center justify-between mt-3 text-xs text-
|
|
92
|
+
className: "flex items-center justify-between mt-3 text-xs text-text-secondary",
|
|
93
93
|
children: [/* @__PURE__ */ a("span", { children: [
|
|
94
94
|
e.author,
|
|
95
95
|
" · ",
|
|
@@ -116,6 +116,6 @@ function f() {
|
|
|
116
116
|
});
|
|
117
117
|
}
|
|
118
118
|
//#endregion
|
|
119
|
-
export {
|
|
119
|
+
export { p as CommunicationsAnnouncementsPagePage };
|
|
120
120
|
|
|
121
121
|
//# sourceMappingURL=CommunicationsAnnouncementsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommunicationsAnnouncementsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsAnnouncementsPagePage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"CommunicationsAnnouncementsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/CommunicationsAnnouncementsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { Eye, Megaphone, Pin, Plus } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function CommunicationsAnnouncementsPagePage() {\n const { announcements } = useCrewFoundryStore();\n const pinned = announcements.filter((a) => a.isPinned);\n const regular = announcements.filter((a) => !a.isPinned);\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>Announcements</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {announcements.length} company announcements\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-1\" />\n New Announcement\n </Button>\n </div>\n {pinned.length > 0 && (\n <div className=\"space-y-3\">\n <h2 className=\"text-sm font-medium flex items-center gap-1\">\n <Pin className=\"h-4 w-4\" />\n Pinned\n </h2>\n {pinned.map((ann) => (\n <Card key={ann.id} className=\"border-status-warning-text/30 bg-status-warning-bg/30\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{ann.title}</CardTitle>\n <div className=\"flex gap-1\">\n <Badge\n variant={\n ann.priority === 'urgent'\n ? 'destructive'\n : ann.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {ann.priority}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {ann.category}\n </Badge>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">{ann.content}</p>\n <div className=\"flex items-center justify-between mt-3 text-xs text-text-secondary\">\n <span>\n {ann.author} · {ann.authorRole}\n </span>\n <div className=\"flex items-center gap-3\">\n <span className=\"flex items-center gap-1\">\n <Eye className=\"h-3 w-3\" />\n {ann.viewCount}\n </span>\n <span>{ann.createdAt}</span>\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n <div className=\"space-y-3\">\n {regular.map((ann) => (\n <Card key={ann.id}>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle className=\"text-base\">{ann.title}</CardTitle>\n <div className=\"flex gap-1\">\n <Badge\n variant={\n ann.priority === 'urgent'\n ? 'destructive'\n : ann.priority === 'high'\n ? 'default'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {ann.priority}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {ann.category}\n </Badge>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary\">{ann.content}</p>\n <div className=\"flex items-center justify-between mt-3 text-xs text-text-secondary\">\n <span>\n {ann.author} · {ann.authorRole}\n </span>\n <div className=\"flex items-center gap-3\">\n <span className=\"flex items-center gap-1\">\n <Eye className=\"h-3 w-3\" />\n {ann.viewCount}\n </span>\n <span>{ann.createdAt}</span>\n </div>\n </div>\n <div className=\"flex gap-1 mt-2\">\n {ann.tags.map((t) => (\n <Badge key={t} variant=\"outline\" className=\"text-[9px]\">\n {t}\n </Badge>\n ))}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|