Checkpoint: Ajout du champ "Corps du message" dans l'interface de gestion des templates d'emails. Les utilisateurs peuvent maintenant personnaliser le contenu principal de leurs emails automatiques (confirmation, teaser, rappel) en plus du titre, des couleurs et du pied de page. Le champ accepte du texte simple et affiche une prévisualisation en temps réel.

This commit is contained in:
Manus Sandbox
2025-11-23 14:57:58 -05:00
parent 59edce13d7
commit 62644d544e
9 changed files with 916 additions and 2 deletions

View File

@@ -2,7 +2,7 @@ export { COOKIE_NAME, ONE_YEAR_MS } from "@shared/const";
export const APP_TITLE = import.meta.env.VITE_APP_TITLE || "App";
export const APP_LOGO = "https://placehold.co/128x128/E1E7EF/1F2937?text=App";
export const APP_LOGO = "/itinova-logo.png";
// Generate login URL at runtime so redirect URI reflects the current origin.
export const getLoginUrl = () => {

View File

@@ -32,6 +32,7 @@ export default function AdminEmailTemplates() {
headerBgColor: "#2563eb",
headerTextColor: "#ffffff",
headerTitle: "Formation Manager Itinova",
bodyContent: "",
footerText: "",
active: true,
});
@@ -73,6 +74,7 @@ export default function AdminEmailTemplates() {
headerBgColor: currentTemplate.headerBgColor,
headerTextColor: currentTemplate.headerTextColor,
headerTitle: currentTemplate.headerTitle,
bodyContent: currentTemplate.bodyContent || "",
footerText: currentTemplate.footerText || "",
active: currentTemplate.active,
});
@@ -83,6 +85,7 @@ export default function AdminEmailTemplates() {
upsertMutation.mutate({
...formData,
logoUrl: formData.logoUrl || null,
bodyContent: formData.bodyContent || null,
footerText: formData.footerText || null,
});
};
@@ -97,6 +100,7 @@ export default function AdminEmailTemplates() {
headerBgColor: currentTemplate.headerBgColor,
headerTextColor: currentTemplate.headerTextColor,
headerTitle: currentTemplate.headerTitle,
bodyContent: currentTemplate.bodyContent || "",
footerText: currentTemplate.footerText || "",
active: currentTemplate.active,
});
@@ -136,9 +140,11 @@ export default function AdminEmailTemplates() {
<h1>${formData.headerTitle}</h1>
</div>
<div class="content">
${formData.bodyContent ? formData.bodyContent.replace(/\n/g, '<br>') : `
<h2>Exemple de contenu</h2>
<p>Bonjour,</p>
<p>Ceci est un exemple de prévisualisation de votre template d'email personnalisé.</p>
`}
<div class="info-box">
<p><strong>Information importante</strong></p>
<p>Ce bloc utilise la couleur principale que vous avez choisie.</p>
@@ -313,6 +319,20 @@ export default function AdminEmailTemplates() {
/>
</div>
<div>
<Label htmlFor="bodyContent">Corps du message</Label>
<Textarea
id="bodyContent"
value={formData.bodyContent}
onChange={(e) => setFormData({ ...formData, bodyContent: e.target.value })}
placeholder="Contenu principal de l'email...\n\nVous pouvez utiliser des variables : {{nomApprenant}}, {{nomFormation}}, {{nomSequence}}, etc."
rows={8}
/>
<p className="text-xs text-muted-foreground mt-1">
Le contenu du corps du message. Laissez vide pour utiliser le contenu par défaut.
</p>
</div>
<div>
<Label htmlFor="footerText">Texte du pied de page</Label>
<Textarea