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.
76 lines
2.5 KiB
76 lines
2.5 KiB
1 year ago
|
// List view sorting dropdown
|
||
|
export default function handleListSorting() {
|
||
|
const state = {
|
||
|
sort_par: 'sort-name',
|
||
|
sort_direction: -1,
|
||
|
sort_as_int: false,
|
||
|
};
|
||
|
|
||
|
const toggleButton = document.querySelector('.js-toggle-sorting-menu');
|
||
|
const sortingMenu = document.querySelector('.js-sorting-menu');
|
||
|
const unitsContainer = document.querySelector('.js-units-container');
|
||
|
|
||
|
if (!toggleButton || !sortingMenu || !unitsContainer) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Toggle dropdown button
|
||
|
toggleButton.addEventListener('click', () => {
|
||
|
sortingMenu.classList.toggle('u-hidden');
|
||
|
});
|
||
|
|
||
|
// "Click outside" to close dropdown
|
||
|
document.addEventListener('click', (event) => {
|
||
|
const isClickInside = sortingMenu.contains(event.target) || toggleButton.contains(event.target);
|
||
|
if (!isClickInside && !sortingMenu.classList.contains('u-hidden')) {
|
||
|
sortingMenu.classList.add('u-hidden');
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// Inner dropdown sorting behavior
|
||
|
sortingMenu.querySelectorAll('span').forEach((span) => {
|
||
|
span.addEventListener('click', function () {
|
||
|
sortingMenu.classList.add('u-hidden');
|
||
|
|
||
|
// Skip if the clicked sort is already active
|
||
|
if (span.classList.contains('active')) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Remove 'active' class from all spans and add it to the clicked span
|
||
|
sortingMenu.querySelectorAll('span').forEach((s) => {
|
||
|
s.classList.remove('active');
|
||
|
});
|
||
|
span.classList.add('active');
|
||
|
|
||
|
// Update state with new sorting parameters
|
||
|
const parentLi = span.closest('li');
|
||
|
state.sort_par = parentLi.dataset.entity;
|
||
|
state.sort_as_int = Boolean(parentLi.dataset.sortAsInt);
|
||
|
state.sort_direction = span.classList.contains('up') ? 1 : -1;
|
||
|
|
||
|
// Update toggle button text and icon
|
||
|
toggleButton.querySelector('span').innerHTML = parentLi.querySelector('.name').innerHTML;
|
||
|
const faIcon = toggleButton.querySelector('.fas');
|
||
|
faIcon.classList.remove('fa-arrow-up-a-z', 'fa-arrow-down-a-z');
|
||
|
faIcon.classList.add(span.classList.contains('up') ? 'fa-arrow-up-a-z' : 'fa-arrow-down-a-z');
|
||
|
|
||
|
// Sort units and reattach them to the DOM
|
||
|
const units = Array.from(document.querySelectorAll('.js-unit')).sort((a, b) => {
|
||
|
const aAttr = a.getAttribute(`data-${state.sort_par}`);
|
||
|
const bAttr = b.getAttribute(`data-${state.sort_par}`);
|
||
|
|
||
|
if (state.sort_as_int) {
|
||
|
const aInt = Number.parseInt(aAttr);
|
||
|
const bInt = Number.parseInt(bAttr);
|
||
|
return aInt >= bInt ? state.sort_direction : state.sort_direction * -1;
|
||
|
}
|
||
|
|
||
|
return aAttr <= bAttr ? state.sort_direction : state.sort_direction * -1;
|
||
|
});
|
||
|
|
||
|
units.forEach((unit) => unitsContainer.appendChild(unit));
|
||
|
});
|
||
|
});
|
||
|
}
|