Skip to content
Open
Changes from 2 commits
Commits
Show all changes
93 commits
Select commit Hold shift + click to select a range
1a193aa
Start documenting initial idea.
SilasBerger Jan 27, 2026
d983bcc
Remove unnecessary import.
SilasBerger Jan 27, 2026
4855a91
Rework syntax.
SilasBerger Jan 27, 2026
3a8868a
Implement basic radio buttons.
SilasBerger Jan 27, 2026
e122ed6
Add support for MC.
SilasBerger Jan 27, 2026
f8e5c67
Draft new syntax.
SilasBerger Jan 27, 2026
79272e8
Tweak syntax examples.
SilasBerger Jan 28, 2026
8680d05
Work on plugin.
SilasBerger Jan 28, 2026
6a63d4c
Cleanup.
SilasBerger Jan 28, 2026
ae459ac
Make MDX plugin not suck.
SilasBerger Jan 28, 2026
c180085
Enumerate options.
SilasBerger Jan 28, 2026
ba2d47c
Implement saving.
SilasBerger Jan 29, 2026
6924fff
Show save icon.
SilasBerger Jan 29, 2026
fe9a647
Run formatter.
SilasBerger Jan 29, 2026
459e625
Start integrating Quiz.
SilasBerger Jan 29, 2026
367bc13
Start adding Quiz.
SilasBerger Feb 2, 2026
0b9b522
Fix prop passing.
SilasBerger Feb 2, 2026
91e5df4
Inject doc from quiz.
SilasBerger Feb 2, 2026
27a78bd
Prevent redundant visit of questions in quiz.
SilasBerger Feb 2, 2026
d4c791d
Format.
SilasBerger Feb 2, 2026
e45daed
Improve save icon handling.
SilasBerger Feb 2, 2026
53da651
Cleanup.
SilasBerger Feb 2, 2026
587a307
Implement deleting answer.
SilasBerger Feb 2, 2026
ebd1a38
Add support for true/false answer.
SilasBerger Feb 2, 2026
30392aa
Cleanup.
SilasBerger Feb 2, 2026
950cba5
Add styling and support for question title.
SilasBerger Feb 2, 2026
0930e44
Improve visuals.
SilasBerger Feb 2, 2026
c7ff69c
Add option randomization.
SilasBerger Feb 3, 2026
e732a4b
Implement quiz randomization.
SilasBerger Feb 3, 2026
64cfacc
Cleanup and fixes.
SilasBerger Feb 3, 2026
ab16f82
Clean up.
SilasBerger Feb 5, 2026
2d94413
Start working on component cleanup.
SilasBerger Feb 6, 2026
9913b00
Slim context further.
SilasBerger Feb 6, 2026
67ee1d9
Reduce choice answer props to minimum.
SilasBerger Feb 6, 2026
ebab0da
Fix non-randomization of true/false options.
SilasBerger Feb 6, 2026
04b897f
Hide delete btn behind hover.
SilasBerger Feb 6, 2026
f34f4b5
Make fade a little snappier.
SilasBerger Feb 6, 2026
06073bb
Use canEdit, fix some bugs, clean up.
SilasBerger Feb 6, 2026
2f98410
Use card style.
SilasBerger Feb 7, 2026
0f0f97a
Start working on auto-grading.
SilasBerger Mar 16, 2026
a8fa353
Refactor, work on auto-grading.
SilasBerger Mar 16, 2026
4007fb6
Implement basic SC grading logic.
SilasBerger Mar 16, 2026
7807798
Implement MC grading.
SilasBerger Mar 17, 2026
e9bf2d6
Cleanup.
SilasBerger Mar 17, 2026
887a426
Fix reset.
SilasBerger Mar 17, 2026
5a79c29
Map true/false answer correct state.
SilasBerger Mar 17, 2026
33f1ec3
Move controls for quiz.
SilasBerger Mar 17, 2026
cd93b0e
Use grading color in header.
SilasBerger Mar 17, 2026
0adc3f8
Restyle feedback.
SilasBerger Mar 22, 2026
a11b28c
Work on grading.
SilasBerger Mar 22, 2026
c9bea09
Implement basic grading.
SilasBerger Mar 22, 2026
6ace3d1
Update readme.
SilasBerger Mar 22, 2026
8bd2681
Show max points when not graded.
SilasBerger Mar 22, 2026
dfc4a31
Add noPoints grading function.
SilasBerger Mar 22, 2026
91a3dab
Implement grading hints.
SilasBerger Mar 23, 2026
8e6bec4
Add some documentation.
SilasBerger Mar 23, 2026
f00152c
Implement MC grading.
SilasBerger Mar 23, 2026
d6e6353
Implement lower points limit for quiz.
SilasBerger Mar 23, 2026
b183eec
Prevent answer changes when not allowed.
SilasBerger Mar 23, 2026
e414aaa
Cleanup.
SilasBerger Mar 23, 2026
d9da2b7
Fix some grading/verification edge cases.
SilasBerger Mar 23, 2026
7c0a362
Restructure.
SilasBerger Mar 24, 2026
d37db6d
Integrate grading hint into points badge.
SilasBerger Mar 24, 2026
5b73f7d
Remove standalone scoring hint if no questions have scoring.
SilasBerger Mar 24, 2026
b07fd05
Work on renaming.
SilasBerger Mar 24, 2026
4b08937
Split grading into scoring and assessment.
SilasBerger Mar 24, 2026
4a4fb72
Rename grading prop to scoring.
SilasBerger Mar 24, 2026
6228226
Finish nomenclature change.
SilasBerger Mar 24, 2026
af7c8a6
Clean up README.
SilasBerger Mar 24, 2026
6c00d40
Fix z-index issue.
SilasBerger Mar 24, 2026
4807a05
Cover scoring-but-no-scoring-hint edge case.
SilasBerger Mar 24, 2026
9b1b104
Clean up feedback.
SilasBerger Mar 24, 2026
007982d
Enforce header if there is scoring.
SilasBerger Mar 24, 2026
94644bd
Cleanup.
SilasBerger Mar 24, 2026
f0fc07b
Work on documentation.
SilasBerger Mar 24, 2026
047c8f3
Update docs.
SilasBerger Mar 24, 2026
d8468a7
Get rid of header-less questions.
SilasBerger Mar 24, 2026
3a60831
Add imports to documentation examples.
SilasBerger Mar 25, 2026
d06b914
Make question controls more mobile friendly.
SilasBerger Mar 25, 2026
ac61ad7
Make points badge more mobile friendly.
SilasBerger Mar 25, 2026
490c718
Make quiz controls and feedback more mobile friendly.
SilasBerger Mar 25, 2026
3bfc2d1
Fix visual glitches in multiline options.
SilasBerger Mar 25, 2026
4642c1a
Improve option alignment.
SilasBerger Mar 25, 2026
511e385
Revert unnecessary change to ProgressState.
SilasBerger Mar 25, 2026
3e58075
Cleanup.
SilasBerger Mar 25, 2026
9732668
Cleanup.
SilasBerger Mar 25, 2026
857a332
Remove obsolete feedback admonition.
SilasBerger Mar 25, 2026
648ad33
Simplify feedback style computation.
SilasBerger Mar 25, 2026
7bce9bf
Remove playground.
SilasBerger Mar 25, 2026
c58e04a
Merge branch 'main' into feature/choice-answer
SilasBerger Mar 25, 2026
a998cf0
Add installation docs.
SilasBerger Mar 25, 2026
787992b
Fix hook usage.
SilasBerger Mar 25, 2026
8681761
Merge branch 'main' into feature/choice-answer
lebalz Apr 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
---
page_id: 08ac6803-b890-4608-9d4e-28f334addfb0
tags:
- persistable
---

import PermissionsPanel from "@tdev-components/PermissionsPanel"
import BrowserWindow from '@tdev-components/BrowserWindow';

# Choice Answer
Choice-Antwort für Multiple-Choice, Single-Choice und Wahr/Falsch-Fragen. Geeignet für Aufgaben, Quizzes und Prüfungen.

## Standalone-Fragen
Einfache Single- und Multiple-Choice-Fragen:

```html
<ChoiceAnswer id="9c86f782-39bc-4a2d-bdb5-53a6dad884aa">
Wir gilt als Erfinder des World Wide Web (WWW)?

<ChoiceAnswer.Option id="1">Steve Jobs</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="2" correct>Tim Berners-Lee</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="3">Ada Lovelace</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="4">Alain Berset</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="5">Charles Bartowski</ChoiceAnswer.Option>
</ChoiceAnswer>
```
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Coole Idee 👍 Würde ich gerne brauchen :)
Zum Verfassen und zur Darstellung als "normales" Markdown: wie wäre eine Syntax vergleichbar zum Step bzw. ProgressState? Die id würde obsolet, da die Reihenfolge dann bereits gegeben ist, randomisieren wäre immernoch möglich. Einzig die korrekten Antworten müssten noch speziell markiert werden, bspw. so

Wir gilt als Erfinder des World Wide Web (WWW)?
<ChoiceAnswer correct={[2]} id="9c86f782-39bc-4a2d-bdb5-53a6dad884aa">
    1. Steve Jobs
    2. Tim Berners-Lee
    3. Ada Lovelace
    4. Alain Berset
    5. Charles Bartowski
</ChoiceAnswer>

Copy link
Copy Markdown
Contributor

@SilasBerger SilasBerger Jan 27, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like it! One thing I would change though: The question should IMO be inside the ChoiceAnswer block (I know, it's not part of the answer…). This makes it easier to e.g. automatically add an aufgabe admonition and a checkbox to a ChoiceAnswer, select the individual ChoiceAnswers in a group to arrange them into a carroussel, etc.

<ChoiceAnswer correct={[2]} id="9c86f782-39bc-4a2d-bdb5-53a6dad884aa">
    Wir gilt als Erfinder des World Wide Web (WWW)?

    1. Steve Jobs
    2. Tim Berners-Lee
    3. Ada Lovelace
    4. Alain Berset
    5. Charles Bartowski
</ChoiceAnswer>

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, this would be really cool - but it's not that easy to create a robust behavior...

The approach of ProgressState is to expect a <ul> as a child and process it (https://github.com/GBSL-Informatik/teaching-dev/blob/main/src/components/documents/ProgressState/index.tsx) - with additional content that could be pre- or post <ul>, it could be hard to do it robust.

Maybe you'd need to add a remark plugin could help? not sure what's the best approach...


Mithilfe der IDs können die Antwortmöglichkeiten eindeutig identifiziert werden. Dies erlaubt es, die Reihenfolge der Optionen zu ändern und z.B. Tippfehler zu korrigieren, ohne dass die Korrektheit der Antworten verloren geht. Die IDs sind **frei wählbar**: Es können z.B. UUIDs, laufende Nummern oder semantische Schlüssel verwendet werden.

```html
<ChoiceAnswer id="7b97dd5d-d304-46db-823f-68237814fee5" multiple>
Welche der folgenden Aussagen zu Primzahlen sind korrekt? Es sind **mehrere** Antworten möglich.

<ChoiceAnswer.Option id="1" correct>2 ist die einzige gerade Primzahl.</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="2">Jede Primzahl ist ungerade.</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="3">1 ist eine Primzahl.</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="4" correct>5 ist eine Primzahl.</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="5" correct>Primzahlen sind nur durch 1 und sich selbst teilbar.</ChoiceAnswer.Option>
</ChoiceAnswer>
```

Für Wahr/Falsch-Fragen steht eine spezielle Komponente zur Verfügung:

```html
<TrueFalseAnswer id="89c97b84-0d7a-4d58-8dc7-c8a72569a7e4">
Die Erde ist flach.
</TrueFalseAnswer>
```

Mit der `randomize`-Property werden die Antwortmöglichkeiten in zufälliger Reihenfolge dargestellt. Zudem dürfen bei SC-Aufgaben auch mehrere Optionen korrekt sein. Wird eine davon ausgewählt, gilt die Antwort als richtig:

```html
<ChoiceAnswer id="5f3a2c5a-0d39-4572-8245-5232a9066b9d" randomize>
Welche der folgenden Programmiersprachen sind statisch typisiert? **Hinweis:** Es kann mehr als eine Antwort korrekt sein.

<ChoiceAnswer.Option id="ts" correct>TypeScript</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="python">Python</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="js">JavaScript</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="java" correct>Java</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="ruby">Ruby</ChoiceAnswer.Option>
</ChoiceAnswer>
```

## Fragegruppen
Bei Abschluss-Quizzes und Prüfungen werden in der Regel mehrere MC- und SC-Fragen zusammengefasst. Dies kann mit der `ChoiceAnswer.Group`-Komponente erreicht werden:

```html
<ChoiceAnswer.Group>
<ChoiceAnswer id="c655526e-6cf4-46e6-990e-b4c63a4e96b7">
In welchem Jahr war 2024?

<ChoiceAnswer.Option id="1965">1965</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="1983">1983</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="1991">1991</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="2000">2000</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="2024" correct>2024</ChoiceAnswer.Option>
</ChoiceAnswer>

<TrueFalseAnswer id="c4b45b05-c883-4fcb-97ff-f0b4b9e942b7">
HTML ist eine Programmiersprache.
</TrueFalseAnswer>

<ChoiceAnswer id="ed234dee-60e6-457a-a3b2-7d7f8a642e6b" multiple>
Welche der folgenden Protokolle werden für die Übertragung von E-Mails verwendet?

<ChoiceAnswer.Option id="smtp" correct>SMTP</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="ftp">FTP</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="imap" correct>IMAP</ChoiceAnswer.Option>
<ChoiceAnswer.Option id="http">HTTP</ChoiceAnswer.Option>
</ChoiceAnswer>
</ChoiceAnswer.Group>
```

## TODO
- Bei MC-Aufgaben sind Teilpunktzahlen möglich.
- TODO TODO: Standalone MC-Fragen müssten demnach auch nicht nur mit richtig und falsch, sondern mit "teilweise richtig" bewertet werden?
- Mehrere ChoiceAnswers können in einer ChoiceAnswerGroup zusammengefasst werden.
- Eine ChoiceAnswerGroup kann auf ein Karussell reduziert werden, um Platz zu sparen.
- Bei einer ChoiceAnswerGroup kann eine Gesamtpunktzahl definiert werden, die auf die einzelnen ChoiceAnswers aufgeteilt wird.
- Die Wertung der Antworten kann angepasst werden – es sind z.B. auch Negativpunkte möglich. Es kann zudem eingestellt werden, ob die Gruppe insgesamt weniger als 0 Punkte ergeben darf.
- Der Korrekturknopf einer ChoiceAnswerGroup kann versteckt oder mit einer Permission geschützt werden.
- Bei einer ChoiceAnswerGroup kann eingestellt werden, ob die Fragen in der vorgegebenen Reihenfolge oder zufällig angezeigt werden sollen.
- TODO TODO:
- Korrektur: Einzeln oder nur Punkte?
- Konzept eines "Durchgangs" (Versuch)? Versuch verwerfen und neu starten nach Korrektur?
- Soll eine CA / CA.Group automatische eine Aufgabe sein? Soll sie automatisch eine Checkbox erhalten? Soll diese automatisch aktiviert sein, wenn das Quiz fertig gelöst ist? Soll sie nur aktiviert sein, wenn alles korrekt gelöst wurde? Soll das alles eine Option sein?

## Future Work
- Statt die korrekten Antworten direkt in der Komponente zu markieren, soll bei einer ChoiceAnswerGroup auch angegeben werden können, dass die Lösung extern abgespeichert ist. In diesem Fall verfügt die Gruppe über ein Upload-Feld, über welches das entsprechende Lösungs-File hochgeladen werden kann. Die Lösungen werden nach erfolgreichem Upload im LocalStore gespeichert, damit z.B. bei Prüfungen mehrere Schüler:innen korrigiert werden können. Für Admins steht zudem ein Download-Button bereit, mit dem sie ein Template für die Lösungen einer spezifischen Gruppe herunterladen können.
- Allgemeine Überlegung: Im Sinne einer Autokorrektur für Prüfungen soll die `ChoiceAnswer.Group` eine Funktion anbieten, die ein Lösungsdokument (z.B. als Teil eines Lösungsdokuments für die gesamte Prüfung) entgegennimmt und als Antwort eine Punktzahl und z.B. einen Report in Form `4 richtig | 1 falsch | 0 nicht beantwortet` zurückgibt. Dies könnte dann als Korrektur für diese Aufgabe in Korrektur-Document des entsprechenden Schülers eingetragen werden (während z.B. bei Textaufgaben eine manuelle Feedback- und Punkteeingabe durch die Lehrperson erfolgt).