createAdminFloatingButton
This commit is contained in:
@@ -205,7 +205,7 @@ db.run(`
|
||||
res.json(group);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// POST /api2/groups - Создать новую группу (только админ)
|
||||
router.post('/api2/groups', requireAuth, requireAdmin, (req, res) => {
|
||||
const { name, description, service_type, is_active } = req.body;
|
||||
@@ -508,7 +508,32 @@ db.run(`
|
||||
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 - Создать новый идентификатор пользователя (только админ)
|
||||
router.post('/api2/idusers', requireAuth, requireAdmin, (req, res) => {
|
||||
const {
|
||||
|
||||
260
public/doc-getUserGroups.js
Normal file
260
public/doc-getUserGroups.js
Normal 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();
|
||||
@@ -957,5 +957,6 @@
|
||||
</div>
|
||||
|
||||
<script src="doc.js"></script>
|
||||
<script src="doc-getUserGroups.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user