commit 4928862656a56f065773d4e5c65b7de9a121ddb5
parent 21541128ac663b8696201d9f5b6e7d857f341dba
Author: hrryt <harry@mayesfield.uk>
Date: Fri, 31 Jul 2026 20:36:18 +0100
Invert multiple selection if none imminent
Diffstat:
1 file changed, 4 insertions(+), 10 deletions(-)
diff --git a/src/components/MultipleSelection.jsx b/src/components/MultipleSelection.jsx
@@ -1,17 +1,11 @@
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;
- }));
+ function updateChecked(newValue, index) {
+ const newChecked = checked.map((value, i) => i === index ? newValue : value);
+ setChecked(newChecked.some(Boolean) ? newChecked : checked.map((value) => !value));
}
return (
@@ -21,7 +15,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} checked={checked[i]} disabled={!isEnabled(checked, i)} onChange={e => setCheckedI(e.target.checked, i)} />
+ <input type="checkbox" id={name} name={name} checked={checked[i]} onChange={e => updateChecked(e.target.checked, i)} />
<label htmlFor={name}>{labels[i]}</label>
</div>
);