Merge GitHub updates into Gitea master
All checks were successful
Build & Push Docker Image / build-and-push (push) Successful in 1m53s
All checks were successful
Build & Push Docker Image / build-and-push (push) Successful in 1m53s
This commit is contained in:
@@ -26,12 +26,18 @@ $(document).ready(function() {
|
||||
$('#users-tbody').empty();
|
||||
$('#user-select').html('<option value="">Nutzer waehlen...</option>');
|
||||
|
||||
if (!users || users.length === 0) {
|
||||
$('#users-tbody').html('<tr><td colspan="5" style="text-align:center;">Keine Nutzer gefunden</td></tr>');
|
||||
return;
|
||||
}
|
||||
|
||||
users.forEach(function(u) {
|
||||
var badge = $('<span></span>').addClass('badge badge-' + u.role).text(u.role);
|
||||
var role = u.role || 'unbekannt';
|
||||
var badge = $('<span></span>').addClass('badge badge-' + role).text(role);
|
||||
var created = u.created_at ? new Date(u.created_at).toLocaleDateString('de-DE') : '-';
|
||||
var info = created;
|
||||
|
||||
if (u.role === 'client' && u.expires_at) {
|
||||
if (role === 'client' && u.expires_at) {
|
||||
var expDate = new Date(u.expires_at).toLocaleDateString('de-DE');
|
||||
if (u.expired) {
|
||||
badge = $('<span></span>').addClass('badge badge-expired').text('abgelaufen');
|
||||
@@ -55,32 +61,47 @@ $(document).ready(function() {
|
||||
|
||||
row.append($('<td></td>').text(u.id));
|
||||
row.append(userCell);
|
||||
row.append($('<td></td>').text(u.role));
|
||||
row.append($('<td></td>').text(role));
|
||||
row.append($('<td></td>').text(info));
|
||||
row.append(actions);
|
||||
$('#users-tbody').append(row);
|
||||
|
||||
// Dropdown fuer Ordner-Zuweisung (nur non-admin)
|
||||
if (u.role !== 'admin') {
|
||||
$('#user-select').append($('<option></option>').val(u.id).text(u.username + ' (' + u.role + ')'));
|
||||
if (role !== 'admin') {
|
||||
$('#user-select').append($('<option></option>').val(u.id).text(u.username + ' (' + role + ')'));
|
||||
}
|
||||
});
|
||||
}).fail(function(xhr) {
|
||||
var msg = 'HTTP ' + xhr.status + ': ' + xhr.statusText;
|
||||
$('#users-tbody').html('<tr><td colspan="5" style="color:#e44d26;">Fehler beim Laden: ' + msg + '</td></tr>');
|
||||
});
|
||||
}
|
||||
|
||||
// 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);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -119,54 +140,89 @@ $(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('<p>Keine Unterordner in Websitebilder gefunden. Erstelle Ordner in Nextcloud.</p>');
|
||||
return;
|
||||
}
|
||||
folders.forEach(function(f) {
|
||||
var wrapper = $('<div class="folder-check"></div>');
|
||||
var label = $('<label></label>');
|
||||
$('<input type="checkbox" class="folder-cb"/>').val(f).appendTo(label);
|
||||
label.append(' ');
|
||||
$('<i class="fa fa-folder"></i>').appendTo(label);
|
||||
label.append(' ' + f);
|
||||
wrapper.append(label);
|
||||
$('#folder-checkboxes').append(wrapper);
|
||||
});
|
||||
allFolders = folders || [];
|
||||
renderFolderTable();
|
||||
});
|
||||
}
|
||||
|
||||
// Bei User-Auswahl: zugewiesene Ordner laden
|
||||
function renderFolderTable() {
|
||||
var $tbody = $('#folder-tbody');
|
||||
$tbody.empty();
|
||||
if (allFolders.length === 0) {
|
||||
$tbody.html('<tr><td colspan="2" style="text-align:center;">Keine Unterordner gefunden. Erstelle Ordner in Nextcloud.</td></tr>');
|
||||
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(
|
||||
'<tr class="' + cls + '" data-folder="' + f + '">' +
|
||||
'<td><i class="fa fa-folder"></i> ' + f + '</td>' +
|
||||
'<td style="text-align:center;"><span class="' + statusCls + '">' + statusText + '</span></td>' +
|
||||
'</tr>'
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
// 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').filter(function() {
|
||||
return $(this).val() === f;
|
||||
}).prop('checked', true);
|
||||
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();
|
||||
}
|
||||
});
|
||||
|
||||
// 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');
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user