From d26722f04887cf99592047f72384ea0eb59b176c Mon Sep 17 00:00:00 2001 From: louispaulb Date: Thu, 9 Jul 2026 11:05:31 -0400 Subject: [PATCH] =?UTF-8?q?Events:=20editable=20(Unlayer)=20email=20templa?= =?UTF-8?q?te,=20"Tous"=20includes=20r=C3=A9sili=C3=A9s,=20realtime=20pick?= =?UTF-8?q?er?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Email template: an event can use an editable campaign-style template (Unlayer) for its invitation instead of the built-in festive builder. Config field email_template ('' = festive default/fallback). inviteEmail() renders the named template via campaigns.renderNamedTemplate with {{firstname}}/{{rsvp_url}} (+ event vars), else festive. campaigns.js: add 'event-' template prefix + export renderNamedTemplate. New GET /events/:id/invite-preview (festive | configured | override) for live preview. Editor gains a template selector, "design in editor" link, and an inbox preview dialog. - Audience "Tous (incl. résiliés)": filters.include_resiliated skips the résilié guard for win-back; "Clients actifs" still excludes them. - Manual picker: realtime fuzzy search into a results list (add per row), separate pool, then add-batch — replaces the combobox. Co-Authored-By: Claude Opus 4.8 --- apps/ops/src/api/events.js | 7 ++ apps/ops/src/pages/EventsPage.vue | 132 +++++++++++++++++++++------- services/targo-hub/lib/campaigns.js | 14 ++- services/targo-hub/lib/events.js | 54 ++++++++++-- 4 files changed, 167 insertions(+), 40 deletions(-) diff --git a/apps/ops/src/api/events.js b/apps/ops/src/api/events.js index 01a541e..a77354f 100644 --- a/apps/ops/src/api/events.js +++ b/apps/ops/src/api/events.js @@ -27,6 +27,13 @@ export async function deleteRsvp (eventId, key) { return hubFetch(`/events/${enc export async function sendInvite (eventId, body) { return hubFetch(`/events/${encodeURIComponent(eventId)}/send`, { method: 'POST', body }) } export async function previewAudience (eventId, body) { return hubFetch(`/events/${encodeURIComponent(eventId)}/audience`, { method: 'POST', body }) } +// Aperçu HTML de l'invitation (gabarit festif OU template éditable). template: undefined=modèle configuré, ''=festif, ''=ce template. +export async function getInvitePreview (eventId, { lang = 'fr', template } = {}) { + const qs = new URLSearchParams({ lang }) + if (template !== undefined) qs.set('template', template) + return hubFetch(`/events/${encodeURIComponent(eventId)}/invite-preview?${qs.toString()}`) +} + // Recherche FLOUE de clients (pg_trgm, typo/accent-tolérante) — réutilise l'endpoint app-wide. export async function searchCustomersFuzzy (q) { return hubFetch(`/collab/customer-search?q=${encodeURIComponent(q)}`) } diff --git a/apps/ops/src/pages/EventsPage.vue b/apps/ops/src/pages/EventsPage.vue index 2153c10..d6fe254 100644 --- a/apps/ops/src/pages/EventsPage.vue +++ b/apps/ops/src/pages/EventsPage.vue @@ -180,6 +180,22 @@ + + +
Modèle du courriel d'invitation
+ +
+ +
Aperçu et conception disponibles après la création.
+
+