<form id="form" aria-label="Example of indeterminate state">
<div>
<input type="checkbox" id="allCarsSelectedState">
<label for="allCarsSelectedState">Selected all cars</label>
</div>
<hr aria-hidden="true" />
<div>
<input type="checkbox" id="mercedes">
<label for="mercedes">Mercedes</label>
</div>
<div>
<input type="checkbox" id="volvo">
<label for="volvo">Volvo</label>
</div>
</form>
div,
hr {
align-items: center;
display: flex;
margin-bottom: 1rem;
}
input {
margin-right: 0.5rem;
transform: scale(1.5);
}
const form = document.querySelector("#form");
const allCarsSelectedState = document.querySelector("#allCarsSelectedState");
const toggleSelectAllCars = (target) => {
const selectAll = target.checked;
const checkboxes = Array.from(target.form.elements);
checkboxes.forEach((checkbox) => {
checkbox.checked = selectAll;
});
allCarsSelectedState.checked = !allCarsSelectedState.checked;
allCarsSelectedState.indeterminate = false;
target.checked = !target.checked;
};
const handleSelectedOption = (event) => {
const target = event.target;
if (target.nodeName.toLowerCase() !== "input") {
return;
}
if (target.id === 'allCarsSelectedState') {
toggleSelectAllCars(target);
return;
}
const allCheckboxesLength = form.elements.length - 1;
const areAllCheckboxesSelected = Array.from(target.form.elements)
.filter((checkbox) => {
return checkbox.id !== 'allCarsSelectedState';
})
.filter(
(checkbox) => {
return checkbox.checked;
}
);
allCarsSelectedState.indeterminate = false;
if (areAllCheckboxesSelected.length === allCheckboxesLength) {
allCarsSelectedState.checked = true;
} else if (areAllCheckboxesSelected.length === 0) {
allCarsSelectedState.checked = false;
} else {
allCarsSelectedState.checked = false;
allCarsSelectedState.indeterminate = true;
}
};
form.addEventListener("change", handleSelectedOption);
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.