63ab092f5e
Feature: Tagebuch Multi-Medien (beliebig viele Fotos/Videos pro Eintrag)
...
- Backend: neue Tabelle diary_media (Migration), upload_media schreibt
jetzt in diary_media statt media_url; neuer DELETE-Endpoint
/diary/{id}/media/{media_id}; alle GET-Endpoints liefern media_items[].
- Frontend: Multi-Upload-Grid im Formular mit Vorschau und X-Button
zum Entfernen vor dem Speichern; bestehende Medien im Edit-Modus
einzeln löschbar; Detail-Ansicht zeigt horizontale Scroll-Galerie
bei mehreren Medien; Karten-Badge zeigt Anzahl bei > 1 Medium.
- Rückwärtskompatibilität: Einträge mit media_url werden weiterhin
korrekt angezeigt.
- SW by-v211, APP_VER 181
2026-04-18 18:45:48 +02:00
eb3f7b94b2
Feature: Dark Mode — System/Hell/Dunkel-Toggle in Einstellungen
...
CSS-Variablen für Dark Mode in design-system.css (system + manuell via
data-theme), Flash-freies Inline-Script in index.html, Toggle in
settings.js (by_theme in localStorage). SW by-v210, APP_VER 179.
2026-04-18 18:40:34 +02:00
eb72d6f675
Feature: Offline-Banner, Online-Toast und API-Offline-Fehlerbehandlung
...
- #offline-banner in index.html (display:none, fixed oben) mit Inline-Script für window.online/offline Events
- Wieder-online Toast via UI.toast.success
- api.js fängt network-Fehler und SW-503-Offline-Antworten ab und zeigt UI.toast.warning
- SW-Cache auf by-v210 gebumpt (api.js + components.css geändert)
2026-04-18 18:40:05 +02:00
066b722c5e
Feature: Walk-Einladungen und RSVP-System
...
Gassi-Treffen bekommen ein vollständiges Einladungs- und RSVP-System:
- Neue Tabelle walk_invitations (walk_id, user_id, status, Zeitstempel)
- Backend: /invite-candidates, /invite, /rsvp, /participants Endpoints
- Push-Notification beim Einladen
- Frontend: RSVP-Buttons (Zusagen/Vielleicht/Absagen), Teilnehmerliste
mit Avatar-Initialen und farbkodierten RSVP-Badges, Einladen-Modal
- SW by-v205, APP_VER 173
2026-04-18 14:14:31 +02:00
f8d354749d
Feature: Tagebuch Ort/POI, Foto/Video-Edit, Modal-UX, iOS-Fixes
...
Tagebuch — Ort/POI (DayOne-ähnlich):
- diary.location_name Spalte, DiaryCreate/Update mit gps_lat/lon/location_name
- GET /api/dogs/{id}/diary/nearby: Overpass + Nominatim (vor {entry_id}-Route)
- Mini-Karte im Edit-Formular: Leaflet lazy, Edit-Modus, SVG-Pin
- Meilenstein-Toggle: Button statt Checkbox, Filter in Toolbar
- Datenmigration: 97 Ort-Einträge aus text → location_name
Tagebuch — Foto/Video:
- Foto/Video im Edit: Ersetzen + Löschen, DELETE media endpoint
- Media-Picker: Kamera/Mediathek/Datei Buttons
- Video-Wiedergabe (<video controls> in Detail + Edit)
Modal-UX (alle Edit-Karten vereinheitlicht):
- Footer-Pattern: [Speichern vollbreit] / [Löschen][Abbrechen]
- diary, dog-profile, events, health, places, walks, settings, sitting
- Löschen aus Detail-Modal → Edit-Form verschoben
iOS Mobile-Fixes:
- Auto-Zoom: input/select/textarea font-size 16px !important
- Scroll-Through: html.modal-open + touch-action:none auf Overlay
- Kein position:fixed mehr auf body (kein Scroll-Sprung)
PWA & Icons:
- icon-512-any.png + icon-192-any.png (quadratisch, maskable)
- manifest.json: purpose any/maskable getrennt
- Gesundheits-Icon: syringe → first-aid
Import-Fix:
- _HTMLStripper überspringt video/audio/script → kein "Video nicht gefunden" mehr
2026-04-18 11:56:54 +02:00
89d87030a2
Sprint 19: Social, UX-Verbesserungen, Nerd2Noob-Hilfe
2026-04-17 23:53:50 +02:00
10d30bf565
Sprint 18: Lost-Dog CSS, Freunde-Aktivitäts-Feed, Events-Karte
2026-04-17 23:43:35 +02:00
cfdb3fbc19
Fix: Admin Stats-Grid 2 Spalten auf Mobile, SQL-Code umbrechend
2026-04-17 23:29:40 +02:00
bfdf6ebfae
Fix: Admin-Seite Mobile-kompatibel (Tabellen scrollbar, Filter wrap, Touch-Targets)
2026-04-17 23:25:50 +02:00
92620c2c52
Sprint 18: Notification Center, Routen entdecken, Onboarding, Admin-Erweiterungen
...
- Notifications: History-Tabelle, /api/notifications Endpoints, push.py schreibt in DB
- Notifications: Page (notifications.js) mit Badge, Typen-Icons, gelesen-Markierung
- Routen: Entdecken-Modus mit Ersteller-Anzeige, Nearby-Filter, Mine/Discover Toggle
- Onboarding: Willkommens-Modal nach Registrierung, Push-Angebot nach Login
- Admin: Scheduler-Tab (Jobs anzeigen + manuell triggern), System-Health (DB/Disk/Uptime)
- Admin: Audit-Log (wer hat was wann gemacht), erweiterte Stats (Push-Abos, aktive User, Routen)
- SW: by-v152, APP_VER 125
2026-04-17 23:21:48 +02:00
4f12c8e6a4
Fix: Foto-Editor — Prozent-Offsets (Position-Bug), Long-press, Stift-Icon
2026-04-17 23:06:24 +02:00
913cebcba1
Feature: Foto-Editor im Hundeprofil — Zoom, Drag-to-pan, Löschen
2026-04-17 23:00:21 +02:00
cb8ac8cffd
Fix: Ausweis als Fullscreen-Modal statt neuem Tab, UI.modal size-Parameter
2026-04-17 22:55:09 +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
34f29f9d0a
Sprint 15: Suche, Ausweis, Teilen, Widget
...
- Volltext-Suche im Tagebuch (LIKE über Titel/Text/Tags, Debounce 350ms)
- Digitaler Heimtierausweis als druckbare HTML-Seite (/ausweis/{dog_id})
Enthält Impfungen, Medikamente, Allergien, Tierärzte, Chip-Nr.
- Hund teilen: Einladungslink-System (dog_shares-Tabelle, /teilen/{token})
Geteilte Hunde erscheinen in der Hundeliste, Tagebuch/Gesundheit lesbar
- Widget-Seite /#widget: zufälliges Tagebuchbild + nächste Erinnerung
Als PWA-Shortcut im Manifest verankert
- SW-Cache by-v144, APP_VER 117
2026-04-17 15:51:09 +02:00
94e0ed3daa
Feature: Tagebuch-Import (NoteStation .nsx + CSV) + Transponder in Gesundheitsdaten
...
- Import-Endpoint für Synology NoteStation (.nsx): HTML→Text, GPS, Bilder, Unix-Timestamp→Datum
- Import-Endpoint für CSV (Komma/Semikolon, BOM-safe, DE-Datumsformat)
- Import-Modal im Tagebuch mit Format-Auswahl-Karten und Ergebnis-Anzeige
- Transpondernummer in Gesundheitsdaten: Anzeige + Inline-Edit via Modal
- SW-Cache by-v142
2026-04-17 15:17:56 +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
7fddfdba0b
Fix: map-fab Buttons explizit weiß (#fff) — Dark Mode machte sie schwarz
2026-04-17 10:19:09 +02:00
50ec181dba
Fix: Karte — Locate-Button CSS explizit (#fff, Inline-SVG statt Sprite-Use)
2026-04-17 10:16:09 +02:00
b58789373c
Sprint 12: UI-Vereinheitlichung + Läufigkeits-Tracker
...
- by-tabs/by-tab: einheitliche Tab/Pill-Navigation in allen Seiten
- by-section-label, by-toolbar: einheitliche Section-Labels und Toolbars
- Design-Tokens: fehlende --c-amber, --c-primary-soft ergänzt, Fallback-Werte entfernt
- sitting.js: sitting-layout für konsistentes flush-Layout (wie walks)
- Läufigkeits-Tracker: neuer Health-Tab für Hündinnen mit Zyklusvorhersage,
Timeline vergangener Läufigkeiten, Erinnerungen und auto-berechnetem Nächst-Datum
- emptyState-Bug: icon-Parameter muss SVG sein, nicht Icon-Name (dog/bell/warning gefixt)
- SW-Cache: by-v103, APP_VER: 79
2026-04-16 22:31:33 +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
d399cb84cf
Fix: Sidebar/Backdrop aus #app raus, direkt in <body>
...
#sidebar und #sidebar-backdrop waren Kinder von #app (display:flex),
was auf iOS Safari Stacking-Context-Probleme verursacht. Beide Elemente
sind jetzt direkte Kinder von <body>. _openSidebar() zurueck zur
sauberen .open-Klassen-Methode. will-change:transform entfernt.
SW by-v32 -> by-v33.
2026-04-14 17:44:46 +02:00
40b802ae86
Fix: Mobile Sidebar z-index 1000 + display:flex !important
...
Backdrop lag bei z-index 499 über der Sidebar (z-index 300 Base).
Sidebar bekommt auf Mobile z-index:1000, display:flex !important
und will-change:transform. SW by-v29 → by-v30.
2026-04-14 17:16:54 +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
e5bf841d45
Fix: Karte-Seite erhält definite Höhe für Leaflet-Tiles
...
#page-map bekommt height:100% (statt min-height), damit .page-body und
.map-full-layout eine auflösbare Höhe haben. SW by-v27 → by-v28.
2026-04-14 17:02:03 +02:00
01081fcd75
Fix: Sidebar-Drawer transform:translateX statt left (kein Konflikt mit base-rule)
2026-04-14 16:54:29 +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
5f8fd3bd51
Sprint 8: Events + Hundesitting
...
Events:
- Backend events.py: CRUD, Typen (ausstellung/training/treffen/markt/wettkampf/sonstiges)
Haversine-Filter, Monats-Gruppierung in der Liste
- Frontend events.js: Liste/Karte-Toggle, Typ-Filter-Chips, farbige Marker,
Detail-Modal, Erstellen/Bearbeiten-Formular mit GPS-Button
Hundesitting:
- Backend sitting.py: Sitter-Profile (create/update/me), Anfragen (send/accept/decline/cancel),
Inbox für Sitter, Haversine-Sortierung, Service-Filter
- Frontend sitting.js: 3 Tabs (Suchen/Profil/Anfragen), Sitter-Karten mit Distanz,
Detail-Modal + Anfrage-Formular, Profil-Verwaltung
DB: events, sitters, sitting_requests Tabellen hinzugefügt
SW-Cache: by-v21 → by-v22
2026-04-14 06:19:15 +02:00
ec17dfb029
Sprint 7: Gassi-Treffen — Meetup-Feature komplett
...
- Backend: walks.py mit allen Endpoints (CRUD, join/leave, Haversine-Filter)
- DB: walks, walk_participants, walk_participant_dogs Tabellen (bereits in database.py)
- Frontend: walks.js — Liste/Karte-Toggle, Heute/Demnächst-Gruppierung, Detail-Modal
mit Teilnehmerliste, Beitreten/Verlassen, Erstellen/Bearbeiten-Formulare
- CSS: Walks-Komponenten (Card, Date-Badge, Spots-Anzeige, Map-View)
- api.js: walks-Abschnitt (list, get, create, update, cancel, join, leave)
- SW-Cache: by-v20 → by-v21
2026-04-14 06:12:52 +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
956e34db88
UX: Formular-Buttons in Modal-Footer + Kalender-Icons amber
...
- Alle Formular-Buttons (health, praxen, diary, dog-profile, poison)
aus dem scrollbaren Body in den festen Modal-Footer verschoben
(form="form-id" Attribut, btn-Suche via document.querySelector)
- Kalender-Icon Filter korrigiert: brightness(0)+invert(0.55) vermeidet
Channel-Clipping bei sepia auf Weiß → ergibt echtes Amber (~#C4843A)
- SW-Cache: by-v18 → by-v19
2026-04-13 21:12:15 +02:00
e5492841ec
Fix: Modal-Scroll nur im Body — Header/Footer bleiben fest
2026-04-13 20:56:04 +02:00
1ad77b4366
UX: Modal-Scrollbar im Primärfarben-Stil (wie Sidebar)
2026-04-13 20:54:02 +02:00
fc6a2db744
Fix: Kalender-Icon amber — color-scheme:light erzwingt schwarzes Icon für Filter
2026-04-13 20:33:02 +02:00
dee8d10496
UX: Modal-Rand, Icon-Farben, Adresse aufgeteilt
...
- Tierarzt-Adresse: strasse / plz / ort statt einzeiligem Freitext
- Modal: Rand in Primärfarbe + kein versehentliches Schließen beim Klick auf Hintergrund
- Nav/Sidebar-Icons: inaktiv gedämpft, aktiv amber-getönt (CSS filter)
- Datums-Kalender-Icon: ebenfalls amber statt Schwarz
- SW-Cache → by-v8
2026-04-13 20:16:36 +02:00
56ab20a705
Tagebuch: Hunde-Picker als Einstiegsseite bei mehreren Hunden
2026-04-13 19:41:33 +02:00
d8b9561fff
Frontend Sprint 3+4: Dog-Switcher, Health-Seite, Multi-Dog Tagebuch
...
- app.js: vollständiger Dog-Switcher (Avatar im Header/Sidebar, Quickpicker
bei 3+ Hunden, setActiveDog, localStorage-Persistenz), iOS Ghost-Click Fix,
Loading-Guard, Logout State Reset
- index.html: Dog-Switcher HTML, Favicon-Links, Sidebar "+ Neu erstellen",
Navigation Tab Karte → Gesundheit
- health.js (neu): vollständiges Health-Frontend mit Tabs (Impfung, Entwurmung,
Tierarzt, Medikament, Gewicht-Kurve, Allergie, Dokument), Ampel-System,
KI-Zusammenfassung
- dog-profile.js: "+ Weiteren Hund anlegen" Button + _openCreateModal(),
Event-Delegation statt direkter Listener (kein Doppelaufruf)
- diary.js: Dog-Picker im Formular, Avatar-Reihe auf Karten, Dog-Chips
im Detail-Modal, dog_ids im API-Payload
- poison.js: Erledigt-Dialog mit Grundauswahl (beseitigt/fehlerhaft/anderes)
- api.js: health-Endpoints (list, create, update, delete, upload, ki)
- ui.js: confirm() Fix (resolve vor close)
- layout.css: Dog-Switcher Styles, scrollbare Sidebar-Nav, User-Item fix
- components.css: Health-Styles, Diary Dog-Picker, Ampel-Punkte, Gewicht-SVG
- icons/: Favicon-Set (ico, 16px, 32px, 180px, 192px, 512px)
2026-04-13 19:30:03 +02:00
5a0be0e886
Fix: Toasts verschwinden jetzt (doppeltes ease + Fallback-Timeout)
...
CSS: var(--transition-normal) enthielt bereits 'ease', dadurch
'toast-out 200ms ease ease' = ungueltig, animationend feuert nie.
JS: setTimeout-Fallback nach 300ms als Sicherheitsnetz.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:27:30 +02:00
d888119b10
leaflet.css: alle Attribution-Selektoren inkl. Flag auf display:none
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:13:40 +02:00
53b37e7c09
Leaflet lokal bundlen, kein CDN mehr
...
leaflet.js + leaflet.css lokal in static/, Attribution in CSS
auf display:none gesetzt. Loest CDN-SSL-Fehler + Attribution.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:11:37 +02:00
c695f5f639
CSS: Leaflet-Attribution-Control ausblenden
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:04:47 +02:00
44b1451966
Sprint 1: Tagebuch — Backend-Routes + Frontend-Modul
...
diary.py: CRUD, KI-Auto-Tags, Medien-Upload, Ownership-Check
diary.js: Timeline (nach Monat gruppiert), Erstellen/Bearbeiten/Löschen,
Foto-Upload, Meilenstein-Hervorhebung, Tags, Detail-Modal
components.css: Diary-Card-Styles (Timeline, Milestone, Foto, Tags)
2026-04-12 17:26:28 +02:00
84f49fafcf
Sprint 0: Design System, App Shell, PWA, zentrales JS-Fundament
2026-04-12 16:33:25 +02:00