9103c7950f
Feature: Generische Seiten-Hilfe (UI.pageInfo), POI Multi-Select, Tagessprüche-DB (SW by-v654)
...
- UI.pageInfo(): generische Hilfe-Funktion — erstes Öffnen zeigt Info-Banner, danach ? Button oben rechts; CSS-Klassen pinfo-*
- Übungen-Seite nutzt UI.pageInfo() als erstes Beispiel
- Karte POI: Mehrfachauswahl (außer Giftköder), Kombi-Typen entfernt, type als comma-separated im Backend
- daily_quotes Tabelle in DB (346 Einträge via import_quotes.py importiert)
- GET /widget/quote — deterministischer Tagesspruch (wechselt täglich)
2026-05-03 20:10:01 +02:00
1fdba57365
Feature: UX-Fixes — Zahnrad weg, POI-Kombi-Typen, exp-fab-Position, Welten-Config in DB (SW by-v653)
...
- worlds-settings Zahnrad komplett entfernt (war auf Mobile sichtbar, auf Desktop schon hidden)
- exp-fab: bottom jetzt calc(--nav-bottom-height + --safe-bottom + --space-2) — kein Overlap mit worlds-back auf iPhone
- Karte POI: neue Typen bank, bank_kotbeutel, bank_kotbeutel_abfall, kotbeutel_abfall (Backend + Frontend)
- Welten-Chip-Config: GET/PUT /profile/world-config, Spalte users.world_config TEXT (Migration), Sync bei Init + Speichern
2026-05-03 19:50:04 +02:00
b17b061496
Fix: Karten-Pin-Setzen erfordert Login — Weiterleitung zu Welcome
...
SW by-v573, APP_VER 550
2026-04-30 19:33:39 +02:00
91340be5a3
Feature: Vollständige Züchter-Rolle — Antrag, Würfe, Stammbaum, Genetik
...
Basis-Features (Schritte 1–11):
- Züchter-Antrag mit Dokument-Upload, Admin-Prüfung, E-Mail-Benachrichtigungen
- Öffentliches Züchter-Profil + Karten-Marker (lila, certificate-Icon)
- Wurfverwaltung: Würfe, Welpen, Gewichtsverlauf, Foto-System
- Wurfbörse (öffentlich) mit Filtersuche nach Rasse/Status
- Läufigkeits-Tracker: Deckdatum + Wurftermin (+63 Tage, nur für Züchter)
- Interessenten-Chat: Kontakt-Button in Wurfbörse und Züchter-Profil
- Sidebar-Einträge: Zuchtkartei + Wurfverwaltung für Züchter/Admin
Stammbaum & Genetik (Schritte 1–8):
- Zuchtkartei: Hunde-Stammdaten mit Vater/Mutter-Verknüpfung
- Stammbaum-Visualisierung: 4 Generationen, horizontales CSS-Grid
- Gesundheitstests (HD, ED, OCD, Augen…) mit farbigen Ergebnis-Badges
- Genetische Tests (MDR1, PRA, DM…): clear/carrier/affected
- Titel & Auszeichnungen (CAC, CACIB, IPO…)
- Probeverpaarung: IK-Berechnung nach Wright + Ampel-Bewertung
- Teilen-Link für öffentliche Hunde-Profile
- Kaufvertrag: druckbares HTML-Dokument pro Welpe
Technisch: 4 neue Route-Dateien, 5 neue Page-Module, 11 neue DB-Tabellen,
icons shield-check + certificate + tree-structure im Sprite — SW by-v465, APP_VER 444
2026-04-28 18:25:21 +02:00
6930e6f848
OSM: Auto-Retry max 3x (30/60/90s), doppelte Tile-Fetches verhindert
...
Retry-Limit verhindert Endlos-Loop. Delay wächst (30s→60s→90s) damit
mehr Tiles gecacht sein können. Kartenbewegung setzt Counter zurück.
_fetching-Set im Backend verhindert parallele Doppel-Requests pro Tile.
SW by-v407, APP_VER 387
2026-04-25 22:54:12 +02:00
66af669653
Karte: Auto-Retry nach 20s wenn 0 Marker — SW by-v407
...
Wenn der erste Scan 0 OSM-Marker liefert (Cache leer, Hintergrund-Fetch
läuft), automatisch nach 20 Sekunden nochmal scannen. User muss die
Karte nicht manuell verschieben um Marker zu sehen.
2026-04-25 22:47:25 +02:00
8d3a620275
Fix: Karte-Scan wenn Diary-Karte vorher geöffnet — SW by-v406
...
diary.js lädt Leaflet ohne MarkerCluster. Wenn der User zuerst die
Diary-Karte öffnet, findet _loadLeaflet() in map.js ein gesetztes
window.L und überspringt das Laden komplett — inklusive MarkerCluster.
L.markerClusterGroup() schlägt dann still fehl (catch { return 0; }),
und alle OSM-Layer zeigen 0 Marker.
Fix: Leaflet-Basis und MarkerCluster separat prüfen:
- window.L fehlt → lade Leaflet-Basis
- window.L.markerClusterGroup fehlt → lade MarkerCluster
2026-04-25 21:46:36 +02:00
988cffcbd4
Karte refresh(): _scheduleOsmLoad() aufrufen — OSM-Marker nach Seitenwechsel ohne Pan, SW by-v335
2026-04-24 11:19:40 +02:00
005552042d
Karte: invalidateSize() in refresh() — leere Karte nach Seitenwechsel, SW by-v334
2026-04-24 11:07:22 +02:00
c503737fb1
Desktop Tab-Grid: Gesundheit (5 Sp.), Admin (4 Sp.), Karte-Legende (8 Sp.), SW by-v332
2026-04-24 10:58:12 +02:00
7ac421fcf9
Routen-Validierung: >15 km/h Ø zählt nicht für Stats/Trophäen, SW by-v331
2026-04-24 09:46:15 +02:00
546551a8db
Zecken-Icon neu: großer Körper, kurze Beine, display:inline fix, SW by-v326
2026-04-24 08:20:25 +02:00
acd93e83e6
Zecken-Icon ohne Dreieck, kein Text, Statusleiste einzeilig (nowrap), SW by-v325
2026-04-24 08:17:48 +02:00
78d0f4289a
Zecken-Icon: SVG Warndreieck mit Zecken-Silhouette (Phosphor-Stil), SW by-v324
2026-04-24 08:14:00 +02:00
544307e443
Wetter: Regenwahrscheinlichkeit im Chip, SW by-v323
2026-04-24 08:08:20 +02:00
d72ee6f89f
Fix Wetter-API-Pfad (/api/api/ → /api/), API.weather.get(), SW by-v322
2026-04-24 08:05:44 +02:00
d32b802649
Wetter in Statusleiste (war hinter Legende versteckt), SW by-v321
2026-04-24 08:03:13 +02:00
0461f936ce
Wetter-Chip auf Karte + Bugfix private Routen zählen für km-Stats
...
- GET /api/weather?lat=&lon= (Open-Meteo, 30-min TTL-Cache)
- Zecken-Warnung regelbasiert: März–Okt + Temp > 7°C
- Karte: Wetterchip oben rechts nach GPS-Fix
- stats.py + achievements.py: is_public-Filter entfernt —
private Routen zählen jetzt für eigene km/Achievements
- SW by-v320, APP_VER 308
2026-04-24 07:59:15 +02:00
65d1cf6c7f
Navigation, Karten-FABs, Nearby-Alerts
...
- Bottom-Nav neu: Karte | Routen | + | Tagebuch | Forum
- + reduziert auf: Giftköder, Gassi-Treffen, Verlorener Hund
- Notification-Badge auf User-Avatar (Header)
- Nearby-Alerts: Nav-Leiste pulsiert rot/orange bei Giftköder/vermisstm Hund in 20km
- SW postMessage bei poison/lost_alert → sofortiger Alert-Check
- Karten-FABs: nur Marker setzen + Standort (Route aufzeichnen + Offline entfernt)
- SW by-v272, APP_VER 262
2026-04-20 19:46:34 +02:00
e56183b642
Feature: Ratings, Lightbox, Forum-Standort, Notifications, Routen-Recording, Chat-Picker
...
- Bewertungssystem (ratings.py): Sterne für Sitter/Walks/Places/Routen
- Admin: Server-Log-Viewer + OSM-Cache-Statistiken
- Chat: "Neue Nachricht"-Button mit Freundesliste-Picker
- Forum: 5 neue Kategorien, Standorteingabe (locationPicker), Absende-Toast, Lightbox
- Freunde: Aktivitäts-Filter (Chips), Freundschaftsanfrage → In-App-Notification
- Sitter: locationPicker statt manuelle Koordinateneingabe + ratingStars
- Tagebuch: Bilder-Lightbox im Detail-View, iOS-Modal-Header-Fix (90svh)
- Routen: Start/Stopp-Button wechselt Zustand, nutzt Page_map.isRecording()
- Benachrichtigungen: Delete-Button sichtbar, typ-basierte Navigation, Toast-Feedback
- OSM: globales Semaphore + 429-Retry-Logic; Scheduler: München-Umland, täglich
- SW by-v225, APP_VER 202
2026-04-19 09:40:35 +02:00
a7753c9cf5
Sprint 16: Chat-Fotos/Online/Read-Receipts, Gesundheit-Dokumente löschen, Bugfixes
...
- Chat: Foto-Versand (POST /api/chat/conversations/{id}/upload, media_url/media_type)
- Chat: Online-Indikator (last_seen Heartbeat, grüner Dot, 3min-Fenster)
- Chat: Read Receipts (read_at, Einzel-/Doppelhaken-Icons)
- Gesundheit: Dokument löschen (DELETE .../dokument, Datei + DB-Eintrag)
- Bug: events.user_id NOT NULL → nullable (Table-Recreation-Migration)
- Bug: scheduler INSERT user_id 0 → NULL
- Bug: Wikidata Rate-Limit: sleep 0.3s→1.0s, retries 2→4, exponentielles Backoff
- SW: by-v146, APP_VER 119
2026-04-17 22:38:33 +02:00
6fcf841594
Sprint 14: Map-Fixes, City-Prewarm, Dog-Animation, Scan-Flash
...
Karte:
- Frankfurt-Fallback (Zoom 10→14 flyTo) mit _frankfurtTimer-Cancel
wenn echter Standort eintrifft
- OSM-Tile-Fetch parallelisiert (asyncio.Semaphore(3))
- Bounds-Fix: invalidateSize() + pad(0.15) vor getBounds()
- map-pin-slash Icon für gesperrten Standort
- Scan-Done-Flash: Statusbar-Pill grün bei 100%
- Schnüffelhund: outer div (by-wander X) + inner SVG (by-sniff Y)
für natürlichere zweiachsige Bewegung
Backend:
- City-Prewarm-Job: ~70 deutsche Großstädte beim Start (+90s) und
wöchentlich (So 01:00), Fortschritts-Mails alle 5h an ADMIN_EMAIL
- ADMIN_EMAIL Env-Var in .env.example dokumentiert
Bugfixes:
- Profil-Edit: /api/profile → /profile (doppelter Prefix)
- Friends: Mobile-Portrait-Layout (flex-wrap, overflow-x:hidden)
- Trainingspläne: Pills text-wrap (flex + white-space:normal)
2026-04-17 14:06:10 +02:00
cd3f118113
Feature: Scan-Fortschritt als SVG-Ring um das Zoom-Statusfeld
2026-04-17 10:44:52 +02:00
49d129e00c
Feature: Scan-Fortschrittsbalken während OSM-Daten geladen werden
2026-04-17 10:39:58 +02:00
abc7e6628a
Fix: FAB-Buttons orange, Kotbeutel-Tüten-Icon + grün, Mülleimer grau
2026-04-17 10:26:59 +02:00
097295c628
Sprint 11: Freunde & Chat + Phosphor-Icon-Vollmigration
...
- Freundschaften (pending/accepted), Nutzersuche, Anfragen per Push
- Direktnachrichten mit Polling, iMessage-Stil, Deep-Links aus Push
- Alle Seiten (map, places, diary, health, dog-profile, sitting, knigge,
forum, wiki, walks) vollständig auf Phosphor-Icons migriert
- Wikidata-Rassen-Scraper (~833 neue Rassen, lokal gespiegelte Fotos)
- TheDogAPI lokal gespiegelt (169 Rassen + Fotos)
- Quiz-Result-Cards horizontal (korrekte Bildproportionen)
- SW by-v89
2026-04-15 21:33:53 +02:00
ebe4ce20cf
Sprint 10: OSM-POI-Cache, Karten-Clustering, Routen-Redesign
...
Karte (map.js):
- OSM Overpass API: Restaurants, Tierärzte, Parkplätze, Bänke, Wasserstellen
- Leaflet.markercluster für alle OSM-Layer
- Standort-Dot mit GPS-Genauigkeitskreis, Wake-Lock bei Aufzeichnung
- Community-Pins setzen/löschen, Meldungen, Crosshair-Placement
- Layer-Sichtbarkeit in localStorage (by_map_visible_v1)
Routen (routes.js + routen.py):
- Komoot-Stil: SVG-Track-Preview, Foto-Upload, Nearby-POIs im Detail-Modal
- Neue Felder: is_public, hunde_tauglichkeit, foto_urls
- Rate-Endpoint (POST /api/routes/{id}/rate)
- Foto-Upload (POST /api/routes/{id}/photo)
- Fix: json_extract $[-1] → $[#-1] (SQLite-kompatibler Pfad für letztes Element)
Backend (osm.py, database.py, scheduler.py):
- /api/osm/pois: OSM-Overpass-Cache mit Tile-Logik (14 Tage TTL)
- /api/osm/user-poi: Community-Marker CRUD
- /api/osm/report: Marker als ungültig melden
- Neue Tabellen: osm_pois, osm_tiles, user_map_pois, osm_reports
- Giftköder-Archiv-Job (täglich 03:00, soft-delete nach Ablauf)
- Giftköder-Archiv-Job als APScheduler-CronJob
UI: Orte-Menüpunkt entfernt (in Karte integriert), APP_VER auf 62
2026-04-15 16:30:10 +02:00
1c8ed88dac
Fix: Karte position:fixed + Mobile-Sidebar CSS-Kaskade
...
- .map-full-layout: position:fixed statt absolute;inset:0 mit
expliziten Offsets (header/nav/sidebar) — unabhängig von
height-Kette, überdeckt Sidebar nicht mehr
- layout.css: Mobile Drawer-CSS nach Base-#sidebar-Regel verschoben
(vorher: display:none hat gewonnen weil später im File)
- map.js: zweites invalidateSize() nach 600ms
- SW by-v28 → by-v29
2026-04-14 17:09:00 +02:00
2ff439a4e3
Fix: Karte — position:absolute;inset:0 statt height:100% (kein parent-height Problem)
2026-04-14 16:51:47 +02:00
d4c3f159d5
Fix: Karte-Höhe via JS, events Leaflet-Pfad, Hamburger-Menü mobile Drawer
2026-04-14 16:47:21 +02:00
b9df636535
Sprint 6: Karte / Orte / Routen mit GPS-Aufzeichnung
...
- backend/routes/places.py: CRUD für hundefreundliche Orte (6 Typen)
- backend/routes/routen.py: CRUD für Gassi-Routen mit GPS-Track (JSON)
- main.py: beide Router eingehängt (/api/places, /api/routes)
- api.js: places + routes erweitert (list, update, delete)
- pages/places.js: Karte + Liste, Typ-Filter, Ort anlegen/bearbeiten
- pages/routes.js: Routen entdecken + GPS-Aufzeichnung mit Stoppuhr
- pages/map.js: zentrale Übersichtskarte (Orte + Giftköder, Layer-Toggle)
- components.css: Styles für alle drei neuen Seiten
- sw.js: by-v19 → by-v20
2026-04-14 06:03:37 +02:00