Feature: Trauer-Feature, Futter-Verträglichkeit, Multi-Hund-Fixes, Wetter-Ort (Sprint 47)

- dog-profile.js: Verstorben-Button, Gedenkseite, KI-Abschiedstext
- database.py: futter_eintraege/reaktionen, route_dogs, exercise_progress.dog_id
- routes/ernaehrung.py: Futter-Verträglichkeit mit 20 Reaktionstypen + Analyse
- routes/routen.py: route_dogs Many-to-Many, Routen editierbar
- routes/training.py: exercise_progress per dog_id
- routes/ki.py: /ki/abschied Trauer-KI
- weather.py: Nominatim Ortsname parallel geladen
- ui.js: dogChip/bindDogChip, visualViewport-Modal
- api.js: gedenken, gedenkseite, futter-Methoden, route_dogs
- worlds.js: Ortsname im Wetter-Chip
- uebungen.js: _progressLoaded-Flag, dog-spezifischer Fortschritt
- trainingsplaene.js: dog_id Unterstützung
- diary.js/health.js: P-Badge Cleanup
- map.js: Wetter-Ort-Anzeige entfernt
- wetter.js: Ort in Wetter-Detail
This commit is contained in:
rene 2026-05-11 19:28:38 +02:00
parent 1ce802c8dc
commit bda61a0e40
16 changed files with 713 additions and 181 deletions

View file

@ -40,7 +40,8 @@ window.Page_trainingsplaene = (() => {
}
function _lsKey(planId, goalIdx) {
return `tp_${planId}_${goalIdx}`;
const dogId = _dogId() || 'x';
return `tp_d${dogId}_${planId}_${goalIdx}`;
}
function _saveGoal(key, checked) {
@ -537,6 +538,8 @@ window.Page_trainingsplaene = (() => {
// BIND EVENTS
// ----------------------------------------------------------
function _bindEvents() {
UI.bindDogChip(_container, _appState);
// Notiz-Button
const dogId = _dogId();
_container.querySelector('#tp-note-btn')?.addEventListener('click', e => {
@ -612,8 +615,9 @@ window.Page_trainingsplaene = (() => {
: `Erwachsener Hund ${_activeAdultTab}`;
_container.innerHTML = `
<div style="padding-bottom:var(--space-8)">
<div style="display:flex;align-items:center;justify-content:space-between;margin:var(--space-4) 0 var(--space-4)">
<div style="padding:var(--space-4) var(--space-4) var(--space-8)">
${UI.dogChip(_appState)}
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-4)">
<h2 style="font-size:var(--text-lg);font-weight:700;margin:0">
${_icon('clipboard-text')} Trainingspläne
</h2>