- DB: referral_code (8-stellig, eindeutig) + referred_by zu users
Bestehende User erhalten automatisch einen Code
- GET /api/auth/referral: Code, Link und Anzahl geworbener User
- POST /api/auth/register: ref_code Parameter für Zuordnung
- Settings: 'App empfehlen'-Karte mit Link, Teilen-Button und Botschafter-Badges
(Botschafter ab 1, Super ab 5, Top ab 10 Einladungen)
- app.js: ?ref=CODE aus URL in sessionStorage speichern
- APP_VER 222, SW by-v244
- friends.py: forum_threads im Activity-Feed (mit entry_id)
- Filter-Chip 'Forum' ergänzt
- Klick öffnet direkt den Forum-Thread via App.callModule('forum','openThread',id)
- Neue .forum-icon-btn CSS-Klasse: 32×32px, transparent, hover-Feedback
- Post-Aktionen: Like links, Melden/Bearbeiten/Löschen rechtsbündig gruppiert
- Thread-Footer: Löschen+Bearbeiten als Icon-Buttons, Schließen/Antworten als Text
- .forum-icon-btn--danger für rote Löschen-Buttons
- forum_reply → öffnet direkt den Forum-Thread (openThread exposed)
- walk_invite → öffnet direkt das Gassi-Treffen (openDetail exposed)
- poison_alert → öffnet direkt den Giftköder-Eintrag (openDetail exposed)
- chat_message → öffnet direkt den Chat-Thread (war schon vorhanden)
- _execNav nutzt nav.data statt nav.data?.field für konsistentes Parsing
- diary → Tagebuch, health → Gesundheit, walk → Gassi-Treffen
- Items als <button> für iOS-Tap-Zuverlässigkeit
- fr-activity-item--link mit Hover/Tap-Stil
UI.toast ist ein Objekt {success,error,info}, kein Funktion.
UI.toast?.('...','info') wirft TypeError → async handler crasht still
→ setTimeout(_execNav) wird nie ausgeführt → keine Navigation
Fix: UI.toast?.info?.(…) / UI.toast?.error?.(…)
- _parseData() flacht verschachteltes {data:{conversation_id:…}} auf
→ d.conversation_id war immer undefined wegen doppelter Verschachtelung aus push.py
- .notif-item als <button> statt <div> — iOS feuert clicks auf divs unzuverlässig
- closest() im Löschen-Handler auf button.notif-item angepasst
- Neue Tabelle health_media (Migration in database.py) analog zu diary_media
- GET-Endpoints geben media_items:[{id,url,media_type}] zurück (datei_url bleibt für Rückwärtskompatibilität)
- POST /health/{id}/media und DELETE /health/{id}/media/{media_id} Endpoints
- Multi-Upload-Bereich im Formular: Thumbnails für Bilder, PDF-Icon, X-Button zum Entfernen
- Galerie in Detailansicht: Bilder klickbar/zoombar, PDFs als Link
- CSS-Klassen health-media-grid/thumb/gallery in components.css
- SW by-v213, APP_VER 187
- 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
Alle drei Seiten haben jetzt ein debounced Suchfeld (300ms) mit
Lupe-Icon über der Liste. Die Suche filtert clientseitig:
- Routen: Name, Beschreibung, Username (bereits vorhandener State verbessert)
- Events: Titel, Ort, Beschreibung
- Places: Name, Adresse, Typ
Leerer Zustand zeigt passendes UI.emptyState() mit Suchbegriff.
SW by-v209, APP_VER 178.
Neues Seiten-Modul window.Page_onboarding mit Schritt-Indikator,
Willkommenstext, Hund-Anlegen-Formular (Name/Rasse/Geburtstag/Foto)
und Fertig-Screen mit Tagebuch-CTA. Wird nach Login bei dogs.length===0
angezeigt; localStorage-Flag by_onboarding_done verhindert Wiederholung.
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.
Nach capture-Aufnahmen erscheint Button 'Zum Fotoalbum hinzufügen'.
Nutzt Web Share API (iOS/Android) mit <a download> als Fallback.
UI.saveToAlbum() als wiederverwendbare Utility in ui.js.
SW by-v200, APP_VER 168.