diff --git a/server/backend/internal/httpapi/manage/templates.go b/server/backend/internal/httpapi/manage/templates.go index 17a7382..9e8e888 100644 --- a/server/backend/internal/httpapi/manage/templates.go +++ b/server/backend/internal/httpapi/manage/templates.go @@ -1304,6 +1304,12 @@ const screenOverviewTmpl = ` .morz-toast { position:fixed; top:1rem; right:1rem; z-index:9999; max-width:380px; border-radius:24px; box-shadow:var(--shadow-md); padding:.75rem 1.25rem; display:flex; align-items:center; gap:.75rem; font-size:.9rem; transform:translateX(120%); transition:transform .25s ease; } .morz-toast.show { transform:translateX(0); } .morz-toast.is-success { background:#f0fdf4; color:#166534; border:1px solid #bbf7d0; } + .display-btn-row { display:flex; gap:.4rem; margin-top:.5rem; } + .bulk-bar { background:var(--surface); border-radius:var(--radius); box-shadow:var(--shadow-sm); padding:.85rem 1rem; margin-bottom:1.25rem; display:flex; align-items:center; gap:.75rem; flex-wrap:wrap; } + .display-state-badge { font-size:.7rem; padding:.15em .55em; border-radius:99px; font-weight:700; } + .display-state-badge.on { background:#dcfce7; color:#166534; } + .display-state-badge.off { background:#fee2e2; color:#991b1b; } + .display-state-badge.unknown { background:#f3f4f6; color:#6b7280; } @@ -1326,6 +1332,14 @@ const screenOverviewTmpl = `

Meine Bildschirme

+ {{if gt (len .Cards) 1}} +
+ Alle Displays: + + + +
+ {{end}}
{{range .Cards}}
@@ -1341,6 +1355,15 @@ const screenOverviewTmpl = `
{{orientationLabel .Screen.Orientation}} · {{.Screen.Slug}}
Verwalten → +
+ + {{if eq .DisplayState "on"}}An{{else if eq .DisplayState "off"}}Aus{{else}}?{{end}} + + + +
@@ -1381,6 +1404,55 @@ function injectCSRF() { }); } if (document.readyState==='loading') document.addEventListener('DOMContentLoaded',injectCSRF); else injectCSRF(); + +// ─── Display control ───────────────────────────────────────────── +function sendDisplayCmd(slug, state) { + fetch('/api/v1/screens/' + slug + '/display', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': getCsrf(), + 'X-Requested-With': 'fetch' + }, + body: JSON.stringify({state: state}) + }).then(function(r) { + var badge = document.getElementById('ds-' + slug); + if (r.ok && badge) { + badge.className = 'display-state-badge ' + state; + badge.textContent = state === 'on' ? 'An' : 'Aus'; + } + }).catch(function(){}); +} + +function bulkDisplay(state) { + var slugs = []; + document.querySelectorAll('[id^="ds-"]').forEach(function(el) { + slugs.push(el.id.replace('ds-', '')); + }); + var result = document.getElementById('bulk-result'); + var done = 0; + slugs.forEach(function(slug) { + fetch('/api/v1/screens/' + slug + '/display', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'X-CSRF-Token': getCsrf(), + 'X-Requested-With': 'fetch' + }, + body: JSON.stringify({state: state}) + }).then(function(r) { + if (r.ok) { + var badge = document.getElementById('ds-' + slug); + if (badge) { + badge.className = 'display-state-badge ' + state; + badge.textContent = state === 'on' ? 'An' : 'Aus'; + } + done++; + if (result) result.textContent = done + '/' + slugs.length + ' geschaltet'; + } + }).catch(function(){}); + }); +} `