индикатор загрузки в чеклист пользователей

This commit is contained in:
2026-02-13 21:27:07 +05:00
parent 40c454a786
commit db2ae5a654
3 changed files with 181 additions and 36 deletions

View File

@@ -5,6 +5,8 @@ let filteredUsers = [];
let selectedUsers = [];
let editSelectedUsers = [];
let copySelectedUsers = [];
// добавить переменную для отслеживания загрузки
let isUsersLoading = false;
// Добавьте переменную для хранения групп пользователей
let userGroupsCache = {};
@@ -150,41 +152,65 @@ function populateFilterDropdowns() {
// Обновите функцию filterUsers с учетом типа задачи
async function filterUsers() {
const search = document.getElementById('user-search').value.toLowerCase();
const taskType = document.getElementById('task-type').value || 'regular';
const search = document.getElementById('user-search')?.value.toLowerCase() || '';
const taskType = document.getElementById('task-type')?.value || 'regular';
// Для задач типа "document" нужна особая фильтрация
if (taskType === 'document') {
// Сначала фильтруем по поисковому запросу
let tempFiltered = users.filter(user =>
user.name.toLowerCase().includes(search) ||
user.login.toLowerCase().includes(search) ||
user.email.toLowerCase().includes(search)
);
// Затем проверяем группы для каждого пользователя
filteredUsers = [];
for (const user of tempFiltered) {
const groups = await getUserGroups(user.id);
const hasSecretaryGroup = groups.some(group =>
group.name === 'Секретарь' ||
(typeof group === 'string' && group.includes('Секретарь'))
isUsersLoading = true;
renderUsersChecklist(); // Показываем загрузку
try {
if (taskType === 'document' || taskType === 'it' || taskType === 'ahch' ||
taskType === 'psychologist' || taskType === 'speech_therapist' ||
taskType === 'hr' || taskType === 'certificate' || taskType === 'e_journal') {
// Фильтруем по поиску
let tempFiltered = users.filter(user =>
user.name.toLowerCase().includes(search) ||
user.login.toLowerCase().includes(search) ||
user.email.toLowerCase().includes(search)
);
if (hasSecretaryGroup) {
filteredUsers.push(user);
// Затем проверяем группы
filteredUsers = [];
const groupNames = {
'document': 'Секретарь',
'it': 'ИТ специалист',
'ahch': 'АХЧ',
'psychologist': 'психолог',
'speech_therapist': 'логопед',
'hr': 'Диспетчер',
'certificate': 'Администрация',
'e_journal': 'Админ ЭЖ'
};
const targetGroup = groupNames[taskType];
for (const user of tempFiltered) {
const groups = await getUserGroups(user.id);
const hasTargetGroup = groups.some(group =>
group.name === targetGroup ||
(typeof group === 'string' && group.includes(targetGroup))
);
if (hasTargetGroup) {
filteredUsers.push(user);
}
}
} else {
// Обычная фильтрация
filteredUsers = users.filter(user =>
user.name.toLowerCase().includes(search) ||
user.login.toLowerCase().includes(search) ||
user.email.toLowerCase().includes(search)
);
}
} else {
// Обычная фильтрация для других типов задач
filteredUsers = users.filter(user =>
user.name.toLowerCase().includes(search) ||
user.login.toLowerCase().includes(search) ||
user.email.toLowerCase().includes(search)
);
} catch (error) {
console.error('Ошибка фильтрации пользователей:', error);
filteredUsers = [];
} finally {
isUsersLoading = false;
renderUsersChecklist();
}
renderUsersChecklist();
}
async function filterEditUsers() {
@@ -266,22 +292,45 @@ async function filterCopyUsers() {
function renderUsersChecklist() {
const container = document.getElementById('users-checklist');
if (isUsersLoading) {
container.innerHTML = '<div class="loading-spinner">⏳ Загрузка пользователей...</div>';
return;
}
if (!filteredUsers || filteredUsers.length === 0) {
container.innerHTML = '<div class="no-users">Нет доступных пользователей</div>';
return;
}
container.innerHTML = filteredUsers
.filter(user => user.id !== currentUser.id)
.filter(user => user.id !== currentUser?.id)
.map(user => `
<div class="checkbox-item">
<label>
<input type="checkbox" name="assignedUsers" value="${user.id}"
onchange="toggleUserSelection(this, ${user.id})">
onchange="toggleUserSelection(this, ${user.id})"
${selectedUsers.includes(user.id) ? 'checked' : ''}>
${user.name}
${document.getElementById('task-type').value === 'document' ? '(Директор)' : ''}
${document.getElementById('task-type').value === 'it' ? '(Админ)' : ''}
${document.getElementById('task-type').value === 'certificate' ? '(Администрация)' : ''}
${getUserTypeLabel(user, document.getElementById('task-type')?.value)}
</label>
</div>
`).join('');
}
// Вспомогательная функция для отображения типа пользователя
function getUserTypeLabel(user, taskType) {
const labels = {
'document': '(Секретарь)',
'it': '(ИТ специалист)',
'ahch': '(АХЧ)',
'psychologist': '(Психолог)',
'speech_therapist': '(Логопед)',
'hr': '(Диспетчер)',
'certificate': '(Администрация)',
'e_journal': '(Админ ЭЖ)'
};
return labels[taskType] || '';
}
function renderEditUsersChecklist(filtered = users) {
const container = document.getElementById('edit-users-checklist');
container.innerHTML = filtered