#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;"> <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> <option value="">Alle Parteien</option>
</select> </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> </div>
<div class="stats-bar" style="padding: 0.5rem 1rem; gap: 1rem; flex-wrap: wrap; align-items: center;"> <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 selectedTags = new Set();
let allTags = {}; let allTags = {};
let currentUser = null; // #43: Auth-State 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. // #43: Auth prüfen beim Load. Steuert ob "Jetzt prüfen" aktiv ist.
async function initAuth() { async function initAuth() {
@ -955,7 +964,7 @@
loadAssessments(); // Liste neu rendern (Buttons deaktivieren) loadAssessments(); // Liste neu rendern (Buttons deaktivieren)
}; };
// Bestehende Liste neu rendern damit Buttons aktiv werden // Bestehende Liste neu rendern damit Buttons aktiv werden
if (allAssessments.length > 0) renderList(allAssessments); if (allAssessments.length > 0) renderList(sortAssessments(allAssessments));
} else { } else {
authBtn.textContent = '🔑 Anmelden'; authBtn.textContent = '🔑 Anmelden';
authBtn.style.color = ''; 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 // Hamburger-Menü schließen bei Klick außerhalb
document.addEventListener('click', (e) => { document.addEventListener('click', (e) => {
const menu = document.getElementById('hamburger-menu'); const menu = document.getElementById('hamburger-menu');
@ -992,6 +1024,12 @@
// Load assessments on page load — localStorage-Auswahl wiederherstellen // Load assessments on page load — localStorage-Auswahl wiederherstellen
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
initAuth(); // #43: Auth-State prüfen 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 saved = localStorage.getItem('selectedBundesland');
const select = document.getElementById('bundesland-select'); const select = document.getElementById('bundesland-select');
if (saved) { if (saved) {
@ -1155,7 +1193,7 @@
const resp = await fetch(url); const resp = await fetch(url);
allAssessments = await resp.json(); allAssessments = await resp.json();
updateStats(); updateStats();
renderList(allAssessments); renderList(sortAssessments(allAssessments));
buildParteienFilter(); buildParteienFilter();
buildTagCloud(); buildTagCloud();
} catch (e) { } catch (e) {
@ -1749,7 +1787,7 @@
); );
} }
renderList(filtered); renderList(sortAssessments(filtered));
} }
function setScoreFilter(filter, btn) { function setScoreFilter(filter, btn) {
@ -1779,7 +1817,7 @@
); );
} }
renderList(filtered); renderList(sortAssessments(filtered));
} }
function applyScoreFilter(items, filter) { function applyScoreFilter(items, filter) {