listUnitSelect.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. // Select unit behavior
  2. export default function handleListUnitSelect() {
  3. const checkboxes = Array.from(document.querySelectorAll('.js-unit-checkbox'));
  4. const units = checkboxes.map((checkbox) => checkbox.closest('.js-unit'));
  5. const selectAllCheckbox = document.querySelector('.js-toggle-all-checkbox');
  6. if (checkboxes.length === 0 || !selectAllCheckbox) {
  7. return;
  8. }
  9. let lastCheckedIndex = null;
  10. checkboxes.forEach((checkbox, index) => {
  11. checkbox.addEventListener('click', (event) => {
  12. const isChecked = checkbox.checked;
  13. updateUnitSelection(units[index], isChecked);
  14. if (event.shiftKey && lastCheckedIndex !== null) {
  15. handleMultiSelect(checkboxes, units, index, lastCheckedIndex, isChecked);
  16. }
  17. lastCheckedIndex = index;
  18. });
  19. });
  20. selectAllCheckbox.addEventListener('change', () => {
  21. const isChecked = selectAllCheckbox.checked;
  22. checkboxes.forEach((checkbox) => (checkbox.checked = isChecked));
  23. units.forEach((unit) => updateUnitSelection(unit, isChecked));
  24. });
  25. }
  26. function updateUnitSelection(unit, isChecked) {
  27. unit.classList.toggle('selected', isChecked);
  28. }
  29. function handleMultiSelect(checkboxes, units, index, lastCheckedIndex, isChecked) {
  30. const rangeStart = Math.min(index, lastCheckedIndex);
  31. const rangeEnd = Math.max(index, lastCheckedIndex);
  32. for (let i = rangeStart; i <= rangeEnd; i++) {
  33. checkboxes[i].checked = isChecked;
  34. updateUnitSelection(units[i], isChecked);
  35. }
  36. }