@burdenoff/microfe-crewfoundry 2026.626.1 → 2026.703.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/components/forms/ConfirmDialog.js +43 -0
- package/dist/crewfoundry/components/forms/ConfirmDialog.js.map +1 -0
- package/dist/crewfoundry/components/forms/FormModal.js +220 -0
- package/dist/crewfoundry/components/forms/FormModal.js.map +1 -0
- package/dist/crewfoundry/components/forms/formValues.js +20 -0
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -0
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +255 -65
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +28 -17
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +57 -53
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +32 -23
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +44 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +183 -57
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +214 -92
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +165 -131
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +163 -133
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +269 -54
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +225 -78
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +213 -59
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +287 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +49 -47
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +166 -59
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +274 -83
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +198 -88
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +216 -88
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +216 -66
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +6 -7
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +83 -68
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +167 -46
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +75 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +152 -79
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +75 -63
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +3 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +235 -87
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +199 -86
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +21 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +117 -45
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +249 -90
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +47 -45
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +262 -133
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +144 -77
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +306 -51
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,131 +1,146 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { useState as t } from "react";
|
|
3
|
+
import { BookOpen as n, Clock as r, GraduationCap as i, Play as a, Star as o, Users as s } from "lucide-react";
|
|
4
|
+
import { useNavigate as c } from "react-router-dom";
|
|
5
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as d, Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g, EmphasisPanel as _, GradientText as v, IllustratedEmptyState as y, NextSteps as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
import { useGlobalUi as S } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
6
8
|
//#region src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx
|
|
7
|
-
function
|
|
8
|
-
let
|
|
9
|
-
if (!
|
|
9
|
+
function C() {
|
|
10
|
+
let C = c(), { courses: w, enrollCourse: T } = e(), { showToast: E } = S(), [D, O] = t(!1), k = w[0];
|
|
11
|
+
if (!k) return /* @__PURE__ */ l("div", {
|
|
10
12
|
className: "p-6",
|
|
11
|
-
children: /* @__PURE__ */
|
|
13
|
+
children: /* @__PURE__ */ l(y, {
|
|
12
14
|
illustration: "empty-search",
|
|
13
15
|
title: "Course not found",
|
|
14
16
|
description: "This course is no longer available."
|
|
15
17
|
})
|
|
16
18
|
});
|
|
17
|
-
let
|
|
18
|
-
return /* @__PURE__ */
|
|
19
|
+
let A = Math.round(k.completed / k.enrolled * 100);
|
|
20
|
+
return /* @__PURE__ */ u("div", {
|
|
19
21
|
className: "space-y-6 p-6 max-w-4xl",
|
|
20
22
|
children: [
|
|
21
|
-
/* @__PURE__ */
|
|
23
|
+
/* @__PURE__ */ u("div", {
|
|
22
24
|
className: "flex items-center justify-between",
|
|
23
|
-
children: [/* @__PURE__ */
|
|
24
|
-
/* @__PURE__ */
|
|
25
|
+
children: [/* @__PURE__ */ u("div", { children: [
|
|
26
|
+
/* @__PURE__ */ u("div", {
|
|
25
27
|
className: "flex items-center gap-2 mb-1",
|
|
26
|
-
children: [/* @__PURE__ */
|
|
28
|
+
children: [/* @__PURE__ */ l("h1", {
|
|
27
29
|
className: "text-2xl font-semibold",
|
|
28
|
-
children: /* @__PURE__ */
|
|
29
|
-
}), /* @__PURE__ */
|
|
30
|
-
variant:
|
|
31
|
-
children:
|
|
30
|
+
children: /* @__PURE__ */ l(v, { children: k.title })
|
|
31
|
+
}), /* @__PURE__ */ l(d, {
|
|
32
|
+
variant: k.level === "beginner" ? "secondary" : k.level === "intermediate" ? "default" : "destructive",
|
|
33
|
+
children: k.level
|
|
32
34
|
})]
|
|
33
35
|
}),
|
|
34
|
-
/* @__PURE__ */
|
|
36
|
+
/* @__PURE__ */ u("p", {
|
|
35
37
|
className: "text-sm text-text-secondary",
|
|
36
38
|
children: [
|
|
37
39
|
"by ",
|
|
38
|
-
|
|
40
|
+
k.instructor,
|
|
39
41
|
" · ",
|
|
40
|
-
|
|
42
|
+
k.category
|
|
41
43
|
]
|
|
42
44
|
}),
|
|
43
|
-
/* @__PURE__ */
|
|
45
|
+
/* @__PURE__ */ l(x, {
|
|
44
46
|
className: "mt-2",
|
|
45
47
|
children: "Everything you need to decide on and start this course — what it covers, who it's for, and how others have done — so you can enroll with confidence and build the right skills."
|
|
46
48
|
})
|
|
47
|
-
] }), /* @__PURE__ */
|
|
49
|
+
] }), /* @__PURE__ */ u(f, {
|
|
50
|
+
onClick: async () => {
|
|
51
|
+
O(!0);
|
|
52
|
+
try {
|
|
53
|
+
await T(k.id), E("Enrolled — your course is ready", "success");
|
|
54
|
+
} catch (e) {
|
|
55
|
+
E(e instanceof Error ? e.message : "Unable to enroll in course", "error");
|
|
56
|
+
} finally {
|
|
57
|
+
O(!1);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
disabled: D,
|
|
61
|
+
children: [/* @__PURE__ */ l(a, { className: "h-4 w-4 mr-1" }), D ? "Enrolling…" : "Start Course"]
|
|
62
|
+
})]
|
|
48
63
|
}),
|
|
49
|
-
/* @__PURE__ */
|
|
64
|
+
/* @__PURE__ */ l(b, {
|
|
50
65
|
storageKey: "crewfoundry-course-details",
|
|
51
66
|
steps: [
|
|
52
67
|
{
|
|
53
68
|
id: "start",
|
|
54
69
|
label: "Start the first module",
|
|
55
70
|
description: "Begin learning and track your progress as you go.",
|
|
56
|
-
icon: /* @__PURE__ */
|
|
57
|
-
onClick: () =>
|
|
71
|
+
icon: /* @__PURE__ */ l(a, { className: "h-4 w-4" }),
|
|
72
|
+
onClick: () => C("../../learning/course-learning-page")
|
|
58
73
|
},
|
|
59
74
|
{
|
|
60
75
|
id: "my-learning",
|
|
61
76
|
label: "See all your learning",
|
|
62
77
|
description: "Review everything you are currently enrolled in.",
|
|
63
|
-
icon: /* @__PURE__ */
|
|
64
|
-
onClick: () =>
|
|
78
|
+
icon: /* @__PURE__ */ l(i, { className: "h-4 w-4" }),
|
|
79
|
+
onClick: () => C("../../learning/my-learning-page")
|
|
65
80
|
},
|
|
66
81
|
{
|
|
67
82
|
id: "browse",
|
|
68
83
|
label: "Browse more courses",
|
|
69
84
|
description: "Find related training to round out your skills.",
|
|
70
|
-
icon: /* @__PURE__ */
|
|
71
|
-
onClick: () =>
|
|
85
|
+
icon: /* @__PURE__ */ l(n, { className: "h-4 w-4" }),
|
|
86
|
+
onClick: () => C("../../learning/courses-page")
|
|
72
87
|
}
|
|
73
88
|
]
|
|
74
89
|
}),
|
|
75
|
-
/* @__PURE__ */
|
|
90
|
+
/* @__PURE__ */ u("div", {
|
|
76
91
|
className: "grid gap-4 md:grid-cols-4",
|
|
77
92
|
children: [
|
|
78
|
-
/* @__PURE__ */
|
|
93
|
+
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
79
94
|
className: "p-4 text-center",
|
|
80
95
|
children: [
|
|
81
|
-
/* @__PURE__ */
|
|
82
|
-
/* @__PURE__ */
|
|
96
|
+
/* @__PURE__ */ l(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
97
|
+
/* @__PURE__ */ l("p", {
|
|
83
98
|
className: "text-lg font-bold",
|
|
84
|
-
children:
|
|
99
|
+
children: k.duration
|
|
85
100
|
}),
|
|
86
|
-
/* @__PURE__ */
|
|
101
|
+
/* @__PURE__ */ l("p", {
|
|
87
102
|
className: "text-xs text-text-secondary",
|
|
88
103
|
children: "Duration"
|
|
89
104
|
})
|
|
90
105
|
]
|
|
91
106
|
}) }),
|
|
92
|
-
/* @__PURE__ */
|
|
107
|
+
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
93
108
|
className: "p-4 text-center",
|
|
94
109
|
children: [
|
|
95
|
-
/* @__PURE__ */
|
|
96
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ l(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
111
|
+
/* @__PURE__ */ l("p", {
|
|
97
112
|
className: "text-lg font-bold",
|
|
98
|
-
children:
|
|
113
|
+
children: k.modules
|
|
99
114
|
}),
|
|
100
|
-
/* @__PURE__ */
|
|
115
|
+
/* @__PURE__ */ l("p", {
|
|
101
116
|
className: "text-xs text-text-secondary",
|
|
102
117
|
children: "Modules"
|
|
103
118
|
})
|
|
104
119
|
]
|
|
105
120
|
}) }),
|
|
106
|
-
/* @__PURE__ */
|
|
121
|
+
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
107
122
|
className: "p-4 text-center",
|
|
108
123
|
children: [
|
|
109
|
-
/* @__PURE__ */
|
|
110
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ l(s, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
125
|
+
/* @__PURE__ */ l("p", {
|
|
111
126
|
className: "text-lg font-bold",
|
|
112
|
-
children:
|
|
127
|
+
children: k.enrolled
|
|
113
128
|
}),
|
|
114
|
-
/* @__PURE__ */
|
|
129
|
+
/* @__PURE__ */ l("p", {
|
|
115
130
|
className: "text-xs text-text-secondary",
|
|
116
131
|
children: "Enrolled"
|
|
117
132
|
})
|
|
118
133
|
]
|
|
119
134
|
}) }),
|
|
120
|
-
/* @__PURE__ */
|
|
135
|
+
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
121
136
|
className: "p-4 text-center",
|
|
122
137
|
children: [
|
|
123
|
-
/* @__PURE__ */
|
|
124
|
-
/* @__PURE__ */
|
|
138
|
+
/* @__PURE__ */ l(o, { className: "h-5 w-5 mx-auto text-status-warning-text mb-1" }),
|
|
139
|
+
/* @__PURE__ */ u("p", {
|
|
125
140
|
className: "text-lg font-bold",
|
|
126
|
-
children: [
|
|
141
|
+
children: [k.rating, "/5"]
|
|
127
142
|
}),
|
|
128
|
-
/* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ l("p", {
|
|
129
144
|
className: "text-xs text-text-secondary",
|
|
130
145
|
children: "Rating"
|
|
131
146
|
})
|
|
@@ -133,41 +148,41 @@ function x() {
|
|
|
133
148
|
}) })
|
|
134
149
|
]
|
|
135
150
|
}),
|
|
136
|
-
/* @__PURE__ */
|
|
137
|
-
/* @__PURE__ */
|
|
151
|
+
/* @__PURE__ */ u(_, { children: [
|
|
152
|
+
/* @__PURE__ */ l("div", {
|
|
138
153
|
className: "mb-2 text-lg font-semibold",
|
|
139
154
|
children: "About this Course"
|
|
140
155
|
}),
|
|
141
|
-
/* @__PURE__ */
|
|
156
|
+
/* @__PURE__ */ l("p", {
|
|
142
157
|
className: "text-sm text-text-secondary",
|
|
143
|
-
children:
|
|
158
|
+
children: k.description
|
|
144
159
|
}),
|
|
145
|
-
/* @__PURE__ */
|
|
160
|
+
/* @__PURE__ */ l("div", {
|
|
146
161
|
className: "flex flex-wrap gap-1 mt-3",
|
|
147
|
-
children:
|
|
162
|
+
children: k.skills.map((e) => /* @__PURE__ */ l(d, {
|
|
148
163
|
variant: "outline",
|
|
149
164
|
children: e
|
|
150
165
|
}, e))
|
|
151
166
|
})
|
|
152
167
|
] }),
|
|
153
|
-
/* @__PURE__ */
|
|
168
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l(h, { children: /* @__PURE__ */ l(g, { children: "Completion Statistics" }) }), /* @__PURE__ */ l(m, { children: /* @__PURE__ */ u("div", {
|
|
154
169
|
className: "space-y-2",
|
|
155
|
-
children: [/* @__PURE__ */
|
|
170
|
+
children: [/* @__PURE__ */ u("div", {
|
|
156
171
|
className: "flex justify-between text-sm",
|
|
157
|
-
children: [/* @__PURE__ */
|
|
158
|
-
|
|
172
|
+
children: [/* @__PURE__ */ u("span", { children: [
|
|
173
|
+
k.completed,
|
|
159
174
|
" of ",
|
|
160
|
-
|
|
175
|
+
k.enrolled,
|
|
161
176
|
" students completed"
|
|
162
|
-
] }), /* @__PURE__ */
|
|
177
|
+
] }), /* @__PURE__ */ u("span", {
|
|
163
178
|
className: "font-medium",
|
|
164
|
-
children: [
|
|
179
|
+
children: [A, "%"]
|
|
165
180
|
})]
|
|
166
|
-
}), /* @__PURE__ */
|
|
181
|
+
}), /* @__PURE__ */ l("div", {
|
|
167
182
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
168
|
-
children: /* @__PURE__ */
|
|
183
|
+
children: /* @__PURE__ */ l("div", {
|
|
169
184
|
className: "h-3 bg-status-success-text rounded",
|
|
170
|
-
style: { width: `${
|
|
185
|
+
style: { width: `${A}%` }
|
|
171
186
|
})
|
|
172
187
|
})]
|
|
173
188
|
}) })] })
|
|
@@ -175,6 +190,6 @@ function x() {
|
|
|
175
190
|
});
|
|
176
191
|
}
|
|
177
192
|
//#endregion
|
|
178
|
-
export {
|
|
193
|
+
export { C as LearningCourseDetailsPagePage };
|
|
179
194
|
|
|
180
195
|
//# sourceMappingURL=LearningCourseDetailsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningCourseDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Clock, GraduationCap, Play, Star, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningCourseDetailsPagePage() {\n const navigate = useNavigate();\n const { courses } = useCrewFoundryStore();\n const course = courses[0];\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 />\n </div>\n );\n const completionRate = Math.round((course.completed / course.enrolled) * 100);\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{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-2\">\n Everything you need to decide on and start this course — what it covers, who it's\n for, and how others have done — so you can enroll with confidence and build the right\n skills.\n </PagePurpose>\n </div>\n <Button>\n <Play className=\"h-4 w-4 mr-1\" />\n Start Course\n </Button>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-course-details\"\n steps={[\n {\n id: 'start',\n label: 'Start the first module',\n description: 'Begin learning and track your progress as you go.',\n icon: <Play className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/course-learning-page'),\n },\n {\n id: 'my-learning',\n label: 'See all your learning',\n description: 'Review everything you are currently enrolled in.',\n icon: <GraduationCap className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/my-learning-page'),\n },\n {\n id: 'browse',\n label: 'Browse more courses',\n description: 'Find related training to round out your skills.',\n icon: <BookOpen className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/courses-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Clock className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <BookOpen className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <Card>\n <CardContent className=\"p-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-status-warning-text mb-1\" />\n <p className=\"text-lg font-bold\">{course.rating}/5</p>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">About this Course</div>\n <p className=\"text-sm text-text-secondary\">{course.description}</p>\n <div className=\"flex flex-wrap gap-1 mt-3\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\">\n {s}\n </Badge>\n ))}\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Completion Statistics</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {course.completed} of {course.enrolled} students completed\n </span>\n <span className=\"font-medium\">{completionRate}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-status-success-text rounded\"\n style={{ width: `${completionRate}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"LearningCourseDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Clock, GraduationCap, Play, Star, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useState } from 'react';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningCourseDetailsPagePage() {\n const navigate = useNavigate();\n const { courses, enrollCourse } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [enrolling, setEnrolling] = useState(false);\n const course = courses[0];\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 />\n </div>\n );\n const completionRate = Math.round((course.completed / course.enrolled) * 100);\n\n const handleStart = async () => {\n setEnrolling(true);\n try {\n await enrollCourse(course.id);\n showToast('Enrolled — your course is ready', 'success');\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to enroll in course', 'error');\n } finally {\n setEnrolling(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{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-2\">\n Everything you need to decide on and start this course — what it covers, who it's\n for, and how others have done — so you can enroll with confidence and build the right\n skills.\n </PagePurpose>\n </div>\n <Button onClick={handleStart} disabled={enrolling}>\n <Play className=\"h-4 w-4 mr-1\" />\n {enrolling ? 'Enrolling…' : 'Start Course'}\n </Button>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-course-details\"\n steps={[\n {\n id: 'start',\n label: 'Start the first module',\n description: 'Begin learning and track your progress as you go.',\n icon: <Play className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/course-learning-page'),\n },\n {\n id: 'my-learning',\n label: 'See all your learning',\n description: 'Review everything you are currently enrolled in.',\n icon: <GraduationCap className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/my-learning-page'),\n },\n {\n id: 'browse',\n label: 'Browse more courses',\n description: 'Find related training to round out your skills.',\n icon: <BookOpen className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/courses-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Clock className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <BookOpen className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\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 <Card>\n <CardContent className=\"p-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-status-warning-text mb-1\" />\n <p className=\"text-lg font-bold\">{course.rating}/5</p>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">About this Course</div>\n <p className=\"text-sm text-text-secondary\">{course.description}</p>\n <div className=\"flex flex-wrap gap-1 mt-3\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\">\n {s}\n </Badge>\n ))}\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Completion Statistics</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {course.completed} of {course.enrolled} students completed\n </span>\n <span className=\"font-medium\">{completionRate}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-status-success-text rounded\"\n style={{ width: `${completionRate}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,68 +1,164 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
2
|
+
import { FormModal as t, useFormModal as n } from "../components/forms/FormModal.js";
|
|
3
|
+
import { useState as r } from "react";
|
|
4
|
+
import { Plus as i, Search as a, Star as o, Users as s } from "lucide-react";
|
|
5
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as u, Button as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, IllustratedEmptyState as v, Input as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
6
7
|
//#region src/crewfoundry/pages/LearningCoursesPagePage.tsx
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
var x = [
|
|
9
|
+
{
|
|
10
|
+
name: "title",
|
|
11
|
+
label: "Course Title",
|
|
12
|
+
type: "text",
|
|
13
|
+
required: !0,
|
|
14
|
+
colSpan: 2
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "category",
|
|
18
|
+
label: "Category",
|
|
19
|
+
type: "text",
|
|
20
|
+
required: !0
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "instructor",
|
|
24
|
+
label: "Instructor",
|
|
25
|
+
type: "text",
|
|
26
|
+
required: !0
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
name: "duration",
|
|
30
|
+
label: "Duration",
|
|
31
|
+
type: "text",
|
|
32
|
+
required: !0,
|
|
33
|
+
placeholder: "e.g. 6 weeks"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
name: "modules",
|
|
37
|
+
label: "Modules",
|
|
38
|
+
type: "number",
|
|
39
|
+
required: !0,
|
|
40
|
+
placeholder: "e.g. 8"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: "level",
|
|
44
|
+
label: "Level",
|
|
45
|
+
type: "select",
|
|
46
|
+
required: !0,
|
|
47
|
+
options: [
|
|
48
|
+
{
|
|
49
|
+
label: "Beginner",
|
|
50
|
+
value: "beginner"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
label: "Intermediate",
|
|
54
|
+
value: "intermediate"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
label: "Advanced",
|
|
58
|
+
value: "advanced"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "status",
|
|
64
|
+
label: "Status",
|
|
65
|
+
type: "select",
|
|
66
|
+
required: !0,
|
|
67
|
+
options: [
|
|
68
|
+
{
|
|
69
|
+
label: "Active",
|
|
70
|
+
value: "active"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
label: "Draft",
|
|
74
|
+
value: "draft"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
label: "Archived",
|
|
78
|
+
value: "archived"
|
|
79
|
+
}
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
name: "description",
|
|
84
|
+
label: "Description",
|
|
85
|
+
type: "textarea",
|
|
86
|
+
required: !0,
|
|
87
|
+
colSpan: 2
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "skills",
|
|
91
|
+
label: "Skills",
|
|
92
|
+
type: "tags",
|
|
93
|
+
placeholder: "Add a skill and press Enter",
|
|
94
|
+
colSpan: 2
|
|
95
|
+
}
|
|
96
|
+
];
|
|
97
|
+
function S() {
|
|
98
|
+
let { courses: S, addCourse: C } = e(), [w, T] = r(""), E = n(), D = S.filter((e) => `${e.title} ${e.category} ${e.instructor}`.toLowerCase().includes(w.toLowerCase()));
|
|
99
|
+
return /* @__PURE__ */ l("div", {
|
|
10
100
|
className: "space-y-6 p-6",
|
|
11
101
|
children: [
|
|
12
|
-
/* @__PURE__ */
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
102
|
+
/* @__PURE__ */ l("div", {
|
|
103
|
+
className: "flex flex-wrap items-start justify-between gap-3",
|
|
104
|
+
children: [/* @__PURE__ */ l("div", { children: [
|
|
105
|
+
/* @__PURE__ */ c("h1", {
|
|
106
|
+
className: "text-2xl font-semibold",
|
|
107
|
+
children: /* @__PURE__ */ c(_, { children: "Course Catalog" })
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ l("p", {
|
|
110
|
+
className: "text-sm text-text-secondary",
|
|
111
|
+
children: [S.length, " courses available"]
|
|
112
|
+
}),
|
|
113
|
+
/* @__PURE__ */ c(b, {
|
|
114
|
+
className: "mt-1",
|
|
115
|
+
children: "Browse the course catalog — find training to grow your team's skills and enroll in the programs that fit your goals."
|
|
116
|
+
})
|
|
117
|
+
] }), /* @__PURE__ */ l(d, {
|
|
118
|
+
onClick: () => E.openModal(),
|
|
119
|
+
children: [/* @__PURE__ */ c(i, { className: "mr-1 h-4 w-4" }), "Create Course"]
|
|
120
|
+
})]
|
|
121
|
+
}),
|
|
122
|
+
/* @__PURE__ */ l("div", {
|
|
27
123
|
className: "relative max-w-sm",
|
|
28
|
-
children: [/* @__PURE__ */ a
|
|
124
|
+
children: [/* @__PURE__ */ c(a, { className: "absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-text-secondary" }), /* @__PURE__ */ c(y, {
|
|
29
125
|
placeholder: "Search courses...",
|
|
30
126
|
className: "pl-9",
|
|
31
|
-
value:
|
|
32
|
-
onChange: (e) =>
|
|
127
|
+
value: w,
|
|
128
|
+
onChange: (e) => T(e.target.value)
|
|
33
129
|
})]
|
|
34
130
|
}),
|
|
35
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ c("div", {
|
|
36
132
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
37
|
-
children:
|
|
133
|
+
children: D.length === 0 ? /* @__PURE__ */ c("div", {
|
|
38
134
|
className: "col-span-full",
|
|
39
|
-
children: /* @__PURE__ */
|
|
135
|
+
children: /* @__PURE__ */ c(v, {
|
|
40
136
|
illustration: "empty-search",
|
|
41
137
|
title: "No courses found",
|
|
42
138
|
description: "Try a different search term to find training."
|
|
43
139
|
})
|
|
44
|
-
}) :
|
|
140
|
+
}) : D.map((e, t) => /* @__PURE__ */ l(g, {
|
|
45
141
|
treatment: t === 0 ? "glass" : "plain",
|
|
46
142
|
glow: t === 0,
|
|
47
143
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
48
|
-
children: [/* @__PURE__ */
|
|
49
|
-
/* @__PURE__ */
|
|
144
|
+
children: [/* @__PURE__ */ l(m, { children: [
|
|
145
|
+
/* @__PURE__ */ l("div", {
|
|
50
146
|
className: "flex items-center justify-between",
|
|
51
|
-
children: [/* @__PURE__ */
|
|
147
|
+
children: [/* @__PURE__ */ c(u, {
|
|
52
148
|
variant: "outline",
|
|
53
149
|
className: "text-[10px]",
|
|
54
150
|
children: e.category
|
|
55
|
-
}), /* @__PURE__ */
|
|
151
|
+
}), /* @__PURE__ */ c(u, {
|
|
56
152
|
variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
|
|
57
153
|
className: "text-[10px]",
|
|
58
154
|
children: e.level
|
|
59
155
|
})]
|
|
60
156
|
}),
|
|
61
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ c(h, {
|
|
62
158
|
className: "text-base mt-2",
|
|
63
159
|
children: e.title
|
|
64
160
|
}),
|
|
65
|
-
/* @__PURE__ */
|
|
161
|
+
/* @__PURE__ */ l(p, { children: [
|
|
66
162
|
e.instructor,
|
|
67
163
|
" · ",
|
|
68
164
|
e.duration,
|
|
@@ -70,44 +166,69 @@ function _() {
|
|
|
70
166
|
e.modules,
|
|
71
167
|
" modules"
|
|
72
168
|
] })
|
|
73
|
-
] }), /* @__PURE__ */
|
|
74
|
-
/* @__PURE__ */
|
|
169
|
+
] }), /* @__PURE__ */ l(f, { children: [
|
|
170
|
+
/* @__PURE__ */ c("p", {
|
|
75
171
|
className: "text-sm text-text-secondary mb-3",
|
|
76
172
|
children: e.description
|
|
77
173
|
}),
|
|
78
|
-
/* @__PURE__ */
|
|
174
|
+
/* @__PURE__ */ c("div", {
|
|
79
175
|
className: "flex flex-wrap gap-1 mb-3",
|
|
80
|
-
children: e.skills.map((e) => /* @__PURE__ */
|
|
176
|
+
children: e.skills.map((e) => /* @__PURE__ */ c(u, {
|
|
81
177
|
variant: "outline",
|
|
82
178
|
className: "text-[9px]",
|
|
83
179
|
children: e
|
|
84
180
|
}, e))
|
|
85
181
|
}),
|
|
86
|
-
/* @__PURE__ */
|
|
182
|
+
/* @__PURE__ */ l("div", {
|
|
87
183
|
className: "flex items-center justify-between text-xs text-text-secondary",
|
|
88
184
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
185
|
+
/* @__PURE__ */ l("span", {
|
|
90
186
|
className: "flex items-center gap-1",
|
|
91
|
-
children: [/* @__PURE__ */
|
|
187
|
+
children: [/* @__PURE__ */ c(o, { className: "h-3 w-3 text-status-warning-text" }), e.rating]
|
|
92
188
|
}),
|
|
93
|
-
/* @__PURE__ */
|
|
189
|
+
/* @__PURE__ */ l("span", {
|
|
94
190
|
className: "flex items-center gap-1",
|
|
95
191
|
children: [
|
|
96
|
-
/* @__PURE__ */
|
|
192
|
+
/* @__PURE__ */ c(s, { className: "h-3 w-3" }),
|
|
97
193
|
e.enrolled,
|
|
98
194
|
" enrolled"
|
|
99
195
|
]
|
|
100
196
|
}),
|
|
101
|
-
/* @__PURE__ */
|
|
197
|
+
/* @__PURE__ */ l("span", { children: [Math.round(e.completed / e.enrolled * 100), "% completion"] })
|
|
102
198
|
]
|
|
103
199
|
})
|
|
104
200
|
] })]
|
|
105
201
|
}, e.id))
|
|
202
|
+
}),
|
|
203
|
+
/* @__PURE__ */ c(t, {
|
|
204
|
+
open: E.open,
|
|
205
|
+
onOpenChange: E.onOpenChange,
|
|
206
|
+
title: "Create Course",
|
|
207
|
+
description: "Add a new course to the catalog.",
|
|
208
|
+
fields: x,
|
|
209
|
+
submitLabel: "Create Course",
|
|
210
|
+
onSubmit: async (e) => {
|
|
211
|
+
await C({
|
|
212
|
+
id: `course-${Date.now()}`,
|
|
213
|
+
title: String(e.title ?? ""),
|
|
214
|
+
category: String(e.category ?? ""),
|
|
215
|
+
instructor: String(e.instructor ?? ""),
|
|
216
|
+
duration: String(e.duration ?? ""),
|
|
217
|
+
level: String(e.level ?? "beginner"),
|
|
218
|
+
enrolled: 0,
|
|
219
|
+
completed: 0,
|
|
220
|
+
rating: 0,
|
|
221
|
+
status: String(e.status ?? "draft"),
|
|
222
|
+
description: String(e.description ?? ""),
|
|
223
|
+
modules: typeof e.modules == "number" ? e.modules : Number(e.modules) || 0,
|
|
224
|
+
skills: Array.isArray(e.skills) ? e.skills : []
|
|
225
|
+
});
|
|
226
|
+
}
|
|
106
227
|
})
|
|
107
228
|
]
|
|
108
229
|
});
|
|
109
230
|
}
|
|
110
231
|
//#endregion
|
|
111
|
-
export {
|
|
232
|
+
export { S as LearningCoursesPagePage };
|
|
112
233
|
|
|
113
234
|
//# 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 CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n Input,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Search, Star, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningCoursesPagePage() {\n const { courses } = useCrewFoundryStore();\n const [search, setSearch] = useState('');\n const filtered = courses.filter((c) =>\n `${c.title} ${c.category} ${c.instructor}`.toLowerCase().includes(search.toLowerCase())\n );\n\n return (\n <div className=\"space-y-6 p-6\">\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 <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 </div>\n );\n}\n"],"mappings":";;;;;;AAgBA,SAAgB,IAA0B;CACxC,IAAM,EAAE,eAAY,GAAqB,EACnC,CAAC,GAAQ,KAAa,EAAS,GAAG,EAClC,IAAW,EAAQ,QAAQ,MAC/B,GAAG,EAAE,MAAM,GAAG,EAAE,SAAS,GAAG,EAAE,aAAa,aAAa,CAAC,SAAS,EAAO,aAAa,CAAC,CACxF;AAED,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD,EAAA,UAAA;IACE,kBAAC,MAAD;KAAI,WAAU;eACZ,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;KACxC,CAAA;IACL,kBAAC,KAAD;KAAG,WAAU;eAAb,CAA4C,EAAQ,QAAO,qBAAsB;;IACjF,kBAAC,GAAD;KAAa,WAAU;eAAO;KAAuI,CAAA;IACjK,EAAA,CAAA;GACN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,wEAAyE,CAAA,EAC3F,kBAAC,GAAD;KACE,aAAY;KACZ,WAAU;KACV,OAAO;KACP,WAAW,MAAM,EAAU,EAAE,OAAO,MAAM;KAC1C,CAAA,CACE;;GACN,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAS,WAAW,IACnB,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,GAAD;MAAuB,cAAa;MAAe,OAAM;MAAmB,aAAY;MAAkD,CAAA;KACtI,CAAA,GAEN,EAAS,KAAK,GAAQ,MACtB,kBAAC,GAAD;KAA2B,WAAW,MAAS,IAAI,UAAU;KAAS,MAAM,MAAS;KAAG,WAAU;eAAlG,CACE,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAO;QACF,CAAA,EACR,kBAAC,GAAD;QACE,SACE,EAAO,UAAU,aACb,cACA,EAAO,UAAU,iBACf,YACA;QAER,WAAU;kBAET,EAAO;QACF,CAAA,CACJ;;MACN,kBAAC,GAAD;OAAW,WAAU;iBAAkB,EAAO;OAAkB,CAAA;MAChE,kBAAC,GAAD,EAAA,UAAA;OACG,EAAO;OAAW;OAAI,EAAO;OAAS;OAAI,EAAO;OAAQ;OAC1C,EAAA,CAAA;MACP,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UAAA;MACE,kBAAC,KAAD;OAAG,WAAU;iBAAoC,EAAO;OAAgB,CAAA;MACxE,kBAAC,OAAD;OAAK,WAAU;iBACZ,EAAO,OAAO,KAAK,MAClB,kBAAC,GAAD;QAAe,SAAQ;QAAU,WAAU;kBACxC;QACK,EAFI,EAEJ,CACR;OACE,CAAA;MACN,kBAAC,OAAD;OAAK,WAAU;iBAAf;QACE,kBAAC,QAAD;SAAM,WAAU;mBAAhB,CACE,kBAAC,GAAD,EAAM,WAAU,oCAAqC,CAAA,EACpD,EAAO,OACH;;QACP,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;UAC5B,EAAO;UAAS;UACZ;;QACP,kBAAC,QAAD,EAAA,UAAA,CAAO,KAAK,MAAO,EAAO,YAAY,EAAO,WAAY,IAAI,EAAC,eAAmB,EAAA,CAAA;QAC7E;;MACM,EAAA,CAAA,CACJ;OA7CI,EAAO,GA6CX,CACZ;IACE,CAAA;GACF"}
|
|
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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"}
|