SRC-06: facetten-ui-filter-chips

Facetten-Oberfläche mit Filter-Chips: aktive Filter sichtbar, einzeln
entfernbar, Trefferzahl je Facettenwert live angezeigt.

- app/api/facets/route.ts: neue Backend-for-Frontend-Route, spiegelt
  mail/internal/search/facets.go minimal (nur Trefferzahl je
  Facettenwert).
- lib/manticoreQuery.ts: gemeinsamer statischer bool.must-Aufbau für
  Such- und Facetten-Route, kein Sprintf/Join-artiger Klauselbau.
- app/api/search/route.ts (SRC-04): akzeptiert jetzt wiederholbare
  ?filter=feld:wert-Parameter.
- app/FacetPanel.tsx: ActiveFilterChips (echte <button>-Elemente, nativ
  tastaturbedienbar) + FacetPanel (Klick fügt Filter hinzu) + "Alle
  Filter zurücksetzen".
- lib/filterState.ts: reine Filterzustandsfunktionen, ohne React.

Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-06-PRUEFPROTOKOLL.md):
1. Manueller Test gegen echten next start + live Manticore auf
   192.168.1.131: Filterkombination reduziert Treffer UND
   Facettenzählungen real konsistent von 2 auf 1.
2. @testing-library/user-event: echte Tastatursimulation (Enter) löst
   Chip-Entfernung real aus.
3. 20 gleichzeitig aktive Filter erzeugen real 20 einzelne, nicht
   zusammengefasste Chips, kein Absturz.

Kein Umbau: mail/internal/*, web/shl, web/retention-admin unverändert,
bestehendes SRC-04-Verhalten unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
This commit is contained in:
sysops
2026-08-31 23:18:08 +02:00
co-authored by Claude Sonnet 5
parent 0065b959b3
commit acc2b0c5dd
12 changed files with 563 additions and 30 deletions
+60
View File
@@ -0,0 +1,60 @@
# SRC-06 Prüfprotokoll: Facetten-UI & Filter-Chips
Voraussetzung SRC-05 (Fertig), SHL-01 (Core-Board, Fertig).
## Umsetzung
- `web/mail-search/app/api/facets/route.ts`: neue Backend-for-Frontend-
Route, spiegelt `mail/internal/search/facets.go` (`Client.Facets`)
minimal — nur Trefferzahl je Facettenwert (Akzeptanzkriterium 2), keine
Zeitraum-Buckets (nicht Bestandteil dieser Kachel).
- `web/mail-search/lib/manticoreQuery.ts`: gemeinsamer, statischer
`bool.must`-Aufbau für Such- und Facetten-Route (`buildMust`,
`parseFilterParams`) — dieselbe Konvention wie
`mail/internal/search/facets.go` `buildFilteredMust`, kein
Sprintf/Join-artiger Klauselbau.
- `app/api/search/route.ts` (SRC-04) minimal erweitert: akzeptiert jetzt
wiederholbare `?filter=feld:wert`-Parameter, damit Trefferliste und
Facettenzählungen bei aktiven Filtern konsistent bleiben.
- `app/FacetPanel.tsx`: `ActiveFilterChips` (Akzeptanzkriterium 1: aktive
Filter als entfernbare Chips, echte `<button>`-Elemente — nativ per
Tastatur fokussier-/auslösbar, keine zusätzliche Tastaturbehandlung
nötig) + `FacetPanel` (Facettenwerte mit Live-Zählung, Klick fügt
Filter hinzu) + „Alle Filter zurücksetzen"-Button (Akzeptanzkriterium
3).
- `app/page.tsx`: Filterzustand ausgelagert nach `lib/filterState.ts`
(reine Funktionen, ohne React), jede Filteränderung löst Such- UND
Facettenabfrage parallel neu aus (Akzeptanzkriterium 2: live).
- Kein Umbau: `mail/internal/*`, `web/shl`, `web/retention-admin`
unverändert; bestehendes SRC-04-Verhalten (Hervorhebung, leere
Ergebnisse, Fundstellen-Link) unverändert, nur um Filter-Parameter
erweitert.
## Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Manueller Test: Filterkombination und Einzelentfernung funktionieren wie erwartet | **bestanden** echter `next build` + `next start` auf 192.168.1.131 gegen die live laufende Manticore-Instanz: `GET /api/search` + `/api/facets` ohne Filter liefern real 2 Treffer mit Facettenzählungen (`alice`→1, `bob`→1, `inbox`→2 usw.), mit `filter=sender:alice@example.com` liefern beide Routen real konsistent genau 1 Treffer und auf 1 reduzierte Facettenzählungen |
| 2 | Tastaturbedienbarkeit der Filter-Chips geprüft | **bestanden** automatisiert mit `@testing-library/user-event` (echte Tastatursimulation, kein bloßer Klick): Chip fokussieren (`Tab`-Ziel), `{Enter}` löst real dieselbe Entfernung wie ein Klick aus |
| 3 | Test mit vielen aktiven Filtern bleibt die Ansicht übersichtlich | **bestanden** 20 gleichzeitig aktivierte Filter real erzeugen real 20 einzeln erkennbare, nicht zusammengefasste Chips im DOM, kein Absturz, `flexWrap` verhindert horizontales Überlaufen |
## Build/Test-Ergebnis (192.168.1.131)
```
npx tsc --noEmit -> clean
npx next build -> Compiled successfully (5 Routen)
npx vitest run -> 4 Testdateien, 19/19 bestanden (8 in app/page.test.tsx,
davon 4 neu für SRC-06)
next start (real) + curl gegen Manticore live -> Filterkombination, Facettenzählungen, Einschränkung
auf 1 Treffer alle real bestätigt
```
Testprozess (`next start -p 4712`) und Testdokumente
(`mail_documents`-IDs 993001/993002) nach Prüfung entfernt.
## Gesamtergebnis
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
real erfüllt. Entsperrt (gemeinsam mit den übrigen QA-09-Abhängigkeiten)
einen Teil des Wegs zu QA-09 — QA-09 bleibt weiterhin blockiert (QA-02,
QA-04..QA-08 noch offen).