From bbab4434bba4edf36c1e155a6ce19da06e6cb8a4 Mon Sep 17 00:00:00 2001 From: kalugin66 Date: Fri, 6 Mar 2026 11:11:56 +0500 Subject: [PATCH] tasks --- public/admin-script.js | 16 +++++++++++- public/admin-stats.js | 59 +++++++++++++++++++++++++++++++++++++----- public/admin.html | 2 ++ 3 files changed, 70 insertions(+), 7 deletions(-) diff --git a/public/admin-script.js b/public/admin-script.js index 88cbb38..4c2eaeb 100644 --- a/public/admin-script.js +++ b/public/admin-script.js @@ -242,6 +242,20 @@ function searchUsers() { renderUsersTable(); } +/** + * Преобразует внутреннее имя роли в отображаемое. + * Для известных ролей возвращает локализованное название, + * для неизвестных – само имя роли. + */ +function formatRole(role) { + const roleMap = { + 'admin': 'Администратор', + 'teacher': 'Учитель' + // при необходимости можно добавить другие соответствия + }; + return roleMap[role] || role; +} + function renderUsersTable() { const tbody = document.getElementById('users-table-body'); if (!tbody) return; @@ -261,7 +275,7 @@ function renderUsersTable() { ${user.name || 'Не указано'} ${user.email || 'Нет email'} - ${user.role === 'admin' ? 'Администратор' : 'Учитель'} + ${formatRole(user.role)} ${user.role === 'admin' ? 'ADMIN' : ''} ${user.auth_type === 'ldap' ? 'LDAP' : 'Локальная'} diff --git a/public/admin-stats.js b/public/admin-stats.js index 84d069d..75fa5df 100644 --- a/public/admin-stats.js +++ b/public/admin-stats.js @@ -12,6 +12,20 @@ let currentFilters = { authType: '' }; +/** + * Преобразует внутреннее имя роли в отображаемое. + * Для известных ролей возвращает локализованное название, + * для неизвестных – само имя роли. + */ +function formatRole(role) { + const roleMap = { + 'admin': 'Администратор', + 'teacher': 'Учитель' + // при необходимости можно добавить другие соответствия + }; + return roleMap[role] || role; +} + function renderStatsSection() { const statsContainer = document.getElementById('admin-stats-section'); @@ -56,8 +70,7 @@ function renderStatsSection() {
@@ -134,8 +147,9 @@ async function loadUsersStats() { const overallStats = await getOverallStats(); usersStats = createUserStatsFromData(users, overallStats); - // Заполняем список пользователей в фильтре + // Заполняем списки фильтров populateUserFilter(); + populateRoleFilter(); // добавляем динамическое заполнение ролей // Применяем фильтры applyFilters(); @@ -146,6 +160,7 @@ async function loadUsersStats() { // Если всё не удалось, используем мок-данные для демонстрации usersStats = getMockStatsData(); populateUserFilter(); + populateRoleFilter(); // и здесь тоже applyFilters(); const tbody = document.getElementById('users-stats-body'); @@ -158,6 +173,38 @@ async function loadUsersStats() { } } +/** + * Заполняет select фильтра по ролям уникальными значениями из загруженной статистики. + */ +function populateRoleFilter() { + const roleSelect = document.getElementById('filter-role'); + if (!roleSelect) return; + + // Сохраняем текущее выбранное значение + const selectedValue = roleSelect.value; + + // Получаем уникальные роли из usersStats (отбрасываем пустые) + const roles = [...new Set(usersStats.map(stat => stat.role).filter(Boolean))]; + + // Очищаем select и добавляем опцию "Все роли" + roleSelect.innerHTML = ''; + + // Добавляем опции для каждой уникальной роли + roles.forEach(role => { + const option = document.createElement('option'); + option.value = role; + option.textContent = formatRole(role); // отображаем локализованное название, если есть + roleSelect.appendChild(option); + }); + + // Восстанавливаем выбранное значение, если оно всё ещё актуально + if (selectedValue && roles.includes(selectedValue)) { + roleSelect.value = selectedValue; + } else { + roleSelect.value = ''; + } +} + async function getOverallStats() { try { const response = await fetch('/admin/stats'); @@ -478,7 +525,7 @@ function applyFilters() { } } - // Фильтр по роли + // Фильтр по роли (теперь сравниваем строку роли напрямую) if (currentFilters.role && stat.role !== currentFilters.role) { return false; } @@ -557,7 +604,7 @@ function renderStatsTable() {
- ${stat.role === 'admin' ? 'Администратор' : 'Учитель'} + ${formatRole(stat.role)} ${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'} @@ -710,7 +757,7 @@ function convertToCSV(data) { `"${stat.userName || ''}"`, `"${stat.userLogin || ''}"`, `"${stat.userEmail || ''}"`, - `"${stat.role === 'admin' ? 'Администратор' : 'Учитель'}"`, + `"${formatRole(stat.role)}"`, // используем formatRole и здесь `"${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}"`, stat.totalTasks || 0, stat.activeTasks || 0, diff --git a/public/admin.html b/public/admin.html index fcf3f96..726ee4e 100644 --- a/public/admin.html +++ b/public/admin.html @@ -120,6 +120,7 @@ @@ -183,6 +184,7 @@