@hydralms/components 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components.css +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +442 -110
- package/dist/modules/CoursePlayer/CoursePlayer.d.ts +2 -0
- package/dist/modules/CoursePlayer/types.d.ts +59 -0
- package/dist/modules/FlashcardLab/FlashcardLab.d.ts +2 -0
- package/dist/modules/FlashcardLab/types.d.ts +55 -0
- package/dist/modules/QuizModule/QuizModule.d.ts +2 -0
- package/dist/modules/QuizModule/types.d.ts +54 -0
- package/dist/modules/index.d.ts +6 -0
- package/dist/provider/HydraProvider.d.ts +1 -1
- package/dist/sections.cjs +1 -1
- package/dist/sections.js +261 -291
- package/dist/table-BrS5cDQu.js +2510 -0
- package/dist/table-D6AkBBEo.cjs +1 -0
- package/dist/ui/alert-dialog.d.ts +14 -8
- package/dist/ui/button.d.ts +1 -1
- package/dist/ui/tabs.d.ts +15 -5
- package/dist/ui/tooltip.d.ts +12 -5
- package/dist/video/index.d.ts +6 -1
- package/dist/video/types.d.ts +167 -0
- package/dist/video/video-bookmark.d.ts +2 -0
- package/dist/video/video-chapter-list.d.ts +2 -0
- package/dist/video/video-playlist-item.d.ts +2 -0
- package/dist/video/video-thumbnail-card.d.ts +2 -0
- package/dist/video/video-transcript.d.ts +2 -0
- package/package.json +135 -24
- package/src/__tests__/setup.ts +1 -0
- package/src/assessment-toolbar/assessment-toolbar.tsx +96 -0
- package/src/assessment-toolbar/index.ts +10 -0
- package/src/assessment-toolbar/question-navigator.tsx +86 -0
- package/src/assessment-toolbar/timer-display.tsx +73 -0
- package/src/assessment-toolbar/types.ts +92 -0
- package/src/assets/hydra-icon.png +0 -0
- package/src/assets/hydra-icon.svg +18 -0
- package/src/assets/hydra-lms-icon.png +0 -0
- package/src/assets/hydra-lms-icon.svg +9 -0
- package/src/common/confirm-dialog.tsx +60 -0
- package/src/common/due-date-display.tsx +64 -0
- package/src/common/empty-state.tsx +24 -0
- package/src/common/index.ts +12 -0
- package/src/common/search-input.tsx +68 -0
- package/src/common/status-badge.test.tsx +43 -0
- package/src/common/status-badge.tsx +81 -0
- package/src/common/types.ts +129 -0
- package/src/content/content-block.tsx +116 -0
- package/src/content/file-upload-zone.tsx +109 -0
- package/src/content/index.ts +7 -0
- package/src/content/types.ts +76 -0
- package/src/curriculum/curriculum-item.tsx +81 -0
- package/src/curriculum/curriculum-tree.tsx +69 -0
- package/src/curriculum/index.ts +11 -0
- package/src/curriculum/learning-object-icon.tsx +44 -0
- package/src/curriculum/types.ts +83 -0
- package/src/feedback/feedback-banner.tsx +46 -0
- package/src/feedback/index.ts +8 -0
- package/src/feedback/likert-scale.tsx +58 -0
- package/src/feedback/star-rating.tsx +65 -0
- package/src/feedback/types.ts +86 -0
- package/src/flashcards/flashcard-deck.tsx +130 -0
- package/src/flashcards/flashcard.tsx +108 -0
- package/src/flashcards/index.ts +3 -0
- package/src/flashcards/types.ts +60 -0
- package/src/index.ts +38 -0
- package/src/lib/utils.ts +6 -0
- package/src/modules/CoursePlayer/CoursePlayer.tsx +281 -0
- package/src/modules/CoursePlayer/types.ts +48 -0
- package/src/modules/FlashcardLab/FlashcardLab.tsx +275 -0
- package/src/modules/FlashcardLab/types.ts +58 -0
- package/src/modules/QuizModule/QuizModule.tsx +241 -0
- package/src/modules/QuizModule/types.ts +56 -0
- package/src/modules/index.ts +12 -0
- package/src/progress/grade-indicator.tsx +65 -0
- package/src/progress/index.ts +8 -0
- package/src/progress/progress-ring.tsx +56 -0
- package/src/progress/stat-card.tsx +42 -0
- package/src/progress/types.ts +73 -0
- package/src/provider/HydraProvider.tsx +26 -0
- package/src/provider/index.ts +2 -0
- package/src/questions/choice.tsx +90 -0
- package/src/questions/essay.tsx +59 -0
- package/src/questions/fill-in-the-blank.tsx +69 -0
- package/src/questions/index.ts +14 -0
- package/src/questions/multiple-choice.test.tsx +104 -0
- package/src/questions/multiple-choice.tsx +97 -0
- package/src/questions/question-renderer.tsx +37 -0
- package/src/questions/true-false.test.tsx +89 -0
- package/src/questions/true-false.tsx +90 -0
- package/src/questions/types.ts +53 -0
- package/src/sections/AnnouncementFeed/AnnouncementFeed.tsx +141 -0
- package/src/sections/AnnouncementFeed/types.ts +50 -0
- package/src/sections/AssessmentReview/AssessmentReview.tsx +148 -0
- package/src/sections/AssessmentReview/types.ts +61 -0
- package/src/sections/AssignmentSubmission/AssignmentSubmission.tsx +190 -0
- package/src/sections/AssignmentSubmission/types.ts +60 -0
- package/src/sections/CertificateViewer/CertificateViewer.tsx +117 -0
- package/src/sections/CertificateViewer/types.ts +45 -0
- package/src/sections/CourseOutline/CourseOutline.tsx +79 -0
- package/src/sections/CourseOutline/types.ts +53 -0
- package/src/sections/DiscussionThread/DiscussionThread.tsx +186 -0
- package/src/sections/DiscussionThread/types.ts +77 -0
- package/src/sections/ExamSession/ExamSession.tsx +182 -0
- package/src/sections/ExamSession/types.ts +64 -0
- package/src/sections/FlashcardStudySession/FlashcardStudySession.tsx +76 -0
- package/src/sections/FlashcardStudySession/types.ts +42 -0
- package/src/sections/GradebookTable/GradebookTable.tsx +229 -0
- package/src/sections/GradebookTable/types.ts +75 -0
- package/src/sections/LecturePlayer/LecturePlayer.tsx +60 -0
- package/src/sections/LecturePlayer/types.ts +48 -0
- package/src/sections/LessonPage/LessonPage.tsx +91 -0
- package/src/sections/LessonPage/types.ts +41 -0
- package/src/sections/PracticeQuiz/PracticeQuiz.tsx +199 -0
- package/src/sections/PracticeQuiz/types.ts +44 -0
- package/src/sections/ProgressDashboard/ProgressDashboard.tsx +140 -0
- package/src/sections/ProgressDashboard/types.ts +74 -0
- package/src/sections/QuizSession/QuizSession.tsx +113 -0
- package/src/sections/QuizSession/types.ts +47 -0
- package/src/sections/ResourceLibrary/ResourceLibrary.tsx +218 -0
- package/src/sections/ResourceLibrary/types.ts +57 -0
- package/src/sections/ScrollableQuiz/ScrollableQuiz.tsx +170 -0
- package/src/sections/ScrollableQuiz/types.ts +40 -0
- package/src/sections/SurveyForm/SurveyForm.tsx +180 -0
- package/src/sections/SurveyForm/types.ts +69 -0
- package/src/sections/index.ts +90 -0
- package/src/social/index.ts +3 -0
- package/src/social/post-card.tsx +91 -0
- package/src/social/types.ts +57 -0
- package/src/social/user-avatar.tsx +76 -0
- package/src/styles/globals.css +125 -0
- package/src/ui/alert-dialog.tsx +343 -0
- package/src/ui/alert.tsx +65 -0
- package/src/ui/avatar.tsx +52 -0
- package/src/ui/badge.tsx +53 -0
- package/src/ui/button.tsx +62 -0
- package/src/ui/card.tsx +92 -0
- package/src/ui/index.ts +44 -0
- package/src/ui/input.tsx +21 -0
- package/src/ui/progress.tsx +73 -0
- package/src/ui/separator.tsx +29 -0
- package/src/ui/skeleton.tsx +15 -0
- package/src/ui/slot.tsx +48 -0
- package/src/ui/table.tsx +108 -0
- package/src/ui/tabs.tsx +147 -0
- package/src/ui/textarea.tsx +20 -0
- package/src/ui/tooltip.tsx +177 -0
- package/src/utils/debounce.test.ts +59 -0
- package/src/utils/debounce.ts +10 -0
- package/src/utils/format-duration.test.ts +55 -0
- package/src/utils/format-duration.ts +30 -0
- package/src/video/index.ts +17 -0
- package/src/video/types.ts +216 -0
- package/src/video/video-bookmark.tsx +76 -0
- package/src/video/video-chapter-list.tsx +93 -0
- package/src/video/video-player.tsx +103 -0
- package/src/video/video-playlist-item.tsx +90 -0
- package/src/video/video-thumbnail-card.tsx +74 -0
- package/src/video/video-transcript.tsx +102 -0
- package/dist/table-CW4_BYny.js +0 -9869
- package/dist/table-DSBBqb9X.cjs +0 -56
package/dist/sections.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { jsxs as t, jsx as e, Fragment as ee } from "react/jsx-runtime";
|
|
2
|
-
import { useState as I, useMemo as
|
|
3
|
-
import {
|
|
4
|
-
import { CheckCircle as
|
|
2
|
+
import { useState as I, useMemo as j, useRef as ge, useEffect as ie, useCallback as Qe, Fragment as Be } from "react";
|
|
3
|
+
import { q as be, C as L, t as Q, X, c as F, ak as oe, w as je, x as $e, r as R, N as _e, B as Ne, Z as V, P as ne, F as Ee, J as He, A as ve, b as we, z as Ve, S as Ye, _ as Je, ad as te, a as ye, D as Ke, Y as Ze, af as J, ah as K, ag as Z, a9 as Se, ab as ke, ac as G, H as ze, R as ue, aj as Ge, U as Xe, a0 as Ce, G as Ue, aa as se, K as me, Q as he, O as We, a1 as Oe, a7 as qe, a8 as le, a6 as Ae, a2 as et, a4 as Y, V as tt, $ as ae } from "./table-BrS5cDQu.js";
|
|
4
|
+
import { CheckCircle as W, Clock as De, Check as fe, ChevronRight as nt, List as rt, Grid as st, Download as Te, Pin as lt, MessageSquare as at, Heart as it, Reply as ct, Save as dt, Send as Ie, ArrowUp as ot, ArrowDown as ut, Flame as mt, BookOpen as Fe, Award as Le, Trophy as ht, Printer as ft } from "lucide-react";
|
|
5
5
|
function Ct({
|
|
6
6
|
questions: r,
|
|
7
7
|
initialAnswers: s = [],
|
|
8
8
|
onSubmit: a,
|
|
9
|
-
onAnswerChange:
|
|
9
|
+
onAnswerChange: d,
|
|
10
10
|
timeElapsedSeconds: p,
|
|
11
11
|
timeLimitSeconds: l,
|
|
12
12
|
isSubmitting: h = !1,
|
|
@@ -14,7 +14,7 @@ function Ct({
|
|
|
14
14
|
className: w,
|
|
15
15
|
style: y
|
|
16
16
|
}) {
|
|
17
|
-
const [
|
|
17
|
+
const [c, b] = I(0), [T, u] = I(s), [U, N] = I(/* @__PURE__ */ new Set()), z = r[c], x = j(
|
|
18
18
|
() => r.map((S, f) => ({
|
|
19
19
|
uid: S.uid,
|
|
20
20
|
sequence: f + 1,
|
|
@@ -33,7 +33,7 @@ function Ct({
|
|
|
33
33
|
}));
|
|
34
34
|
u((v) => {
|
|
35
35
|
const k = [...v.filter((D) => D.uid !== f), ...m];
|
|
36
|
-
return
|
|
36
|
+
return d == null || d(k), k;
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
39
|
function n(S) {
|
|
@@ -53,10 +53,10 @@ function Ct({
|
|
|
53
53
|
/* @__PURE__ */ e(
|
|
54
54
|
be,
|
|
55
55
|
{
|
|
56
|
-
currentQuestionIndex:
|
|
56
|
+
currentQuestionIndex: c,
|
|
57
57
|
totalQuestions: r.length,
|
|
58
|
-
hasNext:
|
|
59
|
-
hasPrevious:
|
|
58
|
+
hasNext: c < r.length - 1,
|
|
59
|
+
hasPrevious: c > 0,
|
|
60
60
|
onNext: () => b((S) => Math.min(S + 1, r.length - 1)),
|
|
61
61
|
onPrevious: () => b((S) => Math.max(S - 1, 0)),
|
|
62
62
|
onSubmit: g,
|
|
@@ -87,7 +87,7 @@ function Ut({
|
|
|
87
87
|
video: r,
|
|
88
88
|
notes: s,
|
|
89
89
|
layout: a = "horizontal",
|
|
90
|
-
notesPanelWidth:
|
|
90
|
+
notesPanelWidth: d = "340px",
|
|
91
91
|
notesPanelHeight: p = "240px",
|
|
92
92
|
className: l,
|
|
93
93
|
style: h
|
|
@@ -112,11 +112,11 @@ function Ut({
|
|
|
112
112
|
i ? "border-l border-border" : "border-t border-border w-full"
|
|
113
113
|
),
|
|
114
114
|
style: {
|
|
115
|
-
width: i ?
|
|
115
|
+
width: i ? d : void 0,
|
|
116
116
|
height: i ? void 0 : p
|
|
117
117
|
},
|
|
118
118
|
children: [
|
|
119
|
-
/* @__PURE__ */ e(
|
|
119
|
+
/* @__PURE__ */ e(je, { children: /* @__PURE__ */ e($e, { children: "Notes" }) }),
|
|
120
120
|
/* @__PURE__ */ e(Q, { children: typeof s == "string" ? /* @__PURE__ */ e("span", { className: "text-sm text-foreground", children: s }) : s })
|
|
121
121
|
]
|
|
122
122
|
}
|
|
@@ -129,44 +129,44 @@ function At({
|
|
|
129
129
|
cards: r,
|
|
130
130
|
title: s,
|
|
131
131
|
description: a,
|
|
132
|
-
shuffled:
|
|
132
|
+
shuffled: d = !1,
|
|
133
133
|
onComplete: p,
|
|
134
134
|
readOnly: l = !1,
|
|
135
135
|
className: h,
|
|
136
136
|
style: i
|
|
137
137
|
}) {
|
|
138
|
-
const [w, y] = I(!1),
|
|
138
|
+
const [w, y] = I(!1), c = {
|
|
139
139
|
totalCards: r.length,
|
|
140
|
-
wasShuffled:
|
|
140
|
+
wasShuffled: d
|
|
141
141
|
};
|
|
142
142
|
function b() {
|
|
143
|
-
y(!0), p == null || p(
|
|
143
|
+
y(!0), p == null || p(c);
|
|
144
144
|
}
|
|
145
145
|
function T() {
|
|
146
146
|
y(!1);
|
|
147
147
|
}
|
|
148
|
-
return w ? /* @__PURE__ */ e("div", { className: F(h), style: i, children: /* @__PURE__ */ e(L, { children: /* @__PURE__ */ t(Q, { className: "pt-6 text-center flex flex-col items-center gap-2", children: [
|
|
149
|
-
/* @__PURE__ */ e(
|
|
148
|
+
return w ? /* @__PURE__ */ e("div", { className: F("flex flex-col items-center", h), style: i, children: /* @__PURE__ */ e(L, { children: /* @__PURE__ */ t(Q, { className: "pt-6 text-center flex flex-col items-center gap-2", children: [
|
|
149
|
+
/* @__PURE__ */ e(W, { size: 48, className: "text-success" }),
|
|
150
150
|
/* @__PURE__ */ e("span", { className: "text-xl font-bold text-foreground", children: "Deck complete!" }),
|
|
151
151
|
s && /* @__PURE__ */ t("span", { className: "text-muted-foreground", children: [
|
|
152
152
|
"You finished ",
|
|
153
153
|
/* @__PURE__ */ e("strong", { children: s })
|
|
154
154
|
] }),
|
|
155
155
|
/* @__PURE__ */ t("span", { className: "text-sm text-muted-foreground", children: [
|
|
156
|
-
|
|
156
|
+
c.totalCards,
|
|
157
157
|
" card",
|
|
158
|
-
|
|
158
|
+
c.totalCards !== 1 ? "s" : "",
|
|
159
159
|
" studied",
|
|
160
|
-
|
|
160
|
+
c.wasShuffled ? " (shuffled)" : ""
|
|
161
161
|
] }),
|
|
162
|
-
/* @__PURE__ */ e(R, { className: "mt-
|
|
163
|
-
] }) }) }) : /* @__PURE__ */ e("div", { className: F(h), style: i, children: /* @__PURE__ */ e(
|
|
164
|
-
|
|
162
|
+
/* @__PURE__ */ e(R, { className: "mt-2", onClick: T, children: "Study Again" })
|
|
163
|
+
] }) }) }) : /* @__PURE__ */ e("div", { className: F("flex flex-col items-center", h), style: i, children: /* @__PURE__ */ e(
|
|
164
|
+
_e,
|
|
165
165
|
{
|
|
166
166
|
cards: r,
|
|
167
167
|
deckName: s,
|
|
168
168
|
deckDescription: a,
|
|
169
|
-
shuffled:
|
|
169
|
+
shuffled: d,
|
|
170
170
|
showProgress: !0,
|
|
171
171
|
onComplete: b,
|
|
172
172
|
readOnly: l
|
|
@@ -198,29 +198,29 @@ function pt({
|
|
|
198
198
|
] })
|
|
199
199
|
] }) }) });
|
|
200
200
|
}
|
|
201
|
-
function
|
|
201
|
+
function ce({
|
|
202
202
|
questions: r,
|
|
203
203
|
sessionAnswers: s,
|
|
204
204
|
showCorrectAnswers: a
|
|
205
205
|
}) {
|
|
206
|
-
return /* @__PURE__ */ e("div", { className: "flex flex-col gap-3", children: r.map((
|
|
206
|
+
return /* @__PURE__ */ e("div", { className: "flex flex-col gap-3", children: r.map((d, p) => /* @__PURE__ */ t(L, { className: "overflow-hidden", children: [
|
|
207
207
|
/* @__PURE__ */ e("div", { className: "px-2 py-1 bg-muted", children: /* @__PURE__ */ t("span", { className: "text-xs text-muted-foreground font-semibold", children: [
|
|
208
208
|
"Question ",
|
|
209
209
|
p + 1
|
|
210
210
|
] }) }),
|
|
211
211
|
/* @__PURE__ */ e(V, {}),
|
|
212
|
-
/* @__PURE__ */ e(Q, { className: "pt-4 pb-
|
|
212
|
+
/* @__PURE__ */ e(Q, { className: "pt-4 pb-4", children: /* @__PURE__ */ e(
|
|
213
213
|
X,
|
|
214
214
|
{
|
|
215
|
-
question:
|
|
216
|
-
sessionAnswers: s.filter((l) => l.uid ===
|
|
215
|
+
question: d,
|
|
216
|
+
sessionAnswers: s.filter((l) => l.uid === d.uid),
|
|
217
217
|
readOnly: !0,
|
|
218
218
|
showCorrectAnswers: a
|
|
219
219
|
}
|
|
220
220
|
) })
|
|
221
|
-
] },
|
|
221
|
+
] }, d.uid)) });
|
|
222
222
|
}
|
|
223
|
-
function xt(r, s, a,
|
|
223
|
+
function xt(r, s, a, d) {
|
|
224
224
|
const p = new Map(r.map((i) => [i.uid, i])), l = new Set(a.flatMap((i) => i.questionUids)), h = r.filter((i) => !l.has(i.uid));
|
|
225
225
|
return /* @__PURE__ */ t("div", { className: "flex flex-col gap-4", children: [
|
|
226
226
|
a.map((i) => {
|
|
@@ -229,21 +229,21 @@ function xt(r, s, a, c) {
|
|
|
229
229
|
/* @__PURE__ */ e("span", { className: "uppercase text-xs tracking-wide text-muted-foreground font-semibold", children: i.label }),
|
|
230
230
|
/* @__PURE__ */ e(V, { className: "mb-2" }),
|
|
231
231
|
/* @__PURE__ */ e(
|
|
232
|
-
|
|
232
|
+
ce,
|
|
233
233
|
{
|
|
234
234
|
questions: w,
|
|
235
235
|
sessionAnswers: s,
|
|
236
|
-
showCorrectAnswers:
|
|
236
|
+
showCorrectAnswers: d
|
|
237
237
|
}
|
|
238
238
|
)
|
|
239
239
|
] }, i.label);
|
|
240
240
|
}),
|
|
241
241
|
h.length > 0 && /* @__PURE__ */ e("div", { children: /* @__PURE__ */ e(
|
|
242
|
-
|
|
242
|
+
ce,
|
|
243
243
|
{
|
|
244
244
|
questions: h,
|
|
245
245
|
sessionAnswers: s,
|
|
246
|
-
showCorrectAnswers:
|
|
246
|
+
showCorrectAnswers: d
|
|
247
247
|
}
|
|
248
248
|
) })
|
|
249
249
|
] });
|
|
@@ -252,15 +252,15 @@ function Dt({
|
|
|
252
252
|
questions: r,
|
|
253
253
|
sessionAnswers: s,
|
|
254
254
|
score: a,
|
|
255
|
-
questionGroups:
|
|
255
|
+
questionGroups: d,
|
|
256
256
|
showCorrectAnswers: p = !0,
|
|
257
257
|
className: l,
|
|
258
258
|
style: h
|
|
259
259
|
}) {
|
|
260
260
|
return /* @__PURE__ */ t("div", { className: F(l), style: h, children: [
|
|
261
261
|
a && /* @__PURE__ */ e(pt, { score: a }),
|
|
262
|
-
|
|
263
|
-
|
|
262
|
+
d && d.length > 0 ? xt(r, s, d, p) : /* @__PURE__ */ e(
|
|
263
|
+
ce,
|
|
264
264
|
{
|
|
265
265
|
questions: r,
|
|
266
266
|
sessionAnswers: s,
|
|
@@ -279,16 +279,16 @@ function Tt({
|
|
|
279
279
|
items: r,
|
|
280
280
|
progress: s,
|
|
281
281
|
courseTitle: a,
|
|
282
|
-
activeItemUid:
|
|
282
|
+
activeItemUid: d,
|
|
283
283
|
onItemClick: p,
|
|
284
284
|
showOverallProgress: l = !0,
|
|
285
285
|
showDuration: h = !0,
|
|
286
286
|
showIcons: i = !0,
|
|
287
287
|
readOnly: w = !1,
|
|
288
288
|
className: y,
|
|
289
|
-
style:
|
|
289
|
+
style: c
|
|
290
290
|
}) {
|
|
291
|
-
const { completedCount: b, totalCount: T, percentage: u } =
|
|
291
|
+
const { completedCount: b, totalCount: T, percentage: u } = j(() => {
|
|
292
292
|
const U = Me(r), N = U.length, z = s ? U.filter(
|
|
293
293
|
(x) => s.some((C) => C.resourceUid === x && C.isCompleted)
|
|
294
294
|
).length : 0;
|
|
@@ -298,7 +298,7 @@ function Tt({
|
|
|
298
298
|
percentage: N > 0 ? Math.round(z / N * 100) : 0
|
|
299
299
|
};
|
|
300
300
|
}, [r, s]);
|
|
301
|
-
return /* @__PURE__ */ t("div", { className: F(y), style:
|
|
301
|
+
return /* @__PURE__ */ t("div", { className: F(y), style: c, children: [
|
|
302
302
|
(a || l) && /* @__PURE__ */ t("div", { className: "px-2 pt-2 pb-1", children: [
|
|
303
303
|
a && /* @__PURE__ */ e("p", { className: F("font-semibold text-sm text-foreground", l && "mb-1"), children: a }),
|
|
304
304
|
l && /* @__PURE__ */ t("div", { children: [
|
|
@@ -312,11 +312,11 @@ function Tt({
|
|
|
312
312
|
] })
|
|
313
313
|
] }),
|
|
314
314
|
/* @__PURE__ */ e(
|
|
315
|
-
|
|
315
|
+
Ee,
|
|
316
316
|
{
|
|
317
317
|
items: r,
|
|
318
318
|
progress: s,
|
|
319
|
-
activeItemUid:
|
|
319
|
+
activeItemUid: d,
|
|
320
320
|
onItemClick: p,
|
|
321
321
|
readOnly: w,
|
|
322
322
|
showDuration: h,
|
|
@@ -330,17 +330,17 @@ function It({
|
|
|
330
330
|
questions: r,
|
|
331
331
|
initialAnswers: s = [],
|
|
332
332
|
onSubmit: a,
|
|
333
|
-
onAnswerChange:
|
|
333
|
+
onAnswerChange: d,
|
|
334
334
|
showNavigator: p = !0,
|
|
335
335
|
showQuestionNumbers: l = !0,
|
|
336
336
|
questionGroups: h,
|
|
337
337
|
isSubmitting: i = !1,
|
|
338
338
|
readOnly: w = !1,
|
|
339
339
|
className: y,
|
|
340
|
-
style:
|
|
340
|
+
style: c
|
|
341
341
|
}) {
|
|
342
342
|
var S;
|
|
343
|
-
const [b, T] = I(s), [u, U] = I(((S = r[0]) == null ? void 0 : S.uid) ?? null), N = ge(/* @__PURE__ */ new Map()), z =
|
|
343
|
+
const [b, T] = I(s), [u, U] = I(((S = r[0]) == null ? void 0 : S.uid) ?? null), N = ge(/* @__PURE__ */ new Map()), z = j(() => {
|
|
344
344
|
const f = new Set(b.map((m) => m.uid));
|
|
345
345
|
return r.filter((m) => f.has(m.uid)).length;
|
|
346
346
|
}, [r, b]);
|
|
@@ -365,14 +365,14 @@ function It({
|
|
|
365
365
|
}));
|
|
366
366
|
T((A) => {
|
|
367
367
|
const D = [...A.filter((P) => P.uid !== f), ...v];
|
|
368
|
-
return
|
|
368
|
+
return d == null || d(D), D;
|
|
369
369
|
});
|
|
370
370
|
}
|
|
371
371
|
function n(f) {
|
|
372
372
|
var m;
|
|
373
373
|
(m = N.current.get(f)) == null || m.scrollIntoView({ behavior: "smooth", block: "center" });
|
|
374
374
|
}
|
|
375
|
-
const o =
|
|
375
|
+
const o = j(() => {
|
|
376
376
|
if (!h) return [{ label: null, questions: r }];
|
|
377
377
|
const f = h.map(
|
|
378
378
|
(A) => ({
|
|
@@ -383,7 +383,7 @@ function It({
|
|
|
383
383
|
return v.length > 0 && f.push({ label: null, questions: v }), f;
|
|
384
384
|
}, [r, h]);
|
|
385
385
|
let g = 0;
|
|
386
|
-
return /* @__PURE__ */ t("div", { className: F("flex gap-3", y), style:
|
|
386
|
+
return /* @__PURE__ */ t("div", { className: F("flex gap-3", y), style: c, children: [
|
|
387
387
|
/* @__PURE__ */ t("div", { className: "flex-1 min-w-0", children: [
|
|
388
388
|
o.map((f, m) => /* @__PURE__ */ t("div", { children: [
|
|
389
389
|
f.label && /* @__PURE__ */ e("p", { className: F("text-lg font-semibold mb-2 text-foreground", m > 0 && "mt-4"), children: f.label }),
|
|
@@ -434,7 +434,7 @@ function It({
|
|
|
434
434
|
] }),
|
|
435
435
|
p && /* @__PURE__ */ t(L, { className: "hidden md:block w-50 shrink-0 sticky top-4 self-start p-3", children: [
|
|
436
436
|
/* @__PURE__ */ e("p", { className: "font-semibold text-sm mb-1 text-foreground", children: "Questions" }),
|
|
437
|
-
/* @__PURE__ */ e("div", { className: "flex flex-wrap gap-
|
|
437
|
+
/* @__PURE__ */ e("div", { className: "flex flex-wrap gap-1", children: r.map((f, m) => {
|
|
438
438
|
const v = b.some((k) => k.uid === f.uid), A = u === f.uid;
|
|
439
439
|
return /* @__PURE__ */ e(
|
|
440
440
|
"button",
|
|
@@ -456,8 +456,8 @@ function It({
|
|
|
456
456
|
function gt(r) {
|
|
457
457
|
const s = [...r];
|
|
458
458
|
for (let a = s.length - 1; a > 0; a--) {
|
|
459
|
-
const
|
|
460
|
-
[s[a], s[
|
|
459
|
+
const d = Math.floor(Math.random() * (a + 1));
|
|
460
|
+
[s[a], s[d]] = [s[d], s[a]];
|
|
461
461
|
}
|
|
462
462
|
return s;
|
|
463
463
|
}
|
|
@@ -465,17 +465,17 @@ function Ft({
|
|
|
465
465
|
questions: r,
|
|
466
466
|
instantFeedback: s = !0,
|
|
467
467
|
allowRetry: a = !0,
|
|
468
|
-
onComplete:
|
|
468
|
+
onComplete: d,
|
|
469
469
|
shuffled: p = !1,
|
|
470
470
|
readOnly: l = !1,
|
|
471
471
|
className: h,
|
|
472
472
|
style: i
|
|
473
473
|
}) {
|
|
474
|
-
const w =
|
|
474
|
+
const w = j(
|
|
475
475
|
() => p ? gt(r) : r,
|
|
476
476
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
477
477
|
[r, p]
|
|
478
|
-
), [y,
|
|
478
|
+
), [y, c] = I(0), [b, T] = I(/* @__PURE__ */ new Set()), [u, U] = I(/* @__PURE__ */ new Map()), [N, z] = I(/* @__PURE__ */ new Set()), [x, C] = I(null), [n, o] = I(!1), g = w[y], S = g ? b.has(g.uid) : !1;
|
|
479
479
|
function f() {
|
|
480
480
|
var O;
|
|
481
481
|
if (!g || !x) return;
|
|
@@ -494,28 +494,28 @@ function Ft({
|
|
|
494
494
|
}
|
|
495
495
|
function v() {
|
|
496
496
|
if (y < w.length - 1)
|
|
497
|
-
|
|
497
|
+
c((k) => k + 1), C(null);
|
|
498
498
|
else {
|
|
499
499
|
const k = {
|
|
500
500
|
totalQuestions: w.length,
|
|
501
501
|
correctOnFirstAttempt: N.size,
|
|
502
502
|
totalAttempts: Array.from(u.values()).reduce((D, P) => D + P, 0)
|
|
503
503
|
};
|
|
504
|
-
o(!0),
|
|
504
|
+
o(!0), d == null || d(k);
|
|
505
505
|
}
|
|
506
506
|
}
|
|
507
|
-
const A =
|
|
507
|
+
const A = j(() => {
|
|
508
508
|
var P;
|
|
509
509
|
if (!g || !x) return !1;
|
|
510
510
|
const k = new Set(
|
|
511
|
-
((P = g.answers) == null ? void 0 : P.filter((
|
|
512
|
-
), D = new Set(x.map((
|
|
513
|
-
return k.size === D.size && [...k].every((
|
|
511
|
+
((P = g.answers) == null ? void 0 : P.filter(($) => $.isCorrect).map(($) => $.uid)) ?? []
|
|
512
|
+
), D = new Set(x.map(($) => $.uid));
|
|
513
|
+
return k.size === D.size && [...k].every(($) => D.has($));
|
|
514
514
|
}, [g, x]);
|
|
515
515
|
if (n) {
|
|
516
516
|
const k = w.length > 0 ? Math.round(N.size / w.length * 100) : 0;
|
|
517
517
|
return /* @__PURE__ */ e(L, { className: h, style: i, children: /* @__PURE__ */ t(Q, { className: "pt-6 text-center", children: [
|
|
518
|
-
/* @__PURE__ */ e(
|
|
518
|
+
/* @__PURE__ */ e(W, { size: 48, className: "text-success mx-auto mb-4" }),
|
|
519
519
|
/* @__PURE__ */ e("p", { className: "text-xl font-bold mb-1 text-foreground", children: "Practice Complete!" }),
|
|
520
520
|
/* @__PURE__ */ t("p", { className: "text-muted-foreground mb-2", children: [
|
|
521
521
|
N.size,
|
|
@@ -530,7 +530,7 @@ function Ft({
|
|
|
530
530
|
{
|
|
531
531
|
variant: "outline",
|
|
532
532
|
onClick: () => {
|
|
533
|
-
|
|
533
|
+
c(0), T(/* @__PURE__ */ new Set()), U(/* @__PURE__ */ new Map()), z(/* @__PURE__ */ new Set()), C(null), o(!1);
|
|
534
534
|
},
|
|
535
535
|
children: "Practice Again"
|
|
536
536
|
}
|
|
@@ -582,7 +582,7 @@ function Ft({
|
|
|
582
582
|
onRetry: a && !A ? m : void 0
|
|
583
583
|
}
|
|
584
584
|
),
|
|
585
|
-
/* @__PURE__ */ t("div", { className: "flex justify-end gap-
|
|
585
|
+
/* @__PURE__ */ t("div", { className: "flex justify-end gap-2 mt-2", children: [
|
|
586
586
|
!S && s && /* @__PURE__ */ e(
|
|
587
587
|
R,
|
|
588
588
|
{
|
|
@@ -607,14 +607,14 @@ function Lt({
|
|
|
607
607
|
questions: r,
|
|
608
608
|
initialAnswers: s = [],
|
|
609
609
|
onSubmit: a,
|
|
610
|
-
onAnswerChange:
|
|
610
|
+
onAnswerChange: d,
|
|
611
611
|
timeLimitSeconds: p,
|
|
612
612
|
timeElapsedSeconds: l,
|
|
613
613
|
autoSubmitOnTimeout: h = !0,
|
|
614
614
|
timeWarningThreshold: i = 300,
|
|
615
615
|
allowBackNavigation: w = !0,
|
|
616
616
|
confirmBeforeSubmit: y = !0,
|
|
617
|
-
examTitle:
|
|
617
|
+
examTitle: c,
|
|
618
618
|
instructions: b,
|
|
619
619
|
isSubmitting: T = !1,
|
|
620
620
|
readOnly: u = !1,
|
|
@@ -627,52 +627,52 @@ function Lt({
|
|
|
627
627
|
}, [D, i]), ie(() => {
|
|
628
628
|
h && D <= 0 && !A.current && (A.current = !0, re(!0));
|
|
629
629
|
}, [D, h]);
|
|
630
|
-
const P =
|
|
631
|
-
() => r.map((M,
|
|
630
|
+
const P = j(
|
|
631
|
+
() => r.map((M, E) => ({
|
|
632
632
|
uid: M.uid,
|
|
633
|
-
sequence:
|
|
633
|
+
sequence: E + 1,
|
|
634
634
|
isFlagged: o.has(M.uid),
|
|
635
|
-
isAnswered: C.some((
|
|
635
|
+
isAnswered: C.some((_) => _.uid === M.uid),
|
|
636
636
|
isSkipped: !1
|
|
637
637
|
})),
|
|
638
638
|
[r, C, o]
|
|
639
639
|
);
|
|
640
|
-
function
|
|
640
|
+
function $(M) {
|
|
641
641
|
if (!k) return;
|
|
642
|
-
const
|
|
643
|
-
uid:
|
|
642
|
+
const E = k.uid, _ = M.map((H) => ({
|
|
643
|
+
uid: E,
|
|
644
644
|
answerUid: H.uid,
|
|
645
645
|
content: H.content
|
|
646
646
|
}));
|
|
647
647
|
n((H) => {
|
|
648
|
-
const
|
|
649
|
-
return
|
|
648
|
+
const de = [...H.filter((Pe) => Pe.uid !== E), ..._];
|
|
649
|
+
return d == null || d(de), de;
|
|
650
650
|
});
|
|
651
651
|
}
|
|
652
652
|
function O(M) {
|
|
653
|
-
const
|
|
654
|
-
|
|
653
|
+
const E = r.findIndex((_) => _.uid === M);
|
|
654
|
+
E !== -1 && x(E);
|
|
655
655
|
}
|
|
656
656
|
function B(M) {
|
|
657
|
-
g((
|
|
658
|
-
const
|
|
659
|
-
return
|
|
657
|
+
g((E) => {
|
|
658
|
+
const _ = new Set(E);
|
|
659
|
+
return _.has(M) ? _.delete(M) : _.add(M), _;
|
|
660
660
|
});
|
|
661
661
|
}
|
|
662
662
|
function Re() {
|
|
663
663
|
y ? f(!0) : re(!1);
|
|
664
664
|
}
|
|
665
665
|
function re(M) {
|
|
666
|
-
const
|
|
666
|
+
const E = new Set(C.map((H) => H.uid)), _ = {
|
|
667
667
|
timeElapsedSeconds: l,
|
|
668
668
|
wasAutoSubmitted: M,
|
|
669
|
-
answeredCount: r.filter((H) =>
|
|
669
|
+
answeredCount: r.filter((H) => E.has(H.uid)).length,
|
|
670
670
|
totalQuestions: r.length
|
|
671
671
|
};
|
|
672
|
-
a(C,
|
|
672
|
+
a(C, _);
|
|
673
673
|
}
|
|
674
674
|
return /* @__PURE__ */ t("div", { className: F(U), style: N, children: [
|
|
675
|
-
|
|
675
|
+
c && /* @__PURE__ */ e("p", { className: "text-xl font-bold mb-2 text-foreground", children: c }),
|
|
676
676
|
m && D > 0 && D <= i && /* @__PURE__ */ e(ve, { variant: "warning", className: "mb-2", children: /* @__PURE__ */ t(we, { children: [
|
|
677
677
|
Math.ceil(D / 60),
|
|
678
678
|
" minute",
|
|
@@ -699,13 +699,13 @@ function Lt({
|
|
|
699
699
|
readOnly: u
|
|
700
700
|
}
|
|
701
701
|
),
|
|
702
|
-
b && z === 0 && /* @__PURE__ */ e(L, { className: "
|
|
702
|
+
b && z === 0 && /* @__PURE__ */ e(L, { className: "mt-3", children: /* @__PURE__ */ e(Q, { className: "pt-6", children: b }) }),
|
|
703
703
|
k && /* @__PURE__ */ e(L, { className: "mt-3", children: /* @__PURE__ */ e(Q, { className: "pt-6", children: /* @__PURE__ */ e(
|
|
704
704
|
X,
|
|
705
705
|
{
|
|
706
706
|
question: k,
|
|
707
707
|
sessionAnswers: C.filter((M) => M.uid === k.uid),
|
|
708
|
-
onAnswer:
|
|
708
|
+
onAnswer: $,
|
|
709
709
|
readOnly: u
|
|
710
710
|
}
|
|
711
711
|
) }) }),
|
|
@@ -731,18 +731,18 @@ function Mt({
|
|
|
731
731
|
title: r,
|
|
732
732
|
description: s,
|
|
733
733
|
questions: a,
|
|
734
|
-
initialAnswers:
|
|
734
|
+
initialAnswers: d = [],
|
|
735
735
|
onSubmit: p,
|
|
736
736
|
onAnswerChange: l,
|
|
737
737
|
showProgress: h = !0,
|
|
738
738
|
requireAll: i = !1,
|
|
739
739
|
submitLabel: w = "Submit Survey",
|
|
740
740
|
isSubmitting: y = !1,
|
|
741
|
-
readOnly:
|
|
741
|
+
readOnly: c = !1,
|
|
742
742
|
className: b,
|
|
743
743
|
style: T
|
|
744
744
|
}) {
|
|
745
|
-
const [u, U] = I(
|
|
745
|
+
const [u, U] = I(d), N = j(() => {
|
|
746
746
|
const n = new Set(u.map((o) => o.questionUid));
|
|
747
747
|
return a.filter((o) => n.has(o.uid)).length;
|
|
748
748
|
}, [a, u]), z = !i || N === a.length;
|
|
@@ -756,7 +756,7 @@ function Mt({
|
|
|
756
756
|
return u.find((o) => o.questionUid === n);
|
|
757
757
|
}
|
|
758
758
|
return /* @__PURE__ */ t("div", { className: b, style: T, children: [
|
|
759
|
-
/* @__PURE__ */ e("p", { className: "text-xl font-bold text-foreground mb-
|
|
759
|
+
/* @__PURE__ */ e("p", { className: "text-xl font-bold text-foreground mb-2", children: r }),
|
|
760
760
|
s && /* @__PURE__ */ e("div", { className: "mb-2 text-muted-foreground text-sm", children: typeof s == "string" ? /* @__PURE__ */ e("span", { children: s }) : s }),
|
|
761
761
|
h && /* @__PURE__ */ t("div", { className: "mb-3", children: [
|
|
762
762
|
/* @__PURE__ */ e(ne, { value: N / a.length * 100 }),
|
|
@@ -785,15 +785,15 @@ function Mt({
|
|
|
785
785
|
points: n.scalePoints,
|
|
786
786
|
lowLabel: (S = n.scaleLabels) == null ? void 0 : S.low,
|
|
787
787
|
highLabel: (f = n.scaleLabels) == null ? void 0 : f.high,
|
|
788
|
-
readOnly:
|
|
788
|
+
readOnly: c
|
|
789
789
|
}
|
|
790
790
|
),
|
|
791
791
|
n.type === "rating" && /* @__PURE__ */ e(
|
|
792
|
-
|
|
792
|
+
Je,
|
|
793
793
|
{
|
|
794
794
|
value: g ? Number(g.value) : 0,
|
|
795
795
|
onChange: (m) => x(n.uid, m),
|
|
796
|
-
readOnly:
|
|
796
|
+
readOnly: c
|
|
797
797
|
}
|
|
798
798
|
),
|
|
799
799
|
n.type === "open_text" && /* @__PURE__ */ e(
|
|
@@ -802,7 +802,7 @@ function Mt({
|
|
|
802
802
|
placeholder: "Type your response...",
|
|
803
803
|
value: (g == null ? void 0 : g.value) ?? "",
|
|
804
804
|
onChange: (m) => x(n.uid, m.target.value),
|
|
805
|
-
disabled:
|
|
805
|
+
disabled: c,
|
|
806
806
|
className: "min-h-24"
|
|
807
807
|
}
|
|
808
808
|
),
|
|
@@ -816,7 +816,7 @@ function Mt({
|
|
|
816
816
|
value: m.uid,
|
|
817
817
|
checked: (g == null ? void 0 : g.value) === m.uid,
|
|
818
818
|
onChange: () => x(n.uid, m.uid),
|
|
819
|
-
disabled:
|
|
819
|
+
disabled: c
|
|
820
820
|
}
|
|
821
821
|
),
|
|
822
822
|
/* @__PURE__ */ e("span", { children: m.content })
|
|
@@ -830,12 +830,12 @@ function Mt({
|
|
|
830
830
|
type: "checkbox",
|
|
831
831
|
className: "accent-primary m-0 shrink-0",
|
|
832
832
|
checked: v.includes(m.uid),
|
|
833
|
-
disabled:
|
|
833
|
+
disabled: c,
|
|
834
834
|
onChange: (A) => {
|
|
835
835
|
const k = u.filter((P) => P.questionUid === n.uid);
|
|
836
836
|
let D;
|
|
837
837
|
A.target.checked ? D = [...k, { questionUid: n.uid, value: m.uid }] : D = k.filter((P) => String(P.value) !== m.uid), U((P) => [
|
|
838
|
-
...P.filter((
|
|
838
|
+
...P.filter(($) => $.questionUid !== n.uid),
|
|
839
839
|
...D
|
|
840
840
|
]), l == null || l([
|
|
841
841
|
...u.filter((P) => P.questionUid !== n.uid),
|
|
@@ -849,7 +849,7 @@ function Mt({
|
|
|
849
849
|
}) })
|
|
850
850
|
] }) }, n.uid);
|
|
851
851
|
}),
|
|
852
|
-
/* @__PURE__ */ t("div", { className: "flex justify-between items-center mt-
|
|
852
|
+
/* @__PURE__ */ t("div", { className: "flex justify-between items-center mt-3", children: [
|
|
853
853
|
/* @__PURE__ */ t("span", { className: "text-sm text-muted-foreground", children: [
|
|
854
854
|
N,
|
|
855
855
|
" of ",
|
|
@@ -860,7 +860,7 @@ function Mt({
|
|
|
860
860
|
R,
|
|
861
861
|
{
|
|
862
862
|
onClick: () => p(u),
|
|
863
|
-
disabled: !z || y ||
|
|
863
|
+
disabled: !z || y || c,
|
|
864
864
|
children: y ? "Submitting..." : w
|
|
865
865
|
}
|
|
866
866
|
)
|
|
@@ -871,23 +871,23 @@ function Rt({
|
|
|
871
871
|
title: r,
|
|
872
872
|
blocks: s,
|
|
873
873
|
isCompleted: a = !1,
|
|
874
|
-
onMarkComplete:
|
|
874
|
+
onMarkComplete: d,
|
|
875
875
|
onNextLesson: p,
|
|
876
876
|
nextLessonTitle: l,
|
|
877
877
|
estimatedDuration: h,
|
|
878
878
|
showDuration: i = !0,
|
|
879
879
|
readOnly: w = !1,
|
|
880
880
|
className: y,
|
|
881
|
-
style:
|
|
881
|
+
style: c
|
|
882
882
|
}) {
|
|
883
883
|
const [b, T] = I(a), [, u] = I(/* @__PURE__ */ new Map());
|
|
884
884
|
function U(z, x) {
|
|
885
885
|
u((C) => new Map(C).set(z, x));
|
|
886
886
|
}
|
|
887
887
|
function N() {
|
|
888
|
-
T(!0),
|
|
888
|
+
T(!0), d == null || d();
|
|
889
889
|
}
|
|
890
|
-
return /* @__PURE__ */ t("div", { className: F(y), style:
|
|
890
|
+
return /* @__PURE__ */ t("div", { className: F(y), style: c, children: [
|
|
891
891
|
/* @__PURE__ */ t("div", { className: "mb-3", children: [
|
|
892
892
|
/* @__PURE__ */ e("p", { className: "text-2xl font-bold mb-0.5 text-foreground", children: r }),
|
|
893
893
|
i && h != null && /* @__PURE__ */ t("div", { className: "flex items-center gap-0.5 text-muted-foreground", children: [
|
|
@@ -897,7 +897,7 @@ function Rt({
|
|
|
897
897
|
] }),
|
|
898
898
|
/* @__PURE__ */ e(V, { className: "mb-3" }),
|
|
899
899
|
/* @__PURE__ */ e("div", { className: "flex flex-col gap-3", children: s.map((z, x) => /* @__PURE__ */ e(
|
|
900
|
-
|
|
900
|
+
Ke,
|
|
901
901
|
{
|
|
902
902
|
block: z,
|
|
903
903
|
onQuestionAnswer: U,
|
|
@@ -951,16 +951,16 @@ function Pt({
|
|
|
951
951
|
resources: r,
|
|
952
952
|
categories: s,
|
|
953
953
|
onResourceClick: a,
|
|
954
|
-
onDownload:
|
|
954
|
+
onDownload: d,
|
|
955
955
|
viewMode: p = "list",
|
|
956
956
|
allowViewToggle: l = !0,
|
|
957
957
|
showSearch: h = !0,
|
|
958
958
|
emptyMessage: i = "No resources found",
|
|
959
959
|
readOnly: w = !1,
|
|
960
960
|
className: y,
|
|
961
|
-
style:
|
|
961
|
+
style: c
|
|
962
962
|
}) {
|
|
963
|
-
const [b, T] = I(""), [u, U] = I(null), [N, z] = I(p), x =
|
|
963
|
+
const [b, T] = I(""), [u, U] = I(null), [N, z] = I(p), x = j(() => {
|
|
964
964
|
let n = r;
|
|
965
965
|
if (u && (n = n.filter((o) => o.categoryUid === u)), b.trim()) {
|
|
966
966
|
const o = b.toLowerCase();
|
|
@@ -993,35 +993,30 @@ function Pt({
|
|
|
993
993
|
n.fileSize != null && pe(n.fileSize)
|
|
994
994
|
].filter(Boolean).join(" · ") })
|
|
995
995
|
] }),
|
|
996
|
-
|
|
997
|
-
/* @__PURE__ */ e(
|
|
998
|
-
|
|
996
|
+
d && /* @__PURE__ */ t(J, { children: [
|
|
997
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ e(
|
|
998
|
+
R,
|
|
999
999
|
{
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
g.stopPropagation(), c(n);
|
|
1008
|
-
},
|
|
1009
|
-
children: /* @__PURE__ */ e(Te, { size: 16 })
|
|
1010
|
-
}
|
|
1011
|
-
)
|
|
1000
|
+
variant: "ghost",
|
|
1001
|
+
size: "icon-xs",
|
|
1002
|
+
"aria-label": "Download",
|
|
1003
|
+
onClick: (g) => {
|
|
1004
|
+
g.stopPropagation(), d(n);
|
|
1005
|
+
},
|
|
1006
|
+
children: /* @__PURE__ */ e(Te, { size: 16 })
|
|
1012
1007
|
}
|
|
1013
|
-
),
|
|
1014
|
-
/* @__PURE__ */ e(
|
|
1008
|
+
) }),
|
|
1009
|
+
/* @__PURE__ */ e(Z, { children: "Download" })
|
|
1015
1010
|
] })
|
|
1016
1011
|
]
|
|
1017
1012
|
},
|
|
1018
1013
|
n.uid
|
|
1019
1014
|
);
|
|
1020
1015
|
}
|
|
1021
|
-
return /* @__PURE__ */ t("div", { className: y, style:
|
|
1016
|
+
return /* @__PURE__ */ t("div", { className: y, style: c, children: [
|
|
1022
1017
|
/* @__PURE__ */ t("div", { className: "flex gap-2 items-center mb-2", children: [
|
|
1023
1018
|
h && /* @__PURE__ */ e("div", { className: "flex-1 max-w-80", children: /* @__PURE__ */ e(
|
|
1024
|
-
|
|
1019
|
+
Ze,
|
|
1025
1020
|
{
|
|
1026
1021
|
value: b,
|
|
1027
1022
|
onChange: T,
|
|
@@ -1030,43 +1025,33 @@ function Pt({
|
|
|
1030
1025
|
}
|
|
1031
1026
|
) }),
|
|
1032
1027
|
l && /* @__PURE__ */ t("div", { className: "flex gap-0.5", children: [
|
|
1033
|
-
/* @__PURE__ */ t(
|
|
1034
|
-
/* @__PURE__ */ e(
|
|
1035
|
-
|
|
1028
|
+
/* @__PURE__ */ t(J, { children: [
|
|
1029
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ e(
|
|
1030
|
+
R,
|
|
1036
1031
|
{
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
className: F(N === "list" && "text-primary"),
|
|
1044
|
-
onClick: () => z("list"),
|
|
1045
|
-
children: /* @__PURE__ */ e(rt, { size: 18 })
|
|
1046
|
-
}
|
|
1047
|
-
)
|
|
1032
|
+
variant: "ghost",
|
|
1033
|
+
size: "icon-xs",
|
|
1034
|
+
"aria-label": "List view",
|
|
1035
|
+
className: F(N === "list" && "text-primary"),
|
|
1036
|
+
onClick: () => z("list"),
|
|
1037
|
+
children: /* @__PURE__ */ e(rt, { size: 18 })
|
|
1048
1038
|
}
|
|
1049
|
-
),
|
|
1050
|
-
/* @__PURE__ */ e(
|
|
1039
|
+
) }),
|
|
1040
|
+
/* @__PURE__ */ e(Z, { children: "List view" })
|
|
1051
1041
|
] }),
|
|
1052
|
-
/* @__PURE__ */ t(
|
|
1053
|
-
/* @__PURE__ */ e(
|
|
1054
|
-
|
|
1042
|
+
/* @__PURE__ */ t(J, { children: [
|
|
1043
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ e(
|
|
1044
|
+
R,
|
|
1055
1045
|
{
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
className: F(N === "grid" && "text-primary"),
|
|
1063
|
-
onClick: () => z("grid"),
|
|
1064
|
-
children: /* @__PURE__ */ e(st, { size: 18 })
|
|
1065
|
-
}
|
|
1066
|
-
)
|
|
1046
|
+
variant: "ghost",
|
|
1047
|
+
size: "icon-xs",
|
|
1048
|
+
"aria-label": "Grid view",
|
|
1049
|
+
className: F(N === "grid" && "text-primary"),
|
|
1050
|
+
onClick: () => z("grid"),
|
|
1051
|
+
children: /* @__PURE__ */ e(st, { size: 18 })
|
|
1067
1052
|
}
|
|
1068
|
-
),
|
|
1069
|
-
/* @__PURE__ */ e(
|
|
1053
|
+
) }),
|
|
1054
|
+
/* @__PURE__ */ e(Z, { children: "Grid view" })
|
|
1070
1055
|
] })
|
|
1071
1056
|
] })
|
|
1072
1057
|
] }),
|
|
@@ -1077,8 +1062,8 @@ function Pt({
|
|
|
1077
1062
|
onValueChange: (n) => U(n === "all" ? null : n),
|
|
1078
1063
|
className: "mb-2",
|
|
1079
1064
|
children: /* @__PURE__ */ t(ke, { children: [
|
|
1080
|
-
/* @__PURE__ */ e(
|
|
1081
|
-
s.map((n) => /* @__PURE__ */ e(
|
|
1065
|
+
/* @__PURE__ */ e(G, { value: "all", children: "All" }),
|
|
1066
|
+
s.map((n) => /* @__PURE__ */ e(G, { value: n.uid, children: n.label }, n.uid))
|
|
1082
1067
|
] })
|
|
1083
1068
|
}
|
|
1084
1069
|
),
|
|
@@ -1104,7 +1089,7 @@ function Pt({
|
|
|
1104
1089
|
] });
|
|
1105
1090
|
}
|
|
1106
1091
|
function bt(r) {
|
|
1107
|
-
const s = new Date(r),
|
|
1092
|
+
const s = new Date(r), d = (/* @__PURE__ */ new Date()).getTime() - s.getTime(), p = Math.floor(d / 6e4);
|
|
1108
1093
|
if (p < 1) return "Just now";
|
|
1109
1094
|
if (p < 60) return `${p}m ago`;
|
|
1110
1095
|
const l = Math.floor(p / 60);
|
|
@@ -1116,19 +1101,19 @@ function Qt({
|
|
|
1116
1101
|
announcements: r,
|
|
1117
1102
|
onMarkRead: s,
|
|
1118
1103
|
onSelect: a,
|
|
1119
|
-
showAvatars:
|
|
1104
|
+
showAvatars: d = !0,
|
|
1120
1105
|
previewLines: p = 3,
|
|
1121
1106
|
emptyMessage: l = "No announcements yet",
|
|
1122
1107
|
readOnly: h = !1,
|
|
1123
1108
|
className: i,
|
|
1124
1109
|
style: w
|
|
1125
1110
|
}) {
|
|
1126
|
-
const [y,
|
|
1111
|
+
const [y, c] = I(/* @__PURE__ */ new Set()), b = j(() => {
|
|
1127
1112
|
const u = r.filter((N) => N.isPinned), U = r.filter((N) => !N.isPinned);
|
|
1128
1113
|
return [...u, ...U];
|
|
1129
1114
|
}, [r]);
|
|
1130
1115
|
function T(u) {
|
|
1131
|
-
|
|
1116
|
+
c((N) => {
|
|
1132
1117
|
const z = new Set(N);
|
|
1133
1118
|
return z.has(u) ? z.delete(u) : z.add(u), z;
|
|
1134
1119
|
});
|
|
@@ -1147,8 +1132,8 @@ function Qt({
|
|
|
1147
1132
|
),
|
|
1148
1133
|
onClick: () => a && !h ? a(u) : T(u.uid),
|
|
1149
1134
|
children: /* @__PURE__ */ e(Q, { className: "pt-4 pb-4", children: /* @__PURE__ */ t("div", { className: "flex gap-1.5 items-start", children: [
|
|
1150
|
-
|
|
1151
|
-
|
|
1135
|
+
d && /* @__PURE__ */ e(
|
|
1136
|
+
Ge,
|
|
1152
1137
|
{
|
|
1153
1138
|
displayName: u.author.displayName,
|
|
1154
1139
|
avatarUrl: u.author.avatarUrl,
|
|
@@ -1207,18 +1192,18 @@ function Bt({
|
|
|
1207
1192
|
title: r,
|
|
1208
1193
|
rootPost: s,
|
|
1209
1194
|
replies: a,
|
|
1210
|
-
currentUser:
|
|
1195
|
+
currentUser: d,
|
|
1211
1196
|
onReply: p,
|
|
1212
1197
|
onToggleLike: l,
|
|
1213
1198
|
onMarkAnswer: h,
|
|
1214
1199
|
maxDepth: i = 3,
|
|
1215
1200
|
allowReplies: w = !0,
|
|
1216
1201
|
sortOrder: y = "oldest",
|
|
1217
|
-
readOnly:
|
|
1202
|
+
readOnly: c = !1,
|
|
1218
1203
|
className: b,
|
|
1219
1204
|
style: T
|
|
1220
1205
|
}) {
|
|
1221
|
-
const [u, U] = I(null), [N, z] = I(""), x =
|
|
1206
|
+
const [u, U] = I(null), [N, z] = I(""), x = j(() => {
|
|
1222
1207
|
const o = /* @__PURE__ */ new Map();
|
|
1223
1208
|
for (const g of a) {
|
|
1224
1209
|
const S = g.parentUid ?? s.uid, f = o.get(S) ?? [];
|
|
@@ -1233,70 +1218,55 @@ function Bt({
|
|
|
1233
1218
|
}
|
|
1234
1219
|
function n(o, g) {
|
|
1235
1220
|
const S = x.get(o.uid) ?? [], f = Math.min(g, i), m = /* @__PURE__ */ t("div", { className: "flex items-center gap-1", children: [
|
|
1236
|
-
l && !
|
|
1237
|
-
/* @__PURE__ */ e(
|
|
1238
|
-
|
|
1221
|
+
l && !c && /* @__PURE__ */ t(J, { children: [
|
|
1222
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ t(
|
|
1223
|
+
R,
|
|
1239
1224
|
{
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
/* @__PURE__ */ e(it, { size: 14, fill: o.isLikedByCurrentUser ? "currentColor" : "none" }),
|
|
1250
|
-
o.likeCount > 0 ? o.likeCount : "Like"
|
|
1251
|
-
]
|
|
1252
|
-
}
|
|
1253
|
-
)
|
|
1225
|
+
variant: "ghost",
|
|
1226
|
+
size: "sm",
|
|
1227
|
+
"aria-label": o.isLikedByCurrentUser ? "Unlike" : "Like",
|
|
1228
|
+
className: F(o.isLikedByCurrentUser && "text-destructive"),
|
|
1229
|
+
onClick: () => l(o.uid),
|
|
1230
|
+
children: [
|
|
1231
|
+
/* @__PURE__ */ e(it, { size: 14, fill: o.isLikedByCurrentUser ? "currentColor" : "none" }),
|
|
1232
|
+
o.likeCount > 0 ? o.likeCount : "Like"
|
|
1233
|
+
]
|
|
1254
1234
|
}
|
|
1255
|
-
),
|
|
1256
|
-
/* @__PURE__ */ e(
|
|
1235
|
+
) }),
|
|
1236
|
+
/* @__PURE__ */ e(Z, { children: o.isLikedByCurrentUser ? "Unlike" : "Like" })
|
|
1257
1237
|
] }),
|
|
1258
|
-
w && !
|
|
1259
|
-
/* @__PURE__ */ e(
|
|
1260
|
-
|
|
1238
|
+
w && !c && /* @__PURE__ */ t(J, { children: [
|
|
1239
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ t(
|
|
1240
|
+
R,
|
|
1261
1241
|
{
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
/* @__PURE__ */ e(dt, { size: 14 }),
|
|
1271
|
-
"Reply"
|
|
1272
|
-
]
|
|
1273
|
-
}
|
|
1274
|
-
)
|
|
1242
|
+
variant: "ghost",
|
|
1243
|
+
size: "sm",
|
|
1244
|
+
"aria-label": "Reply",
|
|
1245
|
+
onClick: () => U(o.uid),
|
|
1246
|
+
children: [
|
|
1247
|
+
/* @__PURE__ */ e(ct, { size: 14 }),
|
|
1248
|
+
"Reply"
|
|
1249
|
+
]
|
|
1275
1250
|
}
|
|
1276
|
-
),
|
|
1277
|
-
/* @__PURE__ */ e(
|
|
1251
|
+
) }),
|
|
1252
|
+
/* @__PURE__ */ e(Z, { children: "Reply" })
|
|
1278
1253
|
] }),
|
|
1279
|
-
h && !
|
|
1280
|
-
/* @__PURE__ */ e(
|
|
1281
|
-
|
|
1254
|
+
h && !c && d.role !== "student" && !o.isAnswer && /* @__PURE__ */ t(J, { children: [
|
|
1255
|
+
/* @__PURE__ */ e(K, { children: /* @__PURE__ */ t(
|
|
1256
|
+
R,
|
|
1282
1257
|
{
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
/* @__PURE__ */ e(G, { size: 14 }),
|
|
1293
|
-
"Mark Answer"
|
|
1294
|
-
]
|
|
1295
|
-
}
|
|
1296
|
-
)
|
|
1258
|
+
variant: "ghost",
|
|
1259
|
+
size: "sm",
|
|
1260
|
+
"aria-label": "Mark as answer",
|
|
1261
|
+
className: "text-success",
|
|
1262
|
+
onClick: () => h(o.uid),
|
|
1263
|
+
children: [
|
|
1264
|
+
/* @__PURE__ */ e(W, { size: 14 }),
|
|
1265
|
+
"Mark Answer"
|
|
1266
|
+
]
|
|
1297
1267
|
}
|
|
1298
|
-
),
|
|
1299
|
-
/* @__PURE__ */ e(
|
|
1268
|
+
) }),
|
|
1269
|
+
/* @__PURE__ */ e(Z, { children: "Mark as answer" })
|
|
1300
1270
|
] })
|
|
1301
1271
|
] });
|
|
1302
1272
|
return /* @__PURE__ */ t("div", { children: [
|
|
@@ -1310,25 +1280,25 @@ function Bt({
|
|
|
1310
1280
|
actions: m,
|
|
1311
1281
|
highlight: o.isAnswer ? "answer" : "none",
|
|
1312
1282
|
indentLevel: f,
|
|
1313
|
-
className: "mb-
|
|
1283
|
+
className: "mb-2"
|
|
1314
1284
|
}
|
|
1315
1285
|
),
|
|
1316
1286
|
u === o.uid && /* @__PURE__ */ e(
|
|
1317
1287
|
L,
|
|
1318
1288
|
{
|
|
1319
|
-
className: "mb-
|
|
1289
|
+
className: "mb-2",
|
|
1320
1290
|
style: { marginLeft: `${(f + 1) * 16}px` },
|
|
1321
1291
|
children: /* @__PURE__ */ t(Q, { className: "pt-4 pb-4", children: [
|
|
1322
1292
|
/* @__PURE__ */ e(
|
|
1323
1293
|
te,
|
|
1324
1294
|
{
|
|
1325
|
-
className: "min-h-15 mb-
|
|
1295
|
+
className: "min-h-15 mb-2",
|
|
1326
1296
|
placeholder: "Write a reply...",
|
|
1327
1297
|
value: N,
|
|
1328
1298
|
onChange: (v) => z(v.target.value)
|
|
1329
1299
|
}
|
|
1330
1300
|
),
|
|
1331
|
-
/* @__PURE__ */ t("div", { className: "flex items-center gap-
|
|
1301
|
+
/* @__PURE__ */ t("div", { className: "flex items-center gap-2", children: [
|
|
1332
1302
|
/* @__PURE__ */ e(
|
|
1333
1303
|
R,
|
|
1334
1304
|
{
|
|
@@ -1370,18 +1340,18 @@ function Bt({
|
|
|
1370
1340
|
n(s, 0)
|
|
1371
1341
|
] });
|
|
1372
1342
|
}
|
|
1373
|
-
function
|
|
1343
|
+
function jt({
|
|
1374
1344
|
title: r,
|
|
1375
1345
|
instructions: s,
|
|
1376
1346
|
dueDate: a,
|
|
1377
|
-
maxScore:
|
|
1347
|
+
maxScore: d,
|
|
1378
1348
|
status: p,
|
|
1379
1349
|
submissionTypes: l,
|
|
1380
1350
|
existingSubmission: h,
|
|
1381
1351
|
fileConstraints: i,
|
|
1382
1352
|
onSubmit: w,
|
|
1383
1353
|
onSaveDraft: y,
|
|
1384
|
-
grade:
|
|
1354
|
+
grade: c,
|
|
1385
1355
|
isSubmitting: b = !1,
|
|
1386
1356
|
readOnly: T = !1,
|
|
1387
1357
|
className: u,
|
|
@@ -1401,8 +1371,8 @@ function $t({
|
|
|
1401
1371
|
/* @__PURE__ */ t("div", { className: "flex items-center gap-2", children: [
|
|
1402
1372
|
/* @__PURE__ */ e(Ce, { status: p }),
|
|
1403
1373
|
a && /* @__PURE__ */ e(Ue, { dueDate: a, size: "small" }),
|
|
1404
|
-
|
|
1405
|
-
|
|
1374
|
+
d != null && /* @__PURE__ */ t("span", { className: "text-sm text-muted-foreground", children: [
|
|
1375
|
+
d,
|
|
1406
1376
|
" points"
|
|
1407
1377
|
] })
|
|
1408
1378
|
] })
|
|
@@ -1411,20 +1381,20 @@ function $t({
|
|
|
1411
1381
|
/* @__PURE__ */ e("div", { className: "font-semibold text-sm text-foreground mb-1", children: "Instructions" }),
|
|
1412
1382
|
/* @__PURE__ */ e("div", { className: "text-muted-foreground text-sm", children: typeof s == "string" ? /* @__PURE__ */ e("span", { children: s }) : s })
|
|
1413
1383
|
] }) }),
|
|
1414
|
-
|
|
1384
|
+
c && /* @__PURE__ */ e(ve, { variant: "success", className: "mb-3", children: /* @__PURE__ */ t(we, { children: [
|
|
1415
1385
|
/* @__PURE__ */ t("div", { className: "font-semibold text-sm mb-1", children: [
|
|
1416
1386
|
"Grade: ",
|
|
1417
|
-
|
|
1418
|
-
|
|
1387
|
+
c.score,
|
|
1388
|
+
d != null ? ` / ${d}` : ""
|
|
1419
1389
|
] }),
|
|
1420
|
-
|
|
1390
|
+
c.feedback && /* @__PURE__ */ e("div", { children: c.feedback })
|
|
1421
1391
|
] }) }),
|
|
1422
1392
|
f && /* @__PURE__ */ t(ee, { children: [
|
|
1423
1393
|
l.length > 1 ? /* @__PURE__ */ t(Se, { value: g, onValueChange: (v) => S(v), children: [
|
|
1424
1394
|
/* @__PURE__ */ t(ke, { children: [
|
|
1425
|
-
l.includes("text") && /* @__PURE__ */ e(
|
|
1426
|
-
l.includes("file") && /* @__PURE__ */ e(
|
|
1427
|
-
l.includes("url") && /* @__PURE__ */ e(
|
|
1395
|
+
l.includes("text") && /* @__PURE__ */ e(G, { value: "text", children: "Text" }),
|
|
1396
|
+
l.includes("file") && /* @__PURE__ */ e(G, { value: "file", children: "File Upload" }),
|
|
1397
|
+
l.includes("url") && /* @__PURE__ */ e(G, { value: "url", children: "URL" })
|
|
1428
1398
|
] }),
|
|
1429
1399
|
l.includes("text") && /* @__PURE__ */ e(se, { value: "text", children: /* @__PURE__ */ e(
|
|
1430
1400
|
te,
|
|
@@ -1486,7 +1456,7 @@ function $t({
|
|
|
1486
1456
|
)
|
|
1487
1457
|
] }),
|
|
1488
1458
|
/* @__PURE__ */ e(V, { className: "my-2" }),
|
|
1489
|
-
/* @__PURE__ */ t("div", { className: "flex gap-
|
|
1459
|
+
/* @__PURE__ */ t("div", { className: "flex gap-2 justify-end", children: [
|
|
1490
1460
|
y && /* @__PURE__ */ t(
|
|
1491
1461
|
R,
|
|
1492
1462
|
{
|
|
@@ -1494,7 +1464,7 @@ function $t({
|
|
|
1494
1464
|
onClick: () => y(m()),
|
|
1495
1465
|
disabled: b,
|
|
1496
1466
|
children: [
|
|
1497
|
-
/* @__PURE__ */ e(
|
|
1467
|
+
/* @__PURE__ */ e(dt, { size: 16 }),
|
|
1498
1468
|
"Save Draft"
|
|
1499
1469
|
]
|
|
1500
1470
|
}
|
|
@@ -1518,7 +1488,7 @@ function q({
|
|
|
1518
1488
|
label: r,
|
|
1519
1489
|
field: s,
|
|
1520
1490
|
sortField: a,
|
|
1521
|
-
sortDir:
|
|
1491
|
+
sortDir: d,
|
|
1522
1492
|
onSort: p,
|
|
1523
1493
|
textAlign: l
|
|
1524
1494
|
}) {
|
|
@@ -1533,27 +1503,27 @@ function q({
|
|
|
1533
1503
|
onClick: () => p(s),
|
|
1534
1504
|
children: /* @__PURE__ */ t("div", { className: F("flex items-center gap-1", l === "right" && "justify-end"), children: [
|
|
1535
1505
|
/* @__PURE__ */ e("span", { className: F(h ? "text-foreground" : "text-muted-foreground"), children: r }),
|
|
1536
|
-
h && (
|
|
1506
|
+
h && (d === "asc" ? /* @__PURE__ */ e(ot, { size: 14 }) : /* @__PURE__ */ e(ut, { size: 14 }))
|
|
1537
1507
|
] })
|
|
1538
1508
|
}
|
|
1539
1509
|
);
|
|
1540
1510
|
}
|
|
1541
|
-
function
|
|
1511
|
+
function $t({
|
|
1542
1512
|
items: r,
|
|
1543
1513
|
categories: s,
|
|
1544
1514
|
overallGrade: a,
|
|
1545
|
-
showWeights:
|
|
1515
|
+
showWeights: d = !0,
|
|
1546
1516
|
showCategoryTotals: p = !0,
|
|
1547
1517
|
onItemClick: l,
|
|
1548
1518
|
readOnly: h = !1,
|
|
1549
1519
|
className: i,
|
|
1550
1520
|
style: w
|
|
1551
1521
|
}) {
|
|
1552
|
-
const [y,
|
|
1522
|
+
const [y, c] = I("dueDate"), [b, T] = I("asc");
|
|
1553
1523
|
function u(x) {
|
|
1554
|
-
y === x ? T((C) => C === "asc" ? "desc" : "asc") : (
|
|
1524
|
+
y === x ? T((C) => C === "asc" ? "desc" : "asc") : (c(x), T("asc"));
|
|
1555
1525
|
}
|
|
1556
|
-
const U =
|
|
1526
|
+
const U = j(() => {
|
|
1557
1527
|
const x = [...r];
|
|
1558
1528
|
return x.sort((C, n) => {
|
|
1559
1529
|
let o = 0;
|
|
@@ -1573,18 +1543,18 @@ function jt({
|
|
|
1573
1543
|
}
|
|
1574
1544
|
return b === "asc" ? o : -o;
|
|
1575
1545
|
}), x;
|
|
1576
|
-
}, [r, y, b]), N =
|
|
1546
|
+
}, [r, y, b]), N = j(() => {
|
|
1577
1547
|
if (!s || s.length === 0) return [{ category: null, items: U }];
|
|
1578
1548
|
const x = s.map((n) => ({
|
|
1579
1549
|
category: n,
|
|
1580
1550
|
items: U.filter((o) => o.categoryUid === n.uid)
|
|
1581
1551
|
})), C = U.filter((n) => !n.categoryUid);
|
|
1582
1552
|
return C.length > 0 && x.push({ category: null, items: C }), x;
|
|
1583
|
-
}, [U, s]), z =
|
|
1553
|
+
}, [U, s]), z = d ? 5 : 4;
|
|
1584
1554
|
return /* @__PURE__ */ t("div", { className: i, style: w, children: [
|
|
1585
1555
|
a && /* @__PURE__ */ e(L, { className: "mb-3", children: /* @__PURE__ */ e(Q, { className: "pt-6", children: /* @__PURE__ */ t("div", { className: "flex items-center gap-3", children: [
|
|
1586
1556
|
/* @__PURE__ */ e(
|
|
1587
|
-
|
|
1557
|
+
We,
|
|
1588
1558
|
{
|
|
1589
1559
|
percentage: a.percentage,
|
|
1590
1560
|
letterGrade: a.letterGrade,
|
|
@@ -1645,7 +1615,7 @@ function jt({
|
|
|
1645
1615
|
textAlign: "right"
|
|
1646
1616
|
}
|
|
1647
1617
|
),
|
|
1648
|
-
|
|
1618
|
+
d && /* @__PURE__ */ e(Ae, { className: "text-right text-muted-foreground", children: "Weight" })
|
|
1649
1619
|
] }) }),
|
|
1650
1620
|
/* @__PURE__ */ e(et, { children: N.map((x, C) => /* @__PURE__ */ t(Be, { children: [
|
|
1651
1621
|
x.category && p && /* @__PURE__ */ e(le, { className: "bg-muted hover:bg-muted", children: /* @__PURE__ */ e(Y, { colSpan: z, children: /* @__PURE__ */ t("span", { className: "font-semibold text-sm text-foreground", children: [
|
|
@@ -1673,7 +1643,7 @@ function jt({
|
|
|
1673
1643
|
" / ",
|
|
1674
1644
|
n.maxScore
|
|
1675
1645
|
] }) : n.status === "excused" ? /* @__PURE__ */ e("span", { className: "text-sm text-muted-foreground", children: "Excused" }) : /* @__PURE__ */ e("span", { className: "text-sm text-muted-foreground", children: "—" }) }),
|
|
1676
|
-
|
|
1646
|
+
d && /* @__PURE__ */ e(Y, { className: "text-right", children: n.weight != null ? `${n.weight}%` : "—" })
|
|
1677
1647
|
]
|
|
1678
1648
|
},
|
|
1679
1649
|
n.uid
|
|
@@ -1684,15 +1654,15 @@ function jt({
|
|
|
1684
1654
|
}
|
|
1685
1655
|
const Nt = {
|
|
1686
1656
|
lesson_completed: Fe,
|
|
1687
|
-
quiz_passed:
|
|
1657
|
+
quiz_passed: W,
|
|
1688
1658
|
assignment_submitted: Ie,
|
|
1689
1659
|
badge_earned: Le
|
|
1690
1660
|
};
|
|
1691
|
-
function
|
|
1661
|
+
function _t({
|
|
1692
1662
|
overallProgress: r,
|
|
1693
1663
|
totalTimeSpent: s,
|
|
1694
1664
|
modules: a,
|
|
1695
|
-
recentActivity:
|
|
1665
|
+
recentActivity: d,
|
|
1696
1666
|
streak: p,
|
|
1697
1667
|
achievements: l,
|
|
1698
1668
|
recentActivityLimit: h = 5,
|
|
@@ -1725,14 +1695,14 @@ function Et({
|
|
|
1725
1695
|
{
|
|
1726
1696
|
icon: /* @__PURE__ */ e(Fe, { size: 24 }),
|
|
1727
1697
|
label: "Modules",
|
|
1728
|
-
value: `${a.filter((
|
|
1698
|
+
value: `${a.filter((c) => c.completedItems === c.totalItems).length} / ${a.length}`,
|
|
1729
1699
|
subtitle: "completed"
|
|
1730
1700
|
}
|
|
1731
1701
|
)
|
|
1732
1702
|
] }),
|
|
1733
1703
|
/* @__PURE__ */ e("p", { className: "text-lg font-semibold mb-2 text-foreground", children: "Module Progress" }),
|
|
1734
|
-
/* @__PURE__ */ e("div", { className: "flex flex-col gap-
|
|
1735
|
-
const b =
|
|
1704
|
+
/* @__PURE__ */ e("div", { className: "flex flex-col gap-2 mb-3", children: a.map((c) => {
|
|
1705
|
+
const b = c.totalItems > 0 ? c.completedItems / c.totalItems * 100 : 0;
|
|
1736
1706
|
return /* @__PURE__ */ t(
|
|
1737
1707
|
L,
|
|
1738
1708
|
{
|
|
@@ -1740,47 +1710,47 @@ function Et({
|
|
|
1740
1710
|
"p-2 transition-colors",
|
|
1741
1711
|
i && "cursor-pointer hover:border-primary"
|
|
1742
1712
|
),
|
|
1743
|
-
onClick: () => i == null ? void 0 : i(
|
|
1713
|
+
onClick: () => i == null ? void 0 : i(c.uid),
|
|
1744
1714
|
children: [
|
|
1745
1715
|
/* @__PURE__ */ t("div", { className: "flex justify-between items-center mb-0.5", children: [
|
|
1746
|
-
/* @__PURE__ */ e("span", { className: "font-semibold text-sm text-foreground", children:
|
|
1716
|
+
/* @__PURE__ */ e("span", { className: "font-semibold text-sm text-foreground", children: c.name }),
|
|
1747
1717
|
/* @__PURE__ */ t("span", { className: "text-xs text-muted-foreground", children: [
|
|
1748
|
-
|
|
1718
|
+
c.completedItems,
|
|
1749
1719
|
" / ",
|
|
1750
|
-
|
|
1720
|
+
c.totalItems
|
|
1751
1721
|
] })
|
|
1752
1722
|
] }),
|
|
1753
1723
|
/* @__PURE__ */ e(ne, { value: b, size: "sm" })
|
|
1754
1724
|
]
|
|
1755
1725
|
},
|
|
1756
|
-
|
|
1726
|
+
c.uid
|
|
1757
1727
|
);
|
|
1758
1728
|
}) }),
|
|
1759
|
-
|
|
1729
|
+
d && d.length > 0 && /* @__PURE__ */ t(ee, { children: [
|
|
1760
1730
|
/* @__PURE__ */ e("p", { className: "text-lg font-semibold mb-2 text-foreground", children: "Recent Activity" }),
|
|
1761
|
-
/* @__PURE__ */ e("div", { className: "flex flex-col gap-1 mb-3", children:
|
|
1762
|
-
const b = Nt[
|
|
1731
|
+
/* @__PURE__ */ e("div", { className: "flex flex-col gap-1.5 mb-3", children: d.slice(0, h).map((c) => {
|
|
1732
|
+
const b = Nt[c.type] ?? W;
|
|
1763
1733
|
return /* @__PURE__ */ t("div", { className: "flex gap-1.5 items-center", children: [
|
|
1764
1734
|
/* @__PURE__ */ e(b, { size: 16 }),
|
|
1765
|
-
/* @__PURE__ */ e("span", { className: "flex-1 text-sm text-foreground", children:
|
|
1766
|
-
/* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground", children: new Date(
|
|
1767
|
-
] },
|
|
1735
|
+
/* @__PURE__ */ e("span", { className: "flex-1 text-sm text-foreground", children: c.description }),
|
|
1736
|
+
/* @__PURE__ */ e("span", { className: "text-xs text-muted-foreground", children: new Date(c.timestamp).toLocaleDateString() })
|
|
1737
|
+
] }, c.uid);
|
|
1768
1738
|
}) })
|
|
1769
1739
|
] }),
|
|
1770
1740
|
l && l.length > 0 && /* @__PURE__ */ t(ee, { children: [
|
|
1771
1741
|
/* @__PURE__ */ e("p", { className: "text-lg font-semibold mb-2 text-foreground", children: "Achievements" }),
|
|
1772
|
-
/* @__PURE__ */ e("div", { className: "grid grid-cols-[repeat(auto-fill,minmax(140px,1fr))] gap-2", children: l.map((
|
|
1773
|
-
|
|
1742
|
+
/* @__PURE__ */ e("div", { className: "grid grid-cols-[repeat(auto-fill,minmax(140px,1fr))] gap-2", children: l.map((c) => /* @__PURE__ */ t(L, { className: "p-2 text-center", children: [
|
|
1743
|
+
c.iconUrl ? /* @__PURE__ */ e(
|
|
1774
1744
|
"img",
|
|
1775
1745
|
{
|
|
1776
|
-
src:
|
|
1777
|
-
alt:
|
|
1746
|
+
src: c.iconUrl,
|
|
1747
|
+
alt: c.name,
|
|
1778
1748
|
className: "w-12 h-12 mb-1 mx-auto"
|
|
1779
1749
|
}
|
|
1780
1750
|
) : /* @__PURE__ */ e(ht, { size: 32, className: "mx-auto mb-2 text-warning" }),
|
|
1781
|
-
/* @__PURE__ */ e("p", { className: "font-semibold text-sm text-foreground", children:
|
|
1782
|
-
/* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground", children:
|
|
1783
|
-
] },
|
|
1751
|
+
/* @__PURE__ */ e("p", { className: "font-semibold text-sm text-foreground", children: c.name }),
|
|
1752
|
+
/* @__PURE__ */ e("p", { className: "text-xs text-muted-foreground", children: c.description })
|
|
1753
|
+
] }, c.uid)) })
|
|
1784
1754
|
] })
|
|
1785
1755
|
] });
|
|
1786
1756
|
}
|
|
@@ -1789,18 +1759,18 @@ const vt = {
|
|
|
1789
1759
|
modern: "border border-primary bg-linear-to-br from-[#fff5f5] to-[#fee2e2]",
|
|
1790
1760
|
minimal: "border border-border"
|
|
1791
1761
|
};
|
|
1792
|
-
function
|
|
1762
|
+
function Et({
|
|
1793
1763
|
recipientName: r,
|
|
1794
1764
|
courseTitle: s,
|
|
1795
1765
|
completionDate: a,
|
|
1796
|
-
organizationName:
|
|
1766
|
+
organizationName: d,
|
|
1797
1767
|
organizationLogo: p,
|
|
1798
1768
|
signatory: l,
|
|
1799
1769
|
certificateId: h,
|
|
1800
1770
|
variant: i = "classic",
|
|
1801
1771
|
showActions: w = !0,
|
|
1802
1772
|
onPrint: y,
|
|
1803
|
-
onDownload:
|
|
1773
|
+
onDownload: c,
|
|
1804
1774
|
className: b,
|
|
1805
1775
|
style: T
|
|
1806
1776
|
}) {
|
|
@@ -1831,7 +1801,7 @@ function _t({
|
|
|
1831
1801
|
"img",
|
|
1832
1802
|
{
|
|
1833
1803
|
src: p,
|
|
1834
|
-
alt:
|
|
1804
|
+
alt: d,
|
|
1835
1805
|
className: "h-15 mb-2 mx-auto block"
|
|
1836
1806
|
}
|
|
1837
1807
|
) : /* @__PURE__ */ e(
|
|
@@ -1849,7 +1819,7 @@ function _t({
|
|
|
1849
1819
|
/* @__PURE__ */ e("p", { className: "text-xl font-bold mb-2 text-primary", children: s }),
|
|
1850
1820
|
/* @__PURE__ */ t("p", { className: "text-sm text-foreground mb-3", children: [
|
|
1851
1821
|
"Issued by ",
|
|
1852
|
-
|
|
1822
|
+
d,
|
|
1853
1823
|
" on ",
|
|
1854
1824
|
u
|
|
1855
1825
|
] }),
|
|
@@ -1870,7 +1840,7 @@ function _t({
|
|
|
1870
1840
|
/* @__PURE__ */ e(ft, { size: 16 }),
|
|
1871
1841
|
" Print"
|
|
1872
1842
|
] }),
|
|
1873
|
-
|
|
1843
|
+
c && /* @__PURE__ */ t(R, { variant: "outline", onClick: c, children: [
|
|
1874
1844
|
/* @__PURE__ */ e(Te, { size: 16 }),
|
|
1875
1845
|
" Download"
|
|
1876
1846
|
] })
|
|
@@ -1880,17 +1850,17 @@ function _t({
|
|
|
1880
1850
|
export {
|
|
1881
1851
|
Qt as AnnouncementFeed,
|
|
1882
1852
|
Dt as AssessmentReview,
|
|
1883
|
-
|
|
1884
|
-
|
|
1853
|
+
jt as AssignmentSubmission,
|
|
1854
|
+
Et as CertificateViewer,
|
|
1885
1855
|
Tt as CourseOutline,
|
|
1886
1856
|
Bt as DiscussionThread,
|
|
1887
1857
|
Lt as ExamSession,
|
|
1888
1858
|
At as FlashcardStudySession,
|
|
1889
|
-
|
|
1859
|
+
$t as GradebookTable,
|
|
1890
1860
|
Ut as LecturePlayer,
|
|
1891
1861
|
Rt as LessonPage,
|
|
1892
1862
|
Ft as PracticeQuiz,
|
|
1893
|
-
|
|
1863
|
+
_t as ProgressDashboard,
|
|
1894
1864
|
Ct as QuizSession,
|
|
1895
1865
|
Pt as ResourceLibrary,
|
|
1896
1866
|
It as ScrollableQuiz,
|