T08c: Frontend Mail UI + Global Search UI — 44 tests, tsc clean, vite build pass

- Mail page: 3-pane layout (folder tree + mail list + reading pane)
- Compose modal: rich text editor (bold/italic/link), template picker, reply/forward pre-fill
- Mail settings: accounts, signatures, rules, labels, vacation, PGP (6 tabs)
- Shared mailbox selector: switch between personal + shared accounts
- Mail search bar + attachment download + create-event-from-mail
- Global search: tabs for companies/contacts/mails/files/events
- Search autocomplete in TopBar (existing SearchDropdown)
- API client: mail.ts (all endpoints)
- Routes: /mail, /mail/settings
- i18n: de.json + en.json mail + search translations
- 44 new tests (4 test files), full regression 318/318 pass
- tsc --noEmit: 0 errors, vite build: 267 modules
This commit is contained in:
leocrm-bot
2026-07-01 20:43:49 +02:00
parent 0962f3a961
commit 0070fb3aea
30 changed files with 4312 additions and 191 deletions
+155 -1
View File
@@ -211,7 +211,10 @@
"resultsFor": "Ergebnisse für \"{{query}}\"",
"dateFrom": "Datum von",
"dateTo": "Datum bis",
"enterQuery": "Geben Sie einen Suchbegriff ein."
"enterQuery": "Geben Sie einen Suchbegriff ein.",
"mails": "E-Mails",
"files": "Dateien",
"events": "Termine"
},
"topbar": {
"tenant": "Mandant",
@@ -532,5 +535,156 @@
"expiresAt": "Laeuft ab am",
"neverExpires": "Laeuft nie ab",
"linkUrl": "Link-URL"
},
"mail": {
"title": "E-Mail",
"folders": "Ordner",
"compose": "Schreiben",
"reply": "Antworten",
"forward": "Weiterleiten",
"forwarding": "Weitergeleitete E-Mail",
"send": "Senden",
"sent": "E-Mail gesendet.",
"settings": "Einstellungen",
"from": "Von",
"to": "An",
"cc": "CC",
"bcc": "BCC",
"subject": "Betreff",
"subjectPlaceholder": "Betreff eingeben",
"body": "Text",
"date": "Datum",
"attachments": "Anhänge",
"download": "Herunterladen",
"unread": "Ungelesen",
"flagged": "Markiert",
"flag": "Markieren",
"unflag": "Markierung entfernen",
"toggleFlag": "Markierung umschalten",
"noSubject": "Kein Betreff",
"noMails": "Keine E-Mails",
"noMailsDesc": "In diesem Ordner sind keine E-Mails vorhanden.",
"noFolders": "Keine Ordner",
"noFoldersDesc": "Es sind keine Ordner vorhanden.",
"selectMail": "E-Mail auswählen",
"selectMailToRead": "E-Mail auswählen",
"selectMailToReadDesc": "Wählen Sie eine E-Mail aus der Liste, um sie zu lesen.",
"bold": "Fett",
"italic": "Kursiv",
"insertLink": "Link einfügen",
"linkUrl": "URL eingeben",
"insertTemplate": "Vorlage einfügen",
"template": "Vorlage",
"showCcBcc": "CC/BCC anzeigen",
"signature": "Signatur",
"noSignature": "Keine Signatur",
"signatures": "Signaturen",
"newSignature": "Neue Signatur",
"signatureName": "Signaturname",
"signatureBody": "Signaturtext",
"defaultSignature": "Standardsignatur",
"signatureCreated": "Signatur erstellt.",
"signatureUpdated": "Signatur aktualisiert.",
"signatureDeleted": "Signatur gelöscht.",
"deleteSignature": "Signatur löschen",
"confirmDeleteSignature": "Möchten Sie diese Signatur wirklich löschen?",
"noSignatures": "Keine Signaturen",
"noSignaturesDesc": "Erstellen Sie eine Signatur für Ihre E-Mails.",
"selectTemplate": "Vorlage auswählen",
"noTemplates": "Keine Vorlagen",
"noTemplatesDesc": "Es sind keine Vorlagen vorhanden.",
"rules": "Regeln",
"newRule": "Neue Regel",
"ruleName": "Regelname",
"rulePriority": "Priorität",
"ruleConditions": "Bedingungen",
"ruleActions": "Aktionen",
"addCondition": "Bedingung hinzufügen",
"addAction": "Aktion hinzufügen",
"ruleCondFromContains": "Absender enthält",
"ruleCondToContains": "Empfänger enthält",
"ruleCondSubjectContains": "Betreff enthält",
"ruleCondBodyContains": "Text enthält",
"ruleCondHasAttachment": "Hat Anhang",
"ruleCondValue": "Wert",
"ruleActionMoveToFolder": "In Ordner verschieben",
"ruleActionMarkAsRead": "Als gelesen markieren",
"ruleActionMarkAsFlagged": "Als markiert markieren",
"ruleActionForwardTo": "Weiterleiten an",
"ruleActionDelete": "Löschen",
"ruleActionValue": "Wert",
"ruleCreated": "Regel erstellt.",
"ruleDeleted": "Regel gelöscht.",
"deleteRule": "Regel löschen",
"confirmDeleteRule": "Möchten Sie diese Regel wirklich löschen?",
"noRules": "Keine Regeln",
"noRulesDesc": "Erstellen Sie Regeln für automatische E-Mail-Verarbeitung.",
"labels": "Labels",
"newLabel": "Neues Label",
"labelName": "Labelname",
"labelColor": "Farbe",
"labelCreated": "Label erstellt.",
"labelDeleted": "Label gelöscht.",
"deleteLabel": "Label löschen",
"confirmDeleteLabel": "Möchten Sie dieses Label wirklich löschen?",
"noLabels": "Keine Labels",
"noLabelsDesc": "Erstellen Sie Labels zur Organisation.",
"vacationResponder": "Abwesenheitsnotiz",
"enableVacation": "Abwesenheitsnotiz aktivieren",
"vacationStart": "Startdatum",
"vacationEnd": "Enddatum",
"vacationSubject": "Betreff",
"vacationSubjectPlaceholder": "Ich bin abwesend",
"vacationBody": "Text",
"vacationBodyPlaceholder": "Ich bin bis ... nicht erreichbar.",
"vacationSaved": "Abwesenheitsnotiz gespeichert.",
"pgpImportKey": "PGP-Schlüssel importieren",
"privateKey": "Privater Schlüssel",
"passphrase": "Passphrase",
"importKey": "Importieren",
"pgpKeyImported": "PGP-Schlüssel importiert.",
"pgpKeys": "PGP-Schlüssel",
"noPgpKeys": "Keine PGP-Schlüssel",
"noPgpKeysDesc": "Importieren Sie Ihren privaten PGP-Schlüssel.",
"privateKeyLabel": "Privat",
"publicKey": "Öffentlicher Schlüssel",
"contactPgpKeys": "Kontakt-PGP-Schlüssel",
"contactId": "Kontakt-ID",
"contactPgpStored": "Kontakt-PGP-Schlüssel gespeichert.",
"storeContactKey": "Schlüssel speichern",
"noContactKeys": "Keine Kontakt-Schlüssel",
"noContactKeysDesc": "Speichern Sie öffentliche Schlüssel für Kontakte.",
"createEvent": "Termin erstellen",
"eventCreated": "Termin aus E-Mail erstellt.",
"selectAccount": "Konto auswählen",
"shared": "Geteilt",
"personal": "Persönlich",
"searchPlaceholder": "E-Mails durchsuchen",
"noAccounts": "Keine E-Mail-Konten",
"noAccountsDesc": "Konfigurieren Sie ein E-Mail-Konto in den Einstellungen.",
"configureAccount": "Konto konfigurieren",
"htmlUnsafe": "HTML-Inhalt wurde als unsicher eingestuft. Textans wird angezeigt.",
"tabAccounts": "Konten",
"tabSignatures": "Signaturen",
"tabRules": "Regeln",
"tabLabels": "Labels",
"tabVacation": "Abwesenheit",
"tabPgp": "PGP",
"accounts": "E-Mail-Konten",
"addAccount": "Konto hinzufügen",
"email": "E-Mail-Adresse",
"displayName": "Anzeigename",
"imapHost": "IMAP-Host",
"imapPort": "IMAP-Port",
"smtpHost": "SMTP-Host",
"smtpPort": "SMTP-Port",
"password": "Passwort",
"accountCreated": "Konto erstellt.",
"connectionSuccess": "Verbindung erfolgreich.",
"syncNow": "Jetzt synchronisieren",
"syncSuccess": "{{count}} E-Mails synchronisiert.",
"testConnection": "Verbindung testen",
"selectAccountFirst": "Bitte zuerst ein Konto auswählen.",
"noEmail": "Keine E-Mail-Adresse"
}
}