feat(email): Suchleiste + erweiterte Filter im Email-Postfach
Variante B aus der Trade-off-Diskussion: Suchleiste über der Email-Liste
plus eine ausklappbare Box mit Detail-Filtern, alle AND-verknüpft.
Backend:
- EmailListOptions um search + 9 Detail-Filter erweitert (fromFilter,
toFilter, subjectFilter, bodyFilter, attachmentNameFilter,
hasAttachments, isRead, isStarred, receivedFrom, receivedTo)
- getCachedEmails baut die where-Klausel:
* `search` → OR über Subject/From-Address/From-Name/Body (Volltext-
Quicksearch)
* Feldspezifische Filter werden AND-verknüpft an die where gehängt;
From-/Body-Filter intern als kleine OR-Subqueries (Match in
Adresse ODER Name; Match in textBody ODER htmlBody)
- Controller-Parser akzeptiert die Filter als Query-Parameter
(parseBoolParam/parseDateParam tolerieren leere/invalide Werte)
Frontend:
- Suchleiste mit X-Button zum Leeren + Filter-Toggle mit Badge (zeigt
Anzahl aktiver Filter)
- Ausklappbare Filter-Box: Von, An, Betreff, Inhalt, Datum von/bis,
Anhang-Dateiname, Mit/Ohne Anhang, Gelesen-Status, Markiert-Status
- Filter-State fließt via useMemo + queryKey in den useQuery → React
Query macht automatisch ein Re-Fetch bei jeder Änderung
- "Alle zurücksetzen"-Button räumt komplett auf
- Nicht für TRASH-Folder eingeblendet (eigener Pfad ohne Filter-API)
Bewusst nicht gebaut: voller AND/OR-Builder mit Plus-Button und
Bool-Verschachtelung. Reale Such-Use-Cases im Email-Kontext sind
quasi immer AND-verknüpft; Bool-Builder bringt mehr Bedienprobleme
als Mehrwert.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -97,6 +97,22 @@ isolierte Instanz (keine Multi-Tenancy im Code), Provisioning + Abrechnung
|
||||
|
||||
## ✅ Erledigt
|
||||
|
||||
- [x] **🔍 E-Mail-Postfach: Suche + erweiterte Filter (Variante B)**
|
||||
- Suchleiste über der Email-Liste – durchsucht parallel Subject,
|
||||
From-Address/Name und Body.
|
||||
- Filter-Button mit Badge (Anzahl aktiver Filter) klappt eine Box mit
|
||||
Detail-Filtern auf: Von, An, Betreff, Inhalt, Datum von/bis,
|
||||
Anhang-Dateiname, Mit/Ohne Anhang, Gelesen-Status, Markiert-Status.
|
||||
Alle Filter werden im Backend mit UND verknüpft.
|
||||
- „Alle zurücksetzen"-Button räumt komplett auf.
|
||||
- Backend: `GET /api/customers/:id/emails` nimmt die Filter als
|
||||
Query-Parameter entgegen, `getCachedEmails` übersetzt sie in eine
|
||||
Prisma `where`-Klausel.
|
||||
- **Bewusst nicht gebaut**: voller AND/OR-Builder mit Plus-Button und
|
||||
Bool-Verschachtelung – Trade-off-Diskussion mit User: reale
|
||||
Use-Cases sind quasi immer AND, UI-Komplexität verschachtelter
|
||||
Bool-Builder bringt mehr Bedienprobleme als Mehrwert.
|
||||
|
||||
- [x] **🔁 Stressfrei-Adressen: Weiterleitungen + Passwort manuell synchronisieren**
|
||||
- Refresh-Icon-Button in der Action-Reihe jeder Stressfrei-Adresse
|
||||
(Tooltip erklärt: „ersetzt die Forwards am Provider durch
|
||||
|
||||
Reference in New Issue
Block a user