Feature: Übungen Desktop 2-zeilige Tabs + globale Suche über alle Kategorien — SW by-v496, APP_VER 473
This commit is contained in:
parent
81ee1a063e
commit
a3679354c8
4 changed files with 52 additions and 15 deletions
|
|
@ -685,6 +685,20 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Übungen: Tabs auf 2 Zeilen */
|
||||||
|
#page-uebungen #ueb-tabs {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(var(--ueb-tab-cols, 5), minmax(0, 1fr));
|
||||||
|
overflow: visible;
|
||||||
|
gap: var(--space-1);
|
||||||
|
padding-bottom: var(--space-2);
|
||||||
|
}
|
||||||
|
#page-uebungen #ueb-tabs .by-tab {
|
||||||
|
justify-content: center;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
/* Karte: Legende auf 2 Zeilen
|
/* Karte: Legende auf 2 Zeilen
|
||||||
— #page-map nötig für Spezifität > .map-legend (components.css lädt später) */
|
— #page-map nötig für Spezifität > .map-legend (components.css lädt später) */
|
||||||
#page-map .map-legend {
|
#page-map .map-legend {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Router, State-Management, Navigation, Initialisierung.
|
Router, State-Management, Navigation, Initialisierung.
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const APP_VER = '472'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
const APP_VER = '473'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen
|
||||||
|
|
||||||
const App = (() => {
|
const App = (() => {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -578,8 +578,11 @@ window.Page_uebungen = (() => {
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
_container.querySelector('#ueb-quicksetup-btn').addEventListener('click', _openQuickSetupModal);
|
_container.querySelector('#ueb-quicksetup-btn').addEventListener('click', _openQuickSetupModal);
|
||||||
|
_container.querySelector('#ueb-tabs')?.style.setProperty('--ueb-tab-cols', Math.ceil(TABS.length / 2));
|
||||||
_container.querySelector('#ueb-search')?.addEventListener('input', e => {
|
_container.querySelector('#ueb-search')?.addEventListener('input', e => {
|
||||||
_searchQuery = e.target.value.trim().toLowerCase();
|
_searchQuery = e.target.value.trim().toLowerCase();
|
||||||
|
const tabs = _container.querySelector('#ueb-tabs');
|
||||||
|
if (tabs) tabs.style.display = _searchQuery ? 'none' : '';
|
||||||
_renderContent();
|
_renderContent();
|
||||||
});
|
});
|
||||||
_bindTabs();
|
_bindTabs();
|
||||||
|
|
@ -961,12 +964,15 @@ window.Page_uebungen = (() => {
|
||||||
case 'hundesport':
|
case 'hundesport':
|
||||||
case 'koerperpflege':
|
case 'koerperpflege':
|
||||||
case 'welpe-basics': {
|
case 'welpe-basics': {
|
||||||
|
if (_searchQuery) {
|
||||||
|
el.innerHTML = _renderAllResults();
|
||||||
|
} else {
|
||||||
const list = _exercisesByTab[_activeTab] || [];
|
const list = _exercisesByTab[_activeTab] || [];
|
||||||
el.innerHTML = list.length
|
const html = list.length ? _renderUebungsList(list) : '';
|
||||||
? _renderUebungsList(list)
|
el.innerHTML = html
|
||||||
: `<div style="padding:var(--space-6);text-align:center;color:var(--c-text-muted)">
|
? `<div style="padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-4)">${html}</div>`
|
||||||
${UI.icon('spinner')} Übungen werden geladen…
|
: `<div style="padding:var(--space-6);text-align:center;color:var(--c-text-muted)">${UI.icon('spinner')} Übungen werden geladen…</div>`;
|
||||||
</div>`;
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'grundlagen': el.innerHTML = _renderGrundlagen(); break;
|
case 'grundlagen': el.innerHTML = _renderGrundlagen(); break;
|
||||||
|
|
@ -1004,16 +1010,33 @@ window.Page_uebungen = (() => {
|
||||||
(u.beschreibung || '').toLowerCase().includes(_searchQuery)
|
(u.beschreibung || '').toLowerCase().includes(_searchQuery)
|
||||||
)
|
)
|
||||||
: list;
|
: list;
|
||||||
if (!filtered.length) {
|
if (!filtered.length) return '';
|
||||||
|
return filtered.map((u, i) => _renderCard(u, i)).join('');
|
||||||
|
}
|
||||||
|
|
||||||
|
function _renderAllResults() {
|
||||||
|
const q = _searchQuery;
|
||||||
|
const allExercises = Object.entries(_exercisesByTab)
|
||||||
|
.filter(([tab]) => !['grundlagen','ki-trainer'].includes(tab))
|
||||||
|
.flatMap(([, list]) => list)
|
||||||
|
.filter(u =>
|
||||||
|
u.name.toLowerCase().includes(q) ||
|
||||||
|
(u.beschreibung || '').toLowerCase().includes(q)
|
||||||
|
);
|
||||||
|
if (!allExercises.length) {
|
||||||
return `<div style="padding:var(--space-8);text-align:center;color:var(--c-text-muted)">
|
return `<div style="padding:var(--space-8);text-align:center;color:var(--c-text-muted)">
|
||||||
${UI.icon('magnifying-glass')} Keine Übungen gefunden für „${_esc(_searchQuery)}"
|
${UI.icon('magnifying-glass')} Keine Übungen gefunden für „${_esc(q)}"
|
||||||
</div>`;
|
</div>`;
|
||||||
}
|
}
|
||||||
return `
|
return `<div style="padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-4)">
|
||||||
<div style="padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-4)">
|
${allExercises.map((u, i) => `
|
||||||
${filtered.map((u, i) => _renderCard(u, i)).join('')}
|
<div>
|
||||||
</div>
|
<div style="font-size:var(--text-xs);font-weight:var(--weight-semibold);
|
||||||
`;
|
color:var(--c-text-muted);text-transform:uppercase;letter-spacing:.05em;
|
||||||
|
margin-bottom:var(--space-1);padding:0 var(--space-2)">${_esc(u.kategorie)}</div>
|
||||||
|
${_renderCard(u, i)}
|
||||||
|
</div>`).join('')}
|
||||||
|
</div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function _sessionStatsChip(tab, name) {
|
function _sessionStatsChip(tab, name) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications + Tile-Cache
|
Offline-Cache + Push Notifications + Tile-Cache
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v495';
|
const CACHE_VERSION = 'by-v496';
|
||||||
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
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue