website

source code for the ttmaths.uk website
Log | Files | Refs | README

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:
Msrc/components/QuestionWindow.jsx | 32++++++++++++++++++++++----------
Msrc/components/questions/QuadraticEquationQuestion.jsx | 9+++++++--
Msrc/data/test-question-window.js | 8++++----
Msrc/scripts/utils.js | 4++++
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; }