цвета

This commit is contained in:
2026-01-29 17:08:15 +05:00
parent 48394cd0cd
commit 827eeb59b9
12 changed files with 1992 additions and 467 deletions

View File

@@ -11,10 +11,13 @@
:root {
--admin-color: #e74c3c;
--secretary-color: #3498db;
--help-color: #27ae60;
--doc-color: #9b59b6;
--ahch-color: #e67e22;
}
.container {
max-width: 1200px;
max-width: 1400px;
margin: 0 auto;
padding: 20px;
}
@@ -43,6 +46,7 @@
.tabs {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin-bottom: 20px;
background: white;
@@ -52,16 +56,17 @@
}
.tab {
padding: 12px 24px;
padding: 12px 20px;
border: none;
background: none;
cursor: pointer;
font-size: 16px;
font-size: 14px;
border-radius: 6px;
transition: all 0.3s;
display: flex;
align-items: center;
gap: 8px;
white-space: nowrap;
}
.tab:hover {
@@ -69,10 +74,16 @@
}
.tab.active {
background: #3498db;
color: white;
}
.tab.secretary.active { background: var(--secretary-color); }
.tab.administration.active { background: var(--admin-color); }
.tab.help.active { background: var(--help-color); }
.tab.doc.active { background: var(--doc-color); }
.tab.ahch.active { background: var(--ahch-color); }
.tab.all-users.active { background: #2c3e50; }
.content-section {
display: none;
background: white;
@@ -101,13 +112,11 @@
border-radius: 50%;
}
.group-color.admin {
background: var(--admin-color);
}
.group-color.secretary {
background: var(--secretary-color);
}
.group-color.admin { background: var(--admin-color); }
.group-color.secretary { background: var(--secretary-color); }
.group-color.help { background: var(--help-color); }
.group-color.doc { background: var(--doc-color); }
.group-color.ahch { background: var(--ahch-color); }
.users-container {
display: grid;
@@ -122,6 +131,7 @@
border-radius: 8px;
padding: 15px;
transition: all 0.3s;
position: relative;
}
.user-card:hover {
@@ -175,33 +185,32 @@
.group-badge {
padding: 4px 8px;
border-radius: 4px;
font-size: 12px;
font-size: 11px;
color: white;
display: flex;
align-items: center;
gap: 4px;
}
.group-badge.admin {
background: var(--admin-color);
}
.group-badge.secretary {
background: var(--secretary-color);
}
.group-badge.admin { background: var(--admin-color); }
.group-badge.secretary { background: var(--secretary-color); }
.group-badge.help { background: var(--help-color); }
.group-badge.doc { background: var(--doc-color); }
.group-badge.ahch { background: var(--ahch-color); }
.user-actions {
display: flex;
gap: 10px;
flex-wrap: wrap;
gap: 8px;
margin-top: 10px;
}
.btn {
padding: 8px 16px;
padding: 6px 12px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
font-size: 12px;
transition: all 0.3s;
display: flex;
align-items: center;
@@ -235,6 +244,15 @@
background: #229954;
}
.btn-help { background: var(--help-color); color: white; }
.btn-help:hover { background: #219653; }
.btn-doc { background: var(--doc-color); color: white; }
.btn-doc:hover { background: #8e44ad; }
.btn-ahch { background: var(--ahch-color); color: white; }
.btn-ahch:hover { background: #d35400; }
.loading {
text-align: center;
padding: 40px;
@@ -260,13 +278,13 @@
}
.stats {
display: flex;
gap: 20px;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
gap: 15px;
margin-bottom: 20px;
}
.stat-card {
flex: 1;
background: white;
padding: 15px;
border-radius: 8px;
@@ -277,7 +295,6 @@
.stat-number {
font-size: 24px;
font-weight: bold;
color: #3498db;
margin: 10px 0;
}
@@ -292,17 +309,40 @@
color: #666;
}
.all-groups-badges {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin-top: 5px;
}
@media (max-width: 768px) {
.users-container {
grid-template-columns: 1fr;
}
.stats {
.user-actions {
flex-direction: column;
}
.user-actions {
flex-direction: column;
.tab {
padding: 10px 15px;
font-size: 13px;
}
.stats {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
.stats {
grid-template-columns: 1fr;
}
.tab {
padding: 8px 12px;
font-size: 12px;
}
}
</style>
@@ -322,13 +362,22 @@
</div>
<div class="tabs">
<button class="tab active" onclick="showTab('secretary')">
<button class="tab secretary active" onclick="showTab('secretary')">
<i class="fas fa-file-signature"></i> Секретари
</button>
<button class="tab" onclick="showTab('administration')">
<button class="tab administration" onclick="showTab('administration')">
<i class="fas fa-user-shield"></i> Администрация
</button>
<button class="tab" onclick="showTab('all-users')">
<button class="tab help" onclick="showTab('help')">
<i class="fas fa-hands-helping"></i> Help
</button>
<button class="tab doc" onclick="showTab('doc')">
<i class="fas fa-file-alt"></i> Doc
</button>
<button class="tab ahch" onclick="showTab('ahch')">
<i class="fas fa-school"></i> AHCH
</button>
<button class="tab all-users" onclick="showTab('all-users')">
<i class="fas fa-users"></i> Все пользователи
</button>
</div>
@@ -401,6 +450,108 @@
</div>
</div>
<!-- Help группа -->
<div id="help-section" class="content-section">
<div class="group-info">
<div class="group-color help"></div>
<div>
<h3>Группа "Help"</h3>
<p>Пользователи этой группы получают заявки поддержки</p>
</div>
</div>
<div class="search-box">
<input type="text" id="help-search" class="search-input"
placeholder="Поиск пользователей..." onkeyup="filterUsers('help')">
</div>
<div class="stats">
<div class="stat-card">
<div class="stat-number" id="help-count">0</div>
<div class="stat-label">Всего пользователей</div>
</div>
<div class="stat-card">
<div class="stat-number" id="help-in-group">0</div>
<div class="stat-label">В группе "Help"</div>
</div>
</div>
<div id="help-users" class="users-container">
<div class="loading">
<i class="fas fa-spinner fa-spin"></i>
<p>Загрузка пользователей...</p>
</div>
</div>
</div>
<!-- Doc группа -->
<div id="doc-section" class="content-section">
<div class="group-info">
<div class="group-color doc"></div>
<div>
<h3>Группа "Doc"</h3>
<p>Пользователи этой группы работают с документами</p>
</div>
</div>
<div class="search-box">
<input type="text" id="doc-search" class="search-input"
placeholder="Поиск пользователей..." onkeyup="filterUsers('doc')">
</div>
<div class="stats">
<div class="stat-card">
<div class="stat-number" id="doc-count">0</div>
<div class="stat-label">Всего пользователей</div>
</div>
<div class="stat-card">
<div class="stat-number" id="doc-in-group">0</div>
<div class="stat-label">В группе "Doc"</div>
</div>
</div>
<div id="doc-users" class="users-container">
<div class="loading">
<i class="fas fa-spinner fa-spin"></i>
<p>Загрузка пользователей...</p>
</div>
</div>
</div>
<!-- AHCH группа -->
<div id="ahch-section" class="content-section">
<div class="group-info">
<div class="group-color ahch"></div>
<div>
<h3>Группа "AHCH"</h3>
<p>Пользователи этой группы работают с AHCH задачами</p>
</div>
</div>
<div class="search-box">
<input type="text" id="ahch-search" class="search-input"
placeholder="Поиск пользователей..." onkeyup="filterUsers('ahch')">
</div>
<div class="stats">
<div class="stat-card">
<div class="stat-number" id="ahch-count">0</div>
<div class="stat-label">Всего пользователей</div>
</div>
<div class="stat-card">
<div class="stat-number" id="ahch-in-group">0</div>
<div class="stat-label">В группе "AHCH"</div>
</div>
</div>
<div id="ahch-users" class="users-container">
<div class="loading">
<i class="fas fa-spinner fa-spin"></i>
<p>Загрузка пользователей...</p>
</div>
</div>
</div>
<!-- Все пользователи -->
<div id="all-users-section" class="content-section">
<div class="search-box">
@@ -415,12 +566,24 @@
</div>
<div class="stat-card">
<div class="stat-number" id="admins-count">0</div>
<div class="stat-label">Администраторы</div>
<div class="stat-label">Администрация</div>
</div>
<div class="stat-card">
<div class="stat-number" id="secretaries-count">0</div>
<div class="stat-label">Секретари</div>
</div>
<div class="stat-card">
<div class="stat-number" id="help-count-all">0</div>
<div class="stat-label">Help</div>
</div>
<div class="stat-card">
<div class="stat-number" id="doc-count-all">0</div>
<div class="stat-label">Doc</div>
</div>
<div class="stat-card">
<div class="stat-number" id="ahch-count-all">0</div>
<div class="stat-label">AHCH</div>
</div>
</div>
<div id="all-users" class="users-container">
@@ -435,8 +598,13 @@
<script>
let currentTab = 'secretary';
let allUsers = [];
let secretaryGroupId = null;
let adminGroupId = null;
let groupIds = {
'secretary': null,
'admin': null,
'help': null,
'doc': null,
'ahch': null
};
// Проверка авторизации
async function checkAuth() {
@@ -469,17 +637,12 @@
const groupsResponse = await fetch('/api/groups');
const groups = await groupsResponse.json();
// Находим ID групп
secretaryGroupId = groups.find(g => g.name === 'Секретарь')?.id;
adminGroupId = groups.find(g => g.name === 'Администрация')?.id;
if (!secretaryGroupId) {
console.warn('Группа "Секретарь" не найдена');
}
if (!adminGroupId) {
console.warn('Группа "Администрация" не найдена');
}
// Находим ID всех групп
groupIds.secretary = groups.find(g => g.name === 'Секретарь')?.id;
groupIds.admin = groups.find(g => g.name === 'Администрация')?.id;
groupIds.help = groups.find(g => g.name === 'help')?.id;
groupIds.doc = groups.find(g => g.name === 'doc')?.id;
groupIds.ahch = groups.find(g => g.name === 'ahch')?.id;
// Загружаем всех пользователей
const usersResponse = await fetch('/api/users/all');
@@ -511,19 +674,57 @@
document.getElementById('admin-count').textContent = allUsers.length;
document.getElementById('admin-in-group').textContent = adminUsers.length;
// Статистика для help
const helpUsers = allUsers.filter(u => u.groups?.some(g => g.group_name === 'help'));
document.getElementById('help-count').textContent = allUsers.length;
document.getElementById('help-in-group').textContent = helpUsers.length;
// Статистика для doc
const docUsers = allUsers.filter(u => u.groups?.some(g => g.group_name === 'doc'));
document.getElementById('doc-count').textContent = allUsers.length;
document.getElementById('doc-in-group').textContent = docUsers.length;
// Статистика для ahch
const ahchUsers = allUsers.filter(u => u.groups?.some(g => g.group_name === 'ahch'));
document.getElementById('ahch-count').textContent = allUsers.length;
document.getElementById('ahch-in-group').textContent = ahchUsers.length;
// Общая статистика
document.getElementById('total-users').textContent = allUsers.length;
document.getElementById('admins-count').textContent = adminUsers.length;
document.getElementById('secretaries-count').textContent = secretaryUsers.length;
document.getElementById('help-count-all').textContent = helpUsers.length;
document.getElementById('doc-count-all').textContent = docUsers.length;
document.getElementById('ahch-count-all').textContent = ahchUsers.length;
}
// Отображение пользователей
function renderUsers() {
renderSecretaryUsers();
renderAdminUsers();
renderHelpUsers();
renderDocUsers();
renderAhchUsers();
renderAllUsers();
}
// Проверка, состоит ли пользователь в группе
function isUserInGroup(user, groupName) {
return user.groups?.some(g => g.group_name === groupName);
}
// Получение иконки для группы
function getGroupIcon(groupName) {
const icons = {
'Секретарь': 'fa-file-signature',
'Администрация': 'fa-user-shield',
'help': 'fa-hands-helping',
'doc': 'fa-file-alt',
'ahch': 'fa-school'
};
return icons[groupName] || 'fa-users';
}
// Отображение пользователей для секретарей
function renderSecretaryUsers() {
const container = document.getElementById('secretary-users');
@@ -546,8 +747,11 @@
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = user.groups?.some(g => g.group_name === 'Секретарь');
const isAdmin = user.groups?.some(g => g.group_name === 'Администрация');
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
@@ -555,7 +759,7 @@
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Учитель'}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
@@ -567,15 +771,18 @@
<div class="group-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isSecretary ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'secretary')">
<i class="fas fa-user-minus"></i> Убрать из секретарей
<i class="fas fa-user-minus"></i> Убрать
</button>` :
`<button class="btn btn-success" onclick="addToGroup(${user.id}, 'secretary')">
<i class="fas fa-user-plus"></i> Добавить в секретари
<i class="fas fa-user-plus"></i> Добавить
</button>`
}
</div>
@@ -606,8 +813,11 @@
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = user.groups?.some(g => g.group_name === 'Секретарь');
const isAdmin = user.groups?.some(g => g.group_name === 'Администрация');
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
@@ -615,7 +825,7 @@
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Учитель'}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
@@ -627,15 +837,216 @@
<div class="group-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isAdmin ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'admin')">
<i class="fas fa-user-minus"></i> Убрать из администрации
<i class="fas fa-user-minus"></i> Убрать
</button>` :
`<button class="btn btn-success" onclick="addToGroup(${user.id}, 'admin')">
<i class="fas fa-user-plus"></i> Добавить в администрацию
<i class="fas fa-user-plus"></i> Добавить
</button>`
}
</div>
</div>
`;
}).join('');
}
// Отображение пользователей для help
function renderHelpUsers() {
const container = document.getElementById('help-users');
const searchTerm = document.getElementById('help-search').value.toLowerCase();
const filteredUsers = allUsers.filter(user =>
user.name.toLowerCase().includes(searchTerm) ||
user.login.toLowerCase().includes(searchTerm) ||
user.email.toLowerCase().includes(searchTerm)
);
if (filteredUsers.length === 0) {
container.innerHTML = `
<div class="no-users">
<i class="fas fa-users-slash" style="font-size: 48px; color: #ccc; margin-bottom: 15px;"></i>
<p>Пользователи не найдены</p>
</div>
`;
return;
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
<div class="user-header">
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
<div class="user-details">
<div><i class="fas fa-user"></i> ${user.login}</div>
<div><i class="fas fa-envelope"></i> ${user.email}</div>
</div>
<div class="group-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isHelp ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'help')">
<i class="fas fa-user-minus"></i> Убрать
</button>` :
`<button class="btn btn-help" onclick="addToGroup(${user.id}, 'help')">
<i class="fas fa-user-plus"></i> Добавить
</button>`
}
</div>
</div>
`;
}).join('');
}
// Отображение пользователей для doc
function renderDocUsers() {
const container = document.getElementById('doc-users');
const searchTerm = document.getElementById('doc-search').value.toLowerCase();
const filteredUsers = allUsers.filter(user =>
user.name.toLowerCase().includes(searchTerm) ||
user.login.toLowerCase().includes(searchTerm) ||
user.email.toLowerCase().includes(searchTerm)
);
if (filteredUsers.length === 0) {
container.innerHTML = `
<div class="no-users">
<i class="fas fa-users-slash" style="font-size: 48px; color: #ccc; margin-bottom: 15px;"></i>
<p>Пользователи не найдены</p>
</div>
`;
return;
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
<div class="user-header">
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
<div class="user-details">
<div><i class="fas fa-user"></i> ${user.login}</div>
<div><i class="fas fa-envelope"></i> ${user.email}</div>
</div>
<div class="group-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isDoc ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'doc')">
<i class="fas fa-user-minus"></i> Убрать
</button>` :
`<button class="btn btn-doc" onclick="addToGroup(${user.id}, 'doc')">
<i class="fas fa-user-plus"></i> Добавить
</button>`
}
</div>
</div>
`;
}).join('');
}
// Отображение пользователей для ahch
function renderAhchUsers() {
const container = document.getElementById('ahch-users');
const searchTerm = document.getElementById('ahch-search').value.toLowerCase();
const filteredUsers = allUsers.filter(user =>
user.name.toLowerCase().includes(searchTerm) ||
user.login.toLowerCase().includes(searchTerm) ||
user.email.toLowerCase().includes(searchTerm)
);
if (filteredUsers.length === 0) {
container.innerHTML = `
<div class="no-users">
<i class="fas fa-users-slash" style="font-size: 48px; color: #ccc; margin-bottom: 15px;"></i>
<p>Пользователи не найдены</p>
</div>
`;
return;
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
<div class="user-header">
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
<div class="user-details">
<div><i class="fas fa-user"></i> ${user.login}</div>
<div><i class="fas fa-envelope"></i> ${user.email}</div>
</div>
<div class="group-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isAhch ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'ahch')">
<i class="fas fa-user-minus"></i> Убрать
</button>` :
`<button class="btn btn-ahch" onclick="addToGroup(${user.id}, 'ahch')">
<i class="fas fa-user-plus"></i> Добавить
</button>`
}
</div>
@@ -666,8 +1077,11 @@
}
container.innerHTML = filteredUsers.map(user => {
const isSecretary = user.groups?.some(g => g.group_name === 'Секретарь');
const isAdmin = user.groups?.some(g => g.group_name === 'Администрация');
const isSecretary = isUserInGroup(user, 'Секретарь');
const isAdmin = isUserInGroup(user, 'Администрация');
const isHelp = isUserInGroup(user, 'help');
const isDoc = isUserInGroup(user, 'doc');
const isAhch = isUserInGroup(user, 'ahch');
return `
<div class="user-card">
@@ -675,7 +1089,7 @@
<div class="user-avatar">${user.name.charAt(0).toUpperCase()}</div>
<div>
<div class="user-name">${user.name}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Учитель'}</div>
<div class="user-role">${user.role === 'admin' ? 'Администратор' : 'Пользователь'}</div>
</div>
</div>
@@ -684,26 +1098,53 @@
<div><i class="fas fa-envelope"></i> ${user.email}</div>
</div>
<div class="group-badges">
<div class="all-groups-badges">
${isSecretary ? '<span class="group-badge secretary"><i class="fas fa-file-signature"></i> Секретарь</span>' : ''}
${isAdmin ? '<span class="group-badge admin"><i class="fas fa-user-shield"></i> Администрация</span>' : ''}
${isHelp ? '<span class="group-badge help"><i class="fas fa-hands-helping"></i> help</span>' : ''}
${isDoc ? '<span class="group-badge doc"><i class="fas fa-file-alt"></i> doc</span>' : ''}
${isAhch ? '<span class="group-badge ahch"><i class="fas fa-school"></i> ahch</span>' : ''}
</div>
<div class="user-actions">
${isSecretary ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'secretary')">
<i class="fas fa-user-minus"></i> Убрать из секретарей
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'secretary')" title="Убрать из секретарей">
<i class="fas fa-user-minus"></i>
</button>` :
`<button class="btn btn-success" onclick="addToGroup(${user.id}, 'secretary')">
<i class="fas fa-user-plus"></i> В секретари
`<button class="btn btn-success" onclick="addToGroup(${user.id}, 'secretary')" title="Добавить в секретари">
<i class="fas fa-user-plus"></i>
</button>`
}
${isAdmin ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'admin')">
<i class="fas fa-user-minus"></i> Убрать из администрации
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'admin')" title="Убрать из администрации">
<i class="fas fa-user-minus"></i>
</button>` :
`<button class="btn btn-primary" onclick="addToGroup(${user.id}, 'admin')">
<i class="fas fa-user-plus"></i> В администрацию
`<button class="btn btn-primary" onclick="addToGroup(${user.id}, 'admin')" title="Добавить в администрацию">
<i class="fas fa-user-plus"></i>
</button>`
}
${isHelp ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'help')" title="Убрать из help">
<i class="fas fa-user-minus"></i>
</button>` :
`<button class="btn btn-help" onclick="addToGroup(${user.id}, 'help')" title="Добавить в help">
<i class="fas fa-user-plus"></i>
</button>`
}
${isDoc ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'doc')" title="Убрать из doc">
<i class="fas fa-user-minus"></i>
</button>` :
`<button class="btn btn-doc" onclick="addToGroup(${user.id}, 'doc')" title="Добавить в doc">
<i class="fas fa-user-plus"></i>
</button>`
}
${isAhch ?
`<button class="btn btn-danger" onclick="removeFromGroup(${user.id}, 'ahch')" title="Убрать из ahch">
<i class="fas fa-user-minus"></i>
</button>` :
`<button class="btn btn-ahch" onclick="addToGroup(${user.id}, 'ahch')" title="Добавить в ahch">
<i class="fas fa-user-plus"></i>
</button>`
}
</div>
@@ -721,6 +1162,15 @@
case 'admin':
renderAdminUsers();
break;
case 'help':
renderHelpUsers();
break;
case 'doc':
renderDocUsers();
break;
case 'ahch':
renderAhchUsers();
break;
case 'all':
renderAllUsers();
break;
@@ -735,36 +1185,29 @@
document.querySelectorAll('.tab').forEach(tab => {
tab.classList.remove('active');
});
document.querySelectorAll('.tab').forEach(tab => {
if (tab.onclick.toString().includes(tabName)) {
tab.classList.add('active');
}
});
// Обновляем активные секции
document.querySelectorAll('.content-section').forEach(section => {
section.classList.remove('active');
});
switch(tabName) {
case 'secretary':
document.getElementById('secretary-section').classList.add('active');
break;
case 'administration':
document.getElementById('administration-section').classList.add('active');
break;
case 'all-users':
document.getElementById('all-users-section').classList.add('active');
break;
}
// Активируем выбранную вкладку
document.querySelector(`.tab.${tabName}`).classList.add('active');
document.getElementById(`${tabName}-section`).classList.add('active');
}
// Добавить пользователя в группу
async function addToGroup(userId, groupType) {
if (!await checkAuth()) return;
const groupName = groupType === 'secretary' ? 'Секретарь' : 'Администрация';
const groupId = groupType === 'secretary' ? secretaryGroupId : adminGroupId;
const groupNames = {
'secretary': 'Секретарь',
'admin': 'Администрация',
'help': 'help',
'doc': 'doc',
'ahch': 'ahch'
};
const groupName = groupNames[groupType];
const groupId = groupIds[groupType];
if (!groupId) {
showError(`Группа "${groupName}" не найдена`);
@@ -795,8 +1238,16 @@
async function removeFromGroup(userId, groupType) {
if (!await checkAuth()) return;
const groupName = groupType === 'secretary' ? 'Секретарь' : 'Администрация';
const groupId = groupType === 'secretary' ? secretaryGroupId : adminGroupId;
const groupNames = {
'secretary': 'Секретарь',
'admin': 'Администрация',
'help': 'help',
'doc': 'doc',
'ahch': 'ahch'
};
const groupName = groupNames[groupType];
const groupId = groupIds[groupType];
if (!groupId) {
showError(`Группа "${groupName}" не найдена`);