You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.4 KiB
46 lines
1.4 KiB
// Select unit behavior
|
|
export default function handleListUnitSelect() {
|
|
const checkboxes = Array.from(document.querySelectorAll('.js-unit-checkbox'));
|
|
const units = checkboxes.map((checkbox) => checkbox.closest('.js-unit'));
|
|
const selectAllCheckbox = document.querySelector('.js-toggle-all-checkbox');
|
|
|
|
if (checkboxes.length === 0 || !selectAllCheckbox) {
|
|
return;
|
|
}
|
|
|
|
let lastCheckedIndex = null;
|
|
|
|
checkboxes.forEach((checkbox, index) => {
|
|
checkbox.addEventListener('click', (event) => {
|
|
const isChecked = checkbox.checked;
|
|
updateUnitSelection(units[index], isChecked);
|
|
|
|
if (event.shiftKey && lastCheckedIndex !== null) {
|
|
handleMultiSelect(checkboxes, units, index, lastCheckedIndex, isChecked);
|
|
}
|
|
|
|
lastCheckedIndex = index;
|
|
});
|
|
});
|
|
|
|
selectAllCheckbox.addEventListener('change', () => {
|
|
const isChecked = selectAllCheckbox.checked;
|
|
checkboxes.forEach((checkbox) => (checkbox.checked = isChecked));
|
|
units.forEach((unit) => updateUnitSelection(unit, isChecked));
|
|
});
|
|
}
|
|
|
|
function updateUnitSelection(unit, isChecked) {
|
|
unit.classList.toggle('selected', isChecked);
|
|
}
|
|
|
|
function handleMultiSelect(checkboxes, units, index, lastCheckedIndex, isChecked) {
|
|
const rangeStart = Math.min(index, lastCheckedIndex);
|
|
const rangeEnd = Math.max(index, lastCheckedIndex);
|
|
|
|
for (let i = rangeStart; i <= rangeEnd; i++) {
|
|
checkboxes[i].checked = isChecked;
|
|
updateUnitSelection(units[i], isChecked);
|
|
}
|
|
}
|