diff --git a/TODO.md b/TODO.md index cdb275a..4179b1c 100644 --- a/TODO.md +++ b/TODO.md @@ -155,9 +155,9 @@ ### Niedrige Prioritaet -- [ ] Upload-Fortschrittsbalken in Manage-UI -- [ ] vars.yml Download-Button in Provision-UI statt Copy-Paste -- [ ] Toggle-Switch statt Ja/Nein-Select fuer Enabled-Feld +- [x] Upload-Fortschrittsbalken in Manage-UI +- [x] vars.yml Download-Button in Provision-UI statt Copy-Paste +- [x] Toggle-Switch statt Ja/Nein-Select fuer Enabled-Feld ## Querschnittsthemen diff --git a/server/backend/internal/httpapi/manage/templates.go b/server/backend/internal/httpapi/manage/templates.go index ac3f06a..82bc488 100644 --- a/server/backend/internal/httpapi/manage/templates.go +++ b/server/backend/internal/httpapi/manage/templates.go @@ -62,7 +62,10 @@ ansible_user: {{.SSHUser}} screen_id: {{.Screen.Slug}} screen_name: "{{.Screen.Name}}" screen_orientation: {{.Orientation}} - +
+ + +

Tipp: mkdir -p ansible/host_vars/{{.Screen.Slug}}

@@ -115,17 +118,26 @@ ansible-playbook -i ansible/inventory.yml ansible/site.yml --limit {{.Screen.Slu ` @@ -581,11 +593,11 @@ document.addEventListener('keydown', function(e) {
-
- +
+
@@ -673,7 +685,7 @@ document.addEventListener('keydown', function(e) {
-
+
@@ -698,7 +710,7 @@ document.addEventListener('keydown', function(e) {
-
@@ -706,10 +718,14 @@ document.addEventListener('keydown', function(e) {
- +
+ +
@@ -800,6 +816,62 @@ if (sortableEl) { } }); } + +// XHR-Upload mit Fortschrittsbalken +function startUpload() { + var form = document.getElementById('upload-form'); + var fileInput = document.getElementById('upload-file-input'); + var btn = document.getElementById('upload-btn'); + var progressWrap = document.getElementById('upload-progress-wrap'); + var progress = document.getElementById('upload-progress'); + var errorBox = document.getElementById('upload-error'); + + errorBox.style.display = 'none'; + + if (!fileInput.files || fileInput.files.length === 0) { + errorBox.textContent = 'Bitte zuerst eine Datei auswählen.'; + errorBox.style.display = ''; + return; + } + + var formData = new FormData(form); + var xhr = new XMLHttpRequest(); + + xhr.upload.onprogress = function(e) { + if (e.lengthComputable) { + var pct = Math.round((e.loaded / e.total) * 100); + progress.value = pct; + progress.textContent = pct + '%'; + } + }; + + xhr.onloadstart = function() { + btn.style.display = 'none'; + progressWrap.style.display = ''; + progress.value = 0; + }; + + xhr.onload = function() { + if (xhr.status >= 200 && xhr.status < 400) { + window.location.href = '/manage/{{.Screen.Slug}}?msg=uploaded'; + } else { + progressWrap.style.display = 'none'; + btn.style.display = ''; + errorBox.textContent = 'Upload fehlgeschlagen (HTTP ' + xhr.status + '): ' + xhr.responseText; + errorBox.style.display = ''; + } + }; + + xhr.onerror = function() { + progressWrap.style.display = 'none'; + btn.style.display = ''; + errorBox.textContent = 'Netzwerkfehler beim Upload. Bitte erneut versuchen.'; + errorBox.style.display = ''; + }; + + xhr.open('POST', form.action); + xhr.send(formData); +} diff --git a/server/backend/internal/httpapi/manage/ui.go b/server/backend/internal/httpapi/manage/ui.go index 747c88f..c8e8daf 100644 --- a/server/backend/internal/httpapi/manage/ui.go +++ b/server/backend/internal/httpapi/manage/ui.go @@ -411,7 +411,7 @@ func HandleUpdateItemUI(playlists *store.PlaylistStore) http.HandlerFunc { if d, err := strconv.Atoi(strings.TrimSpace(r.FormValue("duration_seconds"))); err == nil && d > 0 { durationSeconds = d } - enabled := r.FormValue("enabled") != "false" + enabled := r.FormValue("enabled") == "true" validFrom, _ := parseOptionalTime(r.FormValue("valid_from")) validUntil, _ := parseOptionalTime(r.FormValue("valid_until"))