2023-10-06 09:06:03 +00:00
|
|
|
<script lang="ts">
|
2026-03-09 11:18:22 +01:00
|
|
|
import { questionnaire } from './store';
|
2025-12-24 04:18:39 +00:00
|
|
|
import { sanitizeHtml } from '@cio/ui/tools/sanitize';
|
2025-11-21 12:18:04 +01:00
|
|
|
import { t } from '$lib/utils/functions/translations';
|
|
|
|
|
|
2025-12-22 02:36:48 +01:00
|
|
|
import { InputField } from '@cio/ui/custom/input-field';
|
|
|
|
|
import { TextEditor } from '$features/ui';
|
2026-03-09 11:18:22 +01:00
|
|
|
import { QuestionContainer } from '$features/course/components';
|
2023-10-06 09:06:03 +00:00
|
|
|
|
2025-11-01 15:49:29 +01:00
|
|
|
interface Props {
|
|
|
|
|
preview: boolean;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let { preview }: Props = $props();
|
2023-08-30 14:31:40 +00:00
|
|
|
|
2025-12-22 02:36:48 +01:00
|
|
|
function getTotalPossibleGrade(questions: { points: number | string }[]) {
|
2023-10-01 19:31:18 +01:00
|
|
|
return questions.reduce((acc, question) => {
|
2025-12-22 02:36:48 +01:00
|
|
|
acc += typeof question.points === 'string' ? parseFloat(question.points) : question.points;
|
2023-08-30 14:31:40 +00:00
|
|
|
return acc;
|
|
|
|
|
}, 0);
|
|
|
|
|
}
|
2026-03-09 11:18:22 +01:00
|
|
|
|
|
|
|
|
$inspect('$questionnaire', $questionnaire);
|
2023-08-30 14:31:40 +00:00
|
|
|
</script>
|
|
|
|
|
|
2023-10-06 09:06:03 +00:00
|
|
|
<div class="mb-5 {!preview ? 'px-6' : 'px-2'}">
|
2023-08-30 14:31:40 +00:00
|
|
|
<QuestionContainer isTitle={true}>
|
2026-03-09 11:18:22 +01:00
|
|
|
{#if preview}
|
2023-08-30 14:31:40 +00:00
|
|
|
<h2 class="my-1">{$questionnaire.title}</h2>
|
|
|
|
|
<div class="flex items-center">
|
2025-11-01 15:49:29 +01:00
|
|
|
<p class="mx-2 dark:text-white">
|
2024-04-19 05:45:48 +01:00
|
|
|
<strong>{$questionnaire.questions.length}</strong>
|
|
|
|
|
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.questions')}
|
2023-08-30 14:31:40 +00:00
|
|
|
</p>
|
|
|
|
|
|
|
2025-11-01 15:49:29 +01:00
|
|
|
<p class="mx-2 dark:text-white">
|
2024-04-19 05:45:48 +01:00
|
|
|
<strong>{getTotalPossibleGrade($questionnaire.questions)}</strong>
|
|
|
|
|
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.points')}.
|
2023-08-30 14:31:40 +00:00
|
|
|
</p>
|
|
|
|
|
|
|
2025-11-01 15:49:29 +01:00
|
|
|
<p class="mx-2 dark:text-white">
|
2024-04-19 05:45:48 +01:00
|
|
|
{$t('course.navItem.lessons.exercises.all_exercises.view_mode.all')}
|
|
|
|
|
</p>
|
2026-03-09 11:18:22 +01:00
|
|
|
{#if $questionnaire.dueBy}
|
2023-08-30 14:31:40 +00:00
|
|
|
|
|
2025-11-01 15:49:29 +01:00
|
|
|
<p class="mx-2 dark:text-white">
|
2024-04-19 05:45:48 +01:00
|
|
|
<strong>{$t('course.navItem.lessons.exercises.all_exercises.view_mode.due')}:</strong>
|
2026-03-09 11:18:22 +01:00
|
|
|
{new Date($questionnaire.dueBy).toLocaleString()}
|
2023-08-30 14:31:40 +00:00
|
|
|
</p>
|
|
|
|
|
{/if}
|
|
|
|
|
</div>
|
|
|
|
|
|
2025-12-22 02:36:48 +01:00
|
|
|
<article class="preview prose prose-sm sm:prose mt-3 p-2">
|
2025-12-03 09:33:53 +01:00
|
|
|
{@html sanitizeHtml(
|
2025-12-24 04:18:39 +00:00
|
|
|
$questionnaire.description || $t('course.navItem.lessons.exercises.all_exercises.description.no')
|
2025-12-03 09:33:53 +01:00
|
|
|
)}
|
2023-08-30 14:31:40 +00:00
|
|
|
</article>
|
2026-03-09 11:18:22 +01:00
|
|
|
{:else}
|
|
|
|
|
<InputField
|
|
|
|
|
placeholder={$t('course.navItem.lessons.exercises.all_exercises.description.title')}
|
|
|
|
|
bind:value={$questionnaire.title}
|
|
|
|
|
className="mb-2"
|
|
|
|
|
onchange={() => ($questionnaire.isTitleDirty = true)}
|
|
|
|
|
/>
|
|
|
|
|
<InputField
|
|
|
|
|
label={$t('course.navItem.lessons.exercises.all_exercises.view_mode.due')}
|
|
|
|
|
className="w-50"
|
|
|
|
|
type="datetime-local"
|
|
|
|
|
value={$questionnaire.dueBy ?? ''}
|
|
|
|
|
onchange={(e) => {
|
|
|
|
|
$questionnaire.dueBy = e.currentTarget.value;
|
|
|
|
|
$questionnaire.isDueByDirty = true;
|
|
|
|
|
}}
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
<div class="mt-3">
|
|
|
|
|
<p class="mb-1">
|
|
|
|
|
{$t('course.navItem.lessons.exercises.all_exercises.description.heading')}
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
{#key $questionnaire.description}
|
|
|
|
|
<TextEditor
|
|
|
|
|
content={$questionnaire.description || ''}
|
|
|
|
|
onChange={(html) => {
|
|
|
|
|
$questionnaire.isDescriptionDirty = true;
|
|
|
|
|
$questionnaire.description = html;
|
|
|
|
|
}}
|
|
|
|
|
editorClass="max-h-[100px]"
|
|
|
|
|
placeholder={$t('course.navItem.lessons.exercises.all_exercises.description.describe')}
|
|
|
|
|
/>
|
|
|
|
|
{/key}
|
|
|
|
|
</div>
|
2023-08-30 14:31:40 +00:00
|
|
|
{/if}
|
|
|
|
|
</QuestionContainer>
|
|
|
|
|
</div>
|