From 594eb97caa645acb8b67cb7e10d6be1cd420d704 Mon Sep 17 00:00:00 2001 From: Nwosu Emmanuel Date: Sun, 28 Sep 2025 20:08:56 +0100 Subject: [PATCH] feat: AI grading bug (#420) * worked on the AI grading task * worked on the AI grading task * improved the ai grading function * improved the ai grading function * update types --------- Co-authored-by: Rotimi Best --- .../Lesson/Exercise/MarkExerciseModal.svelte | 98 +++++++++++++------ .../src/lib/utils/translations/de.json | 7 +- .../src/lib/utils/translations/en.json | 5 + .../src/lib/utils/translations/es.json | 7 +- .../src/lib/utils/translations/fr.json | 7 +- .../src/lib/utils/translations/hi.json | 7 +- .../src/lib/utils/translations/pt.json | 7 +- .../src/lib/utils/translations/ru.json | 7 +- .../src/lib/utils/translations/vi.json | 7 +- .../src/lib/utils/types/submission.ts | 3 +- 10 files changed, 119 insertions(+), 36 deletions(-) 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 442bd312..04a3a8be 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 @@ -93,6 +93,29 @@ } } + const getMultipleAnswersGrade = (options, answer, points) => { + const correctOptions = options + .filter((option) => option.is_correct) + .map((option) => option.value); + + const correctSelections = answer.answers.filter((answer) => + correctOptions.includes(answer) + ).length; + + const incorrectSelections = answer.answers.length - correctSelections; + + const pointsEarned = (correctSelections / correctOptions.length) * points; + const deduction = (incorrectSelections * points) / correctOptions.length; + const finalPoints = Math.max(pointsEarned - deduction, 0); + + return { + finalPoints, + correctOptions, + correctSelections, + incorrectSelections + }; + }; + async function handleDeleteSubmission() { isDeleting = true; await deleteSubmission(data.id, status.id); @@ -118,18 +141,37 @@ } data?.questions.forEach((question) => { - const { id, points, question_type_id } = question; - - if (question_type_id !== QUESTION_TYPE.TEXTAREA) { + const { id, points, question_type_id, options } = question; + if (question_type_id == QUESTION_TYPE.RADIO) { 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' + [id]: `${$t('course.navItem.submissions.grading_modal.allocated')} ${$t( + 'course.navItem.submissions.grading_modal.total_try' )} ${answerPoints} ` }; data.questionAnswerByPoint[id] = `${Math.ceil(points / answerPoints)}`; + } else if (question_type_id == QUESTION_TYPE.CHECKBOX) { + const answer = data.questionAnswers.find((q) => q.question_id === id); + + const { finalPoints, correctOptions, correctSelections, incorrectSelections } = + getMultipleAnswersGrade(options, answer, points); + + reasons = { + ...reasons, + [id]: `${$t( + 'course.navItem.submissions.grading_modal.allocated' + )} ${correctSelections} ${$t('course.navItem.submissions.grading_modal.out_of')} ${ + correctOptions.length + } ${$t('course.navItem.submissions.grading_modal.options_correct')} ${$t( + 'course.navItem.submissions.grading_modal.options_wrong' + )} ${incorrectSelections} ` + }; + + data.questionAnswerByPoint[id] = `${finalPoints}`; } else if (aiResponses.length) { const graded = aiResponses.find((res) => res.id === id); @@ -182,10 +224,10 @@ headerClass="py-2" labelClass="text-base font-semibold" > -
+
{#if openDeletePrompt} -
-

+
+

{$t('delete_modal.content')}

@@ -223,19 +265,19 @@ /> {/if}
-
-
+
+
-

+

{$t('course.navItem.submissions.grading_modal.details')} {#if data.isEarly} - + {$t('course.navItem.submissions.grading_modal.early')} {:else} - + {$t('course.navItem.submissions.grading_modal.late')} {/if} @@ -253,13 +295,13 @@

-
-

+

+

{$t('course.navItem.submissions.grading_modal.total_grade')}:

{total}/{maxPoints} @@ -271,20 +313,20 @@

Grading

--> -
-

+

+

{$t('course.navItem.submissions.grading_modal.student')}:

{#if data.student}
Student avatar -

+

{data.student.fullname}

@@ -298,8 +340,8 @@ >
--> -
-

+

+

{$t('course.navItem.submissions.grading_modal.status')}:

-
-

+

+

{$t('course.navItem.submissions.grading_modal.add_comment')}: