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:
co-authored by
Claude Sonnet 5
parent
0065b959b3
commit
acc2b0c5dd
@@ -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).
|
||||
Reference in New Issue
Block a user