tasks
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user