CLASSROOMIO-T-234:working on the local storage
CLASSROOMIO-T-234: Complete autosave feature CLASSROOMIO-T-234:working on the local storage Co-authored-by: Ifeanyi Nwosu <[email protected]> Co-authored-by: Rotimi Best <[email protected]> Merge-request: CLASSROOMIO-MR-116 Merged-by: Best Admin <[email protected]>
This commit is contained in:
committed by
Space Cloud
co-authored by
Rotimi Best
parent
d6472a54ca
commit
4c32c95657
@@ -25,14 +25,18 @@
|
|||||||
triggerSendEmail
|
triggerSendEmail
|
||||||
} from '$lib/utils/services/notification/notification';
|
} from '$lib/utils/services/notification/notification';
|
||||||
import { lesson } from '../store/lessons';
|
import { lesson } from '../store/lessons';
|
||||||
|
import { onMount } from 'svelte';
|
||||||
|
import { browser } from '$app/environment';
|
||||||
|
|
||||||
export let preview;
|
export let preview: false;
|
||||||
export let exerciseId = '';
|
export let exerciseId = '';
|
||||||
|
|
||||||
let currentQuestion = {};
|
let currentQuestion = {};
|
||||||
let renderProps = {};
|
let renderProps = {};
|
||||||
let submission;
|
let submission;
|
||||||
let hasSubmission = false;
|
let hasSubmission = false;
|
||||||
|
let isLoadingAutoSavedData = false;
|
||||||
|
let alreadyCheckedAutoSavedData = false;
|
||||||
|
|
||||||
function handleStart() {
|
function handleStart() {
|
||||||
$questionnaireMetaData.currentQuestionIndex += 1;
|
$questionnaireMetaData.currentQuestionIndex += 1;
|
||||||
@@ -77,6 +81,7 @@
|
|||||||
const { answers } = $questionnaireMetaData;
|
const { answers } = $questionnaireMetaData;
|
||||||
const { questions } = $questionnaire;
|
const { questions } = $questionnaire;
|
||||||
const prevAnswer = answers[id] || [];
|
const prevAnswer = answers[id] || [];
|
||||||
|
|
||||||
const formattedAnswer =
|
const formattedAnswer =
|
||||||
typeof value === 'string' ? value : removeDuplicate([...prevAnswer, ...(value || [])]);
|
typeof value === 'string' ? value : removeDuplicate([...prevAnswer, ...(value || [])]);
|
||||||
|
|
||||||
@@ -87,6 +92,10 @@
|
|||||||
|
|
||||||
if (moveToNextQuestion) {
|
if (moveToNextQuestion) {
|
||||||
$questionnaireMetaData.currentQuestionIndex += 1;
|
$questionnaireMetaData.currentQuestionIndex += 1;
|
||||||
|
localStorage.setItem(
|
||||||
|
`autosave-exercise-${exerciseId}`,
|
||||||
|
JSON.stringify($questionnaireMetaData)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const isFinished = !questions[$questionnaireMetaData.currentQuestionIndex - 1];
|
const isFinished = !questions[$questionnaireMetaData.currentQuestionIndex - 1];
|
||||||
@@ -98,6 +107,7 @@
|
|||||||
|
|
||||||
// If last question send to server
|
// If last question send to server
|
||||||
if (isFinished) {
|
if (isFinished) {
|
||||||
|
localStorage.removeItem(`autosave-exercise-${exerciseId}`);
|
||||||
$questionnaireMetaData.status = 1;
|
$questionnaireMetaData.status = 1;
|
||||||
$questionnaireMetaData.totalPossibleGrade = getTotalPossibleGrade($questionnaire.questions);
|
$questionnaireMetaData.totalPossibleGrade = getTotalPossibleGrade($questionnaire.questions);
|
||||||
$questionnaireMetaData.grades = {};
|
$questionnaireMetaData.grades = {};
|
||||||
@@ -138,8 +148,6 @@
|
|||||||
|
|
||||||
if (hasSubmission) return;
|
if (hasSubmission) return;
|
||||||
|
|
||||||
console.log('checkForSubmission');
|
|
||||||
|
|
||||||
const args = {
|
const args = {
|
||||||
exerciseId,
|
exerciseId,
|
||||||
courseId,
|
courseId,
|
||||||
@@ -150,7 +158,6 @@
|
|||||||
|
|
||||||
if (Array.isArray(data) && data.length) {
|
if (Array.isArray(data) && data.length) {
|
||||||
submission = data[0];
|
submission = data[0];
|
||||||
|
|
||||||
$questionnaireMetaData.answers = formatAnswers({
|
$questionnaireMetaData.answers = formatAnswers({
|
||||||
questions: $questionnaire.questions,
|
questions: $questionnaire.questions,
|
||||||
answers: submission.answers
|
answers: submission.answers
|
||||||
@@ -171,7 +178,27 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$: {
|
function getAutoSavedData() {
|
||||||
|
isLoadingAutoSavedData = true;
|
||||||
|
|
||||||
|
const stringifiedQuestionnaireMetaData = localStorage.getItem(
|
||||||
|
`autosave-exercise-${exerciseId}`
|
||||||
|
);
|
||||||
|
|
||||||
|
if (stringifiedQuestionnaireMetaData) {
|
||||||
|
const autoSavedData = JSON.parse(stringifiedQuestionnaireMetaData);
|
||||||
|
if (autoSavedData) {
|
||||||
|
$questionnaireMetaData = autoSavedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isLoadingAutoSavedData = false;
|
||||||
|
alreadyCheckedAutoSavedData = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$: browser && !alreadyCheckedAutoSavedData && getAutoSavedData();
|
||||||
|
|
||||||
|
// Reactive code
|
||||||
|
$: if (alreadyCheckedAutoSavedData && $questionnaire.questions.length > 2) {
|
||||||
currentQuestion = $questionnaire.questions[$questionnaireMetaData.currentQuestionIndex - 1];
|
currentQuestion = $questionnaire.questions[$questionnaireMetaData.currentQuestionIndex - 1];
|
||||||
if ($questionnaireMetaData.currentQuestionIndex > 0 && !currentQuestion) {
|
if ($questionnaireMetaData.currentQuestionIndex > 0 && !currentQuestion) {
|
||||||
$questionnaireMetaData.isFinished = true;
|
$questionnaireMetaData.isFinished = true;
|
||||||
@@ -188,11 +215,10 @@
|
|||||||
preview
|
preview
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
$questionnaireMetaData.progressValue = getProgressValue(
|
||||||
|
$questionnaireMetaData.currentQuestionIndex
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$: $questionnaireMetaData.progressValue = getProgressValue(
|
|
||||||
$questionnaireMetaData.currentQuestionIndex
|
|
||||||
);
|
|
||||||
$: checkForSubmission($group.people, $profile.id, $course.id);
|
$: checkForSubmission($group.people, $profile.id, $course.id);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -254,41 +280,43 @@
|
|||||||
</div>
|
</div>
|
||||||
</RoleBasedSecurity>
|
</RoleBasedSecurity>
|
||||||
{:else if $questionnaireMetaData.isFinished}
|
{:else if $questionnaireMetaData.isFinished}
|
||||||
<div class="flex items-center justify-between">
|
{#if !isLoadingAutoSavedData}
|
||||||
<div class="flex flex-col justify-between w-full">
|
<div class="flex items-center justify-between">
|
||||||
<h2 class="text-xl mb-2 mt-0">{$questionnaire.title}</h2>
|
<div class="flex flex-col justify-between w-full">
|
||||||
|
<h2 class="text-xl mb-2 mt-0">{$questionnaire.title}</h2>
|
||||||
|
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
||||||
|
<span
|
||||||
|
class="status-text bg-green-700 text-white rounded-full py-3 px-6 text-center"
|
||||||
|
title="Status: Pending Review"
|
||||||
|
>
|
||||||
|
Graded
|
||||||
|
</span>
|
||||||
|
{:else}
|
||||||
|
<span
|
||||||
|
class="status-text bg-yellow-600 text-white rounded-full py-3 px-6 text-center"
|
||||||
|
title="Status: Pending Review"
|
||||||
|
>
|
||||||
|
Pending
|
||||||
|
</span>
|
||||||
|
{/if}
|
||||||
|
</div>
|
||||||
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
||||||
<span
|
<span
|
||||||
class="status-text bg-green-700 text-white rounded-full py-3 px-6 text-center"
|
class="p-5 border-2 border-gray-700 rounded-full h-24 w-24 flex items-center justify-center text-2xl"
|
||||||
title="Status: Pending Review"
|
title="Status: Pending Review"
|
||||||
>
|
>
|
||||||
Graded
|
{$questionnaireMetaData.finalTotalGrade}/{$questionnaireMetaData.totalPossibleGrade}
|
||||||
</span>
|
|
||||||
{:else}
|
|
||||||
<span
|
|
||||||
class="status-text bg-yellow-600 text-white rounded-full py-3 px-6 text-center"
|
|
||||||
title="Status: Pending Review"
|
|
||||||
>
|
|
||||||
Pending
|
|
||||||
</span>
|
</span>
|
||||||
{/if}
|
{/if}
|
||||||
</div>
|
</div>
|
||||||
{#if STATUS.GRADED === $questionnaireMetaData.status}
|
<Preview
|
||||||
<span
|
questions={$questionnaire.questions.sort((a, b) => a.order - b.order)}
|
||||||
class="p-5 border-2 border-gray-700 rounded-full h-24 w-24 flex items-center justify-center text-2xl"
|
questionnaireMetaData={$questionnaireMetaData}
|
||||||
title="Status: Pending Review"
|
grades={$questionnaireMetaData.grades}
|
||||||
>
|
disableGrading={true}
|
||||||
{$questionnaireMetaData.finalTotalGrade}/{$questionnaireMetaData.totalPossibleGrade}
|
/>
|
||||||
</span>
|
{/if}
|
||||||
{/if}
|
{:else if currentQuestion && currentQuestion?.id}
|
||||||
</div>
|
|
||||||
<Preview
|
|
||||||
questions={$questionnaire.questions.sort((a, b) => a.order - b.order)}
|
|
||||||
questionnaireMetaData={$questionnaireMetaData}
|
|
||||||
grades={$questionnaireMetaData.grades}
|
|
||||||
disableGrading={true}
|
|
||||||
/>
|
|
||||||
{:else if currentQuestion}
|
|
||||||
{#key currentQuestion.id}
|
{#key currentQuestion.id}
|
||||||
<!-- <div transition:fade id="question"> -->
|
<!-- <div transition:fade id="question"> -->
|
||||||
<div in:fly={{ x: 500, duration: 1000 }} id="question">
|
<div in:fly={{ x: 500, duration: 1000 }} id="question">
|
||||||
|
|||||||
Reference in New Issue
Block a user