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,17 @@
|
||||
// SRC-06: statische Facettendimensionen-Whitelist, gespiegelt aus
|
||||
// mail/internal/search/fields.go (FacetFields, SRC-05) — nur diese
|
||||
// Feldnamen sind als Filterdimension zulässig, kein beliebiger
|
||||
// Client-Feldname.
|
||||
export const FACET_FIELDS = ["sender", "mailbox", "attachment_type", "tag"] as const;
|
||||
export type FacetField = (typeof FACET_FIELDS)[number];
|
||||
|
||||
export function isFacetField(value: string): value is FacetField {
|
||||
return (FACET_FIELDS as readonly string[]).includes(value);
|
||||
}
|
||||
|
||||
export const FACET_FIELD_LABELS: Record<FacetField, string> = {
|
||||
sender: "Absender",
|
||||
mailbox: "Postfach",
|
||||
attachment_type: "Anhangstyp",
|
||||
tag: "Tag",
|
||||
};
|
||||
Reference in New Issue
Block a user