/* ============================================================ BAN YARO — Hilfe & FAQ Akkordeon-FAQ mit Suche, gruppiert nach Kategorie. ============================================================ */ window.Page_hilfe = (() => { let _container = null; let _appState = null; let _articles = []; let _search = ''; const KAT_LABEL = { installation: 'Installation & PWA', erste_schritte: 'Erste Schritte', standort: 'Standort & Wetter', account: 'Account & Passwort', features: 'Features erklärt', probleme: 'Technische Probleme', }; // ---------------------------------------------------------- async function init(container, appState) { _container = container; _appState = appState; _search = ''; _renderShell(); await _load(); } async function refresh() { await _load(); } // ---------------------------------------------------------- function _renderShell() { _container.innerHTML = `
Lade…
`; _container.querySelector('#hilfe-search').addEventListener('input', e => { _search = e.target.value.trim().toLowerCase(); _render(); }); } // ---------------------------------------------------------- async function _load() { try { _articles = await API.get('/help'); } catch { _articles = []; } _render(); } // ---------------------------------------------------------- function _render() { const el = _container.querySelector('#hilfe-articles'); if (!el) return; // Filter nach Suchbegriff const filtered = _search ? _articles.filter(a => a.frage.toLowerCase().includes(_search) || a.antwort.toLowerCase().includes(_search) ) : _articles; if (!filtered.length) { el.innerHTML = `

Keine Ergebnisse

${_search ? `Zu "${UI.escape(_search)}" wurde nichts gefunden.` : 'Noch keine FAQ-Artikel vorhanden.'}

`; return; } // Gruppieren nach Kategorie (Reihenfolge der KAT_LABEL-Keys) const katOrder = Object.keys(KAT_LABEL); const grouped = {}; for (const a of filtered) { if (!grouped[a.kategorie]) grouped[a.kategorie] = []; grouped[a.kategorie].push(a); } // Sortieren nach KAT_LABEL-Reihenfolge, dann unbekannte hinten const sortedKats = [ ...katOrder.filter(k => grouped[k]), ...Object.keys(grouped).filter(k => !katOrder.includes(k)), ]; let html = ''; for (const kat of sortedKats) { const items = grouped[kat]; const label = KAT_LABEL[kat] || kat; html += `
${UI.escape(label)}
`; for (const a of items) { const answerId = `hilfe-ans-${a.id}`; const chevronId = `hilfe-chev-${a.id}`; // Highlight Suchtreffer in der Frage const frageHtml = _search ? _highlight(a.frage, _search) : UI.escape(a.frage); // Antwort: Zeilenumbrüche in
wandeln const antwortHtml = _search ? _highlight(a.antwort, _search).replace(/\n/g, '
') : UI.escape(a.antwort).replace(/\n/g, '
'); // Bei aktiver Suche: Antwort gleich aufgeklappt const openByDefault = !!_search; html += `
${antwortHtml}
`; } html += `
`; } el.innerHTML = html; // Akkordeon-Interaktion el.querySelectorAll('.hilfe-frage-btn').forEach(btn => { btn.addEventListener('click', () => { const targetId = btn.dataset.target; const chevronId = btn.dataset.chevron; const answer = document.getElementById(targetId); const chevron = document.getElementById(chevronId); if (!answer) return; const isOpen = answer.style.maxHeight !== '0px' && answer.style.maxHeight !== ''; if (isOpen) { answer.style.maxHeight = '0'; if (chevron) chevron.style.transform = 'rotate(0deg)'; btn.setAttribute('aria-expanded', 'false'); } else { answer.style.maxHeight = '2000px'; if (chevron) chevron.style.transform = 'rotate(180deg)'; btn.setAttribute('aria-expanded', 'true'); } }); }); } // ---------------------------------------------------------- function _highlight(text, term) { if (!term) return text; const safe = term.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const re = new RegExp(`(${safe})`, 'gi'); return UI.escape(text).replace(re, '$1' ); } // ---------------------------------------------------------- return { init, refresh }; })();