| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- // ==================== 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 = '<tr><td colspan="8" style="text-align: center;">No users found</td></tr>';
- 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 `
- <tr>
- <td>${user.username}</td>
- <td>${user.email}</td>
- <td>${user.display_name || '-'}</td>
- <td>${user.is_admin ? '<span class="badge badge-admin">Admin</span>' : '-'}</td>
- <td>${user.is_active ? '<span class="badge badge-active">Active</span>' : '<span class="badge badge-inactive">Inactive</span>'}</td>
- <td>${createdDate}</td>
- <td>${lastLogin}</td>
- <td>
- <button class="btn btn-small" onclick="showChangePasswordModal(${user.id}, '${user.username}')">Change Password</button>
- ${!user.is_admin ? `
- <button class="btn btn-small btn-secondary" onclick="toggleAdmin(${user.id}, true)">Make Admin</button>
- ` : ''}
- ${!user.is_current ? `
- <button class="btn btn-small btn-danger" onclick="deleteUser(${user.id}, '${user.username}')">Delete</button>
- ` : '<span class="text-muted">Current User</span>'}
- </td>
- </tr>
- `;
- }).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');
- }
- }
|