From cae8657ec8a05e63c96712164bf4fb0850168a22 Mon Sep 17 00:00:00 2001 From: carsten Date: Tue, 29 Sep 2026 02:34:07 +0200 Subject: [PATCH] =?UTF-8?q?Opgave=2011b=20(del=203):=20Mail-skabeloner=20+?= =?UTF-8?q?=20annonc=C3=A9r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TemplatesPage (/skabeloner) — én sektion pr. event_type (round_announced/order_confirmed/payment_confirmed), hver med opret/gem/slet og et hint om hvilke {{variabler}} der er tilgængelige for netop den mailtype. Ingen backend-ændringer nødvendige, al CRUD fandtes allerede (opgave 7a). "Annoncér runde"-knap på RoundDetailPage (kun ved status "open"), med et eksplicit confirm() da handlingen sender rigtig mail til alle aktive deltagere på ruten og ikke er idempotent. Kalder det eksisterende /announce-endpoint (opgave 7b) og viser resultatet. Verificeret i en fuldstændig isoleret sandbox (midlertidig separat rute) for at undgå en utilsigtet rigtig annoncering til de 308 rigtige deltagere under udvikling. Brugeren oprettede under browser-test rigtige mail-skabeloner for alle tre event-typer på rute 4 — det tidligere udskudte punkt er dermed løst. Dette afslutter opgave 11b (alle tre dele). Co-Authored-By: Claude Sonnet 5 --- CLAUDE.md | 53 +++++-- admin-ui/src/App.tsx | 2 + admin-ui/src/Layout.tsx | 1 + admin-ui/src/pages/RoundDetailPage.tsx | 36 +++++ admin-ui/src/pages/TemplatesPage.tsx | 183 +++++++++++++++++++++++++ 5 files changed, 260 insertions(+), 15 deletions(-) create mode 100644 admin-ui/src/pages/TemplatesPage.tsx diff --git a/CLAUDE.md b/CLAUDE.md index cf69dfb..570dacb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -203,12 +203,11 @@ offentlige side, egen `Jinja2Templates`-instans i Opgave 11 (React admin-UI) er delt op ligesom opgave 8: **11a** (scaffold + hosting-mekanisme, ✅). **11b** viste sig under afklaring at være for stort til én omgang og er selv delt i tre dele, alle -stadig under "11b" (ingen ny bogstav-opdeling): **del 1** (delt -frontend-infrastruktur + Deltagere-CRUD, ✅, se nedenfor), **del 2** -(runder + vinliste, ikke bygget) og **del 3** (mail-skabelon-editor + -annoncér-knap, ikke bygget — "annoncér" er reelt ubrugelig uden en -måde at oprette en `round_announced`-skabelon på). **11c** -(ordreoversigt/markér betalt) er heller ikke bygget endnu. +stadig under "11b" (ingen ny bogstav-opdeling), **alle tre nu ✅**: +**del 1** (delt frontend-infrastruktur + Deltagere-CRUD), **del 2** +(runder + vinliste), **del 3** (mail-skabelon-editor + +annoncér-knap). **11c** (ordreoversigt/markér betalt) er ikke bygget +endnu. **Hosting-beslutning:** Admin-UI'et (`admin-ui/`, React + TypeScript, almindelig CSS — ingen framework) serveres af **samme FastAPI-app** @@ -313,9 +312,34 @@ fandtes allerede (opgave 6): token). Åbne runder kan aldrig slettes (håndhævet server-side, ingen UI-vej udenom). - **Bevidst udeladt** (matcher 8/11-opdelingen): annoncér-knap og - mail-skabeloner (del 3); link til opgave 10's afhentningsliste - (autentificeret HTML-endpoint — kræver en særskilt løsning, da et - almindeligt `` ikke sender `Authorization`-headeren). + mail-skabeloner (del 3, se nedenfor); link til opgave 10's + afhentningsliste (autentificeret HTML-endpoint — kræver en særskilt + løsning, da et almindeligt `` ikke sender + `Authorization`-headeren). + +**11b del 3** (mail-skabeloner + annoncér) afslutter 11b. Ingen +backend-ændringer nødvendige — opgave 7a's `MailTemplate`-CRUD og +7b's `/announce`-endpoint fandtes allerede, blot uden noget UI: +- **`TemplatesPage`** (`/skabeloner`) — én sektion pr. `event_type` + (Runde åbnet/Ordre bekræftet/Betaling bekræftet), hver med Emne + + Indhold (rå HTML i en `