индикатор загрузки в чеклист пользователей
This commit is contained in:
119
public/users.js
119
public/users.js
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user