Final version
This commit is contained in:
420
admin/email-test.html
Normal file
420
admin/email-test.html
Normal file
@ -0,0 +1,420 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Тест Email - Склад-Менеджер</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
|
||||
<link href="../css/style.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Главная навигационная панель -->
|
||||
<nav class="navbar navbar-expand-lg navbar-light bg-white border-bottom">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="../index.html">
|
||||
<i class="fas fa-warehouse me-2 text-primary"></i>
|
||||
<span class="fw-bold">Склад-Менеджер</span>
|
||||
</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 ms-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" id="adminDropdown" style="display: none;">
|
||||
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown">
|
||||
<i class="fas fa-cog me-1"></i>Администрирование
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a class="dropdown-item" href="users.html">Управление пользователями</a></li>
|
||||
<li><a class="dropdown-item" href="categories.html">Категории позиций</a></li>
|
||||
<li><a class="dropdown-item" href="reports.html">Отчеты</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item active" href="email-test.html">Тест Email</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="nav-item dropdown" id="profileDropdown" style="display: none;">
|
||||
<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">Мой профиль</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="#" id="logoutBtn">Выйти</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Основной контент -->
|
||||
<main class="container mt-4">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||
<h1><i class="fas fa-envelope me-2"></i>Тест Email-уведомлений</h1>
|
||||
<a href="reports.html" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-arrow-left me-1"></i>Назад к отчетам
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Статус email-сервиса -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-info-circle me-2"></i>
|
||||
Статус Email-сервиса
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="emailStatus" class="text-center">
|
||||
<div class="spinner-border text-primary" role="status">
|
||||
<span class="visually-hidden">Загрузка...</span>
|
||||
</div>
|
||||
<p class="mt-2">Проверка статуса...</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Тестовая отправка email -->
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-paper-plane me-2"></i>
|
||||
Тестовая отправка Email
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form id="testEmailForm">
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="testEmail" class="form-label">Email получателя</label>
|
||||
<input type="email" class="form-control" id="testEmail" required
|
||||
placeholder="test@example.com">
|
||||
</div>
|
||||
<div class="col-md-6 mb-3">
|
||||
<label for="testSubject" class="form-label">Тема письма</label>
|
||||
<input type="text" class="form-control" id="testSubject" required
|
||||
placeholder="Тестовое уведомление">
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="testMessage" class="form-label">Сообщение</label>
|
||||
<textarea class="form-control" id="testMessage" rows="4" required
|
||||
placeholder="Введите текст сообщения..."></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="fas fa-paper-plane me-1"></i>Отправить тестовое письмо
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Быстрые тесты -->
|
||||
<div class="row">
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle me-2 text-warning"></i>
|
||||
Тест низкого остатка
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="card-text">Отправить уведомление о товарах с низким запасом</p>
|
||||
<button class="btn btn-warning btn-sm" onclick="testLowStockAlert()">
|
||||
<i class="fas fa-paper-plane me-1"></i>Отправить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-box me-2 text-success"></i>
|
||||
Тест операции
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="card-text">Отправить уведомление об операции на складе</p>
|
||||
<button class="btn btn-success btn-sm" onclick="testOperationNotification()">
|
||||
<i class="fas fa-paper-plane me-1"></i>Отправить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card h-100">
|
||||
<div class="card-header">
|
||||
<h6 class="mb-0">
|
||||
<i class="fas fa-chart-bar me-2 text-info"></i>
|
||||
Тест отчета
|
||||
</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p class="card-text">Отправить еженедельный отчет по операциям</p>
|
||||
<button class="btn btn-info btn-sm" onclick="testWeeklyReport()">
|
||||
<i class="fas fa-paper-plane me-1"></i>Отправить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Лог отправки -->
|
||||
<div class="card mt-4">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-list me-2"></i>
|
||||
Лог отправки
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="emailLog" class="bg-light p-3 rounded" style="max-height: 300px; overflow-y: auto;">
|
||||
<p class="text-muted mb-0">Лог отправки email-уведомлений будет отображаться здесь...</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Подвал -->
|
||||
<footer class="bg-dark text-white mt-5 py-4">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<h5>Система управления складом</h5>
|
||||
<p class="mb-0">Эффективное управление товарными запасами</p>
|
||||
</div>
|
||||
<div class="col-md-6 text-md-end">
|
||||
<p class="mb-0">© 2025 Склад-Менеджер. Все права защищены.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Скрипты -->
|
||||
<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.7.1.min.js"></script>
|
||||
<script src="../js/auth.js"></script>
|
||||
<script src="../js/warehouse.js"></script>
|
||||
<script>
|
||||
// Инициализация
|
||||
$(document).ready(async () => {
|
||||
try {
|
||||
// Проверяем авторизацию
|
||||
if (!auth.isUserAuthenticated()) {
|
||||
window.location.href = '../login.html';
|
||||
return;
|
||||
}
|
||||
|
||||
// Проверяем права администратора
|
||||
if (!auth.hasRole('admin')) {
|
||||
auth.showNotification('Недостаточно прав для доступа к этой странице', 'danger');
|
||||
window.location.href = '../index.html';
|
||||
return;
|
||||
}
|
||||
|
||||
// Обновляем информацию о пользователе
|
||||
updateUserInfo();
|
||||
|
||||
// Загружаем статус email-сервиса
|
||||
await loadEmailStatus();
|
||||
|
||||
// Привязываем события
|
||||
bindEvents();
|
||||
|
||||
} catch (error) {
|
||||
console.error('Ошибка инициализации:', error);
|
||||
auth.showNotification('Ошибка загрузки данных', 'danger');
|
||||
}
|
||||
});
|
||||
|
||||
// Обновление информации о пользователе
|
||||
function updateUserInfo() {
|
||||
const user = auth.getCurrentUser();
|
||||
if (user) {
|
||||
const profileToggle = $('#profileDropdown .dropdown-toggle');
|
||||
if (profileToggle.length) {
|
||||
profileToggle.html(`<i class="fas fa-user me-1"></i>${user.name}`);
|
||||
}
|
||||
$('#profileDropdown').show();
|
||||
$('#adminDropdown').show();
|
||||
}
|
||||
}
|
||||
|
||||
// Привязка событий
|
||||
function bindEvents() {
|
||||
// Обработчик формы тестового email
|
||||
$('#testEmailForm').on('submit', async (e) => {
|
||||
e.preventDefault();
|
||||
await sendTestEmail();
|
||||
});
|
||||
|
||||
// Обработчик выхода
|
||||
$('#logoutBtn').on('click', (e) => {
|
||||
e.preventDefault();
|
||||
auth.logout();
|
||||
window.location.href = '../login.html';
|
||||
});
|
||||
}
|
||||
|
||||
// Загрузка статуса email-сервиса
|
||||
async function loadEmailStatus() {
|
||||
try {
|
||||
const warehouse = new WarehouseManager();
|
||||
const status = await warehouse.apiRequest('/notifications/status');
|
||||
|
||||
$('#emailStatus').html(`
|
||||
<div class="text-success">
|
||||
<i class="fas fa-check-circle fa-2x mb-2"></i>
|
||||
<h5>Email-сервис активен</h5>
|
||||
<p class="mb-0">Последняя проверка: ${new Date().toLocaleString('ru-RU')}</p>
|
||||
</div>
|
||||
`);
|
||||
} catch (error) {
|
||||
$('#emailStatus').html(`
|
||||
<div class="text-danger">
|
||||
<i class="fas fa-exclamation-triangle fa-2x mb-2"></i>
|
||||
<h5>Email-сервис недоступен</h5>
|
||||
<p class="mb-0">Ошибка: ${error.message}</p>
|
||||
</div>
|
||||
`);
|
||||
}
|
||||
}
|
||||
|
||||
// Отправка тестового email
|
||||
async function sendTestEmail() {
|
||||
const email = $('#testEmail').val();
|
||||
const subject = $('#testSubject').val();
|
||||
const message = $('#testMessage').val();
|
||||
|
||||
if (!email || !subject || !message) {
|
||||
auth.showNotification('Пожалуйста, заполните все поля', 'warning');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
const warehouse = new WarehouseManager();
|
||||
const result = await warehouse.sendTestEmail(email, subject, message);
|
||||
|
||||
addToLog('success', `Тестовое письмо отправлено на ${email}`, result);
|
||||
auth.showNotification('Тестовое письмо отправлено успешно', 'success');
|
||||
|
||||
// Очищаем форму
|
||||
$('#testEmailForm')[0].reset();
|
||||
|
||||
} catch (error) {
|
||||
addToLog('error', `Ошибка отправки тестового письма: ${error.message}`);
|
||||
auth.showNotification('Ошибка отправки тестового письма', 'danger');
|
||||
}
|
||||
}
|
||||
|
||||
// Тест уведомления о низком остатке
|
||||
async function testLowStockAlert() {
|
||||
try {
|
||||
const warehouse = new WarehouseManager();
|
||||
const lowStockItems = await warehouse.getLowStockItems();
|
||||
|
||||
if (lowStockItems.length === 0) {
|
||||
// Создаем тестовые данные
|
||||
const testItems = [
|
||||
{ name: 'Тестовый товар 1', quantity: 2, minQuantity: 5 },
|
||||
{ name: 'Тестовый товар 2', quantity: 1, minQuantity: 3 }
|
||||
];
|
||||
|
||||
const result = await warehouse.sendLowStockEmailNotification(testItems);
|
||||
addToLog('success', 'Тестовое уведомление о низком остатке отправлено', result);
|
||||
auth.showNotification('Тестовое уведомление о низком остатке отправлено', 'success');
|
||||
} else {
|
||||
const result = await warehouse.sendLowStockEmailNotification(lowStockItems);
|
||||
addToLog('success', 'Уведомление о низком остатке отправлено', result);
|
||||
auth.showNotification('Уведомление о низком остатке отправлено', 'success');
|
||||
}
|
||||
} catch (error) {
|
||||
addToLog('error', `Ошибка отправки уведомления о низком остатке: ${error.message}`);
|
||||
auth.showNotification('Ошибка отправки уведомления', 'danger');
|
||||
}
|
||||
}
|
||||
|
||||
// Тест уведомления об операции
|
||||
async function testOperationNotification() {
|
||||
try {
|
||||
const warehouse = new WarehouseManager();
|
||||
const testOperation = {
|
||||
type: 'incoming',
|
||||
itemName: 'Тестовый товар',
|
||||
quantity: 10,
|
||||
date: new Date().toISOString(),
|
||||
employeeName: 'Тестовый сотрудник'
|
||||
};
|
||||
|
||||
const result = await warehouse.sendOperationEmailNotificationAPI(testOperation);
|
||||
addToLog('success', 'Тестовое уведомление об операции отправлено', result);
|
||||
auth.showNotification('Тестовое уведомление об операции отправлено', 'success');
|
||||
} catch (error) {
|
||||
addToLog('error', `Ошибка отправки уведомления об операции: ${error.message}`);
|
||||
auth.showNotification('Ошибка отправки уведомления', 'danger');
|
||||
}
|
||||
}
|
||||
|
||||
// Тест еженедельного отчета
|
||||
async function testWeeklyReport() {
|
||||
try {
|
||||
const warehouse = new WarehouseManager();
|
||||
const testReport = {
|
||||
period: 'За последнюю неделю',
|
||||
totalOperations: 15,
|
||||
incoming: 8,
|
||||
outgoing: 7,
|
||||
operations: [
|
||||
{ date: new Date().toISOString(), type: 'incoming', itemName: 'Товар 1', quantity: 5 },
|
||||
{ date: new Date().toISOString(), type: 'outgoing', itemName: 'Товар 2', quantity: 3 }
|
||||
]
|
||||
};
|
||||
|
||||
const result = await warehouse.sendWeeklyReportEmailNotification(testReport);
|
||||
addToLog('success', 'Тестовый еженедельный отчет отправлен', result);
|
||||
auth.showNotification('Тестовый еженедельный отчет отправлен', 'success');
|
||||
} catch (error) {
|
||||
addToLog('error', `Ошибка отправки еженедельного отчета: ${error.message}`);
|
||||
auth.showNotification('Ошибка отправки отчета', 'danger');
|
||||
}
|
||||
}
|
||||
|
||||
// Добавление записи в лог
|
||||
function addToLog(type, message, data = null) {
|
||||
const log = $('#emailLog');
|
||||
const timestamp = new Date().toLocaleString('ru-RU');
|
||||
const icon = type === 'success' ? 'fas fa-check-circle text-success' : 'fas fa-exclamation-triangle text-danger';
|
||||
|
||||
let logEntry = `
|
||||
<div class="mb-2">
|
||||
<i class="${icon} me-2"></i>
|
||||
<strong>${timestamp}</strong> - ${message}
|
||||
</div>
|
||||
`;
|
||||
|
||||
if (data) {
|
||||
logEntry += `<pre class="small text-muted ms-4">${JSON.stringify(data, null, 2)}</pre>`;
|
||||
}
|
||||
|
||||
log.append(logEntry);
|
||||
log.scrollTop(log[0].scrollHeight);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
173
admin/reports.html
Normal file
173
admin/reports.html
Normal file
@ -0,0 +1,173 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Отчеты - Склад-Менеджер</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
|
||||
<link href="../css/style.css" rel="stylesheet">
|
||||
</head>
|
||||
<body>
|
||||
<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>
|
||||
<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" href="users.html"><i class="fas fa-users me-2"></i>Управление пользователями</a></li>
|
||||
<li><a class="dropdown-item active" href="reports.html"><i class="fas fa-chart-line me-2"></i>Отчеты</a></li>
|
||||
<li><hr class="dropdown-divider"></li>
|
||||
<li><a class="dropdown-item" href="email-test.html"><i class="fas fa-envelope me-2"></i>Тест Email</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
<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></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<main class="container-fluid py-4">
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<div>
|
||||
<h1 class="h3 mb-0"><i class="fas fa-chart-line me-2 text-primary"></i>Отчеты</h1>
|
||||
<div class="text-muted">Статистика, операции и остатки за выбранный период</div>
|
||||
</div>
|
||||
<div>
|
||||
<button class="btn btn-outline-secondary me-2" id="resetFiltersBtn"><i class="fas fa-rotate-left me-2"></i>Сбросить</button>
|
||||
<button class="btn btn-outline-secondary me-2" id="exportCsvBtn"><i class="fas fa-file-csv me-2"></i>Экспорт CSV</button>
|
||||
<button class="btn btn-outline-secondary" id="exportJsonBtn"><i class="fas fa-file-code me-2"></i>Экспорт JSON</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-body">
|
||||
<form id="filtersForm" class="row g-3">
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Период от</label>
|
||||
<input type="date" class="form-control" id="dateFrom">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Период до</label>
|
||||
<input type="date" class="form-control" id="dateTo">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Тип операции</label>
|
||||
<select id="opType" class="form-select">
|
||||
<option value="">Все</option>
|
||||
<option value="incoming">Приход</option>
|
||||
<option value="outgoing">Расход</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Категория</label>
|
||||
<select id="categoryId" class="form-select">
|
||||
<option value="">Все</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Товар</label>
|
||||
<input type="text" id="itemQuery" class="form-control" placeholder="Название/штрихкод">
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<label class="form-label">Сотрудник</label>
|
||||
<input type="text" id="employeeQuery" class="form-control" placeholder="Имя пользователя">
|
||||
</div>
|
||||
<div class="col-md-3 align-self-end">
|
||||
<button class="btn btn-primary w-100" id="applyFiltersBtn" type="submit"><i class="fas fa-sync me-2"></i>Применить</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row g-3 mb-3">
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-success"><div class="card-body"><div class="small">Приход всего</div><div class="h4 mb-0" id="totalIncoming">0</div></div></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-danger"><div class="card-body"><div class="small">Расход всего</div><div class="h4 mb-0" id="totalOutgoing">0</div></div></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-primary"><div class="card-body"><div class="small">Операций</div><div class="h4 mb-0" id="totalOps">0</div></div></div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="card text-white bg-info"><div class="card-body"><div class="small">Уникальных товаров</div><div class="h4 mb-0" id="uniqueItems">0</div></div></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header"><i class="fas fa-list me-2"></i>Операции</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0" id="operationsTable">
|
||||
<thead class="table-light">
|
||||
<tr>
|
||||
<th>Дата</th>
|
||||
<th>Тип</th>
|
||||
<th>Товар</th>
|
||||
<th>Количество</th>
|
||||
<th>Сотрудник</th>
|
||||
<th>Категория</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-lg-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header"><i class="fas fa-box me-2"></i>Остатки по категориям</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0" id="byCategoryTable">
|
||||
<thead class="table-light"><tr><th>Категория</th><th>Всего позиций</th><th>Суммарный остаток</th></tr></thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<div class="card mb-4">
|
||||
<div class="card-header"><i class="fas fa-star me-2"></i>ТОП товаров по движению</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm align-middle mb-0" id="topItemsTable">
|
||||
<thead class="table-light"><tr><th>Товар</th><th>Приход</th><th>Расход</th><th>Итого</th></tr></thead>
|
||||
<tbody></tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<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/reports.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
570
admin/users.html
Normal file
570
admin/users.html
Normal 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>
|
||||
Reference in New Issue
Block a user