diff --git a/src/lib/components/Course/components/Lesson/Exercise/EditMode.svelte b/src/lib/components/Course/components/Lesson/Exercise/EditMode.svelte
index 41097a55..7d32e6db 100644
--- a/src/lib/components/Course/components/Lesson/Exercise/EditMode.svelte
+++ b/src/lib/components/Course/components/Lesson/Exercise/EditMode.svelte
@@ -19,12 +19,10 @@
import Modal from '$lib/components/Modal/index.svelte';
import TextArea from '$lib/components/Form/TextArea.svelte';
import Checkbox from '$lib/components/Form/Checkbox.svelte';
- import DateTime from '$lib/components/Form/DateTime.svelte';
import RadioItem from '$lib/components/Form/RadioItem.svelte';
import IconButton from '$lib/components/IconButton/index.svelte';
import ErrorMessage from '$lib/components/ErrorMessage/index.svelte';
import PrimaryButton from '$lib/components/PrimaryButton/index.svelte';
- import EditContent from '$lib/components/EditContent/index.svelte';
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
import Select from '$lib/components/Form/Select.svelte';
import QuestionContainer from '$lib/components/QuestionContainer/index.svelte';
@@ -34,6 +32,7 @@
import { filterOutDeleted } from './functions';
import { deleteExercise } from '$lib/utils/services/courses';
import { lesson } from '../store/lessons';
+
// import EditContent from "$lib/components/EditContent/index.svelte";
// let value = readme;
@@ -47,13 +46,12 @@
let errors = {};
let questionIdToDelete = null;
let questions = [];
- let shouldDelete = false;
let isDeleting = false;
function shouldScrollToLast(questionId, questions) {
+ const [lastQuestion] = questions.slice(-1);
const currentQuestionsLength = questions.length;
- const index = questions.findIndex((question) => question.id === questionId);
- const isLast = index + 1 === currentQuestionsLength;
+ const isLast = lastQuestion.id === questionId;
return isLast && initialQuestionsLength !== currentQuestionsLength;
}
@@ -97,8 +95,6 @@
..._lesson,
exercises: _lesson.exercises.filter((exercise) => exercise.id !== exerciseId)
}));
-
- shouldDelete = false;
goBack();
}
@@ -119,62 +115,26 @@
width="w-2/4"
modalHeading="Update description"
>
- {#if shouldDelete}
-
- {:else}
-
-
- ($questionnaire.is_title_dirty = true)}
- />
- {
- $questionnaire.due_by = e.target.value;
- $questionnaire.is_due_by_dirty = true;
- }}
- />
- ($questionnaire.is_description_dirty = true)}
- />
-
-
-
(shouldDelete = true)}
- />
-
+
+
(editDescription = false)}
+ />
+
- {/if}
+
@@ -207,14 +167,6 @@
/>
-
-
+
{/if}
{#if getQuestionErrorMsg(errors, question, 'option')}
diff --git a/src/lib/components/Course/components/Lesson/Exercise/UpdateDescription.svelte b/src/lib/components/Course/components/Lesson/Exercise/UpdateDescription.svelte
new file mode 100644
index 00000000..3710b340
--- /dev/null
+++ b/src/lib/components/Course/components/Lesson/Exercise/UpdateDescription.svelte
@@ -0,0 +1,69 @@
+
+
+
+
+ {#if !preview}
+ ($questionnaire.is_title_dirty = true)}
+ />
+ {
+ $questionnaire.due_by = e.target.value;
+ $questionnaire.is_due_by_dirty = true;
+ }}
+ />
+ ($questionnaire.is_description_dirty = true)}
+ />
+ {:else if preview}
+ {$questionnaire.title}
+
+
+ {$questionnaire.questions.length} questions
+
+ |
+
+ {getTotalPossibleGrade()} points.
+
+ |
+
All required
+ {#if $questionnaire.due_by}
+ |
+
+ Due by:
+ {new Date($questionnaire.due_by).toLocaleString()}
+
+ {/if}
+
+
+
+ {@html marked($questionnaire.description || 'No description')}
+
+ {/if}
+
+
diff --git a/src/lib/components/Course/components/Lesson/Exercise/ViewMode.svelte b/src/lib/components/Course/components/Lesson/Exercise/ViewMode.svelte
index 50803a0e..e1e33518 100644
--- a/src/lib/components/Course/components/Lesson/Exercise/ViewMode.svelte
+++ b/src/lib/components/Course/components/Lesson/Exercise/ViewMode.svelte
@@ -20,6 +20,8 @@
import { submitExercise } from '$lib/utils/services/courses';
import { fetchSubmission } from '$lib/utils/services/submissions';
import { profile } from '$lib/utils/store/user';
+ import MODES from '$lib/utils/constants/mode.js';
+ import { exerciseMode } from './store';
export let preview;
@@ -163,10 +165,12 @@
{/if}
{#if preview}
-
+ {#if $exerciseMode.editMode}
+
+ {/if}
{:else if !$questionnaire.questions.length}
@@ -178,34 +182,41 @@
{:else if $questionnaireMetaData.currentQuestionIndex === 0}
-
-
{$questionnaire.title}
+
+
+
{$questionnaire.title}
-
-
- {$questionnaire.questions.length} questions
-
- |
-
- {getTotalPossibleGrade()} points.
-
- |
-
All required
- {#if $questionnaire.due_by}
+
+
+ {$questionnaire.questions.length} questions
+
|
- Due by:
- {new Date($questionnaire.due_by).toLocaleString()}
+ {getTotalPossibleGrade()} points.
- {/if}
+ |
+
All required
+ {#if $questionnaire.due_by}
+ |
+
+ Due by:
+ {new Date($questionnaire.due_by).toLocaleString()}
+
+ {/if}
+
+
+
+ {@html marked($questionnaire.description || 'No desription')}
+
+
+
-
-
- {@html marked($questionnaire.description || 'No desription')}
-
-
-
-
+
{:else if $questionnaireMetaData.isFinished}
diff --git a/src/lib/components/Course/components/Lesson/Exercise/index.svelte b/src/lib/components/Course/components/Lesson/Exercise/index.svelte
index 4e6c5fa5..a3234e13 100644
--- a/src/lib/components/Course/components/Lesson/Exercise/index.svelte
+++ b/src/lib/components/Course/components/Lesson/Exercise/index.svelte
@@ -2,7 +2,6 @@
import { onDestroy } from 'svelte';
import AddAltIcon from 'carbon-icons-svelte/lib/AddAlt.svelte';
import TableIcon from 'carbon-icons-svelte/lib/Table.svelte';
- import SettingsIcon from 'carbon-icons-svelte/lib/Settings.svelte';
import ViewIcon from 'carbon-icons-svelte/lib/View.svelte';
import ViewFilledIcon from 'carbon-icons-svelte/lib/ViewFilled.svelte';
import {
@@ -20,121 +19,128 @@
import EditMode from './EditMode.svelte';
import MODES from '$lib/utils/constants/mode.js';
import { VARIANTS } from '$lib/components/PrimaryButton/constants';
- import { upsertExercise } from '$lib/utils/services/courses';
+ import { deleteExercise, upsertExercise } from '$lib/utils/services/courses';
+ import UpdateDescription from './UpdateDescription.svelte';
+ import { TrashCan } from 'carbon-icons-svelte';
+ import { exerciseMode } from './store';
+ import { snackbarStore } from '$lib/components/Snackbar/store';
+ import { SNACKBAR_SEVERITY } from '$lib/components/Snackbar/constants';
export let exerciseId;
export let refetchExercise = () => {};
export let goBack = () => {};
- let mode = MODES.view;
let preview = false;
let editDescription = false;
+ let isSaving = false;
- async function handleMode() {
- if (mode === MODES.edit) {
+ async function handleSave() {
+ if ($exerciseMode.editMode) {
const errors = validateQuestionnaire($questionnaire.questions);
if (Object.values(errors).length > 0) {
return;
}
-
- mode = MODES.view;
+ isSaving = true;
+ // $exerciseMode.mode = MODES.view;
reset();
+ try {
+ const updatedQuestions = await upsertExercise($questionnaire, exerciseId);
- const updatedQuestions = await upsertExercise($questionnaire, exerciseId);
-
- questionnaire.update((q) => ({
- ...q,
- is_title_dirty: false,
- is_description_dirty: false,
- questions: updatedQuestions
- }));
- } else {
- mode = MODES.edit;
- preview = false;
+ questionnaire.update((q) => ({
+ ...q,
+ is_title_dirty: false,
+ is_description_dirty: false,
+ questions: updatedQuestions
+ }));
+ $snackbarStore.open = true;
+ $snackbarStore.message = 'Saved Successfully';
+ $snackbarStore.severity = SNACKBAR_SEVERITY.SUCCESS;
+ } catch (error) {
+ $snackbarStore.open = true;
+ $snackbarStore.message = `An Error Occurred`;
+ $snackbarStore.severity = SNACKBAR_SEVERITY.ERROR;
+ }
+ isSaving = false;
}
}
- function handleDeleteExercise() {}
-
- function onCancel() {
- mode = MODES.view;
- refetchExercise();
- }
-
onDestroy(() => {
reset();
});
+
+ $: $questionnaire.questions.length < 1 && handleAddQuestion();
-
+
-
+
-
- {#if mode === MODES.edit}
+ {#if $exerciseMode.editMode}
{/if}
+ {#if $exerciseMode.editMode}
+ (preview = !preview)}
+ toolTipProps={{ title: 'Toggle preview', direction: 'right' }}
+ selected={preview}
+ contained={true}
+ size="small"
+ >
+ {#if preview}
+
+ {:else}
+
+ {/if}
+
+ {/if}
-
- {#if mode !== MODES.edit}
-
(preview = !preview)}
- toolTipProps={{ title: 'Toggle preview', direction: 'right' }}
- selected={preview}
- contained={true}
- >
- {#if preview}
-
- {:else}
-
- {/if}
-
- {/if}
- {#if mode === MODES.edit}
+ {#if $exerciseMode.editMode}
handleAddQuestion()}
toolTipProps={{ title: 'Add question', direction: 'bottom' }}
+ size="small"
>
-
+
($questionnaireOrder.open = true)}
toolTipProps={{ title: 'Order questionnaire', direction: 'bottom' }}
+ size="small"
>
-
+
(editDescription = true)}
- toolTipProps={{ title: 'Edit description', direction: 'bottom' }}
+ toolTipProps={{ title: 'Delete Exercise', direction: 'bottom' }}
+ size="small"
>
-
+
+ onClick={handleDeleteExercise}
+ toolTipProps={{ title: 'Delete questionnaire', direction: 'bottom' }}
+ >
+
+ -->
{/if}
- {#if mode === MODES.edit && !preview}
+ {#if $exerciseMode.editMode}
+
+ {/if}
+ {#if $exerciseMode.editMode && !preview}
{:else}
diff --git a/src/lib/components/Course/components/Lesson/Exercise/store.js b/src/lib/components/Course/components/Lesson/Exercise/store.js
new file mode 100644
index 00000000..b6424c66
--- /dev/null
+++ b/src/lib/components/Course/components/Lesson/Exercise/store.js
@@ -0,0 +1,7 @@
+import { writable } from 'svelte/store';
+import MODES from '$lib/utils/constants/mode.js';
+import { ROLE } from '$lib/utils/constants/roles';
+
+export const exerciseMode = writable({
+ editMode: true
+});
diff --git a/src/lib/components/Course/components/Lesson/Exercises/index.svelte b/src/lib/components/Course/components/Lesson/Exercises/index.svelte
index 1556aa75..7ab0e7ef 100644
--- a/src/lib/components/Course/components/Lesson/Exercises/index.svelte
+++ b/src/lib/components/Course/components/Lesson/Exercises/index.svelte
@@ -14,7 +14,10 @@
import { createExercise } from '$lib/utils/services/courses';
import { QUESTION_TYPES } from '$lib/components/Question/constants';
import { lesson } from '../store/lessons';
- import { questionnaire, isQuestionnaireFetching } from '../store/exercise';
+ import { questionnaire, isQuestionnaireFetching, handleAddQuestion } from '../store/exercise';
+ import MODES from '$lib/utils/constants/mode.js';
+ import { ROLE } from '$lib/utils/constants/roles';
+ import { exerciseMode } from '../Exercise/store';
export let path;
export let exerciseId;
@@ -46,7 +49,7 @@
function handleCancelAddExercise() {
open = false;
newExercise = {
- id: $lesson.exercises.length + 1,
+ id: new Date().getTime(),
title: '',
description: ''
};
@@ -122,6 +125,10 @@
getExercises();
});
+ const gotoEdit = () => {
+ $exerciseMode.editMode = true;
+ };
+
$: getExercise(exerciseId);
@@ -145,15 +152,16 @@
- (open = !open)} />
+ (open = !open)} />