Files
nexarch/mail/docs/SRC-06-PRUEFPROTOKOLL.md
sysopsandClaude Sonnet 5 acc2b0c5dd 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
2026-08-31 23:18:08 +02:00

3.6 KiB
Raw Permalink Blame History

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).