chore: simplify grading for self paced course (#326)
* updated the grading flow for self paced course * updated some logic and translations * fix bug with newsfeed not opening for students and fix more bugs * remove console * add blog template route * add doc page --------- Co-authored-by: Rotimi Best <[email protected]>
This commit is contained in:
@@ -0,0 +1 @@
|
||||
<slot />
|
||||
@@ -4,6 +4,8 @@
|
||||
import TextareaQuestion from '$lib/components/Question/TextareaQuestion/index.svelte';
|
||||
import { QUESTION_TYPE } from '$lib/components/Question/constants';
|
||||
import { getPropsForQuestion } from './functions';
|
||||
import { course } from '$lib/components/Course/store';
|
||||
import { COURSE_TYPE } from '$lib/utils/types';
|
||||
|
||||
export let questions = [];
|
||||
export let questionnaireMetaData = {};
|
||||
@@ -37,6 +39,7 @@
|
||||
handleGrade={handleGrade(currentQuestion.id)}
|
||||
{disableGrading}
|
||||
disabled={true}
|
||||
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
|
||||
/>
|
||||
{:else if QUESTION_TYPE.CHECKBOX === currentQuestion.question_type.id}
|
||||
<CheckboxQuestion
|
||||
@@ -57,6 +60,7 @@
|
||||
handleGrade={handleGrade(currentQuestion.id)}
|
||||
{disableGrading}
|
||||
disabled={true}
|
||||
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
|
||||
/>
|
||||
{:else if QUESTION_TYPE.TEXTAREA === currentQuestion.question_type.id}
|
||||
<TextareaQuestion
|
||||
@@ -77,6 +81,7 @@
|
||||
handleGrade={handleGrade(currentQuestion.id)}
|
||||
{disableGrading}
|
||||
disabled={true}
|
||||
hideGrading={$course.type === COURSE_TYPE.SELF_PACED}
|
||||
/>
|
||||
{/if}
|
||||
{/each}
|
||||
|
||||
+19
-114
@@ -17,11 +17,7 @@
|
||||
import { getPropsForQuestion, filterOutDeleted, wasCorrectAnswerSelected } from './functions';
|
||||
import { formatAnswers, getGroupMemberId } from '$lib/components/Course/function';
|
||||
import { submitExercise } from '$lib/utils/services/courses';
|
||||
import {
|
||||
fetchSubmission,
|
||||
updateQuestionAnswer,
|
||||
updateSubmission
|
||||
} from '$lib/utils/services/submissions';
|
||||
import { fetchSubmission } from '$lib/utils/services/submissions';
|
||||
import { profile } from '$lib/utils/store/user';
|
||||
import { currentOrg } from '$lib/utils/store/org';
|
||||
import {
|
||||
@@ -30,9 +26,8 @@
|
||||
} from '$lib/utils/services/notification/notification';
|
||||
import { lesson } from '../store/lessons';
|
||||
import { browser } from '$app/environment';
|
||||
import { useCompletion } from 'ai/svelte';
|
||||
import { COURSE_TYPE } from '$lib/utils/types';
|
||||
import GradingLoader from './GradingLoader.svelte';
|
||||
import { t } from '$lib/utils/functions/translations';
|
||||
|
||||
export let preview: boolean = false;
|
||||
export let exerciseId = '';
|
||||
@@ -44,10 +39,7 @@
|
||||
let hasSubmission = false;
|
||||
let isLoadingAutoSavedData = false;
|
||||
let alreadyCheckedAutoSavedData = false;
|
||||
let gradedComment = true;
|
||||
let isLoading = false;
|
||||
let submissionResponse;
|
||||
let submissionId;
|
||||
|
||||
function handleStart() {
|
||||
$questionnaireMetaData.currentQuestionIndex += 1;
|
||||
@@ -88,89 +80,7 @@
|
||||
});
|
||||
};
|
||||
|
||||
const { input, handleSubmit, completion } = useCompletion({
|
||||
api: '/api/completion/gradingprompt',
|
||||
onFinish: async () => {
|
||||
try {
|
||||
const responseData = $completion.replace('```json', '').replace('```', '');
|
||||
|
||||
let aiResponses = [];
|
||||
try {
|
||||
// Parse the modified response data as JSON
|
||||
aiResponses = JSON.parse(responseData);
|
||||
} catch (error) {
|
||||
console.error('Error parsing AI response', error);
|
||||
}
|
||||
|
||||
$questionnaire.questions.forEach((question) => {
|
||||
const { id, points, question_type_id } = question;
|
||||
let questionAnswer = submissionResponse?.res?.data.find(
|
||||
(answer) => answer.question_id === id
|
||||
);
|
||||
|
||||
console.log('this is the question answer', questionAnswer);
|
||||
if (question_type_id !== QUESTION_TYPE.TEXTAREA) {
|
||||
const answer = $questionnaireMetaData.answers[question.name];
|
||||
let score = points / answer.length;
|
||||
$questionnaireMetaData.grades = {
|
||||
...$questionnaireMetaData.grades,
|
||||
[id]: score
|
||||
};
|
||||
updateQuestionAnswer({ point: score }, { id: questionAnswer?.id });
|
||||
} else if (aiResponses.length) {
|
||||
const graded = aiResponses.find((res) => res.id === id);
|
||||
|
||||
$questionnaireMetaData.grades = {
|
||||
...$questionnaireMetaData.grades,
|
||||
[id]: graded.score
|
||||
};
|
||||
updateQuestionAnswer({ point: graded.score }, { id: questionAnswer?.id });
|
||||
}
|
||||
});
|
||||
|
||||
$questionnaireMetaData.finalTotalGrade = Object.values(
|
||||
$questionnaireMetaData.grades
|
||||
).reduce((acc, answer): number => {
|
||||
return acc + answer;
|
||||
}, 0);
|
||||
|
||||
updateSubmission({
|
||||
id: submissionId,
|
||||
status_id: STATUS.GRADED,
|
||||
total: $questionnaireMetaData.finalTotalGrade
|
||||
});
|
||||
|
||||
$questionnaireMetaData.status = STATUS.GRADED;
|
||||
console.log('grade', $questionnaireMetaData.finalTotalGrade);
|
||||
} catch (error) {
|
||||
console.error('Error', error);
|
||||
} finally {
|
||||
isLoading = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
function automaticGrading(answers, questions) {
|
||||
const paragraphAiInput = questions
|
||||
.filter((q) => q.question_type_id === QUESTION_TYPE.TEXTAREA)
|
||||
.map((q) => {
|
||||
const answer = answers?.answers[q.name]; // { open_answer: '' }
|
||||
return {
|
||||
id: q.id,
|
||||
question: q.title,
|
||||
answer: answer,
|
||||
point: q.points
|
||||
};
|
||||
});
|
||||
$input = JSON.stringify(paragraphAiInput);
|
||||
handleSubmit({ preventDefault: () => {} });
|
||||
}
|
||||
|
||||
async function onSubmit(id, value) {
|
||||
if ($course.type === COURSE_TYPE.SELF_PACED) {
|
||||
isLoading = true;
|
||||
}
|
||||
|
||||
const { answers } = $questionnaireMetaData;
|
||||
const { questions } = $questionnaire;
|
||||
const prevAnswer = answers[id] || [];
|
||||
@@ -220,11 +130,6 @@
|
||||
);
|
||||
if (response) {
|
||||
submissionResponse = response;
|
||||
submissionId = submissionResponse.submission[0]?.id;
|
||||
}
|
||||
|
||||
if ($course.type === COURSE_TYPE.SELF_PACED) {
|
||||
automaticGrading($questionnaireMetaData, $questionnaire.questions);
|
||||
}
|
||||
|
||||
notifyEducator();
|
||||
@@ -316,10 +221,6 @@
|
||||
alreadyCheckedAutoSavedData = true;
|
||||
}
|
||||
|
||||
const toggleComments = () => {
|
||||
gradedComment = !gradedComment;
|
||||
};
|
||||
|
||||
$: browser && !alreadyCheckedAutoSavedData && getAutoSavedData();
|
||||
|
||||
// Reactive code
|
||||
@@ -406,42 +307,46 @@
|
||||
</div>
|
||||
</RoleBasedSecurity>
|
||||
{:else if $questionnaireMetaData.isFinished}
|
||||
{#if isLoading}
|
||||
<GradingLoader />
|
||||
{:else if !isLoading && !isLoadingAutoSavedData}
|
||||
{#if !isLoadingAutoSavedData}
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex flex-col lg:flex-row items-start lg:items-center lg:space-x-4 w-full">
|
||||
<h2 class="text-xl font-normal">{$questionnaire.title}</h2>
|
||||
|
||||
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
||||
<span
|
||||
class="status-text bg-green-700 text-white py-1 px-2 text-center"
|
||||
title="Status: Pending Review"
|
||||
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_graded')}
|
||||
>
|
||||
Graded
|
||||
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.graded')}
|
||||
</span>
|
||||
{:else if $course.type === COURSE_TYPE.SELF_PACED}
|
||||
<span
|
||||
class="status-text bg-green-700 text-white py-1 px-2 text-center"
|
||||
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_submitted')}
|
||||
>
|
||||
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.submitted')}
|
||||
</span>
|
||||
{:else}
|
||||
<span
|
||||
class="status-text bg-yellow-600 text-white py-1 px-2 text-center"
|
||||
title="Status: Pending Review"
|
||||
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_pending')}
|
||||
>
|
||||
Pending
|
||||
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.pending')}
|
||||
</span>
|
||||
{/if}
|
||||
</div>
|
||||
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
||||
{#if STATUS.GRADED === $questionnaireMetaData.status && $course.type !== COURSE_TYPE.SELF_PACED}
|
||||
<span
|
||||
class="p-6 border-2 border-gray-300 bg-[#F5F8FE] rounded-full h-10 w-10 flex items-center justify-center text-[#2751DA] text-sm font-semibold"
|
||||
title="Status: Pending Review"
|
||||
title={$t('course.navItem.lessons.exercises.all_exercises.view_mode.status_graded')}
|
||||
>
|
||||
{$questionnaireMetaData.finalTotalGrade}/{$questionnaireMetaData.totalPossibleGrade}
|
||||
</span>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
{#if $questionnaireMetaData.status === STATUS.GRADED && $questionnaireMetaData.comment}
|
||||
<div
|
||||
class="flex items-center justify-between bg-primary-700 p-4 text-white font-semibold rounded-sm mt-3"
|
||||
>
|
||||
{#if $questionnaireMetaData.status === STATUS.GRADED && $questionnaireMetaData.comment && $course.type !== COURSE_TYPE.SELF_PACED}
|
||||
<div class="flex items-center justify-between bg-primary-700 p-4 text-white rounded-sm mt-3">
|
||||
<span> {$questionnaireMetaData.comment}</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
export let courseId = '';
|
||||
export let path = '';
|
||||
export let isExercisePage = false;
|
||||
export let isStudent = false;
|
||||
export let isFetching = false;
|
||||
export let containerClass = '';
|
||||
|
||||
@@ -51,20 +50,16 @@
|
||||
|
||||
$: onCourseIdChange(courseId);
|
||||
|
||||
$: if (typeof $globalStore.isStudent !== 'boolean') {
|
||||
$: {
|
||||
const user = $group.people.find((person) => person.profile_id === $profile.id);
|
||||
|
||||
if (user) {
|
||||
isStudent = user.role_id === 3;
|
||||
$globalStore.isStudent = isStudent;
|
||||
$globalStore.isStudent = user.role_id === 3;
|
||||
|
||||
filterPollsByStatus(isStudent);
|
||||
filterPollsByStatus($globalStore.isStudent);
|
||||
} else if ($profile.id && $group.people.length) {
|
||||
// Current User doesn't have permission to view
|
||||
isPermitted = false;
|
||||
}
|
||||
} else {
|
||||
isStudent = $globalStore.isStudent;
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -97,7 +92,7 @@
|
||||
</Modal>
|
||||
|
||||
<div class="root">
|
||||
<Navigation {path} {isStudent} />
|
||||
<Navigation {path} isStudent={$globalStore.isStudent} />
|
||||
<div class="rightBar {containerClass}" class:isMobile={$isMobile}>
|
||||
{#if isExercisePage}
|
||||
<Confetti />
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
import Grade from '$lib/components/Question/Grade.svelte';
|
||||
import { t } from '$lib/utils/functions/translations';
|
||||
import ReasonBox from '../ReasonBox.svelte';
|
||||
import { course } from '$lib/components/Course/store';
|
||||
import { COURSE_TYPE } from '$lib/utils/types';
|
||||
|
||||
export let title = '';
|
||||
export let index = 1;
|
||||
@@ -17,6 +19,7 @@
|
||||
export let onPrevious = () => {};
|
||||
export let defaultValue = [];
|
||||
export let disablePreviousButton = false;
|
||||
export let isLast = false;
|
||||
export let disabled = false;
|
||||
export let isPreview = false;
|
||||
export let nextButtonProps = {};
|
||||
@@ -134,7 +137,9 @@
|
||||
<PrimaryButton
|
||||
variant={nextButtonProps.isActive ? VARIANTS.CONTAINED : VARIANTS.OUTLINED}
|
||||
type="submit"
|
||||
label={nextButtonProps.label}
|
||||
label={isLast
|
||||
? $t('course.navItem.lessons.exercises.all_exercises.finish')
|
||||
: $t('course.navItem.lessons.exercises.all_exercises.next')}
|
||||
isDisabled={nextButtonProps.isDisabled}
|
||||
{name}
|
||||
/>
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
import Grade from '$lib/components/Question/Grade.svelte';
|
||||
import { t } from '$lib/utils/functions/translations';
|
||||
import ReasonBox from '../ReasonBox.svelte';
|
||||
import { COURSE_TYPE } from '$lib/utils/types';
|
||||
import { course } from '$lib/components/Course/store';
|
||||
|
||||
export let title = '';
|
||||
export let index = 1;
|
||||
@@ -20,6 +22,7 @@
|
||||
export let disabled = false;
|
||||
export let isPreview = false;
|
||||
export let nextButtonProps = {};
|
||||
export let isLast = false;
|
||||
export let grade: number;
|
||||
export let gradeMax = 0;
|
||||
export let disableGrading = false;
|
||||
@@ -135,7 +138,9 @@
|
||||
<PrimaryButton
|
||||
variant={nextButtonProps.isActive ? VARIANTS.CONTAINED : VARIANTS.OUTLINED}
|
||||
type="submit"
|
||||
label={nextButtonProps.label}
|
||||
label={isLast
|
||||
? $t('course.navItem.lessons.exercises.all_exercises.finish')
|
||||
: $t('course.navItem.lessons.exercises.all_exercises.next')}
|
||||
isDisabled={nextButtonProps.isDisabled}
|
||||
{name}
|
||||
/>
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
import Grade from '$lib/components/Question/Grade.svelte';
|
||||
import { t } from '$lib/utils/functions/translations';
|
||||
import ReasonBox from '../ReasonBox.svelte';
|
||||
import { course } from '$lib/components/Course/store';
|
||||
import { COURSE_TYPE } from '$lib/utils/types';
|
||||
|
||||
export let title = '';
|
||||
export let index = 1;
|
||||
@@ -76,7 +78,9 @@
|
||||
<div class="ml-4">
|
||||
{#if disabled}
|
||||
<div class="bg-gray-200 dark:bg-gray-500 py-3 px-5 rounded-md mb-3">
|
||||
{defaultValue}
|
||||
{defaultValue === ''
|
||||
? $t('course.navItem.lessons.exercises.all_exercises.no_answer')
|
||||
: defaultValue}
|
||||
</div>
|
||||
{#if gradeWithAI}
|
||||
<ReasonBox {reason} {isLoading} {acceptGrade} {rejectGrade} />
|
||||
@@ -95,7 +99,7 @@
|
||||
<PrimaryButton
|
||||
variant={VARIANTS.OUTLINED}
|
||||
onClick={handlePrevious}
|
||||
label="Previous"
|
||||
label={$t('course.navItem.lessons.exercises.all_exercises.previous')}
|
||||
isDisabled={disablePreviousButton}
|
||||
/>
|
||||
<PrimaryButton
|
||||
|
||||
@@ -76,8 +76,12 @@
|
||||
|
||||
$: {
|
||||
if (editorRef && lastVal !== value) {
|
||||
editorRef.setContent(value);
|
||||
text = editorRef.getContent({ format: 'text' });
|
||||
try {
|
||||
editorRef.setContent(value);
|
||||
text = editorRef.getContent({ format: 'text' });
|
||||
} catch (error) {
|
||||
console.error('Error setting default value', error);
|
||||
}
|
||||
}
|
||||
if (editorRef && disabled !== disablindCache) {
|
||||
disablindCache = disabled;
|
||||
|
||||
@@ -15,11 +15,6 @@ const lessonSchema = z.object({
|
||||
title: z.string().nonempty({ message: 'Title cannot be empty' }),
|
||||
lesson_at: z.string().optional(),
|
||||
call_url: z.string().nullable().optional(),
|
||||
profile: z
|
||||
.object({
|
||||
id: z.string().optional()
|
||||
})
|
||||
.optional(),
|
||||
is_unlocked: z.boolean()
|
||||
});
|
||||
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "Keine Beschreibung",
|
||||
"start": "Start",
|
||||
"graded": "Benotet",
|
||||
"pending": "Ausstehend"
|
||||
"pending": "Ausstehend",
|
||||
"submitted": "Eingereicht",
|
||||
"status_pending": "Status: Ausstehende Überprüfung",
|
||||
"status_graded": "Status: Überprüfung abgeschlossen",
|
||||
"status_submitted": "Status: Eingereicht"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Modal löschen",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Beschreibung",
|
||||
"describe": "Beschreiben Sie Ihrem Schüler die Übung",
|
||||
"no": "Keine Beschreibung"
|
||||
}
|
||||
},
|
||||
"no_answer": "Es wurde keine Antwort gegeben",
|
||||
"check": "Überprüfen"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Neue Übung",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Neue Lektion hinzufügen",
|
||||
"lesson_title": "Titel der Lektion",
|
||||
"click_to": "Klicke um",
|
||||
"lock": "sperren",
|
||||
"unlock": "Freischalten",
|
||||
"fullname": "vollständiger Name",
|
||||
"save": "Speichern",
|
||||
"edit": "Bearbeiten",
|
||||
"delete": "Löschen"
|
||||
"delete": "Löschen",
|
||||
"lock": "Sperren",
|
||||
"unlock": "Freischalten"
|
||||
},
|
||||
"disabled": "Funktion ist deaktiviert"
|
||||
},
|
||||
|
||||
@@ -499,8 +499,8 @@
|
||||
"modal_heading": "Add New Lesson",
|
||||
"lesson_title": "Lesson Title",
|
||||
"click_to": "Click to",
|
||||
"lock": "lock",
|
||||
"unlock": "unlock",
|
||||
"lock": "Lock",
|
||||
"unlock": "Unlock",
|
||||
"fullname": "fullname",
|
||||
"save": "Save",
|
||||
"edit": "Edit",
|
||||
@@ -629,6 +629,7 @@
|
||||
"order_questions": "Order questions",
|
||||
"write_your_answer": "Write your answer",
|
||||
"write_your_answer_here": "Write your answer here",
|
||||
"no_answer": "No answer was provided",
|
||||
"write_your_question_here": "Write your question here",
|
||||
"write_your_title": "Write your title here",
|
||||
"write_your_subtitle": "Write your subtitle here",
|
||||
@@ -645,6 +646,7 @@
|
||||
"previous": "Previous",
|
||||
"finish": "Finish",
|
||||
"next": "Next",
|
||||
"check": "Check",
|
||||
"description": {
|
||||
"title": "Title",
|
||||
"heading": "Description",
|
||||
@@ -684,7 +686,11 @@
|
||||
"no_description": "No description",
|
||||
"start": "Start",
|
||||
"graded": "Graded",
|
||||
"pending": "Pending"
|
||||
"pending": "Pending",
|
||||
"submitted": "Submitted",
|
||||
"status_pending": "Status: Pending Review",
|
||||
"status_graded": "Status: Review Completed",
|
||||
"status_submitted": "Status: Submitted"
|
||||
},
|
||||
"analytics": {
|
||||
"summary": {
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "Sin descripción",
|
||||
"start": "Comenzar",
|
||||
"graded": "Calificado",
|
||||
"pending": "Pendiente"
|
||||
"pending": "Pendiente",
|
||||
"submitted": "Enviado",
|
||||
"status_pending": "Estado: Pendiente de revisión",
|
||||
"status_graded": "Estado: Revisión completada",
|
||||
"status_submitted": "Estado: Enviado"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Eliminar modal",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Descripción",
|
||||
"describe": "Describe el ejercicio a tu estudiante.",
|
||||
"no": "Sin descripción"
|
||||
}
|
||||
},
|
||||
"no_answer": "No se proporcionó respuesta",
|
||||
"check": "Controlar"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Nuevo ejercicio",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Agregar nueva lección",
|
||||
"lesson_title": "Título de la lección",
|
||||
"click_to": "Haga clic para",
|
||||
"lock": "cerrar",
|
||||
"unlock": "desbloquear",
|
||||
"fullname": "nombre completo",
|
||||
"save": "Ahorrar",
|
||||
"edit": "Editar",
|
||||
"delete": "Borrar"
|
||||
"delete": "Borrar",
|
||||
"lock": "Cerrar",
|
||||
"unlock": "desbloquear"
|
||||
},
|
||||
"disabled": "La característica está deshabilitada"
|
||||
},
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "Pas de description",
|
||||
"start": "Commencer",
|
||||
"graded": "Noté",
|
||||
"pending": "En attente"
|
||||
"pending": "En attente",
|
||||
"submitted": "Soumis",
|
||||
"status_pending": "Statut : En attente d'examen",
|
||||
"status_graded": "Statut : Examen terminé",
|
||||
"status_submitted": "Statut : Soumis"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Supprimer le modal",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Description",
|
||||
"describe": "Décrivez l'exercice à votre élève",
|
||||
"no": "Pas de description"
|
||||
}
|
||||
},
|
||||
"no_answer": "Aucune réponse n'a été fournie",
|
||||
"check": "Vérifier"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Nouvel exercice",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Ajouter une nouvelle leçon",
|
||||
"lesson_title": "Titre de la leçon",
|
||||
"click_to": "Cliquez pour",
|
||||
"lock": "verrouillage",
|
||||
"unlock": "ouvrir",
|
||||
"fullname": "nom et prénom",
|
||||
"save": "Sauvegarder",
|
||||
"edit": "Modifier",
|
||||
"delete": "Supprimer"
|
||||
"delete": "Supprimer",
|
||||
"lock": "Verrouillage",
|
||||
"unlock": "Ouvrir"
|
||||
},
|
||||
"disabled": "La fonctionnalité est désactivée"
|
||||
},
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "कोई विवरण नहीं",
|
||||
"start": "शुरू",
|
||||
"graded": "ग्रेड दिया गया",
|
||||
"pending": "लंबित"
|
||||
"pending": "लंबित",
|
||||
"submitted": "प्रस्तुत",
|
||||
"status_pending": "स्थिति: समीक्षा लंबित",
|
||||
"status_graded": "स्थिति: समीक्षा पूरी हुई",
|
||||
"status_submitted": "स्थिति: सबमिट किया गया"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "मोडल हटाएँ",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "विवरण",
|
||||
"describe": "अपने विद्यार्थी को व्यायाम का वर्णन करें",
|
||||
"no": "कोई विवरण नहीं"
|
||||
}
|
||||
},
|
||||
"no_answer": "कोई उत्तर नहीं दिया गया",
|
||||
"check": "जाँच करना"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "नया व्यायाम",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "नया पाठ जोड़ें",
|
||||
"lesson_title": "पाठ का शीर्षक",
|
||||
"click_to": "के लिए क्लिक करें",
|
||||
"lock": "ताला",
|
||||
"unlock": "अनलॉक",
|
||||
"fullname": "पूरा नाम",
|
||||
"save": "बचाना",
|
||||
"edit": "संपादन करना",
|
||||
"delete": "मिटाना"
|
||||
"delete": "मिटाना",
|
||||
"lock": "ताला",
|
||||
"unlock": "अनलॉक"
|
||||
},
|
||||
"disabled": "सुविधा अक्षम है"
|
||||
},
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "Sem descrição",
|
||||
"start": "Começar",
|
||||
"graded": "Classificado",
|
||||
"pending": "Pendente"
|
||||
"pending": "Pendente",
|
||||
"submitted": "Submetido",
|
||||
"status_pending": "Status: revisão pendente",
|
||||
"status_graded": "Status: Revisão concluída",
|
||||
"status_submitted": "Status: Enviado"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Excluir Modal",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Descrição",
|
||||
"describe": "Descreva o exercício para seu aluno",
|
||||
"no": "Sem descrição"
|
||||
}
|
||||
},
|
||||
"no_answer": "Nenhuma resposta foi fornecida",
|
||||
"check": "Verificar"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Novo exercício",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Adicionar nova lição",
|
||||
"lesson_title": "Título da lição",
|
||||
"click_to": "Clique para",
|
||||
"lock": "trancar",
|
||||
"unlock": "desbloquear",
|
||||
"fullname": "nome completo",
|
||||
"save": "Salvar",
|
||||
"edit": "Editar",
|
||||
"delete": "Excluir"
|
||||
"delete": "Excluir",
|
||||
"lock": "Trancar",
|
||||
"unlock": "Desbloquear"
|
||||
},
|
||||
"disabled": "O recurso está desativado"
|
||||
},
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "без описания",
|
||||
"start": "Начинать",
|
||||
"graded": "Оцененный",
|
||||
"pending": "В ожидании"
|
||||
"pending": "В ожидании",
|
||||
"submitted": "Поданный",
|
||||
"status_pending": "Статус: Ожидает рассмотрения",
|
||||
"status_graded": "Статус: Проверка завершена",
|
||||
"status_submitted": "Статус: Отправлено"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Удалить модальное окно",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Описание",
|
||||
"describe": "Опишите упражнение своему ученику.",
|
||||
"no": "без описания"
|
||||
}
|
||||
},
|
||||
"no_answer": "Ответ не был предоставлен",
|
||||
"check": "Проверять"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Новое упражнение",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Добавить новый урок",
|
||||
"lesson_title": "Название урока",
|
||||
"click_to": "Нажмите для",
|
||||
"lock": "замок",
|
||||
"unlock": "разблокировать",
|
||||
"fullname": "полное имя",
|
||||
"save": "Сохранять",
|
||||
"edit": "Редактировать",
|
||||
"delete": "Удалить"
|
||||
"delete": "Удалить",
|
||||
"lock": "Замок",
|
||||
"unlock": "Разблокировать"
|
||||
},
|
||||
"disabled": "Функция отключена"
|
||||
},
|
||||
|
||||
@@ -582,7 +582,11 @@
|
||||
"no_description": "Không có mô tả",
|
||||
"start": "Bắt đầu",
|
||||
"graded": "Đã chấm điểm",
|
||||
"pending": "Chưa giải quyết"
|
||||
"pending": "Chưa giải quyết",
|
||||
"submitted": "Đã gửi",
|
||||
"status_pending": "Trạng thái: Đang chờ xem xét",
|
||||
"status_graded": "Trạng thái: Đánh giá đã hoàn thành",
|
||||
"status_submitted": "Trạng thái: Đã gửi"
|
||||
},
|
||||
"edit_mode": {
|
||||
"delete_modal": "Xóa phương thức",
|
||||
@@ -611,7 +615,9 @@
|
||||
"heading": "Sự miêu tả",
|
||||
"describe": "Mô tả bài tập cho học sinh của bạn",
|
||||
"no": "Không có mô tả"
|
||||
}
|
||||
},
|
||||
"no_answer": "Không có câu trả lời nào được đưa ra",
|
||||
"check": "Kiểm tra"
|
||||
},
|
||||
"new_exercise_modal": {
|
||||
"heading": "Bài tập mới",
|
||||
@@ -709,12 +715,12 @@
|
||||
"modal_heading": "Thêm bài học mới",
|
||||
"lesson_title": "Tiêu đề bài học",
|
||||
"click_to": "Bấm vào để",
|
||||
"lock": "khóa",
|
||||
"unlock": "mở khóa",
|
||||
"fullname": "Họ và tên",
|
||||
"save": "Cứu",
|
||||
"edit": "Biên tập",
|
||||
"delete": "Xóa bỏ"
|
||||
"delete": "Xóa bỏ",
|
||||
"lock": "Khóa",
|
||||
"unlock": "Mở khóa"
|
||||
},
|
||||
"disabled": "Tính năng bị vô hiệu hóa"
|
||||
},
|
||||
|
||||
@@ -228,7 +228,7 @@
|
||||
const roles: number[] = [1, 2];
|
||||
|
||||
if (org.customization.course.newsfeed) {
|
||||
roles.concat([3]);
|
||||
roles.push(3);
|
||||
}
|
||||
|
||||
return roles;
|
||||
|
||||
@@ -296,7 +296,7 @@
|
||||
<!-- 3 dot edit -->
|
||||
<div class="flex flex-row">
|
||||
<RoleBasedSecurity allowedRoles={[1, 2]}>
|
||||
<OverflowMenu size="xl" class={`absolute right-0 top-0`}>
|
||||
<OverflowMenu size="xl">
|
||||
<OverflowMenuItem
|
||||
disabled={$globalStore.isStudent}
|
||||
text={lesson.is_unlocked
|
||||
|
||||
@@ -208,7 +208,6 @@
|
||||
|
||||
return true;
|
||||
});
|
||||
console.log(`itemToWithNewStatus`, itemToWithNewStatus);
|
||||
// Move to right column
|
||||
if (itemToWithNewStatus) {
|
||||
sections[nextStatusId - 1].items = [...sections[nextStatusId - 1].items, itemToWithNewStatus];
|
||||
@@ -245,7 +244,6 @@
|
||||
const questionAnswer = questionAnswers.find(
|
||||
(answer: { question_id: string }) => answer.question_id == questionId
|
||||
);
|
||||
console.log('this is the question answer in the admin side', questionAnswer);
|
||||
const point = questionAnswerByPoint[questionId];
|
||||
|
||||
totalPoints += parseInt(point, 10);
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
tinymce.Resource.add('content/default/content.css', "body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border=\"0\"]):not([style*=border-width]) td,table[border]:not([border=\"0\"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border=\"0\"]):not([style*=border-style]) td,table[border]:not([border=\"0\"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border=\"0\"]):not([style*=border-color]) td,table[border]:not([border=\"0\"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}")
|
||||
//# sourceMappingURL=content.js.map
|
||||
@@ -0,0 +1 @@
|
||||
body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif;line-height:1.4;margin:1rem}table{border-collapse:collapse}table:not([cellpadding]) td,table:not([cellpadding]) th{padding:.4rem}table[border]:not([border="0"]):not([style*=border-width]) td,table[border]:not([border="0"]):not([style*=border-width]) th{border-width:1px}table[border]:not([border="0"]):not([style*=border-style]) td,table[border]:not([border="0"]):not([style*=border-style]) th{border-style:solid}table[border]:not([border="0"]):not([style*=border-color]) td,table[border]:not([border="0"]):not([style*=border-color]) th{border-color:#ccc}figure{display:table;margin:1rem auto}figure figcaption{color:#999;display:block;margin-top:.25rem;text-align:center}hr{border-color:#ccc;border-style:solid;border-width:1px 0 0 0}code{background-color:#e8e8e8;border-radius:3px;padding:.1rem .2rem}.mce-content-body:not([dir=rtl]) blockquote{border-left:2px solid #ccc;margin-left:1.5rem;padding-left:1rem}.mce-content-body[dir=rtl] blockquote{border-right:2px solid #ccc;margin-right:1.5rem;padding-right:1rem}
|
||||
Reference in New Issue
Block a user