#100 Sortierung: Dropdown mit 6 Optionen (Score/Datum/Nr/Titel) + localStorage-Persistenz
This commit is contained in:
parent
8e19f6cffa
commit
cf313bd257
@ -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) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user