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 @@
|