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
18 lines
656 B
TypeScript
18 lines
656 B
TypeScript
// 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",
|
|
};
|