@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.
Files changed (202) hide show
  1. package/README.md +12 -0
  2. package/dist/dev/main.d.ts +2 -0
  3. package/dist/dev/main.d.ts.map +1 -0
  4. package/dist/generated/global-operations.d.ts +2 -0
  5. package/dist/generated/global-operations.d.ts.map +1 -0
  6. package/dist/generated/global-types.d.ts +18199 -0
  7. package/dist/generated/global-types.d.ts.map +1 -0
  8. package/dist/generated/wspace-operations.d.ts +2 -0
  9. package/dist/generated/wspace-operations.d.ts.map +1 -0
  10. package/dist/generated/wspace-types.d.ts +43046 -0
  11. package/dist/generated/wspace-types.d.ts.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/technospam/TechnoSpamRoot.d.ts +5 -0
  16. package/dist/technospam/TechnoSpamRoot.d.ts.map +1 -0
  17. package/dist/technospam/TechnoSpamRoot.js +482 -0
  18. package/dist/technospam/TechnoSpamRoot.js.map +1 -0
  19. package/dist/technospam/TechnoSpamRoutes.d.ts +2 -0
  20. package/dist/technospam/TechnoSpamRoutes.d.ts.map +1 -0
  21. package/dist/technospam/TechnoSpamRoutes.js +191 -0
  22. package/dist/technospam/TechnoSpamRoutes.js.map +1 -0
  23. package/dist/technospam/index.d.ts +5 -0
  24. package/dist/technospam/index.d.ts.map +1 -0
  25. package/dist/technospam/index.js +3 -0
  26. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts +2 -0
  27. package/dist/technospam/pages/AdminAdminDashboardPagePage.d.ts.map +1 -0
  28. package/dist/technospam/pages/AdminAdminDashboardPagePage.js +269 -0
  29. package/dist/technospam/pages/AdminAdminDashboardPagePage.js.map +1 -0
  30. package/dist/technospam/pages/AdminAuditReportsPagePage.d.ts +2 -0
  31. package/dist/technospam/pages/AdminAuditReportsPagePage.d.ts.map +1 -0
  32. package/dist/technospam/pages/AdminAuditReportsPagePage.js +179 -0
  33. package/dist/technospam/pages/AdminAuditReportsPagePage.js.map +1 -0
  34. package/dist/technospam/pages/AnalyticsAchievementsPagePage.d.ts +2 -0
  35. package/dist/technospam/pages/AnalyticsAchievementsPagePage.d.ts.map +1 -0
  36. package/dist/technospam/pages/AnalyticsAchievementsPagePage.js +149 -0
  37. package/dist/technospam/pages/AnalyticsAchievementsPagePage.js.map +1 -0
  38. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts +2 -0
  39. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.d.ts.map +1 -0
  40. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js +260 -0
  41. package/dist/technospam/pages/AnalyticsAnalyticsPagePage.js.map +1 -0
  42. package/dist/technospam/pages/AnalyticsProgressPagePage.d.ts +2 -0
  43. package/dist/technospam/pages/AnalyticsProgressPagePage.d.ts.map +1 -0
  44. package/dist/technospam/pages/AnalyticsProgressPagePage.js +215 -0
  45. package/dist/technospam/pages/AnalyticsProgressPagePage.js.map +1 -0
  46. package/dist/technospam/pages/AnalyticsReportsPagePage.d.ts +2 -0
  47. package/dist/technospam/pages/AnalyticsReportsPagePage.d.ts.map +1 -0
  48. package/dist/technospam/pages/AnalyticsReportsPagePage.js +145 -0
  49. package/dist/technospam/pages/AnalyticsReportsPagePage.js.map +1 -0
  50. package/dist/technospam/pages/ApplicationsPortfolioPagePage.d.ts +2 -0
  51. package/dist/technospam/pages/ApplicationsPortfolioPagePage.d.ts.map +1 -0
  52. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js +227 -0
  53. package/dist/technospam/pages/ApplicationsPortfolioPagePage.js.map +1 -0
  54. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts +2 -0
  55. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.d.ts.map +1 -0
  56. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js +194 -0
  57. package/dist/technospam/pages/ApplicationsProblemDetailsPagePage.js.map +1 -0
  58. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts +2 -0
  59. package/dist/technospam/pages/ApplicationsProblemsPagePage.d.ts.map +1 -0
  60. package/dist/technospam/pages/ApplicationsProblemsPagePage.js +203 -0
  61. package/dist/technospam/pages/ApplicationsProblemsPagePage.js.map +1 -0
  62. package/dist/technospam/pages/ApplicationsSolutionsPagePage.d.ts +2 -0
  63. package/dist/technospam/pages/ApplicationsSolutionsPagePage.d.ts.map +1 -0
  64. package/dist/technospam/pages/ApplicationsSolutionsPagePage.js +182 -0
  65. package/dist/technospam/pages/ApplicationsSolutionsPagePage.js.map +1 -0
  66. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts +2 -0
  67. package/dist/technospam/pages/CoursesCourseDetailsPagePage.d.ts.map +1 -0
  68. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js +261 -0
  69. package/dist/technospam/pages/CoursesCourseDetailsPagePage.js.map +1 -0
  70. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts +2 -0
  71. package/dist/technospam/pages/CoursesCoursesPagePage.d.ts.map +1 -0
  72. package/dist/technospam/pages/CoursesCoursesPagePage.js +179 -0
  73. package/dist/technospam/pages/CoursesCoursesPagePage.js.map +1 -0
  74. package/dist/technospam/pages/CoursesInstructorProfilePagePage.d.ts +2 -0
  75. package/dist/technospam/pages/CoursesInstructorProfilePagePage.d.ts.map +1 -0
  76. package/dist/technospam/pages/CoursesInstructorProfilePagePage.js +346 -0
  77. package/dist/technospam/pages/CoursesInstructorProfilePagePage.js.map +1 -0
  78. package/dist/technospam/pages/CoursesInstructorsPagePage.d.ts +2 -0
  79. package/dist/technospam/pages/CoursesInstructorsPagePage.d.ts.map +1 -0
  80. package/dist/technospam/pages/CoursesInstructorsPagePage.js +104 -0
  81. package/dist/technospam/pages/CoursesInstructorsPagePage.js.map +1 -0
  82. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts +2 -0
  83. package/dist/technospam/pages/CoursesMyLearningPagePage.d.ts.map +1 -0
  84. package/dist/technospam/pages/CoursesMyLearningPagePage.js +187 -0
  85. package/dist/technospam/pages/CoursesMyLearningPagePage.js.map +1 -0
  86. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts +2 -0
  87. package/dist/technospam/pages/DashboardDashboardPagePage.d.ts.map +1 -0
  88. package/dist/technospam/pages/DashboardDashboardPagePage.js +344 -0
  89. package/dist/technospam/pages/DashboardDashboardPagePage.js.map +1 -0
  90. package/dist/technospam/pages/HackathonsEventsPagePage.d.ts +2 -0
  91. package/dist/technospam/pages/HackathonsEventsPagePage.d.ts.map +1 -0
  92. package/dist/technospam/pages/HackathonsEventsPagePage.js +121 -0
  93. package/dist/technospam/pages/HackathonsEventsPagePage.js.map +1 -0
  94. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts +2 -0
  95. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.d.ts.map +1 -0
  96. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js +250 -0
  97. package/dist/technospam/pages/HackathonsHackathonDetailsPagePage.js.map +1 -0
  98. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts +2 -0
  99. package/dist/technospam/pages/HackathonsHackathonsPagePage.d.ts.map +1 -0
  100. package/dist/technospam/pages/HackathonsHackathonsPagePage.js +162 -0
  101. package/dist/technospam/pages/HackathonsHackathonsPagePage.js.map +1 -0
  102. package/dist/technospam/pages/HackathonsTeamsPagePage.d.ts +2 -0
  103. package/dist/technospam/pages/HackathonsTeamsPagePage.d.ts.map +1 -0
  104. package/dist/technospam/pages/HackathonsTeamsPagePage.js +185 -0
  105. package/dist/technospam/pages/HackathonsTeamsPagePage.js.map +1 -0
  106. package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.d.ts +2 -0
  107. package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.d.ts.map +1 -0
  108. package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.js +181 -0
  109. package/dist/technospam/pages/KnowledgeBaseArticleDetailsPagePage.js.map +1 -0
  110. package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.d.ts +2 -0
  111. package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.d.ts.map +1 -0
  112. package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.js +112 -0
  113. package/dist/technospam/pages/KnowledgeBaseArticlesPagePage.js.map +1 -0
  114. package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.d.ts +2 -0
  115. package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.d.ts.map +1 -0
  116. package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.js +105 -0
  117. package/dist/technospam/pages/KnowledgeBaseCategoriesPagePage.js.map +1 -0
  118. package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.d.ts +2 -0
  119. package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.d.ts.map +1 -0
  120. package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.js +165 -0
  121. package/dist/technospam/pages/KnowledgeBaseKnowledgeBasePagePage.js.map +1 -0
  122. package/dist/technospam/pages/MentorshipBookingsPagePage.d.ts +2 -0
  123. package/dist/technospam/pages/MentorshipBookingsPagePage.d.ts.map +1 -0
  124. package/dist/technospam/pages/MentorshipBookingsPagePage.js +188 -0
  125. package/dist/technospam/pages/MentorshipBookingsPagePage.js.map +1 -0
  126. package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts +2 -0
  127. package/dist/technospam/pages/MentorshipMentorProfilePagePage.d.ts.map +1 -0
  128. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js +310 -0
  129. package/dist/technospam/pages/MentorshipMentorProfilePagePage.js.map +1 -0
  130. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts +2 -0
  131. package/dist/technospam/pages/MentorshipMentorsPagePage.d.ts.map +1 -0
  132. package/dist/technospam/pages/MentorshipMentorsPagePage.js +128 -0
  133. package/dist/technospam/pages/MentorshipMentorsPagePage.js.map +1 -0
  134. package/dist/technospam/pages/MentorshipMentorshipPagePage.d.ts +2 -0
  135. package/dist/technospam/pages/MentorshipMentorshipPagePage.d.ts.map +1 -0
  136. package/dist/technospam/pages/MentorshipMentorshipPagePage.js +209 -0
  137. package/dist/technospam/pages/MentorshipMentorshipPagePage.js.map +1 -0
  138. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts +2 -0
  139. package/dist/technospam/pages/MentorshipSessionsPagePage.d.ts.map +1 -0
  140. package/dist/technospam/pages/MentorshipSessionsPagePage.js +170 -0
  141. package/dist/technospam/pages/MentorshipSessionsPagePage.js.map +1 -0
  142. package/dist/technospam/pages/OpenSourceContributionsPagePage.d.ts +2 -0
  143. package/dist/technospam/pages/OpenSourceContributionsPagePage.d.ts.map +1 -0
  144. package/dist/technospam/pages/OpenSourceContributionsPagePage.js +191 -0
  145. package/dist/technospam/pages/OpenSourceContributionsPagePage.js.map +1 -0
  146. package/dist/technospam/pages/OpenSourceOpenSourcePagePage.d.ts +2 -0
  147. package/dist/technospam/pages/OpenSourceOpenSourcePagePage.d.ts.map +1 -0
  148. package/dist/technospam/pages/OpenSourceOpenSourcePagePage.js +216 -0
  149. package/dist/technospam/pages/OpenSourceOpenSourcePagePage.js.map +1 -0
  150. package/dist/technospam/pages/OpenSourceProjectsPagePage.d.ts +2 -0
  151. package/dist/technospam/pages/OpenSourceProjectsPagePage.d.ts.map +1 -0
  152. package/dist/technospam/pages/OpenSourceProjectsPagePage.js +150 -0
  153. package/dist/technospam/pages/OpenSourceProjectsPagePage.js.map +1 -0
  154. package/dist/technospam/pages/StudyPlannerGoalsPagePage.d.ts +2 -0
  155. package/dist/technospam/pages/StudyPlannerGoalsPagePage.d.ts.map +1 -0
  156. package/dist/technospam/pages/StudyPlannerGoalsPagePage.js +161 -0
  157. package/dist/technospam/pages/StudyPlannerGoalsPagePage.js.map +1 -0
  158. package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.d.ts +2 -0
  159. package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.d.ts.map +1 -0
  160. package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.js +198 -0
  161. package/dist/technospam/pages/StudyPlannerLearningPathDetailsPagePage.js.map +1 -0
  162. package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.d.ts +2 -0
  163. package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.d.ts.map +1 -0
  164. package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.js +105 -0
  165. package/dist/technospam/pages/StudyPlannerLearningPathsPagePage.js.map +1 -0
  166. package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.d.ts +2 -0
  167. package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.d.ts.map +1 -0
  168. package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.js +161 -0
  169. package/dist/technospam/pages/StudyPlannerStudyPlanDetailsPagePage.js.map +1 -0
  170. package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.d.ts +2 -0
  171. package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.d.ts.map +1 -0
  172. package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.js +127 -0
  173. package/dist/technospam/pages/StudyPlannerStudyPlanEditPagePage.js.map +1 -0
  174. package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.d.ts +2 -0
  175. package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.d.ts.map +1 -0
  176. package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.js +238 -0
  177. package/dist/technospam/pages/StudyPlannerStudyPlannerPagePage.js.map +1 -0
  178. package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.d.ts +2 -0
  179. package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.d.ts.map +1 -0
  180. package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.js +113 -0
  181. package/dist/technospam/pages/StudyPlannerStudyPlansPagePage.js.map +1 -0
  182. package/dist/technospam/providers/TechnoSpamProvider.d.ts +6 -0
  183. package/dist/technospam/providers/TechnoSpamProvider.d.ts.map +1 -0
  184. package/dist/technospam/providers/TechnoSpamProvider.js +27 -0
  185. package/dist/technospam/providers/TechnoSpamProvider.js.map +1 -0
  186. package/dist/technospam/store/technospamStore.d.ts +190 -0
  187. package/dist/technospam/store/technospamStore.d.ts.map +1 -0
  188. package/dist/technospam/store/technospamStore.js +912 -0
  189. package/dist/technospam/store/technospamStore.js.map +1 -0
  190. package/dist/technospam/types/index.d.ts +51 -0
  191. package/dist/technospam/types/index.d.ts.map +1 -0
  192. package/dist/technospam/utils/cn.d.ts +4 -0
  193. package/dist/technospam/utils/cn.d.ts.map +1 -0
  194. package/dist/technospam/utils/i18n.d.ts +6 -0
  195. package/dist/technospam/utils/i18n.d.ts.map +1 -0
  196. package/dist/technospam/utils/i18n.js +15 -0
  197. package/dist/technospam/utils/i18n.js.map +1 -0
  198. package/dist/technospam/utils/navigation.d.ts +2 -0
  199. package/dist/technospam/utils/navigation.d.ts.map +1 -0
  200. package/dist/technospam/utils/navigation.js +8 -0
  201. package/dist/technospam/utils/navigation.js.map +1 -0
  202. package/package.json +107 -0
@@ -0,0 +1,179 @@
1
+ import { useTechnoSpamStore as e } from "../store/technospamStore.js";
2
+ import { useMemo as t, useState as n } from "react";
3
+ import { AlertTriangle as r, Download as i, Filter as a, Info as o, Search as s, ShieldAlert as c } from "lucide-react";
4
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
5
+ import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h, Input as g } from "@burdenoff/fe-libs/ui";
6
+ //#region src/technospam/pages/AdminAuditReportsPagePage.tsx
7
+ function _() {
8
+ let { auditEvents: _ } = e(), [v, y] = n(""), [b, x] = n("all"), S = t(() => _.filter((e) => {
9
+ let t = v === "" || e.action.toLowerCase().includes(v.toLowerCase()) || e.actor.toLowerCase().includes(v.toLowerCase()) || e.target.toLowerCase().includes(v.toLowerCase()) || e.details.toLowerCase().includes(v.toLowerCase()), n = b === "all" || e.severity === b;
10
+ return t && n;
11
+ }), [
12
+ _,
13
+ v,
14
+ b
15
+ ]), C = _.length, w = _.filter((e) => e.severity === "warning").length, T = _.filter((e) => e.severity === "critical").length, E = (e) => {
16
+ switch (e) {
17
+ case "critical": return /* @__PURE__ */ l(c, { className: "h-4 w-4 text-red-500" });
18
+ case "warning": return /* @__PURE__ */ l(r, { className: "h-4 w-4 text-yellow-500" });
19
+ default: return /* @__PURE__ */ l(o, { className: "h-4 w-4 text-blue-500" });
20
+ }
21
+ }, D = (e) => {
22
+ switch (e) {
23
+ case "critical": return "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400";
24
+ case "warning": return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400";
25
+ default: return "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400";
26
+ }
27
+ };
28
+ return /* @__PURE__ */ u("div", {
29
+ className: "space-y-6 p-6",
30
+ children: [
31
+ /* @__PURE__ */ u("div", {
32
+ className: "flex items-center justify-between",
33
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
34
+ className: "text-2xl font-semibold text-foreground",
35
+ children: "Audit Logs & Reports"
36
+ }), /* @__PURE__ */ l("p", {
37
+ className: "text-sm text-muted-foreground",
38
+ children: "Monitor platform activity and security events"
39
+ })] }), /* @__PURE__ */ u(d, {
40
+ variant: "outline",
41
+ size: "sm",
42
+ children: [/* @__PURE__ */ l(i, { className: "mr-2 h-4 w-4" }), "Export CSV"]
43
+ })]
44
+ }),
45
+ /* @__PURE__ */ u("div", {
46
+ className: "grid gap-4 md:grid-cols-3",
47
+ children: [
48
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
49
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
50
+ children: [/* @__PURE__ */ l(h, {
51
+ className: "text-sm font-medium",
52
+ children: "Total Events"
53
+ }), /* @__PURE__ */ l(o, { className: "h-4 w-4 text-muted-foreground" })]
54
+ }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l("div", {
55
+ className: "text-2xl font-bold",
56
+ children: C
57
+ }) })] }),
58
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
59
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
60
+ children: [/* @__PURE__ */ l(h, {
61
+ className: "text-sm font-medium",
62
+ children: "Warnings"
63
+ }), /* @__PURE__ */ l(r, { className: "h-4 w-4 text-yellow-500" })]
64
+ }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l("div", {
65
+ className: "text-2xl font-bold",
66
+ children: w
67
+ }) })] }),
68
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
69
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
70
+ children: [/* @__PURE__ */ l(h, {
71
+ className: "text-sm font-medium",
72
+ children: "Critical"
73
+ }), /* @__PURE__ */ l(c, { className: "h-4 w-4 text-red-500" })]
74
+ }), /* @__PURE__ */ l(p, { children: /* @__PURE__ */ l("div", {
75
+ className: "text-2xl font-bold",
76
+ children: T
77
+ }) })] })
78
+ ]
79
+ }),
80
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ l(p, {
81
+ className: "pt-6",
82
+ children: /* @__PURE__ */ u("div", {
83
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center",
84
+ children: [/* @__PURE__ */ u("div", {
85
+ className: "relative flex-1",
86
+ children: [/* @__PURE__ */ l(s, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ l(g, {
87
+ placeholder: "Search events...",
88
+ value: v,
89
+ onChange: (e) => y(e.target.value),
90
+ className: "pl-9"
91
+ })]
92
+ }), /* @__PURE__ */ u("div", {
93
+ className: "flex items-center gap-2",
94
+ children: [/* @__PURE__ */ l(a, { className: "h-4 w-4 text-muted-foreground" }), [
95
+ {
96
+ label: "All",
97
+ value: "all"
98
+ },
99
+ {
100
+ label: "Info",
101
+ value: "info"
102
+ },
103
+ {
104
+ label: "Warning",
105
+ value: "warning"
106
+ },
107
+ {
108
+ label: "Critical",
109
+ value: "critical"
110
+ }
111
+ ].map((e) => /* @__PURE__ */ l(d, {
112
+ variant: b === e.value ? "default" : "outline",
113
+ size: "sm",
114
+ onClick: () => x(e.value),
115
+ children: e.label
116
+ }, e.value))]
117
+ })]
118
+ })
119
+ }) }),
120
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, {
121
+ className: "text-base",
122
+ children: [
123
+ "Audit Events (",
124
+ S.length,
125
+ ")"
126
+ ]
127
+ }) }), /* @__PURE__ */ l(p, { children: S.length === 0 ? /* @__PURE__ */ l("p", {
128
+ className: "py-8 text-center text-sm text-muted-foreground",
129
+ children: "No events match your filters"
130
+ }) : /* @__PURE__ */ l("div", {
131
+ className: "space-y-3",
132
+ children: S.map((e) => /* @__PURE__ */ u("div", {
133
+ className: "flex items-start gap-3 rounded-lg border border-border p-4",
134
+ children: [/* @__PURE__ */ l("div", {
135
+ className: "mt-0.5",
136
+ children: E(e.severity)
137
+ }), /* @__PURE__ */ u("div", {
138
+ className: "flex-1 space-y-1",
139
+ children: [
140
+ /* @__PURE__ */ u("div", {
141
+ className: "flex items-center justify-between",
142
+ children: [/* @__PURE__ */ l("p", {
143
+ className: "text-sm font-medium",
144
+ children: e.action
145
+ }), /* @__PURE__ */ l("span", {
146
+ className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${D(e.severity)}`,
147
+ children: e.severity
148
+ })]
149
+ }),
150
+ /* @__PURE__ */ u("p", {
151
+ className: "text-xs text-muted-foreground",
152
+ children: [
153
+ /* @__PURE__ */ l("span", {
154
+ className: "font-medium",
155
+ children: e.actor
156
+ }),
157
+ " → ",
158
+ e.target
159
+ ]
160
+ }),
161
+ /* @__PURE__ */ l("p", {
162
+ className: "text-xs text-muted-foreground",
163
+ children: e.details
164
+ }),
165
+ /* @__PURE__ */ l("p", {
166
+ className: "text-xs text-muted-foreground",
167
+ children: new Date(e.timestamp).toLocaleString()
168
+ })
169
+ ]
170
+ })]
171
+ }, e.id))
172
+ }) })] })
173
+ ]
174
+ });
175
+ }
176
+ //#endregion
177
+ export { _ as AdminAuditReportsPagePage };
178
+
179
+ //# sourceMappingURL=AdminAuditReportsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminAuditReportsPagePage.js","names":[],"sources":["../../../src/technospam/pages/AdminAuditReportsPagePage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Input } from '@burdenoff/fe-libs/ui';\nimport { ShieldAlert, AlertTriangle, Info, Search, Download, Filter } from 'lucide-react';\nimport { useTechnoSpamStore } from '../store/technospamStore';\n\ntype SeverityFilter = 'all' | 'info' | 'warning' | 'critical';\n\nexport function AdminAuditReportsPagePage() {\n const { auditEvents } = useTechnoSpamStore();\n const [searchTerm, setSearchTerm] = useState('');\n const [selectedSeverity, setSelectedSeverity] = useState<SeverityFilter>('all');\n\n const filteredEvents = useMemo(() => {\n return auditEvents.filter((event) => {\n const matchesSearch =\n searchTerm === '' ||\n event.action.toLowerCase().includes(searchTerm.toLowerCase()) ||\n event.actor.toLowerCase().includes(searchTerm.toLowerCase()) ||\n event.target.toLowerCase().includes(searchTerm.toLowerCase()) ||\n event.details.toLowerCase().includes(searchTerm.toLowerCase());\n const matchesSeverity = selectedSeverity === 'all' || event.severity === selectedSeverity;\n return matchesSearch && matchesSeverity;\n });\n }, [auditEvents, searchTerm, selectedSeverity]);\n\n const totalEvents = auditEvents.length;\n const warningCount = auditEvents.filter((e) => e.severity === 'warning').length;\n const criticalCount = auditEvents.filter((e) => e.severity === 'critical').length;\n\n const severityIcon = (severity: string) => {\n switch (severity) {\n case 'critical':\n return <ShieldAlert className=\"h-4 w-4 text-red-500\" />;\n case 'warning':\n return <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />;\n default:\n return <Info className=\"h-4 w-4 text-blue-500\" />;\n }\n };\n\n const severityBadgeClass = (severity: string) => {\n switch (severity) {\n case 'critical':\n return 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400';\n case 'warning':\n return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400';\n default:\n return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400';\n }\n };\n\n const severityFilters: { label: string; value: SeverityFilter }[] = [\n { label: 'All', value: 'all' },\n { label: 'Info', value: 'info' },\n { label: 'Warning', value: 'warning' },\n { label: 'Critical', value: 'critical' },\n ];\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Audit Logs & Reports</h1>\n <p className=\"text-sm text-muted-foreground\">\n Monitor platform activity and security events\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"mr-2 h-4 w-4\" />\n Export CSV\n </Button>\n </div>\n\n {/* Summary Stats */}\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Events</CardTitle>\n <Info className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{totalEvents}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Warnings</CardTitle>\n <AlertTriangle className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{warningCount}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Critical</CardTitle>\n <ShieldAlert className=\"h-4 w-4 text-red-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{criticalCount}</div>\n </CardContent>\n </Card>\n </div>\n\n {/* Filters */}\n <Card>\n <CardContent className=\"pt-6\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search events...\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <Filter className=\"h-4 w-4 text-muted-foreground\" />\n {severityFilters.map((filter) => (\n <Button\n key={filter.value}\n variant={selectedSeverity === filter.value ? 'default' : 'outline'}\n size=\"sm\"\n onClick={() => setSelectedSeverity(filter.value)}\n >\n {filter.label}\n </Button>\n ))}\n </div>\n </div>\n </CardContent>\n </Card>\n\n {/* Events Table */}\n <Card>\n <CardHeader>\n <CardTitle className=\"text-base\">Audit Events ({filteredEvents.length})</CardTitle>\n </CardHeader>\n <CardContent>\n {filteredEvents.length === 0 ? (\n <p className=\"py-8 text-center text-sm text-muted-foreground\">\n No events match your filters\n </p>\n ) : (\n <div className=\"space-y-3\">\n {filteredEvents.map((event) => (\n <div\n key={event.id}\n className=\"flex items-start gap-3 rounded-lg border border-border p-4\"\n >\n <div className=\"mt-0.5\">{severityIcon(event.severity)}</div>\n <div className=\"flex-1 space-y-1\">\n <div className=\"flex items-center justify-between\">\n <p className=\"text-sm font-medium\">{event.action}</p>\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${severityBadgeClass(event.severity)}`}\n >\n {event.severity}\n </span>\n </div>\n <p className=\"text-xs text-muted-foreground\">\n <span className=\"font-medium\">{event.actor}</span> &rarr; {event.target}\n </p>\n <p className=\"text-xs text-muted-foreground\">{event.details}</p>\n <p className=\"text-xs text-muted-foreground\">\n {new Date(event.timestamp).toLocaleString()}\n </p>\n </div>\n </div>\n ))}\n </div>\n )}\n </CardContent>\n </Card>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function AnalyticsAchievementsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AnalyticsAchievementsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAchievementsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/AnalyticsAchievementsPagePage.tsx"],"names":[],"mappings":"AAIA,wBAAgB,6BAA6B,4CAgJ5C"}
@@ -0,0 +1,149 @@
1
+ import { useTechnoSpamStore as e } from "../store/technospamStore.js";
2
+ import { Award as t, Lock as n, Star as r, Trophy as i } from "lucide-react";
3
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
4
+ import { Card as s, CardContent as c, CardHeader as l, CardTitle as u } from "@burdenoff/fe-libs/ui";
5
+ //#region src/technospam/pages/AnalyticsAchievementsPagePage.tsx
6
+ function d() {
7
+ let { achievements: d, userStats: f } = e(), p = d.filter((e) => e.unlockedAt).length;
8
+ d.filter((e) => e.unlockedAt).reduce((e, t) => e + parseInt(t.reward) || 0, 0);
9
+ let m = (e) => {
10
+ switch (e) {
11
+ case "common": return "bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400";
12
+ case "rare": return "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400";
13
+ case "epic": return "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400";
14
+ case "legendary": return "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400";
15
+ default: return "";
16
+ }
17
+ }, h = (e) => {
18
+ switch (e) {
19
+ case "common": return "border-gray-300 dark:border-gray-600";
20
+ case "rare": return "border-blue-300 dark:border-blue-600";
21
+ case "epic": return "border-purple-300 dark:border-purple-600";
22
+ case "legendary": return "border-yellow-300 dark:border-yellow-600";
23
+ default: return "border-border";
24
+ }
25
+ };
26
+ return /* @__PURE__ */ o("div", {
27
+ className: "space-y-6 p-6",
28
+ children: [
29
+ /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h1", {
30
+ className: "text-2xl font-semibold text-foreground",
31
+ children: "Achievements"
32
+ }), /* @__PURE__ */ a("p", {
33
+ className: "text-sm text-muted-foreground",
34
+ children: "Earn badges and rewards by completing challenges"
35
+ })] }),
36
+ /* @__PURE__ */ o("div", {
37
+ className: "grid gap-4 md:grid-cols-3",
38
+ children: [
39
+ /* @__PURE__ */ o(s, { children: [/* @__PURE__ */ o(l, {
40
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
41
+ children: [/* @__PURE__ */ a(u, {
42
+ className: "text-sm font-medium",
43
+ children: "Unlocked"
44
+ }), /* @__PURE__ */ a(i, { className: "h-4 w-4 text-yellow-500" })]
45
+ }), /* @__PURE__ */ a(c, { children: /* @__PURE__ */ o("div", {
46
+ className: "text-2xl font-bold",
47
+ children: [
48
+ p,
49
+ "/",
50
+ d.length
51
+ ]
52
+ }) })] }),
53
+ /* @__PURE__ */ o(s, { children: [/* @__PURE__ */ o(l, {
54
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
55
+ children: [/* @__PURE__ */ a(u, {
56
+ className: "text-sm font-medium",
57
+ children: "Total Points"
58
+ }), /* @__PURE__ */ a(r, { className: "h-4 w-4 text-muted-foreground" })]
59
+ }), /* @__PURE__ */ a(c, { children: /* @__PURE__ */ a("div", {
60
+ className: "text-2xl font-bold",
61
+ children: f.totalPoints.toLocaleString()
62
+ }) })] }),
63
+ /* @__PURE__ */ o(s, { children: [/* @__PURE__ */ o(l, {
64
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
65
+ children: [/* @__PURE__ */ a(u, {
66
+ className: "text-sm font-medium",
67
+ children: "Global Rank"
68
+ }), /* @__PURE__ */ a(t, { className: "h-4 w-4 text-muted-foreground" })]
69
+ }), /* @__PURE__ */ a(c, { children: /* @__PURE__ */ o("div", {
70
+ className: "text-2xl font-bold",
71
+ children: ["#", f.rank]
72
+ }) })] })
73
+ ]
74
+ }),
75
+ /* @__PURE__ */ a("div", {
76
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
77
+ children: d.map((e) => {
78
+ let t = !!e.unlockedAt, r = Math.round(e.progress / e.maxProgress * 100);
79
+ return /* @__PURE__ */ a(s, {
80
+ className: `${h(e.rarity)} ${t ? "" : "opacity-70"}`,
81
+ children: /* @__PURE__ */ o(c, {
82
+ className: "space-y-3 pt-6",
83
+ children: [
84
+ /* @__PURE__ */ o("div", {
85
+ className: "flex items-start justify-between",
86
+ children: [/* @__PURE__ */ o("div", {
87
+ className: "flex items-center gap-3",
88
+ children: [/* @__PURE__ */ a("div", {
89
+ className: `flex h-12 w-12 items-center justify-center rounded-full ${t ? "bg-primary/10" : "bg-muted"}`,
90
+ children: t ? /* @__PURE__ */ a(i, { className: "h-6 w-6 text-primary" }) : /* @__PURE__ */ a(n, { className: "h-6 w-6 text-muted-foreground" })
91
+ }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("p", {
92
+ className: "font-medium",
93
+ children: e.title
94
+ }), /* @__PURE__ */ a("p", {
95
+ className: "text-xs text-muted-foreground",
96
+ children: e.category
97
+ })] })]
98
+ }), /* @__PURE__ */ a("span", {
99
+ className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${m(e.rarity)}`,
100
+ children: e.rarity
101
+ })]
102
+ }),
103
+ /* @__PURE__ */ a("p", {
104
+ className: "text-sm text-muted-foreground",
105
+ children: e.description
106
+ }),
107
+ /* @__PURE__ */ o("div", {
108
+ className: "space-y-1",
109
+ children: [/* @__PURE__ */ o("div", {
110
+ className: "flex items-center justify-between text-xs",
111
+ children: [/* @__PURE__ */ a("span", {
112
+ className: "text-muted-foreground",
113
+ children: "Progress"
114
+ }), /* @__PURE__ */ o("span", {
115
+ className: "font-medium",
116
+ children: [
117
+ e.progress,
118
+ "/",
119
+ e.maxProgress
120
+ ]
121
+ })]
122
+ }), /* @__PURE__ */ a("div", {
123
+ className: "h-2 w-full overflow-hidden rounded-full bg-muted",
124
+ children: /* @__PURE__ */ a("div", {
125
+ className: `h-2 rounded-full ${t ? "bg-green-500" : "bg-primary"}`,
126
+ style: { width: `${r}%` }
127
+ })
128
+ })]
129
+ }),
130
+ /* @__PURE__ */ o("p", {
131
+ className: "text-xs text-muted-foreground",
132
+ children: ["Reward: ", e.reward]
133
+ }),
134
+ t && e.unlockedAt && /* @__PURE__ */ o("p", {
135
+ className: "text-xs text-muted-foreground",
136
+ children: ["Unlocked ", new Date(e.unlockedAt).toLocaleDateString()]
137
+ })
138
+ ]
139
+ })
140
+ }, e.id);
141
+ })
142
+ })
143
+ ]
144
+ });
145
+ }
146
+ //#endregion
147
+ export { d as AnalyticsAchievementsPagePage };
148
+
149
+ //# sourceMappingURL=AnalyticsAchievementsPagePage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAchievementsPagePage.js","names":[],"sources":["../../../src/technospam/pages/AnalyticsAchievementsPagePage.tsx"],"sourcesContent":["import { Card, CardContent, CardHeader, CardTitle, Badge } from '@burdenoff/fe-libs/ui';\nimport { Trophy, Award, Star, Lock } from 'lucide-react';\nimport { useTechnoSpamStore } from '../store/technospamStore';\n\nexport function AnalyticsAchievementsPagePage() {\n const { achievements, userStats } = useTechnoSpamStore();\n\n const unlockedCount = achievements.filter((a) => a.unlockedAt).length;\n const totalPoints = achievements\n .filter((a) => a.unlockedAt)\n .reduce((sum, a) => sum + parseInt(a.reward) || 0, 0);\n\n const rarityColor = (rarity: string) => {\n switch (rarity) {\n case 'common':\n return 'bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-400';\n case 'rare':\n return 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-400';\n case 'epic':\n return 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-400';\n case 'legendary':\n return 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400';\n default:\n return '';\n }\n };\n\n const rarityBorder = (rarity: string) => {\n switch (rarity) {\n case 'common':\n return 'border-gray-300 dark:border-gray-600';\n case 'rare':\n return 'border-blue-300 dark:border-blue-600';\n case 'epic':\n return 'border-purple-300 dark:border-purple-600';\n case 'legendary':\n return 'border-yellow-300 dark:border-yellow-600';\n default:\n return 'border-border';\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n <div>\n <h1 className=\"text-2xl font-semibold text-foreground\">Achievements</h1>\n <p className=\"text-sm text-muted-foreground\">\n Earn badges and rewards by completing challenges\n </p>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 md:grid-cols-3\">\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Unlocked</CardTitle>\n <Trophy className=\"h-4 w-4 text-yellow-500\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">\n {unlockedCount}/{achievements.length}\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Total Points</CardTitle>\n <Star className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">{userStats.totalPoints.toLocaleString()}</div>\n </CardContent>\n </Card>\n <Card>\n <CardHeader className=\"flex flex-row items-center justify-between space-y-0 pb-2\">\n <CardTitle className=\"text-sm font-medium\">Global Rank</CardTitle>\n <Award className=\"h-4 w-4 text-muted-foreground\" />\n </CardHeader>\n <CardContent>\n <div className=\"text-2xl font-bold\">#{userStats.rank}</div>\n </CardContent>\n </Card>\n </div>\n\n {/* Achievements Grid */}\n <div className=\"grid gap-4 md:grid-cols-2 lg:grid-cols-3\">\n {achievements.map((achievement) => {\n const isUnlocked = !!achievement.unlockedAt;\n const progressPercent = Math.round(\n (achievement.progress / achievement.maxProgress) * 100\n );\n\n return (\n <Card\n key={achievement.id}\n className={`${rarityBorder(achievement.rarity)} ${!isUnlocked ? 'opacity-70' : ''}`}\n >\n <CardContent className=\"space-y-3 pt-6\">\n <div className=\"flex items-start justify-between\">\n <div className=\"flex items-center gap-3\">\n <div\n className={`flex h-12 w-12 items-center justify-center rounded-full ${isUnlocked ? 'bg-primary/10' : 'bg-muted'}`}\n >\n {isUnlocked ? (\n <Trophy className=\"h-6 w-6 text-primary\" />\n ) : (\n <Lock className=\"h-6 w-6 text-muted-foreground\" />\n )}\n </div>\n <div>\n <p className=\"font-medium\">{achievement.title}</p>\n <p className=\"text-xs text-muted-foreground\">{achievement.category}</p>\n </div>\n </div>\n <span\n className={`inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium ${rarityColor(achievement.rarity)}`}\n >\n {achievement.rarity}\n </span>\n </div>\n <p className=\"text-sm text-muted-foreground\">{achievement.description}</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\">\n {achievement.progress}/{achievement.maxProgress}\n </span>\n </div>\n <div className=\"h-2 w-full overflow-hidden rounded-full bg-muted\">\n <div\n className={`h-2 rounded-full ${isUnlocked ? 'bg-green-500' : 'bg-primary'}`}\n style={{ width: `${progressPercent}%` }}\n />\n </div>\n </div>\n <p className=\"text-xs text-muted-foreground\">Reward: {achievement.reward}</p>\n {isUnlocked && achievement.unlockedAt && (\n <p className=\"text-xs text-muted-foreground\">\n Unlocked {new Date(achievement.unlockedAt).toLocaleDateString()}\n </p>\n )}\n </CardContent>\n </Card>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function AnalyticsAnalyticsPagePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=AnalyticsAnalyticsPagePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalyticsAnalyticsPagePage.d.ts","sourceRoot":"","sources":["../../../src/technospam/pages/AnalyticsAnalyticsPagePage.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,0BAA0B,4CA4LzC"}
@@ -0,0 +1,260 @@
1
+ import { useTechnoSpamStore as e } from "../store/technospamStore.js";
2
+ import { useState as t } from "react";
3
+ import { BarChart3 as n, BookOpen as r, Clock as i, Code as a, Target as o, TrendingUp as s } from "lucide-react";
4
+ import { Fragment as c, jsx as l, jsxs as u } from "react/jsx-runtime";
5
+ import { Button as d, Card as f, CardContent as p, CardHeader as m, CardTitle as h } from "@burdenoff/fe-libs/ui";
6
+ //#region src/technospam/pages/AnalyticsAnalyticsPagePage.tsx
7
+ var g = [
8
+ {
9
+ day: "Mon",
10
+ hours: 2.5
11
+ },
12
+ {
13
+ day: "Tue",
14
+ hours: 3.2
15
+ },
16
+ {
17
+ day: "Wed",
18
+ hours: 1.8
19
+ },
20
+ {
21
+ day: "Thu",
22
+ hours: 4
23
+ },
24
+ {
25
+ day: "Fri",
26
+ hours: 2
27
+ },
28
+ {
29
+ day: "Sat",
30
+ hours: 5.5
31
+ },
32
+ {
33
+ day: "Sun",
34
+ hours: 3
35
+ }
36
+ ], _ = Math.max(...g.map((e) => e.hours));
37
+ function v() {
38
+ let { userStats: v, courses: y, problems: b } = e(), [x, S] = t("personal"), C = {
39
+ easy: b.filter((e) => e.isSolved && e.difficulty === "easy").length,
40
+ medium: b.filter((e) => e.isSolved && e.difficulty === "medium").length,
41
+ hard: b.filter((e) => e.isSolved && e.difficulty === "hard").length
42
+ };
43
+ return /* @__PURE__ */ u("div", {
44
+ className: "space-y-6 p-6",
45
+ children: [
46
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("h1", {
47
+ className: "text-2xl font-semibold text-foreground",
48
+ children: "Analytics"
49
+ }), /* @__PURE__ */ l("p", {
50
+ className: "text-sm text-muted-foreground",
51
+ children: "Insights into your learning performance"
52
+ })] }),
53
+ /* @__PURE__ */ u("div", {
54
+ className: "flex gap-2 border-b border-border pb-2",
55
+ children: [/* @__PURE__ */ l(d, {
56
+ variant: x === "personal" ? "default" : "ghost",
57
+ size: "sm",
58
+ onClick: () => S("personal"),
59
+ children: "Personal Insights"
60
+ }), /* @__PURE__ */ l(d, {
61
+ variant: x === "platform" ? "default" : "ghost",
62
+ size: "sm",
63
+ onClick: () => S("platform"),
64
+ children: "Platform Overview"
65
+ })]
66
+ }),
67
+ x === "personal" ? /* @__PURE__ */ u(c, { children: [/* @__PURE__ */ u("div", {
68
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-4",
69
+ children: [
70
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
71
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
72
+ children: [/* @__PURE__ */ l(h, {
73
+ className: "text-sm font-medium",
74
+ children: "Learning Hours"
75
+ }), /* @__PURE__ */ l(i, { className: "h-4 w-4 text-muted-foreground" })]
76
+ }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l("div", {
77
+ className: "text-2xl font-bold",
78
+ children: v.totalLearningHours
79
+ }), /* @__PURE__ */ l("p", {
80
+ className: "text-xs text-muted-foreground",
81
+ children: "+22h this week"
82
+ })] })] }),
83
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
84
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
85
+ children: [/* @__PURE__ */ l(h, {
86
+ className: "text-sm font-medium",
87
+ children: "Problems Solved"
88
+ }), /* @__PURE__ */ l(a, { className: "h-4 w-4 text-muted-foreground" })]
89
+ }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l("div", {
90
+ className: "text-2xl font-bold",
91
+ children: v.problemsSolved
92
+ }), /* @__PURE__ */ l("p", {
93
+ className: "text-xs text-muted-foreground",
94
+ children: "+12 this week"
95
+ })] })] }),
96
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
97
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
98
+ children: [/* @__PURE__ */ l(h, {
99
+ className: "text-sm font-medium",
100
+ children: "Courses Progress"
101
+ }), /* @__PURE__ */ l(r, { className: "h-4 w-4 text-muted-foreground" })]
102
+ }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ u("div", {
103
+ className: "text-2xl font-bold",
104
+ children: [
105
+ v.coursesCompleted,
106
+ "/",
107
+ v.coursesEnrolled
108
+ ]
109
+ }), /* @__PURE__ */ l("p", {
110
+ className: "text-xs text-muted-foreground",
111
+ children: "Completed/Enrolled"
112
+ })] })] }),
113
+ /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ u(m, {
114
+ className: "flex flex-row items-center justify-between space-y-0 pb-2",
115
+ children: [/* @__PURE__ */ l(h, {
116
+ className: "text-sm font-medium",
117
+ children: "Total Points"
118
+ }), /* @__PURE__ */ l(o, { className: "h-4 w-4 text-muted-foreground" })]
119
+ }), /* @__PURE__ */ u(p, { children: [/* @__PURE__ */ l("div", {
120
+ className: "text-2xl font-bold",
121
+ children: v.totalPoints.toLocaleString()
122
+ }), /* @__PURE__ */ u("p", {
123
+ className: "text-xs text-muted-foreground",
124
+ children: ["Rank #", v.rank]
125
+ })] })] })
126
+ ]
127
+ }), /* @__PURE__ */ u("div", {
128
+ className: "grid gap-6 lg:grid-cols-2",
129
+ children: [/* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ u(h, {
130
+ className: "flex items-center gap-2 text-base",
131
+ children: [/* @__PURE__ */ l(n, { className: "h-4 w-4" }), "Weekly Activity"]
132
+ }) }), /* @__PURE__ */ l(p, {
133
+ className: "space-y-2",
134
+ children: g.map((e) => /* @__PURE__ */ u("div", {
135
+ className: "flex items-center gap-3",
136
+ children: [
137
+ /* @__PURE__ */ l("span", {
138
+ className: "w-8 text-sm text-muted-foreground",
139
+ children: e.day
140
+ }),
141
+ /* @__PURE__ */ l("div", {
142
+ className: "flex-1 h-4 bg-muted rounded overflow-hidden",
143
+ children: /* @__PURE__ */ l("div", {
144
+ className: "h-4 bg-primary rounded",
145
+ style: { width: `${e.hours / _ * 100}%` }
146
+ })
147
+ }),
148
+ /* @__PURE__ */ u("span", {
149
+ className: "w-10 text-sm font-medium text-right",
150
+ children: [e.hours, "h"]
151
+ })
152
+ ]
153
+ }, e.day))
154
+ })] }), /* @__PURE__ */ u(f, { children: [/* @__PURE__ */ l(m, { children: /* @__PURE__ */ l(h, {
155
+ className: "text-base",
156
+ children: "Problems by Difficulty"
157
+ }) }), /* @__PURE__ */ u(p, {
158
+ className: "space-y-4",
159
+ children: [
160
+ /* @__PURE__ */ u("div", {
161
+ className: "space-y-2",
162
+ children: [/* @__PURE__ */ u("div", {
163
+ className: "flex items-center justify-between text-sm",
164
+ children: [/* @__PURE__ */ l("span", {
165
+ className: "text-green-600",
166
+ children: "Easy"
167
+ }), /* @__PURE__ */ l("span", {
168
+ className: "font-medium",
169
+ children: C.easy
170
+ })]
171
+ }), /* @__PURE__ */ l("div", {
172
+ className: "h-3 w-full overflow-hidden rounded-full bg-muted",
173
+ children: /* @__PURE__ */ l("div", {
174
+ className: "h-3 rounded-full bg-green-500",
175
+ style: { width: `${C.easy / b.length * 100}%` }
176
+ })
177
+ })]
178
+ }),
179
+ /* @__PURE__ */ u("div", {
180
+ className: "space-y-2",
181
+ children: [/* @__PURE__ */ u("div", {
182
+ className: "flex items-center justify-between text-sm",
183
+ children: [/* @__PURE__ */ l("span", {
184
+ className: "text-yellow-600",
185
+ children: "Medium"
186
+ }), /* @__PURE__ */ l("span", {
187
+ className: "font-medium",
188
+ children: C.medium
189
+ })]
190
+ }), /* @__PURE__ */ l("div", {
191
+ className: "h-3 w-full overflow-hidden rounded-full bg-muted",
192
+ children: /* @__PURE__ */ l("div", {
193
+ className: "h-3 rounded-full bg-yellow-500",
194
+ style: { width: `${C.medium / b.length * 100}%` }
195
+ })
196
+ })]
197
+ }),
198
+ /* @__PURE__ */ u("div", {
199
+ className: "space-y-2",
200
+ children: [/* @__PURE__ */ u("div", {
201
+ className: "flex items-center justify-between text-sm",
202
+ children: [/* @__PURE__ */ l("span", {
203
+ className: "text-red-600",
204
+ children: "Hard"
205
+ }), /* @__PURE__ */ l("span", {
206
+ className: "font-medium",
207
+ children: C.hard
208
+ })]
209
+ }), /* @__PURE__ */ l("div", {
210
+ className: "h-3 w-full overflow-hidden rounded-full bg-muted",
211
+ children: /* @__PURE__ */ l("div", {
212
+ className: "h-3 rounded-full bg-red-500",
213
+ style: { width: `${C.hard / b.length * 100}%` }
214
+ })
215
+ })]
216
+ })
217
+ ]
218
+ })] })]
219
+ })] }) : /* @__PURE__ */ u("div", {
220
+ className: "grid gap-4 md:grid-cols-2 lg:grid-cols-3",
221
+ children: [
222
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
223
+ className: "flex items-center gap-4 pt-6",
224
+ children: [/* @__PURE__ */ l(s, { className: "h-8 w-8 text-primary" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("div", {
225
+ className: "text-2xl font-bold",
226
+ children: y.length
227
+ }), /* @__PURE__ */ l("p", {
228
+ className: "text-xs text-muted-foreground",
229
+ children: "Total Courses"
230
+ })] })]
231
+ }) }),
232
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
233
+ className: "flex items-center gap-4 pt-6",
234
+ children: [/* @__PURE__ */ l(a, { className: "h-8 w-8 text-primary" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("div", {
235
+ className: "text-2xl font-bold",
236
+ children: b.length
237
+ }), /* @__PURE__ */ l("p", {
238
+ className: "text-xs text-muted-foreground",
239
+ children: "Total Problems"
240
+ })] })]
241
+ }) }),
242
+ /* @__PURE__ */ l(f, { children: /* @__PURE__ */ u(p, {
243
+ className: "flex items-center gap-4 pt-6",
244
+ children: [/* @__PURE__ */ l(n, { className: "h-8 w-8 text-primary" }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("div", {
245
+ className: "text-2xl font-bold",
246
+ children: [(b.reduce((e, t) => e + t.acceptanceRate, 0) / b.length).toFixed(1), "%"]
247
+ }), /* @__PURE__ */ l("p", {
248
+ className: "text-xs text-muted-foreground",
249
+ children: "Avg Acceptance Rate"
250
+ })] })]
251
+ }) })
252
+ ]
253
+ })
254
+ ]
255
+ });
256
+ }
257
+ //#endregion
258
+ export { v as AnalyticsAnalyticsPagePage };
259
+
260
+ //# sourceMappingURL=AnalyticsAnalyticsPagePage.js.map