Fix: Tagesübung nur JS-kompatible exercise_ids, Scroll per exercise_id; Landing+llms.txt Sprint-20 — SW by-v492, APP_VER 469

This commit is contained in:
rene 2026-04-29 11:34:28 +02:00
parent fe2e718827
commit 175984e80f
7 changed files with 78 additions and 36 deletions

View file

@ -448,14 +448,26 @@ window.Page_uebungen = (() => {
async function init(container, appState, params = {}) {
_container = container;
_appState = appState;
if (params.kategorie) {
// Tab aus exercise_id (JS-Format) oder kategorie ableiten
const exId = params.exercise_id || '';
if (exId) {
for (const [, tabId] of Object.entries(_KAT_TO_TAB)) {
if (exId.startsWith(tabId + '_') && _VALID_TABS.has(tabId)) {
_activeTab = tabId; break;
}
}
} else if (params.kategorie) {
const mapped = _KAT_TO_TAB[params.kategorie.toLowerCase()] || params.kategorie;
if (_VALID_TABS.has(mapped)) _activeTab = mapped;
}
_render();
if (params.name) {
if (params.exercise_id || params.name) {
setTimeout(() => {
const card = _container.querySelector(`[data-exercise-name="${CSS.escape(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);
}
@ -962,7 +974,7 @@ window.Page_uebungen = (() => {
const hasBody = u.schritte.length > 0 || u.fehler.length > 0 || u.steigerung;
return `
<div class="card" style="padding:0;overflow:hidden" data-exercise-name="${_esc(u.name)}">
<div class="card" style="padding:0;overflow:hidden" data-exercise-name="${_esc(u.name)}" data-exercise-id="${_esc(_progressKey(_activeTab, u.name))}">
<!-- Header -->
<div style="padding:var(--space-4) var(--space-4) var(--space-3)">
<!-- Zeile 1: Name + Schwierigkeits-Badge -->