# Dashboard-Verbesserungen – Übersicht (v0.6.2 – v0.6.7) Alle Änderungen wurden in der Session vom 2026-02-17 durchgeführt. --- ## Prio 1 – Shared `app.js` Modul (v0.6.2) **Problem:** ~360 doppelte Zeilen identischer Boilerplate-Code in allen 6 JS-Dateien (`applyTheme`, `updateNavbar`, `updateSidebar`, `escapeHtml`, Sidebar-HTML). **Lösung:** `static/js/app.js` als gemeinsames Modul: - `initPage({ onAuth })` – Auth-Check, Navbar, Sidebar, Theme, Toggle in einem Aufruf - `applyTheme(theme)` – setzt `data-bs-theme`, Icon, LocalStorage + dispatcht `themechange` CustomEvent - `escapeHtml(str)` – XSS-sichere HTML-Escape-Funktion - Sidebar wird dynamisch per `innerHTML` injiziert; aktiver Link über `window.location.pathname` **Dateien:** `static/js/app.js` (neu), alle 5 Seiten-JS-Dateien bereinigt --- ## Prio 2 – WebSocket Auth-Fix (v0.6.2) **Problem:** `initial_messages` und `new_message` WS-Events wurden an alle Clients gesendet, auch nicht eingeloggte. **Lösung:** `meshbot/webserver.py`: - `WebSocketManager` bekommt `auth_clients: set` zusätzlich zu `clients` - `broadcast_auth()` sendet nur an authentifizierte Clients - `_ws_handler`: eingeloggte User werden zu `auth_clients` hinzugefügt; `initial_messages` nur für diese - Bot nutzt `broadcast_auth("new_message", ...)` statt `broadcast` --- ## Prio 3 – Bot-Uptime & Meshtastic-Status (v0.6.4) **Problem:** Uptime nur per `?uptime`-Kommando abrufbar; kein Indikator ob Bot mit Meshtastic verbunden. **Lösung:** - `meshbot/bot.py`: `_connected`-Flag, `pubsub`-Subscription auf `meshtastic.connection.lost`, `get_uptime()`, `_broadcast_bot_status()` - `meshbot/webserver.py`: `_api_stats` liefert `uptime` + `bot_connected`; WS sendet `bot_status`-Event - Dashboard: 4. Info-Box "Uptime", zweiter Status-Dot `#meshDot` / `#meshText` in der Navbar --- ## Prio 4 – Dark Mode Kartentiles (v0.6.5) **Problem:** OpenStreetMap-Kacheln sind immer hell – passt nicht zum Dark Theme. **Lösung:** - `app.js:applyTheme()` dispatcht `themechange` CustomEvent auf `document` - `map.js`: `getTileLayer(theme)` liefert CartoDB Dark Matter (dark) oder OSM (light); `setMapTheme()` tauscht Layer live - `dashboard.js`: Node-Detail-Modal-Karte reagiert ebenfalls auf `themechange` **Dark-Tile-URL:** `https://{s}.basemaps.cartocdn.com/dark_all/{z}/{x}/{y}{r}.png` --- ## Prio 5 – Charts (v0.6.5) **Bibliothek:** Chart.js 4.4.4 (CDN in `index.html`) **3 neue Charts im Dashboard:** | Chart | Typ | Datenquelle | |-------|-----|-------------| | Kanal-Anfragen | Doughnut | `stats.channel_breakdown` (WS) | | Hop-Verteilung | Balken | `nodes`-Objekt (client-seitig) | | Hardware Top 5 | Horizontalbalken | `nodes`-Objekt (client-seitig) | **Besonderheiten:** - Charts reagieren via `themechange`-Event auf Dark/Light-Wechsel (`Chart.defaults.color`) - `initCharts()` beim Seitenstart, `updateChannelChart()` bei `stats_update`, `updateNodeCharts()` bei `renderNodes()` --- ## Prio 6 – Nodes-Tabelle Interaktivität (v0.6.5) **Neue Features in `dashboard.js` + `index.html`:** - **Suchfeld** `#nodeSearch`: filtert `long_name`, `short_name`, `hw_model`, `node_id` - **Online-Filter** `#btnOnlineOnly`: zeigt nur Nodes mit `last_seen < 15 min` - **Sortierung**: Klick auf `