tasks
This commit is contained in:
@@ -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() {
|
||||
<td>${user.name || 'Не указано'}</td>
|
||||
<td>${user.email || 'Нет email'}</td>
|
||||
<td>
|
||||
${user.role === 'admin' ? 'Администратор' : 'Учитель'}
|
||||
${formatRole(user.role)}
|
||||
${user.role === 'admin' ? '<span class="admin-badge">ADMIN</span>' : ''}
|
||||
</td>
|
||||
<td>${user.auth_type === 'ldap' ? 'LDAP' : 'Локальная'}</td>
|
||||
|
||||
@@ -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() {
|
||||
<label for="filter-role">Роль</label>
|
||||
<select id="filter-role" onchange="applyFilters()">
|
||||
<option value="">Все роли</option>
|
||||
<option value="admin">Администратор</option>
|
||||
<option value="teacher">Учитель</option>
|
||||
<!-- Опции будут заполнены динамически из данных -->
|
||||
</select>
|
||||
</div>
|
||||
<div class="filter-group">
|
||||
@@ -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 = '<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() {
|
||||
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() {
|
||||
</div>
|
||||
</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>${stat.authType === 'ldap' ? 'LDAP' : 'Локальная'}</td>
|
||||
<td>
|
||||
@@ -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,
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
<label for="edit-role">Роль</label>
|
||||
<select id="edit-role" name="role">
|
||||
<option value="teacher">Учитель</option>
|
||||
<option value="tasks">Администрация</option>
|
||||
<option value="admin">Администратор</option>
|
||||
</select>
|
||||
</div>
|
||||
@@ -183,6 +184,7 @@
|
||||
<label for="create-role">Роль</label>
|
||||
<select id="create-role" name="role">
|
||||
<option value="teacher">Учитель</option>
|
||||
<option value="tasks">Администрация</option>
|
||||
<option value="admin">Администратор</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user