Initial commit: InviteMe production redesign

This commit is contained in:
InviteMe Developer
2026-09-01 10:52:35 +03:00
commit 0d0868d998
71 changed files with 6912 additions and 0 deletions
+64
View File
@@ -0,0 +1,64 @@
{% extends "base.html" %}
{% block title %}Аналитика — InviteMe{% endblock %}
{% block content %}
<header class="page-header"><div><div class="eyebrow">Live-аналитика</div><h1 class="page-title">{{ event.name }}</h1><p class="page-subtitle">Сводка по приглашениям, ответам и фактическим входам.</p></div><a class="btn btn-primary" href="{{ url_for('main.check_in') }}">Открыть контроль входа</a></header>
<div class="stats-grid"><div class="stat-card"><div class="stat-label">Всего гостей</div><div class="stat-value">{{ total }}</div><div class="stat-meta">в списке мероприятия</div></div><div class="stat-card"><div class="stat-label">Уже пришли</div><div class="stat-value text-success">{{ checked_in }}</div><div class="stat-meta">успешных входов</div></div><div class="stat-card"><div class="stat-label">Ожидаются</div><div class="stat-value">{{ not_checked_in }}</div><div class="stat-meta">ещё не отметились</div></div><div class="stat-card"><div class="stat-label">Посещаемость</div><div class="stat-value">{{ attendance_percent }}%</div><div class="stat-meta">от общего списка</div></div></div>
<h2 class="h5 mb-3">Подтверждения участия</h2>
<div class="row mb-4">
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Подтвердили</h5><p class="display-6 text-success">{{ rsvp_confirmed }}</p></div></div></div>
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Отказались</h5><p class="display-6 text-muted">{{ rsvp_declined }}</p></div></div></div>
<div class="col-md-4"><div class="card"><div class="card-body"><h5 class="card-title">Ожидается ответ</h5><p class="display-6 text-warning">{{ rsvp_pending }}</p></div></div></div>
</div>
<div class="row">
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h5 class="card-title">Быстрый поиск</h5>
<form action="{{ url_for('main.admin_guests') }}" method="GET" class="d-flex">
<input type="text" name="q" class="form-control me-2" placeholder="Фамилия или ФИО" required>
<button type="submit" class="btn btn-primary">Найти</button>
</form>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-body">
<h5 class="card-title">Действия</h5>
<a href="{{ url_for('main.admin_report') }}" class="btn btn-success">Выгрузить отчёт Excel</a>
<form action="{{ url_for('main.admin_send_invitations') }}" method="POST" class="d-inline">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
<button type="submit" class="btn btn-outline-primary">Разослать приглашения</button>
</form>
</div>
</div>
</div>
</div>
<h2 class="h5 mt-5 mb-3">Последние входы</h2><div class="table-card table-responsive"><table class="table table-hover">
<thead>
<tr>
<th>Время</th>
<th>ФИО</th>
<th>Отдел</th>
</tr>
</thead>
<tbody>
{% for check_in in recent_check_ins %}
<tr>
<td>{{ check_in.checked_in_at | localtime('%d.%m.%Y %H:%M:%S') }}</td>
<td>{{ check_in.guest.full_name }}</td>
<td>{{ check_in.guest.department }}</td>
</tr>
{% else %}
<tr>
<td colspan="3" class="text-muted">Пока никто не отмечен</td>
</tr>
{% endfor %}
</tbody>
</table></div>
{% endblock %}