feat(frontend): Vue can now interact with the chosen answers for questions.

This commit is contained in:
Gerald Schmittinger 2025-04-16 13:02:13 +02:00
parent 6d452c7f72
commit 63d1ed8bd2
6 changed files with 99 additions and 1 deletions

View file

@ -0,0 +1,13 @@
export const essayQuestionAdapter: GiftAdapter = {
questionType: "Essay",
installListener(questionElement: Element, answerUpdateCallback: (newAnswer: string | number | object) => void): void {
const textArea = questionElement.querySelector('textarea')!;
textArea.addEventListener('input', () => answerUpdateCallback(textArea.value));
},
setAnswer(questionElement: Element, answer: string | number | object): void {
const textArea = questionElement.querySelector('textarea')!;
textArea.value = String(answer);
}
}

View file

@ -0,0 +1,5 @@
interface GiftAdapter {
questionType: string;
installListener(questionElement: Element, answerUpdateCallback: (newAnswer: string | number | object) => void): void;
setAnswer(questionElement: Element, answer: string | number | object): void;
}

View file

@ -0,0 +1,8 @@
import {multipleChoiceQuestionAdapter} from "@/views/learning-paths/gift-adapters/multiple-choice-question-adapter.ts";
import {essayQuestionAdapter} from "@/views/learning-paths/gift-adapters/essay-question-adapter.ts";
export const giftAdapters = [multipleChoiceQuestionAdapter, essayQuestionAdapter];
export function getGiftAdapterForType(questionType: string): GiftAdapter | undefined {
return giftAdapters.find(it => it.questionType === questionType);
}

View file

@ -0,0 +1,26 @@
export const multipleChoiceQuestionAdapter: GiftAdapter = {
questionType: "MC",
installListener(questionElement: Element, answerUpdateCallback: (newAnswer: string | number | object) => void): void {
questionElement.querySelectorAll('input[type=radio]').forEach(element => {
const input = element as HTMLInputElement;
input.addEventListener('change', () => {
answerUpdateCallback(parseInt(input.value));
});
// Optional: initialize value if already selected
if (input.checked) {
answerUpdateCallback(parseInt(input.value));
}
});
},
setAnswer(questionElement: Element, answer: string | number | object): void {
questionElement.querySelectorAll('input[type=radio]').forEach(element => {
const input = element as HTMLInputElement;
console.log(`input: ${input.value}, answer: ${answer}`);
input.checked = String(answer) === String(input.value);
console.log(input.checked);
});
}
}