цвета
This commit is contained in:
@@ -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}" не найдена`);
|
||||
|
||||
Reference in New Issue
Block a user