commit 21541128ac663b8696201d9f5b6e7d857f341dba
parent 73fb2c94a3fc40955273de793fb2bf3aa3d239d5
Author: hrryt <harry@mayesfield.uk>
Date: Fri, 31 Jul 2026 19:54:51 +0100
Disallow none checked in MultipleSelection
Diffstat:
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/src/components/MultipleSelection.jsx b/src/components/MultipleSelection.jsx
@@ -1,6 +1,19 @@
import * as React from 'react';
+function isEnabled(checked, index) {
+ return checked.some((value, i) => i === index ? !checked : value);
+}
+
export default function MultipleSelection({ id, legend, values, labels = values, defaults = values.map(() => true) }) {
+ const [checked, setChecked] = React.useState(defaults);
+
+ function setCheckedI(newValue, index) {
+ setChecked(checked.map((value, i) => {
+ if (i === index) { return newValue; }
+ return value;
+ }));
+ }
+
return (
<fieldset key={id}>
<legend>{legend}</legend>
@@ -8,7 +21,7 @@ export default function MultipleSelection({ id, legend, values, labels = values,
const name = `${id}:${value}`;
return (
<div key={value} className="field-row">
- <input type="checkbox" id={name} name={name} defaultChecked={defaults[i]} />
+ <input type="checkbox" id={name} name={name} checked={checked[i]} disabled={!isEnabled(checked, i)} onChange={e => setCheckedI(e.target.checked, i)} />
<label htmlFor={name}>{labels[i]}</label>
</div>
);