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:
parent
fe2e718827
commit
175984e80f
7 changed files with 78 additions and 36 deletions
|
|
@ -3,7 +3,7 @@
|
|||
Router, State-Management, Navigation, Initialisierung.
|
||||
============================================================ */
|
||||
|
||||
const APP_VER = '468'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||
const APP_VER = '469'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||
|
||||
const App = (() => {
|
||||
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
|
|
@ -364,7 +364,8 @@ window.Page_welcome = (() => {
|
|||
${ex ? `
|
||||
<div class="wc-chip" id="wc-chip-exercise"
|
||||
data-exercise-name="${UI.escape(ex.name)}"
|
||||
data-exercise-kat="${UI.escape(ex.kategorie || '')}">
|
||||
data-exercise-kat="${UI.escape(ex.kategorie || '')}"
|
||||
data-exercise-id="${UI.escape(ex.exercise_id || '')}">
|
||||
<svg class="ph-icon wc-chip-icon" aria-hidden="true"><use href="/icons/phosphor.svg#target"></use></svg>
|
||||
<span class="wc-chip-label">Übung des Tages</span>
|
||||
<span class="wc-chip-val">${UI.escape(ex.name)}</span>
|
||||
|
|
@ -534,8 +535,9 @@ window.Page_welcome = (() => {
|
|||
if (exChip) {
|
||||
exChip.addEventListener('click', () => {
|
||||
App.navigate('uebungen', true, {
|
||||
name: exChip.dataset.exerciseName,
|
||||
kategorie: exChip.dataset.exerciseKat,
|
||||
name: exChip.dataset.exerciseName,
|
||||
kategorie: exChip.dataset.exerciseKat,
|
||||
exercise_id: exChip.dataset.exerciseId,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
@ -1154,8 +1156,9 @@ window.Page_welcome = (() => {
|
|||
if (exChip) {
|
||||
exChip.addEventListener('click', () => {
|
||||
App.navigate('uebungen', true, {
|
||||
name: exChip.dataset.exerciseName,
|
||||
kategorie: exChip.dataset.exerciseKat,
|
||||
name: exChip.dataset.exerciseName,
|
||||
kategorie: exChip.dataset.exerciseKat,
|
||||
exercise_id: exChip.dataset.exerciseId,
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue