admin.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. // ==================== Admin Panel Functions ====================
  2. async function loadSettings() {
  3. try {
  4. const response = await fetch('/api/admin/settings');
  5. if (response.status === 401) {
  6. window.location.href = '/login';
  7. return;
  8. }
  9. if (response.status === 403) {
  10. showMessage('Admin access required', 'error');
  11. return;
  12. }
  13. const data = await response.json();
  14. // Update checkbox state
  15. document.getElementById('allow-registration').checked =
  16. data.allow_registration === 'true' || data.allow_registration === true;
  17. } catch (error) {
  18. console.error('Error loading settings:', error);
  19. showMessage('Error loading settings: ' + error.message, 'error');
  20. }
  21. }
  22. async function toggleRegistration(checkbox) {
  23. try {
  24. const formData = new FormData();
  25. formData.append('value', checkbox.checked ? 'true' : 'false');
  26. const response = await fetch('/api/admin/settings/allow_registration', {
  27. method: 'PUT',
  28. body: formData
  29. });
  30. if (response.status === 401) {
  31. window.location.href = '/login';
  32. return;
  33. }
  34. if (response.status === 403) {
  35. showMessage('Admin access required', 'error');
  36. return;
  37. }
  38. const data = await response.json();
  39. if (data.status === 'success') {
  40. showMessage(
  41. checkbox.checked ? 'Registration enabled' : 'Registration disabled',
  42. 'success'
  43. );
  44. } else {
  45. showMessage(data.message || 'Failed to update setting', 'error');
  46. // Revert checkbox
  47. checkbox.checked = !checkbox.checked;
  48. }
  49. } catch (error) {
  50. showMessage('Error updating setting: ' + error.message, 'error');
  51. // Revert checkbox
  52. checkbox.checked = !checkbox.checked;
  53. }
  54. }
  55. async function loadUsers() {
  56. try {
  57. const loadingEl = document.getElementById('users-loading');
  58. const containerEl = document.getElementById('users-container');
  59. loadingEl.classList.remove('hidden');
  60. containerEl.classList.add('hidden');
  61. const response = await fetch('/api/admin/users');
  62. if (response.status === 401) {
  63. window.location.href = '/login';
  64. return;
  65. }
  66. if (response.status === 403) {
  67. showMessage('Admin access required', 'error');
  68. return;
  69. }
  70. const data = await response.json();
  71. loadingEl.classList.add('hidden');
  72. containerEl.classList.remove('hidden');
  73. renderUsers(data.users || []);
  74. } catch (error) {
  75. console.error('Error loading users:', error);
  76. showMessage('Error loading users: ' + error.message, 'error');
  77. document.getElementById('users-loading').classList.add('hidden');
  78. }
  79. }
  80. function renderUsers(users) {
  81. const listEl = document.getElementById('users-list');
  82. if (users.length === 0) {
  83. listEl.innerHTML = '<tr><td colspan="8" style="text-align: center;">No users found</td></tr>';
  84. return;
  85. }
  86. const html = users.map(user => {
  87. const createdDate = new Date(user.created_at).toLocaleDateString();
  88. const lastLogin = user.last_login ? new Date(user.last_login).toLocaleDateString() : 'Never';
  89. return `
  90. <tr>
  91. <td>${user.username}</td>
  92. <td>${user.email}</td>
  93. <td>${user.display_name || '-'}</td>
  94. <td>${user.is_admin ? '<span class="badge badge-admin">Admin</span>' : '-'}</td>
  95. <td>${user.is_active ? '<span class="badge badge-active">Active</span>' : '<span class="badge badge-inactive">Inactive</span>'}</td>
  96. <td>${createdDate}</td>
  97. <td>${lastLogin}</td>
  98. <td>
  99. ${!user.is_admin ? `
  100. <button class="btn btn-small btn-secondary" onclick="toggleAdmin(${user.id}, true)">Make Admin</button>
  101. ` : ''}
  102. ${!user.is_current ? `
  103. <button class="btn btn-small btn-danger" onclick="deleteUser(${user.id}, '${user.username}')">Delete</button>
  104. ` : '<span class="text-muted">Current User</span>'}
  105. </td>
  106. </tr>
  107. `;
  108. }).join('');
  109. listEl.innerHTML = html;
  110. }
  111. async function toggleAdmin(userId, makeAdmin) {
  112. if (!confirm(`Are you sure you want to ${makeAdmin ? 'grant' : 'remove'} admin privileges ${makeAdmin ? 'to' : 'from'} this user?`)) {
  113. return;
  114. }
  115. try {
  116. const formData = new FormData();
  117. formData.append('is_admin', makeAdmin ? 'true' : 'false');
  118. const response = await fetch(`/api/admin/users/${userId}/admin`, {
  119. method: 'PUT',
  120. body: formData
  121. });
  122. if (response.status === 401) {
  123. window.location.href = '/login';
  124. return;
  125. }
  126. const data = await response.json();
  127. if (data.status === 'success') {
  128. showMessage('User privileges updated successfully', 'success');
  129. loadUsers(); // Reload user list
  130. } else {
  131. showMessage(data.message || 'Failed to update user', 'error');
  132. }
  133. } catch (error) {
  134. showMessage('Error updating user: ' + error.message, 'error');
  135. }
  136. }
  137. async function deleteUser(userId, username) {
  138. if (!confirm(`Are you sure you want to delete user "${username}"? This action cannot be undone and will delete all their data.`)) {
  139. return;
  140. }
  141. try {
  142. const response = await fetch(`/api/admin/users/${userId}`, {
  143. method: 'DELETE'
  144. });
  145. if (response.status === 401) {
  146. window.location.href = '/login';
  147. return;
  148. }
  149. const data = await response.json();
  150. if (data.status === 'success') {
  151. showMessage('User deleted successfully', 'success');
  152. loadUsers(); // Reload user list
  153. } else {
  154. showMessage(data.message || 'Failed to delete user', 'error');
  155. }
  156. } catch (error) {
  157. showMessage('Error deleting user: ' + error.message, 'error');
  158. }
  159. }