// Admin panel functionality let usersData = []; // Load users on page load document.addEventListener('DOMContentLoaded', function() { loadUsers(); }); async function loadUsers() { try { const response = await fetch('/api/admin/users'); const data = await response.json(); if (data.users) { usersData = data.users; updateStats(); renderUsersTable(); } } catch (error) { console.error('Error loading users:', error); showToast(window.getTranslation('admin.errorLoading', 'Error loading users'), 'error'); } } function updateStats() { const totalUsers = usersData.length; const adminUsers = usersData.filter(u => u.is_admin).length; const twoFAUsers = usersData.filter(u => u.two_factor_enabled).length; document.getElementById('total-users').textContent = totalUsers; document.getElementById('admin-users').textContent = adminUsers; document.getElementById('twofa-users').textContent = twoFAUsers; } function renderUsersTable() { const tbody = document.getElementById('users-table'); if (usersData.length === 0) { tbody.innerHTML = ` ${window.getTranslation('admin.noUsers', 'No users found')} `; return; } tbody.innerHTML = usersData.map(user => ` ${escapeHtml(user.username)} ${escapeHtml(user.email)} ${user.is_admin ? ` ${window.getTranslation('admin.admin', 'Admin')} ` : ` ${window.getTranslation('admin.user', 'User')} ` } ${user.two_factor_enabled ? `check_circle` : `cancel` } ${user.language.toUpperCase()} ${user.currency} ${new Date(user.created_at).toLocaleDateString()}
`).join(''); } function openCreateUserModal() { document.getElementById('create-user-modal').classList.remove('hidden'); document.getElementById('create-user-modal').classList.add('flex'); } function closeCreateUserModal() { document.getElementById('create-user-modal').classList.add('hidden'); document.getElementById('create-user-modal').classList.remove('flex'); document.getElementById('create-user-form').reset(); } document.getElementById('create-user-form').addEventListener('submit', async function(e) { e.preventDefault(); const formData = new FormData(e.target); const userData = { username: formData.get('username'), email: formData.get('email'), password: formData.get('password'), is_admin: formData.get('is_admin') === 'on' }; try { const response = await fetch('/api/admin/users', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(userData) }); const data = await response.json(); if (data.success) { showToast(window.getTranslation('admin.userCreated', 'User created successfully'), 'success'); closeCreateUserModal(); loadUsers(); } else { showToast(data.message || window.getTranslation('admin.errorCreating', 'Error creating user'), 'error'); } } catch (error) { console.error('Error creating user:', error); showToast(window.getTranslation('admin.errorCreating', 'Error creating user'), 'error'); } }); async function deleteUser(userId, username) { if (!confirm(window.getTranslation('admin.confirmDelete', 'Are you sure you want to delete user') + ` "${username}"?`)) { return; } try { const response = await fetch(`/api/admin/users/${userId}`, { method: 'DELETE' }); const data = await response.json(); if (data.success) { showToast(window.getTranslation('admin.userDeleted', 'User deleted successfully'), 'success'); loadUsers(); } else { showToast(data.message || window.getTranslation('admin.errorDeleting', 'Error deleting user'), 'error'); } } catch (error) { console.error('Error deleting user:', error); showToast(window.getTranslation('admin.errorDeleting', 'Error deleting user'), 'error'); } } async function editUser(userId) { // Placeholder for edit functionality showToast(window.getTranslation('admin.editNotImplemented', 'Edit functionality coming soon'), 'info'); } function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } function showToast(message, type = 'info') { if (typeof window.showToast === 'function') { window.showToast(message, type); } else { alert(message); } }