// ── Admin Page (User Management) ── registerPage('admin', { async init() { if (!currentUser || !currentUser.isAdmin) { navigateTo('dashboard'); return; } var users = []; var editingUserId = null; var list = document.getElementById('adminUserList'); var newUserBtn = document.getElementById('adminNewUserBtn'); var userForm = document.getElementById('adminUserForm'); var formTitle = document.getElementById('adminFormTitle'); var usernameInput = document.getElementById('adminUsername'); var displayNameInput = document.getElementById('adminDisplayName'); var passwordInput = document.getElementById('adminPassword'); var passwordLabel = document.getElementById('adminPasswordLabel'); var defaultPathInput = document.getElementById('adminDefaultPath'); var defaultPathBrowse = document.getElementById('adminDefaultPathBrowse'); var isAdminCheckbox = document.getElementById('adminIsAdmin'); var saveBtn = document.getElementById('adminFormSaveBtn'); var formMessage = document.getElementById('adminFormMessage'); var pageMessage = document.getElementById('adminMessage'); // ── Hilfsfunktionen ── function showFormMessage(text, isError) { formMessage.textContent = text; formMessage.className = 'profile-message ' + (isError ? 'profile-message-error' : 'profile-message-success'); formMessage.hidden = false; if (!isError) { setTimeout(function() { formMessage.hidden = true; }, 3000); } } function showPageMessage(text, isError) { pageMessage.textContent = text; pageMessage.className = 'profile-message ' + (isError ? 'profile-message-error' : 'profile-message-success'); pageMessage.hidden = false; setTimeout(function() { pageMessage.hidden = true; }, 4000); } function renderUsers() { list.innerHTML = ''; users.forEach(function(user) { var row = document.createElement('div'); row.className = 'admin-user-row'; var info = document.createElement('div'); info.className = 'admin-user-info'; var nameSpan = document.createElement('span'); nameSpan.className = 'admin-user-name'; nameSpan.textContent = user.displayName || user.username; var metaSpan = document.createElement('span'); metaSpan.className = 'admin-user-meta'; var metaParts = ['@' + user.username]; if (user.isAdmin) metaParts.push('Administrator'); if (user.defaultPath) metaParts.push(user.defaultPath); metaSpan.textContent = metaParts.join(' · '); info.appendChild(nameSpan); info.appendChild(metaSpan); var actions = document.createElement('div'); actions.className = 'admin-user-actions'; var editBtn = document.createElement('button'); editBtn.className = 'icon-btn'; editBtn.title = 'Bearbeiten'; editBtn.innerHTML = ''; editBtn.addEventListener('click', function() { startEdit(user); }); actions.appendChild(editBtn); // Login as User (nicht für sich selbst) if (user.userId !== currentUser.userId) { var loginAsBtn = document.createElement('button'); loginAsBtn.className = 'icon-btn'; loginAsBtn.title = 'Als ' + (user.displayName || user.username) + ' anmelden'; loginAsBtn.innerHTML = ''; loginAsBtn.addEventListener('click', function() { impersonateUser(user); }); actions.appendChild(loginAsBtn); var deleteBtn = document.createElement('button'); deleteBtn.className = 'icon-btn'; deleteBtn.title = 'Löschen'; deleteBtn.innerHTML = ''; deleteBtn.addEventListener('click', function() { deleteUser(user); }); actions.appendChild(deleteBtn); } row.appendChild(info); row.appendChild(actions); list.appendChild(row); }); } async function loadUsers() { try { users = await apiAdminGetUsers(); renderUsers(); } catch (err) { showPageMessage(err.message, true); } } function startEdit(user) { editingUserId = user.userId; formTitle.textContent = 'Benutzer bearbeiten'; usernameInput.value = user.username; usernameInput.disabled = false; displayNameInput.value = user.displayName || ''; passwordInput.value = ''; passwordLabel.textContent = 'Neues Passwort (leer = unverändert)'; passwordInput.placeholder = 'Neues Passwort (optional)'; passwordInput.required = false; defaultPathInput.value = user.defaultPath || ''; isAdminCheckbox.checked = user.isAdmin; saveBtn.textContent = 'Speichern'; formMessage.hidden = true; userForm.hidden = false; usernameInput.focus(); } async function deleteUser(user) { if (!confirm('Benutzer "' + (user.displayName || user.username) + '" wirklich löschen?\n\nAlle Tokens werden ebenfalls gelöscht.')) { return; } try { await apiAdminDeleteUser(user.userId); await loadUsers(); } catch (err) { showPageMessage(err.message, true); } } async function impersonateUser(user) { if (!confirm('Als "' + (user.displayName || user.username) + '" anmelden?\n\nDu wirst abgemeldet und als dieser Benutzer eingeloggt.')) { return; } try { await apiAdminImpersonate(user.userId); // Seite neu laden, damit der neue User-Kontext geladen wird location.reload(); } catch (err) { showPageMessage(err.message, true); } } // ── Event-Listener ── // Default Path Browse if (defaultPathBrowse) { defaultPathBrowse.addEventListener('click', function() { openFolderBrowser({ startPath: defaultPathInput.value.trim() || '/', onSelect: function(path) { defaultPathInput.value = path; } }); }); } // Neuer Benutzer newUserBtn.addEventListener('click', function() { editingUserId = null; formTitle.textContent = 'Neuer Benutzer'; usernameInput.value = ''; usernameInput.disabled = false; displayNameInput.value = ''; passwordInput.value = ''; passwordLabel.textContent = 'Passwort'; passwordInput.placeholder = 'Passwort'; passwordInput.required = true; defaultPathInput.value = ''; isAdminCheckbox.checked = false; saveBtn.textContent = 'Erstellen'; formMessage.hidden = true; userForm.hidden = false; usernameInput.focus(); }); // Speichern saveBtn.addEventListener('click', async function() { formMessage.hidden = true; saveBtn.disabled = true; try { if (editingUserId) { // Update var data = { username: usernameInput.value.trim(), displayName: displayNameInput.value.trim(), defaultPath: defaultPathInput.value.trim() || null, isAdmin: isAdminCheckbox.checked }; await apiAdminUpdateUser(editingUserId, data); // Passwort nur wenn ausgefüllt var pw = passwordInput.value; if (pw) { await apiAdminResetPassword(editingUserId, pw); } showFormMessage('Benutzer aktualisiert', false); } else { // Create var username = usernameInput.value.trim(); var password = passwordInput.value; if (!username || !password) { showFormMessage('Benutzername und Passwort erforderlich', true); return; } await apiAdminCreateUser({ username: username, password: password, displayName: displayNameInput.value.trim(), defaultPath: defaultPathInput.value.trim() || null, isAdmin: isAdminCheckbox.checked }); showFormMessage('Benutzer erstellt', false); } userForm.hidden = true; await loadUsers(); } catch (err) { showFormMessage(err.message, true); } finally { saveBtn.disabled = false; } }); // ── Init: User laden ── await loadUsers(); }, destroy() {} });