260 lines
9.9 KiB
JavaScript
260 lines
9.9 KiB
JavaScript
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();
|