diff --git a/backend/database.py b/backend/database.py index a522b83..8a00a29 100644 --- a/backend/database.py +++ b/backend/database.py @@ -1433,3 +1433,39 @@ def _migrate(conn_factory): ); """) logger.info("Migration: ors_daily_total erstellt.") + + # Fehlende Legacy-JS-Übungen nachträglich einfügen + import json as _json + _legacy = [ + ('trick_platz_decke', 'Platz auf Decke / Matte', 'Trick', 'leicht', '5-10 min', + 'Der Hund geht auf Kommando auf seine Decke oder Matte und legt sich hin.', + _json.dumps(['Decke auslegen', 'Hund mit Leckerli auf die Matte locken', 'Markerwort + Leckerli wenn er drauf steht', 'Platz-Signal einbauen', 'Distanz schrittweise erhöhen']), + 'Die Matte zum positiven Ort machen, nie erzwingen.'), + ('trick_suchspiel', 'Suchspiel / Nasenarbeit', 'Trick', 'leicht', '10-15 min', + 'Der Hund sucht versteckte Leckerlis per Nase — mentale Auslastung pur.', + _json.dumps(['Leckerli offen zeigen', 'Hund kurz festhalten, Leckerli verstecken', 'Freigabe-Wort und suchen lassen', 'Schwierigkeit langsam steigern']), + 'Nasenarbeit erschöpft mehr als körperliche Aktivität.'), + ('pb_nicht_springen2', 'Nicht springen / Begrüßung', 'Problemverhalten', 'leicht', '5-10 min', + 'Der Hund begrüßt Menschen ohne hochzuspringen.', + _json.dumps(['Hund ignorieren wenn er springt (Rücken zudrehen)', 'Erst belohnen wenn alle vier Pfoten am Boden', 'Gäste in die Übung einbeziehen', 'Konsequent sein']), + 'Alle Familienmitglieder müssen gleich reagieren.'), + ('pb_leinenfuehrigkeit', 'Leinenführigkeit — Nicht ziehen', 'Problemverhalten', 'mittel', '10-20 min', + 'Der Hund läuft locker an der Leine ohne zu ziehen.', + _json.dumps(['Bei Leinenzug stehen bleiben oder Richtung wechseln', 'Lockere Leine immer belohnen', 'Kurzstrecken üben, nicht lange Spaziergänge']), + 'Dauert Wochen konsequentes Üben — Geduld.'), + ('pb_bellen_klaffen', 'Bellen / Kläffen', 'Problemverhalten', 'mittel', '10 min', + 'Übermäßiges Bellen auf Kommando reduzieren.', + _json.dumps(['Auslöser identifizieren', '"Ruhig"-Kommando einführen wenn Pause entsteht', 'Ruhige Pausen direkt belohnen']), + 'Bellen nie durch Schreien lösen — das wirkt wie Mitmachen.'), + ('pb_enttriggern', 'Enttriggern / Desensibilisierung', 'Problemverhalten', 'schwer', '15-30 min', + 'Den Hund langsam an angstauslösende Reize gewöhnen — für reaktive Hunde.', + _json.dumps(['Angst-Auslöser in großer Distanz zeigen', 'Bei Ruhe belohnen (kein Stress sichtbar)', 'Distanz sehr langsam verringern', 'Niemals erzwingen']), + 'Immer unterhalb der Stressschwelle bleiben.'), + ] + for ex in _legacy: + if not conn.execute('SELECT 1 FROM training_exercises WHERE exercise_id=?', (ex[0],)).fetchone(): + conn.execute( + 'INSERT INTO training_exercises (exercise_id,name,kategorie,schwierigkeit,dauer,beschreibung,schritte,tipp) VALUES (?,?,?,?,?,?,?,?)', + ex + ) + logger.info(f"Migration: Übung '{ex[1]}' eingefügt.") diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 207f87b..5d11c09 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '471'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '472'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const App = (() => { diff --git a/backend/static/js/pages/uebungen.js b/backend/static/js/pages/uebungen.js index 921386a..6c0a276 100644 --- a/backend/static/js/pages/uebungen.js +++ b/backend/static/js/pages/uebungen.js @@ -39,6 +39,7 @@ window.Page_uebungen = (() => { let _exercisesByTab = {}; // aus API geladen let _exercisesLoaded = false; let _scrollTarget = null; // { exercise_id, name } — nach _renderContent() scrollen + let _searchQuery = ''; // aktuelle Sucheingabe // ---------------------------------------------------------- // DATEN @@ -566,10 +567,21 @@ window.Page_uebungen = (() => {
- +