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}
+
+
+
{
+ answer.correct = !answer.correct;
+ }}
+ >
+ {#if answer.correct}
+
+
+
+ {:else}
+
+
+
+ {/if}
+
+
+ {/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}
+ {
+ select_answer(i);
+ }}
+ class:opacity-50={selected_answer !== undefined && !answer.correct}
+ class:text-2xl={selected_answer === i}
+ >
+ {answer.answer}
+
+ {/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}