Files
minicrm/public/doc-getUserGroups.js
2026-02-08 00:56:56 +05:00

260 lines
9.9 KiB
JavaScript
Raw Permalink 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.
async function getUserGroups(userId) {
try {
const response = await fetch(`/api2/idusers/user/${userId}/groups`);
if (!response.ok) throw new Error('Ошибка получения групп пользователя');
const groups = await response.json();
return groups;
} catch (error) {
console.error('Ошибка получения групп пользователя:', error);
return [];
}
}
// Получаем ID текущего пользователя и загружаем его группы
async function loadCurrentUserGroups() {
try {
// Получаем информацию о текущем пользователе
const userResponse = await fetch('/api/user');
if (!userResponse.ok) {
console.error('Ошибка получения информации о пользователе');
return [];
}
const userData = await userResponse.json();
if (!userData.user) {
console.error('Пользователь не аутентифицирован');
return [];
}
const currentUserId = userData.user.id;
console.log('Текущий пользователь:', userData.user);
// Получаем группы текущего пользователя
const groups = await getUserGroups(currentUserId);
console.log('Группы текущего пользователя:', groups);
// Преобразуем массив строк в массив объектов
const groupsAsObjects = groups.map(groupName => ({
name: groupName,
description: '',
service_type: 'ldap' // Предполагаем LDAP, так как группы из LDAP
}));
console.log('Группы как объекты:', groupsAsObjects);
// Создаем плавающую кнопку если нужно
createAdminFloatingButton(groupsAsObjects);
return groupsAsObjects;
} catch (error) {
console.error('Ошибка загрузки групп текущего пользователя:', error);
return [];
}
}
// Инициализация при загрузке страницы
document.addEventListener('DOMContentLoaded', function() {
// Проверяем авторизацию и загружаем группы
checkAuthAndLoadGroups();
});
// Функция проверки авторизации и загрузки групп
async function checkAuthAndLoadGroups() {
try {
const response = await fetch('/api/user');
if (!response.ok) {
console.log('Пользователь не аутентифицирован');
return;
}
const data = await response.json();
if (data.user) {
// Загружаем группы текущего пользователя
loadCurrentUserGroups();
}
} catch (error) {
console.error('Ошибка проверки авторизации:', error);
}
}
// Создание плавающей кнопки администрации
function createAdminFloatingButton(groups) {
// Проверяем, есть ли у пользователя группа "LDAP - Администрация"
const hasAdminGroup = groups.some(group => {
if (!group || typeof group !== 'object') {
console.warn('Некорректный формат группы:', group);
return false;
}
return group.name === 'LDAP - Администрация' ||
(group.name && group.name.includes('Администрация'));
});
console.log('Есть группа администрации:', hasAdminGroup);
console.log('Все группы для проверки:', groups);
if (!hasAdminGroup) return;
// Удаляем старую кнопку если существует
const existingButton = document.getElementById('adminFloatingButton');
if (existingButton) existingButton.remove();
// Создаем плавающую кнопку
const button = document.createElement('button');
button.id = 'adminFloatingButton';
button.className = 'admin-floating-button';
button.innerHTML = `
<i class="fas fa-users-cog"></i>
<span>Администрация</span>
`;
// Добавляем обработчик клика
button.addEventListener('click', () => {
showAdminGroupsModal(groups);
});
// Добавляем кнопку в body
document.body.appendChild(button);
console.log('Плавающая кнопка создана');
}
// Функция для отображения модального окна с группами
function showAdminGroupsModal(groups) {
// Удаляем старое модальное окно если существует
const existingModal = document.getElementById('adminGroupsModal');
if (existingModal) existingModal.remove();
// Создаем модальное окно
const modal = document.createElement('div');
modal.id = 'adminGroupsModal';
modal.className = 'admin-modal';
// Формируем содержимое
let groupsHTML = '';
if (groups.length === 0) {
groupsHTML = `
<div class="no-groups">
<i class="fas fa-info-circle" style="font-size: 48px; margin-bottom: 15px; color: #cbd5e0;"></i>
<p>Пользователь не состоит ни в одной группе</p>
</div>
`;
} else {
groupsHTML = '<div class="admin-group-list">';
groups.forEach(group => {
const isAdminGroup = group.name.includes('Администрация');
groupsHTML += `
<div class="admin-group-item ${isAdminGroup ? 'admin-highlight' : ''}">
<div class="admin-group-name">
${group.name}
${isAdminGroup ? ' <i class="fas fa-crown" style="color: #f59e0b;"></i>' : ''}
</div>
<div class="admin-group-info">
<span>${group.description || 'Нет описания'}</span>
<span class="admin-group-type">${getServiceTypeName(group.service_type)}</span>
</div>
</div>
`;
});
groupsHTML += '</div>';
}
modal.innerHTML = `
<div class="admin-modal-content">
<div class="admin-modal-header">
<div class="admin-modal-title">
<i class="fas fa-users"></i>
Мои группы
</div>
<button class="admin-modal-close" onclick="closeAdminGroupsModal()">
<i class="fas fa-times"></i>
</button>
</div>
<div class="admin-modal-body">
${groupsHTML}
</div>
<div class="admin-modal-footer">
Всего групп: ${groups.length}
</div>
</div>
`;
// Добавляем стиль для выделения группы администрации
if (!document.querySelector('#admin-highlight-style')) {
const highlightStyle = document.createElement('style');
highlightStyle.id = 'admin-highlight-style';
highlightStyle.textContent = `
.admin-highlight {
border-left: 4px solid #667eea;
background: linear-gradient(to right, #f8fafc, #f0f9ff) !important;
}
`;
document.head.appendChild(highlightStyle);
}
// Добавляем модальное окно в body
document.body.appendChild(modal);
// Показываем модальное окно
setTimeout(() => {
modal.classList.add('active');
}, 10);
// Закрытие по клику на фон
modal.addEventListener('click', (e) => {
if (e.target === modal) {
closeAdminGroupsModal();
}
});
// Закрытие по клавише Esc
document.addEventListener('keydown', function closeOnEsc(e) {
if (e.key === 'Escape') {
closeAdminGroupsModal();
document.removeEventListener('keydown', closeOnEsc);
}
});
}
// Функция для закрытия модального окна
function closeAdminGroupsModal() {
const modal = document.getElementById('adminGroupsModal');
if (modal) {
modal.classList.remove('active');
setTimeout(() => {
modal.remove();
}, 300);
}
}
// Вспомогательная функция для получения имени типа сервиса
function getServiceTypeName(type) {
switch(type) {
case 'sberbank': return 'Сбербанк';
case 'yandex': return 'Яндекс';
case 'ldap': return 'LDAP';
default: return 'Прочие';
}
}
// Тестовая функция для отладки (удалите в продакшене)
async function testCurrentUserGroups() {
try {
const response = await fetch('/api/user');
if (response.ok) {
const data = await response.json();
console.log('Текущий пользователь:', data.user);
if (data.user) {
const groups = await getUserGroups(data.user.id);
console.log('Группы текущего пользователя:', groups);
}
}
} catch (error) {
console.error('Тестовая ошибка:', error);
}
}
// Запускаем тест при загрузке (для отладки)
// testCurrentUserGroups();