Fixed admin - remove user

This commit is contained in:
Olaf
2026-08-25 21:05:17 +02:00
parent 38908b9a25
commit 442a28e741
4 changed files with 73 additions and 16 deletions
+31 -13
View File
@@ -9,6 +9,7 @@ const userForm = document.querySelector('#user-form');
const adminControls = document.querySelector('#admin-controls');
const adminAuthNotice = document.querySelector('#admin-auth-notice');
const accessToken = localStorage.getItem('linklogAccessToken');
let currentUserId = null;
function authHeaders(includeJson = false) {
return {
@@ -71,15 +72,22 @@ function renderUsers(users) {
const privilegeCheckbox = document.createElement('input');
privilegeCheckbox.type = 'checkbox';
privilegeCheckbox.checked = user.is_admin;
const isCurrentUser = user.id === currentUserId;
privilegeCheckbox.disabled = isCurrentUser;
privilegeCheckbox.setAttribute('aria-label', `Administrator rights for ${user.username}`);
privilegeCheckbox.addEventListener('change', () => updateUserPrivilege(user, privilegeCheckbox));
if (!isCurrentUser) {
privilegeCheckbox.addEventListener('change', () => updateUserPrivilege(user, privilegeCheckbox));
}
privilegeLabel.append(privilegeCheckbox, document.createTextNode(' Administrator'));
const button = document.createElement('button');
button.type = 'button';
button.className = 'danger-button';
button.textContent = 'Remove';
button.addEventListener('click', () => removeUser(user, button));
row.append(label, privilegeLabel, button);
row.append(label, privilegeLabel);
if (!isCurrentUser) {
const button = document.createElement('button');
button.type = 'button';
button.className = 'danger-button';
button.textContent = 'Remove';
button.addEventListener('click', () => removeUser(user, button));
row.append(button);
}
return row;
}));
}
@@ -119,6 +127,7 @@ async function loadAdminState() {
}
const user = await sessionResponse.json();
currentUserId = user.id;
if (!user.is_admin) {
showUnauthorizedState();
return;
@@ -151,13 +160,22 @@ async function updatePlugin(plugin, button) {
async function removeUser(user, button) {
if (!window.confirm(`Remove ${user.username}?`)) return;
button.disabled = true;
const response = await fetch(`/api/admin/users/${encodeURIComponent(user.id)}`, {
method: 'DELETE',
headers: authHeaders(),
});
if (response.ok) {
const status = document.querySelector('#user-status');
try {
const response = await fetch(`/api/admin/users/${encodeURIComponent(user.id)}`, {
method: 'DELETE',
headers: authHeaders(),
});
if (!response.ok) {
const detail = await response.text();
throw new Error(detail || `Request failed (${response.status})`);
}
await loadUsers();
} else {
status.textContent = `Removed ${user.username}.`;
status.style.color = '#94e2d5';
} catch (error) {
status.textContent = `Could not remove ${user.username}: ${error.message}`;
status.style.color = '#f38ba8';
button.disabled = false;
}
}
+1 -1
View File
@@ -77,6 +77,6 @@
<footer class="site-footer">Copyright © 2026 Olaf Kolkman · <a href="https://git.kolkman.org/olaf/Link-Log">git.kolkman.org/LinkLog</a></footer>
<script src="/static/auth-header.js?v=3"></script>
<script src="/static/logout.js?v=2"></script>
<script src="/static/admin.js?v=3"></script>
<script src="/static/admin.js?v=5"></script>
</body>
</html>