feat(email): Weiterleiten + Erneut senden im Detail-Pane
Zwei Aktionen, die der existierende Reply-Pfad bisher nicht abdeckte:
1. Weiterleiten (Compose-Modal-Forward-Modus):
- Neuer Button im EmailDetail, neben "Antworten"
- ComposeEmailModal akzeptiert jetzt einen `forwardOf` prop und
füllt das Formular im Forward-Stil vor:
* To leer (User trägt selbst ein)
* Subject mit "Fwd:"-Prefix
* Body mit zitierten Headern (Von, An, Datum, Betreff) +
Original-Text
- Titel des Modals reagiert ("Antworten" / "Weiterleiten" /
"Neue E-Mail")
2. Erneut senden (One-Click-Resend):
- Neuer Button im EmailDetail; schickt die Mail nochmal an die
ursprüngliche toAddresses (= die Stressfrei-Adresse selbst).
Plesk routet dann gemäß der HEUTE hinterlegten Forwards –
Use-Case: die Stressfrei-Forward-Adresse wurde nach Empfang
umgestellt, der Empfang soll beim neuen Forward-Empfänger
landen.
- Confirm-Dialog erklärt den Vorgang und warnt explizit, dass
Anhänge nicht erneut mit gesendet werden (Anhänge wären
IMAP-Refetch, dafür "Weiterleiten" nutzen).
- Toast-Feedback für Erfolg/Fehler.
- Im TRASH-Folder wird der Resend-Button bewusst nicht
eingeblendet (kein sinnvoller Use-Case dort).
Backend braucht keine neuen Endpoints – beide Aktionen nutzen die
bestehenden `stressfreiEmailApi.sendEmail` + `cachedEmailApi.getById`
(letztere für den Body, der ohnehin schon im Detail-View geladen ist).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ interface ComposeEmailModalProps {
|
||||
onClose: () => void;
|
||||
account: MailboxAccount;
|
||||
replyTo?: CachedEmail;
|
||||
forwardOf?: CachedEmail; // Weiterleiten: Body vorausgefüllt, To leer
|
||||
onSuccess?: () => void;
|
||||
contractId?: number; // Optional: Vertrag dem die gesendete E-Mail zugeordnet wird
|
||||
}
|
||||
@@ -20,6 +21,7 @@ export default function ComposeEmailModal({
|
||||
onClose,
|
||||
account,
|
||||
replyTo,
|
||||
forwardOf,
|
||||
onSuccess,
|
||||
contractId,
|
||||
}: ComposeEmailModalProps) {
|
||||
@@ -47,6 +49,30 @@ export default function ComposeEmailModal({
|
||||
? `\n\n--- Ursprüngliche Nachricht ---\nVon: ${replyTo.fromName || replyTo.fromAddress}\nAm: ${originalDate}\n\n${replyTo.textBody}`
|
||||
: '';
|
||||
setBody(quotedText);
|
||||
} else if (forwardOf) {
|
||||
// Weiterleiten: To leer (User trägt selbst ein), Betreff mit „Fwd:"
|
||||
setTo('');
|
||||
const existingSubject = forwardOf.subject || '';
|
||||
const hasFwdPrefix = /^(Fwd|Wg):\s*/i.test(existingSubject);
|
||||
setSubject(hasFwdPrefix ? existingSubject : `Fwd: ${existingSubject}`);
|
||||
// Original-Header + Body zitieren (mehr Felder als bei Reply, damit
|
||||
// der weitergeleitete Kontext erhalten bleibt)
|
||||
const originalDate = new Date(forwardOf.receivedAt).toLocaleString('de-DE');
|
||||
let toLine = '';
|
||||
try {
|
||||
const parsed = JSON.parse(forwardOf.toAddresses || '[]');
|
||||
if (Array.isArray(parsed) && parsed.length > 0) {
|
||||
toLine = `\nAn: ${parsed.join(', ')}`;
|
||||
}
|
||||
} catch {
|
||||
// toAddresses war kein JSON – ignorieren
|
||||
}
|
||||
const quotedText = forwardOf.textBody
|
||||
? `\n\n--- Weitergeleitete Nachricht ---\nVon: ${
|
||||
forwardOf.fromName || forwardOf.fromAddress
|
||||
}${toLine}\nDatum: ${originalDate}\nBetreff: ${existingSubject}\n\n${forwardOf.textBody}`
|
||||
: '';
|
||||
setBody(quotedText);
|
||||
} else {
|
||||
// Neue E-Mail: Felder leer
|
||||
setTo('');
|
||||
@@ -57,7 +83,7 @@ export default function ComposeEmailModal({
|
||||
setAttachments([]);
|
||||
setError(null);
|
||||
}
|
||||
}, [isOpen, replyTo]);
|
||||
}, [isOpen, replyTo, forwardOf]);
|
||||
|
||||
// Maximale Dateigröße: 10 MB
|
||||
const MAX_FILE_SIZE = 10 * 1024 * 1024;
|
||||
@@ -194,7 +220,7 @@ export default function ComposeEmailModal({
|
||||
<Modal
|
||||
isOpen={isOpen}
|
||||
onClose={handleClose}
|
||||
title={replyTo ? 'Antworten' : 'Neue E-Mail'}
|
||||
title={replyTo ? 'Antworten' : forwardOf ? 'Weiterleiten' : 'Neue E-Mail'}
|
||||
size="lg"
|
||||
>
|
||||
<div className="space-y-4">
|
||||
|
||||
Reference in New Issue
Block a user