first commit

This commit is contained in:
greyjoy
2026-08-02 22:54:13 +04:00
commit f55735a59e
17 changed files with 2883 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Административная панель заявок Анастасии Панкратенковой.">
<title>Заявки — Анастасия Панкратенкова</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/styles.css') }}">
</head>
<body class="admin-page admin-dashboard-page">
<div class="admin-shell">
<header class="admin-header">
<a class="brand" href="{{ url_for('index') }}">
<span class="brand-mark">АП</span>
<span class="brand-name">Анастасия<br>Панкратенкова</span>
</a>
<div class="admin-header-actions">
<span class="admin-status"><i></i> Вы вошли как администратор</span>
<a class="admin-logout" href="{{ url_for('admin_logout') }}">Выйти <span></span></a>
</div>
</header>
<main class="admin-main">
<div class="admin-title-row">
<div>
<p class="eyebrow"><span class="eyebrow-dot"></span> Панель преподавателя</p>
<h1>Ваши <em>заявки.</em></h1>
</div>
<div class="requests-count"><strong>{{ stats["total"] }}</strong><span>обращений<br>всего</span></div>
</div>
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
<div class="admin-flashes">
{% for category, message in messages %}
<div class="flash-message {{ category }}">{{ message }}</div>
{% endfor %}
</div>
{% endif %}
{% endwith %}
<section class="admin-stats" aria-label="Статистика заявок">
<div class="stat-card stat-card-total"><span>Всего</span><strong>{{ stats["total"] }}</strong><small>за всё время</small></div>
<div class="stat-card"><span>Новые</span><strong>{{ stats["new"] }}</strong><small>ждут ответа</small></div>
<div class="stat-card"><span>В работе</span><strong>{{ stats["contacted"] }}</strong><small>связались</small></div>
<div class="stat-card"><span>Запланированы</span><strong>{{ stats["scheduled"] }}</strong><small>занятия</small></div>
<div class="stat-card"><span>Завершены</span><strong>{{ stats["closed"] }}</strong><small>архив</small></div>
</section>
<section class="admin-toolbar" aria-label="Фильтры заявок">
<form class="admin-filters" action="{{ url_for('admin_dashboard') }}" method="get">
<label class="filter-search"><span>Поиск</span><input type="search" name="q" value="{{ filters["q"] }}" placeholder="Имя, контакт или комментарий"></label>
<label><span>Статус</span><select name="status"><option value="">Все статусы</option>{% for status_key, status_label in statuses.items() %}<option value="{{ status_key }}" {% if filters["status"] == status_key %}selected{% endif %}>{{ status_label }}</option>{% endfor %}</select></label>
<label><span>Предмет</span><select name="subject"><option value="">Все предметы</option>{% for subject in subjects %}<option value="{{ subject }}" {% if filters["subject"] == subject %}selected{% endif %}>{{ subject }}</option>{% endfor %}</select></label>
<button class="button button-primary filter-button" type="submit">Применить <span></span></button>
</form>
<div class="toolbar-links">
{% if filters["q"] or filters["status"] or filters["subject"] %}<a class="reset-filters" href="{{ url_for('admin_dashboard') }}">Сбросить фильтры</a>{% endif %}
<a class="export-link" href="{{ url_for('admin_export', q=filters["q"], status=filters["status"], subject=filters["subject"]) }}">Скачать CSV <span></span></a>
</div>
</section>
{% if consultation_requests %}
<div class="results-heading"><span>Показано заявок: <strong>{{ consultation_requests|length }}</strong></span><span>Новые сверху</span></div>
<section class="requests-list" aria-label="Список заявок">
{% for consultation in consultation_requests %}
<article class="request-card status-border-{{ consultation["status"] }}">
<div class="request-card-head">
<div class="request-card-head-left"><span class="status-badge status-{{ consultation["status"] }}">{{ statuses.get(consultation["status"], consultation["status"]) }}</span><span class="request-id">Заявка №{{ consultation["id"] }}</span></div>
<time datetime="{{ consultation["created_at"] }}">{{ consultation["created_at"].replace("T", " · ") }}</time>
</div>
<div class="request-card-main">
<div class="request-person"><h2>{{ consultation["name"] }}</h2><span>{{ consultation["contact"] }}</span></div>
<dl class="request-meta">
<div><dt>Предмет</dt><dd>{{ consultation["subject"] }}</dd></div>
<div><dt>Экзамен</dt><dd>{{ consultation["exam"] }}</dd></div>
<div><dt>Формат</dt><dd>{{ consultation["format"] }}</dd></div>
<div><dt>Время</dt><dd>{{ consultation["preferred_time"] }}</dd></div>
</dl>
</div>
{% if consultation["message"] %}<p class="request-message"><span>Комментарий</span>{{ consultation["message"] }}</p>{% endif %}
<div class="request-actions">
<form class="request-status-form" action="{{ url_for('admin_update_status', request_id=consultation["id"]) }}" method="post">
<label for="status-{{ consultation["id"] }}">Статус</label>
<select id="status-{{ consultation["id"] }}" name="status">{% for status_key, status_label in statuses.items() %}<option value="{{ status_key }}" {% if consultation["status"] == status_key %}selected{% endif %}>{{ status_label }}</option>{% endfor %}</select>
<button class="mini-button" type="submit">Сохранить</button>
</form>
<details class="request-note" {% if consultation["admin_note"] %}open{% endif %}>
<summary>{% if consultation["admin_note"] %}Изменить заметку{% else %}Добавить заметку{% endif %} <span></span></summary>
<form action="{{ url_for('admin_update_note', request_id=consultation["id"]) }}" method="post">
<textarea name="admin_note" rows="2" maxlength="2000" placeholder="Например: перезвонить вечером...">{{ consultation["admin_note"] }}</textarea>
<button class="mini-button" type="submit">Сохранить заметку</button>
</form>
</details>
<form class="request-delete-form" action="{{ url_for('admin_delete_request', request_id=consultation["id"]) }}" method="post" data-confirm="Удалить эту заявку? Восстановить её будет нельзя.">
<button class="delete-button" type="submit">Удалить</button>
</form>
</div>
</article>
{% endfor %}
</section>
{% else %}
<section class="empty-requests">
<span></span>
<h2>{% if filters["q"] or filters["status"] or filters["subject"] %}Ничего не найдено.{% else %}Пока заявок нет.{% endif %}</h2>
<p>{% if filters["q"] or filters["status"] or filters["subject"] %}Попробуйте изменить условия поиска или сбросить фильтры.{% else %}Новые обращения появятся здесь после заполнения формы на сайте.{% endif %}</p>
{% if filters["q"] or filters["status"] or filters["subject"] %}<a class="button button-primary" href="{{ url_for('admin_dashboard') }}">Сбросить фильтры <span></span></a>{% else %}<a class="button button-primary" href="{{ url_for('index') }}#contact">Посмотреть форму <span></span></a>{% endif %}
</section>
{% endif %}
</main>
</div>
<script src="{{ url_for('static', filename='js/main.js') }}"></script>
</body>
</html>