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
61 lines
3.6 KiB
Markdown
61 lines
3.6 KiB
Markdown
# 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).
|