#100 Sortierung: Dropdown mit 6 Optionen (Score/Datum/Nr/Titel) + localStorage-Persistenz

This commit is contained in:
Dotty Dotter 2026-04-10 23:26:05 +02:00
parent 8e19f6cffa
commit cf313bd257

View File

@ -781,6 +781,14 @@
<select id="partei-filter" onchange="setParteiFilter(this.value)" style="padding: 0.25rem 0.5rem; border-radius: 20px; border: 1px solid var(--color-lightgray); font-size: 0.8rem; cursor: pointer;">
<option value="">Alle Parteien</option>
</select>
<select id="sort-select" onchange="setSortOrder(this.value)" style="padding: 0.25rem 0.5rem; border-radius: 20px; border: 1px solid var(--color-lightgray); font-size: 0.8rem; cursor: pointer;">
<option value="score-desc">↓ GWÖ-Score</option>
<option value="score-asc">↑ GWÖ-Score</option>
<option value="date-desc">↓ Datum</option>
<option value="date-asc">↑ Datum</option>
<option value="nr-desc">↓ Nummer</option>
<option value="title-asc">A-Z Titel</option>
</select>
</div>
</div>
<div class="stats-bar" style="padding: 0.5rem 1rem; gap: 1rem; flex-wrap: wrap; align-items: center;">
@ -930,6 +938,7 @@
let selectedTags = new Set();
let allTags = {};
let currentUser = null; // #43: Auth-State
let currentSort = localStorage.getItem('sortOrder') || 'score-desc';
// #43: Auth prüfen beim Load. Steuert ob "Jetzt prüfen" aktiv ist.
async function initAuth() {
@ -955,7 +964,7 @@
loadAssessments(); // Liste neu rendern (Buttons deaktivieren)
};
// Bestehende Liste neu rendern damit Buttons aktiv werden
if (allAssessments.length > 0) renderList(allAssessments);
if (allAssessments.length > 0) renderList(sortAssessments(allAssessments));
} else {
authBtn.textContent = '🔑 Anmelden';
authBtn.style.color = '';
@ -968,6 +977,29 @@
}
}
// Sortierung (#100)
function setSortOrder(order) {
currentSort = order;
localStorage.setItem('sortOrder', order);
applyFilters();
}
function sortAssessments(items) {
const sorted = [...items];
switch (currentSort) {
case 'score-desc': return sorted.sort((a, b) => (b.gwoeScore || 0) - (a.gwoeScore || 0));
case 'score-asc': return sorted.sort((a, b) => (a.gwoeScore || 0) - (b.gwoeScore || 0));
case 'date-desc': return sorted.sort((a, b) => (b.datum || '').localeCompare(a.datum || ''));
case 'date-asc': return sorted.sort((a, b) => (a.datum || '').localeCompare(b.datum || ''));
case 'nr-desc': return sorted.sort((a, b) => {
const na = parseInt((a.drucksache || '').split('/')[1]) || 0;
const nb = parseInt((b.drucksache || '').split('/')[1]) || 0;
return nb - na;
});
case 'title-asc': return sorted.sort((a, b) => (a.title || '').localeCompare(b.title || '', 'de'));
default: return sorted;
}
}
// Hamburger-Menü schließen bei Klick außerhalb
document.addEventListener('click', (e) => {
const menu = document.getElementById('hamburger-menu');
@ -992,6 +1024,12 @@
// Load assessments on page load — localStorage-Auswahl wiederherstellen
document.addEventListener('DOMContentLoaded', () => {
initAuth(); // #43: Auth-State prüfen
// Sort-Auswahl aus localStorage wiederherstellen
const savedSort = localStorage.getItem('sortOrder');
if (savedSort) {
document.getElementById('sort-select').value = savedSort;
currentSort = savedSort;
}
const saved = localStorage.getItem('selectedBundesland');
const select = document.getElementById('bundesland-select');
if (saved) {
@ -1155,7 +1193,7 @@
const resp = await fetch(url);
allAssessments = await resp.json();
updateStats();
renderList(allAssessments);
renderList(sortAssessments(allAssessments));
buildParteienFilter();
buildTagCloud();
} catch (e) {
@ -1749,7 +1787,7 @@
);
}
renderList(filtered);
renderList(sortAssessments(filtered));
}
function setScoreFilter(filter, btn) {
@ -1779,7 +1817,7 @@
);
}
renderList(filtered);
renderList(sortAssessments(filtered));
}
function applyScoreFilter(items, filter) {