diff --git a/admin.html b/admin.html
index 1f7835d..c0defed 100644
--- a/admin.html
+++ b/admin.html
@@ -7,8 +7,6 @@
@@ -65,13 +71,17 @@
diff --git a/assets/js/admin.js b/assets/js/admin.js
index 125ec8e..0dad291 100644
--- a/assets/js/admin.js
+++ b/assets/js/admin.js
@@ -122,50 +122,70 @@ $(document).ready(function() {
// ==================== ORDNER-ZUWEISUNG ====================
+ var allFolders = [];
+ var assignedFolders = [];
+
function loadFolders() {
$.get('/api/admin/folders').done(function(folders) {
- $('#folder-checkboxes').empty();
- if (folders.length === 0) {
- $('#folder-checkboxes').html('
Keine Unterordner in Websitebilder gefunden. Erstelle Ordner in Nextcloud.
');
- return;
- }
- folders.forEach(function(f) {
- $('#folder-checkboxes').append(
- '
' +
- ' ' +
- ' ' + f +
- '
'
- );
- });
+ allFolders = folders;
});
}
- // Bei User-Auswahl: zugewiesene Ordner laden
+ function renderFolderTable() {
+ var $tbody = $('#folder-tbody');
+ $tbody.empty();
+ if (allFolders.length === 0) {
+ $tbody.html('
Keine Unterordner gefunden. Erstelle Ordner in Nextcloud. ');
+ return;
+ }
+ allFolders.forEach(function(f) {
+ var isAssigned = assignedFolders.indexOf(f) !== -1;
+ var cls = isAssigned ? 'folder-row assigned' : 'folder-row';
+ var statusCls = isAssigned ? 'folder-status yes' : 'folder-status no';
+ var statusText = isAssigned ? 'Zugewiesen' : '—';
+ $tbody.append(
+ '
' +
+ ' ' + f + ' ' +
+ '' + statusText + ' ' +
+ ' '
+ );
+ });
+ }
+
+ // Bei User-Auswahl: zugewiesene Ordner laden und Tabelle anzeigen
$('#user-select').change(function() {
var uid = $(this).val();
- $('.folder-cb').prop('checked', false);
- if (!uid) return;
- $.get('/api/admin/assign?user_id=' + uid).done(function(assignedFolders) {
- assignedFolders.forEach(function(f) {
- $('.folder-cb[value="' + f + '"]').prop('checked', true);
- });
+ if (!uid) {
+ $('#folder-table-wrap').hide();
+ assignedFolders = [];
+ return;
+ }
+ $.get('/api/admin/assign?user_id=' + uid).done(function(folders) {
+ assignedFolders = folders || [];
+ renderFolderTable();
+ $('#folder-table-wrap').show();
});
});
- // Zuweisung speichern
- $('#save-assignments').click(function() {
+ // Klick auf Ordner-Zeile: Toggle + sofort speichern
+ $(document).on('click', '.folder-row', function() {
var uid = $('#user-select').val();
- if (!uid) return alert('Bitte Nutzer waehlen');
- var selected = [];
- $('.folder-cb:checked').each(function() { selected.push($(this).val()); });
-
+ if (!uid) return;
+ var folder = $(this).data('folder');
+ var idx = assignedFolders.indexOf(folder);
+ if (idx !== -1) {
+ assignedFolders.splice(idx, 1);
+ } else {
+ assignedFolders.push(folder);
+ }
+ renderFolderTable();
$.ajax({
url: '/api/admin/assign',
type: 'POST',
contentType: 'application/json',
- data: JSON.stringify({ user_id: uid, folders: selected })
+ data: JSON.stringify({ user_id: uid, folders: assignedFolders })
}).done(function() {
- $('#assign-status').text('Gespeichert!').fadeIn().delay(2000).fadeOut();
+ $('#assign-status').text('Gespeichert!').show().delay(1500).fadeOut();
}).fail(function() {
alert('Fehler beim Speichern');
});
diff --git a/assets/js/admin.min.js b/assets/js/admin.min.js
index 75ddec9..9b118af 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('
Nutzer waehlen... '),e&&0!==e.length?e.forEach(function(e){var n=e.role||"unbekannt",t='
'+n+" ",a=e.created_at?new Date(e.created_at).toLocaleDateString("de-DE"):"-";if("client"===n&&e.expires_at){var r=new Date(e.expires_at).toLocaleDateString("de-DE");e.expired?(t='
abgelaufen ',a="Abgelaufen: "+r):a="Bis: "+r}var s='
PW ";s+='
X ",$("#users-tbody").append("
"+e.id+" "+e.username+" "+t+" "+n+" "+a+" "+s+" "),"admin"!==n&&$("#user-select").append('
'+e.username+" ("+n+") ")}):$("#users-tbody").html('
Keine Nutzer gefunden ')}).fail(function(e){var n="HTTP "+e.status+": "+e.statusText;$("#users-tbody").html('
Fehler beim Laden: '+n+" ")})}$.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('
'+e+"
")}):$("#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 t=$("#new-username").val().trim(),a=$("#new-password").val(),r=$("#new-role").val();t&&a?$.ajax({url:"/api/admin/users",type:"POST",contentType:"application/json",data:JSON.stringify({username:t,password:a,role:r})}).done(function(n){alert('Nutzer "'+t+'" 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,t){confirm('Nutzer "'+t+'" 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 t=prompt('Neues Passwort fuer "'+n+'":');t&&$.ajax({url:"/api/admin/users/"+e+"/password",type:"PUT",contentType:"application/json",data:JSON.stringify({new_password:t})}).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('
Nutzer waehlen... '),e&&0!==e.length?e.forEach(function(e){var t=e.role||"unbekannt",n='
'+t+" ",a=e.created_at?new Date(e.created_at).toLocaleDateString("de-DE"):"-";if("client"===t&&e.expires_at){var r=new Date(e.expires_at).toLocaleDateString("de-DE");e.expired?(n='
abgelaufen ',a="Abgelaufen: "+r):a="Bis: "+r}var s='
PW ";s+='
X ",$("#users-tbody").append("
"+e.id+" "+e.username+" "+n+" "+t+" "+a+" "+s+" "),"admin"!==t&&$("#user-select").append('
'+e.username+" ("+t+") ")}):$("#users-tbody").html('
Keine Nutzer gefunden ')}).fail(function(e){var t="HTTP "+e.status+": "+e.statusText;$("#users-tbody").html('
Fehler beim Laden: '+t+" ")})}$.get("/api/auth/me").done(function(n){"admin"!==n.role?(alert("Kein Zugriff!"),window.location.href="/"):(e(),$.get("/api/admin/folders").done(function(e){t=e}),$("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(t){t.preventDefault();var n=$("#new-username").val().trim(),a=$("#new-password").val(),r=$("#new-role").val();n&&a?$.ajax({url:"/api/admin/users",type:"POST",contentType:"application/json",data:JSON.stringify({username:n,password:a,role:r})}).done(function(t){alert('Nutzer "'+n+'" erfolgreich erstellt!'),$("#new-username").val(""),$("#new-password").val(""),e()}).fail(function(e){var t="Unbekannter Fehler";e.responseJSON&&e.responseJSON.error?t=e.responseJSON.error:e.status&&(t="HTTP "+e.status+": "+e.statusText),alert("Fehler beim Erstellen: "+t)}):alert("Bitte Username und Passwort eingeben.")}),window.deleteUser=function(t,n){confirm('Nutzer "'+n+'" wirklich loeschen?')&&$.ajax({url:"/api/admin/users/"+t,type:"DELETE"}).done(e).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})},window.changePassword=function(e,t){var n=prompt('Neues Passwort fuer "'+t+'":');n&&$.ajax({url:"/api/admin/users/"+e+"/password",type:"PUT",contentType:"application/json",data:JSON.stringify({new_password:n})}).done(function(){alert("Passwort geaendert!")}).fail(function(e){alert(e.responseJSON?e.responseJSON.error:"Fehler")})};var t=[],n=[];function a(){var e=$("#folder-tbody");e.empty(),0!==t.length?t.forEach(function(t){var a=-1!==n.indexOf(t),r=a?"folder-row assigned":"folder-row",s=a?"folder-status yes":"folder-status no",o=a?"Zugewiesen":"—";e.append('
'+t+''+o+" ")}):e.html('
Keine Unterordner gefunden. Erstelle Ordner in Nextcloud. ')}$("#user-select").change(function(){var e=$(this).val();if(!e)return $("#folder-table-wrap").hide(),void(n=[]);$.get("/api/admin/assign?user_id="+e).done(function(e){n=e||[],a(),$("#folder-table-wrap").show()})}),$(document).on("click",".folder-row",function(){var e=$("#user-select").val();if(e){var t=$(this).data("folder"),r=n.indexOf(t);-1!==r?n.splice(r,1):n.push(t),a(),$.ajax({url:"/api/admin/assign",type:"POST",contentType:"application/json",data:JSON.stringify({user_id:e,folders:n})}).done(function(){$("#assign-status").text("Gespeichert!").show().delay(1500).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