From 33161d1a4dbb7d9498f87e2bec5530e8c93474d9 Mon Sep 17 00:00:00 2001 From: Manus Sandbox Date: Sun, 23 Nov 2025 16:14:53 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Impl=C3=A9mentation=20compl=C3=A8?= =?UTF-8?q?te=20du=20remplacement=20automatique=20des=20variables=20dans?= =?UTF-8?q?=20les=20emails=20et=20ajout=20d'un=20bouton=20d'aper=C3=A7u.?= =?UTF-8?q?=20Les=20variables=20{{nomApprenant}},=20{{prenomApprenant}},?= =?UTF-8?q?=20{{nomFormation}},=20{{nomSequence}},=20{{dateDebut}},=20{{da?= =?UTF-8?q?teFin}},=20{{lieu}},=20{{formateur}}=20sont=20automatiquement?= =?UTF-8?q?=20remplac=C3=A9es=20lors=20de=20l'envoi=20d'emails.=20Un=20bou?= =?UTF-8?q?ton=20"Aper=C3=A7u=20email"=20permet=20de=20visualiser=20le=20r?= =?UTF-8?q?endu=20final=20avec=20des=20donn=C3=A9es=20d'exemple=20avant=20?= =?UTF-8?q?l'envoi.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/pages/AdminEmailTemplates.tsx | 89 ++++++++++++++++++++++++ server/emailService.ts | 22 +++++- server/emailTemplateGenerator.ts | 31 +++++++-- server/emailTemplateUtils.ts | 65 +++++++++++++++++ todo.md | 8 +++ 5 files changed, 206 insertions(+), 9 deletions(-) create mode 100644 server/emailTemplateUtils.ts diff --git a/client/src/pages/AdminEmailTemplates.tsx b/client/src/pages/AdminEmailTemplates.tsx index a28fcac..a1aa833 100644 --- a/client/src/pages/AdminEmailTemplates.tsx +++ b/client/src/pages/AdminEmailTemplates.tsx @@ -26,9 +26,17 @@ import { } from "@/components/ui/select"; import { toast } from "sonner"; import { Mail, Eye, Save, RotateCcw, Plus } from "lucide-react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog"; export default function AdminEmailTemplates() { const [selectedType, setSelectedType] = useState("inscription"); + const [showPreviewModal, setShowPreviewModal] = useState(false); const [formData, setFormData] = useState({ type: "inscription", name: "", @@ -139,6 +147,63 @@ export default function AdminEmailTemplates() { } }; + // Générer la prévisualisation HTML avec variables remplacées + const generatePreviewWithVariables = () => { + // Remplacer les variables par des données d'exemple + const replaceVariables = (text: string) => { + return text + .replace(/\{\{nomApprenant\}\}/g, 'Dupont') + .replace(/\{\{prenomApprenant\}\}/g, 'Marie') + .replace(/\{\{nomFormation\}\}/g, 'Formation Management') + .replace(/\{\{nomSequence\}\}/g, 'Séquence 1 - Introduction') + .replace(/\{\{dateDebut\}\}/g, '15/01/2025') + .replace(/\{\{dateFin\}\}/g, '17/01/2025') + .replace(/\{\{lieu\}\}/g, 'Salle de formation A - Bâtiment principal') + .replace(/\{\{formateur\}\}/g, 'Jean Martin'); + }; + + const bodyWithVars = formData.bodyContent ? replaceVariables(formData.bodyContent) : ` +

Saisissez le contenu de votre email dans le champ "Corps du message" pour voir la prévisualisation ici...

+ `; + const headerWithVars = replaceVariables(formData.headerTitle); + const footerWithVars = formData.footerText ? replaceVariables(formData.footerText) : 'Texte du pied de page'; + + return ` + + + + + + + +
+
+ ${formData.logoUrl ? `Logo` : ''} +

${headerWithVars}

+
+
+ ${bodyWithVars} +
+ +
+ + + `.trim(); + }; + // Générer la prévisualisation HTML const generatePreview = () => { return ` @@ -503,6 +568,10 @@ export default function AdminEmailTemplates() { {upsertMutation.isPending ? "Enregistrement..." : "Enregistrer"} +