$(document).ready(function() { var users = []; var folders = []; var assignedFolders = []; var selectedUserId = ""; $.get('/api/auth/me') .done(function(user) { if(user.role !== 'admin') { alert('Kein Zugriff!'); window.location.href = '/'; return; } refreshDashboard(); $('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 = '/'; }); }); function refreshDashboard() { $.when(loadUsers(), loadFolders()).done(function() { renderUsers(); renderUserSelect(); renderFolders(); if (selectedUserId) { loadAssignments(selectedUserId); } }); } function loadUsers() { return $.get('/api/admin/users').done(function(data) { users = data || []; }).fail(function(xhr) { $('#users-tbody').html( '
Ordner konnten nicht geladen werden.
'); }); } function getRoleBadge(role, expired) { if (expired) return $('').addClass('badge badge-expired').text('abgelaufen'); return $('').addClass('badge badge-' + (role || 'client')).text(role || 'client'); } function renderUsers() { var $tbody = $('#users-tbody').empty(); if (!users.length) { $tbody.html('Keine Unterordner im Bilderpfad gefunden.
'); return; } folders.forEach(function(folder) { var $card = $('').addClass('folder-card'); $('').text(folder.name).appendTo($card); var $meta = $('').addClass('folder-meta').appendTo($card); $('').addClass('folder-pill').text((folder.image_count || 0) + ' Bilder').appendTo($meta); $('').addClass('folder-pill').text('privat').appendTo($meta); $('').addClass('folder-pill').text((folder.assigned_users || []).length + ' Freigaben').appendTo($meta); var $assigned = $('').appendTo($card); if (folder.assigned_users && folder.assigned_users.length) { folder.assigned_users.forEach(function(user) { $('').addClass('badge folder-badge').text(user.username).appendTo($assigned); }); } else { $assigned.append($('').addClass('muted').text('Noch niemandem freigegeben')); } var $actions = $('').addClass('folder-actions').appendTo($card); $('') .data('folder', folder.name) .appendTo($actions); $('') .data('folder', folder.name) .appendTo($actions); $wrap.append($card); }); } function renderAccessList() { var $list = $('#folder-access-list').empty(); if (!folders.length) { $list.html('Keine Unterordner gefunden.
'); return; } folders.forEach(function(folder) { var checked = assignedFolders.indexOf(folder.name) !== -1; var $label = $('').addClass('access-item'); $('') .val(folder.name) .prop('checked', checked) .appendTo($label); $('').text(folder.name + ' (' + (folder.image_count || 0) + ')').appendTo($label); $list.append($label); }); } function loadAssignments(userId) { selectedUserId = String(userId || ""); if (!selectedUserId) { $('#folder-table-wrap').hide(); assignedFolders = []; return; } $('#user-select').val(selectedUserId); $.get('/api/admin/assign?user_id=' + encodeURIComponent(selectedUserId)).done(function(data) { assignedFolders = data || []; renderAccessList(); $('#folder-table-wrap').show(); }).fail(function() { assignedFolders = []; renderAccessList(); $('#folder-table-wrap').show(); }); } function saveAssignments() { if (!selectedUserId) return; assignedFolders = []; $('#folder-access-list input:checked').each(function() { assignedFolders.push($(this).val()); }); $.ajax({ url: '/api/admin/assign', type: 'POST', contentType: 'application/json', data: JSON.stringify({ user_id: selectedUserId, folders: assignedFolders }) }).done(function() { $('#assign-status').text('Gespeichert').show().delay(1200).fadeOut(); refreshDashboard(); }).fail(function(xhr) { alert((xhr.responseJSON && xhr.responseJSON.error) || 'Speichern fehlgeschlagen'); }); } $('#users-tbody').on('click', '.user-access', function() { loadAssignments($(this).data('user-id')); document.getElementById('user-select').scrollIntoView({ behavior: 'smooth', block: 'center' }); }); $('#user-select').change(function() { loadAssignments($(this).val()); }); $('#folder-access-list').on('change', 'input[type="checkbox"]', saveAssignments); $('#folders-overview').on('click', '.folder-assign-btn', function() { var folder = $(this).data('folder'); if (!selectedUserId) { alert('Bitte zuerst einen Nutzer in der Ordner-Zuweisung waehlen.'); return; } var $checkbox = $('#folder-access-list input').filter(function() { return $(this).val() === folder; }); if ($checkbox.length) { $checkbox.prop('checked', !$checkbox.prop('checked')).trigger('change'); } }); $('#folders-overview').on('click', '.folder-preview-btn', function() { var folder = $(this).data('folder'); $('#folder-preview-title').text('Ordnerinhalt: ' + folder); $('#folder-preview-note').text('Lade Bilder...'); $('#folder-preview').empty(); $.get('/api/admin/folders/' + encodeURIComponent(folder) + '/images').done(function(images) { $('#folder-preview-note').text((images || []).length + ' Bilder im Ordner'); var $preview = $('#folder-preview').empty(); if (!images || !images.length) { $preview.html('Dieser Ordner ist leer.
'); return; } images.forEach(function(img) { var $link = $('').attr({ href: img.full_url, target: '_blank', rel: 'noopener' }); $('