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
5518064be3
Feat: APScheduler — täglich Push für Health-Erinnerungen
...
- apscheduler==3.10.4 in requirements.txt
- scheduler.py: AsyncIOScheduler, täglich 08:00 Uhr (Europe/Berlin)
- Job prüft naechstes IN (heute, in 7 Tagen, gestern):
heute → "Heute fällig", 7 Tage → Vorwarnung, gestern → Überfällig
- Nur Impfung, Entwurmung, Medikament
- misfire_grace_time=3600 (robust nach Container-Neustart)
- Scheduler start/stop im FastAPI lifespan
2026-04-13 20:49:49 +02:00
c721d051c8
Feat: Push-Notifications vollständig implementiert
...
- push.py: /vapid-key, /subscribe, /unsubscribe + send_push_to_user/all Helpers
- VAPID Keys in docker-compose.yml (Public + Private)
- Giftköder-Meldung löst automatisch Push an alle Subscriber aus
- ON CONFLICT(endpoint) für idempotentes Re-Subscribe
- Abgelaufene Subscriptions werden bei HTTP 410 auto-gelöscht
2026-04-13 20:47:51 +02:00
b8a5dc7a66
Feat: Gesundheits-Erinnerungen mit Wiederkehrend-Intervall
...
- intervall_tage Feld (monatlich/vierteljährlich/jährlich etc.)
- Impfung, Entwurmung, Medikament: Intervall-Auswahl im Formular
- Erinnerungs-Banner über den Tabs: zeigt alle Einträge die in ≤60 Tagen fällig sind
- Ampel-Farbe am linken Rand (rot=überfällig, gelb=bald, grün=ok)
- "✓ Erledigt"-Button öffnet neues Formular vorausgefüllt mit heute + nächstem Termin
- Nav-Badge (Zahl) auf Gesundheit-Icon wenn Einträge überfällig/bald fällig
- _showForm: isEdit prüft entry?.id statt !!entry (Reminder-Flow)
- SW-Cache → by-v16
2026-04-13 20:45:52 +02:00
5c178f812b
Feat: Praxis-Auswahl bei Impfung/Entwurmung/Medikament + Dokumente funktional
...
- Praxis-Dropdown als wiederverwendbare Funktion _praxisSelectField()
- Impfung, Entwurmung, Medikament: Praxis auswählbar statt Freitext
- Impfpass-Karte: zeigt Praxisname mit 🏥 Icon
- Dokumente: Öffnen-Button direkt auf der Karte (stopPropagation),
Bild-Vorschau 64px, "Noch keine Datei" wenn kein Upload
- SW-Cache → by-v15
2026-04-13 20:38:30 +02:00
40fa47efca
Fix: Tab 'Tierarzt' → 'Besuche' (Tierarzt = Praxen)
2026-04-13 20:34:08 +02:00
fc6a2db744
Fix: Kalender-Icon amber — color-scheme:light erzwingt schwarzes Icon für Filter
2026-04-13 20:33:02 +02:00
e9587d4ecd
UX: Tierarztbesuch-Tab — Praxis-Verknüpfung als Kernfunktion
...
- Formular: Praxis-Dropdown ersetzt Freitext wenn Praxen vorhanden
- Kein redundantes Freitext-Feld mehr, Ort in der Option angezeigt
- "Praxis anlegen"-Link navigiert direkt zum Praxen-Tab
- tierarzt_name wird zusätzlich als Sicherheitskopie gespeichert
- Karte: zeigt Praxisname + Ort unter dem Besuchsgrund
- Detail-Modal: Praxis mit Adresse und anklickbarer Telefonnummer
- SW-Cache → by-v12
2026-04-13 20:30:36 +02:00
d9f2e85263
Fix: Gewicht auf 2 Nachkommastellen (step 0.1 → 0.01)
2026-04-13 20:26:54 +02:00
1a5f1f7ee2
Fix: Gewicht-Eintrag schlug fehl (bezeichnung Pflichtfeld + Komma-Dezimal)
...
- health.py: bezeichnung Optional statt required (Gewicht braucht keinen Titel)
- _buildPayload: Komma → Punkt bei wert und kosten (deutsche Lokalisierung)
- Gewicht-Einträge setzen automatisch bezeichnung = "9.9 kg"
- SW-Cache → by-v10
2026-04-13 20:25:25 +02:00
75529cbdab
UX: Gewicht-Tab mit großem Chart und ohne Bezeichnungsfeld
...
- Aktuelles Gewicht groß prominent oben angezeigt
- Delta zur letzten Messung mit ▲/▼ und Farbe (grün/orange)
- SVG-Diagramm: glatte Bezier-Kurve, Gradient-Füllung, Rastlinien
- Formular: kein "Bezeichnung"-Feld mehr bei Gewicht-Einträgen
- Detail-Modal-Titel zeigt Gewichtswert statt leerer Bezeichnung
- SW-Cache → by-v9
2026-04-13 20:22:23 +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
fc0f48c6d0
Feat: Tierärzte-Verwaltung (Sprint 4)
...
Neue Praxen-Tab in Gesundheit: Tierarzt-Stammdaten (Name, Adresse,
Telefon, Notfall-Nr, E-Mail, Website, Notizen), Anruf- und
Notfall-Schnellzugriff via tel:-Links, Soft-Delete (aktiv=0) für
Praxiswechsel ohne Datenverlust. Tierarzt-Dropdown beim Eintragen
von Tierarzt-Besuchen. SW-Cache → by-v7.
2026-04-13 20:06:59 +02:00
c06d9e24a7
Fix: Klick auf aktiven Hund im Picker lädt Inhalt (setActiveDog war no-op)
2026-04-13 19:55:42 +02:00
e59b6e6e88
sw.js: Cache-Bust v5 (Gesundheit Hunde-Picker)
2026-04-13 19:50:17 +02:00
ba8ac85f0b
Gesundheit: Hunde-Picker als Einstiegsseite bei mehreren Hunden
2026-04-13 19:48:09 +02:00
1352c2f54f
sw.js: Cache-Version auf v4 (erzwingt Re-Fetch nach Picker-Feature)
2026-04-13 19:45:52 +02:00
56ab20a705
Tagebuch: Hunde-Picker als Einstiegsseite bei mehreren Hunden
2026-04-13 19:41:33 +02:00
5ecd14a625
Makefile: help-Echo Syntax-Fehler behoben
2026-04-13 19:37:23 +02:00
7963403063
Nav: Profil-Menüpunkt entfernt (erreichbar über Avatar im Header/Sidebar)
2026-04-13 19:36:34 +02:00
f81c1e30bd
Makefile: deploy nutzt Layer-Cache, deploy-clean für erzwungenen Neuaufbau
2026-04-13 19:33:34 +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
6f48ec581d
Backend Sprint 2+3: Health-Modul, Multi-Dog Tagebuch, Pillow, Migrations
...
- database.py: diary_dogs + walk_participant_dogs Tabellen, idempotente
Migration für Health-Felder (charge_nr, kosten, diagnose, …), Backfill
- routes/health.py: vollständiges Health-Modul (war Stub), CRUD für
Impfung/Entwurmung/Tierarzt/Medikament/Gewicht/Allergie/Dokument
- routes/diary.py: Multi-Dog n:m via diary_dogs (dog_ids in allen Endpoints)
- routes/dogs.py: Foto-Upload konvertiert HEIC/PNG/WebP → JPEG via Pillow
- routes/poison.py: Resolve mit Grundauswahl + Soft-Delete (geloest_von/at/grund)
- ki.py: health_summary() für KI-Gesundheitsbericht
- main.py: /favicon.ico Route
- requirements.txt: Pillow 11.2.1 + pillow-heif 0.22.0
2026-04-13 19:29:51 +02:00
96e7a97b52
Infra: Container-Name ban-yaro→banyaro, Favicon-Route, Cache-Bust v3
...
- Makefile + docker-compose.yml: container_name ban-yaro → banyaro
- sw.js: Cache-Version auf by-v3 (neue Icons + Health-Assets)
- .gitignore: /icons/ (Design-Quell-Dateien) ausschließen
2026-04-13 19:29:43 +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
c37befd82b
Makefile: Hinweis dass sync+restart nur fuer Python reicht
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:19:52 +02:00
5000d8ff9f
leaflet.js: Attribution-Control-Hook deaktiviert
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:17:19 +02:00
ba7a91ae2b
leaflet.js/css: Attribution + ukrainische Flagge entfernt
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:15:43 +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
2baba57941
Karte: Attribution per style-Injection verstecken (cache-sicher)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:06:23 +02:00
a256568c0c
Karte: Attribution per JS aus DOM entfernen
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:05:35 +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
67eb515c35
Karte: CSS-Load abwarten + invalidateSize (schwarze Karte fix)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:03:56 +02:00
85bab155cb
Karte: Leaflet-Attribution vollstaendig entfernen
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:01:52 +02:00
7358a28cc7
Karte: Leaflet-Attribution entfernen, nur OSM-Text
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 18:00:37 +02:00
ea670310e2
Makefile: SERVICE-Variable fuer docker compose restart
...
CONTAINER = container_name (fuer logs/exec/ps)
SERVICE = compose-Service-Name (fuer restart)
War bisher gleich gesetzt, aber compose und container haben
unterschiedliche Namen (banyaro vs ban-yaro).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 17:58:32 +02:00
472e0dd63f
Hunde-Profil + Login/Register + Auth-Redirect
...
dog-profile.js: Profil anlegen, anzeigen, bearbeiten, Foto-Upload,
Alter-Berechnung, Löschen (mit Confirm).
settings.js: Login/Register-Tabs, Logout, Push-Subscription,
nach Login → Tagebuch oder Profil anlegen.
app.js: _onLoggedOut() leitet direkt zur Settings-Seite weiter.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 17:57:51 +02:00
cc36ead720
Sprint 2: Giftköder-Alarm (poison.py + poison.js)
...
Backend: vollständiges CRUD (list/report/confirm/resolve/photo),
Haversine-Radius-Filter, Auto-Expiry 7 Tage, Foto-Upload.
Frontend: Leaflet-Karte + Meldungsliste + GPS-Formular.
main.py: /media StaticFiles-Mount für Foto-Serving (auch Diary).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-12 17:52:21 +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
70f5eedafa
Hinweis: NPM Forward-IP muss 10.47.11.99 sein (Macvlan-Shim)
2026-04-12 17:17:03 +02:00
846511d79b
Healthcheck: / statt /api/docs (funktioniert auch ohne docs_url)
2026-04-12 17:14:01 +02:00
e466a5b4f0
Docker: voller Pfad /usr/local/bin/docker auf DS (nicht im PATH)
2026-04-12 16:57:16 +02:00
569816d9a4
COPYFILE_DISABLE=1: macOS xattr-Warnungen bei tar unterdrücken
2026-04-12 16:55:50 +02:00
3547715555
Deploy: rsync → tar+ssh (kein rsync auf DS nötig)
2026-04-12 16:51:41 +02:00
43c63f0e59
Deploy via rsync statt git auf DS — kein git auf DS nötig
2026-04-12 16:50:36 +02:00