commit 73fb2c94a3fc40955273de793fb2bf3aa3d239d5
parent 7da7192b3db02bb98461b7116c7dacbebc5c2e20
Author: hrryt <harry@mayesfield.uk>
Date: Fri, 31 Jul 2026 19:08:21 +0100
Structure question parameter form parsing around function of id
Diffstat:
4 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/src/components/QuestionWindow.jsx b/src/components/QuestionWindow.jsx
@@ -1,6 +1,6 @@
import * as React from 'react';
import QuestionList from './QuestionList.jsx';
-import { getRandomInt, getRandomNumber } from '../scripts/utils.js';
+import { getRandomInt, getRandomNumber, getRandomChoice } from '../scripts/utils.js';
import MultipleSelection from './MultipleSelection';
@@ -24,24 +24,38 @@ function chooseQuestionComponent(type) {
}
}
-function renderQuestion(seed, showAnswer) {
+function getFormValue(id, formData) {
+ // TODO: Implement
+ return ["a=1"];
+}
+
+function resolveParameters(question, formData) {
+ const parameters = question.lockedParameters || { };
+ const controlledParameters = question.controlledParameters || { };
+ Object.keys(controlledParameters).forEach((key) => {
+ parameters[key] = getFormValue(controlledParameters[key], formData);
+ })
+ return parameters;
+}
+
+function renderQuestion(seed, showAnswer, formData) {
return (question, i) => {
const QuestionComponent = chooseQuestionComponent(question.type);
- return <QuestionComponent key={i} seed={seed+i} showAnswer={showAnswer} parameters={question.lockedParameters || { }} />;
+ const parameters = resolveParameters(question, formData);
+ return <QuestionComponent key={i} seed={seed+i} showAnswer={showAnswer} parameters={parameters} />;
};
}
-function getQuestionList(id, questions, showAnswers, seed) {
+function getQuestionList(id, questions, showAnswers, seed, formData) {
return (
<QuestionList key={id}>
- {questions.map(renderQuestion(seed, showAnswers))}
+ {questions.map(renderQuestion(seed, showAnswers, formData))}
</QuestionList>
);
}
function shuffleArray(arr, n, seed) {
- const max = arr.length - 1;
- return Array.from({ length: n }).map(() => arr[getRandomInt(0, max, ++seed)]);
+ return Array.from({ length: n }).map(() => getRandomChoice(arr, ++seed));
}
export default function QuestionWindow({ data }) {
@@ -56,7 +70,7 @@ export default function QuestionWindow({ data }) {
const questions = data.questionLists.map(questionList => {
const { id: id, n: n, questions: unique_questions } = questionList;
const questions = shuffleArray(unique_questions, n, current_seed);
- const randomQuestionList = getQuestionList(id, questions, showAnswers, current_seed);
+ const randomQuestionList = getQuestionList(id, questions, showAnswers, current_seed, formData);
current_seed += n;
return randomQuestionList;
});
@@ -72,8 +86,6 @@ export default function QuestionWindow({ data }) {
setFormData(Object.fromEntries(newFormData.entries()));
}
- console.log(formData);
-
return (
<Window title="Questions">
<form onChange={updateFormData}>
diff --git a/src/components/questions/QuadraticEquationQuestion.jsx b/src/components/questions/QuadraticEquationQuestion.jsx
@@ -1,6 +1,6 @@
import * as React from 'react';
import Question from '../Question.jsx';
-import { getRandomInt, getRandomBoolean, formatNumber } from '../../scripts/utils.js';
+import { getRandomInt, getRandomBoolean, getRandomChoice, formatNumber } from '../../scripts/utils.js';
function formatQuadraticExpression(a, b, c) {
const fa = formatNumber(a, showPlus=false, showOne=false, showZero=false, suffix='x^2');
@@ -47,10 +47,15 @@ function getRandomRoots(seed) {
export default function QuadraticEquationQuestion({ seed, showAnswer, parameters }) {
const {
- a: a = getRandomInt(1, 3, seed),
+ aPlurality: aPlurality = ["a=1", "a>1"],
factorise: factorise = getRandomBoolean(seed + .1),
} = parameters;
+ const aChoices = Array();
+ aPlurality.includes("a=1") && aChoices.push(1);
+ aPlurality.includes("a>1") && aChoices.push(2, 3);
+ const a = getRandomChoice(aChoices, seed);
+
const [root1, root2] = getRandomRoots(seed + .2);
const b = a * -(root1 + root2);
diff --git a/src/data/test-question-window.js b/src/data/test-question-window.js
@@ -1,16 +1,16 @@
export const questionWindow = {
inputs: [{
- id: 'a',
+ id: 'aPlurality',
legend: 'Quadratic Equations: a',
type: 'multiple-selection',
- values: [1, 2, 3],
+ values: ["a=1", "a>1"],
}],
questionLists: [{
id: 0,
n: 10,
questions: [{
type: 'quadratic-equation',
- controlledParameters: { a: 'a' },
+ controlledParameters: { aPlurality: 'aPlurality' },
}]
}, {
id: 1,
@@ -23,7 +23,7 @@ export const questionWindow = {
n: 5,
questions: [{
type: 'quadratic-equation',
- lockedParameters: { a: 1, factorise: false },
+ lockedParameters: { aPlurality: ["a=1"], factorise: false },
}]
}]
}
diff --git a/src/scripts/utils.js b/src/scripts/utils.js
@@ -2,6 +2,10 @@ export function getRandomInt(min, max, seed) {
return min + Math.floor((max - min + 1) * getRandomNumber(seed));
}
+export function getRandomChoice(arr, seed) {
+ return arr[getRandomInt(0, arr.length - 1, seed)];
+}
+
export function getRandomBoolean(seed) {
return getRandomNumber(seed) < 0.5;
}