$(document).ready(function() { // Auth check $.get('/api/auth/me') .done(function(user) { if(user.role !== 'admin') { alert('Kein Zugriff!'); window.location.href = '/'; } else { loadUsers(); loadFolders(); $('body').removeClass('is-preload'); } }) .fail(function() { window.location.href = '/'; }); // Logout $('#logout-btn').click(function(e) { e.preventDefault(); $.post('/api/auth/logout').done(function() { window.location.href = '/'; }); }); // ==================== NUTZER ==================== function loadUsers() { $.get('/api/admin/users').done(function(users) { $('#users-tbody').empty(); $('#user-select').html(''); if (!users || users.length === 0) { $('#users-tbody').html('Keine Nutzer gefunden'); return; } users.forEach(function(u) { var role = u.role || 'unbekannt'; var badge = '' + role + ''; var created = u.created_at ? new Date(u.created_at).toLocaleDateString('de-DE') : '-'; var info = created; if (role === 'client' && u.expires_at) { var expDate = new Date(u.expires_at).toLocaleDateString('de-DE'); if (u.expired) { badge = 'abgelaufen'; info = 'Abgelaufen: ' + expDate; } else { info = 'Bis: ' + expDate; } } var actions = ''; actions += ''; $('#users-tbody').append( '' + u.id + '' + u.username + ' ' + badge + '' + role + '' + info + '' + actions + '' ); // Dropdown fuer Ordner-Zuweisung (nur non-admin) if (role !== 'admin') { $('#user-select').append(''); } }); }).fail(function(xhr) { var msg = 'HTTP ' + xhr.status + ': ' + xhr.statusText; $('#users-tbody').html('Fehler beim Laden: ' + msg + ''); }); } // Nutzer erstellen $('#create-user-form').submit(function(e) { e.preventDefault(); 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(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); }); }); // Nutzer loeschen window.deleteUser = function(id, name) { if (confirm('Nutzer "' + name + '" wirklich loeschen?')) { $.ajax({ url: '/api/admin/users/' + id, type: 'DELETE' }) .done(loadUsers) .fail(function(err) { alert(err.responseJSON ? err.responseJSON.error : 'Fehler'); }); } }; // Passwort aendern (Admin setzt fuer anderen User) window.changePassword = function(id, name) { var newPw = prompt('Neues Passwort fuer "' + name + '":'); if (!newPw) return; $.ajax({ url: '/api/admin/users/' + id + '/password', type: 'PUT', contentType: 'application/json', data: JSON.stringify({ new_password: newPw }) }).done(function() { alert('Passwort geaendert!'); }).fail(function(err) { alert(err.responseJSON ? err.responseJSON.error : 'Fehler'); }); }; // ==================== ORDNER-ZUWEISUNG ==================== var allFolders = []; var assignedFolders = []; function loadFolders() { $.get('/api/admin/folders').done(function(folders) { allFolders = folders; }); } 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(); if (!uid) { $('#folder-table-wrap').hide(); assignedFolders = []; return; } // Ordner neu laden falls noch leer, dann Zuweisung anzeigen var showTable = function() { $.get('/api/admin/assign?user_id=' + uid).done(function(folders) { assignedFolders = folders || []; renderFolderTable(); $('#folder-table-wrap').show(); }).fail(function() { assignedFolders = []; renderFolderTable(); $('#folder-table-wrap').show(); }); }; if (allFolders.length === 0) { $.get('/api/admin/folders').done(function(folders) { allFolders = folders || []; showTable(); }).fail(function() { allFolders = []; showTable(); }); } else { showTable(); } }); // Klick auf Ordner-Zeile: Toggle + sofort speichern $(document).on('click', '.folder-row', function() { var uid = $('#user-select').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: assignedFolders }) }).done(function() { $('#assign-status').text('Gespeichert!').show().delay(1500).fadeOut(); }).fail(function() { alert('Fehler beim Speichern'); }); }); // ==================== EIGENES PASSWORT ==================== $('#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(err) { alert(err.responseJSON ? err.responseJSON.error : 'Fehler'); }); }); });