let currentUser = null; let agsCodes = []; const MAX_ALERTS = 50; const alerts = []; initPage({ onAuth: (user) => { currentUser = user; } }); // ── AGS code list ──────────────────────────────────────────────────────────── function renderAgsList() { const container = document.getElementById('agsList'); if (agsCodes.length === 0) { container.innerHTML = 'Keine AGS-Codes konfiguriert.'; return; } container.innerHTML = agsCodes.map((code, idx) => ` ${escapeHtml(code)} ` ).join(''); } function removeAgs(idx) { agsCodes.splice(idx, 1); renderAgsList(); } document.getElementById('btnAddAgs').addEventListener('click', () => { const input = document.getElementById('agsInput'); const code = input.value.trim().replace(/\D/g, ''); if (!code) return; if (code.length < 5 || code.length > 12) { input.setCustomValidity('AGS-Code muss 5–12 Stellen haben.'); input.reportValidity(); return; } input.setCustomValidity(''); if (!agsCodes.includes(code)) { agsCodes.push(code); renderAgsList(); } input.value = ''; }); document.getElementById('agsInput').addEventListener('keydown', (e) => { if (e.key === 'Enter') { e.preventDefault(); document.getElementById('btnAddAgs').click(); } }); // ── Load config ────────────────────────────────────────────────────────────── async function loadConfig() { try { const resp = await fetch('/api/nina/config'); if (!resp.ok) return; const cfg = await resp.json(); applyConfig(cfg); updateStatusBadge(cfg); } catch (e) { console.error('NINA config load failed:', e); } } function applyConfig(cfg) { document.getElementById('ninaEnabled').checked = !!cfg.enabled; document.getElementById('pollInterval').value = cfg.poll_interval ?? 300; document.getElementById('ninaChannel').value = cfg.channel ?? 0; document.getElementById('minSeverity').value = cfg.min_severity ?? 'Severe'; agsCodes = Array.isArray(cfg.ags_codes) ? [...cfg.ags_codes] : []; renderAgsList(); const src = cfg.sources ?? {}; document.getElementById('srcKatwarn').checked = src.katwarn !== false; document.getElementById('srcBiwapp').checked = src.biwapp !== false; document.getElementById('srcMowas').checked = src.mowas !== false; document.getElementById('srcDwd').checked = src.dwd !== false; document.getElementById('srcLhp').checked = src.lhp !== false; document.getElementById('srcPolice').checked = !!src.police; } function updateStatusBadge(cfg) { const badge = document.getElementById('statusBadge'); if (cfg.enabled) { const codes = Array.isArray(cfg.ags_codes) ? cfg.ags_codes.length : 0; badge.className = 'badge bg-success'; badge.textContent = `Aktiv · ${codes} Region${codes !== 1 ? 'en' : ''}`; } else { badge.className = 'badge bg-secondary'; badge.textContent = 'Deaktiviert'; } } // ── Save config ────────────────────────────────────────────────────────────── document.getElementById('btnSaveNina').addEventListener('click', async () => { const payload = { enabled: document.getElementById('ninaEnabled').checked, poll_interval: parseInt(document.getElementById('pollInterval').value) || 300, channel: parseInt(document.getElementById('ninaChannel').value) || 0, min_severity: document.getElementById('minSeverity').value, ags_codes: [...agsCodes], sources: { katwarn: document.getElementById('srcKatwarn').checked, biwapp: document.getElementById('srcBiwapp').checked, mowas: document.getElementById('srcMowas').checked, dwd: document.getElementById('srcDwd').checked, lhp: document.getElementById('srcLhp').checked, police: document.getElementById('srcPolice').checked, }, }; const statusEl = document.getElementById('saveStatus'); try { const resp = await fetch('/api/nina/config', { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload), }); if (resp.ok) { const cfg = await resp.json(); updateStatusBadge(cfg); statusEl.textContent = 'Gespeichert ✓'; statusEl.className = 'align-self-center small text-success'; statusEl.classList.remove('d-none'); setTimeout(() => statusEl.classList.add('d-none'), 3000); } else { statusEl.textContent = 'Fehler beim Speichern'; statusEl.className = 'align-self-center small text-danger'; statusEl.classList.remove('d-none'); } } catch (e) { console.error('Save failed:', e); statusEl.textContent = 'Netzwerkfehler'; statusEl.className = 'align-self-center small text-danger'; statusEl.classList.remove('d-none'); } }); // ── Alerts table ───────────────────────────────────────────────────────────── const SEV_CLASS = { Extreme: 'danger', Severe: 'warning', Moderate: 'info', Minor: 'secondary', }; const SEV_LABEL = { Extreme: 'EXTREM', Severe: 'Schwerwiegend', Moderate: 'Mäßig', Minor: 'Gering', Unknown: 'Unbekannt', }; function renderAlerts() { const tbody = document.getElementById('alertsTable'); if (alerts.length === 0) { tbody.innerHTML = '