From 5330fecf4362587f6ef2efbc74ea53dae998267b Mon Sep 17 00:00:00 2001 From: louispaulb Date: Fri, 22 May 2026 09:46:58 -0400 Subject: [PATCH] feat(campaigns/wizard): per-language template override MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two new dropdowns in Step 1 ("Template français" / "Template anglais") populated from /campaigns/templates filtered by suffix (-fr / -en). Selection is stored on campaign.params.template_fr / .template_en and the worker resolves the actual path via a new resolveTemplatePath helper: 1. params.template_ (per-lang override, set here) 2. params.template_path (legacy single-template campaign override) 3. templateForLanguage() (default gift-email-.html) Defensive name regex inside resolveTemplatePath blocks path traversal — operator can pick any *-fr / *-en template that exists, nothing else. The Step 3 summary list now shows which template will actually ship per language so the operator can sanity-check before launch. Use cases: seasonal variants (gift-email-2026-summer-fr), A/B tests, draft templates that aren't ready to be the default yet. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.7 --- .../campaigns/pages/CampaignNewPage.vue | 52 ++++++++++++++++++- services/targo-hub/lib/campaigns.js | 21 +++++++- 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/apps/ops/src/modules/campaigns/pages/CampaignNewPage.vue b/apps/ops/src/modules/campaigns/pages/CampaignNewPage.vue index 5b4956a..bef7295 100644 --- a/apps/ops/src/modules/campaigns/pages/CampaignNewPage.vue +++ b/apps/ops/src/modules/campaigns/pages/CampaignNewPage.vue @@ -68,6 +68,21 @@ + + + Template envoyé aux destinataires marqués FR. Tous les templates avec suffixe -fr sont listés. + + + Template envoyé aux destinataires marqués EN. + @@ -324,6 +339,8 @@ Engagement{{ params.commitment_months }} mois Sujet{{ params.subject }} Expéditeur{{ params.from }} + Template FR{{ params.template_fr }} + Template EN{{ params.template_en }} Throttle{{ params.throttle_ms }} ms entre envois (≈ {{ Math.round((60 / (params.throttle_ms / 1000)) || 0) }} emails/min) Durée estimée≈ {{ estimatedMinutes }} min @@ -443,10 +460,10 @@