Files
minicrm/public/admin.html
2026-01-27 00:45:24 +05:00

464 lines
16 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>School CRM - Административная панель</title>
<link rel="stylesheet" href="style.css">
<style>
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
border-left: 4px solid #3498db;
}
.stat-card.task-stat {
border-left-color: #3498db;
}
.stat-card.user-stat {
border-left-color: #2ecc71;
}
.stat-card.file-stat {
border-left-color: #9b59b6;
}
.stat-card.status-stat {
border-left-color: #f39c12;
}
.stat-card h3 {
margin: 0 0 15px 0;
color: #495057;
font-size: 1.1rem;
font-weight: 600;
}
.stat-value {
font-size: 2.5rem;
font-weight: 700;
color: #2c3e50;
margin-bottom: 10px;
}
.stat-desc {
color: #6c757d;
font-size: 0.9rem;
margin-bottom: 10px;
}
.stat-subitems {
margin-top: 10px;
}
.stat-subitem {
display: flex;
justify-content: space-between;
padding: 5px 0;
border-bottom: 1px solid #f1f1f1;
font-size: 0.9rem;
}
.stat-subitem:last-child {
border-bottom: none;
}
.stat-subitem .label {
color: #6c757d;
}
.stat-subitem .value {
font-weight: 600;
color: #2c3e50;
}
.recent-tasks {
background: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
margin-top: 20px;
}
.recent-tasks h3 {
margin: 0 0 15px 0;
color: #495057;
font-size: 1.2rem;
}
.task-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px;
border-bottom: 1px solid #e9ecef;
transition: all 0.3s ease;
}
.task-item:hover {
background: #f8f9fa;
}
.task-item:last-child {
border-bottom: none;
}
.task-info {
flex: 1;
}
.task-title {
font-weight: 600;
color: #2c3e50;
margin-bottom: 5px;
}
.task-meta {
font-size: 0.85rem;
color: #6c757d;
}
.task-actions {
display: flex;
gap: 8px;
}
.view-task-btn {
padding: 6px 12px;
background: #3498db;
color: white;
border: none;
border-radius: 6px;
cursor: pointer;
font-size: 0.85rem;
text-decoration: none;
display: inline-block;
}
.view-task-btn:hover {
background: #2980b9;
}
.percentage-bar {
height: 6px;
background: #e9ecef;
border-radius: 3px;
margin-top: 8px;
overflow: hidden;
}
.percentage-fill {
height: 100%;
background: #3498db;
border-radius: 3px;
transition: width 0.3s ease;
}
.users-table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.users-table th,
.users-table td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #e9ecef;
}
.users-table th {
background: #f8f9fa;
font-weight: 600;
color: #495057;
}
.users-table tr:hover {
background: #f8f9fa;
}
.user-actions {
display: flex;
gap: 8px;
}
.ldap-badge {
background: #3498db;
color: white;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.75rem;
margin-left: 5px;
}
.admin-badge {
background: #e74c3c;
color: white;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.75rem;
margin-left: 5px;
}
.form-row {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.form-row .form-group {
flex: 1;
}
.modal-lg {
max-width: 800px;
}
.search-container {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
.search-container input {
flex: 1;
}
.file-size {
font-size: 1.2rem;
color: #2c3e50;
margin-top: 5px;
}
</style>
</head>
<body>
<div id="login-modal" class="modal">
<div class="modal-content">
<h2>Вход в School CRM</h2>
<form id="login-form">
<div class="form-group">
<label for="login">Логин:</label>
<input type="text" id="login" name="login" required>
</div>
<div class="form-group">
<label for="password">Пароль:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">Войти</button>
</form>
<div class="test-users">
<h3>Тестовые пользователи:</h3>
<ul>
<li><strong>admin</strong> / admin123 (Администратор)</li>
<li><strong>teacher</strong> / teacher123</li>
</ul>
</div>
</div>
</div>
<div class="admin-container">
<div class="admin-header">
<h1>Административная панель</h1>
<div class="user-info">
<span id="current-user"></span>
<button onclick="window.location.href = '/'">Главная</button>
<button onclick="window.location.href = '/admin/groups'">Управление группами</button>
<button onclick="window.location.href = '/admin/profiles'">profiles</button>
<button onclick="logout()">Выйти</button>
</div>
</div>
<div class="admin-tabs">
<button class="admin-tab active" onclick="showAdminSection('dashboard')">Дашборд</button>
<button class="admin-tab" onclick="showAdminSection('users')">Пользователи</button>
<button class="admin-tab" onclick="showAdminSection('dashboard')">test</button>
</div>
<div id="admin-dashboard" class="admin-section active">
<h2>Статистика системы</h2>
<div class="stats-grid">
<div class="stat-card task-stat">
<h3>Задачи</h3>
<div class="stat-value" id="total-tasks">0</div>
<div class="stat-desc">Всего задач в системе</div>
<div class="percentage-bar">
<div class="percentage-fill" id="active-tasks-bar" style="width: 0%"></div>
</div>
<div class="stat-subitems">
<div class="stat-subitem">
<span class="label">Активные:</span>
<span class="value" id="active-tasks">0</span>
</div>
<div class="stat-subitem">
<span class="label">Закрытые:</span>
<span class="value" id="closed-tasks">0</span>
</div>
<div class="stat-subitem">
<span class="label">Удаленные:</span>
<span class="value" id="deleted-tasks">0</span>
</div>
</div>
</div>
<div class="stat-card status-stat">
<h3>Статусы назначений</h3>
<div class="stat-value" id="total-assignments">0</div>
<div class="stat-desc">Всего назначений</div>
<div class="stat-subitems">
<div class="stat-subitem">
<span class="label">Назначено:</span>
<span class="value" id="assigned-count">0</span>
</div>
<div class="stat-subitem">
<span class="label">В работе:</span>
<span class="value" id="in-progress-count">0</span>
</div>
<div class="stat-subitem">
<span class="label">Выполнено:</span>
<span class="value" id="completed-count">0</span>
</div>
<div class="stat-subitem">
<span class="label">Просрочено:</span>
<span class="value" id="overdue-count">0</span>
</div>
<div class="stat-subitem">
<span class="label">На доработке:</span>
<span class="value" id="rework-count">0</span>
</div>
</div>
</div>
<div class="stat-card user-stat">
<h3>Пользователи</h3>
<div class="stat-value" id="total-users">0</div>
<div class="stat-desc">Зарегистрировано пользователей</div>
<div class="stat-subitems">
<div class="stat-subitem">
<span class="label">Администраторы:</span>
<span class="value" id="admin-users">0</span>
</div>
<div class="stat-subitem">
<span class="label">Учителя:</span>
<span class="value" id="teacher-users">0</span>
</div>
<div class="stat-subitem">
<span class="label">LDAP:</span>
<span class="value" id="ldap-users">0</span>
</div>
<div class="stat-subitem">
<span class="label">Локальные:</span>
<span class="value" id="local-users">0</span>
</div>
</div>
</div>
<div class="stat-card file-stat">
<h3>Файлы</h3>
<div class="stat-value" id="total-files">0</div>
<div class="stat-desc">Всего загружено файлов</div>
<div class="file-size" id="total-files-size">0 MB</div>
</div>
</div>
</div>
<div id="admin-users-section" class="admin-section">
<h2>Управление пользователями</h2>
<div class="search-container">
<input type="text" id="user-search" placeholder="Поиск пользователей по логину, имени или email..." oninput="searchUsers()">
<button onclick="loadUsers()">Сбросить</button>
</div>
<table class="users-table">
<thead>
<tr>
<th>ID</th>
<th>Логин</th>
<th>Имя</th>
<th>Email</th>
<th>Роль</th>
<th>Тип</th>
<th>Дата создания</th>
<th>Последний вход</th>
<th>Действия</th>
</tr>
</thead>
<tbody id="users-table-body">
<tr>
<td colspan="9" class="loading">Загрузка пользователей...</td>
</tr>
</tbody>
</table>
</div>
</div>
<div id="edit-user-modal" class="modal">
<div class="modal-content modal-lg">
<span class="close" onclick="closeEditUserModal()">&times;</span>
<h3>Редактировать пользователя</h3>
<form id="edit-user-form">
<input type="hidden" id="edit-user-id">
<div class="form-row">
<div class="form-group">
<label for="edit-login">Логин *</label>
<input type="text" id="edit-login" name="login" required>
</div>
<div class="form-group">
<label for="edit-name">Имя *</label>
<input type="text" id="edit-name" name="name" required>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="edit-email">Email *</label>
<input type="email" id="edit-email" name="email" required>
</div>
<div class="form-group">
<label for="edit-role">Роль</label>
<select id="edit-role" name="role">
<option value="teacher">Учитель</option>
<option value="admin">Администратор</option>
</select>
</div>
</div>
<div class="form-row">
<div class="form-group">
<label for="edit-auth-type">Тип авторизации</label>
<select id="edit-auth-type" name="auth_type">
<option value="local">Локальная</option>
<option value="ldap">LDAP</option>
</select>
</div>
<div class="form-group">
<label for="edit-groups">Группы (JSON)</label>
<input type="text" id="edit-groups" name="groups" placeholder='["group1", "group2"]'>
</div>
</div>
<div class="form-group">
<label for="edit-description">Описание</label>
<textarea id="edit-description" name="description" rows="3"></textarea>
</div>
<button type="submit">Сохранить изменения</button>
</form>
</div>
</div>
<script src="admin-script.js"></script>
</body>
</html>