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:
2026-05-16 14:46:44 +02:00
parent 185b38dc55
commit f6df97226d
4 changed files with 135 additions and 3 deletions
+27 -1
View File
@@ -1,5 +1,5 @@
import { useState, useEffect } from 'react';
import { Reply, Star, Paperclip, Link2, X, Download, ExternalLink, Trash2, Undo2, Save, FileDown } from 'lucide-react';
import { Reply, Forward, RotateCcw, Star, Paperclip, Link2, X, Download, ExternalLink, Trash2, Undo2, Save, FileDown } from 'lucide-react';
import DOMPurify from 'dompurify';
import { CachedEmail, cachedEmailApi } from '../../services/api';
import { useMutation, useQueryClient } from '@tanstack/react-query';
@@ -13,6 +13,8 @@ import SaveEmailAsPdfModal from './SaveEmailAsPdfModal';
interface EmailDetailProps {
email: CachedEmail;
onReply: () => void;
onForward?: () => void; // Weiterleiten (öffnet ComposeModal im Forward-Modus)
onResend?: () => void; // Erneut an Empfänger senden (One-Click-Resend)
onAssignContract: () => void;
onDeleted?: () => void; // Callback nach Löschen
isSentFolder?: boolean;
@@ -25,6 +27,8 @@ interface EmailDetailProps {
export default function EmailDetail({
email,
onReply,
onForward,
onResend,
onAssignContract,
onDeleted,
isSentFolder: _isSentFolder = false,
@@ -222,6 +226,28 @@ export default function EmailDetail({
<Reply className="w-4 h-4 mr-1" />
Antworten
</Button>
{onForward && (
<Button
variant="secondary"
size="sm"
onClick={onForward}
title="Diese E-Mail als neue Nachricht weiterleiten (Empfänger kann beliebig eingegeben werden, Inhalt + Header werden zitiert)"
>
<Forward className="w-4 h-4 mr-1" />
Weiterleiten
</Button>
)}
{onResend && (
<Button
variant="ghost"
size="sm"
onClick={onResend}
title="Erneut an die ursprüngliche Empfänger-Adresse senden. Nützlich wenn die Stressfrei-Weiterleitungsadresse umgezogen ist die Mail kommt dann an den aktuell hinterlegten Forward-Empfänger."
>
<RotateCcw className="w-4 h-4 mr-1" />
Erneut senden
</Button>
)}
{/* E-Mail als PDF speichern */}
<Button
variant="ghost"