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.
hestiacp/web/js/src/listUnitSelect.js

46 lines
1.4 KiB

1 year ago
// 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);
}
}