Final version

This commit is contained in:
cyrteL
2025-08-22 19:26:43 +03:00
committed by GitHub
parent b4c1a2caa9
commit 558cd96cdf
31 changed files with 6181 additions and 1632 deletions

570
admin/users.html Normal file
View File

@ -0,0 +1,570 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Управление пользователями - Склад-Менеджер</title>
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Font Awesome -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="../css/style.css" rel="stylesheet">
<style>
.user-card {
transition: all 0.3s ease;
border: 1px solid #e9ecef;
}
.user-card:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
}
.role-badge {
font-size: 0.75rem;
padding: 0.25rem 0.5rem;
}
.permission-chip {
display: inline-block;
background: #f8f9fa;
border: 1px solid #dee2e6;
border-radius: 15px;
padding: 0.2rem 0.5rem;
margin: 0.1rem;
font-size: 0.75rem;
}
.status-active {
color: #198754;
}
.status-inactive {
color: #dc3545;
}
.search-highlight {
background-color: #fff3cd;
padding: 0.1rem 0.2rem;
border-radius: 3px;
}
</style>
</head>
<body>
<!-- Navigation -->
<nav class="navbar navbar-expand-lg navbar-dark bg-primary">
<div class="container-fluid">
<a class="navbar-brand" href="../index.html">
<i class="fas fa-warehouse me-2"></i>
Склад-Менеджер
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto">
<li class="nav-item">
<a class="nav-link" href="../index.html">
<i class="fas fa-home me-1"></i>Главная
</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-boxes me-1"></i>Каталог
</a>
<ul class="dropdown-menu" id="catalogCategoriesDropdown">
<li><a class="dropdown-item" href="../catalog.html">Все позиции</a></li>
<li><hr class="dropdown-divider"></li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="../history.html">
<i class="fas fa-history me-1"></i>История
</a>
</li>
<li class="nav-item">
<a class="nav-link" href="../search.html">
<i class="fas fa-search me-1"></i>Поиск
</a>
</li>
</ul>
<!-- Admin Dropdown -->
<ul class="navbar-nav" id="adminDropdown" style="display: none;">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-cogs me-1"></i>Администрирование
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="categories.html">
<i class="fas fa-tags me-2"></i>Категории позиций
</a></li>
<li><a class="dropdown-item active" href="users.html">
<i class="fas fa-users me-2"></i>Управление пользователями
</a></li>
</ul>
</li>
</ul>
<!-- Profile Dropdown -->
<ul class="navbar-nav" id="profileDropdown" style="display: none;">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
<i class="fas fa-user me-1"></i>Профиль
</a>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="../profile.html">
<i class="fas fa-user-circle me-2"></i>Мой профиль
</a></li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" href="#" id="logoutBtn">
<i class="fas fa-sign-out-alt me-2"></i>Выйти
</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
<!-- Main Content -->
<main class="container-fluid py-4">
<!-- Header -->
<div class="row mb-4">
<div class="col-12">
<div class="d-flex justify-content-between align-items-center">
<div>
<h1 class="h3 mb-0">
<i class="fas fa-users me-2 text-primary"></i>
Управление пользователями
</h1>
<p class="text-muted mb-0">Создание, редактирование и управление пользователями системы</p>
</div>
<button class="btn btn-primary" id="addUserBtn" data-bs-toggle="modal" data-bs-target="#addUserModal">
<i class="fas fa-plus me-2"></i>Добавить пользователя
</button>
</div>
</div>
</div>
<!-- Filters and Search -->
<div class="row mb-4">
<div class="col-md-8">
<div class="input-group">
<span class="input-group-text">
<i class="fas fa-search"></i>
</span>
<input type="text" class="form-control" id="searchInput" placeholder="Поиск по имени, email, отделу...">
</div>
</div>
<div class="col-md-4">
<select class="form-select" id="roleFilter">
<option value="">Все роли</option>
<option value="admin">Администратор</option>
<option value="manager">Менеджер</option>
<option value="operator">Оператор</option>
<option value="viewer">Наблюдатель</option>
</select>
</div>
</div>
<!-- Statistics Cards -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card bg-primary text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="totalUsers">0</h4>
<p class="card-text">Всего пользователей</p>
</div>
<div class="align-self-center">
<i class="fas fa-users fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-success text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="activeUsers">0</h4>
<p class="card-text">Активных</p>
</div>
<div class="align-self-center">
<i class="fas fa-user-check fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-warning text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="adminUsers">0</h4>
<p class="card-text">Администраторов</p>
</div>
<div class="align-self-center">
<i class="fas fa-user-shield fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card bg-info text-white">
<div class="card-body">
<div class="d-flex justify-content-between">
<div>
<h4 class="card-title" id="managerUsers">0</h4>
<p class="card-text">Менеджеров</p>
</div>
<div class="align-self-center">
<i class="fas fa-user-tie fa-2x"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Users Grid -->
<div class="row" id="usersGrid">
<!-- Users will be loaded here -->
</div>
<!-- Loading State -->
<div id="loadingState" class="text-center py-5" style="display: none;">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">Загрузка...</span>
</div>
<p class="mt-3 text-muted">Загрузка пользователей...</p>
</div>
<!-- Empty State -->
<div id="emptyState" class="text-center py-5" style="display: none;">
<i class="fas fa-users fa-3x text-muted mb-3"></i>
<h4 class="text-muted">Пользователи не найдены</h4>
<p class="text-muted">Попробуйте изменить параметры поиска или добавьте первого пользователя</p>
</div>
</main>
<!-- Add User Modal -->
<div class="modal fade" id="addUserModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-user-plus me-2"></i>
Добавить пользователя
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form id="addUserForm">
<div class="modal-body">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="username" class="form-label">Имя пользователя *</label>
<input type="text" class="form-control" id="username" required>
<div class="form-text">Уникальное имя для входа в систему</div>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="email" class="form-label">Email *</label>
<input type="email" class="form-control" id="email" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="fullName" class="form-label">Полное имя *</label>
<input type="text" class="form-control" id="fullName" required>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="department" class="form-label">Отдел</label>
<input type="text" class="form-control" id="department">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="position" class="form-label">Должность</label>
<input type="text" class="form-control" id="position">
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="password" class="form-label">Пароль *</label>
<input type="password" class="form-control" id="password" required>
<div class="form-text">Минимум 6 символов</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Роли *</label>
<div class="row">
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="roleAdmin" value="admin">
<label class="form-check-label" for="roleAdmin">
<i class="fas fa-user-shield me-1"></i>Администратор
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="roleManager" value="manager">
<label class="form-check-label" for="roleManager">
<i class="fas fa-user-tie me-1"></i>Менеджер
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="roleOperator" value="operator">
<label class="form-check-label" for="roleOperator">
<i class="fas fa-user-cog me-1"></i>Оператор
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="roleViewer" value="viewer">
<label class="form-check-label" for="roleViewer">
<i class="fas fa-user me-1"></i>Наблюдатель
</label>
</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Разрешения</label>
<div class="row">
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="permRead" value="read" checked>
<label class="form-check-label" for="permRead">Чтение</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="permWrite" value="write">
<label class="form-check-label" for="permWrite">Запись</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="permDelete" value="delete">
<label class="form-check-label" for="permDelete">Удаление</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="permAdmin" value="admin">
<label class="form-check-label" for="permAdmin">Администрирование</label>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>Сохранить
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Edit User Modal -->
<div class="modal fade" id="editUserModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
<i class="fas fa-user-edit me-2"></i>
Редактировать пользователя
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<form id="editUserForm">
<input type="hidden" id="editUserId">
<div class="modal-body">
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="editUsername" class="form-label">Имя пользователя *</label>
<input type="text" class="form-control" id="editUsername" required>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="editEmail" class="form-label">Email *</label>
<input type="email" class="form-control" id="editEmail" required>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="editFullName" class="form-label">Полное имя *</label>
<input type="text" class="form-control" id="editFullName" required>
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="editDepartment" class="form-label">Отдел</label>
<input type="text" class="form-control" id="editDepartment">
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="mb-3">
<label for="editPosition" class="form-label">Должность</label>
<input type="text" class="form-control" id="editPosition">
</div>
</div>
<div class="col-md-6">
<div class="mb-3">
<label for="editPassword" class="form-label">Новый пароль</label>
<input type="password" class="form-control" id="editPassword">
<div class="form-text">Оставьте пустым, чтобы не изменять</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Роли *</label>
<div class="row">
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editRoleAdmin" value="admin">
<label class="form-check-label" for="editRoleAdmin">
<i class="fas fa-user-shield me-1"></i>Администратор
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editRoleManager" value="manager">
<label class="form-check-label" for="editRoleManager">
<i class="fas fa-user-tie me-1"></i>Менеджер
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editRoleOperator" value="operator">
<label class="form-check-label" for="editRoleOperator">
<i class="fas fa-user-cog me-1"></i>Оператор
</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editRoleViewer" value="viewer">
<label class="form-check-label" for="editRoleViewer">
<i class="fas fa-user me-1"></i>Наблюдатель
</label>
</div>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-label">Разрешения</label>
<div class="row">
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editPermRead" value="read">
<label class="form-check-label" for="editPermRead">Чтение</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editPermWrite" value="write">
<label class="form-check-label" for="editPermWrite">Запись</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editPermDelete" value="delete">
<label class="form-check-label" for="editPermDelete">Удаление</label>
</div>
</div>
<div class="col-md-3">
<div class="form-check">
<input class="form-check-input" type="checkbox" id="editPermAdmin" value="admin">
<label class="form-check-label" for="editPermAdmin">Администрирование</label>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="submit" class="btn btn-primary">
<i class="fas fa-save me-2"></i>Сохранить изменения
</button>
</div>
</form>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteUserModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title text-danger">
<i class="fas fa-exclamation-triangle me-2"></i>
Подтверждение удаления
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<p>Вы действительно хотите удалить пользователя <strong id="deleteUserName"></strong>?</p>
<p class="text-muted">Это действие нельзя отменить.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Отмена</button>
<button type="button" class="btn btn-danger" id="confirmDeleteBtn">
<i class="fas fa-trash me-2"></i>Удалить
</button>
</div>
</div>
</div>
</div>
<!-- Scripts -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="../js/auth.js"></script>
<script src="../js/users.js"></script>
</body>
</html>