@burdenoff/microfe-technospam 2026.509.101
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/README.md +12 -0
- package/dist/dev/main.d.ts +2 -0
- package/dist/dev/main.d.ts.map +1 -0
- package/dist/generated/global-operations.d.ts +2 -0
- package/dist/generated/global-operations.d.ts.map +1 -0
- package/dist/generated/global-types.d.ts +18199 -0
- package/dist/generated/global-types.d.ts.map +1 -0
- package/dist/generated/wspace-operations.d.ts +2 -0
- package/dist/generated/wspace-operations.d.ts.map +1 -0
- package/dist/generated/wspace-types.d.ts +43046 -0
- package/dist/generated/wspace-types.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/technospam/TechnoSpamRoot.d.ts +5 -0
- package/dist/technospam/TechnoSpamRoot.d.ts.map +1 -0
- package/dist/technospam/TechnoSpamRoot.js +482 -0
- package/dist/technospam/TechnoSpamRoot.js.map +1 -0
- package/dist/technospam/TechnoSpamRoutes.d.ts +2 -0
- package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -0
- package/dist/technospam/TechnoSpamRoutes.js +191 -0
- package/dist/technospam/TechnoSpamRoutes.js.map +1 -0
- package/dist/technospam/index.d.ts +5 -0
- package/dist/technospam/index.d.ts.map +1 -0
- package/dist/technospam/index.js +3 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts +2 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js +269 -0
- package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -0
- package/dist/technospam/pages/AdminAuditReportsPagePage.d.ts +2 -0
- package/dist/technospam/pages/AdminAuditReportsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AdminAuditReportsPagePage.js +179 -0
- package/dist/technospam/pages/AdminAuditReportsPagePage.js.map +1 -0
- package/dist/technospam/pages/AnalyticsAchievementsPagePage.d.ts +2 -0
- package/dist/technospam/pages/AnalyticsAchievementsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AnalyticsAchievementsPagePage.js +149 -0
- package/dist/technospam/pages/AnalyticsAchievementsPagePage.js.map +1 -0
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +260 -0
- package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
- package/dist/technospam/pages/AnalyticsProgressPagePage.d.ts +2 -0
- package/dist/technospam/pages/AnalyticsProgressPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AnalyticsProgressPagePage.js +215 -0
- package/dist/technospam/pages/AnalyticsProgressPagePage.js.map +1 -0
- package/dist/technospam/pages/AnalyticsReportsPagePage.d.ts +2 -0
- package/dist/technospam/pages/AnalyticsReportsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/AnalyticsReportsPagePage.js +145 -0
- package/dist/technospam/pages/AnalyticsReportsPagePage.js.map +1 -0
- package/dist/technospam/pages/ApplicationsPortfolioPagePage.d.ts +2 -0
- package/dist/technospam/pages/ApplicationsPortfolioPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/ApplicationsPortfolioPagePage.js +227 -0
- package/dist/technospam/pages/ApplicationsPortfolioPagePage.js.map +1 -0
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +194 -0
- package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts +2 -0
- package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js +203 -0
- package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -0
- package/dist/technospam/pages/ApplicationsSolutionsPagePage.d.ts +2 -0
- package/dist/technospam/pages/ApplicationsSolutionsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/ApplicationsSolutionsPagePage.js +182 -0
- package/dist/technospam/pages/ApplicationsSolutionsPagePage.js.map +1 -0
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +261 -0
- package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/CoursesCoursesPagePage.d.ts +2 -0
- package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/CoursesCoursesPagePage.js +179 -0
- package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -0
- package/dist/technospam/pages/CoursesInstructorProfilePagePage.d.ts +2 -0
- package/dist/technospam/pages/CoursesInstructorProfilePagePage.d.ts.map +1 -0
- package/dist/technospam/pages/CoursesInstructorProfilePagePage.js +346 -0
- package/dist/technospam/pages/CoursesInstructorProfilePagePage.js.map +1 -0
- package/dist/technospam/pages/CoursesInstructorsPagePage.d.ts +2 -0
- package/dist/technospam/pages/CoursesInstructorsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/CoursesInstructorsPagePage.js +104 -0
- package/dist/technospam/pages/CoursesInstructorsPagePage.js.map +1 -0
- package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts +2 -0
- package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/CoursesMyLearningPagePage.js +187 -0
- package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -0
- package/dist/technospam/pages/DashboardDashboardPagePage.d.ts +2 -0
- package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/DashboardDashboardPagePage.js +344 -0
- package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -0
- package/dist/technospam/pages/HackathonsEventsPagePage.d.ts +2 -0
- package/dist/technospam/pages/HackathonsEventsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/HackathonsEventsPagePage.js +121 -0
- package/dist/technospam/pages/HackathonsEventsPagePage.js.map +1 -0
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +250 -0
- package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts +2 -0
- package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js +162 -0
- package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -0
- package/dist/technospam/pages/HackathonsTeamsPagePage.d.ts +2 -0
- package/dist/technospam/pages/HackathonsTeamsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/HackathonsTeamsPagePage.js +185 -0
- package/dist/technospam/pages/HackathonsTeamsPagePage.js.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.js +181 -0
- package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.d.ts +2 -0
- package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.js +112 -0
- package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.js.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.d.ts +2 -0
- package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.js +105 -0
- package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.js.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.d.ts +2 -0
- package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.d.ts.map +1 -0
- package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.js +165 -0
- package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.js.map +1 -0
- package/dist/technospam/pages/MentorshipBookingsPagePage.d.ts +2 -0
- package/dist/technospam/pages/MentorshipBookingsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/MentorshipBookingsPagePage.js +188 -0
- package/dist/technospam/pages/MentorshipBookingsPagePage.js.map +1 -0
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts +2 -0
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts.map +1 -0
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +310 -0
- package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -0
- package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts +2 -0
- package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/MentorshipMentorsPagePage.js +128 -0
- package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -0
- package/dist/technospam/pages/MentorshipMentorshipPagePage.d.ts +2 -0
- package/dist/technospam/pages/MentorshipMentorshipPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/MentorshipMentorshipPagePage.js +209 -0
- package/dist/technospam/pages/MentorshipMentorshipPagePage.js.map +1 -0
- package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts +2 -0
- package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/MentorshipSessionsPagePage.js +170 -0
- package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -0
- package/dist/technospam/pages/OpenSourceContributionsPagePage.d.ts +2 -0
- package/dist/technospam/pages/OpenSourceContributionsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/OpenSourceContributionsPagePage.js +191 -0
- package/dist/technospam/pages/OpenSourceContributionsPagePage.js.map +1 -0
- package/dist/technospam/pages/OpenSourceOpenSourcePagePage.d.ts +2 -0
- package/dist/technospam/pages/OpenSourceOpenSourcePagePage.d.ts.map +1 -0
- package/dist/technospam/pages/OpenSourceOpenSourcePagePage.js +216 -0
- package/dist/technospam/pages/OpenSourceOpenSourcePagePage.js.map +1 -0
- package/dist/technospam/pages/OpenSourceProjectsPagePage.d.ts +2 -0
- package/dist/technospam/pages/OpenSourceProjectsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/OpenSourceProjectsPagePage.js +150 -0
- package/dist/technospam/pages/OpenSourceProjectsPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerGoalsPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerGoalsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerGoalsPagePage.js +161 -0
- package/dist/technospam/pages/StudyPlannerGoalsPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.js +198 -0
- package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.js +105 -0
- package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.js +161 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.js +127 -0
- package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.js +238 -0
- package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.js.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.d.ts +2 -0
- package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.d.ts.map +1 -0
- package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.js +113 -0
- package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.js.map +1 -0
- package/dist/technospam/providers/TechnoSpamProvider.d.ts +6 -0
- package/dist/technospam/providers/TechnoSpamProvider.d.ts.map +1 -0
- package/dist/technospam/providers/TechnoSpamProvider.js +27 -0
- package/dist/technospam/providers/TechnoSpamProvider.js.map +1 -0
- package/dist/technospam/store/technospamStore.d.ts +190 -0
- package/dist/technospam/store/technospamStore.d.ts.map +1 -0
- package/dist/technospam/store/technospamStore.js +912 -0
- package/dist/technospam/store/technospamStore.js.map +1 -0
- package/dist/technospam/types/index.d.ts +51 -0
- package/dist/technospam/types/index.d.ts.map +1 -0
- package/dist/technospam/utils/cn.d.ts +4 -0
- package/dist/technospam/utils/cn.d.ts.map +1 -0
- package/dist/technospam/utils/i18n.d.ts +6 -0
- package/dist/technospam/utils/i18n.d.ts.map +1 -0
- package/dist/technospam/utils/i18n.js +15 -0
- package/dist/technospam/utils/i18n.js.map +1 -0
- package/dist/technospam/utils/navigation.d.ts +2 -0
- package/dist/technospam/utils/navigation.d.ts.map +1 -0
- package/dist/technospam/utils/navigation.js +8 -0
- package/dist/technospam/utils/navigation.js.map +1 -0
- package/package.json +107 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { useTechnoSpamStore as e } from "../store/technospamStore.js";
|
|
2
|
+
import { useMemo as t, useState as n } from "react";
|
|
3
|
+
import { Award as r, BookOpen as i, Clock as a, GraduationCap as o, PlayCircle as s, RotateCcw as c } from "lucide-react";
|
|
4
|
+
import { jsx as l, jsxs as u } from "react/jsx-runtime";
|
|
5
|
+
import { Badge as d, Button as f, Card as p, CardContent as m, CardHeader as h, CardTitle as g } from "@burdenoff/fe-libs/ui";
|
|
6
|
+
//#region src/technospam/pages/CoursesMyLearningPagePage.tsx
|
|
7
|
+
var _ = {
|
|
8
|
+
c1: 72,
|
|
9
|
+
c2: 45,
|
|
10
|
+
c3: 18,
|
|
11
|
+
c4: 100,
|
|
12
|
+
c5: 0,
|
|
13
|
+
c6: 90
|
|
14
|
+
};
|
|
15
|
+
function v() {
|
|
16
|
+
let { courses: v, userStats: y } = e(), [b, x] = n("all"), S = t(() => v.map((e) => ({
|
|
17
|
+
...e,
|
|
18
|
+
progress: _[e.id] ?? 0
|
|
19
|
+
})), [v]), C = t(() => S.filter((e) => b === "completed" ? e.progress === 100 : b === "in_progress" ? e.progress > 0 && e.progress < 100 : !0), [S, b]), w = [
|
|
20
|
+
{
|
|
21
|
+
label: "All Courses",
|
|
22
|
+
value: "all",
|
|
23
|
+
count: S.length
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
label: "In Progress",
|
|
27
|
+
value: "in_progress",
|
|
28
|
+
count: S.filter((e) => e.progress > 0 && e.progress < 100).length
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: "Completed",
|
|
32
|
+
value: "completed",
|
|
33
|
+
count: S.filter((e) => e.progress === 100).length
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
return /* @__PURE__ */ u("div", {
|
|
37
|
+
className: "space-y-6 p-6",
|
|
38
|
+
children: [
|
|
39
|
+
/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
|
|
40
|
+
className: "text-2xl font-semibold text-foreground",
|
|
41
|
+
children: "My Learning"
|
|
42
|
+
}), /* @__PURE__ */ l("p", {
|
|
43
|
+
className: "text-sm text-muted-foreground",
|
|
44
|
+
children: "Track your enrolled courses and progress"
|
|
45
|
+
})] }),
|
|
46
|
+
/* @__PURE__ */ u("div", {
|
|
47
|
+
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
48
|
+
children: [
|
|
49
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(h, {
|
|
50
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
51
|
+
children: [/* @__PURE__ */ l(g, {
|
|
52
|
+
className: "text-sm font-medium",
|
|
53
|
+
children: "Enrolled"
|
|
54
|
+
}), /* @__PURE__ */ l(i, { className: "h-4 w-4 text-muted-foreground" })]
|
|
55
|
+
}), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ l("div", {
|
|
56
|
+
className: "text-2xl font-bold",
|
|
57
|
+
children: y.coursesEnrolled
|
|
58
|
+
}), /* @__PURE__ */ l("p", {
|
|
59
|
+
className: "text-xs text-muted-foreground",
|
|
60
|
+
children: "Total courses"
|
|
61
|
+
})] })] }),
|
|
62
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(h, {
|
|
63
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
64
|
+
children: [/* @__PURE__ */ l(g, {
|
|
65
|
+
className: "text-sm font-medium",
|
|
66
|
+
children: "Completed"
|
|
67
|
+
}), /* @__PURE__ */ l(o, { className: "h-4 w-4 text-muted-foreground" })]
|
|
68
|
+
}), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ l("div", {
|
|
69
|
+
className: "text-2xl font-bold",
|
|
70
|
+
children: y.coursesCompleted
|
|
71
|
+
}), /* @__PURE__ */ l("p", {
|
|
72
|
+
className: "text-xs text-muted-foreground",
|
|
73
|
+
children: "Courses finished"
|
|
74
|
+
})] })] }),
|
|
75
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(h, {
|
|
76
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
77
|
+
children: [/* @__PURE__ */ l(g, {
|
|
78
|
+
className: "text-sm font-medium",
|
|
79
|
+
children: "Learning Hours"
|
|
80
|
+
}), /* @__PURE__ */ l(a, { className: "h-4 w-4 text-muted-foreground" })]
|
|
81
|
+
}), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ l("div", {
|
|
82
|
+
className: "text-2xl font-bold",
|
|
83
|
+
children: y.totalLearningHours
|
|
84
|
+
}), /* @__PURE__ */ l("p", {
|
|
85
|
+
className: "text-xs text-muted-foreground",
|
|
86
|
+
children: "Total hours invested"
|
|
87
|
+
})] })] }),
|
|
88
|
+
/* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u(h, {
|
|
89
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
90
|
+
children: [/* @__PURE__ */ l(g, {
|
|
91
|
+
className: "text-sm font-medium",
|
|
92
|
+
children: "Certificates"
|
|
93
|
+
}), /* @__PURE__ */ l(r, { className: "h-4 w-4 text-muted-foreground" })]
|
|
94
|
+
}), /* @__PURE__ */ u(m, { children: [/* @__PURE__ */ l("div", {
|
|
95
|
+
className: "text-2xl font-bold",
|
|
96
|
+
children: y.certificatesEarned
|
|
97
|
+
}), /* @__PURE__ */ l("p", {
|
|
98
|
+
className: "text-xs text-muted-foreground",
|
|
99
|
+
children: "Certificates earned"
|
|
100
|
+
})] })] })
|
|
101
|
+
]
|
|
102
|
+
}),
|
|
103
|
+
/* @__PURE__ */ l("div", {
|
|
104
|
+
className: "flex gap-2 border-b border-border pb-2",
|
|
105
|
+
children: w.map((e) => /* @__PURE__ */ u(f, {
|
|
106
|
+
variant: b === e.value ? "default" : "ghost",
|
|
107
|
+
size: "sm",
|
|
108
|
+
onClick: () => x(e.value),
|
|
109
|
+
children: [
|
|
110
|
+
e.label,
|
|
111
|
+
" (",
|
|
112
|
+
e.count,
|
|
113
|
+
")"
|
|
114
|
+
]
|
|
115
|
+
}, e.value))
|
|
116
|
+
}),
|
|
117
|
+
C.length === 0 ? /* @__PURE__ */ l("div", {
|
|
118
|
+
className: "py-12 text-center text-sm text-muted-foreground",
|
|
119
|
+
children: "No courses in this category"
|
|
120
|
+
}) : /* @__PURE__ */ l("div", {
|
|
121
|
+
className: "space-y-4",
|
|
122
|
+
children: C.map((e) => /* @__PURE__ */ l(p, { children: /* @__PURE__ */ u(m, {
|
|
123
|
+
className: "flex flex-col gap-4 p-4 sm:flex-row sm:items-center",
|
|
124
|
+
children: [/* @__PURE__ */ u("div", {
|
|
125
|
+
className: "flex-1 space-y-2",
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ u("div", {
|
|
128
|
+
className: "flex items-center gap-2",
|
|
129
|
+
children: [/* @__PURE__ */ l("h3", {
|
|
130
|
+
className: "text-sm font-medium",
|
|
131
|
+
children: e.title
|
|
132
|
+
}), /* @__PURE__ */ l(d, {
|
|
133
|
+
variant: "secondary",
|
|
134
|
+
className: "text-xs",
|
|
135
|
+
children: e.level
|
|
136
|
+
})]
|
|
137
|
+
}),
|
|
138
|
+
/* @__PURE__ */ u("p", {
|
|
139
|
+
className: "text-xs text-muted-foreground",
|
|
140
|
+
children: [
|
|
141
|
+
e.instructor,
|
|
142
|
+
" · ",
|
|
143
|
+
e.duration,
|
|
144
|
+
"h · ",
|
|
145
|
+
e.category
|
|
146
|
+
]
|
|
147
|
+
}),
|
|
148
|
+
/* @__PURE__ */ u("div", {
|
|
149
|
+
className: "space-y-1",
|
|
150
|
+
children: [/* @__PURE__ */ u("div", {
|
|
151
|
+
className: "flex items-center justify-between text-xs",
|
|
152
|
+
children: [/* @__PURE__ */ l("span", {
|
|
153
|
+
className: "text-muted-foreground",
|
|
154
|
+
children: "Progress"
|
|
155
|
+
}), /* @__PURE__ */ u("span", {
|
|
156
|
+
className: "font-medium",
|
|
157
|
+
children: [e.progress, "%"]
|
|
158
|
+
})]
|
|
159
|
+
}), /* @__PURE__ */ l("div", {
|
|
160
|
+
className: "h-2 w-full overflow-hidden rounded-full bg-muted",
|
|
161
|
+
children: /* @__PURE__ */ l("div", {
|
|
162
|
+
className: `h-2 rounded-full ${e.progress === 100 ? "bg-green-500" : "bg-primary"}`,
|
|
163
|
+
style: { width: `${e.progress}%` }
|
|
164
|
+
})
|
|
165
|
+
})]
|
|
166
|
+
})
|
|
167
|
+
]
|
|
168
|
+
}), /* @__PURE__ */ l("div", {
|
|
169
|
+
className: "shrink-0",
|
|
170
|
+
children: e.progress === 100 ? /* @__PURE__ */ u(f, {
|
|
171
|
+
variant: "outline",
|
|
172
|
+
size: "sm",
|
|
173
|
+
children: [/* @__PURE__ */ l(c, { className: "mr-2 h-4 w-4" }), "Review"]
|
|
174
|
+
}) : /* @__PURE__ */ u(f, {
|
|
175
|
+
size: "sm",
|
|
176
|
+
children: [/* @__PURE__ */ l(s, { className: "mr-2 h-4 w-4" }), e.progress === 0 ? "Start" : "Continue"]
|
|
177
|
+
})
|
|
178
|
+
})]
|
|
179
|
+
}) }, e.id))
|
|
180
|
+
})
|
|
181
|
+
]
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
//#endregion
|
|
185
|
+
export { v as CoursesMyLearningPagePage };
|
|
186
|
+
|
|
187
|
+
//# sourceMappingURL=CoursesMyLearningPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CoursesMyLearningPagePage.js","names":[],"sources":["../../../src/technospam/pages/CoursesMyLearningPagePage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport { BookOpen, Award, Clock, GraduationCap, PlayCircle, RotateCcw } from 'lucide-react';\nimport { useTechnoSpamStore } from '../store/technospamStore';\n\ntype TabFilter = 'all' | 'in_progress' | 'completed';\n\nconst courseProgressMap: Record<string, number> = {\n c1: 72,\n c2: 45,\n c3: 18,\n c4: 100,\n c5: 0,\n c6: 90,\n};\n\nexport function CoursesMyLearningPagePage() {\n const { courses, userStats } = useTechnoSpamStore();\n const [activeTab, setActiveTab] = useState<TabFilter>('all');\n\n const enrolledCourses = useMemo(() => {\n return courses.map((course) => ({\n ...course,\n progress: courseProgressMap[course.id] ?? 0,\n }));\n }, [courses]);\n\n const filteredCourses = useMemo(() => {\n return enrolledCourses.filter((course) => {\n if (activeTab === 'completed') return course.progress === 100;\n if (activeTab === 'in_progress') return course.progress > 0 && course.progress < 100;\n return true;\n });\n }, [enrolledCourses, activeTab]);\n\n const tabs: { label: string; value: TabFilter; count: number }[] = [\n { label: 'All Courses', value: 'all', count: enrolledCourses.length },\n {\n label: 'In Progress',\n value: 'in_progress',\n count: enrolledCourses.filter((c) => c.progress > 0 && c.progress < 100).length,\n },\n {\n label: 'Completed',\n value: 'completed',\n count: enrolledCourses.filter((c) => c.progress === 100).length,\n },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">My Learning</h1>\n <p className=\"text-sm text-muted-foreground\">Track your enrolled courses and progress</p>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg: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\">Enrolled</CardTitle>\n <BookOpen className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.coursesEnrolled}</div>\n <p className=\"text-xs text-muted-foreground\">Total courses</p>\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 <GraduationCap className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.coursesCompleted}</div>\n <p className=\"text-xs text-muted-foreground\">Courses finished</p>\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\">Learning Hours</CardTitle>\n <Clock className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.totalLearningHours}</div>\n <p className=\"text-xs text-muted-foreground\">Total hours invested</p>\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-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.certificatesEarned}</div>\n <p className=\"text-xs text-muted-foreground\">Certificates earned</p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"flex gap-2 border-b border-border pb-2\">\n {tabs.map((tab) => (\n <Button\n key={tab.value}\n variant={activeTab === tab.value ? 'default' : 'ghost'}\n size=\"sm\"\n onClick={() => setActiveTab(tab.value)}\n >\n {tab.label} ({tab.count})\n </Button>\n ))}\n </div>\n\n {filteredCourses.length === 0 ? (\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n No courses in this category\n </div>\n ) : (\n <div className=\"space-y-4\">\n {filteredCourses.map((course) => (\n <Card key={course.id}>\n <CardContent className=\"flex flex-col gap-4 p-4 sm:flex-row sm:items-center\">\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <h3 className=\"text-sm font-medium\">{course.title}</h3>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {course.level}\n </Badge>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {course.instructor} · {course.duration}h · {course.category}\n </p>\n <div className=\"space-y-1\">\n <div className=\"flex items-center justify-between text-xs\">\n <span className=\"text-muted-foreground\">Progress</span>\n <span className=\"font-medium\">{course.progress}%</span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={`h-2 rounded-full ${course.progress === 100 ? 'bg-green-500' : 'bg-primary'}`}\n style={{ width: `${course.progress}%` }}\n />\n </div>\n </div>\n </div>\n <div className=\"shrink-0\">\n {course.progress === 100 ? (\n <Button variant=\"outline\" size=\"sm\">\n <RotateCcw className=\"mr-2 h-4 w-4\" />\n Review\n </Button>\n ) : (\n <Button size=\"sm\">\n <PlayCircle className=\"mr-2 h-4 w-4\" />\n {course.progress === 0 ? 'Start' : 'Continue'}\n </Button>\n )}\n </div>\n </CardContent>\n </Card>\n ))}\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardDashboardPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/DashboardDashboardPagePage.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,0BAA0B,4CAiUzC"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { useTechnoSpamStore as e } from "../store/technospamStore.js";
|
|
2
|
+
import { tWithFallback as t } from "../utils/i18n.js";
|
|
3
|
+
import { useI18n as n } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
4
|
+
import { ArrowRight as r, Award as i, Bell as a, BookOpen as o, Calendar as s, Clock as c, Code as l, Flame as u, Target as d, TrendingUp as f, Trophy as p } from "lucide-react";
|
|
5
|
+
import { jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
6
|
+
import { Badge as g, Button as _, Card as v, CardContent as y, CardHeader as b, CardTitle as x } from "@burdenoff/fe-libs/ui";
|
|
7
|
+
//#region src/technospam/pages/DashboardDashboardPagePage.tsx
|
|
8
|
+
function S() {
|
|
9
|
+
let { t: S } = n(), C = (e, n, r) => t(S, e, n, r), { userStats: w, notifications: T, hackathons: E, courses: D, achievements: O } = e(), k = T.filter((e) => !e.read), A = E.filter((e) => e.status === "upcoming" || e.status === "registration_open"), j = O.filter((e) => e.unlockedAt).slice(0, 3);
|
|
10
|
+
return /* @__PURE__ */ h("div", {
|
|
11
|
+
className: "space-y-6 p-6",
|
|
12
|
+
children: [
|
|
13
|
+
/* @__PURE__ */ h("div", {
|
|
14
|
+
className: "flex items-center justify-between",
|
|
15
|
+
children: [/* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("h1", {
|
|
16
|
+
className: "text-2xl font-semibold text-foreground",
|
|
17
|
+
children: C("technospam.dashboard.title", "Welcome back!")
|
|
18
|
+
}), /* @__PURE__ */ m("p", {
|
|
19
|
+
className: "text-sm text-muted-foreground",
|
|
20
|
+
children: C("technospam.dashboard.subtitle", "Here's your learning overview for today")
|
|
21
|
+
})] }), /* @__PURE__ */ h("div", {
|
|
22
|
+
className: "flex items-center gap-2",
|
|
23
|
+
children: [/* @__PURE__ */ h(g, {
|
|
24
|
+
variant: "secondary",
|
|
25
|
+
className: "flex items-center gap-1",
|
|
26
|
+
children: [/* @__PURE__ */ m(u, { className: "h-3 w-3" }), C("technospam.dashboard.hero.studyStreak", "{{count}} day streak", { count: w.studyStreak })]
|
|
27
|
+
}), /* @__PURE__ */ m(g, {
|
|
28
|
+
variant: "secondary",
|
|
29
|
+
children: C("technospam.dashboard.hero.rank", "Rank #{{rank}}", { rank: w.rank })
|
|
30
|
+
})]
|
|
31
|
+
})]
|
|
32
|
+
}),
|
|
33
|
+
/* @__PURE__ */ h("div", {
|
|
34
|
+
className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
|
|
35
|
+
children: [
|
|
36
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
37
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
38
|
+
children: [/* @__PURE__ */ m(x, {
|
|
39
|
+
className: "text-sm font-medium",
|
|
40
|
+
children: C("technospam.dashboard.metrics.coursesCompleted.title", "Courses Completed")
|
|
41
|
+
}), /* @__PURE__ */ m(o, { className: "h-4 w-4 text-muted-foreground" })]
|
|
42
|
+
}), /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ m("div", {
|
|
43
|
+
className: "text-2xl font-bold",
|
|
44
|
+
children: w.coursesCompleted
|
|
45
|
+
}), /* @__PURE__ */ m("p", {
|
|
46
|
+
className: "text-xs text-muted-foreground",
|
|
47
|
+
children: C("technospam.dashboard.metrics.coursesCompleted.subtitle", "{{count}} enrolled total", { count: w.coursesEnrolled })
|
|
48
|
+
})] })] }),
|
|
49
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
50
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
51
|
+
children: [/* @__PURE__ */ m(x, {
|
|
52
|
+
className: "text-sm font-medium",
|
|
53
|
+
children: C("technospam.dashboard.metrics.problemsSolved.title", "Problems Solved")
|
|
54
|
+
}), /* @__PURE__ */ m(l, { className: "h-4 w-4 text-muted-foreground" })]
|
|
55
|
+
}), /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ m("div", {
|
|
56
|
+
className: "text-2xl font-bold",
|
|
57
|
+
children: w.problemsSolved
|
|
58
|
+
}), /* @__PURE__ */ m("p", {
|
|
59
|
+
className: "text-xs text-muted-foreground",
|
|
60
|
+
children: C("technospam.dashboard.metrics.problemsSolved.subtitle", "+12 this week")
|
|
61
|
+
})] })] }),
|
|
62
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
63
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
64
|
+
children: [/* @__PURE__ */ m(x, {
|
|
65
|
+
className: "text-sm font-medium",
|
|
66
|
+
children: C("technospam.dashboard.metrics.studyStreak.title", "Study Streak")
|
|
67
|
+
}), /* @__PURE__ */ m(u, { className: "h-4 w-4 text-muted-foreground" })]
|
|
68
|
+
}), /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ m("div", {
|
|
69
|
+
className: "text-2xl font-bold",
|
|
70
|
+
children: C("technospam.dashboard.metrics.studyStreak.value", "{{count}} days", { count: w.studyStreak })
|
|
71
|
+
}), /* @__PURE__ */ m("p", {
|
|
72
|
+
className: "text-xs text-muted-foreground",
|
|
73
|
+
children: C("technospam.dashboard.metrics.studyStreak.subtitle", "{{hours}}h total learning", { hours: w.totalLearningHours })
|
|
74
|
+
})] })] }),
|
|
75
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
76
|
+
className: "flex flex-row items-center justify-between space-y-0 pb-2",
|
|
77
|
+
children: [/* @__PURE__ */ m(x, {
|
|
78
|
+
className: "text-sm font-medium",
|
|
79
|
+
children: C("technospam.dashboard.metrics.totalPoints.title", "Total Points")
|
|
80
|
+
}), /* @__PURE__ */ m(p, { className: "h-4 w-4 text-muted-foreground" })]
|
|
81
|
+
}), /* @__PURE__ */ h(y, { children: [/* @__PURE__ */ m("div", {
|
|
82
|
+
className: "text-2xl font-bold",
|
|
83
|
+
children: w.totalPoints.toLocaleString()
|
|
84
|
+
}), /* @__PURE__ */ m("p", {
|
|
85
|
+
className: "text-xs text-muted-foreground",
|
|
86
|
+
children: C("technospam.dashboard.metrics.totalPoints.subtitle", "{{count}} certificates earned", { count: w.certificatesEarned })
|
|
87
|
+
})] })] })
|
|
88
|
+
]
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ h("div", {
|
|
91
|
+
className: "grid gap-6 lg:grid-cols-3",
|
|
92
|
+
children: [/* @__PURE__ */ h("div", {
|
|
93
|
+
className: "space-y-6 lg:col-span-2",
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ m(x, {
|
|
96
|
+
className: "text-base",
|
|
97
|
+
children: C("technospam.dashboard.quickActions.title", "Quick Actions")
|
|
98
|
+
}) }), /* @__PURE__ */ m(y, { children: /* @__PURE__ */ h("div", {
|
|
99
|
+
className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ h(_, {
|
|
102
|
+
variant: "outline",
|
|
103
|
+
className: "flex h-auto flex-col items-center gap-2 p-4",
|
|
104
|
+
children: [/* @__PURE__ */ m(l, { className: "h-5 w-5" }), /* @__PURE__ */ m("span", {
|
|
105
|
+
className: "text-xs",
|
|
106
|
+
children: C("technospam.dashboard.quickActions.solveProblems", "Solve Problems")
|
|
107
|
+
})]
|
|
108
|
+
}),
|
|
109
|
+
/* @__PURE__ */ h(_, {
|
|
110
|
+
variant: "outline",
|
|
111
|
+
className: "flex h-auto flex-col items-center gap-2 p-4",
|
|
112
|
+
children: [/* @__PURE__ */ m(o, { className: "h-5 w-5" }), /* @__PURE__ */ m("span", {
|
|
113
|
+
className: "text-xs",
|
|
114
|
+
children: C("technospam.dashboard.quickActions.browseCourses", "Browse Courses")
|
|
115
|
+
})]
|
|
116
|
+
}),
|
|
117
|
+
/* @__PURE__ */ h(_, {
|
|
118
|
+
variant: "outline",
|
|
119
|
+
className: "flex h-auto flex-col items-center gap-2 p-4",
|
|
120
|
+
children: [/* @__PURE__ */ m(s, { className: "h-5 w-5" }), /* @__PURE__ */ m("span", {
|
|
121
|
+
className: "text-xs",
|
|
122
|
+
children: C("technospam.dashboard.quickActions.hackathons", "Hackathons")
|
|
123
|
+
})]
|
|
124
|
+
}),
|
|
125
|
+
/* @__PURE__ */ h(_, {
|
|
126
|
+
variant: "outline",
|
|
127
|
+
className: "flex h-auto flex-col items-center gap-2 p-4",
|
|
128
|
+
children: [/* @__PURE__ */ m(d, { className: "h-5 w-5" }), /* @__PURE__ */ m("span", {
|
|
129
|
+
className: "text-xs",
|
|
130
|
+
children: C("technospam.dashboard.quickActions.studyPlan", "Study Plan")
|
|
131
|
+
})]
|
|
132
|
+
})
|
|
133
|
+
]
|
|
134
|
+
}) })] }),
|
|
135
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
136
|
+
className: "flex flex-row items-center justify-between",
|
|
137
|
+
children: [/* @__PURE__ */ m(x, {
|
|
138
|
+
className: "text-base",
|
|
139
|
+
children: C("technospam.dashboard.currentlyLearning.title", "Currently Learning")
|
|
140
|
+
}), /* @__PURE__ */ h(_, {
|
|
141
|
+
variant: "ghost",
|
|
142
|
+
size: "sm",
|
|
143
|
+
className: "text-xs",
|
|
144
|
+
children: [
|
|
145
|
+
C("technospam.shared.actions.viewAll", "View All"),
|
|
146
|
+
" ",
|
|
147
|
+
/* @__PURE__ */ m(r, { className: "ml-1 h-3 w-3" })
|
|
148
|
+
]
|
|
149
|
+
})]
|
|
150
|
+
}), /* @__PURE__ */ m(y, {
|
|
151
|
+
className: "space-y-4",
|
|
152
|
+
children: [
|
|
153
|
+
{
|
|
154
|
+
courseId: "c1",
|
|
155
|
+
progress: 72
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
courseId: "c2",
|
|
159
|
+
progress: 45
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
courseId: "c3",
|
|
163
|
+
progress: 18
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
courseId: "c6",
|
|
167
|
+
progress: 90
|
|
168
|
+
}
|
|
169
|
+
].map((e) => {
|
|
170
|
+
let t = D.find((t) => t.id === e.courseId);
|
|
171
|
+
return t ? /* @__PURE__ */ h("div", {
|
|
172
|
+
className: "space-y-2",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ h("div", {
|
|
175
|
+
className: "flex items-center justify-between",
|
|
176
|
+
children: [/* @__PURE__ */ h("div", {
|
|
177
|
+
className: "flex items-center gap-2",
|
|
178
|
+
children: [/* @__PURE__ */ m("span", {
|
|
179
|
+
className: "text-sm font-medium",
|
|
180
|
+
children: t.title
|
|
181
|
+
}), /* @__PURE__ */ m(g, {
|
|
182
|
+
variant: "secondary",
|
|
183
|
+
className: "text-xs",
|
|
184
|
+
children: t.level
|
|
185
|
+
})]
|
|
186
|
+
}), /* @__PURE__ */ h("span", {
|
|
187
|
+
className: "text-sm text-muted-foreground",
|
|
188
|
+
children: [e.progress, "%"]
|
|
189
|
+
})]
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ m("div", {
|
|
192
|
+
className: "h-2 w-full overflow-hidden rounded-full bg-muted",
|
|
193
|
+
children: /* @__PURE__ */ m("div", {
|
|
194
|
+
className: "h-2 rounded-full bg-primary",
|
|
195
|
+
style: { width: `${e.progress}%` }
|
|
196
|
+
})
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ m("p", {
|
|
199
|
+
className: "text-xs text-muted-foreground",
|
|
200
|
+
children: C("technospam.dashboard.currentlyLearning.courseMeta", "{{instructor}} · {{duration}}h", {
|
|
201
|
+
instructor: t.instructor,
|
|
202
|
+
duration: t.duration
|
|
203
|
+
})
|
|
204
|
+
})
|
|
205
|
+
]
|
|
206
|
+
}, e.courseId) : null;
|
|
207
|
+
})
|
|
208
|
+
})] }),
|
|
209
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
210
|
+
className: "flex flex-row items-center justify-between",
|
|
211
|
+
children: [/* @__PURE__ */ m(x, {
|
|
212
|
+
className: "text-base",
|
|
213
|
+
children: C("technospam.dashboard.achievements.title", "Recent Achievements")
|
|
214
|
+
}), /* @__PURE__ */ h(_, {
|
|
215
|
+
variant: "ghost",
|
|
216
|
+
size: "sm",
|
|
217
|
+
className: "text-xs",
|
|
218
|
+
children: [
|
|
219
|
+
C("technospam.shared.actions.viewAll", "View All"),
|
|
220
|
+
" ",
|
|
221
|
+
/* @__PURE__ */ m(r, { className: "ml-1 h-3 w-3" })
|
|
222
|
+
]
|
|
223
|
+
})]
|
|
224
|
+
}), /* @__PURE__ */ m(y, { children: /* @__PURE__ */ m("div", {
|
|
225
|
+
className: "grid gap-3 sm:grid-cols-3",
|
|
226
|
+
children: j.map((e) => /* @__PURE__ */ h("div", {
|
|
227
|
+
className: "flex items-center gap-3 rounded-lg border border-border p-3",
|
|
228
|
+
children: [/* @__PURE__ */ m("div", {
|
|
229
|
+
className: "flex h-10 w-10 items-center justify-center rounded-full bg-muted",
|
|
230
|
+
children: /* @__PURE__ */ m(i, { className: "h-5 w-5 text-primary" })
|
|
231
|
+
}), /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ m("p", {
|
|
232
|
+
className: "text-sm font-medium",
|
|
233
|
+
children: e.title
|
|
234
|
+
}), /* @__PURE__ */ m("p", {
|
|
235
|
+
className: "text-xs text-muted-foreground",
|
|
236
|
+
children: e.reward
|
|
237
|
+
})] })]
|
|
238
|
+
}, e.id))
|
|
239
|
+
}) })] })
|
|
240
|
+
]
|
|
241
|
+
}), /* @__PURE__ */ h("div", {
|
|
242
|
+
className: "space-y-6",
|
|
243
|
+
children: [
|
|
244
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ h(b, {
|
|
245
|
+
className: "flex flex-row items-center justify-between",
|
|
246
|
+
children: [/* @__PURE__ */ h(x, {
|
|
247
|
+
className: "flex items-center gap-2 text-base",
|
|
248
|
+
children: [/* @__PURE__ */ m(a, { className: "h-4 w-4" }), C("technospam.dashboard.notifications.title", "Notifications")]
|
|
249
|
+
}), k.length > 0 && /* @__PURE__ */ m(g, {
|
|
250
|
+
variant: "secondary",
|
|
251
|
+
children: C("technospam.dashboard.notifications.newCount", "{{count}} new", { count: k.length })
|
|
252
|
+
})]
|
|
253
|
+
}), /* @__PURE__ */ m(y, {
|
|
254
|
+
className: "space-y-3",
|
|
255
|
+
children: T.slice(0, 4).map((e) => /* @__PURE__ */ h("div", {
|
|
256
|
+
className: `rounded-lg border p-3 ${e.read ? "border-border" : "border-primary/30 bg-primary/5"}`,
|
|
257
|
+
children: [/* @__PURE__ */ m("p", {
|
|
258
|
+
className: "text-sm font-medium",
|
|
259
|
+
children: e.title
|
|
260
|
+
}), /* @__PURE__ */ m("p", {
|
|
261
|
+
className: "text-xs text-muted-foreground line-clamp-2",
|
|
262
|
+
children: e.message
|
|
263
|
+
})]
|
|
264
|
+
}, e.id))
|
|
265
|
+
})] }),
|
|
266
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ h(x, {
|
|
267
|
+
className: "flex items-center gap-2 text-base",
|
|
268
|
+
children: [/* @__PURE__ */ m(s, { className: "h-4 w-4" }), C("technospam.dashboard.events.title", "Upcoming Events")]
|
|
269
|
+
}) }), /* @__PURE__ */ m(y, {
|
|
270
|
+
className: "space-y-3",
|
|
271
|
+
children: A.map((e) => /* @__PURE__ */ h("div", {
|
|
272
|
+
className: "rounded-lg border border-border p-3",
|
|
273
|
+
children: [
|
|
274
|
+
/* @__PURE__ */ m("p", {
|
|
275
|
+
className: "text-sm font-medium",
|
|
276
|
+
children: e.title
|
|
277
|
+
}),
|
|
278
|
+
/* @__PURE__ */ h("div", {
|
|
279
|
+
className: "mt-1 flex items-center gap-2 text-xs text-muted-foreground",
|
|
280
|
+
children: [/* @__PURE__ */ m(c, { className: "h-3 w-3" }), /* @__PURE__ */ m("span", { children: new Date(e.startDate).toLocaleDateString() })]
|
|
281
|
+
}),
|
|
282
|
+
/* @__PURE__ */ h("div", {
|
|
283
|
+
className: "mt-1 flex items-center gap-1",
|
|
284
|
+
children: [/* @__PURE__ */ m(g, {
|
|
285
|
+
variant: "secondary",
|
|
286
|
+
className: "text-xs",
|
|
287
|
+
children: e.mode
|
|
288
|
+
}), /* @__PURE__ */ h(g, {
|
|
289
|
+
variant: "secondary",
|
|
290
|
+
className: "text-xs",
|
|
291
|
+
children: ["$", e.prizePool.toLocaleString()]
|
|
292
|
+
})]
|
|
293
|
+
})
|
|
294
|
+
]
|
|
295
|
+
}, e.id))
|
|
296
|
+
})] }),
|
|
297
|
+
/* @__PURE__ */ h(v, { children: [/* @__PURE__ */ m(b, { children: /* @__PURE__ */ h(x, {
|
|
298
|
+
className: "flex items-center gap-2 text-base",
|
|
299
|
+
children: [/* @__PURE__ */ m(f, { className: "h-4 w-4" }), C("technospam.dashboard.weeklyStats.title", "This Week")]
|
|
300
|
+
}) }), /* @__PURE__ */ h(y, {
|
|
301
|
+
className: "space-y-3",
|
|
302
|
+
children: [
|
|
303
|
+
/* @__PURE__ */ h("div", {
|
|
304
|
+
className: "flex items-center justify-between",
|
|
305
|
+
children: [/* @__PURE__ */ m("span", {
|
|
306
|
+
className: "text-sm text-muted-foreground",
|
|
307
|
+
children: C("technospam.dashboard.weeklyStats.mentorshipSessions", "Mentorship Sessions")
|
|
308
|
+
}), /* @__PURE__ */ m("span", {
|
|
309
|
+
className: "text-sm font-medium",
|
|
310
|
+
children: w.mentorshipSessions
|
|
311
|
+
})]
|
|
312
|
+
}),
|
|
313
|
+
/* @__PURE__ */ h("div", {
|
|
314
|
+
className: "flex items-center justify-between",
|
|
315
|
+
children: [/* @__PURE__ */ m("span", {
|
|
316
|
+
className: "text-sm text-muted-foreground",
|
|
317
|
+
children: C("technospam.dashboard.weeklyStats.contributions", "Contributions")
|
|
318
|
+
}), /* @__PURE__ */ m("span", {
|
|
319
|
+
className: "text-sm font-medium",
|
|
320
|
+
children: w.contributionsMade
|
|
321
|
+
})]
|
|
322
|
+
}),
|
|
323
|
+
/* @__PURE__ */ h("div", {
|
|
324
|
+
className: "flex items-center justify-between",
|
|
325
|
+
children: [/* @__PURE__ */ m("span", {
|
|
326
|
+
className: "text-sm text-muted-foreground",
|
|
327
|
+
children: C("technospam.dashboard.weeklyStats.hackathonsJoined", "Hackathons Joined")
|
|
328
|
+
}), /* @__PURE__ */ m("span", {
|
|
329
|
+
className: "text-sm font-medium",
|
|
330
|
+
children: w.hackathonsJoined
|
|
331
|
+
})]
|
|
332
|
+
})
|
|
333
|
+
]
|
|
334
|
+
})] })
|
|
335
|
+
]
|
|
336
|
+
})]
|
|
337
|
+
})
|
|
338
|
+
]
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
//#endregion
|
|
342
|
+
export { S as DashboardDashboardPagePage };
|
|
343
|
+
|
|
344
|
+
//# sourceMappingURL=DashboardDashboardPagePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardDashboardPagePage.js","names":[],"sources":["../../../src/technospam/pages/DashboardDashboardPagePage.tsx"],"sourcesContent":["import { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { Card, CardContent, CardHeader, CardTitle, Badge, Button } from '@burdenoff/fe-libs/ui';\nimport {\n BookOpen,\n Code,\n Flame,\n Trophy,\n Bell,\n Calendar,\n Target,\n Award,\n ArrowRight,\n TrendingUp,\n Clock,\n} from 'lucide-react';\nimport { useTechnoSpamStore } from '../store/technospamStore';\nimport { tWithFallback } from '../utils/i18n';\n\nexport function DashboardDashboardPagePage() {\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n const { userStats, notifications, hackathons, courses, achievements } = useTechnoSpamStore();\n\n const unreadNotifications = notifications.filter((n) => !n.read);\n const upcomingHackathons = hackathons.filter(\n (h) => h.status === 'upcoming' || h.status === 'registration_open'\n );\n const recentAchievements = achievements.filter((a) => a.unlockedAt).slice(0, 3);\n\n const courseProgress = [\n { courseId: 'c1', progress: 72 },\n { courseId: 'c2', progress: 45 },\n { courseId: 'c3', progress: 18 },\n { courseId: 'c6', progress: 90 },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">\n {tr('technospam.dashboard.title', 'Welcome back!')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr('technospam.dashboard.subtitle', \"Here's your learning overview for today\")}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <Badge variant=\"secondary\" className=\"flex items-center gap-1\">\n <Flame className=\"h-3 w-3\" />\n {tr('technospam.dashboard.hero.studyStreak', '{{count}} day streak', {\n count: userStats.studyStreak,\n })}\n </Badge>\n <Badge variant=\"secondary\">\n {tr('technospam.dashboard.hero.rank', 'Rank #{{rank}}', { rank: userStats.rank })}\n </Badge>\n </div>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2 lg: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\">\n {tr('technospam.dashboard.metrics.coursesCompleted.title', 'Courses Completed')}\n </CardTitle>\n <BookOpen className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.coursesCompleted}</div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'technospam.dashboard.metrics.coursesCompleted.subtitle',\n '{{count}} enrolled total',\n {\n count: userStats.coursesEnrolled,\n }\n )}\n </p>\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\">\n {tr('technospam.dashboard.metrics.problemsSolved.title', 'Problems Solved')}\n </CardTitle>\n <Code className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.problemsSolved}</div>\n <p className=\"text-xs text-muted-foreground\">\n {tr('technospam.dashboard.metrics.problemsSolved.subtitle', '+12 this week')}\n </p>\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\">\n {tr('technospam.dashboard.metrics.studyStreak.title', 'Study Streak')}\n </CardTitle>\n <Flame className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {tr('technospam.dashboard.metrics.studyStreak.value', '{{count}} days', {\n count: userStats.studyStreak,\n })}\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'technospam.dashboard.metrics.studyStreak.subtitle',\n '{{hours}}h total learning',\n { hours: userStats.totalLearningHours }\n )}\n </p>\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\">\n {tr('technospam.dashboard.metrics.totalPoints.title', 'Total Points')}\n </CardTitle>\n <Trophy className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.totalPoints.toLocaleString()}</div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'technospam.dashboard.metrics.totalPoints.subtitle',\n '{{count}} certificates earned',\n { count: userStats.certificatesEarned }\n )}\n </p>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n <div className=\"space-y-6 lg:col-span-2\">\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">\n {tr('technospam.dashboard.quickActions.title', 'Quick Actions')}\n </CardTitle>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n <Button variant=\"outline\" className=\"flex h-auto flex-col items-center gap-2 p-4\">\n <Code className=\"h-5 w-5\" />\n <span className=\"text-xs\">\n {tr('technospam.dashboard.quickActions.solveProblems', 'Solve Problems')}\n </span>\n </Button>\n <Button variant=\"outline\" className=\"flex h-auto flex-col items-center gap-2 p-4\">\n <BookOpen className=\"h-5 w-5\" />\n <span className=\"text-xs\">\n {tr('technospam.dashboard.quickActions.browseCourses', 'Browse Courses')}\n </span>\n </Button>\n <Button variant=\"outline\" className=\"flex h-auto flex-col items-center gap-2 p-4\">\n <Calendar className=\"h-5 w-5\" />\n <span className=\"text-xs\">\n {tr('technospam.dashboard.quickActions.hackathons', 'Hackathons')}\n </span>\n </Button>\n <Button variant=\"outline\" className=\"flex h-auto flex-col items-center gap-2 p-4\">\n <Target className=\"h-5 w-5\" />\n <span className=\"text-xs\">\n {tr('technospam.dashboard.quickActions.studyPlan', 'Study Plan')}\n </span>\n </Button>\n </div>\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-base\">\n {tr('technospam.dashboard.currentlyLearning.title', 'Currently Learning')}\n </CardTitle>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\">\n {tr('technospam.shared.actions.viewAll', 'View All')}{' '}\n <ArrowRight className=\"ml-1 h-3 w-3\" />\n </Button>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {courseProgress.map((cp) => {\n const course = courses.find((c) => c.id === cp.courseId);\n if (!course) return null;\n return (\n <div key={cp.courseId} className=\"space-y-2\">\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-medium\">{course.title}</span>\n <Badge variant=\"secondary\" className=\"text-xs\">\n {course.level}\n </Badge>\n </div>\n <span className=\"text-sm text-muted-foreground\">{cp.progress}%</span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className=\"h-2 rounded-full bg-primary\"\n style={{ width: `${cp.progress}%` }}\n />\n </div>\n <p className=\"text-xs text-muted-foreground\">\n {tr(\n 'technospam.dashboard.currentlyLearning.courseMeta',\n '{{instructor}} · {{duration}}h',\n { instructor: course.instructor, duration: course.duration }\n )}\n </p>\n </div>\n );\n })}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"text-base\">\n {tr('technospam.dashboard.achievements.title', 'Recent Achievements')}\n </CardTitle>\n <Button variant=\"ghost\" size=\"sm\" className=\"text-xs\">\n {tr('technospam.shared.actions.viewAll', 'View All')}{' '}\n <ArrowRight className=\"ml-1 h-3 w-3\" />\n </Button>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-3 sm:grid-cols-3\">\n {recentAchievements.map((achievement) => (\n <div\n key={achievement.id}\n className=\"flex items-center gap-3 rounded-lg border border-border p-3\"\n >\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <Award className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <p className=\"text-sm font-medium\">{achievement.title}</p>\n <p className=\"text-xs text-muted-foreground\">{achievement.reward}</p>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"space-y-6\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between\">\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Bell className=\"h-4 w-4\" />\n {tr('technospam.dashboard.notifications.title', 'Notifications')}\n </CardTitle>\n {unreadNotifications.length > 0 && (\n <Badge variant=\"secondary\">\n {tr('technospam.dashboard.notifications.newCount', '{{count}} new', {\n count: unreadNotifications.length,\n })}\n </Badge>\n )}\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {notifications.slice(0, 4).map((notif) => (\n <div\n key={notif.id}\n className={`rounded-lg border p-3 ${!notif.read ? 'border-primary/30 bg-primary/5' : 'border-border'}`}\n >\n <p className=\"text-sm font-medium\">{notif.title}</p>\n <p className=\"text-xs text-muted-foreground line-clamp-2\">{notif.message}</p>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <Calendar className=\"h-4 w-4\" />\n {tr('technospam.dashboard.events.title', 'Upcoming Events')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n {upcomingHackathons.map((hack) => (\n <div key={hack.id} className=\"rounded-lg border border-border p-3\">\n <p className=\"text-sm font-medium\">{hack.title}</p>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" />\n <span>{new Date(hack.startDate).toLocaleDateString()}</span>\n </div>\n <div className=\"mt-1 flex items-center gap-1\">\n <Badge variant=\"secondary\" className=\"text-xs\">\n {hack.mode}\n </Badge>\n <Badge variant=\"secondary\" className=\"text-xs\">\n ${hack.prizePool.toLocaleString()}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle className=\"flex items-center gap-2 text-base\">\n <TrendingUp className=\"h-4 w-4\" />\n {tr('technospam.dashboard.weeklyStats.title', 'This Week')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n {tr('technospam.dashboard.weeklyStats.mentorshipSessions', 'Mentorship Sessions')}\n </span>\n <span className=\"text-sm font-medium\">{userStats.mentorshipSessions}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n {tr('technospam.dashboard.weeklyStats.contributions', 'Contributions')}\n </span>\n <span className=\"text-sm font-medium\">{userStats.contributionsMade}</span>\n </div>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">\n {tr('technospam.dashboard.weeklyStats.hackathonsJoined', 'Hackathons Joined')}\n </span>\n <span className=\"text-sm font-medium\">{userStats.hackathonsJoined}</span>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HackathonsEventsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/HackathonsEventsPagePage.tsx"],"names":[],"mappings":"AAIA,wBAAgB,wBAAwB,4CAgHvC"}
|