aho-panel/index.html

523 lines
22 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">
<title>АХО Панель управления</title>
<style>
:root{--ink:#0F1218;--cyan:#00E5FF;--cyan-50:#E8FCFF;--white:#fff;--gray-500:#5B6573;--gray-100:#F2F4F7;--red:#FF5252;--green:#4CAF50;--orange:#FF9800}
*{box-sizing:border-box;margin:0;padding:0}
body{font:15px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--white);background:var(--ink)}
.sidebar{position:fixed;left:0;top:0;bottom:0;width:240px;background:#1a1f2e;padding:24px 0;z-index:100}
.sidebar h1{font-size:18px;font-weight:700;padding:0 24px;margin-bottom:32px;color:var(--cyan)}
.sidebar nav a{display:block;padding:12px 24px;color:var(--gray-500);text-decoration:none;font-weight:500;transition:all 0.2s}
.sidebar nav a:hover,.sidebar nav a.active{color:var(--white);background:rgba(255,255,255,0.05)}
.main{margin-left:240px;padding:32px}
.header{display:flex;justify-content:space-between;align-items:center;margin-bottom:32px}
.header h2{font-size:24px;font-weight:700}
.header .date{color:var(--gray-500)}
.section{margin-bottom:48px;scroll-margin-top:32px}
.section h3{font-size:20px;font-weight:600;margin-bottom:24px;padding-bottom:12px;border-bottom:1px solid rgba(255,255,255,0.1);color:var(--cyan)}
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:20px;margin-bottom:32px}
.stat{background:#1a1f2e;border-radius:12px;padding:24px}
.stat .label{color:var(--gray-500);font-size:13px;margin-bottom:8px}
.stat .value{font-size:28px;font-weight:700}
.stat .value.red{color:var(--red)}
.stat .value.green{color:var(--green)}
.stat .value.orange{color:var(--orange)}
.stat .value.cyan{color:var(--cyan)}
.grid{display:grid;grid-template-columns:2fr 1fr;gap:24px}
.panel{background:#1a1f2e;border-radius:12px;padding:24px}
.panel h4{font-size:16px;font-weight:600;margin-bottom:20px;padding-bottom:12px;border-bottom:1px solid rgba(255,255,255,0.1)}
.task{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid rgba(255,255,255,0.05)}
.task:last-child{border-bottom:none}
.task .status{width:8px;height:8px;border-radius:50%;margin-right:12px}
.task .status.done{background:var(--green)}
.task .status.progress{background:var(--orange)}
.task .status.overdue{background:var(--red)}
.task .info{flex:1}
.task .title{font-weight:500;margin-bottom:4px}
.task .meta{font-size:13px;color:var(--gray-500)}
.task .priority{font-size:12px;padding:4px 8px;border-radius:4px;font-weight:600}
.task .priority.high{background:rgba(255,82,82,0.2);color:var(--red)}
.task .priority.medium{background:rgba(255,152,0,0.2);color:var(--orange)}
.task .priority.low{background:rgba(76,175,80,0.2);color:var(--green)}
.employee{display:flex;align-items:center;padding:12px 0;border-bottom:1px solid rgba(255,255,255,0.05)}
.employee:last-child{border-bottom:none}
.employee .avatar{width:40px;height:40px;border-radius:50%;background:var(--cyan);display:flex;align-items:center;justify-content:center;font-weight:700;margin-right:12px;color:var(--ink)}
.employee .info{flex:1}
.employee .name{font-weight:500}
.employee .role{font-size:13px;color:var(--gray-500)}
.employee .tasks-count{font-size:13px;color:var(--cyan)}
.table{width:100%;border-collapse:collapse}
.table th,.table td{padding:12px;text-align:left;border-bottom:1px solid rgba(255,255,255,0.05)}
.table th{color:var(--gray-500);font-weight:600;font-size:13px}
.table tr:hover{background:rgba(255,255,255,0.02)}
.badge{display:inline-block;padding:4px 8px;border-radius:4px;font-size:12px;font-weight:600}
.badge.pending{background:rgba(255,152,0,0.2);color:var(--orange)}
.badge.approved{background:rgba(76,175,80,0.2);color:var(--green)}
.badge.rejected{background:rgba(255,82,82,0.2);color:var(--red)}
.card{background:#1a1f2e;border-radius:12px;padding:24px;margin-bottom:16px}
.card h4{margin-bottom:16px}
.card p{color:var(--gray-500);margin-bottom:8px}
.actions{display:flex;gap:8px;align-items:center}
.employee-select{background:#2a2f3e;color:var(--white);border:1px solid rgba(255,255,255,0.1);border-radius:6px;padding:6px 10px;font-size:12px;cursor:pointer}
.btn-status{background:rgba(0,229,255,0.2);color:var(--cyan);border:none;border-radius:6px;padding:6px 12px;font-size:12px;font-weight:600;cursor:pointer;transition:all 0.2s}
.btn-status:hover{background:var(--cyan);color:var(--ink)}
.notification{position:fixed;top:24px;right:24px;background:#1a1f2e;border:1px solid var(--cyan);border-radius:12px;padding:16px 24px;z-index:1000;display:none;animation:slideIn 0.3s ease}
.notification.show{display:block}
.notification .title{font-weight:600;margin-bottom:8px;color:var(--cyan)}
.notification .message{color:var(--gray-500);font-size:14px}
@keyframes slideIn{from{transform:translateX(100%);opacity:0}to{transform:translateX(0);opacity:1}}
@media(max-width:1024px){.sidebar{display:none}.main{margin-left:0}.stats{grid-template-columns:repeat(2,1fr)}.grid{grid-template-columns:1fr}}
@media(max-width:640px){.stats{grid-template-columns:1fr}.header{flex-direction:column;align-items:flex-start;gap:8px}.actions{flex-wrap:wrap}}
</style>
</head>
<body>
<aside class="sidebar">
<h1>АХО Панель</h1>
<nav>
<a href="#tasks" class="active">Задачи</a>
<a href="#employees">Сотрудники</a>
<a href="#purchases">Закупки</a>
<a href="#requests">Заявки</a>
<a href="#reports">Отчёты</a>
<a href="#settings">Настройки</a>
</nav>
</aside>
<main class="main">
<div class="header">
<h2>Панель управления АХО</h2>
<div class="date">19 июня 2026</div>
</div>
<!-- ЗАДАЧИ -->
<section id="tasks" class="section">
<h3>Задачи</h3>
<div class="stats">
<div class="stat">
<div class="label">Всего задач</div>
<div class="value cyan">24</div>
</div>
<div class="stat">
<div class="label">Просрочено</div>
<div class="value red">3</div>
</div>
<div class="stat">
<div class="label">В работе</div>
<div class="value orange">12</div>
</div>
<div class="stat">
<div class="label">Выполнено</div>
<div class="value green">9</div>
</div>
</div>
<div class="grid">
<div class="panel">
<h4>Активные задачи</h4>
<div class="task" data-id="1">
<div class="status overdue"></div>
<div class="info">
<div class="title">Закупить канцелярию для отдела</div>
<div class="meta">Исполнитель: Айгуль • Дедлайн: 18 июня</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority high">Срочно</div>
</div>
<div class="task" data-id="2">
<div class="status overdue"></div>
<div class="info">
<div class="title">Ремонт кондиционера в переговорной</div>
<div class="meta">Исполнитель: Руслан • Дедлайн: 17 июня</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority high">Срочно</div>
</div>
<div class="task" data-id="3">
<div class="status overdue"></div>
<div class="info">
<div class="title">Подготовить акт осмотра помещения</div>
<div class="meta">Исполнитель: Динара • Дедлайн: 18 июня</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority high">Срочно</div>
</div>
<div class="task" data-id="4">
<div class="status progress"></div>
<div class="info">
<div class="title">Заказать уборку офиса на пятницу</div>
<div class="meta">Исполнитель: Айгуль • Дедлайн: 20 июня</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority medium">Средний</div>
</div>
<div class="task" data-id="5">
<div class="status progress"></div>
<div class="info">
<div class="title">Оформить пропуска для подрядчиков</div>
<div class="meta">Исполнитель: Руслан • Дедлайн: 21 июня</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority medium">Средний</div>
</div>
<div class="task" data-id="6">
<div class="status done"></div>
<div class="info">
<div class="title">Согласовать смету на ремонт</div>
<div class="meta">Исполнитель: Динара • Выполнено</div>
</div>
<div class="actions">
<select class="employee-select">
<option value="">Назначить</option>
<option value="Айгуль">Айгуль</option>
<option value="Руслан">Руслан</option>
<option value="Динара">Динара</option>
<option value="Алексей">Алексей</option>
</select>
<button class="btn-status" data-status="progress">В работу</button>
<button class="btn-status" data-status="done">Выполнено</button>
</div>
<div class="priority low">Низкий</div>
</div>
</div>
<div class="panel">
<h4>Загрузка сотрудников</h4>
<div class="employee">
<div class="avatar">А</div>
<div class="info">
<div class="name">Айгуль К.</div>
<div class="role">Специалист АХО</div>
</div>
<div class="tasks-count">8 задач</div>
</div>
<div class="employee">
<div class="avatar">Р</div>
<div class="info">
<div class="name">Руслан М.</div>
<div class="role">Техник</div>
</div>
<div class="tasks-count">6 задач</div>
</div>
<div class="employee">
<div class="avatar">Д</div>
<div class="info">
<div class="name">Динара С.</div>
<div class="role">Документооборот</div>
</div>
<div class="tasks-count">5 задач</div>
</div>
<div class="employee">
<div class="avatar">А</div>
<div class="info">
<div class="name">Алексей В.</div>
<div class="role">Кладовщик</div>
</div>
<div class="tasks-count">5 задач</div>
</div>
</div>
</div>
</section>
<!-- СОТРУДНИКИ -->
<section id="employees" class="section">
<h3>Сотрудники</h3>
<div class="panel">
<table class="table">
<thead>
<tr>
<th>Имя</th>
<th>Должность</th>
<th>Активных задач</th>
<th>Выполнено за месяц</th>
<th>Эффективность</th>
</tr>
</thead>
<tbody>
<tr>
<td>Айгуль К.</td>
<td>Специалист АХО</td>
<td>8</td>
<td>34</td>
<td><span class="badge approved">92%</span></td>
</tr>
<tr>
<td>Руслан М.</td>
<td>Техник</td>
<td>6</td>
<td>28</td>
<td><span class="badge approved">88%</span></td>
</tr>
<tr>
<td>Динара С.</td>
<td>Документооборот</td>
<td>5</td>
<td>42</td>
<td><span class="badge approved">95%</span></td>
</tr>
<tr>
<td>Алексей В.</td>
<td>Кладовщик</td>
<td>5</td>
<td>31</td>
<td><span class="badge pending">78%</span></td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- ЗАКУПКИ -->
<section id="purchases" class="section">
<h3>Закупки</h3>
<div class="panel">
<table class="table">
<thead>
<tr>
<th>Наименование</th>
<th>Сумма</th>
<th>Статус</th>
<th>Срок</th>
<th>Исполнитель</th>
</tr>
</thead>
<tbody>
<tr>
<td>Канцелярия для отдела</td>
<td>45 000 ₸</td>
<td><span class="badge pending">Ожидает</span></td>
<td>18 июня</td>
<td>Айгуль</td>
</tr>
<tr>
<td>Уборочные средства</td>
<td>32 000 ₸</td>
<td><span class="badge approved">Согласовано</span></td>
<td>20 июня</td>
<td>Айгуль</td>
</tr>
<tr>
<td>Запчасти для кондиционера</td>
<td>28 500 ₸</td>
<td><span class="badge rejected">Отклонено</span></td>
<td>17 июня</td>
<td>Руслан</td>
</tr>
<tr>
<td>Бумага для принтера</td>
<td>18 000 ₸</td>
<td><span class="badge approved">Согласовано</span></td>
<td>22 июня</td>
<td>Динара</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- ЗАЯВКИ -->
<section id="requests" class="section">
<h3>Заявки на ремонт</h3>
<div class="panel">
<table class="table">
<thead>
<tr>
<th>Объект</th>
<th>Проблема</th>
<th>Приоритет</th>
<th>Статус</th>
<th>Дата подачи</th>
</tr>
</thead>
<tbody>
<tr>
<td>Переговорная №3</td>
<td>Не работает кондиционер</td>
<td><span class="badge rejected">Высокий</span></td>
<td><span class="badge pending">В работе</span></td>
<td>15 июня</td>
</tr>
<tr>
<td>Офис 204</td>
<td>Протекает кран</td>
<td><span class="badge pending">Средний</span></td>
<td><span class="badge approved">Назначен</span></td>
<td>16 июня</td>
</tr>
<tr>
<td>Коридор 2 этаж</td>
<td>Не горит свет</td>
<td><span class="badge rejected">Высокий</span></td>
<td><span class="badge approved">Выполнено</span></td>
<td>14 июня</td>
</tr>
<tr>
<td>Склад</td>
<td>Заклинила дверь</td>
<td><span class="badge pending">Низкий</span></td>
<td><span class="badge pending">Ожидает</span></td>
<td>18 июня</td>
</tr>
</tbody>
</table>
</div>
</section>
<!-- ОТЧЁТЫ -->
<section id="reports" class="section">
<h3>Отчёты</h3>
<div class="grid">
<div class="card">
<h4>Сводка за июнь</h4>
<p>Выполнено задач: 9 из 24</p>
<p>Просроченных задач: 3</p>
<p>Сумма закупок: 123 500 ₸</p>
<p>Заявок на ремонт: 4</p>
</div>
<div class="card">
<h4>Эффективность</h4>
<p>Средний % выполнения: 88%</p>
<p>Лучший сотрудник: Динара С. (95%)</p>
<p>Задач без исполнителя: 0</p>
</div>
</div>
</section>
<!-- НАСТРОЙКИ -->
<section id="settings" class="section">
<h3>Настройки</h3>
<div class="panel">
<p style="color:var(--gray-500);margin-bottom:16px">Раздел настроек панели управления</p>
<div class="task">
<div class="info">
<div class="title">Уведомления о просроченных задачах</div>
<div class="meta">Включено • Ежедневно в 9:00</div>
</div>
<div class="priority low">Активно</div>
</div>
<div class="task">
<div class="info">
<div class="title">Автоматическое напоминание исполнителям</div>
<div class="meta">За 24 часа до дедлайна</div>
</div>
<div class="priority low">Активно</div>
</div>
<div class="task">
<div class="info">
<div class="title">Экспорт отчётов в PDF</div>
<div class="meta">Раз в неделю по пятницам</div>
</div>
<div class="priority low">Активно</div>
</div>
</div>
</section>
</main>
<div class="notification" id="notification">
<div class="title">Уведомление</div>
<div class="message" id="notification-message"></div>
</div>
<script>
document.querySelectorAll('.sidebar nav a').forEach(link => {
link.addEventListener('click', function(e) {
document.querySelectorAll('.sidebar nav a').forEach(l => l.classList.remove('active'));
this.classList.add('active');
});
});
function showNotification(message) {
const notification = document.getElementById('notification');
const notificationMessage = document.getElementById('notification-message');
notificationMessage.textContent = message;
notification.classList.add('show');
setTimeout(() => {
notification.classList.remove('show');
}, 3000);
}
document.querySelectorAll('.btn-status').forEach(btn => {
btn.addEventListener('click', function() {
const task = this.closest('.task');
const status = this.dataset.status;
const title = task.querySelector('.title').textContent;
const statusDot = task.querySelector('.status');
statusDot.className = 'status ' + (status === 'done' ? 'done' : 'progress');
const statusText = status === 'done' ? 'выполнена' : 'взята в работу';
showNotification('Задача "' + title + '" ' + statusText);
});
});
document.querySelectorAll('.employee-select').forEach(select => {
select.addEventListener('change', function() {
const task = this.closest('.task');
const title = task.querySelector('.title').textContent;
const employee = this.value;
if (employee) {
const meta = task.querySelector('.meta');
const deadline = meta.textContent.split('•')[1] || '';
meta.textContent = 'Исполнитель: ' + employee + ' •' + deadline;
showNotification('Задача "' + title + '" назначена на ' + employee);
}
});
});
</script>
</body>
</html>