Files
minicrm/public/users.js

339 lines
13 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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;
});
}
// Для задач типа "it" - только пользователи из группы "ИТ специалист"
if (taskType === 'it') {
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 = '<option value="">Все заказчики</option>';
assigneeFilter.innerHTML = '<option value="">Все исполнители</option>';
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 => `
<div class="checkbox-item">
<label>
<input type="checkbox" name="assignedUsers" value="${user.id}"
onchange="toggleUserSelection(this, ${user.id})">
${user.name}
${document.getElementById('task-type').value === 'document' ? '(Директор)' : ''}
${document.getElementById('task-type').value === 'it' ? '(Админ)' : ''}
${document.getElementById('task-type').value === 'certificate' ? '(Администрация)' : ''}
</label>
</div>
`).join('');
}
function renderEditUsersChecklist(filtered = users) {
const container = document.getElementById('edit-users-checklist');
container.innerHTML = filtered
.filter(user => user.id !== currentUser.id)
.map(user => `
<div class="checkbox-item">
<label>
<input type="checkbox" name="assignedUsers" value="${user.id}"
onchange="toggleEditUserSelection(this, ${user.id})">
${user.name} (${user.email})
${user.auth_type === 'ldap' ? '<small style="color: #666;"> - LDAP</small>' : ''}
</label>
</div>
`).join('');
}
function renderCopyUsersChecklist(filtered = users) {
const container = document.getElementById('copy-users-checklist');
container.innerHTML = filtered
.filter(user => user.id !== currentUser.id)
.map(user => `
<div class="checkbox-item">
<label>
<input type="checkbox" name="assignedUsers" value="${user.id}"
onchange="toggleCopyUserSelection(this, ${user.id})">
${user.name} (${user.email})
${user.auth_type === 'ldap' ? '<small style="color: #666;"> - LDAP</small>' : ''}
</label>
</div>
`).join('');
}
function toggleUserSelection(checkbox, userId) {
if (checkbox.checked) {
selectedUsers.push(userId);
} else {
selectedUsers = selectedUsers.filter(id => id !== userId);
}
}
function toggleEditUserSelection(checkbox, userId) {
if (checkbox.checked) {
editSelectedUsers.push(userId);
} else {
editSelectedUsers = editSelectedUsers.filter(id => id !== userId);
}
}
function toggleCopyUserSelection(checkbox, userId) {
if (checkbox.checked) {
copySelectedUsers.push(userId);
} else {
copySelectedUsers = copySelectedUsers.filter(id => id !== userId);
}
}