@burdenoff/microfe-crewfoundry 2026.703.2 → 2026.704.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 +117 -164
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +99 -82
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +160 -192
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +238 -231
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +196 -166
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +45 -147
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +20 -11
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +45 -152
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +50 -138
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +149 -67
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +50 -201
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +205 -136
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -31
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +118 -104
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +117 -58
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +90 -94
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +210 -191
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +213 -180
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +133 -264
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +279 -212
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +131 -105
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +167 -148
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +3 -3
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +13 -5
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +151 -152
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +38 -21
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +3 -3
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +134 -127
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +163 -132
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +202 -160
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +104 -91
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +29 -147
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +22 -106
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +74 -74
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +101 -97
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +64 -47
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +111 -121
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +131 -110
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +65 -64
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +58 -43
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +66 -82
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +38 -88
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +59 -65
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +209 -323
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +175 -220
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +74 -59
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +96 -80
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +28 -100
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +27 -20
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +73 -73
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +62 -56
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +40 -138
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +126 -93
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +99 -77
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +73 -74
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +122 -122
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +130 -113
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +68 -59
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +73 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +82 -58
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +153 -153
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +63 -48
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,123 +1,127 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { Badge as
|
|
2
|
+
import { BookOpen as t, Clock as n, GraduationCap as r, Users as i } from "lucide-react";
|
|
3
|
+
import { useNavigate as a, useSearchParams as o } from "react-router-dom";
|
|
4
|
+
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as l, Button as u, Card as d, CardContent as f, GlassCard as p, GradientText as m, IllustratedEmptyState as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/LearningCourseLearningPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let { courses:
|
|
9
|
-
|
|
10
|
-
return Array.from({ length: e }, (e, t) => {
|
|
11
|
-
let n = t < 2 ? "completed" : t === 2 ? "in_progress" : "locked";
|
|
12
|
-
return {
|
|
13
|
-
id: `module-${t + 1}`,
|
|
14
|
-
title: `${_?.title || "Learning"} Module ${t + 1}`,
|
|
15
|
-
duration: `${25 + t % 4 * 10} min`,
|
|
16
|
-
status: n
|
|
17
|
-
};
|
|
18
|
-
});
|
|
19
|
-
}, [_]), y = v.filter((e) => e.status === "completed").length, b = Math.round(y / Math.max(v.length, 1) * 100);
|
|
20
|
-
return /* @__PURE__ */ o("div", {
|
|
7
|
+
function _() {
|
|
8
|
+
let _ = a(), [v] = o(), { courses: y } = e(), b = v.get("id"), x = b ? y.find((e) => e.id === b) : y[0];
|
|
9
|
+
return x ? /* @__PURE__ */ c("div", {
|
|
21
10
|
className: "max-w-3xl space-y-6 p-6",
|
|
22
11
|
children: [
|
|
23
|
-
/* @__PURE__ */
|
|
24
|
-
/* @__PURE__ */
|
|
25
|
-
className: "
|
|
26
|
-
children: /* @__PURE__ */
|
|
12
|
+
/* @__PURE__ */ c("div", { children: [
|
|
13
|
+
/* @__PURE__ */ c("div", {
|
|
14
|
+
className: "flex items-center gap-2",
|
|
15
|
+
children: [/* @__PURE__ */ s("h1", {
|
|
16
|
+
className: "text-2xl font-semibold",
|
|
17
|
+
children: /* @__PURE__ */ s(m, { children: x.title })
|
|
18
|
+
}), /* @__PURE__ */ s(l, {
|
|
19
|
+
variant: x.level === "beginner" ? "secondary" : x.level === "intermediate" ? "default" : "destructive",
|
|
20
|
+
children: x.level
|
|
21
|
+
})]
|
|
27
22
|
}),
|
|
28
|
-
/* @__PURE__ */
|
|
23
|
+
/* @__PURE__ */ c("p", {
|
|
29
24
|
className: "text-sm text-text-secondary",
|
|
30
25
|
children: [
|
|
31
26
|
"by ",
|
|
32
|
-
|
|
33
|
-
" ·
|
|
34
|
-
|
|
35
|
-
" of",
|
|
36
|
-
" ",
|
|
37
|
-
v.length
|
|
27
|
+
x.instructor,
|
|
28
|
+
" · ",
|
|
29
|
+
x.category
|
|
38
30
|
]
|
|
39
31
|
}),
|
|
40
|
-
/* @__PURE__ */
|
|
32
|
+
/* @__PURE__ */ s(g, {
|
|
41
33
|
className: "mt-1",
|
|
42
34
|
children: "Work through a course lesson-by-lesson — track your progress and complete modules to build the skill at hand."
|
|
43
35
|
})
|
|
44
36
|
] }),
|
|
45
|
-
/* @__PURE__ */
|
|
37
|
+
/* @__PURE__ */ c("div", {
|
|
38
|
+
className: "grid gap-4 sm:grid-cols-3",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
41
|
+
className: "p-4 text-center",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ s(t, { className: "mx-auto mb-1 h-5 w-5 text-text-secondary" }),
|
|
44
|
+
/* @__PURE__ */ s("p", {
|
|
45
|
+
className: "text-lg font-bold",
|
|
46
|
+
children: x.modules
|
|
47
|
+
}),
|
|
48
|
+
/* @__PURE__ */ s("p", {
|
|
49
|
+
className: "text-xs text-text-secondary",
|
|
50
|
+
children: "Modules"
|
|
51
|
+
})
|
|
52
|
+
]
|
|
53
|
+
}) }),
|
|
54
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
55
|
+
className: "p-4 text-center",
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ s(n, { className: "mx-auto mb-1 h-5 w-5 text-text-secondary" }),
|
|
58
|
+
/* @__PURE__ */ s("p", {
|
|
59
|
+
className: "text-lg font-bold",
|
|
60
|
+
children: x.duration
|
|
61
|
+
}),
|
|
62
|
+
/* @__PURE__ */ s("p", {
|
|
63
|
+
className: "text-xs text-text-secondary",
|
|
64
|
+
children: "Duration"
|
|
65
|
+
})
|
|
66
|
+
]
|
|
67
|
+
}) }),
|
|
68
|
+
/* @__PURE__ */ s(d, { children: /* @__PURE__ */ c(f, {
|
|
69
|
+
className: "p-4 text-center",
|
|
70
|
+
children: [
|
|
71
|
+
/* @__PURE__ */ s(i, { className: "mx-auto mb-1 h-5 w-5 text-text-secondary" }),
|
|
72
|
+
/* @__PURE__ */ s("p", {
|
|
73
|
+
className: "text-lg font-bold",
|
|
74
|
+
children: x.enrolled
|
|
75
|
+
}),
|
|
76
|
+
/* @__PURE__ */ s("p", {
|
|
77
|
+
className: "text-xs text-text-secondary",
|
|
78
|
+
children: "Enrolled"
|
|
79
|
+
})
|
|
80
|
+
]
|
|
81
|
+
}) })
|
|
82
|
+
]
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ s(p, {
|
|
46
85
|
treatment: "glass",
|
|
47
86
|
glow: !0,
|
|
48
87
|
className: "border-border-seam",
|
|
49
|
-
children: /* @__PURE__ */
|
|
50
|
-
className: "p-
|
|
51
|
-
children:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
88
|
+
children: /* @__PURE__ */ s(f, {
|
|
89
|
+
className: "p-6",
|
|
90
|
+
children: /* @__PURE__ */ s(h, {
|
|
91
|
+
illustration: "empty-generic",
|
|
92
|
+
title: "Interactive lessons are coming soon",
|
|
93
|
+
description: "The lesson player and per-module progress tracking are being built. In the meantime you can enroll from the course page and review what this course covers.",
|
|
94
|
+
action: /* @__PURE__ */ c("div", {
|
|
95
|
+
className: "flex flex-wrap justify-center gap-2",
|
|
96
|
+
children: [/* @__PURE__ */ c(u, {
|
|
97
|
+
variant: "outline",
|
|
98
|
+
onClick: () => _(`../../learning/course-details-page?id=${encodeURIComponent(x.id)}`),
|
|
99
|
+
children: [/* @__PURE__ */ s(r, { className: "mr-1 h-4 w-4" }), "Course details"]
|
|
100
|
+
}), /* @__PURE__ */ s(u, {
|
|
101
|
+
variant: "outline",
|
|
102
|
+
onClick: () => _("../../learning/my-learning-page"),
|
|
103
|
+
children: "My learning"
|
|
60
104
|
})]
|
|
61
|
-
}),
|
|
62
|
-
/* @__PURE__ */ a("div", {
|
|
63
|
-
className: "h-3 overflow-hidden rounded bg-bg-sunken",
|
|
64
|
-
children: /* @__PURE__ */ a("div", {
|
|
65
|
-
className: "h-3 rounded bg-action-primary-bg",
|
|
66
|
-
style: { width: `${b}%` }
|
|
67
|
-
})
|
|
68
|
-
}),
|
|
69
|
-
/* @__PURE__ */ o("p", {
|
|
70
|
-
className: "mt-1 text-xs text-text-secondary",
|
|
71
|
-
children: [
|
|
72
|
-
y,
|
|
73
|
-
" of ",
|
|
74
|
-
v.length,
|
|
75
|
-
" modules completed"
|
|
76
|
-
]
|
|
77
105
|
})
|
|
78
|
-
|
|
106
|
+
})
|
|
79
107
|
})
|
|
80
|
-
})
|
|
81
|
-
/* @__PURE__ */ o(l, { children: [/* @__PURE__ */ a(d, { children: /* @__PURE__ */ a(f, { children: "Course Modules" }) }), /* @__PURE__ */ a(u, {
|
|
82
|
-
className: "space-y-2",
|
|
83
|
-
children: v.map((e, t) => /* @__PURE__ */ o("div", {
|
|
84
|
-
className: `flex items-center gap-3 rounded border p-3 ${e.status === "locked" ? "opacity-50" : ""}`,
|
|
85
|
-
children: [
|
|
86
|
-
/* @__PURE__ */ a("div", {
|
|
87
|
-
className: "flex h-8 w-8 flex-shrink-0 items-center justify-center rounded-full bg-bg-sunken text-xs font-bold",
|
|
88
|
-
children: e.status === "completed" ? /* @__PURE__ */ a(n, { className: "h-5 w-5 text-status-success-text" }) : t + 1
|
|
89
|
-
}),
|
|
90
|
-
/* @__PURE__ */ o("div", {
|
|
91
|
-
className: "flex-1",
|
|
92
|
-
children: [/* @__PURE__ */ a("p", {
|
|
93
|
-
className: `text-sm ${e.status === "completed" ? "text-text-secondary line-through" : "font-medium"}`,
|
|
94
|
-
children: e.title
|
|
95
|
-
}), /* @__PURE__ */ o("p", {
|
|
96
|
-
className: "flex items-center gap-1 text-xs text-text-secondary",
|
|
97
|
-
children: [/* @__PURE__ */ a(r, { className: "h-3 w-3" }), e.duration]
|
|
98
|
-
})]
|
|
99
|
-
}),
|
|
100
|
-
e.status === "in_progress" ? /* @__PURE__ */ o(c, {
|
|
101
|
-
size: "sm",
|
|
102
|
-
children: [/* @__PURE__ */ a(i, { className: "mr-1 h-3 w-3" }), "Continue"]
|
|
103
|
-
}) : null,
|
|
104
|
-
e.status === "completed" ? /* @__PURE__ */ a(s, {
|
|
105
|
-
variant: "default",
|
|
106
|
-
className: "text-[10px]",
|
|
107
|
-
children: "Completed"
|
|
108
|
-
}) : null,
|
|
109
|
-
e.status === "locked" ? /* @__PURE__ */ a(s, {
|
|
110
|
-
variant: "secondary",
|
|
111
|
-
className: "text-[10px]",
|
|
112
|
-
children: "Locked"
|
|
113
|
-
}) : null
|
|
114
|
-
]
|
|
115
|
-
}, e.id))
|
|
116
|
-
})] })
|
|
108
|
+
})
|
|
117
109
|
]
|
|
110
|
+
}) : /* @__PURE__ */ s("div", {
|
|
111
|
+
className: "p-6",
|
|
112
|
+
children: /* @__PURE__ */ s(h, {
|
|
113
|
+
illustration: "empty-search",
|
|
114
|
+
title: "Course not found",
|
|
115
|
+
description: "This course is no longer available.",
|
|
116
|
+
action: /* @__PURE__ */ s(u, {
|
|
117
|
+
variant: "outline",
|
|
118
|
+
onClick: () => _("../../learning/courses-page"),
|
|
119
|
+
children: "Browse courses"
|
|
120
|
+
})
|
|
121
|
+
})
|
|
118
122
|
});
|
|
119
123
|
}
|
|
120
124
|
//#endregion
|
|
121
|
-
export {
|
|
125
|
+
export { _ as LearningCourseLearningPagePage };
|
|
122
126
|
|
|
123
127
|
//# sourceMappingURL=LearningCourseLearningPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningCourseLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseLearningPagePage.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"LearningCourseLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseLearningPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Clock, GraduationCap, Users } from 'lucide-react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningCourseLearningPagePage() {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const { courses } = useCrewFoundryStore();\n\n const courseId = searchParams.get('id');\n const course = courseId ? courses.find((c) => c.id === courseId) : courses[0];\n\n if (!course) {\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Course not found\"\n description=\"This course is no longer available.\"\n action={\n <Button variant=\"outline\" onClick={() => navigate('../../learning/courses-page')}>\n Browse courses\n </Button>\n }\n />\n </div>\n );\n }\n\n return (\n <div className=\"max-w-3xl space-y-6 p-6\">\n <div>\n <div className=\"flex items-center gap-2\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{course.title}</GradientText>\n </h1>\n <Badge\n variant={\n course.level === 'beginner'\n ? 'secondary'\n : course.level === 'intermediate'\n ? 'default'\n : 'destructive'\n }\n >\n {course.level}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary\">\n by {course.instructor} · {course.category}\n </p>\n <PagePurpose className=\"mt-1\">\n Work through a course lesson-by-lesson — track your progress and complete modules to build\n the skill at hand.\n </PagePurpose>\n </div>\n\n <div className=\"grid gap-4 sm:grid-cols-3\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <BookOpen className=\"mx-auto mb-1 h-5 w-5 text-text-secondary\" />\n <p className=\"text-lg font-bold\">{course.modules}</p>\n <p className=\"text-xs text-text-secondary\">Modules</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Clock className=\"mx-auto mb-1 h-5 w-5 text-text-secondary\" />\n <p className=\"text-lg font-bold\">{course.duration}</p>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"mx-auto mb-1 h-5 w-5 text-text-secondary\" />\n <p className=\"text-lg font-bold\">{course.enrolled}</p>\n <p className=\"text-xs text-text-secondary\">Enrolled</p>\n </CardContent>\n </Card>\n </div>\n\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardContent className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"Interactive lessons are coming soon\"\n description=\"The lesson player and per-module progress tracking are being built. In the meantime you can enroll from the course page and review what this course covers.\"\n action={\n <div className=\"flex flex-wrap justify-center gap-2\">\n <Button\n variant=\"outline\"\n onClick={() =>\n navigate(\n `../../learning/course-details-page?id=${encodeURIComponent(course.id)}`\n )\n }\n >\n <GraduationCap className=\"mr-1 h-4 w-4\" />\n Course details\n </Button>\n <Button\n variant=\"outline\"\n onClick={() => navigate('../../learning/my-learning-page')}\n >\n My learning\n </Button>\n </div>\n }\n />\n </CardContent>\n </GlassCard>\n </div>\n );\n}\n"],"mappings":";;;;;;AAcA,SAAgB,IAAiC;CAC/C,IAAM,IAAW,GAAa,EACxB,CAAC,KAAgB,GAAiB,EAClC,EAAE,eAAY,GAAqB,EAEnC,IAAW,EAAa,IAAI,KAAK,EACjC,IAAS,IAAW,EAAQ,MAAM,MAAM,EAAE,OAAO,EAAS,GAAG,EAAQ;AAmB3E,QAjBK,IAkBH,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,MAAD;MAAI,WAAU;gBACZ,kBAAC,GAAD,EAAA,UAAe,EAAO,OAAqB,CAAA;MACxC,CAAA,EACL,kBAAC,GAAD;MACE,SACE,EAAO,UAAU,aACb,cACA,EAAO,UAAU,iBACf,YACA;gBAGP,EAAO;MACF,CAAA,CACJ;;IACN,kBAAC,KAAD;KAAG,WAAU;eAAb;MAA2C;MACrC,EAAO;MAAW;MAAI,EAAO;MAC/B;;IACJ,kBAAC,GAAD;KAAa,WAAU;eAAO;KAGhB,CAAA;IACV,EAAA,CAAA;GAEN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAU,WAAU,4CAA6C,CAAA;OACjE,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAY,CAAA;OACrD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAW,CAAA;OAC1C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;OAC9D,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAa,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;OAC9D,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAa,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACH;;GAEN,kBAAC,GAAD;IAAW,WAAU;IAAQ,MAAA;IAAK,WAAU;cAC1C,kBAAC,GAAD;KAAa,WAAU;eACrB,kBAAC,GAAD;MACE,cAAa;MACb,OAAM;MACN,aAAY;MACZ,QACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,SAAQ;QACR,eACE,EACE,yCAAyC,mBAAmB,EAAO,GAAG,GACvE;kBALL,CAQE,kBAAC,GAAD,EAAe,WAAU,gBAAiB,CAAA,EAAA,iBAEnC;WACT,kBAAC,GAAD;QACE,SAAQ;QACR,eAAe,EAAS,kCAAkC;kBAC3D;QAEQ,CAAA,CACL;;MAER,CAAA;KACU,CAAA;IACJ,CAAA;GACR;MAjGJ,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,QACE,kBAAC,GAAD;IAAQ,SAAQ;IAAU,eAAe,EAAS,8BAA8B;cAAE;IAEzE,CAAA;GAEX,CAAA;EACE,CAAA"}
|
|
@@ -2,10 +2,12 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
|
|
3
3
|
import { useState as r } from "react";
|
|
4
4
|
import { Plus as i, Search as a, Star as o, Users as s } from "lucide-react";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { useNavigate as c } from "react-router-dom";
|
|
6
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
7
|
+
import { Badge as d, Button as f, CardContent as p, CardDescription as m, CardHeader as h, CardTitle as g, GlassCard as _, GradientText as v, IllustratedEmptyState as y, Input as b, PagePurpose as x, Pagination as S } from "@burdenoff/fe-libs/ui";
|
|
8
|
+
import { usePagination as C } from "@burdenoff/fe-libs/shared/hooks";
|
|
7
9
|
//#region src/crewfoundry/pages/LearningCoursesPagePage.tsx
|
|
8
|
-
var
|
|
10
|
+
var w = [
|
|
9
11
|
{
|
|
10
12
|
name: "title",
|
|
11
13
|
label: "Course Title",
|
|
@@ -94,71 +96,80 @@ var x = [
|
|
|
94
96
|
colSpan: 2
|
|
95
97
|
}
|
|
96
98
|
];
|
|
97
|
-
function
|
|
98
|
-
let { courses:
|
|
99
|
-
return /* @__PURE__ */
|
|
99
|
+
function T() {
|
|
100
|
+
let { courses: T, addCourse: E } = e(), D = c(), [O, k] = r(""), A = n(), { page: j, pageSize: M, offset: N, setPage: P } = C({ initialPageSize: 12 }), F = T.filter((e) => `${e.title} ${e.category} ${e.instructor}`.toLowerCase().includes(O.toLowerCase())), I = F.slice(N, N + M), L = (e) => D(`../course-details-page?id=${encodeURIComponent(e)}`);
|
|
101
|
+
return /* @__PURE__ */ u("div", {
|
|
100
102
|
className: "space-y-6 p-6",
|
|
101
103
|
children: [
|
|
102
|
-
/* @__PURE__ */
|
|
104
|
+
/* @__PURE__ */ u("div", {
|
|
103
105
|
className: "flex flex-wrap items-start justify-between gap-3",
|
|
104
|
-
children: [/* @__PURE__ */
|
|
105
|
-
/* @__PURE__ */
|
|
106
|
+
children: [/* @__PURE__ */ u("div", { children: [
|
|
107
|
+
/* @__PURE__ */ l("h1", {
|
|
106
108
|
className: "text-2xl font-semibold",
|
|
107
|
-
children: /* @__PURE__ */
|
|
109
|
+
children: /* @__PURE__ */ l(v, { children: "Course Catalog" })
|
|
108
110
|
}),
|
|
109
|
-
/* @__PURE__ */
|
|
111
|
+
/* @__PURE__ */ u("p", {
|
|
110
112
|
className: "text-sm text-text-secondary",
|
|
111
|
-
children: [
|
|
113
|
+
children: [T.length, " courses available"]
|
|
112
114
|
}),
|
|
113
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ l(x, {
|
|
114
116
|
className: "mt-1",
|
|
115
117
|
children: "Browse the course catalog — find training to grow your team's skills and enroll in the programs that fit your goals."
|
|
116
118
|
})
|
|
117
|
-
] }), /* @__PURE__ */
|
|
118
|
-
onClick: () =>
|
|
119
|
-
children: [/* @__PURE__ */
|
|
119
|
+
] }), /* @__PURE__ */ u(f, {
|
|
120
|
+
onClick: () => A.openModal(),
|
|
121
|
+
children: [/* @__PURE__ */ l(i, { className: "mr-1 h-4 w-4" }), "Create Course"]
|
|
120
122
|
})]
|
|
121
123
|
}),
|
|
122
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ u("div", {
|
|
123
125
|
className: "relative max-w-sm",
|
|
124
|
-
children: [/* @__PURE__ */
|
|
126
|
+
children: [/* @__PURE__ */ l(a, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ l(b, {
|
|
125
127
|
placeholder: "Search courses...",
|
|
126
128
|
className: "pl-9",
|
|
127
|
-
value:
|
|
128
|
-
onChange: (e) =>
|
|
129
|
+
value: O,
|
|
130
|
+
onChange: (e) => {
|
|
131
|
+
k(e.target.value), P(1);
|
|
132
|
+
}
|
|
129
133
|
})]
|
|
130
134
|
}),
|
|
131
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ l("div", {
|
|
132
136
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
133
|
-
children:
|
|
137
|
+
children: F.length === 0 ? /* @__PURE__ */ l("div", {
|
|
134
138
|
className: "col-span-full",
|
|
135
|
-
children: /* @__PURE__ */
|
|
139
|
+
children: /* @__PURE__ */ l(y, {
|
|
136
140
|
illustration: "empty-search",
|
|
137
141
|
title: "No courses found",
|
|
138
142
|
description: "Try a different search term to find training."
|
|
139
143
|
})
|
|
140
|
-
}) :
|
|
144
|
+
}) : I.map((e, t) => /* @__PURE__ */ u(_, {
|
|
141
145
|
treatment: t === 0 ? "glass" : "plain",
|
|
142
146
|
glow: t === 0,
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
147
|
+
role: "button",
|
|
148
|
+
tabIndex: 0,
|
|
149
|
+
"aria-label": `View ${e.title}`,
|
|
150
|
+
onClick: () => L(e.id),
|
|
151
|
+
onKeyDown: (t) => {
|
|
152
|
+
(t.key === "Enter" || t.key === " ") && (t.preventDefault(), L(e.id));
|
|
153
|
+
},
|
|
154
|
+
className: "hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]",
|
|
155
|
+
children: [/* @__PURE__ */ u(h, { children: [
|
|
156
|
+
/* @__PURE__ */ u("div", {
|
|
146
157
|
className: "flex items-center justify-between",
|
|
147
|
-
children: [/* @__PURE__ */
|
|
158
|
+
children: [/* @__PURE__ */ l(d, {
|
|
148
159
|
variant: "outline",
|
|
149
160
|
className: "text-[10px]",
|
|
150
161
|
children: e.category
|
|
151
|
-
}), /* @__PURE__ */
|
|
162
|
+
}), /* @__PURE__ */ l(d, {
|
|
152
163
|
variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
|
|
153
164
|
className: "text-[10px]",
|
|
154
165
|
children: e.level
|
|
155
166
|
})]
|
|
156
167
|
}),
|
|
157
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ l(g, {
|
|
158
169
|
className: "text-base mt-2",
|
|
159
170
|
children: e.title
|
|
160
171
|
}),
|
|
161
|
-
/* @__PURE__ */
|
|
172
|
+
/* @__PURE__ */ u(m, { children: [
|
|
162
173
|
e.instructor,
|
|
163
174
|
" · ",
|
|
164
175
|
e.duration,
|
|
@@ -166,49 +177,55 @@ function S() {
|
|
|
166
177
|
e.modules,
|
|
167
178
|
" modules"
|
|
168
179
|
] })
|
|
169
|
-
] }), /* @__PURE__ */
|
|
170
|
-
/* @__PURE__ */
|
|
180
|
+
] }), /* @__PURE__ */ u(p, { children: [
|
|
181
|
+
/* @__PURE__ */ l("p", {
|
|
171
182
|
className: "text-sm text-text-secondary mb-3",
|
|
172
183
|
children: e.description
|
|
173
184
|
}),
|
|
174
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ l("div", {
|
|
175
186
|
className: "flex flex-wrap gap-1 mb-3",
|
|
176
|
-
children: e.skills.map((e) => /* @__PURE__ */
|
|
187
|
+
children: e.skills.map((e) => /* @__PURE__ */ l(d, {
|
|
177
188
|
variant: "outline",
|
|
178
189
|
className: "text-[9px]",
|
|
179
190
|
children: e
|
|
180
191
|
}, e))
|
|
181
192
|
}),
|
|
182
|
-
/* @__PURE__ */
|
|
193
|
+
/* @__PURE__ */ u("div", {
|
|
183
194
|
className: "flex items-center justify-between text-xs text-text-secondary",
|
|
184
195
|
children: [
|
|
185
|
-
/* @__PURE__ */
|
|
196
|
+
/* @__PURE__ */ u("span", {
|
|
186
197
|
className: "flex items-center gap-1",
|
|
187
|
-
children: [/* @__PURE__ */
|
|
198
|
+
children: [/* @__PURE__ */ l(o, { className: "h-3 w-3 text-status-warning-text" }), e.rating]
|
|
188
199
|
}),
|
|
189
|
-
/* @__PURE__ */
|
|
200
|
+
/* @__PURE__ */ u("span", {
|
|
190
201
|
className: "flex items-center gap-1",
|
|
191
202
|
children: [
|
|
192
|
-
/* @__PURE__ */
|
|
203
|
+
/* @__PURE__ */ l(s, { className: "h-3 w-3" }),
|
|
193
204
|
e.enrolled,
|
|
194
205
|
" enrolled"
|
|
195
206
|
]
|
|
196
207
|
}),
|
|
197
|
-
/* @__PURE__ */
|
|
208
|
+
/* @__PURE__ */ u("span", { children: [e.enrolled > 0 ? Math.round(e.completed / e.enrolled * 100) : 0, "% completion"] })
|
|
198
209
|
]
|
|
199
210
|
})
|
|
200
211
|
] })]
|
|
201
212
|
}, e.id))
|
|
202
213
|
}),
|
|
203
|
-
/* @__PURE__ */
|
|
204
|
-
|
|
205
|
-
|
|
214
|
+
F.length > M && /* @__PURE__ */ l(S, {
|
|
215
|
+
page: j,
|
|
216
|
+
pageSize: M,
|
|
217
|
+
totalItems: F.length,
|
|
218
|
+
onPageChange: P
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ l(t, {
|
|
221
|
+
open: A.open,
|
|
222
|
+
onOpenChange: A.onOpenChange,
|
|
206
223
|
title: "Create Course",
|
|
207
224
|
description: "Add a new course to the catalog.",
|
|
208
|
-
fields:
|
|
225
|
+
fields: w,
|
|
209
226
|
submitLabel: "Create Course",
|
|
210
227
|
onSubmit: async (e) => {
|
|
211
|
-
await
|
|
228
|
+
await E({
|
|
212
229
|
id: `course-${Date.now()}`,
|
|
213
230
|
title: String(e.title ?? ""),
|
|
214
231
|
category: String(e.category ?? ""),
|
|
@@ -229,6 +246,6 @@ function S() {
|
|
|
229
246
|
});
|
|
230
247
|
}
|
|
231
248
|
//#endregion
|
|
232
|
-
export {
|
|
249
|
+
export { T as LearningCoursesPagePage };
|
|
233
250
|
|
|
234
251
|
//# sourceMappingURL=LearningCoursesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningCoursesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCoursesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Plus, Search, Star, Users } from 'lucide-react';\nimport { useCrewFoundryStore, type LearningCourse } from '../store/crewfoundryStore';\nimport { FormModal, useFormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\n\nconst COURSE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Course Title', type: 'text', required: true, colSpan: 2 },\n { name: 'category', label: 'Category', type: 'text', required: true },\n { name: 'instructor', label: 'Instructor', type: 'text', required: true },\n { name: 'duration', label: 'Duration', type: 'text', required: true, placeholder: 'e.g. 6 weeks' },\n { name: 'modules', label: 'Modules', type: 'number', required: true, placeholder: 'e.g. 8' },\n {\n name: 'level',\n label: 'Level',\n type: 'select',\n required: true,\n options: [\n { label: 'Beginner', value: 'beginner' },\n { label: 'Intermediate', value: 'intermediate' },\n { label: 'Advanced', value: 'advanced' },\n ],\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n required: true,\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Draft', value: 'draft' },\n { label: 'Archived', value: 'archived' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', required: true, colSpan: 2 },\n { name: 'skills', label: 'Skills', type: 'tags', placeholder: 'Add a skill and press Enter', colSpan: 2 },\n];\n\nexport function LearningCoursesPagePage() {\n const { courses, addCourse } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const createModal = useFormModal();\n const filtered = courses.filter((c) =>\n `${c.title} ${c.category} ${c.instructor}`.toLowerCase().includes(search.toLowerCase())\n );\n\n const handleCreate = async (values: FormValues) => {\n await addCourse({\n id: `course-${Date.now()}`,\n title: String(values.title ?? ''),\n category: String(values.category ?? ''),\n instructor: String(values.instructor ?? ''),\n duration: String(values.duration ?? ''),\n level: String(values.level ?? 'beginner') as LearningCourse['level'],\n enrolled: 0,\n completed: 0,\n rating: 0,\n status: String(values.status ?? 'draft') as LearningCourse['status'],\n description: String(values.description ?? ''),\n modules: typeof values.modules === 'number' ? values.modules : Number(values.modules) || 0,\n skills: Array.isArray(values.skills) ? values.skills : [],\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Course Catalog</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{courses.length} courses available</p>\n <PagePurpose className=\"mt-1\">Browse the course catalog — find training to grow your team's skills and enroll in the programs that fit your goals.</PagePurpose>\n </div>\n <Button onClick={() => createModal.openModal()}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Create Course\n </Button>\n </div>\n <div className=\"relative max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search courses...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {filtered.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState illustration=\"empty-search\" title=\"No courses found\" description=\"Try a different search term to find training.\" />\n </div>\n ) : (\n filtered.map((course, _idx) => (\n <GlassCard key={course.id} treatment={_idx === 0 ? 'glass' : 'plain'} glow={_idx === 0} className=\"hover:shadow-md transition-shadow cursor-pointer\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {course.category}\n </Badge>\n <Badge\n variant={\n course.level === 'beginner'\n ? 'secondary'\n : course.level === 'intermediate'\n ? 'default'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {course.level}\n </Badge>\n </div>\n <CardTitle className=\"text-base mt-2\">{course.title}</CardTitle>\n <CardDescription>\n {course.instructor} · {course.duration} · {course.modules} modules\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{course.description}</p>\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {course.rating}\n </span>\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {course.enrolled} enrolled\n </span>\n <span>{Math.round((course.completed / course.enrolled) * 100)}% completion</span>\n </div>\n </CardContent>\n </GlassCard>\n )))}\n </div>\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title=\"Create Course\"\n description=\"Add a new course to the catalog.\"\n fields={COURSE_FIELDS}\n submitLabel=\"Create Course\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LearningCoursesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCoursesPagePage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n Pagination,\n} from '@burdenoff/fe-libs/ui';\nimport { usePagination } from '@burdenoff/fe-libs/shared/hooks';\nimport { Plus, Search, Star, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore, type LearningCourse } from '../store/crewfoundryStore';\nimport { FormModal, useFormModal, type FieldConfig, type FormValues } from '../components/forms/FormModal';\n\nconst COURSE_FIELDS: FieldConfig[] = [\n { name: 'title', label: 'Course Title', type: 'text', required: true, colSpan: 2 },\n { name: 'category', label: 'Category', type: 'text', required: true },\n { name: 'instructor', label: 'Instructor', type: 'text', required: true },\n { name: 'duration', label: 'Duration', type: 'text', required: true, placeholder: 'e.g. 6 weeks' },\n { name: 'modules', label: 'Modules', type: 'number', required: true, placeholder: 'e.g. 8' },\n {\n name: 'level',\n label: 'Level',\n type: 'select',\n required: true,\n options: [\n { label: 'Beginner', value: 'beginner' },\n { label: 'Intermediate', value: 'intermediate' },\n { label: 'Advanced', value: 'advanced' },\n ],\n },\n {\n name: 'status',\n label: 'Status',\n type: 'select',\n required: true,\n options: [\n { label: 'Active', value: 'active' },\n { label: 'Draft', value: 'draft' },\n { label: 'Archived', value: 'archived' },\n ],\n },\n { name: 'description', label: 'Description', type: 'textarea', required: true, colSpan: 2 },\n { name: 'skills', label: 'Skills', type: 'tags', placeholder: 'Add a skill and press Enter', colSpan: 2 },\n];\n\nexport function LearningCoursesPagePage() {\n const { courses, addCourse } = useCrewFoundryStore();\n const navigate = useNavigate();\n const [search, setSearch] = useState('');\n const createModal = useFormModal();\n const { page, pageSize, offset, setPage } = usePagination({ initialPageSize: 12 });\n const filtered = courses.filter((c) =>\n `${c.title} ${c.category} ${c.instructor}`.toLowerCase().includes(search.toLowerCase())\n );\n const paged = filtered.slice(offset, offset + pageSize);\n const openCourse = (id: string) =>\n navigate(`../course-details-page?id=${encodeURIComponent(id)}`);\n\n const handleCreate = async (values: FormValues) => {\n await addCourse({\n id: `course-${Date.now()}`,\n title: String(values.title ?? ''),\n category: String(values.category ?? ''),\n instructor: String(values.instructor ?? ''),\n duration: String(values.duration ?? ''),\n level: String(values.level ?? 'beginner') as LearningCourse['level'],\n enrolled: 0,\n completed: 0,\n rating: 0,\n status: String(values.status ?? 'draft') as LearningCourse['status'],\n description: String(values.description ?? ''),\n modules: typeof values.modules === 'number' ? values.modules : Number(values.modules) || 0,\n skills: Array.isArray(values.skills) ? values.skills : [],\n });\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Course Catalog</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{courses.length} courses available</p>\n <PagePurpose className=\"mt-1\">Browse the course catalog — find training to grow your team's skills and enroll in the programs that fit your goals.</PagePurpose>\n </div>\n <Button onClick={() => createModal.openModal()}>\n <Plus className=\"mr-1 h-4 w-4\" />\n Create Course\n </Button>\n </div>\n <div className=\"relative max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary\" />\n <Input\n placeholder=\"Search courses...\"\n className=\"pl-9\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setPage(1);\n }}\n />\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {filtered.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState illustration=\"empty-search\" title=\"No courses found\" description=\"Try a different search term to find training.\" />\n </div>\n ) : (\n paged.map((course, _idx) => (\n <GlassCard\n key={course.id}\n treatment={_idx === 0 ? 'glass' : 'plain'}\n glow={_idx === 0}\n role=\"button\"\n tabIndex={0}\n aria-label={`View ${course.title}`}\n onClick={() => openCourse(course.id)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n openCourse(course.id);\n }\n }}\n className=\"hover:shadow-md transition-shadow cursor-pointer focus-visible:outline-none focus-visible:shadow-[var(--shadow-focus)]\"\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {course.category}\n </Badge>\n <Badge\n variant={\n course.level === 'beginner'\n ? 'secondary'\n : course.level === 'intermediate'\n ? 'default'\n : 'destructive'\n }\n className=\"text-[10px]\"\n >\n {course.level}\n </Badge>\n </div>\n <CardTitle className=\"text-base mt-2\">{course.title}</CardTitle>\n <CardDescription>\n {course.instructor} · {course.duration} · {course.modules} modules\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{course.description}</p>\n <div className=\"flex flex-wrap gap-1 mb-3\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\" className=\"text-[9px]\">\n {s}\n </Badge>\n ))}\n </div>\n <div className=\"flex items-center justify-between text-xs text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n {course.rating}\n </span>\n <span className=\"flex items-center gap-1\">\n <Users className=\"h-3 w-3\" />\n {course.enrolled} enrolled\n </span>\n <span>\n {course.enrolled > 0\n ? Math.round((course.completed / course.enrolled) * 100)\n : 0}\n % completion\n </span>\n </div>\n </CardContent>\n </GlassCard>\n )))}\n </div>\n\n {filtered.length > pageSize && (\n <Pagination\n page={page}\n pageSize={pageSize}\n totalItems={filtered.length}\n onPageChange={setPage}\n />\n )}\n\n <FormModal\n open={createModal.open}\n onOpenChange={createModal.onOpenChange}\n title=\"Create Course\"\n description=\"Add a new course to the catalog.\"\n fields={COURSE_FIELDS}\n submitLabel=\"Create Course\"\n onSubmit={handleCreate}\n />\n </div>\n );\n}\n"],"mappings":"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"}
|