listSorting.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // List view sorting dropdown
  2. export default function handleListSorting() {
  3. const state = {
  4. sort_par: 'sort-name',
  5. sort_direction: -1,
  6. sort_as_int: false,
  7. };
  8. const toggleButton = document.querySelector('.js-toggle-sorting-menu');
  9. const sortingMenu = document.querySelector('.js-sorting-menu');
  10. const unitsContainer = document.querySelector('.units');
  11. if (!toggleButton || !sortingMenu || !unitsContainer) {
  12. return;
  13. }
  14. // Toggle dropdown button
  15. toggleButton.addEventListener('click', () => {
  16. sortingMenu.classList.toggle('u-hidden');
  17. });
  18. // "Click outside" to close dropdown
  19. document.addEventListener('click', (event) => {
  20. const isClickInside = sortingMenu.contains(event.target) || toggleButton.contains(event.target);
  21. if (!isClickInside && !sortingMenu.classList.contains('u-hidden')) {
  22. sortingMenu.classList.add('u-hidden');
  23. }
  24. });
  25. // Inner dropdown sorting behavior
  26. sortingMenu.querySelectorAll('span').forEach((span) => {
  27. span.addEventListener('click', function () {
  28. sortingMenu.classList.add('u-hidden');
  29. // Skip if the clicked sort is already active
  30. if (span.classList.contains('active')) {
  31. return;
  32. }
  33. // Remove 'active' class from all spans and add it to the clicked span
  34. sortingMenu.querySelectorAll('span').forEach((s) => {
  35. s.classList.remove('active');
  36. });
  37. span.classList.add('active');
  38. // Update state with new sorting parameters
  39. const parentLi = span.closest('li');
  40. state.sort_par = parentLi.dataset.entity;
  41. state.sort_as_int = Boolean(parentLi.dataset.sortAsInt);
  42. state.sort_direction = span.classList.contains('up') ? 1 : -1;
  43. // Update toggle button text and icon
  44. toggleButton.querySelector('b').innerHTML = parentLi.querySelector('.name').innerHTML;
  45. const faIcon = toggleButton.querySelector('.fas');
  46. faIcon.classList.remove('fa-arrow-up-a-z', 'fa-arrow-down-a-z');
  47. faIcon.classList.add(span.classList.contains('up') ? 'fa-arrow-up-a-z' : 'fa-arrow-down-a-z');
  48. // Sort units and reattach them to the DOM
  49. const units = Array.from(document.querySelectorAll('.js-sortable-unit')).sort((a, b) => {
  50. const aAttr = a.getAttribute(`data-${state.sort_par}`);
  51. const bAttr = b.getAttribute(`data-${state.sort_par}`);
  52. if (state.sort_as_int) {
  53. const aInt = Number.parseInt(aAttr);
  54. const bInt = Number.parseInt(bAttr);
  55. return aInt >= bInt ? state.sort_direction : state.sort_direction * -1;
  56. }
  57. return aAttr <= bAttr ? state.sort_direction : state.sort_direction * -1;
  58. });
  59. units.forEach((unit) => unitsContainer.appendChild(unit));
  60. });
  61. });
  62. }