// admin-script.js (обновленный)
let currentUser = null;
let users = [];
let filteredUsers = [];
document.addEventListener('DOMContentLoaded', function() {
checkAuth();
setupEventListeners();
});
async function checkAuth() {
try {
const response = await fetch('/api/user');
if (response.ok) {
const data = await response.json();
currentUser = data.user;
if (currentUser.role !== 'admin') {
window.location.href = '/';
return;
}
showAdminInterface();
} else {
showLoginInterface();
}
} catch (error) {
showLoginInterface();
}
}
function showLoginInterface() {
document.getElementById('login-modal').style.display = 'block';
document.querySelector('.admin-container').style.display = 'none';
}
function showAdminInterface() {
document.getElementById('login-modal').style.display = 'none';
document.querySelector('.admin-container').style.display = 'block';
let userInfo = `Администратор: ${currentUser.name}`;
if (currentUser.auth_type === 'ldap') {
userInfo += ` (LDAP)`;
}
document.getElementById('current-user').textContent = userInfo;
loadUsers();
// Если дашборд активен, рендерим его
if (document.getElementById('admin-dashboard').classList.contains('active')) {
if (typeof renderDashboard === 'function') {
renderDashboard();
}
}
// Если статистика активна, рендерим ее
if (document.getElementById('admin-stats-section').classList.contains('active')) {
if (typeof renderStatsSection === 'function') {
renderStatsSection();
}
}
}
function setupEventListeners() {
const loginForm = document.getElementById('login-form');
const editUserForm = document.getElementById('edit-user-form');
if (loginForm) {
loginForm.addEventListener('submit', login);
}
if (editUserForm) {
editUserForm.addEventListener('submit', updateUser);
}
}
async function login(event) {
event.preventDefault();
const login = document.getElementById('login').value;
const password = document.getElementById('password').value;
try {
const response = await fetch('/api/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({ login, password })
});
if (response.ok) {
const data = await response.json();
currentUser = data.user;
if (currentUser.role !== 'admin') {
window.location.href = '/';
return;
}
showAdminInterface();
} else {
const error = await response.json();
alert(error.error || 'Ошибка входа');
}
} catch (error) {
console.error('Ошибка:', error);
alert('Ошибка подключения к серверу');
}
}
async function logout() {
try {
await fetch('/api/logout', { method: 'POST' });
currentUser = null;
showLoginInterface();
} catch (error) {
console.error('Ошибка выхода:', error);
}
}
function showAdminSection(sectionName) {
// Убираем активный класс у всех вкладок
document.querySelectorAll('.admin-tab').forEach(tab => {
tab.classList.remove('active');
});
// Убираем активный класс у всех секций
document.querySelectorAll('.admin-section').forEach(section => {
section.classList.remove('active');
});
// Находим и активируем соответствующую вкладку
const tab = document.querySelector(`.admin-tab[onclick*="showAdminSection('${sectionName}')"]`);
if (tab) {
tab.classList.add('active');
} else {
// Альтернативный поиск если выше не сработал
const tabs = document.querySelectorAll('.admin-tab');
tabs.forEach(t => {
if (t.textContent.toLowerCase().includes(sectionName)) {
t.classList.add('active');
}
});
}
// Активируем соответствующую секцию
const section = document.getElementById(`admin-${sectionName}`);
if (section) {
section.classList.add('active');
} else {
// Если секция не найдена по ID, ищем по другому шаблону
const sections = document.querySelectorAll('.admin-section');
sections.forEach(s => {
if (s.id.includes(sectionName)) {
s.classList.add('active');
}
});
}
// Загружаем данные для активной секции
if (sectionName === 'users') {
loadUsers();
} else if (sectionName === 'dashboard') {
if (typeof renderDashboard === 'function') {
renderDashboard();
}
} else if (sectionName === 'stats') {
if (typeof renderStatsSection === 'function') {
renderStatsSection();
} else if (typeof checkAndRenderStats === 'function') {
// Альтернативный вызов если функция переименована
checkAndRenderStats();
}
}
}
async function loadUsers() {
try {
const tbody = document.getElementById('users-table-body');
if (tbody) {
tbody.innerHTML = '
| Загрузка пользователей... |
';
}
const response = await fetch('/admin/users');
if (!response.ok) {
throw new Error('Ошибка загрузки пользователей');
}
users = await response.json();
filteredUsers = [...users];
renderUsersTable();
} catch (error) {
console.error('Ошибка загрузки пользователей:', error);
showError('users-table-body', 'Ошибка загрузки пользователей');
}
}
function searchUsers() {
const searchInput = document.getElementById('user-search');
if (!searchInput) return;
const search = searchInput.value.toLowerCase();
filteredUsers = users.filter(user =>
(user.login && user.login.toLowerCase().includes(search)) ||
(user.name && user.name.toLowerCase().includes(search)) ||
(user.email && user.email.toLowerCase().includes(search)) ||
(user.role && user.role.toLowerCase().includes(search)) ||
(user.auth_type && user.auth_type.toLowerCase().includes(search))
);
renderUsersTable();
}
function renderUsersTable() {
const tbody = document.getElementById('users-table-body');
if (!tbody) return;
if (!filteredUsers || filteredUsers.length === 0) {
tbody.innerHTML = '| Пользователи не найдены |
';
return;
}
tbody.innerHTML = filteredUsers.map(user => `
| ${user.id} |
${user.login || 'Нет логина'}
${user.auth_type === 'ldap' ? 'LDAP' : ''}
|
${user.name || 'Не указано'} |
${user.email || 'Нет email'} |
${user.role === 'admin' ? 'Администратор' : 'Учитель'}
${user.role === 'admin' ? 'ADMIN' : ''}
|
${user.auth_type === 'ldap' ? 'LDAP' : 'Локальная'} |
${formatDate(user.created_at)} |
${user.last_login ? formatDateTime(user.last_login) : 'Никогда'} |
|
`).join('');
}
async function openEditUserModal(userId) {
try {
const response = await fetch(`/admin/users/${userId}`);
if (!response.ok) {
throw new Error('Ошибка загрузки пользователя');
}
const user = await response.json();
document.getElementById('edit-user-id').value = user.id;
document.getElementById('edit-login').value = user.login;
document.getElementById('edit-name').value = user.name;
document.getElementById('edit-email').value = user.email;
document.getElementById('edit-role').value = user.role;
document.getElementById('edit-auth-type').value = user.auth_type;
document.getElementById('edit-groups').value = user.groups || '[]';
document.getElementById('edit-description').value = user.description || '';
const modal = document.getElementById('edit-user-modal');
if (modal) {
modal.style.display = 'block';
}
} catch (error) {
console.error('Ошибка:', error);
alert('Ошибка загрузки пользователя');
}
}
function closeEditUserModal() {
const modal = document.getElementById('edit-user-modal');
if (modal) {
modal.style.display = 'none';
}
}
async function updateUser(event) {
event.preventDefault();
const userId = document.getElementById('edit-user-id').value;
const login = document.getElementById('edit-login').value;
const name = document.getElementById('edit-name').value;
const email = document.getElementById('edit-email').value;
const role = document.getElementById('edit-role').value;
const auth_type = document.getElementById('edit-auth-type').value;
const groups = document.getElementById('edit-groups').value;
const description = document.getElementById('edit-description').value;
if (!login || !name || !email) {
alert('Заполните обязательные поля');
return;
}
const userData = {
login,
name,
email,
role,
auth_type,
groups: groups || '[]',
description
};
try {
const response = await fetch(`/admin/users/${userId}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData)
});
if (response.ok) {
alert('Пользователь успешно обновлен!');
closeEditUserModal();
loadUsers();
// Обновляем статистику если она видна
if (document.getElementById('admin-dashboard')?.classList.contains('active')) {
if (typeof loadDashboardStats === 'function') {
loadDashboardStats();
}
}
if (document.getElementById('admin-stats-section')?.classList.contains('active')) {
if (typeof loadUsersStats === 'function') {
loadUsersStats();
}
if (typeof loadOverallStats === 'function') {
loadOverallStats();
}
}
} else {
const error = await response.json();
alert(error.error || 'Ошибка обновления пользователя');
}
} catch (error) {
console.error('Ошибка:', error);
alert('Ошибка обновления пользователя');
}
}
async function deleteUser(userId) {
if (userId === currentUser?.id) {
alert('Нельзя удалить самого себя');
return;
}
if (!confirm('Вы уверены, что хотите удалить этого пользователя?')) {
return;
}
try {
const response = await fetch(`/admin/users/${userId}`, {
method: 'DELETE'
});
if (response.ok) {
alert('Пользователь успешно удален!');
loadUsers();
// Обновляем статистику если она видна
if (document.getElementById('admin-dashboard')?.classList.contains('active')) {
if (typeof loadDashboardStats === 'function') {
loadDashboardStats();
}
}
if (document.getElementById('admin-stats-section')?.classList.contains('active')) {
if (typeof loadUsersStats === 'function') {
loadUsersStats();
}
if (typeof loadOverallStats === 'function') {
loadOverallStats();
}
}
} else {
const error = await response.json();
alert(error.error || 'Ошибка удаления пользователя');
}
} catch (error) {
console.error('Ошибка:', error);
alert('Ошибка удаления пользователя');
}
}
function formatDateTime(dateTimeString) {
if (!dateTimeString) return '';
try {
const date = new Date(dateTimeString);
return date.toLocaleString('ru-RU');
} catch (e) {
return dateTimeString;
}
}
function formatDate(dateString) {
if (!dateString) return '';
try {
const date = new Date(dateString);
return date.toLocaleDateString('ru-RU');
} catch (e) {
return dateString;
}
}
function showError(elementId, message) {
const element = document.getElementById(elementId);
if (element) {
element.innerHTML = `| ${message} |
`;
}
}
// Делаем функции глобально доступными
window.logout = logout;
window.showAdminSection = showAdminSection;
window.searchUsers = searchUsers;
window.loadUsers = loadUsers;
window.openEditUserModal = openEditUserModal;
window.closeEditUserModal = closeEditUserModal;
window.updateUser = updateUser;
window.deleteUser = deleteUser;