diff --git a/apps/dashboard/src/lib/components/Course/components/Lesson/DeleteLessonConfirmation.svelte b/apps/dashboard/src/lib/components/Course/components/Lesson/DeleteLessonConfirmation.svelte
index d2d0fdc1..5143784d 100644
--- a/apps/dashboard/src/lib/components/Course/components/Lesson/DeleteLessonConfirmation.svelte
+++ b/apps/dashboard/src/lib/components/Course/components/Lesson/DeleteLessonConfirmation.svelte
@@ -18,24 +18,24 @@
onClose={() => (openDeleteModal = false)}
bind:open={openDeleteModal}
width="w-96"
- modalHeading={$t('course.navItem.lessons.delete_lesson.modal_heading')}
+ modalHeading={$t('delete_modal.label')}
>
- {$t('course.navItem.lessons.delete_lesson.content')} {lessonTitle}?
+ {$t('delete_modal.content')} {lessonTitle}?
(openDeleteModal = false)}
/>
diff --git a/apps/dashboard/src/lib/components/Course/components/Lesson/Exercise/MarkExerciseModal.svelte b/apps/dashboard/src/lib/components/Course/components/Lesson/Exercise/MarkExerciseModal.svelte
index 25091be4..1db576d5 100644
--- a/apps/dashboard/src/lib/components/Course/components/Lesson/Exercise/MarkExerciseModal.svelte
+++ b/apps/dashboard/src/lib/components/Course/components/Lesson/Exercise/MarkExerciseModal.svelte
@@ -10,14 +10,21 @@
import { useCompletion } from 'ai/svelte';
import { QUESTION_TYPE } from '$lib/components/Question/constants';
import { t } from '$lib/utils/functions/translations';
+ import { OverflowMenu, OverflowMenuItem } from 'carbon-components-svelte';
+ import type { SubmissionIdData } from '$lib/utils/types/submission';
export let open = false;
export let onClose = () => {};
- export let handleSave = () => {};
+ export let handleSave = (d: SubmissionIdData) => {};
export let isGradeWithAI = false;
-
- export let data = {};
- export let updateStatus = () => {};
+ export let data: SubmissionIdData;
+ export let deleteSubmission = async (id: string, statusId: number) => {};
+ export let updateStatus = (arg: {
+ submissionId: string;
+ prevStatusId: number;
+ nextStatusId: number;
+ total: number;
+ }) => {};
const SELECTABLE_STATUS = [
{
@@ -40,6 +47,9 @@
let isLoading = false;
let total = 0;
let maxPoints = 0;
+ let openMenu = false;
+ let openDeletePrompt = false;
+ let isDeleting = false;
function getMaxPoints(questions) {
return (questions || []).reduce((acc, question) => acc + question.points, 0);
@@ -54,12 +64,13 @@
const newSelectedId = event.detail.selectedId;
setStatus({
- status_id: newSelectedId
+ ...data,
+ statusId: newSelectedId
});
updateStatus({
submissionId: data.id,
- prevStatusId: data.status_id,
+ prevStatusId: data.statusId,
nextStatusId: status.id,
total
});
@@ -67,8 +78,8 @@
snackbar.success(`${$t('snackbar.exercise.submission_updated')} '${status.text}'`);
}
- function setStatus(data) {
- const statusBySelectedId = SELECTABLE_STATUS.find((status) => status.id === data.status_id);
+ function setStatus(data: SubmissionIdData) {
+ const statusBySelectedId = SELECTABLE_STATUS.find((status) => status.id === data.statusId);
if (!statusBySelectedId) {
return;
@@ -76,18 +87,28 @@
status = statusBySelectedId;
- if (data.status_id !== selectedId) {
- selectedId = data.status_id;
+ if (data.statusId !== selectedId) {
+ selectedId = data.statusId;
}
}
+ async function handleDeleteSubmission() {
+ isDeleting = true;
+ await deleteSubmission(data.id, status.id);
+ isDeleting = false;
+ }
+
const { input, handleSubmit, completion } = useCompletion({
api: '/api/completion/gradingprompt',
onFinish: async () => {
try {
const responseData = $completion.replace('```json', '').replace('```', '');
- let aiResponses = [];
+ let aiResponses: {
+ id: number;
+ score: number;
+ explanation: string;
+ }[] = [];
try {
// Parse the modified response data as JSON
aiResponses = JSON.parse(responseData);
@@ -100,14 +121,14 @@
if (question_type_id !== QUESTION_TYPE.TEXTAREA) {
const answer = data.questionAnswers.find((q) => q.question_id === id);
-
+ const answerPoints = answer?.answers?.length ?? 0;
reasons = {
...reasons,
- [id]: `${$t('course.navItem.submissions.grading_modal.questions_tried')} ${
- answer.answers.length
- } `
+ [id]: `${$t(
+ 'course.navItem.submissions.grading_modal.questions_tried'
+ )} ${answerPoints} `
};
- data.questionAnswerByPoint[id] = points / answer.answers.length;
+ data.questionAnswerByPoint[id] = `${points / answerPoints}`;
} else if (aiResponses.length) {
const graded = aiResponses.find((res) => res.id === id);
@@ -116,7 +137,7 @@
[id]: `${graded?.explanation}`
};
- data.questionAnswerByPoint[id] = graded.score;
+ data.questionAnswerByPoint[id] = `${graded?.score}`;
}
});
} catch (error) {
@@ -160,26 +181,51 @@
headerClass="py-2"
labelClass="text-base font-semibold"
>
-
-
a.order - b.order)
- : []}
- questionnaireMetaData={{
- answers: data.answers || {},
- isFinished: true
- }}
- bind:grades={data.questionAnswerByPoint}
- bind:reasons
- bind:isGradeWithAI
- bind:isLoading
- disableGrading={false}
- />
+
+ {#if openDeletePrompt}
+
+
+ {$t('delete_modal.content')}
+
+
+
+
(openDeletePrompt = false)}
+ isDisabled={isDeleting}
+ />
+
+
+
+ {:else}
+
a.order - b.order)
+ : []}
+ questionnaireMetaData={{
+ answers: data.answers || {},
+ isFinished: true
+ }}
+ bind:grades={data.questionAnswerByPoint}
+ bind:reasons
+ bind:isGradeWithAI
+ bind:isLoading
+ disableGrading={false}
+ />
+ {/if}
-
+
{$t('course.navItem.submissions.grading_modal.details')}
@@ -193,6 +239,17 @@
{/if}
+
+
+ {
+ openDeletePrompt = true;
+ openMenu = false;
+ }}
+ danger
+ />
+
diff --git a/apps/dashboard/src/lib/components/Course/components/Lesson/LanguageLessonVersionHistory.svelte b/apps/dashboard/src/lib/components/Course/components/Lesson/LessonVersionHistory.svelte
similarity index 100%
rename from apps/dashboard/src/lib/components/Course/components/Lesson/LanguageLessonVersionHistory.svelte
rename to apps/dashboard/src/lib/components/Course/components/Lesson/LessonVersionHistory.svelte
diff --git a/apps/dashboard/src/lib/components/Course/function.js b/apps/dashboard/src/lib/components/Course/function.ts
similarity index 96%
rename from apps/dashboard/src/lib/components/Course/function.js
rename to apps/dashboard/src/lib/components/Course/function.ts
index e5b426d3..0d2c73d5 100644
--- a/apps/dashboard/src/lib/components/Course/function.js
+++ b/apps/dashboard/src/lib/components/Course/function.ts
@@ -35,7 +35,7 @@ export function getLectureNo(index, initNo = '0') {
}
export function formatAnswers(data) {
- const answers = {};
+ const answers: Record
= {};
const questionByIdAndName = {};
for (const question of data.questions) {
diff --git a/apps/dashboard/src/lib/components/Form/Date.svelte b/apps/dashboard/src/lib/components/Form/Date.svelte
index 2fe5d84f..db7ae89b 100644
--- a/apps/dashboard/src/lib/components/Form/Date.svelte
+++ b/apps/dashboard/src/lib/components/Form/Date.svelte
@@ -1,9 +1,9 @@
-