From c025da85c164980c838e5d0505b7a88b5c3c0dbd Mon Sep 17 00:00:00 2001 From: Jared Vititoe Date: Wed, 29 Apr 2026 17:50:00 -0400 Subject: [PATCH] Audit quick wins: null guard, API error toasts, aria-labels on suppress buttons - app.js: guard events array with || [] before .filter() to prevent crash on null - app.js: show warning toast when /api/network or /api/status fail (was silent) - app.js: add aria-label to all dynamically-generated suppress buttons - index.html: add aria-label to server-rendered suppress buttons Co-Authored-By: Claude Sonnet 4.6 --- static/app.js | 12 +++++++----- templates/index.html | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/static/app.js b/static/app.js index 82e71ec..46fcd91 100644 --- a/static/app.js +++ b/static/app.js @@ -45,14 +45,14 @@ async function refreshAll() { updateUnifiTable(net.unifi || []); updateTopology(net.hosts || {}); } else { - console.warn('Network API failed:', netResult.reason); + showToast('Network data unavailable', 'warning'); } if (statusResult.status === 'fulfilled') { const status = statusResult.value; updateEventsTable(status.events || [], status.total_active); updateStatusBar(status.summary || {}, status.last_check || '', status.daemon_ok); } else { - console.warn('Status API failed:', statusResult.reason); + showToast('Status data unavailable', 'warning'); } } finally { if (refreshBtn) refreshBtn.classList.remove('is-loading'); @@ -153,7 +153,8 @@ function updateUnifiTable(devices) { ? `` + data-sup-detail="" + aria-label="Suppress alerts for ${lt.escHtml(d.name)}">🔕 Suppress` : ''; return ` @@ -171,7 +172,7 @@ function updateEventsTable(events, totalActive) { const wrap = document.getElementById('events-table-wrap'); if (!wrap) return; - const active = events.filter(e => e.severity !== 'info'); + const active = (events || []).filter(e => e.severity !== 'info'); if (!active.length) { wrap.innerHTML = '

No active alerts ✔

'; return; @@ -207,7 +208,8 @@ function updateEventsTable(events, totalActive) { + data-sup-detail="${lt.escHtml(e.target_detail||'')}" + aria-label="Suppress alert for ${lt.escHtml(e.target_name)}">🔕 `; }).join(''); diff --git a/templates/index.html b/templates/index.html index d7bc346..3f7a40f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -336,7 +336,7 @@ data-sup-type="{{ 'unifi_device' if e.event_type == 'unifi_device_offline' else 'interface' if e.event_type == 'interface_down' else 'host' }}" data-sup-name="{{ e.target_name }}" data-sup-detail="{{ e.target_detail or '' }}" - title="Suppress">🔕 + title="Suppress" aria-label="Suppress alert for {{ e.target_name }}">🔕 {% endif %}