This commit is contained in:
2026-03-06 11:11:56 +05:00
parent e43688a618
commit bbab4434bb
3 changed files with 70 additions and 7 deletions

View File

@@ -242,6 +242,20 @@ function searchUsers() {
renderUsersTable(); renderUsersTable();
} }
/**
* Преобразует внутреннее имя роли в отображаемое.
* Для известных ролей возвращает локализованное название,
* для неизвестных само имя роли.
*/
function formatRole(role) {
const roleMap = {
'admin': 'Администратор',
'teacher': 'Учитель'
// при необходимости можно добавить другие соответствия
};
return roleMap[role] || role;
}
function renderUsersTable() { function renderUsersTable() {
const tbody = document.getElementById('users-table-body'); const tbody = document.getElementById('users-table-body');
if (!tbody) return; if (!tbody) return;
@@ -261,7 +275,7 @@ function renderUsersTable() {
<td>${user.name || 'Не указано'}</td> <td>${user.name || 'Не указано'}</td>
<td>${user.email || 'Нет email'}</td> <td>${user.email || 'Нет email'}</td>
<td> <td>
${user.role === 'admin' ? 'Администратор' : 'Учитель'} ${formatRole(user.role)}
${user.role === 'admin' ? '<span class="admin-badge">ADMIN</span>' : ''} ${user.role === 'admin' ? '<span class="admin-badge">ADMIN</span>' : ''}
</td> </td>
<td>${user.auth_type === 'ldap' ? 'LDAP' : 'Локальная'}</td> <td>${user.auth_type === 'ldap' ? 'LDAP' : 'Локальная'}</td>

View File

@@ -12,6 +12,20 @@ let currentFilters = {
authType: '' authType: ''
}; };
/**
* Преобразует внутреннее имя роли в отображаемое.
* Для известных ролей возвращает локализованное название,
* для неизвестных само имя роли.
*/
function formatRole(role) {
const roleMap = {
'admin': 'Администратор',
'teacher': 'Учитель'
// при необходимости можно добавить другие соответствия
};
return roleMap[role] || role;
}
function renderStatsSection() { function renderStatsSection() {
const statsContainer = document.getElementById('admin-stats-section'); const statsContainer = document.getElementById('admin-stats-section');
@@ -56,8 +70,7 @@ function renderStatsSection() {
<label for="filter-role">Роль</label> <label for="filter-role">Роль</label>
<select id="filter-role" onchange="applyFilters()"> <select id="filter-role" onchange="applyFilters()">
<option value="">Все роли</option> <option value="">Все роли</option>
<option value="admin">Администратор</option> <!-- Опции будут заполнены динамически из данных -->
<option value="teacher">Учитель</option>
</select> </select>
</div> </div>
<div class="filter-group"> <div class="filter-group">
@@ -134,8 +147,9 @@ async function loadUsersStats() {
const overallStats = await getOverallStats(); const overallStats = await getOverallStats();
usersStats = createUserStatsFromData(users, overallStats); usersStats = createUserStatsFromData(users, overallStats);
// Заполняем список пользователей в фильтре // Заполняем списки фильтров
populateUserFilter(); populateUserFilter();
populateRoleFilter(); // добавляем динамическое заполнение ролей
// Применяем фильтры // Применяем фильтры
applyFilters(); applyFilters();
@@ -146,6 +160,7 @@ async function loadUsersStats() {
// Если всё не удалось, используем мок-данные для демонстрации // Если всё не удалось, используем мок-данные для демонстрации
usersStats = getMockStatsData(); usersStats = getMockStatsData();
populateUserFilter(); populateUserFilter();
populateRoleFilter(); // и здесь тоже
applyFilters(); applyFilters();
const tbody = document.getElementById('users-stats-body'); 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 = '<option value="">Все роли</option>';
// Добавляем опции для каждой уникальной роли
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() { async function getOverallStats() {
try { try {
const response = await fetch('/admin/stats'); const response = await fetch('/admin/stats');
@@ -478,7 +525,7 @@ function applyFilters() {
} }
} }
// Фильтр по роли // Фильтр по роли (теперь сравниваем строку роли напрямую)
if (currentFilters.role && stat.role !== currentFilters.role) { if (currentFilters.role && stat.role !== currentFilters.role) {
return false; return false;
} }
@@ -557,7 +604,7 @@ function renderStatsTable() {
</div> </div>
</td> </td>
<td> <td>
<span class="user-role ${stat.role || 'teacher'}">${stat.role === 'admin' ? 'Администратор' : 'Учитель'}</span> <span class="user-role ${stat.role || 'teacher'}">${formatRole(stat.role)}</span>
</td> </td>
<td>${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}</td> <td>${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}</td>
<td> <td>
@@ -710,7 +757,7 @@ function convertToCSV(data) {
`"${stat.userName || ''}"`, `"${stat.userName || ''}"`,
`"${stat.userLogin || ''}"`, `"${stat.userLogin || ''}"`,
`"${stat.userEmail || ''}"`, `"${stat.userEmail || ''}"`,
`"${stat.role === 'admin' ? 'Администратор' : 'Учитель'}"`, `"${formatRole(stat.role)}"`, // используем formatRole и здесь
`"${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}"`, `"${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}"`,
stat.totalTasks || 0, stat.totalTasks || 0,
stat.activeTasks || 0, stat.activeTasks || 0,

View File

@@ -120,6 +120,7 @@
<label for="edit-role">Роль</label> <label for="edit-role">Роль</label>
<select id="edit-role" name="role"> <select id="edit-role" name="role">
<option value="teacher">Учитель</option> <option value="teacher">Учитель</option>
<option value="tasks">Администрация</option>
<option value="admin">Администратор</option> <option value="admin">Администратор</option>
</select> </select>
</div> </div>
@@ -183,6 +184,7 @@
<label for="create-role">Роль</label> <label for="create-role">Роль</label>
<select id="create-role" name="role"> <select id="create-role" name="role">
<option value="teacher">Учитель</option> <option value="teacher">Учитель</option>
<option value="tasks">Администрация</option>
<option value="admin">Администратор</option> <option value="admin">Администратор</option>
</select> </select>
</div> </div>