diff --git a/backend/static/css/components.css b/backend/static/css/components.css index 21e82de..5397526 100644 --- a/backend/static/css/components.css +++ b/backend/static/css/components.css @@ -4657,3 +4657,136 @@ textarea.form-control { } .photo-editor-empty { font-size: 5rem; color: var(--c-text-secondary); } .photo-editor-controls { width: 100%; } + +/* ------------------------------------------------------------ + Admin-Seite — Mobile-Responsive Styles + ------------------------------------------------------------ */ + +/* Tab-Leiste mit Abstand nach unten */ +.adm-tabs { + margin-bottom: var(--space-5); +} + +/* Filter-Zeile (Suche + Select / Suche + Checkbox) */ +.adm-filter-row { + display: flex; + gap: var(--space-2); + margin-bottom: var(--space-4); + flex-wrap: wrap; +} +.adm-filter-input { + flex: 1 1 160px; + min-width: 0; + padding: var(--space-2) var(--space-3); + border: 1.5px solid var(--c-border); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-family: inherit; + background: var(--c-surface); + color: var(--c-text); +} +.adm-filter-select { + flex: 0 0 auto; + padding: var(--space-2) var(--space-3); + border: 1.5px solid var(--c-border); + border-radius: var(--radius-md); + font-size: var(--text-sm); + font-family: inherit; + background: var(--c-surface); + color: var(--c-text); + max-width: 140px; +} +.adm-filter-label { + display: flex; + align-items: center; + gap: var(--space-2); + font-size: var(--text-sm); + color: var(--c-text-secondary); + white-space: nowrap; + flex-shrink: 0; +} + +/* Forum-Unternavigation scrollbar auf Mobile */ +.adm-subnav { + display: flex; + gap: var(--space-2); + margin-bottom: var(--space-4); + overflow-x: auto; + flex-wrap: nowrap; + scrollbar-width: none; + -webkit-overflow-scrolling: touch; +} +.adm-subnav::-webkit-scrollbar { display: none; } +.adm-subnav .btn { flex-shrink: 0; } + +/* Tabellen: scrollbarer Container + Card ohne overflow:hidden */ +.adm-table-card { + overflow: visible; /* Card-Schatten bleibt, overflow wird im Scroll-Container geregelt */ +} +.adm-table-scroll { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + border-radius: var(--radius-lg); /* für abgerundete Ecken bei overflow */ +} +.adm-table { + width: 100%; + border-collapse: collapse; + font-size: var(--text-sm); + min-width: 480px; /* verhindert Quetschen unter diesem Wert */ +} +.adm-th { + padding: var(--space-3) var(--space-4); + font-weight: var(--weight-semibold); + color: var(--c-text-secondary); + white-space: nowrap; +} +.adm-td { + padding: var(--space-3) var(--space-4); +} + +/* Job-ID unter dem Job-Namen: kürzen wenn zu lang */ +.adm-job-id { + font-size: var(--text-xs); + color: var(--c-text-muted); + font-weight: normal; + max-width: 180px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Trigger-Spalte in Jobs-Tabelle */ +.adm-td-trigger { + color: var(--c-text-muted); + font-size: var(--text-xs); + max-width: 160px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +/* Monospace-Badge (Audit-Log Aktion) */ +.adm-badge-mono { + font-size: var(--text-xs); + padding: 2px 7px; + border-radius: 3px; + background: var(--c-surface-2); + color: var(--c-text-secondary); + font-family: monospace; + white-space: nowrap; +} + +/* Icon-only Buttons in Tabellen: 44px Touch-Target */ +.adm-icon-btn { + min-width: 44px; + min-height: 44px; + padding: 0; +} + +/* Auf sehr kleinen Screens: Select volle Breite */ +@media (max-width: 360px) { + .adm-filter-select { + max-width: 100%; + flex-basis: 100%; + } +} diff --git a/backend/static/js/app.js b/backend/static/js/app.js index 1395dac..e161725 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 = '124'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '126'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const App = (() => { diff --git a/backend/static/js/pages/admin.js b/backend/static/js/pages/admin.js index 6fb5aec..d57670f 100644 --- a/backend/static/js/pages/admin.js +++ b/backend/static/js/pages/admin.js @@ -44,7 +44,7 @@ window.Page_admin = (() => {
-
+
${TABS.map(t => ` @@ -429,13 +425,10 @@ window.Page_admin = (() => { } else { // Threads el.innerHTML = ` -
+
-
@@ -623,39 +616,41 @@ window.Page_admin = (() => { return; } el.innerHTML = ` -
- - - - - - - - - - - ${jobs.map((j, i) => ` - - - - - +
+
+
JobNächster LaufTrigger
- ${_esc(j.name)} -
${_esc(j.id)}
-
- ${j.next_run_time ? _formatDateTime(j.next_run_time) : ''} - - ${_esc(j.trigger)} - - -
+ + + + + + - `).join('')} - -
JobNächster LaufTrigger
+ + + ${jobs.map((j, i) => ` + + + ${_esc(j.name)} +
${_esc(j.id)}
+ + + ${j.next_run_time ? _formatDateTime(j.next_run_time) : ''} + + + ${_esc(j.trigger)} + + + + + + `).join('')} + + +
`; el.querySelectorAll('.adm-job-trigger').forEach(btn => { @@ -704,39 +699,38 @@ window.Page_admin = (() => { return; } el.innerHTML = ` -
- - - - - - - - - - - ${rows.map((r, i) => ` - - - - - +
+
+
WannAdminAktionZiel
- ${_formatDateTime(r.created_at)} - - ${_esc(r.admin_name || '—')} - - - ${_esc(r.action)} - - ${r.detail ? `
${_esc(r.detail)}
` : ''} -
- ${_esc(r.target || '—')} -
+ + + + + + - `).join('')} - -
WannAdminAktionZiel
+ + + ${rows.map((r, i) => ` + + + ${_formatDateTime(r.created_at)} + + + ${_esc(r.admin_name || '—')} + + + ${_esc(r.action)} + ${r.detail ? `
${_esc(r.detail)}
` : ''} + + + ${_esc(r.target || '—')} + + + `).join('')} + + +
`; } diff --git a/backend/static/sw.js b/backend/static/sw.js index 1416b39..12cfdad 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v152'; +const CACHE_VERSION = 'by-v153'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten