feat(admin): eigene Vorlage fuer die Willkommensmail mit Platzhaltern, Vorschau und Testmail
Tessera CI/CD / Lint & Type Check (push) Successful in 50s
Tessera CI/CD / Tests (push) Successful in 1m22s
Tessera CI/CD / Desktop-Pakete bauen (push) Successful in 19s
Tessera CI/CD / Build & Publish Images (push) Successful in 3m10s

Administrator -> Willkommensmail: Betreff, Ueberschrift, Einleitung, Abschluss je
Mandant (Tabelle WelcomeMailTemplate, RLS je Mandant, Migration 20260930150000);
Platzhalter {{name}} {{vorname}} {{benutzername}} {{email}} {{adresse}} {{firma}},
unbekannte -> 400 bzw. Hinweis beim Tippen; Werte escaped, Vorlage reiner Text.
Live-Vorschau per API gerendert, Testmail an die eigene Adresse ohne Token,
Zuruecksetzen auf Standard. Feste Bausteine (Kopf, Zugangsdaten, Anmeldehinweis,
Knoepfe, Fusszeile) bleiben immer drin.
Kopf: Wellenzelle dunkel statt weiss, Streifen 600x40, Inhalt 24 px naeher –
keine weisse Luecke, wenn OWA das CID-Bild nicht zeigt.
Lokal nachgewiesen: Hinweis/Sperre bei {{xyz}}, Speichern, Testmail (Link nur
/login), echte Mail mit eigener Vorlage und 7-Tage-Link.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-30 16:49:17 +02:00
parent 31d514b7ca
commit e10da76259
27 changed files with 2471 additions and 82 deletions
+98 -1
View File
@@ -88,7 +88,8 @@
"customModules": "Eigene Module",
"ldap": "LDAP",
"smtp": "SMTP",
"groups": "Gruppen"
"groups": "Gruppen",
"welcomeMail": "Willkommensmail"
},
"role": {
"SUPER_ADMIN": "Super-Admin",
@@ -738,6 +739,102 @@
"create": "Gemeinsamen Eintrag anlegen",
"noModules": "Noch keine gemeinsamen Einträge",
"noModulesBody": "Legen Sie Ihren ersten gemeinsamen Eintrag an, um eine Webseite für alle Benutzer in der Seitenleiste zu zeigen."
},
"welcomeMail": {
"title": "Willkommensmail",
"description": "Hier legen Sie fest, mit welchen Worten Tessera neue Benutzer begrüßt. Die Vorlage gilt für Ihren Mandanten und wird bei jeder Willkommensmail aus der Benutzerverwaltung verwendet.",
"loading": "Vorlage wird geladen …",
"fixed": {
"title": "Was Sie anpassen können – und was immer drin bleibt",
"body": "Sie bestimmen Betreff, Überschrift, Einleitung und Abschlusstext. Alles, was für die Anmeldung wichtig ist, fügt Tessera immer automatisch ein und lässt sich nicht verändern: der Kopf mit Logo, der Kasten mit Adresse und Benutzername, der Anmeldehinweis samt Knopf „Passwort festlegen“ bei lokalen Konten, der Knopf „Zu Tessera“ und die Fußzeile. So kann eine eigene Vorlage die Anmeldung nicht kaputt machen."
},
"statusDefault": "Zurzeit gelten die Standardtexte.",
"statusCustom": "Eigene Vorlage aktiv – zuletzt geändert am {date}.",
"statusCustomBy": "Eigene Vorlage aktiv – zuletzt geändert am {date} von {user}.",
"unsaved": "Ungespeicherte Änderungen",
"fields": {
"subject": "Betreff",
"subjectHelp": "Eine Zeile, Pflichtfeld.",
"heading": "Überschrift",
"headingHelp": "Große Zeile oben in der Mail, Pflichtfeld.",
"intro": "Einleitungstext",
"introHelp": "Steht unter der Überschrift. Eine Leerzeile beginnt einen neuen Absatz.",
"closing": "Abschlusstext",
"closingHelp": "Steht am Ende der Mail, z. B. Tipp und Grußzeile. Darf leer bleiben."
},
"counter": "{count} / {max}",
"save": "Speichern",
"saving": "Wird gespeichert …",
"saved": "Die Vorlage wurde gespeichert. Ab jetzt verwenden neue Willkommensmails diese Texte.",
"test": "Testmail an mich senden",
"testSending": "Wird gesendet …",
"testSent": "Die Testmail wurde an {email} gesendet.",
"testHelp": "Die Testmail geht an Ihre eigene E-Mail-Adresse und zeigt den aktuellen Inhalt des Formulars, auch wenn er noch nicht gespeichert ist. Sie enthält keinen echten Link zum Festlegen eines Passworts.",
"reset": "Auf Standard zurücksetzen",
"resetDone": "Die Standardtexte sind wiederhergestellt.",
"resetConfirm": {
"title": "Auf Standard zurücksetzen?",
"body": "Ihre eigene Vorlage wird gelöscht und die Standardtexte gelten wieder. Das lässt sich nicht rückgängig machen.",
"confirm": "Zurücksetzen",
"cancel": "Abbrechen"
},
"errors": {
"load": "Die Vorlage konnte nicht geladen werden. Bitte laden Sie die Seite neu.",
"save": "Die Vorlage konnte nicht gespeichert werden.",
"reset": "Die Vorlage konnte nicht zurückgesetzt werden.",
"test": "Die Testmail konnte nicht gesendet werden.",
"required": "Bitte füllen Sie dieses Feld aus.",
"tooLong": "Höchstens {max} Zeichen.",
"unknownPlaceholder": "Unbekannter Platzhalter {token}",
"unknownPlaceholders": "Unbekannte Platzhalter {tokens}"
},
"placeholders": {
"title": "Platzhalter",
"intro": "Platzhalter setzt Tessera beim Versand durch die Angaben des jeweiligen Benutzers. Sie funktionieren in allen vier Feldern. Ein Klick auf einen Platzhalter fügt ihn an der Cursorposition des zuletzt benutzten Feldes ein.",
"colPlaceholder": "Platzhalter",
"colMeaning": "Bedeutung",
"colExample": "Beispiel",
"insert": "{token} einfügen",
"insertHint": "Klicken zum Einfügen",
"rules": "Andere Platzhalter kennt Tessera nicht – sie werden beim Speichern abgelehnt. Die Texte sind reiner Text: Formatierungen oder HTML werden nicht übernommen, sondern so angezeigt, wie Sie sie eingeben.",
"items": {
"name": {
"meaning": "Anzeigename des Benutzers, sonst sein Benutzername",
"example": "Max Mustermann"
},
"vorname": {
"meaning": "Erstes Wort des Anzeigenamens, sonst der Benutzername",
"example": "Max"
},
"benutzername": {
"meaning": "Benutzername für die Anmeldung",
"example": "max.mustermann"
},
"email": {
"meaning": "E-Mail-Adresse des Benutzers",
"example": "max.mustermann@example.com"
},
"adresse": {
"meaning": "Adresse von Tessera",
"example": "https://tessera.example.com"
},
"firma": {
"meaning": "Name Ihres Mandanten",
"example": "Beispiel GmbH"
}
}
},
"preview": {
"title": "Vorschau",
"accountLabel": "Vorschau für Kontoart",
"directory": "Verzeichniskonto",
"local": "Lokales Konto",
"subject": "Betreff:",
"frameTitle": "Vorschau der Willkommensmail",
"error": "Die Vorschau konnte nicht erstellt werden.",
"blocked": "Die Vorschau wird aktualisiert, sobald alle Felder in Ordnung sind.",
"sampleHint": "Die Vorschau verwendet Beispielwerte (Max Mustermann) und den Namen Ihres Mandanten. Der Link „Passwort festlegen“ ist in der Vorschau nur ein Beispiel."
}
}
},
"adminModules": {
+98 -1
View File
@@ -88,7 +88,8 @@
"customModules": "Custom modules",
"ldap": "LDAP",
"smtp": "SMTP",
"groups": "Groups"
"groups": "Groups",
"welcomeMail": "Welcome email"
},
"role": {
"SUPER_ADMIN": "Super Admin",
@@ -738,6 +739,102 @@
"create": "Add shared entry",
"noModules": "No shared entries yet",
"noModulesBody": "Add your first shared entry to show a website in the sidebar for all users."
},
"welcomeMail": {
"title": "Welcome email",
"description": "Choose the words Tessera uses to greet new users. The template applies to your tenant and is used for every welcome email sent from user management.",
"loading": "Loading template …",
"fixed": {
"title": "What you can change – and what always stays",
"body": "You decide the subject, heading, introduction and closing text. Everything needed to sign in is always added automatically and cannot be changed: the header with logo, the box with address and username, the sign-in hint including the “Set password” button for local accounts, the “Go to Tessera” button and the footer. This way a custom template cannot break sign-in."
},
"statusDefault": "The default texts are currently in use.",
"statusCustom": "Custom template active – last changed on {date}.",
"statusCustomBy": "Custom template active – last changed on {date} by {user}.",
"unsaved": "Unsaved changes",
"fields": {
"subject": "Subject",
"subjectHelp": "One line, required.",
"heading": "Heading",
"headingHelp": "Large line at the top of the email, required.",
"intro": "Introduction",
"introHelp": "Shown below the heading. An empty line starts a new paragraph.",
"closing": "Closing text",
"closingHelp": "Shown at the end of the email, e.g. a tip and a sign-off. May be left empty."
},
"counter": "{count} / {max}",
"save": "Save",
"saving": "Saving …",
"saved": "The template has been saved. New welcome emails will use these texts from now on.",
"test": "Send test email to me",
"testSending": "Sending …",
"testSent": "The test email was sent to {email}.",
"testHelp": "The test email goes to your own email address and shows the current form content, even if it has not been saved yet. It does not contain a real link for setting a password.",
"reset": "Reset to default",
"resetDone": "The default texts have been restored.",
"resetConfirm": {
"title": "Reset to default?",
"body": "Your custom template will be deleted and the default texts apply again. This cannot be undone.",
"confirm": "Reset",
"cancel": "Cancel"
},
"errors": {
"load": "The template could not be loaded. Please reload the page.",
"save": "The template could not be saved.",
"reset": "The template could not be reset.",
"test": "The test email could not be sent.",
"required": "Please fill in this field.",
"tooLong": "At most {max} characters.",
"unknownPlaceholder": "Unknown placeholder {token}",
"unknownPlaceholders": "Unknown placeholders {tokens}"
},
"placeholders": {
"title": "Placeholders",
"intro": "Tessera replaces placeholders with the details of each user when sending. They work in all four fields. Clicking a placeholder inserts it at the cursor position of the field you used last.",
"colPlaceholder": "Placeholder",
"colMeaning": "Meaning",
"colExample": "Example",
"insert": "Insert {token}",
"insertHint": "Click to insert",
"rules": "Tessera does not know any other placeholders – they are rejected when saving. The texts are plain text: formatting or HTML is not applied but shown exactly as you type it.",
"items": {
"name": {
"meaning": "Display name of the user, otherwise the username",
"example": "Max Mustermann"
},
"vorname": {
"meaning": "First word of the display name, otherwise the username",
"example": "Max"
},
"benutzername": {
"meaning": "Username for signing in",
"example": "max.mustermann"
},
"email": {
"meaning": "Email address of the user",
"example": "max.mustermann@example.com"
},
"adresse": {
"meaning": "Address of Tessera",
"example": "https://tessera.example.com"
},
"firma": {
"meaning": "Name of your tenant",
"example": "Example Ltd"
}
}
},
"preview": {
"title": "Preview",
"accountLabel": "Preview for account type",
"directory": "Directory account",
"local": "Local account",
"subject": "Subject:",
"frameTitle": "Welcome email preview",
"error": "The preview could not be created.",
"blocked": "The preview updates as soon as all fields are valid.",
"sampleHint": "The preview uses sample values (Max Mustermann) and the name of your tenant. The “Set password” link is only an example in the preview."
}
}
},
"adminModules": {
@@ -197,4 +197,10 @@ export const UMLAUT_ALLOWLIST: readonly string[] = [
'Arbeitsspeicher',
// quick-260925-bow: „Was ist neu“-Fenster, Gruppe „Verbessert“ — korrektes Deutsch mit „ss“
'Verbessert',
// Administrator → Willkommensmail (eigene Vorlage) — korrektes Deutsch mit „ss“/„ue“/„ae“
'anpassen',
'Abschlusstext',
'aktuellen',
'Passworts',
'tessera',
];