From 4fafd3e80e659723c552911720ea9cab11a6ecd8 Mon Sep 17 00:00:00 2001 From: Deeman Date: Wed, 25 Feb 2026 12:13:35 +0100 Subject: [PATCH] =?UTF-8?q?feat(emails):=20subtask=206=20=E2=80=94=20admin?= =?UTF-8?q?=20gallery=20(routes,=20templates,=20sidebar=20link)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add GET /admin/emails/gallery — card grid of all 11 email types - Add GET /admin/emails/gallery/?lang=en|de — preview with lang toggle - Add email_gallery.html: 3-column responsive card grid - Add email_gallery_preview.html: full-width iframe + EN/DE toggle + log link - Add Gallery sidebar link to base_admin.html (admin_page == 'gallery') Co-Authored-By: Claude Sonnet 4.6 --- web/src/padelnomics/admin/routes.py | 39 +++++++++ .../admin/templates/admin/base_admin.html | 4 + .../admin/templates/admin/email_gallery.html | 81 +++++++++++++++++++ .../admin/email_gallery_preview.html | 61 ++++++++++++++ 4 files changed, 185 insertions(+) create mode 100644 web/src/padelnomics/admin/templates/admin/email_gallery.html create mode 100644 web/src/padelnomics/admin/templates/admin/email_gallery_preview.html diff --git a/web/src/padelnomics/admin/routes.py b/web/src/padelnomics/admin/routes.py index b60d27f..c578d99 100644 --- a/web/src/padelnomics/admin/routes.py +++ b/web/src/padelnomics/admin/routes.py @@ -1249,6 +1249,45 @@ async def emails(): ) +@bp.route("/emails/gallery") +@role_required("admin") +async def email_gallery(): + """Gallery of all email template types with sample previews.""" + return await render_template( + "admin/email_gallery.html", + registry=EMAIL_TEMPLATE_REGISTRY, + ) + + +@bp.route("/emails/gallery/") +@role_required("admin") +async def email_gallery_preview(slug: str): + """Rendered preview of a single email template with sample data.""" + entry = EMAIL_TEMPLATE_REGISTRY.get(slug) + if not entry: + await flash(f"Unknown email template: {slug!r}", "error") + return redirect(url_for("admin.email_gallery")) + + lang = request.args.get("lang", "en") + if lang not in ("en", "de"): + lang = "en" + + try: + sample = entry["sample_data"](lang) + rendered_html = render_email_template(entry["template"], lang=lang, **sample) + except Exception: + logger.exception("email_gallery_preview: render failed for %s (lang=%s)", slug, lang) + rendered_html = "

Render error — see logs.

" + + return await render_template( + "admin/email_gallery_preview.html", + slug=slug, + entry=entry, + lang=lang, + rendered_html=rendered_html, + ) + + @bp.route("/emails/results") @role_required("admin") async def email_results(): diff --git a/web/src/padelnomics/admin/templates/admin/base_admin.html b/web/src/padelnomics/admin/templates/admin/base_admin.html index 06883f3..d5ffbf0 100644 --- a/web/src/padelnomics/admin/templates/admin/base_admin.html +++ b/web/src/padelnomics/admin/templates/admin/base_admin.html @@ -118,6 +118,10 @@ Compose + + + Gallery + Audiences diff --git a/web/src/padelnomics/admin/templates/admin/email_gallery.html b/web/src/padelnomics/admin/templates/admin/email_gallery.html new file mode 100644 index 0000000..6e03f13 --- /dev/null +++ b/web/src/padelnomics/admin/templates/admin/email_gallery.html @@ -0,0 +1,81 @@ +{% extends "admin/base_admin.html" %} +{% set admin_page = "gallery" %} +{% block title %}Email Gallery - Admin - {{ config.APP_NAME }}{% endblock %} + +{% block admin_head %} + +{% endblock %} + +{% block admin_content %} +
+
+

Email Gallery

+ {{ registry | length }} template{{ 's' if registry | length != 1 else '' }} +
+

Rendered previews of all transactional email templates with sample data.

+
+ +
+{% endblock %} diff --git a/web/src/padelnomics/admin/templates/admin/email_gallery_preview.html b/web/src/padelnomics/admin/templates/admin/email_gallery_preview.html new file mode 100644 index 0000000..3fc6bfa --- /dev/null +++ b/web/src/padelnomics/admin/templates/admin/email_gallery_preview.html @@ -0,0 +1,61 @@ +{% extends "admin/base_admin.html" %} +{% set admin_page = "gallery" %} +{% block title %}{{ entry.label }} Preview - Email Gallery - Admin{% endblock %} + +{% block admin_head %} + +{% endblock %} + +{% block admin_content %} +
+ ← Email Gallery +

{{ entry.label }}

+

{{ entry.description }}

+
+ +
+
+ {% if entry.email_type %} + + View in sent log → + + {% endif %} +
+ + {# Language toggle #} +
+ EN + DE +
+
+ + +{% endblock %}