Files
InviteMe/app/templates/base.html
T
InviteMe Developer 21a9d1c9b7 fix: correct Bootstrap CSS integrity hash
The integrity attribute in base.html did not match the actual file served by
jsdelivr, causing browsers to block the Bootstrap stylesheet. This broke the
login page layout (labels and inputs shifted, controls not full width).
2026-09-01 11:29:05 +03:00

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>