50 lines
5.5 KiB
HTML
50 lines
5.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="csrf-token" content="{{ csrf_token() }}">
|
|
<title>{% block title %}InviteMe{% endblock %}</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GASXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"><link rel="icon" type="image/png" href="{{ url_for('static', filename='images/inviteme_logo.png') }}">
|
|
</head>
|
|
<body class="{% if current_user %}has-app-shell{% else %}public-page{% endif %}">
|
|
{% macro nav_link(endpoint, label, icon) %}
|
|
<a class="sidebar-link {% if request.endpoint == endpoint %}active{% endif %}" href="{{ url_for(endpoint) }}"><svg class="nav-icon" aria-hidden="true"><use href="{{ url_for('static', filename='images/icons.svg') }}#{{ icon }}"></use></svg><span>{{ label }}</span></a>
|
|
{% endmacro %}
|
|
{% if current_user %}
|
|
<div class="app-shell">
|
|
<aside class="app-sidebar" id="app-sidebar">
|
|
<a class="sidebar-brand" href="{{ url_for('main.admin_panel') }}"><span class="brand-mark">I</span><span><strong>InviteMe</strong><small>Event operations</small></span></a>
|
|
<nav class="sidebar-nav" aria-label="Основная навигация">
|
|
<p class="nav-caption">Рабочая область</p>
|
|
{{ nav_link('main.admin_panel', 'Обзор', 'grid') }}
|
|
{% if current_user.role in ('admin', 'organizer') %}{{ nav_link('main.admin_events', 'Мероприятия', 'calendar') }}{% endif %}
|
|
{% if current_event and current_user.role in ('admin', 'organizer') %}
|
|
{{ nav_link('main.admin_dashboard', 'Аналитика', 'chart') }}{{ nav_link('main.admin_guests', 'Гости', 'users') }}{{ nav_link('main.admin_upload', 'Импорт гостей', 'upload') }}{{ nav_link('main.admin_email_send', 'Рассылки', 'mail') }}
|
|
{% endif %}
|
|
{{ nav_link('main.check_in', 'Контроль входа', 'scan') }}
|
|
{% if current_user.role == 'admin' %}
|
|
<p class="nav-caption nav-caption-spaced">Система</p>
|
|
{{ nav_link('main.admin_users', 'Пользователи', 'shield') }}{{ nav_link('main.admin_logs', 'Журнал действий', 'log') }}{{ nav_link('main.admin_email_settings', 'Настройки почты', 'settings') }}
|
|
{% endif %}
|
|
</nav>
|
|
<div class="sidebar-profile"><span class="avatar">{{ current_user.username[:1] | upper }}</span><span class="profile-copy"><strong>{{ current_user.username }}</strong><small>{{ current_user.role }}</small></span><form method="POST" action="{{ url_for('main.logout') }}"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button class="icon-button" type="submit" title="Выйти" aria-label="Выйти"><svg class="nav-icon"><use href="{{ url_for('static', filename='images/icons.svg') }}#logout"></use></svg></button></form></div>
|
|
</aside>
|
|
<button class="sidebar-backdrop" type="button" data-sidebar-toggle aria-label="Закрыть меню"></button>
|
|
<section class="app-main">
|
|
<header class="app-topbar">
|
|
<button class="icon-button mobile-menu" type="button" data-sidebar-toggle aria-controls="app-sidebar" aria-label="Открыть меню"><svg class="nav-icon"><use href="{{ url_for('static', filename='images/icons.svg') }}#menu"></use></svg></button>
|
|
<div class="topbar-context"><small>Рабочее пространство</small><strong>{% if current_event %}{{ current_event.name }}{% else %}Все мероприятия{% endif %}</strong></div>
|
|
{% if current_user.role in ('admin', 'organizer') and available_events %}
|
|
<div class="dropdown ms-auto"><button class="event-switcher dropdown-toggle" type="button" data-bs-toggle="dropdown"><span class="status-dot"></span>{{ current_event.name if current_event else 'Выбрать мероприятие' }}</button><ul class="dropdown-menu dropdown-menu-end">{% for event in available_events %}<li><form action="{{ url_for('main.admin_event_switch', event_id=event.id) }}" method="POST"><input type="hidden" name="csrf_token" value="{{ csrf_token() }}"><button type="submit" class="dropdown-item {% if current_event and current_event.id == event.id %}active{% endif %}">{{ event.name }}</button></form></li>{% endfor %}</ul></div>
|
|
{% endif %}
|
|
</header>
|
|
<main class="content-wrap">
|
|
{% else %}
|
|
<header class="public-header"><a class="sidebar-brand" href="{{ url_for('main.index') }}"><span class="brand-mark">I</span><span><strong>InviteMe</strong><small>Guest experience</small></span></a></header><main class="public-content">
|
|
{% endif %}
|
|
{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}<div class="flash-stack">{% for category, message in messages %}<div class="alert alert-{{ 'danger' if category == 'error' else category }} alert-dismissible fade show" role="alert">{{ message }}<button type="button" class="btn-close" data-bs-dismiss="alert"></button></div>{% endfor %}</div>{% endif %}{% endwith %}
|
|
{% block content %}{% endblock %}</main>
|
|
{% if current_user %}</section></div>{% endif %}
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js" integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL" crossorigin="anonymous"></script><script src="{{ url_for('static', filename='js/app.js') }}"></script>{% block scripts %}{% endblock %}
|
|
</body></html>
|