@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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningAssessmentsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningAssessmentsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, FileText, Play } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Assessment = {\n id: string;\n title: string;\n course: string;\n questions: number;\n duration: string;\n status: 'available' | 'completed' | 'overdue';\n score?: number;\n dueDate: string;\n passingScore: number;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst formatDate = (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 LearningAssessmentsPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const assessments = useMemo<Assessment[]>(() => {\n return courses.slice(0, 16).map((course, index) => {\n const status: Assessment['status'] =\n index % 6 === 0 ? 'overdue' : index % 2 === 0 ? 'available' : 'completed';\n const passingScore = 70 + (index % 4) * 5;\n\n return {\n id: course.id,\n title: `${course.title} Assessment`,\n course: course.title,\n questions: Math.max(10, course.modules * 4),\n duration: `${Math.max(15, course.modules * 8)} min`,\n status,\n score:\n status === 'completed' ? Math.min(99, Math.round(course.rating * 20 + 20)) : undefined,\n dueDate: formatDate(new Date(BASE_TS + (index - 3) * 86400000 * 6).toISOString()),\n passingScore,\n };\n });\n }, [courses]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Assessments</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Quizzes and exams for your enrolled courses</p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\n <GlassCard treatment=\"
|
|
1
|
+
{"version":3,"file":"LearningAssessmentsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningAssessmentsPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { CheckCircle, Clock, FileText, Play } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Assessment = {\n id: string;\n title: string;\n course: string;\n questions: number;\n duration: string;\n status: 'available' | 'completed' | 'overdue';\n score?: number;\n dueDate: string;\n passingScore: number;\n};\n\nconst BASE_TS = new Date('2026-03-01T00:00:00Z').getTime();\n\nconst formatDate = (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 LearningAssessmentsPagePage() {\n const { courses } = useCrewFoundryStore();\n\n const assessments = useMemo<Assessment[]>(() => {\n return courses.slice(0, 16).map((course, index) => {\n const status: Assessment['status'] =\n index % 6 === 0 ? 'overdue' : index % 2 === 0 ? 'available' : 'completed';\n const passingScore = 70 + (index % 4) * 5;\n\n return {\n id: course.id,\n title: `${course.title} Assessment`,\n course: course.title,\n questions: Math.max(10, course.modules * 4),\n duration: `${Math.max(15, course.modules * 8)} min`,\n status,\n score:\n status === 'completed' ? Math.min(99, Math.round(course.rating * 20 + 20)) : undefined,\n dueDate: formatDate(new Date(BASE_TS + (index - 3) * 86400000 * 6).toISOString()),\n passingScore,\n };\n });\n }, [courses]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Assessments</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">Quizzes and exams for your enrolled courses</p>\n <PagePurpose className=\"mt-1\">Create and review assessments that measure what your team has learned — use them to certify skills and identify knowledge gaps.</PagePurpose>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-3\">\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\">Available</CardTitle>\n <FileText className=\"h-4 w-4 text-status-info-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {assessments.filter((assessment) => assessment.status === 'available').length}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Completed</CardTitle>\n <CheckCircle className=\"h-4 w-4 text-status-success-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {assessments.filter((assessment) => assessment.status === 'completed').length}\n </div>\n </CardContent>\n </GlassCard>\n <GlassCard treatment=\"metric\" className=\"border-border-seam\">\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Overdue</CardTitle>\n <Clock className=\"h-4 w-4 text-status-error-text\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold tabular-nums\">\n {assessments.filter((assessment) => assessment.status === 'overdue').length}\n </div>\n </CardContent>\n </GlassCard>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>All Assessments</CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {assessments.map((assessment) => (\n <div\n key={assessment.id}\n className=\"flex items-center justify-between rounded border p-4\"\n >\n <div>\n <p className=\"text-sm font-medium\">{assessment.title}</p>\n <p className=\"text-xs text-text-secondary\">\n {assessment.course} · {assessment.questions} questions · {assessment.duration}\n </p>\n <p className=\"text-xs text-text-secondary\">\n Due: {assessment.dueDate} · Passing: {assessment.passingScore}%\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n {assessment.status === 'completed' && assessment.score ? (\n <Badge\n variant={\n assessment.score >= assessment.passingScore ? 'default' : 'destructive'\n }\n className=\"text-[10px]\"\n >\n Score: {assessment.score}%\n </Badge>\n ) : null}\n <Badge\n variant={\n assessment.status === 'completed'\n ? 'default'\n : assessment.status === 'overdue'\n ? 'destructive'\n : 'secondary'\n }\n className=\"text-[10px]\"\n >\n {assessment.status}\n </Badge>\n {assessment.status === 'available' ? (\n <Button size=\"sm\">\n <Play className=\"mr-1 h-3 w-3\" />\n Start\n </Button>\n ) : null}\n {assessment.status === 'overdue' ? (\n <Button size=\"sm\" variant=\"destructive\">\n <Play className=\"mr-1 h-3 w-3\" />\n Take Now\n </Button>\n ) : null}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,102 +2,120 @@ import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
|
2
2
|
import { useMemo as t } from "react";
|
|
3
3
|
import { Award as n, Download as r, ExternalLink as i } from "lucide-react";
|
|
4
4
|
import { jsx as a, jsxs as o } from "react/jsx-runtime";
|
|
5
|
-
import { Badge as s, Button as c,
|
|
5
|
+
import { Badge as s, Button as c, CardContent as l, CardHeader as u, CardTitle as d, GlassCard as f, GradientText as p, IllustratedEmptyState as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
|
|
6
6
|
//#region src/crewfoundry/pages/LearningCertificatesPagePage.tsx
|
|
7
|
-
var
|
|
7
|
+
var g = (/* @__PURE__ */ new Date("2026-03-01T00:00:00Z")).getTime(), _ = (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:
|
|
13
|
-
let n =
|
|
11
|
+
function v() {
|
|
12
|
+
let { courses: v, employees: y } = e(), b = t(() => v.slice(0, 12).map((e, t) => {
|
|
13
|
+
let n = y[t % Math.max(y.length, 1)]?.firstName && y[t % Math.max(y.length, 1)]?.lastName ? `${y[t % y.length].firstName} ${y[t % y.length].lastName}` : e.instructor;
|
|
14
14
|
return {
|
|
15
15
|
id: e.id,
|
|
16
16
|
title: e.title,
|
|
17
|
-
issueDate:
|
|
17
|
+
issueDate: _((/* @__PURE__ */ new Date(g - t * 864e5 * 12)).toISOString()),
|
|
18
18
|
instructor: n,
|
|
19
19
|
credentialId: `CF-${e.id.slice(0, 6).toUpperCase()}-${t + 1}`,
|
|
20
20
|
status: t % 5 == 0 ? "expiring" : "active",
|
|
21
|
-
expiryDate: t % 5 == 0 ?
|
|
21
|
+
expiryDate: t % 5 == 0 ? _(new Date(g + 864e5 * (60 + t * 3)).toISOString()) : void 0
|
|
22
22
|
};
|
|
23
|
-
}), [
|
|
23
|
+
}), [v, y]);
|
|
24
24
|
return /* @__PURE__ */ o("div", {
|
|
25
25
|
className: "space-y-6 p-6",
|
|
26
|
-
children: [/* @__PURE__ */ o("div", { children: [
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
children: [/* @__PURE__ */ o("div", { children: [
|
|
27
|
+
/* @__PURE__ */ a("h1", {
|
|
28
|
+
className: "text-2xl font-semibold",
|
|
29
|
+
children: /* @__PURE__ */ a(p, { children: "Certificates" })
|
|
30
|
+
}),
|
|
31
|
+
/* @__PURE__ */ o("p", {
|
|
32
|
+
className: "text-sm text-text-secondary",
|
|
33
|
+
children: [b.length, " certificates earned"]
|
|
34
|
+
}),
|
|
35
|
+
/* @__PURE__ */ a(h, {
|
|
36
|
+
className: "mt-1",
|
|
37
|
+
children: "View and manage the certificates your team has earned — proof of completed training and validated skills."
|
|
38
|
+
})
|
|
39
|
+
] }), /* @__PURE__ */ a("div", {
|
|
33
40
|
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
|
|
34
|
-
children:
|
|
35
|
-
className: "
|
|
36
|
-
children:
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
})
|
|
41
|
-
}), /* @__PURE__ */
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
children: "Issued:"
|
|
59
|
-
}),
|
|
60
|
-
" ",
|
|
61
|
-
e.issueDate
|
|
62
|
-
] }),
|
|
63
|
-
/* @__PURE__ */ o("div", { children: [
|
|
64
|
-
/* @__PURE__ */ a("span", {
|
|
65
|
-
className: "text-xs",
|
|
66
|
-
children: "Credential ID:"
|
|
67
|
-
}),
|
|
68
|
-
" ",
|
|
69
|
-
e.credentialId
|
|
70
|
-
] }),
|
|
71
|
-
e.expiryDate ? /* @__PURE__ */ o("div", {
|
|
72
|
-
className: "text-status-warning-text",
|
|
73
|
-
children: [
|
|
41
|
+
children: b.length === 0 ? /* @__PURE__ */ a("div", {
|
|
42
|
+
className: "col-span-full",
|
|
43
|
+
children: /* @__PURE__ */ a(m, {
|
|
44
|
+
illustration: "empty-generic",
|
|
45
|
+
title: "No certificates yet",
|
|
46
|
+
description: "Certificates appear here as your team completes courses."
|
|
47
|
+
})
|
|
48
|
+
}) : b.map((e, t) => /* @__PURE__ */ o(f, {
|
|
49
|
+
treatment: t === 0 ? "glass" : "plain",
|
|
50
|
+
glow: t === 0,
|
|
51
|
+
children: [/* @__PURE__ */ o(u, { children: [/* @__PURE__ */ o("div", {
|
|
52
|
+
className: "flex items-center justify-between",
|
|
53
|
+
children: [/* @__PURE__ */ a(n, { className: "h-8 w-8 text-status-warning-text" }), /* @__PURE__ */ a(s, {
|
|
54
|
+
variant: e.status === "active" ? "default" : "secondary",
|
|
55
|
+
className: "text-[10px]",
|
|
56
|
+
children: e.status
|
|
57
|
+
})]
|
|
58
|
+
}), /* @__PURE__ */ a(d, {
|
|
59
|
+
className: "mt-2 text-base",
|
|
60
|
+
children: e.title
|
|
61
|
+
})] }), /* @__PURE__ */ o(l, { children: [/* @__PURE__ */ o("div", {
|
|
62
|
+
className: "space-y-2 text-sm text-text-secondary",
|
|
63
|
+
children: [
|
|
64
|
+
/* @__PURE__ */ o("div", { children: [
|
|
74
65
|
/* @__PURE__ */ a("span", {
|
|
75
66
|
className: "text-xs",
|
|
76
|
-
children: "
|
|
67
|
+
children: "Instructor:"
|
|
77
68
|
}),
|
|
78
69
|
" ",
|
|
79
|
-
e.
|
|
80
|
-
]
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
70
|
+
e.instructor
|
|
71
|
+
] }),
|
|
72
|
+
/* @__PURE__ */ o("div", { children: [
|
|
73
|
+
/* @__PURE__ */ a("span", {
|
|
74
|
+
className: "text-xs",
|
|
75
|
+
children: "Issued:"
|
|
76
|
+
}),
|
|
77
|
+
" ",
|
|
78
|
+
e.issueDate
|
|
79
|
+
] }),
|
|
80
|
+
/* @__PURE__ */ o("div", { children: [
|
|
81
|
+
/* @__PURE__ */ a("span", {
|
|
82
|
+
className: "text-xs",
|
|
83
|
+
children: "Credential ID:"
|
|
84
|
+
}),
|
|
85
|
+
" ",
|
|
86
|
+
e.credentialId
|
|
87
|
+
] }),
|
|
88
|
+
e.expiryDate ? /* @__PURE__ */ o("div", {
|
|
89
|
+
className: "text-status-warning-text",
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ a("span", {
|
|
92
|
+
className: "text-xs",
|
|
93
|
+
children: "Expires:"
|
|
94
|
+
}),
|
|
95
|
+
" ",
|
|
96
|
+
e.expiryDate
|
|
97
|
+
]
|
|
98
|
+
}) : null
|
|
99
|
+
]
|
|
100
|
+
}), /* @__PURE__ */ o("div", {
|
|
101
|
+
className: "mt-3 flex gap-2",
|
|
102
|
+
children: [/* @__PURE__ */ o(c, {
|
|
103
|
+
variant: "outline",
|
|
104
|
+
size: "sm",
|
|
105
|
+
className: "flex-1",
|
|
106
|
+
children: [/* @__PURE__ */ a(r, { className: "mr-1 h-3 w-3" }), "Download"]
|
|
107
|
+
}), /* @__PURE__ */ o(c, {
|
|
108
|
+
variant: "outline",
|
|
109
|
+
size: "sm",
|
|
110
|
+
className: "flex-1",
|
|
111
|
+
children: [/* @__PURE__ */ a(i, { className: "mr-1 h-3 w-3" }), "Verify"]
|
|
112
|
+
})]
|
|
113
|
+
})] })]
|
|
114
|
+
}, e.id))
|
|
97
115
|
})]
|
|
98
116
|
});
|
|
99
117
|
}
|
|
100
118
|
//#endregion
|
|
101
|
-
export {
|
|
119
|
+
export { v as LearningCertificatesPagePage };
|
|
102
120
|
|
|
103
121
|
//# sourceMappingURL=LearningCertificatesPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningCertificatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCertificatesPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n
|
|
1
|
+
{"version":3,"file":"LearningCertificatesPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCertificatesPagePage.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n Badge,\n Button,\n CardContent,\n CardHeader,\n CardTitle,\n GlassCard,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { Award, Download, ExternalLink } from 'lucide-react';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\ntype Certificate = {\n id: string;\n title: string;\n issueDate: string;\n instructor: string;\n credentialId: string;\n status: 'active' | 'expiring';\n expiryDate?: string;\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 LearningCertificatesPagePage() {\n const { courses, employees } = useCrewFoundryStore();\n\n const certificates = useMemo<Certificate[]>(() => {\n return courses.slice(0, 12).map((course, index) => {\n const instructor =\n employees[index % Math.max(employees.length, 1)]?.firstName &&\n employees[index % Math.max(employees.length, 1)]?.lastName\n ? `${employees[index % employees.length].firstName} ${employees[index % employees.length].lastName}`\n : course.instructor;\n\n return {\n id: course.id,\n title: course.title,\n issueDate: isoDate(new Date(BASE_TS - index * 86400000 * 12).toISOString()),\n instructor,\n credentialId: `CF-${course.id.slice(0, 6).toUpperCase()}-${index + 1}`,\n status: index % 5 === 0 ? 'expiring' : 'active',\n expiryDate:\n index % 5 === 0\n ? isoDate(new Date(BASE_TS + 86400000 * (60 + index * 3)).toISOString())\n : undefined,\n };\n });\n }, [courses, employees]);\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>Certificates</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{certificates.length} certificates earned</p>\n <PagePurpose className=\"mt-1\">View and manage the certificates your team has earned — proof of completed training and validated skills.</PagePurpose>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {certificates.length === 0 ? (\n <div className=\"col-span-full\">\n <IllustratedEmptyState\n illustration=\"empty-generic\"\n title=\"No certificates yet\"\n description=\"Certificates appear here as your team completes courses.\"\n />\n </div>\n ) : (\n certificates.map((certificate, _idx) => (\n <GlassCard\n key={certificate.id}\n treatment={_idx === 0 ? 'glass' : 'plain'}\n glow={_idx === 0}\n >\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <Award className=\"h-8 w-8 text-status-warning-text\" />\n <Badge\n variant={certificate.status === 'active' ? 'default' : 'secondary'}\n className=\"text-[10px]\"\n >\n {certificate.status}\n </Badge>\n </div>\n <CardTitle className=\"mt-2 text-base\">{certificate.title}</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2 text-sm text-text-secondary\">\n <div>\n <span className=\"text-xs\">Instructor:</span> {certificate.instructor}\n </div>\n <div>\n <span className=\"text-xs\">Issued:</span> {certificate.issueDate}\n </div>\n <div>\n <span className=\"text-xs\">Credential ID:</span> {certificate.credentialId}\n </div>\n {certificate.expiryDate ? (\n <div className=\"text-status-warning-text\">\n <span className=\"text-xs\">Expires:</span> {certificate.expiryDate}\n </div>\n ) : null}\n </div>\n\n <div className=\"mt-3 flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n <Download className=\"mr-1 h-3 w-3\" />\n Download\n </Button>\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1\">\n <ExternalLink className=\"mr-1 h-3 w-3\" />\n Verify\n </Button>\n </div>\n </CardContent>\n </GlassCard>\n )))}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,97 +1,131 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
|
-
import { BookOpen as t, Clock as n,
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
2
|
+
import { BookOpen as t, Clock as n, GraduationCap as r, Play as i, Star as a, Users as o } from "lucide-react";
|
|
3
|
+
import { useNavigate as s } from "react-router-dom";
|
|
4
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as u, Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, EmphasisPanel as g, GradientText as _, IllustratedEmptyState as v, NextSteps as y, PagePurpose as b } from "@burdenoff/fe-libs/ui";
|
|
5
6
|
//#region src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx
|
|
6
|
-
function
|
|
7
|
-
let { courses:
|
|
8
|
-
if (!
|
|
7
|
+
function x() {
|
|
8
|
+
let x = s(), { courses: S } = e(), C = S[0];
|
|
9
|
+
if (!C) return /* @__PURE__ */ c("div", {
|
|
9
10
|
className: "p-6",
|
|
10
|
-
children: /* @__PURE__ */
|
|
11
|
+
children: /* @__PURE__ */ c(v, {
|
|
11
12
|
illustration: "empty-search",
|
|
12
13
|
title: "Course not found",
|
|
13
14
|
description: "This course is no longer available."
|
|
14
15
|
})
|
|
15
16
|
});
|
|
16
|
-
let
|
|
17
|
-
return /* @__PURE__ */
|
|
17
|
+
let w = Math.round(C.completed / C.enrolled * 100);
|
|
18
|
+
return /* @__PURE__ */ l("div", {
|
|
18
19
|
className: "space-y-6 p-6 max-w-4xl",
|
|
19
20
|
children: [
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
+
/* @__PURE__ */ l("div", {
|
|
21
22
|
className: "flex items-center justify-between",
|
|
22
|
-
children: [/* @__PURE__ */
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
23
|
+
children: [/* @__PURE__ */ l("div", { children: [
|
|
24
|
+
/* @__PURE__ */ l("div", {
|
|
25
|
+
className: "flex items-center gap-2 mb-1",
|
|
26
|
+
children: [/* @__PURE__ */ c("h1", {
|
|
27
|
+
className: "text-2xl font-semibold",
|
|
28
|
+
children: /* @__PURE__ */ c(_, { children: C.title })
|
|
29
|
+
}), /* @__PURE__ */ c(u, {
|
|
30
|
+
variant: C.level === "beginner" ? "secondary" : C.level === "intermediate" ? "default" : "destructive",
|
|
31
|
+
children: C.level
|
|
32
|
+
})]
|
|
33
|
+
}),
|
|
34
|
+
/* @__PURE__ */ l("p", {
|
|
35
|
+
className: "text-sm text-text-secondary",
|
|
36
|
+
children: [
|
|
37
|
+
"by ",
|
|
38
|
+
C.instructor,
|
|
39
|
+
" · ",
|
|
40
|
+
C.category
|
|
41
|
+
]
|
|
42
|
+
}),
|
|
43
|
+
/* @__PURE__ */ c(b, {
|
|
44
|
+
className: "mt-2",
|
|
45
|
+
children: "Everything you need to decide on and start this course — what it covers, who it's for, and how others have done — so you can enroll with confidence and build the right skills."
|
|
46
|
+
})
|
|
47
|
+
] }), /* @__PURE__ */ l(d, { children: [/* @__PURE__ */ c(i, { className: "h-4 w-4 mr-1" }), "Start Course"] })]
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ c(y, {
|
|
50
|
+
storageKey: "crewfoundry-course-details",
|
|
51
|
+
steps: [
|
|
52
|
+
{
|
|
53
|
+
id: "start",
|
|
54
|
+
label: "Start the first module",
|
|
55
|
+
description: "Begin learning and track your progress as you go.",
|
|
56
|
+
icon: /* @__PURE__ */ c(i, { className: "h-4 w-4" }),
|
|
57
|
+
onClick: () => x("../../learning/course-learning-page")
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
id: "my-learning",
|
|
61
|
+
label: "See all your learning",
|
|
62
|
+
description: "Review everything you are currently enrolled in.",
|
|
63
|
+
icon: /* @__PURE__ */ c(r, { className: "h-4 w-4" }),
|
|
64
|
+
onClick: () => x("../../learning/my-learning-page")
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
id: "browse",
|
|
68
|
+
label: "Browse more courses",
|
|
69
|
+
description: "Find related training to round out your skills.",
|
|
70
|
+
icon: /* @__PURE__ */ c(t, { className: "h-4 w-4" }),
|
|
71
|
+
onClick: () => x("../../learning/courses-page")
|
|
72
|
+
}
|
|
73
|
+
]
|
|
40
74
|
}),
|
|
41
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ l("div", {
|
|
42
76
|
className: "grid gap-4 md:grid-cols-4",
|
|
43
77
|
children: [
|
|
44
|
-
/* @__PURE__ */
|
|
78
|
+
/* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
|
|
45
79
|
className: "p-4 text-center",
|
|
46
80
|
children: [
|
|
47
|
-
/* @__PURE__ */
|
|
48
|
-
/* @__PURE__ */
|
|
81
|
+
/* @__PURE__ */ c(n, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
82
|
+
/* @__PURE__ */ c("p", {
|
|
49
83
|
className: "text-lg font-bold",
|
|
50
|
-
children:
|
|
84
|
+
children: C.duration
|
|
51
85
|
}),
|
|
52
|
-
/* @__PURE__ */
|
|
86
|
+
/* @__PURE__ */ c("p", {
|
|
53
87
|
className: "text-xs text-text-secondary",
|
|
54
88
|
children: "Duration"
|
|
55
89
|
})
|
|
56
90
|
]
|
|
57
91
|
}) }),
|
|
58
|
-
/* @__PURE__ */
|
|
92
|
+
/* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
|
|
59
93
|
className: "p-4 text-center",
|
|
60
94
|
children: [
|
|
61
|
-
/* @__PURE__ */
|
|
62
|
-
/* @__PURE__ */
|
|
95
|
+
/* @__PURE__ */ c(t, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
96
|
+
/* @__PURE__ */ c("p", {
|
|
63
97
|
className: "text-lg font-bold",
|
|
64
|
-
children:
|
|
98
|
+
children: C.modules
|
|
65
99
|
}),
|
|
66
|
-
/* @__PURE__ */
|
|
100
|
+
/* @__PURE__ */ c("p", {
|
|
67
101
|
className: "text-xs text-text-secondary",
|
|
68
102
|
children: "Modules"
|
|
69
103
|
})
|
|
70
104
|
]
|
|
71
105
|
}) }),
|
|
72
|
-
/* @__PURE__ */
|
|
106
|
+
/* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
|
|
73
107
|
className: "p-4 text-center",
|
|
74
108
|
children: [
|
|
75
|
-
/* @__PURE__ */ o
|
|
76
|
-
/* @__PURE__ */
|
|
109
|
+
/* @__PURE__ */ c(o, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
110
|
+
/* @__PURE__ */ c("p", {
|
|
77
111
|
className: "text-lg font-bold",
|
|
78
|
-
children:
|
|
112
|
+
children: C.enrolled
|
|
79
113
|
}),
|
|
80
|
-
/* @__PURE__ */
|
|
114
|
+
/* @__PURE__ */ c("p", {
|
|
81
115
|
className: "text-xs text-text-secondary",
|
|
82
116
|
children: "Enrolled"
|
|
83
117
|
})
|
|
84
118
|
]
|
|
85
119
|
}) }),
|
|
86
|
-
/* @__PURE__ */
|
|
120
|
+
/* @__PURE__ */ c(f, { children: /* @__PURE__ */ l(p, {
|
|
87
121
|
className: "p-4 text-center",
|
|
88
122
|
children: [
|
|
89
|
-
/* @__PURE__ */
|
|
90
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ c(a, { className: "h-5 w-5 mx-auto text-status-warning-text mb-1" }),
|
|
124
|
+
/* @__PURE__ */ l("p", {
|
|
91
125
|
className: "text-lg font-bold",
|
|
92
|
-
children: [
|
|
126
|
+
children: [C.rating, "/5"]
|
|
93
127
|
}),
|
|
94
|
-
/* @__PURE__ */
|
|
128
|
+
/* @__PURE__ */ c("p", {
|
|
95
129
|
className: "text-xs text-text-secondary",
|
|
96
130
|
children: "Rating"
|
|
97
131
|
})
|
|
@@ -99,34 +133,41 @@ function g() {
|
|
|
99
133
|
}) })
|
|
100
134
|
]
|
|
101
135
|
}),
|
|
102
|
-
/* @__PURE__ */
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
children:
|
|
110
|
-
},
|
|
111
|
-
|
|
112
|
-
|
|
136
|
+
/* @__PURE__ */ l(g, { children: [
|
|
137
|
+
/* @__PURE__ */ c("div", {
|
|
138
|
+
className: "mb-2 text-lg font-semibold",
|
|
139
|
+
children: "About this Course"
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ c("p", {
|
|
142
|
+
className: "text-sm text-text-secondary",
|
|
143
|
+
children: C.description
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ c("div", {
|
|
146
|
+
className: "flex flex-wrap gap-1 mt-3",
|
|
147
|
+
children: C.skills.map((e) => /* @__PURE__ */ c(u, {
|
|
148
|
+
variant: "outline",
|
|
149
|
+
children: e
|
|
150
|
+
}, e))
|
|
151
|
+
})
|
|
152
|
+
] }),
|
|
153
|
+
/* @__PURE__ */ l(f, { children: [/* @__PURE__ */ c(m, { children: /* @__PURE__ */ c(h, { children: "Completion Statistics" }) }), /* @__PURE__ */ c(p, { children: /* @__PURE__ */ l("div", {
|
|
113
154
|
className: "space-y-2",
|
|
114
|
-
children: [/* @__PURE__ */
|
|
155
|
+
children: [/* @__PURE__ */ l("div", {
|
|
115
156
|
className: "flex justify-between text-sm",
|
|
116
|
-
children: [/* @__PURE__ */
|
|
117
|
-
|
|
157
|
+
children: [/* @__PURE__ */ l("span", { children: [
|
|
158
|
+
C.completed,
|
|
118
159
|
" of ",
|
|
119
|
-
|
|
160
|
+
C.enrolled,
|
|
120
161
|
" students completed"
|
|
121
|
-
] }), /* @__PURE__ */
|
|
162
|
+
] }), /* @__PURE__ */ l("span", {
|
|
122
163
|
className: "font-medium",
|
|
123
|
-
children: [
|
|
164
|
+
children: [w, "%"]
|
|
124
165
|
})]
|
|
125
|
-
}), /* @__PURE__ */
|
|
166
|
+
}), /* @__PURE__ */ c("div", {
|
|
126
167
|
className: "h-3 bg-bg-sunken rounded overflow-hidden",
|
|
127
|
-
children: /* @__PURE__ */
|
|
168
|
+
children: /* @__PURE__ */ c("div", {
|
|
128
169
|
className: "h-3 bg-status-success-text rounded",
|
|
129
|
-
style: { width: `${
|
|
170
|
+
style: { width: `${w}%` }
|
|
130
171
|
})
|
|
131
172
|
})]
|
|
132
173
|
}) })] })
|
|
@@ -134,6 +175,6 @@ function g() {
|
|
|
134
175
|
});
|
|
135
176
|
}
|
|
136
177
|
//#endregion
|
|
137
|
-
export {
|
|
178
|
+
export { x as LearningCourseDetailsPagePage };
|
|
138
179
|
|
|
139
180
|
//# sourceMappingURL=LearningCourseDetailsPagePage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LearningCourseDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n
|
|
1
|
+
{"version":3,"file":"LearningCourseDetailsPagePage.js","names":[],"sources":["../../../src/crewfoundry/pages/LearningCourseDetailsPagePage.tsx"],"sourcesContent":["import {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n NextSteps,\n PagePurpose,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Clock, GraduationCap, Play, Star, Users } from 'lucide-react';\nimport { useNavigate } from 'react-router-dom';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\n\nexport function LearningCourseDetailsPagePage() {\n const navigate = useNavigate();\n const { courses } = useCrewFoundryStore();\n const course = courses[0];\n if (!course)\n return (\n <div className=\"p-6\">\n <IllustratedEmptyState\n illustration=\"empty-search\"\n title=\"Course not found\"\n description=\"This course is no longer available.\"\n />\n </div>\n );\n const completionRate = Math.round((course.completed / course.enrolled) * 100);\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <div className=\"flex items-center gap-2 mb-1\">\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{course.title}</GradientText>\n </h1>\n <Badge\n variant={\n course.level === 'beginner'\n ? 'secondary'\n : course.level === 'intermediate'\n ? 'default'\n : 'destructive'\n }\n >\n {course.level}\n </Badge>\n </div>\n <p className=\"text-sm text-text-secondary\">\n by {course.instructor} · {course.category}\n </p>\n <PagePurpose className=\"mt-2\">\n Everything you need to decide on and start this course — what it covers, who it's\n for, and how others have done — so you can enroll with confidence and build the right\n skills.\n </PagePurpose>\n </div>\n <Button>\n <Play className=\"h-4 w-4 mr-1\" />\n Start Course\n </Button>\n </div>\n\n <NextSteps\n storageKey=\"crewfoundry-course-details\"\n steps={[\n {\n id: 'start',\n label: 'Start the first module',\n description: 'Begin learning and track your progress as you go.',\n icon: <Play className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/course-learning-page'),\n },\n {\n id: 'my-learning',\n label: 'See all your learning',\n description: 'Review everything you are currently enrolled in.',\n icon: <GraduationCap className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/my-learning-page'),\n },\n {\n id: 'browse',\n label: 'Browse more courses',\n description: 'Find related training to round out your skills.',\n icon: <BookOpen className=\"h-4 w-4\" />,\n onClick: () => navigate('../../learning/courses-page'),\n },\n ]}\n />\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Clock className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{course.duration}</p>\n <p className=\"text-xs text-text-secondary\">Duration</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <BookOpen className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{course.modules}</p>\n <p className=\"text-xs text-text-secondary\">Modules</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Users className=\"h-5 w-5 mx-auto text-text-secondary mb-1\" />\n <p className=\"text-lg font-bold\">{course.enrolled}</p>\n <p className=\"text-xs text-text-secondary\">Enrolled</p>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-4 text-center\">\n <Star className=\"h-5 w-5 mx-auto text-status-warning-text mb-1\" />\n <p className=\"text-lg font-bold\">{course.rating}/5</p>\n <p className=\"text-xs text-text-secondary\">Rating</p>\n </CardContent>\n </Card>\n </div>\n <EmphasisPanel>\n <div className=\"mb-2 text-lg font-semibold\">About this Course</div>\n <p className=\"text-sm text-text-secondary\">{course.description}</p>\n <div className=\"flex flex-wrap gap-1 mt-3\">\n {course.skills.map((s) => (\n <Badge key={s} variant=\"outline\">\n {s}\n </Badge>\n ))}\n </div>\n </EmphasisPanel>\n <Card>\n <CardHeader>\n <CardTitle>Completion Statistics</CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"space-y-2\">\n <div className=\"flex justify-between text-sm\">\n <span>\n {course.completed} of {course.enrolled} students completed\n </span>\n <span className=\"font-medium\">{completionRate}%</span>\n </div>\n <div className=\"h-3 bg-bg-sunken rounded overflow-hidden\">\n <div\n className=\"h-3 bg-status-success-text rounded\"\n style={{ width: `${completionRate}%` }}\n />\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":";;;;;;AAiBA,SAAgB,IAAgC;CAC9C,IAAM,IAAW,GAAa,EACxB,EAAE,eAAY,GAAqB,EACnC,IAAS,EAAQ;AACvB,KAAI,CAAC,EACH,QACE,kBAAC,OAAD;EAAK,WAAU;YACb,kBAAC,GAAD;GACE,cAAa;GACb,OAAM;GACN,aAAY;GACZ,CAAA;EACE,CAAA;CAEV,IAAM,IAAiB,KAAK,MAAO,EAAO,YAAY,EAAO,WAAY,IAAI;AAE7E,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA;KACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,MAAD;OAAI,WAAU;iBACZ,kBAAC,GAAD,EAAA,UAAe,EAAO,OAAqB,CAAA;OACxC,CAAA,EACL,kBAAC,GAAD;OACE,SACE,EAAO,UAAU,aACb,cACA,EAAO,UAAU,iBACf,YACA;iBAGP,EAAO;OACF,CAAA,CACJ;;KACN,kBAAC,KAAD;MAAG,WAAU;gBAAb;OAA2C;OACrC,EAAO;OAAW;OAAI,EAAO;OAC/B;;KACJ,kBAAC,GAAD;MAAa,WAAU;gBAAO;MAIhB,CAAA;KACV,EAAA,CAAA,EACN,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,eAE1B,EAAA,CAAA,CACL;;GAEN,kBAAC,GAAD;IACE,YAAW;IACX,OAAO;KACL;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;MAClC,eAAe,EAAS,sCAAsC;MAC/D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAe,WAAU,WAAY,CAAA;MAC3C,eAAe,EAAS,kCAAkC;MAC3D;KACD;MACE,IAAI;MACJ,OAAO;MACP,aAAa;MACb,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;MACtC,eAAe,EAAS,8BAA8B;MACvD;KACF;IACD,CAAA;GAEF,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;OAC9D,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAa,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAU,WAAU,4CAA6C,CAAA;OACjE,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAY,CAAA;OACrD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAW,CAAA;OAC1C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAO,WAAU,4CAA6C,CAAA;OAC9D,kBAAC,KAAD;QAAG,WAAU;kBAAqB,EAAO;QAAa,CAAA;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAY,CAAA;OAC3C;SACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,GAAD,EAAM,WAAU,iDAAkD,CAAA;OAClE,kBAAC,KAAD;QAAG,WAAU;kBAAb,CAAkC,EAAO,QAAO,KAAM;;OACtD,kBAAC,KAAD;QAAG,WAAU;kBAA8B;QAAU,CAAA;OACzC;SACT,CAAA;KACH;;GACN,kBAAC,GAAD,EAAA,UAAA;IACE,kBAAC,OAAD;KAAK,WAAU;eAA6B;KAAuB,CAAA;IACnE,kBAAC,KAAD;KAAG,WAAU;eAA+B,EAAO;KAAgB,CAAA;IACnE,kBAAC,OAAD;KAAK,WAAU;eACZ,EAAO,OAAO,KAAK,MAClB,kBAAC,GAAD;MAAe,SAAQ;gBACpB;MACK,EAFI,EAEJ,CACR;KACE,CAAA;IACQ,EAAA,CAAA;GAChB,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD,EAAA,UAAW,yBAAiC,CAAA,EACjC,CAAA,EACb,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,QAAD,EAAA,UAAA;MACG,EAAO;MAAU;MAAK,EAAO;MAAS;MAClC,EAAA,CAAA,EACP,kBAAC,QAAD;MAAM,WAAU;gBAAhB,CAA+B,GAAe,IAAQ;QAClD;QACN,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,OAAO,GAAG,EAAe,IAAI;MACtC,CAAA;KACE,CAAA,CACF;OACM,CAAA,CACT,EAAA,CAAA;GACH"}
|