Bündel 1 aus dem Duplikat-Audit: existierende zentrale Helper nutzen
statt lokale Duplikate.
Pure Migration ohne neuen Code:
- 1167 _esc()-Aufrufe in 36 Page-Modulen migriert auf UI.escape()
- 24 lokale _esc/_escape-Definitionen entfernt
- lost.js hatte _escape() (Variante) — 17 Aufrufe ebenfalls migriert
- jobs.js + breeder.js: tote Alias-Wrapper entfernt
UI.escape() existierte schon — wurde nur überall lokal nochmal
implementiert. Funktional identisch (gleiche 4-replace-chain für
& < > ").
Tests 19/19 grün. Frontend-LOC um ~120 Zeilen reduziert.
Hinweis: _emptyState (7 Stellen) und _icon (8 Stellen) wurden NICHT
migriert — sie haben abweichende Signaturen von UI.emptyState({...})
bzw. UI.icon(name). Eigener Sprint nötig.
Beide nutzen jetzt by_last_position aus localStorage:
- wetter.js: speichert jede erfolgreiche GPS-Position; bei GPS-Fehler
(kein Netz, Permission verweigert) wird der letzte bekannte Ort
als Fallback genutzt — kein Error-Banner mehr wenn man ihn schon
einmal hatte
- offline-indicator.js: _prefetchTiles versucht erst GPS, fällt
dann auf den gespeicherten letzten Ort zurück → Step 5 wird auch
ohne aktive GPS-Permission grün, sobald Wetter (oder andere
Module) einmal eine Position eingeloggt haben
- TILE_MIN von 50 auf 20 gesenkt — 5x4 Tiles reichen für eine
brauchbare Offline-Karte im Nahbereich
- Backend: GET /api/weather/records — liest diary-Einträge mit weather_json
und berechnet Kältester/Heißester Gassi, Stürmischster Tag, Regentage
- Frontend: #wttr-records 2×2 Grid-Karten unterhalb Hunde-Wetter
(nur für eingeloggte User mit ≥3 Tagebucheinträgen mit Wetterdaten)
- SW-Version auf by-v694 erhöht, APP_VER auf 694
- Backend: Open-Meteo Forecast-Request um hourly precipitation_probability,
precipitation und weathercode erweitert; stündliche Daten werden pro Tag
gruppiert und im API-Response unter "hourly" je Tag ausgeliefert
- Frontend: Neue _renderRainTimeline()-Funktion rendert horizontale
Balken-Zeitskala für alle 24 Stunden des gewählten Tages; bei "Heute"
wird automatisch zur aktuellen Stunde gescrollt und "jetzt" hervorgehoben;
Farb-Gradient von hellgrau (<10%) bis dunkelblau (≥75%)
- SW/APP_VER/CSS auf 690 gebumpt