createAdminFloatingButton

This commit is contained in:
2026-02-08 00:56:56 +05:00
parent eec6961174
commit 653abe8c85
3 changed files with 287 additions and 1 deletions

View File

@@ -205,7 +205,7 @@ db.run(`
res.json(group); res.json(group);
}); });
}); });
// POST /api2/groups - Создать новую группу (только админ) // POST /api2/groups - Создать новую группу (только админ)
router.post('/api2/groups', requireAuth, requireAdmin, (req, res) => { router.post('/api2/groups', requireAuth, requireAdmin, (req, res) => {
const { name, description, service_type, is_active } = req.body; const { name, description, service_type, is_active } = req.body;
@@ -508,7 +508,32 @@ db.run(`
res.json(result); res.json(result);
}); });
}); });
// GET /api2/idusers/:userId/groups - Получить группы, в которых состоит пользователь
router.get('/api2/idusers/user/:userId/groups', requireAuth, (req, res) => {
const { userId } = req.params;
const query = `
SELECT DISTINCT
g.name
FROM idgroups g
INNER JOIN idusers iu ON g.id = iu.group_id
WHERE iu.user_id = ? AND iu.is_active = 1 AND g.is_active = 1
ORDER BY g.name
`;
db.all(query, [userId], (err, results) => {
if (err) {
console.error('❌ Ошибка получения групп пользователя:', err);
return res.status(500).json({ error: 'Ошибка получения групп пользователя' });
}
// Извлекаем только имена из результатов
const groupNames = results.map(row => row.name);
res.json(groupNames || []);
});
});
// POST /api2/idusers - Создать новый идентификатор пользователя (только админ) // POST /api2/idusers - Создать новый идентификатор пользователя (только админ)
router.post('/api2/idusers', requireAuth, requireAdmin, (req, res) => { router.post('/api2/idusers', requireAuth, requireAdmin, (req, res) => {
const { const {

260
public/doc-getUserGroups.js Normal file
View File

@@ -0,0 +1,260 @@
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();

View File

@@ -957,5 +957,6 @@
</div> </div>
<script src="doc.js"></script> <script src="doc.js"></script>
<script src="doc-getUserGroups.js"></script>
</body> </body>
</html> </html>