From c37aa3261c003a430f7602d4fc0ce376f6395a97 Mon Sep 17 00:00:00 2001 From: Kroonk Date: Thu, 16 Apr 2026 21:40:56 +0200 Subject: [PATCH] Verbessere Nutzer-Erstellung: JSON statt URL-encoded, Erfolgs-Feedback - Sende Nutzer-Daten als JSON (konsistent mit anderen Admin-Endpoints) - Zeige Erfolgs-Alert nach Erstellung - Bessere Fehlermeldungen mit HTTP-Status - Client-side Validierung vor dem Absenden Co-Authored-By: Claude Opus 4.6 --- assets/js/admin.js | 26 +++++++++++++++++++------- assets/js/admin.min.js | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/assets/js/admin.js b/assets/js/admin.js index 01592e8..b0878ea 100644 --- a/assets/js/admin.js +++ b/assets/js/admin.js @@ -61,16 +61,28 @@ $(document).ready(function() { // Nutzer erstellen $('#create-user-form').submit(function(e) { e.preventDefault(); - $.post('/api/admin/users', { - username: $('#new-username').val(), - password: $('#new-password').val(), - role: $('#new-role').val() - }).done(function() { + var username = $('#new-username').val().trim(); + var password = $('#new-password').val(); + var role = $('#new-role').val(); + if (!username || !password) { + alert('Bitte Username und Passwort eingeben.'); + return; + } + $.ajax({ + url: '/api/admin/users', + type: 'POST', + contentType: 'application/json', + data: JSON.stringify({ username: username, password: password, role: role }) + }).done(function(data) { + alert('Nutzer "' + username + '" erfolgreich erstellt!'); $('#new-username').val(''); $('#new-password').val(''); loadUsers(); - }).fail(function(err) { - alert('Fehler: ' + (err.responseJSON ? err.responseJSON.error : 'Unbekannt')); + }).fail(function(xhr) { + var msg = 'Unbekannter Fehler'; + if (xhr.responseJSON && xhr.responseJSON.error) msg = xhr.responseJSON.error; + else if (xhr.status) msg = 'HTTP ' + xhr.status + ': ' + xhr.statusText; + alert('Fehler beim Erstellen: ' + msg); }); }); diff --git a/assets/js/admin.min.js b/assets/js/admin.min.js index 4a0f3a9..551dfef 100644 --- a/assets/js/admin.min.js +++ b/assets/js/admin.min.js @@ -1 +1 @@ -$(document).ready(function(){function e(){$.get("/api/admin/users").done(function(e){$("#users-tbody").empty(),$("#user-select").html(''),e.forEach(function(e){var n=''+e.role+"",a=e.created_at?new Date(e.created_at).toLocaleDateString("de-DE"):"-";if("client"===e.role&&e.expires_at){var t=new Date(e.expires_at).toLocaleDateString("de-DE");e.expired?(n='abgelaufen',a="Abgelaufen: "+t):a="Bis: "+t}var r='";r+='",$("#users-tbody").append(""+e.id+""+e.username+" "+n+""+e.role+""+a+""+r+""),"admin"!==e.role&&$("#user-select").append('")})})}$.get("/api/auth/me").done(function(n){"admin"!==n.role?(alert("Kein Zugriff!"),window.location.href="/"):(e(),$.get("/api/admin/folders").done(function(e){$("#folder-checkboxes").empty(),0!==e.length?e.forEach(function(e){$("#folder-checkboxes").append('
")}):$("#folder-checkboxes").html("

Keine Unterordner in Websitebilder gefunden. Erstelle Ordner in Nextcloud.

")}),$("body").removeClass("is-preload"))}).fail(function(){window.location.href="/"}),$("#logout-btn").click(function(e){e.preventDefault(),$.post("/api/auth/logout").done(function(){window.location.href="/"})}),$("#create-user-form").submit(function(n){n.preventDefault(),$.post("/api/admin/users",{username:$("#new-username").val(),password:$("#new-password").val(),role:$("#new-role").val()}).done(function(){$("#new-username").val(""),$("#new-password").val(""),e()}).fail(function(e){alert("Fehler: "+(e.responseJSON?e.responseJSON.error:"Unbekannt"))})}),window.deleteUser=function(n,a){confirm('Nutzer "'+a+'" wirklich loeschen?')&&$.ajax({url:"/api/admin/users/"+n,type:"DELETE"}).done(e).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})},window.changePassword=function(e,n){var a=prompt('Neues Passwort fuer "'+n+'":');a&&$.ajax({url:"/api/admin/users/"+e+"/password",type:"PUT",contentType:"application/json",data:JSON.stringify({new_password:a})}).done(function(){alert("Passwort geaendert!")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})},$("#user-select").change(function(){var e=$(this).val();$(".folder-cb").prop("checked",!1),e&&$.get("/api/admin/assign?user_id="+e).done(function(e){e.forEach(function(e){$('.folder-cb[value="'+e+'"]').prop("checked",!0)})})}),$("#save-assignments").click(function(){var e=$("#user-select").val();if(!e)return alert("Bitte Nutzer waehlen");var n=[];$(".folder-cb:checked").each(function(){n.push($(this).val())}),$.ajax({url:"/api/admin/assign",type:"POST",contentType:"application/json",data:JSON.stringify({user_id:e,folders:n})}).done(function(){$("#assign-status").text("Gespeichert!").fadeIn().delay(2e3).fadeOut()}).fail(function(){alert("Fehler beim Speichern")})}),$("#admin-pw-form").submit(function(e){e.preventDefault(),$.post("/api/auth/change-password",{old_password:$("#admin-pw-old").val(),new_password:$("#admin-pw-new").val()}).done(function(){alert("Passwort geaendert!"),$("#admin-pw-old, #admin-pw-new").val("")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})})}); \ No newline at end of file +$(document).ready(function(){function e(){$.get("/api/admin/users").done(function(e){$("#users-tbody").empty(),$("#user-select").html(''),e.forEach(function(e){var n=''+e.role+"",a=e.created_at?new Date(e.created_at).toLocaleDateString("de-DE"):"-";if("client"===e.role&&e.expires_at){var t=new Date(e.expires_at).toLocaleDateString("de-DE");e.expired?(n='abgelaufen',a="Abgelaufen: "+t):a="Bis: "+t}var r='";r+='",$("#users-tbody").append(""+e.id+""+e.username+" "+n+""+e.role+""+a+""+r+""),"admin"!==e.role&&$("#user-select").append('")})})}$.get("/api/auth/me").done(function(n){"admin"!==n.role?(alert("Kein Zugriff!"),window.location.href="/"):(e(),$.get("/api/admin/folders").done(function(e){$("#folder-checkboxes").empty(),0!==e.length?e.forEach(function(e){$("#folder-checkboxes").append('
")}):$("#folder-checkboxes").html("

Keine Unterordner in Websitebilder gefunden. Erstelle Ordner in Nextcloud.

")}),$("body").removeClass("is-preload"))}).fail(function(){window.location.href="/"}),$("#logout-btn").click(function(e){e.preventDefault(),$.post("/api/auth/logout").done(function(){window.location.href="/"})}),$("#create-user-form").submit(function(n){n.preventDefault();var a=$("#new-username").val().trim(),t=$("#new-password").val(),r=$("#new-role").val();a&&t?$.ajax({url:"/api/admin/users",type:"POST",contentType:"application/json",data:JSON.stringify({username:a,password:t,role:r})}).done(function(n){alert('Nutzer "'+a+'" erfolgreich erstellt!'),$("#new-username").val(""),$("#new-password").val(""),e()}).fail(function(e){var n="Unbekannter Fehler";e.responseJSON&&e.responseJSON.error?n=e.responseJSON.error:e.status&&(n="HTTP "+e.status+": "+e.statusText),alert("Fehler beim Erstellen: "+n)}):alert("Bitte Username und Passwort eingeben.")}),window.deleteUser=function(n,a){confirm('Nutzer "'+a+'" wirklich loeschen?')&&$.ajax({url:"/api/admin/users/"+n,type:"DELETE"}).done(e).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})},window.changePassword=function(e,n){var a=prompt('Neues Passwort fuer "'+n+'":');a&&$.ajax({url:"/api/admin/users/"+e+"/password",type:"PUT",contentType:"application/json",data:JSON.stringify({new_password:a})}).done(function(){alert("Passwort geaendert!")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})},$("#user-select").change(function(){var e=$(this).val();$(".folder-cb").prop("checked",!1),e&&$.get("/api/admin/assign?user_id="+e).done(function(e){e.forEach(function(e){$('.folder-cb[value="'+e+'"]').prop("checked",!0)})})}),$("#save-assignments").click(function(){var e=$("#user-select").val();if(!e)return alert("Bitte Nutzer waehlen");var n=[];$(".folder-cb:checked").each(function(){n.push($(this).val())}),$.ajax({url:"/api/admin/assign",type:"POST",contentType:"application/json",data:JSON.stringify({user_id:e,folders:n})}).done(function(){$("#assign-status").text("Gespeichert!").fadeIn().delay(2e3).fadeOut()}).fail(function(){alert("Fehler beim Speichern")})}),$("#admin-pw-form").submit(function(e){e.preventDefault(),$.post("/api/auth/change-password",{old_password:$("#admin-pw-old").val(),new_password:$("#admin-pw-new").val()}).done(function(){alert("Passwort geaendert!"),$("#admin-pw-old, #admin-pw-new").val("")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})})}); \ No newline at end of file