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": "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"
}
}