Files
e-ticket/templates/email/base.html.twig
Serreau Jovann df7680d938 Add admin panel, Meilisearch buyer search, email redesign, and multiple features
Admin panel (/admin, ROLE_ROOT):
- Dashboard with CA HT Global/Commission cards and Meilisearch sync button
- Buyers page with search (Meilisearch), create form, pagination (KnpPaginator)
- Buyer actions: resend verification, force verify, reset password, delete
- Organizers page with tabs (pending/approved), approve/reject with emails
- Neo-brutalist design matching main site theme
- Vite admin entry point with dedicated SCSS
- CSP-compatible confirm dialogs via data-confirm attributes

Meilisearch integration:
- Auto-index buyers on email verification
- Remove from index on buyer deletion
- Manual sync button on dashboard
- Search bar on buyers page
- Add Meilisearch service to CI/SonarQube workflows
- Add MEILISEARCH env vars to .env.test
- Fix MeilisearchMessageHandler infinite loop: use request() directly instead
  of service methods that re-dispatch messages

Email templates:
- Redesign base email template to neo-brutalist style (borders, shadows, yellow footer)
- Add E-Cosplay logo, "E-Ticket solution proposee par e-cosplay.fr"
- Add admin_reset_password, organizer_approved, organizer_rejected templates

Other:
- Install knplabs/knp-paginator-bundle
- Add ^/admin access_control for ROLE_ROOT in security.yaml
- Update site footer with E-Ticket branding
- 18 admin tests, updated MeilisearchMessageHandler tests

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 14:07:07 +01:00

106 lines
3.1 KiB
Twig

{% apply inline_css %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}E-Ticket{% endblock %}</title>
<style>
body {
margin: 0;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
background-color: #fbfbfb;
color: #111827;
}
.wrapper {
width: 100%;
padding: 40px 0;
background-color: #fbfbfb;
}
.container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
border: 4px solid #111827;
box-shadow: 8px 8px 0 rgba(0,0,0,1);
}
.header {
background-color: #111827;
padding: 24px 32px;
text-align: center;
}
.header img {
height: 40px;
width: auto;
}
.content {
padding: 32px;
}
.content h2 {
margin: 0 0 16px;
font-size: 22px;
font-weight: 900;
text-transform: uppercase;
letter-spacing: -0.025em;
color: #111827;
}
.content p {
margin: 0 0 16px;
font-size: 15px;
line-height: 1.6;
color: #374151;
}
.btn {
display: inline-block;
padding: 14px 28px;
background-color: #fabf04;
color: #111827;
text-decoration: none;
font-weight: 900;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.05em;
border: 3px solid #111827;
box-shadow: 4px 4px 0 rgba(0,0,0,1);
}
.footer {
padding: 24px 32px;
background-color: #fabf04;
border-top: 4px solid #111827;
}
.footer p {
margin: 0 0 4px;
font-size: 12px;
font-weight: 700;
color: #111827;
}
.footer a {
color: #111827;
text-decoration: underline;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="container">
<div class="header">
<img src="https://ticket.e-cosplay.fr/logo.png" alt="E-Ticket">
</div>
<div class="content">
{% block content %}{% endblock %}
</div>
<div class="footer">
{% block footer %}
<p>&copy; {{ "now"|date("Y") }} E-TICKET — <a href="https://ticket.e-cosplay.fr">ticket.e-cosplay.fr</a></p>
<p>E-Ticket, solution proposee par l'association <a href="https://www.e-cosplay.fr">e-cosplay.fr</a></p>
<p>42 rue de Saint-Quentin, 02800 Beautor, France</p>
<p style="margin-top:8px;font-size:10px;opacity:0.7;">Cet email a ete envoye depuis contact@e-cosplay.fr</p>
{% endblock %}
</div>
</div>
</div>
</body>
</html>
{% endapply %}