Files
webprogrammierung/js/filter.js
T
rirat-0 0805958033 Anpassung der filter.js
es gab ein problem bei der sortierung, da nur 10 ergebnisse angezeigt werden. mit dieser anpassung koennen ergebnisse 'nachruecken'
2026-06-17 19:47:33 +02:00

115 lines
3.9 KiB
JavaScript

let currentClientPage = 1;
const itemsPerPage = 10;
function initFilter() {
const filterSelect = document.getElementById('category-filter');
const listContainer = document.querySelector('.s-res-list');
if (!filterSelect || !listContainer) return;
updateVisibility();
filterSelect.addEventListener('change', function() {
currentClientPage = 1; // Bei Filterwechsel zurück auf Seite 1
updateVisibility();
});
const pageButtons = document.querySelectorAll('.s-res-page-navigation .s-res-page-btn');
pageButtons.forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
e.stopPropagation();
const targetPage = this.getAttribute('data-page');
if (targetPage) {
currentClientPage = parseInt(targetPage, 10);
updateVisibility();
}
}, true);
});
}
function updateVisibility() {
const filterSelect = document.getElementById('category-filter');
const listContainer = document.querySelector('.s-res-list');
const selectedCategory = filterSelect.value.toLowerCase().trim();
const cards = listContainer.querySelectorAll('.s-res-item');
// filtern
let visibleCards = [];
cards.forEach(card => {
const cardCategory = (card.getAttribute('data-category') || '').toLowerCase().trim();
if (selectedCategory === 'all' || cardCategory.includes(selectedCategory) || selectedCategory.includes(cardCategory)) {
visibleCards.push(card);
} else {
card.style.display = 'none';
}
});
// nur 10 karten anzeigen
const totalVisible = visibleCards.length;
const totalPages = Math.max(1, ceil(totalVisible / itemsPerPage));
// aktuelle seite validieren
if (currentClientPage < 1) currentClientPage = 1;
if (currentClientPage > totalPages) currentClientPage = totalPages;
const startOffset = (currentClientPage - 1) * itemsPerPage;
const endOffset = startOffset + itemsPerPage;
visibleCards.forEach((card, index) => {
if (index >= startOffset && index < endOffset) {
card.style.display = 'flex';
} else {
card.style.display = 'none';
}
});
// update der seitenzahl
updatePaginatorUI(currentClientPage, totalPages);
}
function updatePaginatorUI(currentPage, totalPages) {
const pageButtons = document.querySelectorAll('.s-res-page-navigation .s-res-page-btn');
pageButtons.forEach(button => {
const targetPage = button.getAttribute('data-page');
if (button.textContent.includes('«')) {
button.setAttribute('data-page', currentPage - 1);
button.disabled = (currentPage <= 1);
} else if (button.textContent.includes('»')) {
button.setAttribute('data-page', currentPage + 1);
button.disabled = (currentPage >= totalPages);
} else {
const pageNum = parseInt(button.textContent.trim(), 10);
// Falls es die Seite im neuen Filter gar nicht mehr gibt -> Button verstecken
if (pageNum > totalPages) {
button.style.display = 'none';
} else {
button.style.display = 'inline-block';
if (pageNum === currentPage) {
button.classList.add('s-res-page-btn-active');
} else {
button.classList.remove('s-res-page-btn-active');
}
}
}
});
}
// Hilfsfunktion für Math.ceil in JS
function ceil(val) { return Math.ceil(val); }
// ist das DOM bereits vollständig aufgebaut?
if (document.readyState === 'loading') {
// Falls noch geladen wird, auf das Event warten
document.addEventListener('DOMContentLoaded', initFilter);
} else {
// Falls das HTML bereits komplett da ist, sofort ausführen
initFilter();
}