115 lines
9.5 KiB
HTML
115 lines
9.5 KiB
HTML
<!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>
|