Initial commit: InviteMe production redesign
This commit is contained in:
@@ -0,0 +1,110 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Гости — InviteMe{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<header class="page-header"><div><div class="eyebrow">Аудитория</div><h1 class="page-title">Гости</h1><p class="page-subtitle">{{ event.name }} · приглашения, ответы и статусы входа.</p></div><a href="{{ url_for('main.admin_guest_add') }}" class="btn btn-primary">+ Добавить гостя</a></header>
|
||||
|
||||
<form method="GET" class="row g-3 mb-4">
|
||||
<div class="col-auto">
|
||||
<input type="text" name="q" class="form-control" placeholder="Поиск по ФИО, отделу, email..." value="{{ search }}">
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<button type="submit" class="btn btn-outline-primary">Найти</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<div class="table-card table-responsive">
|
||||
<table class="table table-striped table-hover align-middle">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>ФИО</th>
|
||||
<th>Отдел</th>
|
||||
<th>Должность</th>
|
||||
<th>Email</th>
|
||||
<th>Телефон</th>
|
||||
<th>Фото</th>
|
||||
<th>QR</th>
|
||||
<th>Приглашение</th>
|
||||
<th>RSVP</th>
|
||||
<th>Вход</th>
|
||||
<th>Действия</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for guest in guests %}
|
||||
<tr class="{{ 'table-secondary' if not guest.is_active }}">
|
||||
<td>{{ guest.build_full_name() }}</td>
|
||||
<td>{{ guest.department }}</td>
|
||||
<td>{{ guest.position or '-' }}</td>
|
||||
<td>{{ guest.email }}</td>
|
||||
<td>{{ guest.phone or '-' }}</td>
|
||||
<td>
|
||||
{% if guest.has_photo_file %}
|
||||
<a href="{{ guest.photo_url }}" target="_blank" class="badge bg-success text-decoration-none">Есть</a>
|
||||
{% else %}
|
||||
<span class="badge bg-warning text-dark" title="{% if guest.photo_filename %}Имя файла указано, но файл не загружен{% else %}Не указано{% endif %}">Нет</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if guest.qr_filename %}
|
||||
<a href="{{ url_for('main.admin_guest_qr', guest_id=guest.id) }}" target="_blank" class="badge bg-success text-decoration-none">Да</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('main.admin_guest_qr', guest_id=guest.id) }}" target="_blank" class="badge bg-secondary text-decoration-none">Нет</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if guest.invitation_status == 'sent' %}<span class="badge bg-success">Отправлено</span>
|
||||
{% elif guest.invitation_status == 'failed' %}<span class="badge bg-danger" title="{{ guest.invitation_last_error or '' }}">Ошибка</span>
|
||||
{% elif guest.invitation_status == 'sending' %}<span class="badge bg-info text-dark">Отправляется</span>
|
||||
{% else %}<span class="badge bg-secondary">Не отправлено</span>{% endif %}
|
||||
{% if guest.invitation_attempts %}<small class="d-block text-muted">Попыток: {{ guest.invitation_attempts }}</small>{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if guest.rsvp_status == 'confirmed' %}<span class="badge bg-success">Будет</span>
|
||||
{% elif guest.rsvp_status == 'declined' %}<span class="badge bg-secondary">Не будет</span>
|
||||
{% else %}<span class="badge bg-warning text-dark">Ожидается</span>{% endif %}
|
||||
{% if guest.dietary_requirements or guest.rsvp_comment %}<small class="d-block text-info" title="{{ guest.dietary_requirements or guest.rsvp_comment }}">Есть комментарий</small>{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
{% if guest.is_checked_in %}
|
||||
<span class="badge bg-success">Пришёл</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">Не пришёл</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('main.admin_guest_edit', guest_id=guest.id) }}" class="btn btn-sm btn-outline-primary">Изменить</a>
|
||||
<a href="{{ url_for('main.admin_guest_ticket', guest_id=guest.id) }}" target="_blank" class="btn btn-sm btn-outline-info">Билет</a>
|
||||
<a href="{{ url_for('main.admin_guest_qr', guest_id=guest.id) }}" target="_blank" class="btn btn-sm btn-outline-success">QR</a>
|
||||
<a href="{{ url_for('main.public_invitation', token=guest.token) }}" target="_blank" class="btn btn-sm btn-outline-light">Страница</a>
|
||||
<form action="{{ url_for('main.admin_guest_resend', guest_id=guest.id) }}" method="POST" class="d-inline" data-confirm="Отправить приглашение повторно?">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<button type="submit" class="btn btn-sm btn-outline-warning">Пригласить</button>
|
||||
</form>
|
||||
<form action="{{ url_for('main.admin_guest_delete', guest_id=guest.id) }}" method="POST" class="d-inline" data-confirm="Заблокировать гостя?">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<button type="submit" class="btn btn-sm btn-outline-danger">Блок</button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="11" class="text-center text-muted">Гости не найдены</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% if pagination.pages > 1 %}
|
||||
<nav aria-label="Страницы списка гостей"><ul class="pagination justify-content-center">
|
||||
{% if pagination.has_prev %}<li class="page-item"><a class="page-link" href="{{ url_for('main.admin_guests', page=pagination.prev_num, q=search) }}">Назад</a></li>{% endif %}
|
||||
{% for page_num in pagination.iter_pages(left_edge=1, right_edge=1, left_current=2, right_current=2) %}
|
||||
{% if page_num %}<li class="page-item {% if page_num == pagination.page %}active{% endif %}"><a class="page-link" href="{{ url_for('main.admin_guests', page=page_num, q=search) }}">{{ page_num }}</a></li>
|
||||
{% else %}<li class="page-item disabled"><span class="page-link">…</span></li>{% endif %}
|
||||
{% endfor %}
|
||||
{% if pagination.has_next %}<li class="page-item"><a class="page-link" href="{{ url_for('main.admin_guests', page=pagination.next_num, q=search) }}">Вперёд</a></li>{% endif %}
|
||||
</ul></nav>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user