Email d'invitation complet avec textes personnalisables
L'email généré était réduit au bloc d'invitation. Il devient une vraie communication du Club : salutation, message d'introduction, carte de la rencontre (titre, description, date/heure/lieu/places), bouton d'inscription, message de conclusion, signature et pied de page contact. La modale d'administration devient un composeur : les quatre zones de texte (salutation, introduction, conclusion, signature) sont pré-remplies avec une rédaction par défaut et modifiables, avec régénération de l'aperçu pendant la saisie ; vider un champ retire le bloc de l'email. La route passe en POST avec validation zod des textes (longueurs max). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fkg15RCxNgUys4ru73He2o
This commit is contained in:
4 files changed
+182
-64
No files matched your search
@@ -97,3 +97,13 @@ export const contentSchema = z.object({
|
||||
hero_quote_text: trimmed(300).optional(),
|
||||
hero_quote_author: trimmed(120).optional(),
|
||||
});
|
||||
|
||||
// Invitation email composer: every text zone is optional — absent fields
|
||||
// fall back to the default wording, an empty string hides the block.
|
||||
export const emailComposeSchema = z.object({
|
||||
base: z.string().trim().url().max(300).optional(),
|
||||
greeting: z.string().trim().max(300).optional(),
|
||||
intro: z.string().trim().max(2000).optional(),
|
||||
outro: z.string().trim().max(2000).optional(),
|
||||
signature: z.string().trim().max(500).optional(),
|
||||
});
|
||||
Reference in new issue
Block a user