Commit graph

253 commits

Author SHA1 Message Date
392359df45 Feature: ORS-Stats im Admin-Panel — Tagesverbrauch/2000, 30-Tage-Sparkline, Top-Nutzer — SW by-v485, APP_VER 462 2026-04-29 10:10:59 +02:00
69140a261e Fix: Exercise-Chip Click-Handler nach async Chip-Update binden — SW by-v484, APP_VER 461 2026-04-29 10:04:43 +02:00
59feecb30b Fix: Tagesbild stabil (date-seeded statt random), preview_url für schnelleres Laden — SW by-v483, APP_VER 460 2026-04-29 10:02:39 +02:00
117d32fcc3 Fix: Übung-des-Tages-Chip scrollt direkt zur Übung (kategorie + name als init-params) — SW by-v482, APP_VER 459 2026-04-29 09:39:54 +02:00
d9a0be489b Feature: Übung des Tages — personalisiert aus exercise_progress, 4. Chip auf Welcome — SW by-v481, APP_VER 458 2026-04-29 09:26:41 +02:00
7048499624 Feature: ORS-Wochenlimit (20/Woche), Tages-Cache, Privilegien-Bypass, Datenschutz-Update — SW by-v480, APP_VER 457 2026-04-29 08:23:55 +02:00
ca8bb495b0 Feature: Gassirunden-Chip auf Welcome öffnet direkt ORS-Vorschlag im Routen-Tab — SW by-v479, APP_VER 456 2026-04-29 08:18:16 +02:00
369eae5e5a Feature: Rundweg-Vorschläge via OpenRouteService — 2/4/6 km, 3 Varianten, Navigation+Speichern — SW by-v478, APP_VER 455 2026-04-29 08:04:25 +02:00
b09a569689 Fix: Welcome-Chip ohne Standort leer, Foto vertikal zentriert (object-fit) — SW by-v477, APP_VER 454 2026-04-29 07:38:39 +02:00
4e1e7ca37e Feature: Welcome-Chips — Termin nur <60 Tage, Übung des Tages als Fallback, async Gassirunde-Bank — SW by-v476, APP_VER 453 2026-04-29 07:34:22 +02:00
db386da2c0 Feature: Welcome-Dashboard für eingeloggte User — Hundefoto-Hero, Stats-Chips, Feature-Karten — SW by-v475, APP_VER 452 2026-04-29 06:35:42 +02:00
c8ae514c01 Feature: Tierschutz-Check, KI-Züchter-Features, Export, SEO-Update
Tierschutz-System (immer aktiv, nicht abschaltbar):
- welfare_check.py: regelbasierte Prüfung IK, Alter, Deckpause, Wurfanzahl, Genetik
- Grün/Gelb/Rot-Modal bei Wurf anlegen + Probeverpaarung
- Bei kritischem Befund + "Trotzdem fortfahren" → automatische Admin-Mail
- Tierschutz-Check nie durch Nutzer deaktivierbar

KI-Züchter-Features (pro User an/abschaltbar außer Tierschutz):
- routes/zucht_ki.py: 5 Endpunkte — Wurfankündigung, Genetik-Erklärung,
  Paarungsanalyse, Hund-Beschreibung, Jahresbericht
- Toggles in Einstellungen (ki_zucht_* Felder)
- KI-Buttons in litters.js + zuchthunde.js

KI-Routing: Privilegierte Rollen (Admin, Züchter, Moderator, Manager)
nutzen Claude Sonnet primär, lokales LLM als Fallback

Datenexport: routes/breeder_export.py — ZIP mit HTML-Dossier + ODS
(odfpy hinzugefügt in requirements.txt)

Admin-Profil: POST /admin/breeder/create-profile für Schnellprofil ohne
Antragsprozess; Admin-Rolle bleibt erhalten

Wurfformular: Dropdown aus Zuchtkartei für Vater/Mutter mit Auto-Fill;
litters.vater_id + mutter_id als FK auf zucht_hunde

Probeverpaarung: heart-fill Icon + Welfare-Block im Ergebnis

Landing Page: Züchter-Section + Feature-Gruppe, Meta-Tags, JSON-LD,
keywords, softwareVersion 2.1

SEO: llms.txt vollständig überarbeitet, robots.txt Züchter-Pfade,
sitemap.xml um Wurfbörse + Züchter-Profile erweitert

SW by-v474, APP_VER 451
2026-04-28 19:49:54 +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
b3d2d298dc Fix: Hero-Slide Gesundheit Infinitiv — SW by-v450, APP_VER 429 2026-04-27 19:45:18 +02:00
ddfc20b10d Feature: Phone-Frame mit 9 App-Screenshots im Hero — SW by-v449, APP_VER 428
- 9 Screenshots synchron mit Hero-Text (Fade gemeinsam)
- CSS-Phone-Frame, Statusleiste per margin-top abgeschnitten
- /img Static-Mount in main.py
- Screenshots als JPEG optimiert (8MB → 2.5MB gesamt)
- Vorladen aller Folgebilder beim Start
2026-04-27 19:38:43 +02:00
3b9f69fa0b UX: Dots→Zähler, Anmelden-Button Kontrast, Trust-Strip einzeilig — SW by-v448, APP_VER 427 2026-04-27 19:14:30 +02:00
3b222cab3d Fix: Hero-Slide Training kürzer, KI → virtueller Trainer — SW by-v447, APP_VER 426 2026-04-27 18:54:29 +02:00
5aa97d06eb Fix: Kacheln einklappbar (CSS-Spezifität), Hero-Interval 6s — SW by-v446, APP_VER 425 2026-04-27 18:51:24 +02:00
86d1642fba UX: Hero-Rotation mit 9 Themen, Kacheln einklappbar — SW by-v445, APP_VER 424
- 9 rotierende Hero-Slides (alle 4s, Fade + Dot-Indikatoren)
- Themen: Tagebuch, Karte, Gesundheit+KI, Giftköder, PWA-Erklärung,
  Routen, Gassi-Treffen, Training, Forum
- "Und noch mehr"-Kacheln standardmäßig eingeklappt (Toggle)
2026-04-27 18:47:18 +02:00
f3742ed7a9 Landing Page: neue Welcome-Seite für nicht-eingeloggte Besucher — SW by-v444, APP_VER 423
Hero mit Farbverlauf, großer Headline, primärer CTA-Button. 4 Feature-Abschnitte
(Tagebuch, Gesundheit, Community, Training). Privacy-Block in Primärfarbe.
Feature-Grid als "und noch mehr". Zweiter CTA am Ende. Eingeloggte sehen
weiterhin die kompakte Ansicht.
2026-04-27 18:28:36 +02:00
9cb4a16cc2 UX: Installationsanleitung mobile-first, alle Plattformen — SW by-v443, APP_VER 422
Alle 5 Fälle abgedeckt: Android+Prompt (Button), Android ohne Prompt (Chrome-Schritte),
iOS Safari (Teilen-Menü), iOS non-Safari (Hinweis + Link kopieren), Desktop (Tabs
Android/iOS). Steps mit Icon statt Zahl. Link-kopieren-Button für manuelle Fälle.
2026-04-27 18:22:10 +02:00
e62d94546b Rechtliches: Datenschutz + Impressum aktualisiert — SW by-v442, APP_VER 421
Impressum: TMG→DDG, OS-Plattform + VSBG-Hinweis, zweites Kontaktmedium.
DSE: privater Datenschutz-Abschnitt, KI (lokal + Claude Sonnet Fallback mit
SCCs), Push (FCM/APNS), Webcal, Referral, EXIF/GPS, Routen, Widerruf Art.7(3),
BayLDA, Passphrase statt Passwort.
2026-04-27 06:31:49 +02:00
e35a7a2692 Feature: QR-Code mit Logo im Referral-Block — SW by-v441, APP_VER 420
qrcode.min.js (qrcodejs) lazy geladen; QRCode.CorrectLevel.H damit Logo-Overlay
(icon-180.png, 36px) den Code noch lesbar lässt; App.loadScript() public gemacht.
2026-04-27 06:23:01 +02:00
b4c3698a3a Fix: Installationsanleitung scrollt direkt zur Install-Karte — SW by-v440, APP_VER 419
Klick auf "Installationsanleitung" in Settings navigiert jetzt mit params
{ install: true }, welcome.js zeigt die Karte auch bei bereits installierter
PWA und scrollt direkt dorthin.
2026-04-27 06:16:39 +02:00
664fb2a79b Admin: APP-Version + SW-Version im System-Panel — SW by-v439, APP_VER 418 2026-04-26 17:44:45 +02:00
e0c2b2bdc1 Performance: GZip, Cache-Control, WebP, SQLite-Tuning, Indizes, srcset — SW by-v438, APP_VER 417 2026-04-26 17:40:18 +02:00
5bd07d9598 Media-Previews: _preview.jpg bei Upload, alle Listenansichten — SW by-v437, APP_VER 416
- media_utils: generate_preview() (Pillow, max 800px, JPEG q72) + preview_url_from()
- diary.py: Preview beim Bild-Upload, preview_url in media_items + cover_preview_url
  in Kalender-, Karten- und Listenabfragen
- forum.py: Preview in _save_upload(), foto_preview_url in Thread-Listen
- Frontend diary.js: cover_preview_url in Listenansicht, Mediengalerie, Kalender,
  Karten-Marker + Popup; onerror-Fallback auf Original
- Frontend forum.js: foto_preview_url in Thread-Karten-Thumbnails
- Admin: 'Previews generieren (Bestand)' Button → POST /admin/media/generate-previews
2026-04-26 17:30:00 +02:00
faf433f4cf Gesundheit: konsistente Phosphor-Icons, keine Emojis — SW by-v436, APP_VER 415
- Sprite: bandaids + calendar-plus hinzugefügt
- ICONS-Map: entwurmung→bandaids, medikament→pill, tierarzt→stethoscope,
  gewicht→scales, allergie→warning-circle
- Praxen: Notfall-/Anruf-Buttons mit phone/warning SVG statt Emojis
- Terminvorschlag: calendar-plus SVG statt 📅 Emoji
2026-04-26 17:20:27 +02:00
c935d3fbd4 Teil 3: Terminvorschläge + KI-Limit-Bypass für Admins/Mods — SW by-v435, APP_VER 414
- timeutils: next_appointment_slot() parst OSM opening_hours, findet Slot
- GET /health/terminvorschlaege: fällige/überfällige Einträge (30-Tage-Horizont)
  Impfung/Tierarzt nutzen Praxis-Öffnungszeiten, Rest nächster Werktag 09:00
- Frontend: Terminvorschlags-Karten, bestätigbares Modal, legt Event an
- ki.py: Admins, Moderatoren, Media Manager bypassen CLOUD_WEEKLY_LIMIT
2026-04-26 17:08:18 +02:00
570dcd4e93 KI-Tracking vollständig, Cloud-Limit 20/Woche, Statusmail täglich 06:00 — SW by-v434, APP_VER 413
- ki.complete() zählt sich selbst (user_id-Parameter, _track_usage)
- CLOUD_WEEKLY_LIMIT=20, geprüft vor jedem Cloud-Call
- user_id durchgereicht in health, diary, knigge, notes, ki-route
- Admin-Panel: 7-Tage-Ansicht, Limit-Info, Top-Cloud-User-Tabelle
- Statusmail täglich 06:00 CEST statt alle 2h
2026-04-26 17:01:05 +02:00
85836e4e6e Scheduler aufräumen: Prewarm-Job entfernt, Rassen-Seed monatlich, Admin-Panel Wiki-Label — SW by-v433, APP_VER 412 2026-04-26 16:38:07 +02:00
06bd8525ed Sprint 15: Zeitzone-Fix, Gewichts-Sync, Öffnungszeiten, KI-Bericht, POI-Moderation — SW by-v432, APP_VER 411
- client_time: Browser-Lokalzeit bei allen Creates mitschicken (Tagebuch, Notizen,
  Forum, Verlorener Hund, Routen) — kein UTC-Versatz mehr bei Einträgen
- Gewicht-Sync: health typ=gewicht schreibt dogs.gewicht_kg, einmalige Migration
- Praxen: opening_hours + lat/lon/osm_id in tieraerzte-Tabelle, OSM-Nearby-Lookup,
  Öffnungszeiten in Karte und Detailansicht
- KI-Gesundheitsbericht: alle 2 Wochen automatisch, ki_health_reports-Tabelle,
  Frontend-Banner mit Archiv (letzten 5 Berichte)
- POI-Korrekturen: User schlägt Öffnungszeiten-Änderung vor, Moderatoren-Tab
  genehmigt/lehnt ab, user_edited-Flag schützt vor Overpass-Überschreibung
- timeutils.py: safe_client_time() zentral für alle Routen
2026-04-26 15:38:50 +02:00
679dbdd862 Datenschutz-Hinweis: wegklickbar (localStorage), Notes Mobile-sichtbar — SW by-v429 2026-04-26 11:18:48 +02:00
016eb52d83 Sprint 14: Multi-Fix-Batch — SW by-v428, APP_VER 407
KI/Symptom-Check: JSON-Code-Fence stripping in ki.py, Dringlichkeit-Map mit Phosphor-Icons
Gewicht-Sync: health.js aktualisiert appState.activeDog.gewicht_kg auch bei Bearbeitung
Giftköder: icon:'check-circle' → UI.icon('check-circle') in emptyState-Call
Forum-Pills: overflow:hidden + text-overflow:ellipsis auf Desktop und Mobile
Moderation: Admins für Moderatoren unsichtbar, keine Aktions-Buttons auf Admins
Notizblock: Filter-Chips wrap 2-zeilig auf Desktop (min-width:1024px)
Tagebuch: Datenschutz-Hinweis "nur du kannst sie sehen", Sitter sieht keine bestehenden Einträge
diary.py: Sitter-Zugriff gibt leere Liste zurück (GET), Erstellen bleibt erlaubt
2026-04-26 11:06:59 +02:00
02120bb532 Notizblock: Notiz-Button für 6 neue Bereiche + RUBRIKEN + Datenschutz — SW by-v425
Neue Notiz-Buttons:
- Tagebuch: in der Detail-Ansicht (nicht Edit-Form)
- Trainingspläne: im Plan-Header pro Plan
- Freunde: in jedem Freund-Karten-Bereich
- Giftköder: in jedem Meldungs-Karten (private Umstände)
- Verlorener Hund: in jedem Eintrag

Notizblock:
- 4 neue RUBRIKEN: trainingsplan, friends, poison, lost
- Datenschutz-Hinweis: "Alle Notizen sind privat"
- lock-simple Icon zum Sprite hinzugefügt
2026-04-26 10:52:28 +02:00
b801571bf0 Notizblock: ph-Icon-Font → SVG-Sprite, 3 neue Sprite-Icons — SW by-v424
Alle <i class="ph ph-..."> durch <svg class="ph-icon"><use href="...">
ersetzt. Neue Icons: magnifying-glass, spinner-gap, warning-circle, note.
Spin-Animation für Ladeindikator. Search-Icon-CSS auf width/height.
2026-04-26 10:29:14 +02:00
4eb5b65b80 Notizblock: notes in pages-Objekt eingetragen — SW by-v423 2026-04-26 10:22:17 +02:00
f229f6f4d0 Knigge: Padding direkt auf Frage/Options/Bars-Elemente — SW by-v422 2026-04-26 10:11:24 +02:00
993a3b9a32 Knigge: padding space-5 (20px) statt card-body — SW by-v421 2026-04-26 10:05:52 +02:00
acf8040238 Knigge: card-body statt inline Padding — SW by-v420 2026-04-26 10:02:10 +02:00
aa49ff1f85 Knigge: Padding auf Voting/KI-Rat/Haftpflicht-Cards — SW by-v419 2026-04-26 09:50:44 +02:00
c272812661 Knigge: page-container (kein Doppel-Padding), Radfahrer-Icon, SW by-v418 2026-04-26 09:43:31 +02:00
aeed35078f Knigge: page-container + Padding — kein Rand-zu-Rand-Layout, SW by-v417 2026-04-26 09:39:32 +02:00
231f7976c5 Icons Runde 2: poison/wiki/movies/social + 16 Sprite-Icons — SW by-v416
Sprite: thermometer-hot, heartbeat, bone, lightning, plant, pill,
        circle-dashed, stethoscope, backpack (erste-hilfe),
        music-notes, lightbulb, sparkle, link-simple, globe,
        heart-straight, check-circle (social/movies)

poison.js:   → check-circle (Bestätigt-Badge, Button, Popup, Toast)
wiki.js:    📸 → camera (Community-Fotos Heading)
movies.js:  ⚠️🐾🎬 → check-circle/warning/star/paw-print/film-slate
social.js:  🎵📸🌐 Plattformen, ✓👁📌🏷🔗🤍💬↗️ → Phosphor
2026-04-26 09:36:31 +02:00
fd76eddfb9 Icons: Emoji/Unicode → Phosphor in 8 Dateien + 16 neue Sprite-Icons — SW by-v415
Sprite: arrow-up/down, bug, check-circle, ear, fish, flask, flower,
        medal, question, scissors, tent, ticket, tooth, trend-up/down

poison.js:     TYPEN (🎣☠️⚗️⚠️) → question/fish/skull/flask/warning
events.js:     TYPEN (🎪🏆🎓🐕🛍️🥇📌) → ticket/trophy/graduation-cap/dog/shopping-bag/medal/push-pin
dog-profile.js: Pflege-Emojis (✂️💅🦷👂👁🐾🦟🌸❤️🐶) → Phosphor
trainingsplaene.js: (🐶🐕🦮) → dog mit SVG-Icon
health.js:     ▲▼→ → trend-up/trend-down/arrow-right
uebungen.js:   ↑↓→★ → trend-up/trend-down/arrow-right/star
admin.js:      ✓✗ → check/x in HTML-Templates
moderation.js: ✓✗ → check/x Buttons
2026-04-26 09:26:13 +02:00
f6586c88ee Giftköder: Tiergift-Nummern raus, Erste-Hilfe-Button direkt zu Vergiftung
poison.js: nur noch Polizei 110 + Button → Erste Hilfe (Tab lebensgefahr)
erste-hilfe.js: init() akzeptiert params.tab zum direkten Tab-Sprung
SW by-v414, APP_VER 393
2026-04-26 09:04:10 +02:00
5ca522780b SW: app.js/ui.js/api.js auf Network-First — iOS cached nie alte Versionen
Cache-First für app.js führte dazu dass iOS im normalen Safari-Tab
den alten APP_VER servierte → alte Seiten-Skripte wurden geladen.
Alle Kern-JS-Dateien sind jetzt Network-First wie CSS und Seiten-Module.
SW by-v413, APP_VER 392
2026-04-26 08:56:10 +02:00
4353994c68 iOS PWA: reg.update() beim Start + visibilitychange — SW by-v412
iOS prüft im Standalone-Modus nicht automatisch ob ein neuer SW vorliegt.
reg.update() erzwingt die Prüfung beim App-Öffnen und beim Zurückkehren
aus dem Hintergrund — der bestehende controllerchange→reload greift dann.
2026-04-26 08:38:50 +02:00
1400033862 Welcome: Redesign — Hero-Gradient, Icon-Grid, luftiger — SW by-v411
- Hero: warmer Gradient-Hintergrund, großes Icon, CTA direkt darin
- Features: 4×4 Icon-Grid (Desktop 8-spaltig) statt dense Kachel-Karten
- Eingeloggte User: persönliche Begrüßung im Hero
- Install: kompakte Karte am Ende
- Burger-Hinweis entfernt (unnötig)
2026-04-26 08:35:31 +02:00
a698bec817 Desktop: Settings max-width 640→860px via page-container — SW by-v410 2026-04-26 08:30:06 +02:00