// users.js - Управление пользователями let users = []; let allUsers = []; let filteredUsers = []; let selectedUsers = []; let editSelectedUsers = []; let copySelectedUsers = []; // Добавьте переменную для хранения групп пользователей let userGroupsCache = {}; async function loadUsers() { try { const response = await fetch('/api/users'); const allUsersData = await response.json(); //users = await response.json(); // Сохраняем всех пользователей allUsers = allUsersData; // Фильтруем пользователей в зависимости от прав текущего пользователя users = filterAssignableUsers(allUsersData); filteredUsers = [...users]; renderUsersChecklist(); renderEditUsersChecklist(); renderCopyUsersChecklist(); populateFilterDropdowns(); } catch (error) { console.error('Ошибка загрузки пользователей:', error); } } // Добавьте функцию для получения групп пользователя async function getUserGroups(userId) { if (userGroupsCache[userId]) { return userGroupsCache[userId]; } try { const response = await fetch(`/api2/idusers/user/${userId}/groups`); if (!response.ok) return []; const groups = await response.json(); userGroupsCache[userId] = groups || []; return userGroupsCache[userId]; } catch (error) { console.error('Ошибка получения групп пользователя:', error); return []; } } // Обновите функцию filterAssignableUsers function filterAssignableUsers(allUsers, taskType = 'regular') { if (!currentUser) return []; // Для задач типа "document" - только пользователи из группы "Секретарь" if (taskType === 'document') { return allUsers.filter(async (user) => { if (user.id === currentUser.id) return false; // Получаем группы пользователя const groups = await getUserGroups(user.id); // Проверяем, есть ли группа "Секретарь" const hasSecretaryGroup = groups.some(group => group.name === 'Секретарь' || (typeof group === 'string' && group.includes('Секретарь')) ); return hasSecretaryGroup; }); } // Для других типов задач - обычная фильтрация // Администратор видит всех пользователей if (currentUser.role === 'admin') { return allUsers.filter(user => user.id !== currentUser.id); } if (currentUser.role === 'secretary') { return allUsers.filter(user => user.id !== currentUser.id); } if (currentUser.role === 'ithelp') { return allUsers.filter(user => (user.role === 'teacher' || user.role === 'tasks' || user.role === 'help' || user.role === 'request' || user.role === 'ithelp') && user.id !== currentUser.id ); } if (currentUser.role === 'request') { return allUsers.filter(user => (user.role === 'teacher' || user.role === 'tasks' || user.role === 'help' || user.role === 'request' || user.role === 'ithelp') && user.id !== currentUser.id ); } // tasks видит учителей и других tasks if (currentUser.role === 'help') { return allUsers.filter(user => (user.role === 'teacher' || user.role === 'tasks' || user.role === 'help' || user.role === 'request' || user.role === 'ithelp') && user.id !== currentUser.id ); } // tasks видит учителей и других tasks if (currentUser.role === 'tasks') { return allUsers.filter(user => (user.role === 'teacher' || user.role === 'tasks' || user.role === 'help' || user.role === 'request' || user.role === 'ithelp') && user.id !== currentUser.id ); } // Учитель видит только учителей if (currentUser.role === 'teacher') { return allUsers.filter(user => (user.role === 'help' || user.role === 'request' || user.role === 'ithelp') && user.id !== currentUser.id ); } return []; } function populateFilterDropdowns() { const creatorFilter = document.getElementById('creator-filter'); const assigneeFilter = document.getElementById('assignee-filter'); creatorFilter.innerHTML = ''; assigneeFilter.innerHTML = ''; users.forEach(user => { const creatorOption = document.createElement('option'); creatorOption.value = user.id; creatorOption.textContent = `${user.name} (${user.login})`; creatorFilter.appendChild(creatorOption.cloneNode(true)); const assigneeOption = creatorOption.cloneNode(true); assigneeFilter.appendChild(assigneeOption); }); } // Обновите функцию filterUsers с учетом типа задачи async function filterUsers() { 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('Секретарь')) ); if (hasSecretaryGroup) { filteredUsers.push(user); } } } else { // Обычная фильтрация для других типов задач filteredUsers = users.filter(user => user.name.toLowerCase().includes(search) || user.login.toLowerCase().includes(search) || user.email.toLowerCase().includes(search) ); } renderUsersChecklist(); } async function filterEditUsers() { const search = document.getElementById('edit-user-search').value.toLowerCase(); const task = tasks.find(t => t.id === document.getElementById('edit-task-id').value); const taskType = task ? task.task_type : 'regular'; let filtered = []; if (taskType === 'document') { // Для задач типа "document" - только секретари let tempFiltered = users.filter(user => user.name.toLowerCase().includes(search) || user.login.toLowerCase().includes(search) || user.email.toLowerCase().includes(search) ); filtered = []; for (const user of tempFiltered) { const groups = await getUserGroups(user.id); const hasSecretaryGroup = groups.some(group => group.name === 'Секретарь' || (typeof group === 'string' && group.includes('Секретарь')) ); if (hasSecretaryGroup) { filtered.push(user); } } } else { filtered = users.filter(user => user.name.toLowerCase().includes(search) || user.login.toLowerCase().includes(search) || user.email.toLowerCase().includes(search) ); } renderEditUsersChecklist(filtered); } async function filterCopyUsers() { const search = document.getElementById('copy-user-search').value.toLowerCase(); const taskId = document.getElementById('copy-task-id').value; const task = tasks.find(t => t.id === taskId); const taskType = task ? task.task_type : 'regular'; let filtered = []; if (taskType === 'document') { // Для задач типа "document" - только секретари let tempFiltered = users.filter(user => user.name.toLowerCase().includes(search) || user.login.toLowerCase().includes(search) || user.email.toLowerCase().includes(search) ); filtered = []; for (const user of tempFiltered) { const groups = await getUserGroups(user.id); const hasSecretaryGroup = groups.some(group => group.name === 'Секретарь' || (typeof group === 'string' && group.includes('Секретарь')) ); if (hasSecretaryGroup) { filtered.push(user); } } } else { filtered = users.filter(user => user.name.toLowerCase().includes(search) || user.login.toLowerCase().includes(search) || user.email.toLowerCase().includes(search) ); } renderCopyUsersChecklist(filtered); } function renderUsersChecklist() { const container = document.getElementById('users-checklist'); container.innerHTML = filteredUsers .filter(user => user.id !== currentUser.id) .map(user => `