@burdenoff/microfe-crewfoundry 2026.625.1 → 2026.626.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 +37 -29
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +50 -42
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +39 -31
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +52 -44
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +46 -38
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +28 -15
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js +30 -22
- package/dist/crewfoundry/pages/CommunicationsCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js +87 -69
- package/dist/crewfoundry/pages/CommunicationsDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js +99 -80
- package/dist/crewfoundry/pages/CommunicationsFilesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +86 -67
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js +31 -15
- package/dist/crewfoundry/pages/CommunicationsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js +37 -29
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +42 -35
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +80 -62
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js +41 -33
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +142 -108
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +177 -136
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +44 -36
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +49 -38
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +112 -93
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +53 -46
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +31 -23
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +129 -90
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +96 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +26 -18
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +47 -35
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +33 -25
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +36 -28
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +27 -19
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +27 -19
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +93 -75
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +111 -70
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +65 -53
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +35 -19
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +33 -25
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +26 -18
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +80 -55
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +33 -17
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +31 -23
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +29 -21
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +35 -27
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +147 -112
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +31 -27
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +31 -23
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +104 -85
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js +75 -56
- package/dist/crewfoundry/pages/MarketplaceMessagingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js +78 -60
- package/dist/crewfoundry/pages/MarketplaceMyServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js +133 -92
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +93 -52
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +28 -20
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +84 -65
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js +25 -17
- package/dist/crewfoundry/pages/PaymentsPaymentDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js +58 -40
- package/dist/crewfoundry/pages/PaymentsPaymentMethodsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js +41 -33
- package/dist/crewfoundry/pages/PaymentsSecurityPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js +36 -29
- package/dist/crewfoundry/pages/ProjectsCreateProjectPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js +103 -72
- package/dist/crewfoundry/pages/ProjectsProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +43 -27
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js +28 -20
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +103 -62
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +83 -64
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js +185 -144
- package/dist/crewfoundry/pages/TeamsTeamSettingsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +40 -24
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,25 +1,33 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { BookOpen as t, GraduationCap as n, Star as r, TrendingUp as i, Users as a } from "lucide-react";
|
|
3
3
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h } from "@burdenoff/fe-libs/ui";
|
|
4
|
+
import { Badge as c, Card as l, CardContent as u, CardDescription as d, CardHeader as f, CardTitle as p, GlassCard as m, GradientText as h, PagePurpose as g } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/LearningLearningPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { courses:
|
|
6
|
+
function _() {
|
|
7
|
+
let { courses: _, learningPaths: v } = e(), y = _.reduce((e, t) => e + t.enrolled, 0), b = _.reduce((e, t) => e + t.completed, 0);
|
|
8
8
|
return /* @__PURE__ */ s("div", {
|
|
9
9
|
className: "space-y-6 p-6",
|
|
10
10
|
children: [
|
|
11
|
-
/* @__PURE__ */ s("div", { children: [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
/* @__PURE__ */ s("div", { children: [
|
|
12
|
+
/* @__PURE__ */ o("h1", {
|
|
13
|
+
className: "text-2xl font-semibold",
|
|
14
|
+
children: /* @__PURE__ */ o(h, { children: "Learning & Development" })
|
|
15
|
+
}),
|
|
16
|
+
/* @__PURE__ */ o("p", {
|
|
17
|
+
className: "text-sm text-text-secondary",
|
|
18
|
+
children: "Explore courses, learning paths, and grow your skills"
|
|
19
|
+
}),
|
|
20
|
+
/* @__PURE__ */ o(g, {
|
|
21
|
+
className: "mt-1",
|
|
22
|
+
children: "Your learning home — discover courses, continue where you left off, and keep developing the skills your role needs."
|
|
23
|
+
})
|
|
24
|
+
] }),
|
|
18
25
|
/* @__PURE__ */ s("div", {
|
|
19
26
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
20
27
|
children: [
|
|
21
28
|
/* @__PURE__ */ s(m, {
|
|
22
|
-
treatment: "
|
|
29
|
+
treatment: "glass",
|
|
30
|
+
glow: !0,
|
|
23
31
|
className: "border-border-seam",
|
|
24
32
|
children: [/* @__PURE__ */ s(f, {
|
|
25
33
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
@@ -29,7 +37,7 @@ function g() {
|
|
|
29
37
|
}), /* @__PURE__ */ o(t, { className: "h-4 w-4 text-text-secondary" })]
|
|
30
38
|
}), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ o("div", {
|
|
31
39
|
className: "text-2xl font-bold tabular-nums",
|
|
32
|
-
children:
|
|
40
|
+
children: _.length
|
|
33
41
|
}), /* @__PURE__ */ o("p", {
|
|
34
42
|
className: "text-xs text-text-secondary",
|
|
35
43
|
children: "Active courses"
|
|
@@ -46,7 +54,7 @@ function g() {
|
|
|
46
54
|
}), /* @__PURE__ */ o(a, { className: "h-4 w-4 text-text-secondary" })]
|
|
47
55
|
}), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o("div", {
|
|
48
56
|
className: "text-2xl font-bold tabular-nums",
|
|
49
|
-
children:
|
|
57
|
+
children: y
|
|
50
58
|
}) })]
|
|
51
59
|
}),
|
|
52
60
|
/* @__PURE__ */ s(m, {
|
|
@@ -60,7 +68,7 @@ function g() {
|
|
|
60
68
|
}), /* @__PURE__ */ o(n, { className: "h-4 w-4 text-status-success-text" })]
|
|
61
69
|
}), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o("div", {
|
|
62
70
|
className: "text-2xl font-bold tabular-nums",
|
|
63
|
-
children:
|
|
71
|
+
children: b
|
|
64
72
|
}) })]
|
|
65
73
|
}),
|
|
66
74
|
/* @__PURE__ */ s(m, {
|
|
@@ -74,7 +82,7 @@ function g() {
|
|
|
74
82
|
}), /* @__PURE__ */ o(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
75
83
|
}), /* @__PURE__ */ o(u, { children: /* @__PURE__ */ o("div", {
|
|
76
84
|
className: "text-2xl font-bold tabular-nums",
|
|
77
|
-
children:
|
|
85
|
+
children: v.length
|
|
78
86
|
}) })]
|
|
79
87
|
})
|
|
80
88
|
]
|
|
@@ -84,7 +92,7 @@ function g() {
|
|
|
84
92
|
children: "Featured Courses"
|
|
85
93
|
}), /* @__PURE__ */ o("div", {
|
|
86
94
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
87
|
-
children:
|
|
95
|
+
children: _.slice(0, 3).map((e) => /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, {
|
|
88
96
|
className: "text-base",
|
|
89
97
|
children: e.title
|
|
90
98
|
}), /* @__PURE__ */ s(d, { children: [
|
|
@@ -133,7 +141,7 @@ function g() {
|
|
|
133
141
|
children: "Learning Paths"
|
|
134
142
|
}), /* @__PURE__ */ o("div", {
|
|
135
143
|
className: "grid gap-4 md:grid-cols-3",
|
|
136
|
-
children:
|
|
144
|
+
children: v.map((e) => /* @__PURE__ */ s(l, { children: [/* @__PURE__ */ s(f, { children: [/* @__PURE__ */ o(p, {
|
|
137
145
|
className: "text-base",
|
|
138
146
|
children: e.title
|
|
139
147
|
}), /* @__PURE__ */ o(d, { children: e.description })] }), /* @__PURE__ */ s(u, { children: [/* @__PURE__ */ s("div", {
|
|
@@ -165,6 +173,6 @@ function g() {
|
|
|
165
173
|
});
|
|
166
174
|
}
|
|
167
175
|
//#endregion
|
|
168
|
-
export {
|
|
176
|
+
export { _ as LearningLearningPagePage };
|
|
169
177
|
|
|
170
178
|
//# sourceMappingURL=LearningLearningPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPagePage.tsx"],"sourcesContent":["import {\n Badge,\n
|
|
1
|
+
{"version":3,"file":"LearningLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Award, BookOpen, GraduationCap, Star, TrendingUp, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningLearningPagePage() {\n const { courses, learningPaths } = useCrewFoundryStore();\n const totalEnrolled = courses.reduce((s, c) => s + c.enrolled, 0);\n const totalCompleted = courses.reduce((s, c) => s + c.completed, 0);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Learning & Development</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Explore courses, learning paths, and grow your skills\n </p>\n <PagePurpose className=\"mt-1\">Your learning home — discover courses, continue where you left off, and keep developing the skills your role needs.</PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-4\">\n <GlassCard treatment=\"glass\" glow className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Courses</CardTitle>\n <BookOpen className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{courses.length}</div>\n <p className=\"text-xs text-text-secondary\">Active courses</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\">Enrolled</CardTitle>\n <Users className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalEnrolled}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <GraduationCap className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{totalCompleted}</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\">Paths</CardTitle>\n <TrendingUp className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{learningPaths.length}</div>\n </CardContent>\n </GlassCard>\n </div>\n <div>\n <h2 className=\"text-lg font-medium mb-3\">Featured Courses</h2>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {courses.slice(0, 3).map((course) => (\n <Card key={course.id}>\n <CardHeader>\n <CardTitle className=\"text-base\">{course.title}</CardTitle>\n <CardDescription>\n {course.instructor} · {course.duration}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-text-secondary mb-3\">{course.description}</p>\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span className=\"text-sm\">{course.rating}</span>\n </div>\n <div className=\"flex gap-1\">\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {course.level}\n </Badge>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {course.category}\n </Badge>\n </div>\n </div>\n <div className=\"mt-2 text-xs text-text-secondary\">\n {course.enrolled} enrolled · {course.completed} completed\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n <div>\n <h2 className=\"text-lg font-medium mb-3\">Learning Paths</h2>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {learningPaths.map((path) => (\n <Card key={path.id}>\n <CardHeader>\n <CardTitle className=\"text-base\">{path.title}</CardTitle>\n <CardDescription>{path.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span>\n {path.courses.length} courses · {path.duration}\n </span>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {path.level}\n </Badge>\n </div>\n <div className=\"mt-2 space-y-1\">\n <div className=\"flex justify-between text-xs\">\n <span>{path.enrolled} enrolled</span>\n <span>{path.completionRate}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${path.completionRate}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { BookOpen as t, CheckCircle as n, Clock as r, Star as i, Users as a } from "lucide-react";
|
|
3
3
|
import { jsx as o, jsxs as s } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as c, Button as l, Card as u, CardContent as d,
|
|
4
|
+
import { Badge as c, Button as l, Card as u, CardContent as d, EmphasisPanel as f, GradientText as p, IllustratedEmptyState as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx
|
|
6
6
|
function g() {
|
|
7
7
|
let { learningPaths: g, courses: _ } = e(), v = g[0];
|
|
8
8
|
if (!v) return /* @__PURE__ */ o("div", {
|
|
9
|
-
className: "p-6
|
|
10
|
-
children:
|
|
9
|
+
className: "p-6",
|
|
10
|
+
children: /* @__PURE__ */ o(m, {
|
|
11
|
+
illustration: "empty-search",
|
|
12
|
+
title: "No learning path found",
|
|
13
|
+
description: "This learning path is no longer available."
|
|
14
|
+
})
|
|
11
15
|
});
|
|
12
16
|
let y = _.filter((e) => v.courses.includes(e.id));
|
|
13
17
|
return /* @__PURE__ */ s("div", {
|
|
@@ -15,13 +19,20 @@ function g() {
|
|
|
15
19
|
children: [
|
|
16
20
|
/* @__PURE__ */ s("div", {
|
|
17
21
|
className: "flex items-center justify-between",
|
|
18
|
-
children: [/* @__PURE__ */ s("div", { children: [
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
children: [/* @__PURE__ */ s("div", { children: [
|
|
23
|
+
/* @__PURE__ */ o("h1", {
|
|
24
|
+
className: "text-2xl font-semibold",
|
|
25
|
+
children: /* @__PURE__ */ o(p, { children: v.title })
|
|
26
|
+
}),
|
|
27
|
+
/* @__PURE__ */ o("p", {
|
|
28
|
+
className: "text-sm text-text-secondary",
|
|
29
|
+
children: v.description
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ o(h, {
|
|
32
|
+
className: "mt-1",
|
|
33
|
+
children: "Follow a single learning path end-to-end — see its courses, your progress, and what to complete next to finish the journey."
|
|
34
|
+
})
|
|
35
|
+
] }), /* @__PURE__ */ o(l, { children: "Enroll Now" })]
|
|
25
36
|
}),
|
|
26
37
|
/* @__PURE__ */ s("div", {
|
|
27
38
|
className: "grid gap-4 md:grid-cols-4",
|
|
@@ -84,53 +95,67 @@ function g() {
|
|
|
84
95
|
}) })
|
|
85
96
|
]
|
|
86
97
|
}),
|
|
87
|
-
/* @__PURE__ */ s(
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
className: "flex items-center gap-3 rounded border p-4",
|
|
98
|
+
/* @__PURE__ */ s(f, { children: [
|
|
99
|
+
/* @__PURE__ */ o("div", {
|
|
100
|
+
className: "text-lg font-semibold",
|
|
101
|
+
children: "Courses in this Path"
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ s("p", {
|
|
104
|
+
className: "mb-4 text-sm text-text-secondary",
|
|
95
105
|
children: [
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}),
|
|
100
|
-
/* @__PURE__ */ s("div", {
|
|
101
|
-
className: "flex-1",
|
|
102
|
-
children: [/* @__PURE__ */ o("p", {
|
|
103
|
-
className: "text-sm font-medium",
|
|
104
|
-
children: e.title
|
|
105
|
-
}), /* @__PURE__ */ s("p", {
|
|
106
|
-
className: "text-xs text-text-secondary",
|
|
107
|
-
children: [
|
|
108
|
-
e.instructor,
|
|
109
|
-
" · ",
|
|
110
|
-
e.duration,
|
|
111
|
-
" · ",
|
|
112
|
-
e.modules,
|
|
113
|
-
" modules"
|
|
114
|
-
]
|
|
115
|
-
})]
|
|
116
|
-
}),
|
|
117
|
-
/* @__PURE__ */ s("div", {
|
|
118
|
-
className: "flex items-center gap-2",
|
|
119
|
-
children: [/* @__PURE__ */ s("div", {
|
|
120
|
-
className: "flex items-center gap-1",
|
|
121
|
-
children: [/* @__PURE__ */ o(i, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ o("span", {
|
|
122
|
-
className: "text-sm",
|
|
123
|
-
children: e.rating
|
|
124
|
-
})]
|
|
125
|
-
}), /* @__PURE__ */ o(c, {
|
|
126
|
-
variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
|
|
127
|
-
className: "text-[10px]",
|
|
128
|
-
children: e.level
|
|
129
|
-
})]
|
|
130
|
-
})
|
|
106
|
+
y.length,
|
|
107
|
+
" courses · ",
|
|
108
|
+
v.level
|
|
131
109
|
]
|
|
132
|
-
},
|
|
133
|
-
|
|
110
|
+
}),
|
|
111
|
+
/* @__PURE__ */ o("div", {
|
|
112
|
+
className: "space-y-3",
|
|
113
|
+
children: y.length === 0 ? /* @__PURE__ */ o(m, {
|
|
114
|
+
illustration: "empty-generic",
|
|
115
|
+
title: "No courses in this path yet",
|
|
116
|
+
description: "Courses added to this path will appear here in order."
|
|
117
|
+
}) : y.map((e, t) => /* @__PURE__ */ s("div", {
|
|
118
|
+
className: "flex items-center gap-3 rounded border p-4",
|
|
119
|
+
children: [
|
|
120
|
+
/* @__PURE__ */ o("div", {
|
|
121
|
+
className: "flex-shrink-0 w-8 h-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-bold",
|
|
122
|
+
children: t + 1
|
|
123
|
+
}),
|
|
124
|
+
/* @__PURE__ */ s("div", {
|
|
125
|
+
className: "flex-1",
|
|
126
|
+
children: [/* @__PURE__ */ o("p", {
|
|
127
|
+
className: "text-sm font-medium",
|
|
128
|
+
children: e.title
|
|
129
|
+
}), /* @__PURE__ */ s("p", {
|
|
130
|
+
className: "text-xs text-text-secondary",
|
|
131
|
+
children: [
|
|
132
|
+
e.instructor,
|
|
133
|
+
" · ",
|
|
134
|
+
e.duration,
|
|
135
|
+
" · ",
|
|
136
|
+
e.modules,
|
|
137
|
+
" modules"
|
|
138
|
+
]
|
|
139
|
+
})]
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ s("div", {
|
|
142
|
+
className: "flex items-center gap-2",
|
|
143
|
+
children: [/* @__PURE__ */ s("div", {
|
|
144
|
+
className: "flex items-center gap-1",
|
|
145
|
+
children: [/* @__PURE__ */ o(i, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ o("span", {
|
|
146
|
+
className: "text-sm",
|
|
147
|
+
children: e.rating
|
|
148
|
+
})]
|
|
149
|
+
}), /* @__PURE__ */ o(c, {
|
|
150
|
+
variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
|
|
151
|
+
className: "text-[10px]",
|
|
152
|
+
children: e.level
|
|
153
|
+
})]
|
|
154
|
+
})
|
|
155
|
+
]
|
|
156
|
+
}, e.id))
|
|
157
|
+
})
|
|
158
|
+
] })
|
|
134
159
|
]
|
|
135
160
|
});
|
|
136
161
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningLearningPathDetailPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n
|
|
1
|
+
{"version":3,"file":"LearningLearningPathDetailPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, CheckCircle, Clock, Star, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningLearningPathDetailPagePage() {\n const { learningPaths, courses } = useCrewFoundryStore();\n const path = learningPaths[0];\n if (!path)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"No learning path found\"\n description=\"This learning path is no longer available.\"\n />\n </div>\n );\n const pathCourses = courses.filter((c) => path.courses.includes(c.id));\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 <h1 className=\"text-2xl font-semibold\">\n <GradientText>{path.title}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{path.description}</p>\n <PagePurpose className=\"mt-1\">Follow a single learning path end-to-end — see its courses, your progress, and what to complete next to finish the journey.</PagePurpose>\n </div>\n <Button>Enroll Now</Button>\n </div>\n <div className=\"grid gap-4 md:grid-cols-4\">\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\">{path.courses.length}</p>\n <p className=\"text-xs text-text-secondary\">Courses</p>\n </CardContent>\n </Card>\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\">{path.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=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{path.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 <CheckCircle className=\"h-5 w-5 mx-auto text-status-success-text mb-1\" />\n <p className=\"text-lg font-bold\">{path.completionRate}%</p>\n <p className=\"text-xs text-text-secondary\">Completion</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"text-lg font-semibold\">Courses in this Path</div>\n <p className=\"mb-4 text-sm text-text-secondary\">\n {pathCourses.length} courses · {path.level}\n </p>\n <div className=\"space-y-3\">\n {pathCourses.length === 0 ? (\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No courses in this path yet\"\n description=\"Courses added to this path will appear here in order.\"\n />\n ) : (\n pathCourses.map((course, idx) => (\n <div key={course.id} className=\"flex items-center gap-3 rounded border p-4\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-action-primary-bg/10 flex items-center justify-center text-sm font-bold\">\n {idx + 1}\n </div>\n <div className=\"flex-1\">\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {course.instructor} · {course.duration} · {course.modules} modules\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1\">\n <Star className=\"h-3 w-3 text-status-warning-text\" />\n <span className=\"text-sm\">{course.rating}</span>\n </div>\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 </div>\n ))\n )}\n </div>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,28 +1,44 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { BookOpen as t, GraduationCap as n } from "lucide-react";
|
|
3
3
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
-
import { Badge as a,
|
|
4
|
+
import { Badge as a, CardContent as o, CardDescription as s, CardHeader as c, CardTitle as l, GlassCard as u, GradientText as d, IllustratedEmptyState as f, PagePurpose as p } from "@burdenoff/fe-libs/ui";
|
|
5
5
|
//#region src/crewfoundry/pages/LearningLearningPathsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { learningPaths:
|
|
6
|
+
function m() {
|
|
7
|
+
let { learningPaths: m, courses: h } = e();
|
|
8
8
|
return /* @__PURE__ */ i("div", {
|
|
9
9
|
className: "space-y-6 p-6",
|
|
10
|
-
children: [/* @__PURE__ */ i("div", { children: [
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
10
|
+
children: [/* @__PURE__ */ i("div", { children: [
|
|
11
|
+
/* @__PURE__ */ r("h1", {
|
|
12
|
+
className: "text-2xl font-semibold",
|
|
13
|
+
children: /* @__PURE__ */ r(d, { children: "Learning Paths" })
|
|
14
|
+
}),
|
|
15
|
+
/* @__PURE__ */ r("p", {
|
|
16
|
+
className: "text-sm text-text-secondary",
|
|
17
|
+
children: "Structured learning journeys for career growth"
|
|
18
|
+
}),
|
|
19
|
+
/* @__PURE__ */ r(p, {
|
|
20
|
+
className: "mt-1",
|
|
21
|
+
children: "Structured learning journeys that string courses together — follow a path to build toward a role or skill set step by step."
|
|
22
|
+
})
|
|
23
|
+
] }), /* @__PURE__ */ r("div", {
|
|
17
24
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
18
|
-
children:
|
|
19
|
-
|
|
20
|
-
|
|
25
|
+
children: m.length === 0 ? /* @__PURE__ */ r("div", {
|
|
26
|
+
className: "col-span-full",
|
|
27
|
+
children: /* @__PURE__ */ r(f, {
|
|
28
|
+
illustration: "empty-generic",
|
|
29
|
+
title: "No learning paths yet",
|
|
30
|
+
description: "Learning paths will appear here once they are created."
|
|
31
|
+
})
|
|
32
|
+
}) : m.map((e, d) => {
|
|
33
|
+
let f = h.filter((t) => e.courses.includes(t.id));
|
|
34
|
+
return /* @__PURE__ */ i(u, {
|
|
35
|
+
treatment: d === 0 ? "glass" : "plain",
|
|
36
|
+
glow: d === 0,
|
|
21
37
|
className: "hover:shadow-md transition-shadow cursor-pointer",
|
|
22
|
-
children: [/* @__PURE__ */ i(
|
|
38
|
+
children: [/* @__PURE__ */ i(c, { children: [/* @__PURE__ */ r(l, {
|
|
23
39
|
className: "text-lg",
|
|
24
40
|
children: e.title
|
|
25
|
-
}), /* @__PURE__ */ r(
|
|
41
|
+
}), /* @__PURE__ */ r(s, { children: e.description })] }), /* @__PURE__ */ r(o, { children: /* @__PURE__ */ i("div", {
|
|
26
42
|
className: "space-y-3",
|
|
27
43
|
children: [
|
|
28
44
|
/* @__PURE__ */ i("div", {
|
|
@@ -43,7 +59,7 @@ function f() {
|
|
|
43
59
|
}),
|
|
44
60
|
/* @__PURE__ */ r("div", {
|
|
45
61
|
className: "space-y-1 mt-2",
|
|
46
|
-
children:
|
|
62
|
+
children: f.map((e) => /* @__PURE__ */ i("div", {
|
|
47
63
|
className: "flex items-center gap-2 text-xs text-text-secondary",
|
|
48
64
|
children: [/* @__PURE__ */ r(n, { className: "h-3 w-3" }), e.title]
|
|
49
65
|
}, e.id))
|
|
@@ -69,6 +85,6 @@ function f() {
|
|
|
69
85
|
});
|
|
70
86
|
}
|
|
71
87
|
//#endregion
|
|
72
|
-
export {
|
|
88
|
+
export { m as LearningLearningPathsPagePage };
|
|
73
89
|
|
|
74
90
|
//# sourceMappingURL=LearningLearningPathsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningLearningPathsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n
|
|
1
|
+
{"version":3,"file":"LearningLearningPathsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningLearningPathsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, GraduationCap, Users } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningLearningPathsPagePage() {\n const { learningPaths, courses } = useCrewFoundryStore();\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Learning Paths</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">\n Structured learning journeys for career growth\n </p>\n <PagePurpose className=\"mt-1\">Structured learning journeys that string courses together — follow a path to build toward a role or skill set step by step.</PagePurpose>\n </div>\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {learningPaths.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No learning paths yet\"\n description=\"Learning paths will appear here once they are created.\"\n />\n </div>\n ) : (\n learningPaths.map((path, _idx) => {\n const pathCourses = courses.filter((c) => path.courses.includes(c.id));\n return (\n <GlassCard\n key={path.id}\n treatment={_idx === 0 ? 'glass' : 'plain'}\n glow={_idx === 0}\n className=\"hover:shadow-md transition-shadow cursor-pointer\"\n >\n <CardHeader>\n <CardTitle className=\"text-lg\">{path.title}</CardTitle>\n <CardDescription>{path.description}</CardDescription>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-3\">\n <div className=\"flex items-center justify-between text-sm text-text-secondary\">\n <span className=\"flex items-center gap-1\">\n <BookOpen className=\"h-3 w-3\" />\n {path.courses.length} courses\n </span>\n <span>{path.duration}</span>\n </div>\n <Badge variant=\"outline\" className=\"text-[10px]\">\n {path.level}\n </Badge>\n <div className=\"space-y-1 mt-2\">\n {pathCourses.map((c) => (\n <div\n key={c.id}\n className=\"flex items-center gap-2 text-xs text-text-secondary\"\n >\n <GraduationCap className=\"h-3 w-3\" />\n {c.title}\n </div>\n ))}\n </div>\n <div className=\"pt-2 border-t\">\n <div className=\"flex justify-between text-xs mb-1\">\n <span>{path.enrolled} enrolled</span>\n <span>{path.completionRate}%</span>\n </div>\n <div className=\"h-2 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-2 bg-action-primary-bg rounded\"\n style={{ width: `${path.completionRate}%` }}\n />\n </div>\n </div>\n </div>\n </CardContent>\n </GlassCard>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;AAcA,SAAgB,IAAgC;CAC9C,IAAM,EAAE,kBAAe,eAAY,GAAqB;AAExD,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,OAAD,EAAA,UAAA;GACE,kBAAC,MAAD;IAAI,WAAU;cACZ,kBAAC,GAAD,EAAA,UAAc,kBAA6B,CAAA;IACxC,CAAA;GACL,kBAAC,KAAD;IAAG,WAAU;cAA8B;IAEvC,CAAA;GACJ,kBAAC,GAAD;IAAa,WAAU;cAAO;IAAyI,CAAA;GACnK,EAAA,CAAA,EACN,kBAAC,OAAD;GAAK,WAAU;aACZ,EAAc,WAAW,IACxB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KACE,cAAa;KACb,OAAM;KACN,aAAY;KACZ,CAAA;IACE,CAAA,GAEN,EAAc,KAAK,GAAM,MAAS;IAChC,IAAM,IAAc,EAAQ,QAAQ,MAAM,EAAK,QAAQ,SAAS,EAAE,GAAG,CAAC;AACtE,WACE,kBAAC,GAAD;KAEE,WAAW,MAAS,IAAI,UAAU;KAClC,MAAM,MAAS;KACf,WAAU;eAJZ,CAMA,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD;MAAW,WAAU;gBAAW,EAAK;MAAkB,CAAA,EACvD,kBAAC,GAAD,EAAA,UAAkB,EAAK,aAA8B,CAAA,CAC1C,EAAA,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD;SAAM,WAAU;mBAAhB;UACE,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;UAC/B,EAAK,QAAQ;UAAO;UAChB;YACP,kBAAC,QAAD,EAAA,UAAO,EAAK,UAAgB,CAAA,CACxB;;OACN,kBAAC,GAAD;QAAO,SAAQ;QAAU,WAAU;kBAChC,EAAK;QACA,CAAA;OACR,kBAAC,OAAD;QAAK,WAAU;kBACZ,EAAY,KAAK,MAChB,kBAAC,OAAD;SAEE,WAAU;mBAFZ,CAIE,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA,EACpC,EAAE,MACC;WALC,EAAE,GAKH,CACN;QACE,CAAA;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACE,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAK,UAAS,YAAgB,EAAA,CAAA,EACrC,kBAAC,QAAD,EAAA,UAAA,CAAO,EAAK,gBAAe,IAAQ,EAAA,CAAA,CAC/B;YACN,kBAAC,OAAD;SAAK,WAAU;mBACb,kBAAC,OAAD;UACE,WAAU;UACV,OAAO,EAAE,OAAO,GAAG,EAAK,eAAe,IAAI;UAC3C,CAAA;SACE,CAAA,CACF;;OACF;SACM,CAAA,CACJ;OA9CH,EAAK,GA8CF;KAEZ;GAEA,CAAA,CACF"}
|
|
@@ -2,14 +2,14 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { Award as n, BookOpen as r, Clock as i, Play as a, Star as o } from "lucide-react";
|
|
4
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, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _ } from "@burdenoff/fe-libs/ui";
|
|
5
|
+
import { Badge as l, Button as u, Card as d, CardContent as f, CardDescription as p, CardHeader as m, CardTitle as h, GlassCard as g, GradientText as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/LearningMyLearningPagePage.tsx
|
|
7
|
-
var
|
|
7
|
+
var y = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), b = (e) => {
|
|
8
8
|
let t = new Date(e);
|
|
9
9
|
return Number.isNaN(t.getTime()) ? "Unknown" : t.toISOString().split("T")[0];
|
|
10
10
|
};
|
|
11
|
-
function
|
|
12
|
-
let { courses:
|
|
11
|
+
function x() {
|
|
12
|
+
let { courses: x } = e(), S = t(() => x.filter((e) => e.status === "active").slice(0, 8).map((e, t) => {
|
|
13
13
|
let n = Math.min(e.modules, Math.round(e.completed / Math.max(e.enrolled, 1) * e.modules)), r = Math.round(n / Math.max(e.modules, 1) * 100);
|
|
14
14
|
return {
|
|
15
15
|
id: e.id,
|
|
@@ -18,30 +18,38 @@ function b() {
|
|
|
18
18
|
modules: e.modules,
|
|
19
19
|
completedModules: n,
|
|
20
20
|
instructor: e.instructor,
|
|
21
|
-
dueDate:
|
|
21
|
+
dueDate: b(new Date(y + (t + 1) * 864e5 * 12).toISOString())
|
|
22
22
|
};
|
|
23
|
-
}), [
|
|
23
|
+
}), [x]), C = t(() => x.filter((e) => e.completed > 0).slice(0, 8).map((e, t) => ({
|
|
24
24
|
id: `completed-${e.id}`,
|
|
25
25
|
title: e.title,
|
|
26
|
-
completedDate:
|
|
26
|
+
completedDate: b((/* @__PURE__ */ new Date(y - (t + 1) * 864e5 * 15)).toISOString()),
|
|
27
27
|
rating: Number(e.rating.toFixed(1)),
|
|
28
28
|
certificate: e.completed / Math.max(e.enrolled, 1) > .35
|
|
29
|
-
})), [
|
|
29
|
+
})), [x]), w = S.reduce((e, t) => e + t.completedModules * 1.25, 0);
|
|
30
30
|
return /* @__PURE__ */ c("div", {
|
|
31
31
|
className: "space-y-6 p-6",
|
|
32
32
|
children: [
|
|
33
|
-
/* @__PURE__ */ c("div", { children: [
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
/* @__PURE__ */ c("div", { children: [
|
|
34
|
+
/* @__PURE__ */ s("h1", {
|
|
35
|
+
className: "text-2xl font-semibold",
|
|
36
|
+
children: /* @__PURE__ */ s(_, { children: "My Learning" })
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ s("p", {
|
|
39
|
+
className: "text-sm text-text-secondary",
|
|
40
|
+
children: "Track your learning progress and achievements"
|
|
41
|
+
}),
|
|
42
|
+
/* @__PURE__ */ s(v, {
|
|
43
|
+
className: "mt-1",
|
|
44
|
+
children: "Everything you're currently learning — track your enrolled courses, progress, and certificates earned all in one place."
|
|
45
|
+
})
|
|
46
|
+
] }),
|
|
40
47
|
/* @__PURE__ */ c("div", {
|
|
41
48
|
className: "grid gap-4 md:grid-cols-4",
|
|
42
49
|
children: [
|
|
43
50
|
/* @__PURE__ */ c(g, {
|
|
44
|
-
treatment: "
|
|
51
|
+
treatment: "glass",
|
|
52
|
+
glow: !0,
|
|
45
53
|
className: "border-border-seam",
|
|
46
54
|
children: [/* @__PURE__ */ c(m, {
|
|
47
55
|
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
@@ -51,7 +59,7 @@ function b() {
|
|
|
51
59
|
}), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-status-info-text" })]
|
|
52
60
|
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
53
61
|
className: "text-2xl font-bold tabular-nums",
|
|
54
|
-
children:
|
|
62
|
+
children: S.length
|
|
55
63
|
}) })]
|
|
56
64
|
}),
|
|
57
65
|
/* @__PURE__ */ c(g, {
|
|
@@ -65,7 +73,7 @@ function b() {
|
|
|
65
73
|
}), /* @__PURE__ */ s(n, { className: "h-4 w-4 text-status-success-text" })]
|
|
66
74
|
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
67
75
|
className: "text-2xl font-bold tabular-nums",
|
|
68
|
-
children:
|
|
76
|
+
children: C.length
|
|
69
77
|
}) })]
|
|
70
78
|
}),
|
|
71
79
|
/* @__PURE__ */ c(g, {
|
|
@@ -79,7 +87,7 @@ function b() {
|
|
|
79
87
|
}), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
80
88
|
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
81
89
|
className: "text-2xl font-bold tabular-nums",
|
|
82
|
-
children:
|
|
90
|
+
children: w.toFixed(1)
|
|
83
91
|
}) })]
|
|
84
92
|
}),
|
|
85
93
|
/* @__PURE__ */ c(g, {
|
|
@@ -93,14 +101,14 @@ function b() {
|
|
|
93
101
|
}), /* @__PURE__ */ s(n, { className: "h-4 w-4 text-status-warning-text" })]
|
|
94
102
|
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
95
103
|
className: "text-2xl font-bold tabular-nums",
|
|
96
|
-
children:
|
|
104
|
+
children: C.filter((e) => e.certificate).length
|
|
97
105
|
}) })]
|
|
98
106
|
})
|
|
99
107
|
]
|
|
100
108
|
}),
|
|
101
109
|
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ c(m, { children: [/* @__PURE__ */ s(h, { children: "In Progress" }), /* @__PURE__ */ s(p, { children: "Continue where you left off" })] }), /* @__PURE__ */ s(f, {
|
|
102
110
|
className: "space-y-4",
|
|
103
|
-
children:
|
|
111
|
+
children: S.map((e) => /* @__PURE__ */ c("div", {
|
|
104
112
|
className: "flex items-center gap-4 rounded border p-4",
|
|
105
113
|
children: [/* @__PURE__ */ c("div", {
|
|
106
114
|
className: "flex-1",
|
|
@@ -148,7 +156,7 @@ function b() {
|
|
|
148
156
|
})] }),
|
|
149
157
|
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(m, { children: /* @__PURE__ */ s(h, { children: "Completed" }) }), /* @__PURE__ */ s(f, {
|
|
150
158
|
className: "space-y-3",
|
|
151
|
-
children:
|
|
159
|
+
children: C.map((e) => /* @__PURE__ */ c("div", {
|
|
152
160
|
className: "flex items-center justify-between rounded border p-3",
|
|
153
161
|
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
154
162
|
className: "text-sm font-medium",
|
|
@@ -177,6 +185,6 @@ function b() {
|
|
|
177
185
|
});
|
|
178
186
|
}
|
|
179
187
|
//#endregion
|
|
180
|
-
export {
|
|
188
|
+
export { x as LearningMyLearningPagePage };
|
|
181
189
|
|
|
182
190
|
//# sourceMappingURL=LearningMyLearningPagePage.js.map
|