// ==================== Admin Panel Functions ====================
async function loadSettings() {
try {
const response = await fetch('/api/admin/settings');
if (response.status === 401) {
window.location.href = '/login';
return;
}
if (response.status === 403) {
showMessage('Admin access required', 'error');
return;
}
const data = await response.json();
// Update checkbox state
document.getElementById('allow-registration').checked =
data.allow_registration === 'true' || data.allow_registration === true;
} catch (error) {
console.error('Error loading settings:', error);
showMessage('Error loading settings: ' + error.message, 'error');
}
}
async function toggleRegistration(checkbox) {
try {
const formData = new FormData();
formData.append('value', checkbox.checked ? 'true' : 'false');
const response = await fetch('/api/admin/settings/allow_registration', {
method: 'PUT',
body: formData
});
if (response.status === 401) {
window.location.href = '/login';
return;
}
if (response.status === 403) {
showMessage('Admin access required', 'error');
return;
}
const data = await response.json();
if (data.status === 'success') {
showMessage(
checkbox.checked ? 'Registration enabled' : 'Registration disabled',
'success'
);
} else {
showMessage(data.message || 'Failed to update setting', 'error');
// Revert checkbox
checkbox.checked = !checkbox.checked;
}
} catch (error) {
showMessage('Error updating setting: ' + error.message, 'error');
// Revert checkbox
checkbox.checked = !checkbox.checked;
}
}
async function loadUsers() {
try {
const loadingEl = document.getElementById('users-loading');
const containerEl = document.getElementById('users-container');
loadingEl.classList.remove('hidden');
containerEl.classList.add('hidden');
const response = await fetch('/api/admin/users');
if (response.status === 401) {
window.location.href = '/login';
return;
}
if (response.status === 403) {
showMessage('Admin access required', 'error');
return;
}
const data = await response.json();
loadingEl.classList.add('hidden');
containerEl.classList.remove('hidden');
renderUsers(data.users || []);
} catch (error) {
console.error('Error loading users:', error);
showMessage('Error loading users: ' + error.message, 'error');
document.getElementById('users-loading').classList.add('hidden');
}
}
function renderUsers(users) {
const listEl = document.getElementById('users-list');
if (users.length === 0) {
listEl.innerHTML = '
| No users found |
';
return;
}
const html = users.map(user => {
const createdDate = new Date(user.created_at).toLocaleDateString();
const lastLogin = user.last_login ? new Date(user.last_login).toLocaleDateString() : 'Never';
return `
| ${user.username} |
${user.email} |
${user.display_name || '-'} |
${user.is_admin ? 'Admin' : '-'} |
${user.is_active ? 'Active' : 'Inactive'} |
${createdDate} |
${lastLogin} |
${!user.is_admin ? `
` : ''}
${!user.is_current ? `
` : 'Current User'}
|
`;
}).join('');
listEl.innerHTML = html;
}
async function toggleAdmin(userId, makeAdmin) {
if (!confirm(`Are you sure you want to ${makeAdmin ? 'grant' : 'remove'} admin privileges ${makeAdmin ? 'to' : 'from'} this user?`)) {
return;
}
try {
const formData = new FormData();
formData.append('is_admin', makeAdmin ? 'true' : 'false');
const response = await fetch(`/api/admin/users/${userId}/admin`, {
method: 'PUT',
body: formData
});
if (response.status === 401) {
window.location.href = '/login';
return;
}
const data = await response.json();
if (data.status === 'success') {
showMessage('User privileges updated successfully', 'success');
loadUsers(); // Reload user list
} else {
showMessage(data.message || 'Failed to update user', 'error');
}
} catch (error) {
showMessage('Error updating user: ' + error.message, 'error');
}
}
async function deleteUser(userId, username) {
if (!confirm(`Are you sure you want to delete user "${username}"? This action cannot be undone and will delete all their data.`)) {
return;
}
try {
const response = await fetch(`/api/admin/users/${userId}`, {
method: 'DELETE'
});
if (response.status === 401) {
window.location.href = '/login';
return;
}
const data = await response.json();
if (data.status === 'success') {
showMessage('User deleted successfully', 'success');
loadUsers(); // Reload user list
} else {
showMessage(data.message || 'Failed to delete user', 'error');
}
} catch (error) {
showMessage('Error deleting user: ' + error.message, 'error');
}
}
// ==================== Add User Modal ====================
function showAddUserModal() {
document.getElementById('add-user-modal').classList.remove('hidden');
document.getElementById('add-user-form').reset();
}
function hideAddUserModal() {
document.getElementById('add-user-modal').classList.add('hidden');
document.getElementById('add-user-form').reset();
}
async function submitAddUser(event) {
event.preventDefault();
const form = event.target;
const formData = new FormData(form);
try {
const response = await fetch('/api/admin/users', {
method: 'POST',
body: formData
});
if (response.status === 401) {
window.location.href = '/login';
return;
}
const data = await response.json();
if (data.status === 'success') {
showMessage(data.message || 'User created successfully', 'success');
hideAddUserModal();
loadUsers(); // Reload user list
} else {
showMessage(data.message || 'Failed to create user', 'error');
}
} catch (error) {
showMessage('Error creating user: ' + error.message, 'error');
}
}
// ==================== Change Password Modal ====================
function showChangePasswordModal(userId, username) {
document.getElementById('change-password-user-id').value = userId;
document.getElementById('change-password-username').textContent = username;
document.getElementById('change-password-modal').classList.remove('hidden');
document.getElementById('change-password-form').reset();
// Re-set the hidden user ID after reset
document.getElementById('change-password-user-id').value = userId;
}
function hideChangePasswordModal() {
document.getElementById('change-password-modal').classList.add('hidden');
document.getElementById('change-password-form').reset();
}
async function submitChangePassword(event) {
event.preventDefault();
const form = event.target;
const userId = document.getElementById('change-password-user-id').value;
const formData = new FormData(form);
try {
const response = await fetch(`/api/admin/users/${userId}/password`, {
method: 'PUT',
body: formData
});
if (response.status === 401) {
window.location.href = '/login';
return;
}
const data = await response.json();
if (data.status === 'success') {
showMessage(data.message || 'Password changed successfully', 'success');
hideChangePasswordModal();
} else {
showMessage(data.message || 'Failed to change password', 'error');
}
} catch (error) {
showMessage('Error changing password: ' + error.message, 'error');
}
}