Fix: Tagesübung-Scroll via _scrollTarget nach exercises-Load statt fixem Timeout — SW by-v494, APP_VER 471

This commit is contained in:
rene 2026-04-29 11:54:38 +02:00
parent 6d9f4a097e
commit 4c3638c17c
3 changed files with 19 additions and 10 deletions

View file

@ -3,7 +3,7 @@
Router, State-Management, Navigation, Initialisierung. Router, State-Management, Navigation, Initialisierung.
============================================================ */ ============================================================ */
const APP_VER = '470'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VER = '471'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
const App = (() => { const App = (() => {

View file

@ -38,6 +38,7 @@ window.Page_uebungen = (() => {
let _badgesData = null; // cached badges from /api/achievements let _badgesData = null; // cached badges from /api/achievements
let _exercisesByTab = {}; // aus API geladen let _exercisesByTab = {}; // aus API geladen
let _exercisesLoaded = false; let _exercisesLoaded = false;
let _scrollTarget = null; // { exercise_id, name } — nach _renderContent() scrollen
// ---------------------------------------------------------- // ----------------------------------------------------------
// DATEN // DATEN
@ -485,14 +486,7 @@ window.Page_uebungen = (() => {
} }
if (params.exercise_id || params.name) { if (params.exercise_id || params.name) {
setTimeout(() => { _scrollTarget = { exercise_id: params.exercise_id || '', name: params.name || '' };
// Erst per exercise_id suchen (zuverlässig), dann per Name als Fallback
const card = (params.exercise_id
? _container.querySelector(`[data-exercise-id="${CSS.escape(params.exercise_id)}"]`)
: null)
|| _container.querySelector(`[data-exercise-name="${CSS.escape(params.name || '')}"]`);
if (card) card.scrollIntoView({ behavior: 'smooth', block: 'center' });
}, 700);
} }
// Progress vom Server laden // Progress vom Server laden
@ -971,6 +965,21 @@ window.Page_uebungen = (() => {
_bindLogButtons(); _bindLogButtons();
_bindNotizButtons(); _bindNotizButtons();
if (_activeTab === 'ki-trainer') _loadKiTrainerFeedback(); if (_activeTab === 'ki-trainer') _loadKiTrainerFeedback();
_tryScrollToTarget();
}
function _tryScrollToTarget() {
if (!_scrollTarget) return;
const t = _scrollTarget;
requestAnimationFrame(() => {
const card = (t.exercise_id
? _container.querySelector('[data-exercise-id="' + CSS.escape(t.exercise_id) + '"]')
: null) || _container.querySelector('[data-exercise-name="' + CSS.escape(t.name) + '"]');
if (card) {
card.scrollIntoView({ behavior: 'smooth', block: 'center' });
_scrollTarget = null;
}
});
} }
// ---------------------------------------------------------- // ----------------------------------------------------------

View file

@ -3,7 +3,7 @@
Offline-Cache + Push Notifications + Tile-Cache Offline-Cache + Push Notifications + Tile-Cache
============================================================ */ ============================================================ */
const CACHE_VERSION = 'by-v493'; const CACHE_VERSION = 'by-v494';
const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_STATIC = `${CACHE_VERSION}-static`;
const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten