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:
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -211,7 +211,10 @@
|
||||
"resultsFor": "Results for \"{{query}}\"",
|
||||
"dateFrom": "Date From",
|
||||
"dateTo": "Date To",
|
||||
"enterQuery": "Enter a search term."
|
||||
"enterQuery": "Enter a search term.",
|
||||
"mails": "Emails",
|
||||
"files": "Files",
|
||||
"events": "Events"
|
||||
},
|
||||
"topbar": {
|
||||
"tenant": "Tenant",
|
||||
@@ -532,5 +535,156 @@
|
||||
"expiresAt": "Expires at",
|
||||
"neverExpires": "Never expires",
|
||||
"linkUrl": "Link URL"
|
||||
},
|
||||
"mail": {
|
||||
"title": "Email",
|
||||
"folders": "Folders",
|
||||
"compose": "Compose",
|
||||
"reply": "Reply",
|
||||
"forward": "Forward",
|
||||
"forwarding": "Forwarded email",
|
||||
"send": "Send",
|
||||
"sent": "Email sent.",
|
||||
"settings": "Settings",
|
||||
"from": "From",
|
||||
"to": "To",
|
||||
"cc": "CC",
|
||||
"bcc": "BCC",
|
||||
"subject": "Subject",
|
||||
"subjectPlaceholder": "Enter subject",
|
||||
"body": "Body",
|
||||
"date": "Date",
|
||||
"attachments": "Attachments",
|
||||
"download": "Download",
|
||||
"unread": "Unread",
|
||||
"flagged": "Flagged",
|
||||
"flag": "Flag",
|
||||
"unflag": "Unflag",
|
||||
"toggleFlag": "Toggle flag",
|
||||
"noSubject": "No subject",
|
||||
"noMails": "No emails",
|
||||
"noMailsDesc": "There are no emails in this folder.",
|
||||
"noFolders": "No folders",
|
||||
"noFoldersDesc": "No folders available.",
|
||||
"selectMail": "Select email",
|
||||
"selectMailToRead": "Select an email",
|
||||
"selectMailToReadDesc": "Select an email from the list to read it.",
|
||||
"bold": "Bold",
|
||||
"italic": "Italic",
|
||||
"insertLink": "Insert link",
|
||||
"linkUrl": "Enter URL",
|
||||
"insertTemplate": "Insert template",
|
||||
"template": "Template",
|
||||
"showCcBcc": "Show CC/BCC",
|
||||
"signature": "Signature",
|
||||
"noSignature": "No signature",
|
||||
"signatures": "Signatures",
|
||||
"newSignature": "New signature",
|
||||
"signatureName": "Signature name",
|
||||
"signatureBody": "Signature body",
|
||||
"defaultSignature": "Default signature",
|
||||
"signatureCreated": "Signature created.",
|
||||
"signatureUpdated": "Signature updated.",
|
||||
"signatureDeleted": "Signature deleted.",
|
||||
"deleteSignature": "Delete signature",
|
||||
"confirmDeleteSignature": "Are you sure you want to delete this signature?",
|
||||
"noSignatures": "No signatures",
|
||||
"noSignaturesDesc": "Create a signature for your emails.",
|
||||
"selectTemplate": "Select template",
|
||||
"noTemplates": "No templates",
|
||||
"noTemplatesDesc": "No templates available.",
|
||||
"rules": "Rules",
|
||||
"newRule": "New rule",
|
||||
"ruleName": "Rule name",
|
||||
"rulePriority": "Priority",
|
||||
"ruleConditions": "Conditions",
|
||||
"ruleActions": "Actions",
|
||||
"addCondition": "Add condition",
|
||||
"addAction": "Add action",
|
||||
"ruleCondFromContains": "From contains",
|
||||
"ruleCondToContains": "To contains",
|
||||
"ruleCondSubjectContains": "Subject contains",
|
||||
"ruleCondBodyContains": "Body contains",
|
||||
"ruleCondHasAttachment": "Has attachment",
|
||||
"ruleCondValue": "Value",
|
||||
"ruleActionMoveToFolder": "Move to folder",
|
||||
"ruleActionMarkAsRead": "Mark as read",
|
||||
"ruleActionMarkAsFlagged": "Mark as flagged",
|
||||
"ruleActionForwardTo": "Forward to",
|
||||
"ruleActionDelete": "Delete",
|
||||
"ruleActionValue": "Value",
|
||||
"ruleCreated": "Rule created.",
|
||||
"ruleDeleted": "Rule deleted.",
|
||||
"deleteRule": "Delete rule",
|
||||
"confirmDeleteRule": "Are you sure you want to delete this rule?",
|
||||
"noRules": "No rules",
|
||||
"noRulesDesc": "Create rules for automatic email processing.",
|
||||
"labels": "Labels",
|
||||
"newLabel": "New label",
|
||||
"labelName": "Label name",
|
||||
"labelColor": "Color",
|
||||
"labelCreated": "Label created.",
|
||||
"labelDeleted": "Label deleted.",
|
||||
"deleteLabel": "Delete label",
|
||||
"confirmDeleteLabel": "Are you sure you want to delete this label?",
|
||||
"noLabels": "No labels",
|
||||
"noLabelsDesc": "Create labels for organization.",
|
||||
"vacationResponder": "Vacation responder",
|
||||
"enableVacation": "Enable vacation responder",
|
||||
"vacationStart": "Start date",
|
||||
"vacationEnd": "End date",
|
||||
"vacationSubject": "Subject",
|
||||
"vacationSubjectPlaceholder": "I am out of office",
|
||||
"vacationBody": "Body",
|
||||
"vacationBodyPlaceholder": "I will be unavailable until ...",
|
||||
"vacationSaved": "Vacation responder saved.",
|
||||
"pgpImportKey": "Import PGP key",
|
||||
"privateKey": "Private key",
|
||||
"passphrase": "Passphrase",
|
||||
"importKey": "Import",
|
||||
"pgpKeyImported": "PGP key imported.",
|
||||
"pgpKeys": "PGP keys",
|
||||
"noPgpKeys": "No PGP keys",
|
||||
"noPgpKeysDesc": "Import your private PGP key.",
|
||||
"privateKeyLabel": "Private",
|
||||
"publicKey": "Public key",
|
||||
"contactPgpKeys": "Contact PGP keys",
|
||||
"contactId": "Contact ID",
|
||||
"contactPgpStored": "Contact PGP key stored.",
|
||||
"storeContactKey": "Store key",
|
||||
"noContactKeys": "No contact keys",
|
||||
"noContactKeysDesc": "Store public keys for contacts.",
|
||||
"createEvent": "Create event",
|
||||
"eventCreated": "Event created from email.",
|
||||
"selectAccount": "Select account",
|
||||
"shared": "Shared",
|
||||
"personal": "Personal",
|
||||
"searchPlaceholder": "Search emails",
|
||||
"noAccounts": "No email accounts",
|
||||
"noAccountsDesc": "Configure an email account in settings.",
|
||||
"configureAccount": "Configure account",
|
||||
"htmlUnsafe": "HTML content flagged as unsafe. Showing text version.",
|
||||
"tabAccounts": "Accounts",
|
||||
"tabSignatures": "Signatures",
|
||||
"tabRules": "Rules",
|
||||
"tabLabels": "Labels",
|
||||
"tabVacation": "Vacation",
|
||||
"tabPgp": "PGP",
|
||||
"accounts": "Email accounts",
|
||||
"addAccount": "Add account",
|
||||
"email": "Email address",
|
||||
"displayName": "Display name",
|
||||
"imapHost": "IMAP host",
|
||||
"imapPort": "IMAP port",
|
||||
"smtpHost": "SMTP host",
|
||||
"smtpPort": "SMTP port",
|
||||
"password": "Password",
|
||||
"accountCreated": "Account created.",
|
||||
"connectionSuccess": "Connection successful.",
|
||||
"syncNow": "Sync now",
|
||||
"syncSuccess": "{{count}} emails synced.",
|
||||
"testConnection": "Test connection",
|
||||
"selectAccountFirst": "Please select an account first.",
|
||||
"noEmail": "No email address"
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user