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
3.6 KiB
3.6 KiB
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, spiegeltmail/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, statischerbool.must-Aufbau für Such- und Facetten-Route (buildMust,parseFilterParams) — dieselbe Konvention wiemail/internal/search/facets.gobuildFilteredMust, 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 nachlib/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-adminunverä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).