@burdenoff/microfe-crewfoundry 2026.704.6 → 2026.704.7
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/CrewFoundryRoutes.js +51 -43
- package/dist/crewfoundry/CrewFoundryRoutes.js.map +1 -1
- package/dist/crewfoundry/components/forms/formValues.js +5 -2
- package/dist/crewfoundry/components/forms/formValues.js.map +1 -1
- package/dist/crewfoundry/components/viz/AllocationBar.js +68 -0
- package/dist/crewfoundry/components/viz/AllocationBar.js.map +1 -0
- package/dist/crewfoundry/components/viz/AreaChart.js +102 -0
- package/dist/crewfoundry/components/viz/AreaChart.js.map +1 -0
- package/dist/crewfoundry/components/viz/AvatarStack.js +36 -0
- package/dist/crewfoundry/components/viz/AvatarStack.js.map +1 -0
- package/dist/crewfoundry/components/viz/BarChart.js +83 -0
- package/dist/crewfoundry/components/viz/BarChart.js.map +1 -0
- package/dist/crewfoundry/components/viz/CertificateCard.js +118 -0
- package/dist/crewfoundry/components/viz/CertificateCard.js.map +1 -0
- package/dist/crewfoundry/components/viz/DonutChart.js +109 -0
- package/dist/crewfoundry/components/viz/DonutChart.js.map +1 -0
- package/dist/crewfoundry/components/viz/HBarFunnel.js +54 -0
- package/dist/crewfoundry/components/viz/HBarFunnel.js.map +1 -0
- package/dist/crewfoundry/components/viz/Heatmap.js +91 -0
- package/dist/crewfoundry/components/viz/Heatmap.js.map +1 -0
- package/dist/crewfoundry/components/viz/KanbanBoard.js +50 -0
- package/dist/crewfoundry/components/viz/KanbanBoard.js.map +1 -0
- package/dist/crewfoundry/components/viz/LineChart.js +123 -0
- package/dist/crewfoundry/components/viz/LineChart.js.map +1 -0
- package/dist/crewfoundry/components/viz/OrgTree.js +83 -0
- package/dist/crewfoundry/components/viz/OrgTree.js.map +1 -0
- package/dist/crewfoundry/components/viz/PathSteps.js +68 -0
- package/dist/crewfoundry/components/viz/PathSteps.js.map +1 -0
- package/dist/crewfoundry/components/viz/ProgressRing.js +68 -0
- package/dist/crewfoundry/components/viz/ProgressRing.js.map +1 -0
- package/dist/crewfoundry/components/viz/RatingStars.js +51 -0
- package/dist/crewfoundry/components/viz/RatingStars.js.map +1 -0
- package/dist/crewfoundry/components/viz/SegmentedTabs.js +69 -0
- package/dist/crewfoundry/components/viz/SegmentedTabs.js.map +1 -0
- package/dist/crewfoundry/components/viz/SkillBar.js +3 -0
- package/dist/crewfoundry/components/viz/Sparkline.js +74 -0
- package/dist/crewfoundry/components/viz/Sparkline.js.map +1 -0
- package/dist/crewfoundry/components/viz/StatCard.js +60 -0
- package/dist/crewfoundry/components/viz/StatCard.js.map +1 -0
- package/dist/crewfoundry/components/viz/StepProgress.js +3 -0
- package/dist/crewfoundry/components/viz/Timeline.js +66 -0
- package/dist/crewfoundry/components/viz/Timeline.js.map +1 -0
- package/dist/crewfoundry/components/viz/index.js +23 -0
- package/dist/crewfoundry/components/viz/lib/Avatar.js +30 -0
- package/dist/crewfoundry/components/viz/lib/Avatar.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/CartesianFrame.js +119 -0
- package/dist/crewfoundry/components/viz/lib/CartesianFrame.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js +35 -0
- package/dist/crewfoundry/components/viz/lib/ResponsiveSvg.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/format.js +21 -0
- package/dist/crewfoundry/components/viz/lib/format.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/geometry.js +69 -0
- package/dist/crewfoundry/components/viz/lib/geometry.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/hooks.js +39 -0
- package/dist/crewfoundry/components/viz/lib/hooks.js.map +1 -0
- package/dist/crewfoundry/components/viz/lib/palette.js +27 -0
- package/dist/crewfoundry/components/viz/lib/palette.js.map +1 -0
- package/dist/crewfoundry/lib/analytics.js +323 -0
- package/dist/crewfoundry/lib/analytics.js.map +1 -0
- package/dist/crewfoundry/lib/companyFinance.js +16 -0
- package/dist/crewfoundry/lib/companyFinance.js.map +1 -0
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js +226 -283
- package/dist/crewfoundry/pages/AnalyticsAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js +107 -120
- package/dist/crewfoundry/pages/AnalyticsEmployeeAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js +122 -162
- package/dist/crewfoundry/pages/AnalyticsFinancialAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js +121 -158
- package/dist/crewfoundry/pages/AnalyticsHiringAnalyticsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js +316 -211
- package/dist/crewfoundry/pages/CommunicationsAnnouncementsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js +75 -27
- package/dist/crewfoundry/pages/CommunicationsMessagesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js +167 -165
- package/dist/crewfoundry/pages/CompanyClientManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js +168 -109
- package/dist/crewfoundry/pages/CompanyVendorManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js +401 -290
- package/dist/crewfoundry/pages/DashboardDashboardPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js +84 -75
- package/dist/crewfoundry/pages/HiringApplicationsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js +368 -174
- package/dist/crewfoundry/pages/HiringCandidatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js +236 -201
- package/dist/crewfoundry/pages/HiringCreateJobPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js +369 -196
- package/dist/crewfoundry/pages/HiringInterviewsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js +269 -270
- package/dist/crewfoundry/pages/HiringJobDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HiringJobsPagePage.js +210 -110
- package/dist/crewfoundry/pages/HiringJobsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js +216 -178
- package/dist/crewfoundry/pages/HrDepartmentsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js +385 -0
- package/dist/crewfoundry/pages/HrEmployeeProfilePagePage.js.map +1 -0
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js +189 -130
- package/dist/crewfoundry/pages/HrEmployeesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js +397 -241
- package/dist/crewfoundry/pages/HrLeaveManagementPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrPayrollPagePage.js +262 -147
- package/dist/crewfoundry/pages/HrPayrollPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js +345 -167
- package/dist/crewfoundry/pages/HrTimeTrackingPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js +98 -24
- package/dist/crewfoundry/pages/LearningCertificatesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js +1 -1
- package/dist/crewfoundry/pages/LearningCourseDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js +289 -108
- package/dist/crewfoundry/pages/LearningCourseLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js +221 -114
- package/dist/crewfoundry/pages/LearningCoursesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js +134 -135
- package/dist/crewfoundry/pages/LearningLearningPathDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js +148 -97
- package/dist/crewfoundry/pages/LearningLearningPathsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js +264 -157
- package/dist/crewfoundry/pages/LearningMyLearningPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js +85 -93
- package/dist/crewfoundry/pages/MarketplaceFreelancerProfilePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js +211 -122
- package/dist/crewfoundry/pages/MarketplaceMarketplacePagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js +94 -54
- package/dist/crewfoundry/pages/MarketplaceMarketplaceServicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js +289 -140
- package/dist/crewfoundry/pages/MarketplaceServiceDetailsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js +169 -79
- package/dist/crewfoundry/pages/PaymentsInvoicesPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js +296 -125
- package/dist/crewfoundry/pages/ProjectsProjectsPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js +187 -0
- package/dist/crewfoundry/pages/ProjectsResourcingPagePage.js.map +1 -0
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js +140 -78
- package/dist/crewfoundry/pages/TeamsTeamDetailPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js +93 -43
- package/dist/crewfoundry/pages/TeamsTeamDirectoryPagePage.js.map +1 -1
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js +250 -98
- package/dist/crewfoundry/pages/TeamsTeamsPagePage.js.map +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js +1 -1
- package/dist/crewfoundry/store/crewfoundryStore.js.map +1 -1
- package/dist/crewfoundry/utils/cn.js +10 -0
- package/dist/crewfoundry/utils/cn.js.map +1 -0
- package/dist/crewfoundry/utils/courseProgress.js +46 -0
- package/dist/crewfoundry/utils/courseProgress.js.map +1 -0
- package/dist/node_modules/clsx/dist/clsx.js +18 -0
- package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,191 +1,190 @@
|
|
|
1
1
|
import { useCrewFoundryStore as e } from "../store/crewfoundryStore.js";
|
|
2
2
|
import { formatEnumLabel as t } from "../utils/formatEnumLabel.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
3
|
+
import { ProgressRing as n } from "../components/viz/ProgressRing.js";
|
|
4
|
+
import { PathSteps as r } from "../components/viz/PathSteps.js";
|
|
5
|
+
import { RatingStars as i } from "../components/viz/RatingStars.js";
|
|
6
|
+
import "../components/viz/index.js";
|
|
7
|
+
import { useState as a } from "react";
|
|
8
|
+
import { BookOpen as o, Check as s, ChevronRight as c, Clock as l, Users as u } from "lucide-react";
|
|
9
|
+
import { useNavigate as d, useSearchParams as f } from "react-router-dom";
|
|
10
|
+
import { jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
11
|
+
import { Badge as h, Button as g, Card as _, CardContent as v, EmphasisPanel as y, GradientText as b, IllustratedEmptyState as x, PagePurpose as S, Spinner as C } from "@burdenoff/fe-libs/ui";
|
|
12
|
+
import { useGlobalUi as w } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
9
13
|
//#region src/crewfoundry/pages/LearningLearningPathDetailPagePage.tsx
|
|
10
|
-
function
|
|
11
|
-
let [
|
|
12
|
-
if (!
|
|
14
|
+
function T() {
|
|
15
|
+
let [T] = f(), E = d(), { learningPaths: D, courses: O, enrollCourse: k, initialized: A } = e(), { showToast: j } = w(), [M, N] = a(!1), P = T.get("id"), F = P ? D.find((e) => e.id === P) : D[0];
|
|
16
|
+
if (!A && !F) return /* @__PURE__ */ p("div", {
|
|
13
17
|
className: "flex min-h-[60vh] items-center justify-center p-6",
|
|
14
|
-
children: /* @__PURE__ */
|
|
18
|
+
children: /* @__PURE__ */ p(C, { size: "lg" })
|
|
15
19
|
});
|
|
16
|
-
if (!
|
|
20
|
+
if (!F) return /* @__PURE__ */ p("div", {
|
|
17
21
|
className: "p-6",
|
|
18
|
-
children: /* @__PURE__ */
|
|
22
|
+
children: /* @__PURE__ */ p(x, {
|
|
19
23
|
illustration: "empty-search",
|
|
20
24
|
title: "No learning path found",
|
|
21
25
|
description: "This learning path is no longer available."
|
|
22
26
|
})
|
|
23
27
|
});
|
|
24
|
-
let
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
let I = O.filter((e) => F.courses.includes(e.id)), L = Math.round(F.completionRate / 100 * I.length), R = I.map((e, t) => ({
|
|
29
|
+
label: e.title,
|
|
30
|
+
state: t < L ? "done" : t === L ? "active" : "todo"
|
|
31
|
+
})), z = (e) => E(`../learning/course-learning-page?id=${encodeURIComponent(e)}`);
|
|
32
|
+
return /* @__PURE__ */ m("div", {
|
|
33
|
+
className: "max-w-5xl space-y-6 p-6",
|
|
27
34
|
children: [
|
|
28
|
-
/* @__PURE__ */
|
|
29
|
-
className: "flex items-
|
|
30
|
-
children: [/* @__PURE__ */
|
|
31
|
-
/* @__PURE__ */
|
|
35
|
+
/* @__PURE__ */ m("div", {
|
|
36
|
+
className: "flex flex-wrap items-start justify-between gap-3",
|
|
37
|
+
children: [/* @__PURE__ */ m("div", { children: [
|
|
38
|
+
/* @__PURE__ */ p("h1", {
|
|
32
39
|
className: "text-2xl font-semibold",
|
|
33
|
-
children: /* @__PURE__ */
|
|
40
|
+
children: /* @__PURE__ */ p(b, { children: F.title })
|
|
34
41
|
}),
|
|
35
|
-
/* @__PURE__ */
|
|
42
|
+
/* @__PURE__ */ p("p", {
|
|
36
43
|
className: "text-sm text-text-secondary",
|
|
37
|
-
children:
|
|
44
|
+
children: F.description
|
|
38
45
|
}),
|
|
39
|
-
/* @__PURE__ */
|
|
46
|
+
/* @__PURE__ */ p(S, {
|
|
40
47
|
className: "mt-1",
|
|
41
48
|
children: "Follow a single learning path end-to-end — see its courses, your progress, and what to complete next to finish the journey."
|
|
42
49
|
})
|
|
43
|
-
] }), /* @__PURE__ */
|
|
50
|
+
] }), /* @__PURE__ */ p(g, {
|
|
44
51
|
onClick: async () => {
|
|
45
|
-
if (
|
|
46
|
-
|
|
52
|
+
if (I.length === 0) {
|
|
53
|
+
j("No courses in this path yet", "warning");
|
|
47
54
|
return;
|
|
48
55
|
}
|
|
49
|
-
|
|
56
|
+
N(!0);
|
|
50
57
|
try {
|
|
51
|
-
for (let e of
|
|
52
|
-
|
|
58
|
+
for (let e of I) await k(e.id);
|
|
59
|
+
j(`Enrolled in ${I.length} course${I.length > 1 ? "s" : ""}`, "success");
|
|
53
60
|
} catch (e) {
|
|
54
|
-
|
|
61
|
+
j(e instanceof Error ? e.message : "Unable to enroll in path", "error");
|
|
55
62
|
} finally {
|
|
56
|
-
|
|
63
|
+
N(!1);
|
|
57
64
|
}
|
|
58
65
|
},
|
|
59
|
-
disabled:
|
|
60
|
-
children:
|
|
66
|
+
disabled: M,
|
|
67
|
+
children: M ? "Enrolling…" : "Enroll Now"
|
|
61
68
|
})]
|
|
62
69
|
}),
|
|
63
|
-
/* @__PURE__ */
|
|
64
|
-
className: "grid gap-
|
|
65
|
-
children: [
|
|
66
|
-
|
|
67
|
-
|
|
70
|
+
/* @__PURE__ */ p(_, { children: /* @__PURE__ */ m(v, {
|
|
71
|
+
className: "grid gap-6 p-5 md:grid-cols-[auto_minmax(0,1fr)] md:items-center",
|
|
72
|
+
children: [/* @__PURE__ */ p("div", {
|
|
73
|
+
className: "flex items-center justify-center",
|
|
74
|
+
children: /* @__PURE__ */ p(n, {
|
|
75
|
+
value: F.completionRate,
|
|
76
|
+
caption: "complete",
|
|
77
|
+
label: `${F.completionRate}%`
|
|
78
|
+
})
|
|
79
|
+
}), /* @__PURE__ */ m("div", {
|
|
80
|
+
className: "space-y-4",
|
|
81
|
+
children: [/* @__PURE__ */ m("div", {
|
|
82
|
+
className: "flex flex-wrap gap-2",
|
|
68
83
|
children: [
|
|
69
|
-
/* @__PURE__ */
|
|
70
|
-
|
|
71
|
-
className: "text-
|
|
72
|
-
children:
|
|
84
|
+
/* @__PURE__ */ p(h, {
|
|
85
|
+
variant: "secondary",
|
|
86
|
+
className: "text-[10px]",
|
|
87
|
+
children: t(F.level)
|
|
73
88
|
}),
|
|
74
|
-
/* @__PURE__ */
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
]
|
|
79
|
-
}) }),
|
|
80
|
-
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
81
|
-
className: "p-4 text-center",
|
|
82
|
-
children: [
|
|
83
|
-
/* @__PURE__ */ l(a, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
84
|
-
/* @__PURE__ */ l("p", {
|
|
85
|
-
className: "text-lg font-bold",
|
|
86
|
-
children: A.duration
|
|
89
|
+
/* @__PURE__ */ m(h, {
|
|
90
|
+
variant: "outline",
|
|
91
|
+
className: "inline-flex items-center gap-1 text-[10px]",
|
|
92
|
+
children: [/* @__PURE__ */ p(l, { className: "h-3 w-3" }), F.duration]
|
|
87
93
|
}),
|
|
88
|
-
/* @__PURE__ */
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
children: [
|
|
97
|
-
/* @__PURE__ */ l(s, { className: "h-5 w-5 mx-auto text-text-secondary mb-1" }),
|
|
98
|
-
/* @__PURE__ */ l("p", {
|
|
99
|
-
className: "text-lg font-bold",
|
|
100
|
-
children: A.enrolled
|
|
101
|
-
}),
|
|
102
|
-
/* @__PURE__ */ l("p", {
|
|
103
|
-
className: "text-xs text-text-secondary",
|
|
104
|
-
children: "Enrolled"
|
|
105
|
-
})
|
|
106
|
-
]
|
|
107
|
-
}) }),
|
|
108
|
-
/* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
109
|
-
className: "p-4 text-center",
|
|
110
|
-
children: [
|
|
111
|
-
/* @__PURE__ */ l(i, { className: "h-5 w-5 mx-auto text-status-success-text mb-1" }),
|
|
112
|
-
/* @__PURE__ */ u("p", {
|
|
113
|
-
className: "text-lg font-bold",
|
|
114
|
-
children: [A.completionRate, "%"]
|
|
94
|
+
/* @__PURE__ */ m(h, {
|
|
95
|
+
variant: "outline",
|
|
96
|
+
className: "inline-flex items-center gap-1 text-[10px]",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ p(o, { className: "h-3 w-3" }),
|
|
99
|
+
I.length,
|
|
100
|
+
" courses"
|
|
101
|
+
]
|
|
115
102
|
}),
|
|
116
|
-
/* @__PURE__ */
|
|
117
|
-
|
|
118
|
-
|
|
103
|
+
/* @__PURE__ */ m(h, {
|
|
104
|
+
variant: "outline",
|
|
105
|
+
className: "inline-flex items-center gap-1 text-[10px]",
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ p(u, { className: "h-3 w-3" }),
|
|
108
|
+
F.enrolled,
|
|
109
|
+
" enrolled"
|
|
110
|
+
]
|
|
119
111
|
})
|
|
120
112
|
]
|
|
121
|
-
}) })
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
113
|
+
}), R.length > 0 ? /* @__PURE__ */ p(r, { steps: R }) : /* @__PURE__ */ p("p", {
|
|
114
|
+
className: "text-sm text-text-secondary",
|
|
115
|
+
children: "No courses have been added to this path yet."
|
|
116
|
+
})]
|
|
117
|
+
})]
|
|
118
|
+
}) }),
|
|
119
|
+
/* @__PURE__ */ m(y, { children: [
|
|
120
|
+
/* @__PURE__ */ p("div", {
|
|
126
121
|
className: "text-lg font-semibold",
|
|
127
122
|
children: "Courses in this Path"
|
|
128
123
|
}),
|
|
129
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ m("p", {
|
|
130
125
|
className: "mb-4 text-sm text-text-secondary",
|
|
131
126
|
children: [
|
|
132
|
-
|
|
127
|
+
I.length,
|
|
133
128
|
" courses · ",
|
|
134
|
-
|
|
129
|
+
t(F.level)
|
|
135
130
|
]
|
|
136
131
|
}),
|
|
137
|
-
/* @__PURE__ */
|
|
132
|
+
/* @__PURE__ */ p("div", {
|
|
138
133
|
className: "space-y-3",
|
|
139
|
-
children:
|
|
134
|
+
children: I.length === 0 ? /* @__PURE__ */ p(x, {
|
|
140
135
|
illustration: "empty-generic",
|
|
141
136
|
title: "No courses in this path yet",
|
|
142
137
|
description: "Courses added to this path will appear here in order."
|
|
143
|
-
}) :
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
e.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
children: [/* @__PURE__ */ u("div", {
|
|
170
|
-
className: "flex items-center gap-1",
|
|
171
|
-
children: [/* @__PURE__ */ l(o, { className: "h-3 w-3 text-status-warning-text" }), /* @__PURE__ */ l("span", {
|
|
172
|
-
className: "text-sm",
|
|
173
|
-
children: e.rating
|
|
138
|
+
}) : I.map((e, n) => {
|
|
139
|
+
let r = n < L;
|
|
140
|
+
return /* @__PURE__ */ m("button", {
|
|
141
|
+
type: "button",
|
|
142
|
+
onClick: () => z(e.id),
|
|
143
|
+
className: "flex w-full items-center gap-3 rounded-lg border border-border-subtle p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken",
|
|
144
|
+
children: [
|
|
145
|
+
/* @__PURE__ */ p("span", {
|
|
146
|
+
className: `flex h-8 w-8 shrink-0 items-center justify-center rounded-full border text-sm font-semibold ${r ? "border-transparent bg-status-success-bg text-status-success-text" : n === L ? "border-action-primary-bg text-action-primary-bg" : "border-border-default text-text-secondary"}`,
|
|
147
|
+
children: r ? /* @__PURE__ */ p(s, { className: "h-4 w-4" }) : n + 1
|
|
148
|
+
}),
|
|
149
|
+
/* @__PURE__ */ m("div", {
|
|
150
|
+
className: "min-w-0 flex-1",
|
|
151
|
+
children: [/* @__PURE__ */ p("p", {
|
|
152
|
+
className: "truncate text-sm font-medium",
|
|
153
|
+
children: e.title
|
|
154
|
+
}), /* @__PURE__ */ m("p", {
|
|
155
|
+
className: "truncate text-xs text-text-secondary",
|
|
156
|
+
children: [
|
|
157
|
+
e.instructor,
|
|
158
|
+
" · ",
|
|
159
|
+
e.duration,
|
|
160
|
+
" · ",
|
|
161
|
+
e.modules,
|
|
162
|
+
" modules"
|
|
163
|
+
]
|
|
174
164
|
})]
|
|
175
|
-
}),
|
|
176
|
-
|
|
177
|
-
className: "
|
|
178
|
-
children:
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
165
|
+
}),
|
|
166
|
+
/* @__PURE__ */ m("div", {
|
|
167
|
+
className: "hidden items-center gap-3 sm:flex",
|
|
168
|
+
children: [/* @__PURE__ */ p(i, {
|
|
169
|
+
value: e.rating,
|
|
170
|
+
size: 13,
|
|
171
|
+
showValue: !0
|
|
172
|
+
}), /* @__PURE__ */ p(h, {
|
|
173
|
+
variant: e.level === "beginner" ? "secondary" : e.level === "intermediate" ? "default" : "destructive",
|
|
174
|
+
className: "text-[10px]",
|
|
175
|
+
children: t(e.level)
|
|
176
|
+
})]
|
|
177
|
+
}),
|
|
178
|
+
/* @__PURE__ */ p(c, { className: "h-4 w-4 shrink-0 text-text-muted" })
|
|
179
|
+
]
|
|
180
|
+
}, e.id);
|
|
181
|
+
})
|
|
183
182
|
})
|
|
184
183
|
] })
|
|
185
184
|
]
|
|
186
185
|
});
|
|
187
186
|
}
|
|
188
187
|
//#endregion
|
|
189
|
-
export {
|
|
188
|
+
export { T as LearningLearningPathDetailPagePage };
|
|
190
189
|
|
|
191
190
|
//# 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 EmphasisPanel,\n GradientText,\n IllustratedEmptyState,\n PagePurpose,\n Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, CheckCircle, Clock, Star, Users } from 'lucide-react';\nimport { useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function LearningLearningPathDetailPagePage() {\n const [searchParams] = useSearchParams();\n const { learningPaths, courses, enrollCourse, initialized } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [enrolling, setEnrolling] = useState(false);\n const pathId = searchParams.get('id');\n const path = pathId ? learningPaths.find((p) => p.id === pathId) : learningPaths[0];\n if (!initialized && !path) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\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 const handleEnroll = async () => {\n if (pathCourses.length === 0) {\n showToast('No courses in this path yet', 'warning');\n return;\n }\n setEnrolling(true);\n try {\n for (const course of pathCourses) {\n await enrollCourse(course.id);\n }\n showToast(\n `Enrolled in ${pathCourses.length} course${pathCourses.length > 1 ? 's' : ''}`,\n 'success'\n );\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to enroll in path', 'error');\n } finally {\n setEnrolling(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6 max-w-4xl\">\n <div className=\"flex items-center justify-between\">\n <div>\n <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\">\n Follow a single learning path end-to-end — see its courses, your progress, and what to\n complete next to finish the journey.\n </PagePurpose>\n </div>\n <Button onClick={handleEnroll} disabled={enrolling}>\n {enrolling ? 'Enrolling…' : 'Enroll Now'}\n </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 {formatEnumLabel(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
|
+
{"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 Spinner,\n} from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Check, ChevronRight, Clock, Users } from 'lucide-react';\nimport { useState } from 'react';\nimport { useNavigate, useSearchParams } from 'react-router-dom';\nimport { useGlobalUi } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useCrewFoundryStore } from '../store/crewfoundryStore';\nimport { PathSteps, ProgressRing, RatingStars, type PathStep } from '../components/viz';\nimport { formatEnumLabel } from '../utils/formatEnumLabel';\n\nexport function LearningLearningPathDetailPagePage() {\n const [searchParams] = useSearchParams();\n const navigate = useNavigate();\n const { learningPaths, courses, enrollCourse, initialized } = useCrewFoundryStore();\n const { showToast } = useGlobalUi();\n const [enrolling, setEnrolling] = useState(false);\n const pathId = searchParams.get('id');\n const path = pathId ? learningPaths.find((p) => p.id === pathId) : learningPaths[0];\n if (!initialized && !path) {\n return (\n <div className=\"flex min-h-[60vh] items-center justify-center p-6\">\n <Spinner size=\"lg\" />\n </div>\n );\n }\n\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 const completedCount = Math.round((path.completionRate / 100) * pathCourses.length);\n const steps: PathStep[] = pathCourses.map((c, i) => ({\n label: c.title,\n state: i < completedCount ? 'done' : i === completedCount ? 'active' : 'todo',\n }));\n\n const openPlayer = (id: string) =>\n navigate(`../learning/course-learning-page?id=${encodeURIComponent(id)}`);\n\n const handleEnroll = async () => {\n if (pathCourses.length === 0) {\n showToast('No courses in this path yet', 'warning');\n return;\n }\n setEnrolling(true);\n try {\n for (const course of pathCourses) {\n await enrollCourse(course.id);\n }\n showToast(\n `Enrolled in ${pathCourses.length} course${pathCourses.length > 1 ? 's' : ''}`,\n 'success'\n );\n } catch (error) {\n showToast(error instanceof Error ? error.message : 'Unable to enroll in path', 'error');\n } finally {\n setEnrolling(false);\n }\n };\n\n return (\n <div className=\"max-w-5xl space-y-6 p-6\">\n <div className=\"flex flex-wrap items-start justify-between gap-3\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n <GradientText>{path.title}</GradientText>\n </h1>\n <p className=\"text-sm text-text-secondary\">{path.description}</p>\n <PagePurpose className=\"mt-1\">\n Follow a single learning path end-to-end — see its courses, your progress, and what to\n complete next to finish the journey.\n </PagePurpose>\n </div>\n <Button onClick={handleEnroll} disabled={enrolling}>\n {enrolling ? 'Enrolling…' : 'Enroll Now'}\n </Button>\n </div>\n\n {/* Overview: progress ring + timeline */}\n <Card>\n <CardContent className=\"grid gap-6 p-5 md:grid-cols-[auto_minmax(0,1fr)] md:items-center\">\n <div className=\"flex items-center justify-center\">\n <ProgressRing\n value={path.completionRate}\n caption=\"complete\"\n label={`${path.completionRate}%`}\n />\n </div>\n <div className=\"space-y-4\">\n <div className=\"flex flex-wrap gap-2\">\n <Badge variant=\"secondary\" className=\"text-[10px]\">\n {formatEnumLabel(path.level)}\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <Clock className=\"h-3 w-3\" />\n {path.duration}\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <BookOpen className=\"h-3 w-3\" />\n {pathCourses.length} courses\n </Badge>\n <Badge variant=\"outline\" className=\"inline-flex items-center gap-1 text-[10px]\">\n <Users className=\"h-3 w-3\" />\n {path.enrolled} enrolled\n </Badge>\n </div>\n {steps.length > 0 ? (\n <PathSteps steps={steps} />\n ) : (\n <p className=\"text-sm text-text-secondary\">\n No courses have been added to this path yet.\n </p>\n )}\n </div>\n </CardContent>\n </Card>\n\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 · {formatEnumLabel(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 const done = idx < completedCount;\n const isCurrent = idx === completedCount;\n return (\n <button\n key={course.id}\n type=\"button\"\n onClick={() => openPlayer(course.id)}\n className=\"flex w-full items-center gap-3 rounded-lg border border-border-subtle p-4 text-left transition-colors hover:border-border-strong hover:bg-bg-sunken\"\n >\n <span\n className={`flex h-8 w-8 shrink-0 items-center justify-center rounded-full border text-sm font-semibold ${\n done\n ? 'border-transparent bg-status-success-bg text-status-success-text'\n : isCurrent\n ? 'border-action-primary-bg text-action-primary-bg'\n : 'border-border-default text-text-secondary'\n }`}\n >\n {done ? <Check className=\"h-4 w-4\" /> : idx + 1}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate text-sm font-medium\">{course.title}</p>\n <p className=\"truncate text-xs text-text-secondary\">\n {course.instructor} · {course.duration} · {course.modules} modules\n </p>\n </div>\n <div className=\"hidden items-center gap-3 sm:flex\">\n <RatingStars value={course.rating} size={13} showValue />\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 {formatEnumLabel(course.level)}\n </Badge>\n </div>\n <ChevronRight className=\"h-4 w-4 shrink-0 text-text-muted\" />\n </button>\n );\n })\n )}\n </div>\n </EmphasisPanel>\n </div>\n );\n}\n"],"mappings":"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"}
|