diff --git a/public/dashboard.html b/public/dashboard.html index d5ad6db..ebdc9a7 100644 --- a/public/dashboard.html +++ b/public/dashboard.html @@ -13,7 +13,30 @@

Elemente

- + +
+
+ + + + + + +
+ + + + + + + + + + + + +
InhaltBundeslandFachVersionStufe
+

diff --git a/public/dashboard.js b/public/dashboard.js index 6108dac..34537b2 100644 --- a/public/dashboard.js +++ b/public/dashboard.js @@ -6,6 +6,14 @@ const welcomeMessage = document.getElementById("welcomeMessage"); const todosList = document.getElementById("todosList"); const errorMessage = document.getElementById("errorMessage"); const logoutBtn = document.getElementById("logoutBtn"); +// Elements UI +const elementsTbody = document.getElementById("elementsTbody"); +const filterInhalt = document.getElementById("filter-inhalt"); +const filterBundesland = document.getElementById("filter-bundesland"); +const filterFach = document.getElementById("filter-fach"); +const filterVersion = document.getElementById("filter-version"); +const filterStufe = document.getElementById("filter-stufe"); +const clearFiltersBtn = document.getElementById("clear-filters"); // Prüfe ob ein JWT vorhanden ist const token = localStorage.getItem("token"); @@ -55,4 +63,95 @@ async function loadElements() { welcomeMessage.textContent = "Willkommen zum Dashboard!"; // Rufe die Todos ab -loadTodos(); \ No newline at end of file +loadTodos(); + +// ---------- Elements: load, render, filter ---------- +let elementsData = []; + +async function loadElements() { + try { + // Route: mounted at /elements + route '/elements' => /elements/elements + const res = await authFetch('/elements/elements'); + if (!res.ok) { + errorMessage.textContent = 'Fehler beim Abrufen der Elemente.'; + return; + } + + elementsData = await res.json(); + renderElements(elementsData); + } catch (err) { + console.error('Elements Fetch Error:', err); + errorMessage.textContent = 'Serverfehler beim Laden der Elemente.'; + } +} + +function renderElements(data) { + if (!elementsTbody) return; + elementsTbody.innerHTML = ''; + + if (!Array.isArray(data) || data.length === 0) { + const tr = document.createElement('tr'); + const td = document.createElement('td'); + td.colSpan = 5; + td.textContent = 'Keine Elemente gefunden.'; + tr.appendChild(td); + elementsTbody.appendChild(tr); + return; + } + + data.forEach(el => { + const tr = document.createElement('tr'); + // Skip id; show columns in schema order + const cols = [el.inhalt, el.bundesland, el.fach, el.version, el.stufe]; + cols.forEach(val => { + const td = document.createElement('td'); + td.textContent = (val === null || val === undefined) ? '' : String(val); + tr.appendChild(td); + }); + elementsTbody.appendChild(tr); + }); +} + +function applyFilters() { + if (!elementsData || elementsData.length === 0) return renderElements([]); + + const fInhalt = (filterInhalt?.value || '').trim().toLowerCase(); + const fBund = (filterBundesland?.value || '').trim().toLowerCase(); + const fFach = (filterFach?.value || '').trim().toLowerCase(); + const fVer = (filterVersion?.value || '').trim().toLowerCase(); + const fSt = (filterStufe?.value || '').trim(); + + const filtered = elementsData.filter(el => { + if (fInhalt && !(el.inhalt || '').toLowerCase().includes(fInhalt)) return false; + if (fBund && !(el.bundesland || '').toLowerCase().includes(fBund)) return false; + if (fFach && !(el.fach || '').toLowerCase().includes(fFach)) return false; + if (fVer && !(el.version || '').toLowerCase().includes(fVer)) return false; + if (fSt) { + const n = Number(fSt); + if (!Number.isNaN(n)) { + if (Number(el.stufe) !== n) return false; + } else { + // non-numeric filter: substring match + if (!(String(el.stufe) || '').includes(fSt)) return false; + } + } + return true; + }); + + renderElements(filtered); +} + +function setupFilterListeners() { + const inputs = [filterInhalt, filterBundesland, filterFach, filterVersion, filterStufe]; + inputs.forEach(i => { if (i) i.addEventListener('input', applyFilters); }); + if (clearFiltersBtn) clearFiltersBtn.addEventListener('click', () => { + inputs.forEach(i => { if (i) i.value = ''; }); + applyFilters(); + }); +} + +// Initialize elements UI if present +if (elementsTbody) { + setupFilterListeners(); + loadElements(); +} \ No newline at end of file