From 2076e7cffb5534fb169ab3c3c505ab6e44522699 Mon Sep 17 00:00:00 2001 From: Mawoka Date: Thu, 15 Jun 2023 18:42:39 +0200 Subject: [PATCH] :sparkles: Added ABCD-Question to Quiztivities --- classquiz/db/quiztivity.py | 14 ++- classquiz/routers/quiztivity/shares.py | 3 + .../lib/components/popover/smalltop.svelte | 4 +- .../src/lib/quiztivity/add_new_slide.svelte | 6 ++ .../quiztivity/components/abcd/edit.svelte | 90 +++++++++++++++++++ .../quiztivity/components/abcd/play.svelte | 37 ++++++++ frontend/src/lib/quiztivity/editor.svelte | 4 + .../src/lib/quiztivity/shares_popover.svelte | 20 +++-- frontend/src/lib/quiztivity/types.ts | 15 +++- .../src/routes/quiztivity/play/+page.svelte | 4 + 10 files changed, 187 insertions(+), 10 deletions(-) create mode 100644 frontend/src/lib/quiztivity/components/abcd/edit.svelte create mode 100644 frontend/src/lib/quiztivity/components/abcd/play.svelte diff --git a/classquiz/db/quiztivity.py b/classquiz/db/quiztivity.py index bc355de..33298c6 100644 --- a/classquiz/db/quiztivity.py +++ b/classquiz/db/quiztivity.py @@ -23,21 +23,33 @@ class Markdown(BaseModel): markdown: str +class _AbcdAnswer(BaseModel): + answer: str + correct: bool + + +class Abcd(BaseModel): + question: str + answers: list[_AbcdAnswer] + + class QuizTivityTypes(str, enum.Enum): SLIDE = "SLIDE" PDF = "PDF" MEMORY = "MEMORY" MARKDOWN = "MARKDOWN" + ABCD = "ABCD" TYPE_CLASS_LIST = { QuizTivityTypes.PDF: type(Pdf), QuizTivityTypes.MEMORY: type(Memory), QuizTivityTypes.MARKDOWN: type(Markdown), + QuizTivityTypes.ABCD: type(Abcd), } class QuizTivityPage(BaseModel): title: str | None type: QuizTivityTypes - data: Pdf | Memory | Markdown + data: Pdf | Memory | Markdown | Abcd diff --git a/classquiz/routers/quiztivity/shares.py b/classquiz/routers/quiztivity/shares.py index 43b92ad..95d4bec 100644 --- a/classquiz/routers/quiztivity/shares.py +++ b/classquiz/routers/quiztivity/shares.py @@ -77,6 +77,9 @@ async def get_share(uuid: UUID) -> QuizTivity: share = await QuizTivityShare.objects.select_related("quiztivity").get_or_none(id=uuid) if share is None: raise HTTPException(status_code=404, detail="Share not found") + print(share.quiztivity) + if share.expire_at is None: + return share.quiztivity if share.expire_at < datetime.now(): raise HTTPException(status_code=410, detail="Already expired") return share.quiztivity diff --git a/frontend/src/lib/components/popover/smalltop.svelte b/frontend/src/lib/components/popover/smalltop.svelte index 7765d34..9c499c5 100644 --- a/frontend/src/lib/components/popover/smalltop.svelte +++ b/frontend/src/lib/components/popover/smalltop.svelte @@ -22,8 +22,8 @@ role="alert" >
- {#if type === PopoverTypes.Copy}{$t('components.popover.copied_to_clipboard')}Copied - to clipboard! + {#if type === PopoverTypes.Copy} + {$t('components.popover.copied_to_clipboard')} {:else if type === PopoverTypes.GameInLobby}A game is currently in the lobby. Click here diff --git a/frontend/src/lib/quiztivity/components/abcd/edit.svelte b/frontend/src/lib/quiztivity/components/abcd/edit.svelte new file mode 100644 index 0000000..f4cd3dd --- /dev/null +++ b/frontend/src/lib/quiztivity/components/abcd/edit.svelte @@ -0,0 +1,90 @@ + + + + +
+
+ +
+
+ {#each data.answers as answer} +
+ + +
+ {/each} + {#if data.answers.length < 4} +
+ { + data.answers = [...data.answers, { ...{ answer: '', correct: false } }]; + }}>{$t('editor_page.add_an_answer')} +
+ {/if} +
+
diff --git a/frontend/src/lib/quiztivity/components/abcd/play.svelte b/frontend/src/lib/quiztivity/components/abcd/play.svelte new file mode 100644 index 0000000..e18deb5 --- /dev/null +++ b/frontend/src/lib/quiztivity/components/abcd/play.svelte @@ -0,0 +1,37 @@ + + + + +
+

{data.question}

+ +
+ {#each data.answers as answer, i} + + {/each} +
+
diff --git a/frontend/src/lib/quiztivity/editor.svelte b/frontend/src/lib/quiztivity/editor.svelte index c3e02a1..f0be7cc 100644 --- a/frontend/src/lib/quiztivity/editor.svelte +++ b/frontend/src/lib/quiztivity/editor.svelte @@ -12,6 +12,7 @@ import PdfEdit from './components/pdf/edit.svelte'; import MemoryEdit from './components/memory/edit.svelte'; import MarkdownEdit from './components/markdown/edit.svelte'; + import AbcdEdit from './components/abcd/edit.svelte'; import { flip } from 'svelte/animate'; import { createEventDispatcher } from 'svelte'; import SharesPopover from '$lib/quiztivity/shares_popover.svelte'; @@ -46,6 +47,7 @@ console.log(selected_slide); data.pages.splice(selected_slide, 1); data.pages = data.pages; + selected_slide = null; }; const arraymove = (arr: any[], fromI: number, toI: number) => { @@ -164,6 +166,8 @@ {:else if sel_t === QuizTivityTypes.MARKDOWN} + {:else if sel_t === QuizTivityTypes.ABCD} + {:else}

ERROR!

{/if} diff --git a/frontend/src/lib/quiztivity/shares_popover.svelte b/frontend/src/lib/quiztivity/shares_popover.svelte index 1d6e2b0..0429389 100644 --- a/frontend/src/lib/quiztivity/shares_popover.svelte +++ b/frontend/src/lib/quiztivity/shares_popover.svelte @@ -103,6 +103,19 @@ await fetch(`/api/v1/quiztivity/shares/${id}`, { method: 'DELETE' }); loaded_shares = load_shares(); }; + + const share_available = (): boolean => { + try { + return browser + ? !navigator.canShare({ + title: 'title', + url: `${window.location.origin}/quiztivity` + }) + : false; + } catch { + return false; + } + }; let add_shares_open = false; @@ -154,12 +167,7 @@
{ navigator.share({ title: 'Quiztivity on ClassQuiz', diff --git a/frontend/src/lib/quiztivity/types.ts b/frontend/src/lib/quiztivity/types.ts index 2737f1b..979891a 100644 --- a/frontend/src/lib/quiztivity/types.ts +++ b/frontend/src/lib/quiztivity/types.ts @@ -12,7 +12,9 @@ export enum QuizTivityTypes { // eslint-disable-next-line no-unused-vars MEMORY = 'MEMORY', // eslint-disable-next-line no-unused-vars - MARKDOWN = 'MARKDOWN' + MARKDOWN = 'MARKDOWN', + // eslint-disable-next-line no-unused-vars + ABCD = 'ABCD' } export interface Pdf { @@ -32,6 +34,17 @@ export interface Memory { export interface Markdown { markdown: string; } + +export interface AbcdAnswer { + answer: string; + correct: boolean; +} + +export interface Abcd { + question: string; + answers: AbcdAnswer[]; +} + export interface QuizTivityPage { title?: string; type: QuizTivityTypes; diff --git a/frontend/src/routes/quiztivity/play/+page.svelte b/frontend/src/routes/quiztivity/play/+page.svelte index 3fd4dea..2c3a60d 100644 --- a/frontend/src/routes/quiztivity/play/+page.svelte +++ b/frontend/src/routes/quiztivity/play/+page.svelte @@ -32,6 +32,10 @@ {#await import('$lib/quiztivity/components/memory/play.svelte') then c} {/await} + {:else if current_slide.type === QuizTivityTypes.ABCD} + {#await import('$lib/quiztivity/components/abcd/play.svelte') then c} + + {/await} {/if}