@burdenoff/microfe-crewfoundry 2026.624.1 → 2026.625.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/crewfoundry/pages/AdminAdminPagePage.js +100 -76
- package/dist/crewfoundry/pages/AdminAdminPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +118 -94
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +105 -81
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +134 -110
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -97
- 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 +74 -54
- 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 +87 -68
- 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 +81 -61
- package/dist/crewfoundry/pages/CommunicationsVideoCallsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +71 -51
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js +82 -58
- package/dist/crewfoundry/pages/CompanyCompanyDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyCompanyProfilePagePage.js +46 -39
- 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 +104 -80
- package/dist/crewfoundry/pages/DashboardAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +219 -151
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js +183 -142
- package/dist/crewfoundry/pages/DashboardEnhancedDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js +121 -97
- package/dist/crewfoundry/pages/DashboardExecutiveDashboardPage.js.map +1 -1
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js +57 -46
- package/dist/crewfoundry/pages/HelpApiDocumentationPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +91 -67
- 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 +55 -48
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +70 -50
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +140 -97
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +101 -85
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +68 -48
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +99 -71
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +97 -73
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +100 -76
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +93 -69
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningAssessmentsPagePage.js +65 -45
- 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 +117 -72
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +66 -54
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +36 -20
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js +90 -66
- package/dist/crewfoundry/pages/LearningLearningAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPagePage.js +81 -57
- package/dist/crewfoundry/pages/LearningLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +90 -65
- 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 +83 -59
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js +68 -48
- package/dist/crewfoundry/pages/MarketplaceBookingManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js +80 -60
- package/dist/crewfoundry/pages/MarketplaceEarningsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js +153 -118
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePageEnhancedPage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +42 -37
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +67 -47
- 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 +76 -57
- 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 +138 -93
- package/dist/crewfoundry/pages/MarketplaceProjectDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +98 -53
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsEscrowPagePage.js +69 -49
- 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 +76 -52
- 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 +85 -65
- 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 +108 -73
- 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 +67 -47
- package/dist/crewfoundry/pages/TeamsTeamAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +108 -63
- 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,27 +1,38 @@
|
|
|
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
|
-
function
|
|
7
|
-
let { learningPaths:
|
|
8
|
-
if (!
|
|
9
|
-
className: "p-6
|
|
10
|
-
children:
|
|
6
|
+
function g() {
|
|
7
|
+
let { learningPaths: g, courses: _ } = e(), v = g[0];
|
|
8
|
+
if (!v) return /* @__PURE__ */ o("div", {
|
|
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
|
-
let
|
|
16
|
+
let y = _.filter((e) => v.courses.includes(e.id));
|
|
13
17
|
return /* @__PURE__ */ s("div", {
|
|
14
18
|
className: "space-y-6 p-6 max-w-4xl",
|
|
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",
|
|
@@ -32,7 +43,7 @@ function h() {
|
|
|
32
43
|
/* @__PURE__ */ o(t, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
33
44
|
/* @__PURE__ */ o("p", {
|
|
34
45
|
className: "text-lg font-bold",
|
|
35
|
-
children:
|
|
46
|
+
children: v.courses.length
|
|
36
47
|
}),
|
|
37
48
|
/* @__PURE__ */ o("p", {
|
|
38
49
|
className: "text-xs text-text-secondary",
|
|
@@ -46,7 +57,7 @@ function h() {
|
|
|
46
57
|
/* @__PURE__ */ o(r, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
47
58
|
/* @__PURE__ */ o("p", {
|
|
48
59
|
className: "text-lg font-bold",
|
|
49
|
-
children:
|
|
60
|
+
children: v.duration
|
|
50
61
|
}),
|
|
51
62
|
/* @__PURE__ */ o("p", {
|
|
52
63
|
className: "text-xs text-text-secondary",
|
|
@@ -60,7 +71,7 @@ function h() {
|
|
|
60
71
|
/* @__PURE__ */ o(a, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
61
72
|
/* @__PURE__ */ o("p", {
|
|
62
73
|
className: "text-lg font-bold",
|
|
63
|
-
children:
|
|
74
|
+
children: v.enrolled
|
|
64
75
|
}),
|
|
65
76
|
/* @__PURE__ */ o("p", {
|
|
66
77
|
className: "text-xs text-text-secondary",
|
|
@@ -71,10 +82,10 @@ function h() {
|
|
|
71
82
|
/* @__PURE__ */ o(u, { children: /* @__PURE__ */ s(d, {
|
|
72
83
|
className: "p-4 text-center",
|
|
73
84
|
children: [
|
|
74
|
-
/* @__PURE__ */ o(n, { className: "h-5 w-5 mx-auto text-
|
|
85
|
+
/* @__PURE__ */ o(n, { className: "h-5 w-5 mx-auto text-status-success-text mb-1" }),
|
|
75
86
|
/* @__PURE__ */ s("p", {
|
|
76
87
|
className: "text-lg font-bold",
|
|
77
|
-
children: [
|
|
88
|
+
children: [v.completionRate, "%"]
|
|
78
89
|
}),
|
|
79
90
|
/* @__PURE__ */ o("p", {
|
|
80
91
|
className: "text-xs text-text-secondary",
|
|
@@ -84,57 +95,71 @@ function h() {
|
|
|
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-yellow-500" }), /* @__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
|
}
|
|
137
162
|
//#endregion
|
|
138
|
-
export {
|
|
163
|
+
export { g as LearningLearningPathDetailPagePage };
|
|
139
164
|
|
|
140
165
|
//# sourceMappingURL=LearningLearningPathDetailPagePage.js.map
|
|
@@ -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 d() {
|
|
|
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 d() {
|
|
|
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 } 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,73 +18,97 @@ function v() {
|
|
|
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
|
-
/* @__PURE__ */ c(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
className: "
|
|
61
|
-
children:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
className: "
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
className: "
|
|
75
|
-
children: [/* @__PURE__ */
|
|
76
|
-
className: "
|
|
77
|
-
children:
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
children:
|
|
82
|
-
|
|
50
|
+
/* @__PURE__ */ c(g, {
|
|
51
|
+
treatment: "glass",
|
|
52
|
+
glow: !0,
|
|
53
|
+
className: "border-border-seam",
|
|
54
|
+
children: [/* @__PURE__ */ c(m, {
|
|
55
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
56
|
+
children: [/* @__PURE__ */ s(h, {
|
|
57
|
+
className: "text-sm font-medium",
|
|
58
|
+
children: "In Progress"
|
|
59
|
+
}), /* @__PURE__ */ s(r, { className: "h-4 w-4 text-status-info-text" })]
|
|
60
|
+
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
61
|
+
className: "text-2xl font-bold tabular-nums",
|
|
62
|
+
children: S.length
|
|
63
|
+
}) })]
|
|
64
|
+
}),
|
|
65
|
+
/* @__PURE__ */ c(g, {
|
|
66
|
+
treatment: "metric",
|
|
67
|
+
className: "border-border-seam",
|
|
68
|
+
children: [/* @__PURE__ */ c(m, {
|
|
69
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
70
|
+
children: [/* @__PURE__ */ s(h, {
|
|
71
|
+
className: "text-sm font-medium",
|
|
72
|
+
children: "Completed"
|
|
73
|
+
}), /* @__PURE__ */ s(n, { className: "h-4 w-4 text-status-success-text" })]
|
|
74
|
+
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
75
|
+
className: "text-2xl font-bold tabular-nums",
|
|
76
|
+
children: C.length
|
|
77
|
+
}) })]
|
|
78
|
+
}),
|
|
79
|
+
/* @__PURE__ */ c(g, {
|
|
80
|
+
treatment: "metric",
|
|
81
|
+
className: "border-border-seam",
|
|
82
|
+
children: [/* @__PURE__ */ c(m, {
|
|
83
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
84
|
+
children: [/* @__PURE__ */ s(h, {
|
|
85
|
+
className: "text-sm font-medium",
|
|
86
|
+
children: "Hours Logged"
|
|
87
|
+
}), /* @__PURE__ */ s(i, { className: "h-4 w-4 text-text-secondary" })]
|
|
88
|
+
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
89
|
+
className: "text-2xl font-bold tabular-nums",
|
|
90
|
+
children: w.toFixed(1)
|
|
91
|
+
}) })]
|
|
92
|
+
}),
|
|
93
|
+
/* @__PURE__ */ c(g, {
|
|
94
|
+
treatment: "metric",
|
|
95
|
+
className: "border-border-seam",
|
|
96
|
+
children: [/* @__PURE__ */ c(m, {
|
|
97
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
98
|
+
children: [/* @__PURE__ */ s(h, {
|
|
99
|
+
className: "text-sm font-medium",
|
|
100
|
+
children: "Certificates"
|
|
101
|
+
}), /* @__PURE__ */ s(n, { className: "h-4 w-4 text-status-warning-text" })]
|
|
102
|
+
}), /* @__PURE__ */ s(f, { children: /* @__PURE__ */ s("div", {
|
|
103
|
+
className: "text-2xl font-bold tabular-nums",
|
|
104
|
+
children: C.filter((e) => e.certificate).length
|
|
105
|
+
}) })]
|
|
106
|
+
})
|
|
83
107
|
]
|
|
84
108
|
}),
|
|
85
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, {
|
|
86
110
|
className: "space-y-4",
|
|
87
|
-
children:
|
|
111
|
+
children: S.map((e) => /* @__PURE__ */ c("div", {
|
|
88
112
|
className: "flex items-center gap-4 rounded border p-4",
|
|
89
113
|
children: [/* @__PURE__ */ c("div", {
|
|
90
114
|
className: "flex-1",
|
|
@@ -132,7 +156,7 @@ function v() {
|
|
|
132
156
|
})] }),
|
|
133
157
|
/* @__PURE__ */ c(d, { children: [/* @__PURE__ */ s(m, { children: /* @__PURE__ */ s(h, { children: "Completed" }) }), /* @__PURE__ */ s(f, {
|
|
134
158
|
className: "space-y-3",
|
|
135
|
-
children:
|
|
159
|
+
children: C.map((e) => /* @__PURE__ */ c("div", {
|
|
136
160
|
className: "flex items-center justify-between rounded border p-3",
|
|
137
161
|
children: [/* @__PURE__ */ c("div", { children: [/* @__PURE__ */ s("p", {
|
|
138
162
|
className: "text-sm font-medium",
|
|
@@ -145,7 +169,7 @@ function v() {
|
|
|
145
169
|
children: [/* @__PURE__ */ c("div", {
|
|
146
170
|
className: "flex items-center gap-1",
|
|
147
171
|
children: [
|
|
148
|
-
/* @__PURE__ */ s(o, { className: "h-3 w-3 text-
|
|
172
|
+
/* @__PURE__ */ s(o, { className: "h-3 w-3 text-status-warning-text" }),
|
|
149
173
|
e.rating,
|
|
150
174
|
"/5"
|
|
151
175
|
]
|
|
@@ -161,6 +185,6 @@ function v() {
|
|
|
161
185
|
});
|
|
162
186
|
}
|
|
163
187
|
//#endregion
|
|
164
|
-
export {
|
|
188
|
+
export { x as LearningMyLearningPagePage };
|
|
165
189
|
|
|
166
190
|
//# sourceMappingURL=LearningMyLearningPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningMyLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningMyLearningPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Award, BookOpen, Clock, Play, Star } from 'lucide-react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n} from '@burdenoff/fe-libs/ui';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EnrolledCourse = {\n id: string;\n title: string;\n progress: number;\n modules: number;\n completedModules: number;\n instructor: string;\n dueDate: string;\n};\n\ntype CompletedCourse = {\n id: string;\n title: string;\n completedDate: string;\n rating: number;\n certificate: boolean;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function LearningMyLearningPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const myEnrolledCourses = useMemo<EnrolledCourse[]>(() => {\n return courses\n .filter((course) => course.status === 'active')\n .slice(0, 8)\n .map((course, index) => {\n const completedModules = Math.min(\n course.modules,\n Math.round((course.completed / Math.max(course.enrolled, 1)) * course.modules)\n );\n const progress = Math.round((completedModules / Math.max(course.modules, 1)) * 100);\n return {\n id: course.id,\n title: course.title,\n progress,\n modules: course.modules,\n completedModules,\n instructor: course.instructor,\n dueDate: isoDate(new Date(BASE_TS + (index + 1) * 86400000 * 12).toISOString()),\n };\n });\n }, [courses]);\n\n const completedCourses = useMemo<CompletedCourse[]>(() => {\n return courses\n .filter((course) => course.completed > 0)\n .slice(0, 8)\n .map((course, index) => ({\n id: `completed-${course.id}`,\n title: course.title,\n completedDate: isoDate(new Date(BASE_TS - (index + 1) * 86400000 * 15).toISOString()),\n rating: Number(course.rating.toFixed(1)),\n certificate: course.completed / Math.max(course.enrolled, 1) > 0.35,\n }));\n }, [courses]);\n\n const hoursLogged = myEnrolledCourses.reduce(\n (sum, course) => sum + course.completedModules * 1.25,\n 0\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">My Learning</h1>\n <p className=\"text-sm text-text-secondary\">\n Track your learning progress and achievements\n </p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">In Progress</CardTitle>\n <BookOpen className=\"h-4 w-4 text-blue-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{myEnrolledCourses.length}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <Award className=\"h-4 w-4 text-green-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{completedCourses.length}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Hours Logged</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{hoursLogged.toFixed(1)}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Certificates</CardTitle>\n <Award className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {completedCourses.filter((course) => course.certificate).length}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>In Progress</CardTitle>\n <CardDescription>Continue where you left off</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {myEnrolledCourses.map((course) => (\n <div key={course.id} className=\"flex items-center gap-4 rounded border p-4\">\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} · Due {course.dueDate}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"h-2 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-2 rounded bg-action-primary-bg\"\n style={{ width: `${course.progress}%` }}\n />\n </div>\n <span className=\"text-xs font-medium\">{course.progress}%</span>\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {course.completedModules}/{course.modules} modules\n </p>\n </div>\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Continue\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Completed</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completedCourses.map((course) => (\n <div key={course.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">Completed {course.completedDate}</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-yellow-500\" />\n {course.rating}/5\n </div>\n {course.certificate ? (\n <Badge variant=\"default\" className=\"text-[10px]\">\n Certificate\n </Badge>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LearningMyLearningPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningMyLearningPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { Award, BookOpen, Clock, Play, Star } from 'lucide-react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardDescription,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype EnrolledCourse = {\n id: string;\n title: string;\n progress: number;\n modules: number;\n completedModules: number;\n instructor: string;\n dueDate: string;\n};\n\ntype CompletedCourse = {\n id: string;\n title: string;\n completedDate: string;\n rating: number;\n certificate: boolean;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst isoDate = (value: string): string => {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return 'Unknown';\n }\n return parsed.toISOString().split('T')[0];\n};\n\nexport function LearningMyLearningPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const myEnrolledCourses = useMemo<EnrolledCourse[]>(() => {\n return courses\n .filter((course) => course.status === 'active')\n .slice(0, 8)\n .map((course, index) => {\n const completedModules = Math.min(\n course.modules,\n Math.round((course.completed / Math.max(course.enrolled, 1)) * course.modules)\n );\n const progress = Math.round((completedModules / Math.max(course.modules, 1)) * 100);\n return {\n id: course.id,\n title: course.title,\n progress,\n modules: course.modules,\n completedModules,\n instructor: course.instructor,\n dueDate: isoDate(new Date(BASE_TS + (index + 1) * 86400000 * 12).toISOString()),\n };\n });\n }, [courses]);\n\n const completedCourses = useMemo<CompletedCourse[]>(() => {\n return courses\n .filter((course) => course.completed > 0)\n .slice(0, 8)\n .map((course, index) => ({\n id: `completed-${course.id}`,\n title: course.title,\n completedDate: isoDate(new Date(BASE_TS - (index + 1) * 86400000 * 15).toISOString()),\n rating: Number(course.rating.toFixed(1)),\n certificate: course.completed / Math.max(course.enrolled, 1) > 0.35,\n }));\n }, [courses]);\n\n const hoursLogged = myEnrolledCourses.reduce(\n (sum, course) => sum + course.completedModules * 1.25,\n 0\n );\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>My Learning</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Track your learning progress and achievements</p>\n <PagePurpose className=\"mt-1\">Everything you're currently learning — track your enrolled courses, progress, and certificates earned all in one place.</PagePurpose>\n </div>\n\n <div className=\"grid gap-4 md: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\">In Progress</CardTitle>\n <BookOpen className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{myEnrolledCourses.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <Award className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{completedCourses.length}</div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Hours Logged</CardTitle>\n <Clock className=\"h-4 w-4 text-text-secondary\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">{hoursLogged.toFixed(1)}</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\">Certificates</CardTitle>\n <Award className=\"h-4 w-4 text-status-warning-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {completedCourses.filter((course) => course.certificate).length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>In Progress</CardTitle>\n <CardDescription>Continue where you left off</CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {myEnrolledCourses.map((course) => (\n <div key={course.id} className=\"flex items-center gap-4 rounded border p-4\">\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} · Due {course.dueDate}\n </p>\n <div className=\"mt-2 flex items-center gap-2\">\n <div className=\"h-2 flex-1 overflow-hidden rounded bg-bg-sunken\">\n <div\n className=\"h-2 rounded bg-action-primary-bg\"\n style={{ width: `${course.progress}%` }}\n />\n </div>\n <span className=\"text-xs font-medium\">{course.progress}%</span>\n </div>\n <p className=\"mt-1 text-xs text-text-secondary\">\n {course.completedModules}/{course.modules} modules\n </p>\n </div>\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Continue\n </Button>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>Completed</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {completedCourses.map((course) => (\n <div key={course.id} className=\"flex items-center justify-between rounded border p-3\">\n <div>\n <p className=\"text-sm font-medium\">{course.title}</p>\n <p className=\"text-xs text-text-secondary\">Completed {course.completedDate}</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 {course.rating}/5\n </div>\n {course.certificate ? (\n <Badge variant=\"default\" className=\"text-[10px]\">\n Certificate\n </Badge>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|