Files
nexarch/mail/docs/SRC-04-PRUEFPROTOKOLL.md
T
sysopsandClaude Sonnet 5 d23438d3d0 SRC-04: such-oberflaeche-mit-hervorhebung
Such-Oberfläche (Next.js/React/TS) mit Live-Trefferliste und Hervorhebung
der Suchbegriffe im Kontext (Snippet), auf web/shl (SHL-01) aufbauend.

- app/api/search/route.ts: schlanke Backend-for-Frontend-Route gegen
  dieselbe Manticore-Instanz wie mail/internal/search (SRC-01/SRC-03),
  fordert Highlights mit eigenen Markern statt HTML an.
- lib/highlight.ts: zerlegt markierten Snippet-Text in reine
  Textsegmente, kein dangerouslySetInnerHTML — Mailinhalte werden nie
  als HTML interpretiert.
- app/page.tsx: Sucheingabe, Trefferliste mit <mark>-Hervorhebung,
  verständlicher Hinweis bei leerem Ergebnis.
- app/mail/[messageId]/page.tsx: öffnet mit Anker #fundstelle und
  hervorgehobenem Snippet (voller Mail-Inhaltsabruf folgt mit INT-01).
- lib/contrast.ts: reale WCAG-2.1-Kontrastberechnung.

Prüfungen (alle real durchgeführt, siehe mail/docs/SRC-04-PRUEFPROTOKOLL.md):
1. Manueller Test gegen echten next start + live Manticore auf
   192.168.1.131: Hervorhebung real bestätigt.
2. lib/highlightColors.test.ts: echte WCAG-Berechnung, Hell 14,29:1,
   Dunkel 6,43:1 (>= 4.5:1 AA).
3. Sonderzeichen-Anfrage real gegen laufenden Server: 200 OK, kein
   Absturz; zusätzlich automatisiert gegen Skript-Tags/Unicode.

Kein Umbau: mail/internal/*, web/shl, web/retention-admin unverändert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhgFcLS8tYMhDJpP74C6AQ
2026-08-31 10:26:02 +02:00

70 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SRC-04 Prüfprotokoll: Such-Oberfläche mit Hervorhebung
Voraussetzung SRC-03 (Fertig), SHL-01 (Core-Board, Fertig).
## Umsetzung
- `web/mail-search`: eigenständige Next.js/React/TypeScript-App (kein
Backend-Annex), auf `web/shl` (SHL-01) aufbauend — gleiche Konvention
wie `web/retention-admin` (RET-06).
- `app/api/search/route.ts`: Backend-for-Frontend-Route, spricht direkt
mit derselben Manticore-Instanz wie `mail/internal/search` (SRC-01/
SRC-03). Bewusst KEINE Kopie der vollständigen Go-Suchlogik — nur der
für Trefferliste + Snippet-Hervorhebung nötige minimale Ausschnitt
("Bereite höchstens die Schnittstelle dafür vor"; die allgemeine
REST-API v1 für Mail-Zugriff ist INT-01, nicht Bestandteil dieser
Kachel). Statische Feld-/Indexnamen, kein Sprintf/Join-Klauselbau
(gleiche Konvention wie `fields.go`). Fordert Manticore-Highlights mit
eigenen Markern (`⦃⦃`/`⦄⦄`) statt HTML an.
- `lib/highlight.ts`: `splitHighlighted` zerlegt den markierten Snippet-
Text in reine Textsegmente — die Komponente rendert sie als Textknoten,
**kein** `dangerouslySetInnerHTML`, damit Mailinhalte (nicht
vertrauenswürdig) niemals als HTML interpretiert werden können.
- `app/page.tsx`: Sucheingabe (`@nexarch/shl` `TextField`), Live-
Trefferliste mit `<mark>`-Hervorhebung, verständlicher Hinweis bei
leerem Ergebnis, Link je Treffer zur Mail-Detailseite.
- `app/mail/[messageId]/page.tsx`: öffnet mit Anker `#fundstelle` und
hervorgehobenem Snippet aus den Suchtreffer-Daten. Vollständiger
Mail-Inhaltsabruf per messageId existiert noch nicht (keine HTTP-API
dafür, folgt mit INT-01) — bis dahin trägt der Link Betreff-/Text-
Snippet als Kontext mit, damit die Fundstelle bereits jetzt real
anspring- und hervorhebbar ist.
- `lib/contrast.ts`/`lib/highlightColors.ts`: reale WCAG-2.1-
Kontrastberechnung statt behaupteter Werte.
- Kein Umbau: `mail/internal/*`, `web/shl`, `web/retention-admin`
unverändert.
## Prüfungen
| # | Prüfung | Ergebnis |
|---|---|---|
| 1 | Manueller Test mit typischen Suchanfragen bestätigt korrekte Hervorhebung | **bestanden** echter `next build` + `next start` auf 192.168.1.131 gegen die live laufende Manticore-Instanz: `GET /api/search?tenant=src04-manual&q=Umsatz` liefert real `"subjectSnippet":"Quartalsbericht ⦃⦃Umsatz⦄⦄"` — Marker um exakt den Suchbegriff. Zusätzlich automatisiert in `app/page.test.tsx` (Marker im DOM nach Suche) |
| 2 | Barrierefreiheits-Kontrastprüfung der Hervorhebung | **bestanden** `lib/highlightColors.test.ts`: echte WCAG-2.1-Berechnung, Hell-Modus 14,29:1, Dunkel-Modus 6,43:1 (beide ≥ 4.5:1 AA-Grenzwert für Fließtext) |
| 3 | Test mit Sonderzeichen in der Suchanfrage bricht die Anzeige nicht | **bestanden** real gegen den laufenden Server getestet: Anfrage mit `"dritten Quartal" -Verlust <script>` liefert `200 OK` mit `{"hits":[]}`, kein Absturz. Zusätzlich automatisiert `lib/highlight.test.ts` (Skript-Tags/Unicode/unvollständige Marker als reiner Text) und `app/page.test.tsx` (kein `<script>`-Element im DOM, da kein `dangerouslySetInnerHTML`) |
Zusätzlich (Akzeptanzkriterium 2/3, real geprüft): `GET /mail/m-manual-1?subject=...`
liefert `200 OK`; automatisiert `app/page.test.tsx` bestätigt Link-Struktur
(`/mail/<id>?...#fundstelle`) und den "Keine Treffer"-Hinweis bei leerem
Ergebnis.
## Build/Test-Ergebnis (192.168.1.131)
```
npx tsc --noEmit -> clean
npx next build -> Compiled successfully (4 Routen)
npx vitest run -> 3 Testdateien, 12/12 bestanden
next start (real) + curl gegen Manticore live -> Hervorhebung, leeres Ergebnis,
Sonderzeichen alle real bestätigt
```
Testprozess (`next start -p 4711`) und Testdokument (`mail_documents`-ID
992001) nach Prüfung entfernt.
## Gesamtergebnis
**Bestanden.** Alle drei Akzeptanzkriterien und alle drei Pflichtprüfungen
real erfüllt. SRC-04 ist der nächste Schritt in der Suche-Foundation-Kette
(Index → Befüllung → Such-API → nutzbare Oberfläche), nicht nur eine nette
Ergänzung — ohne ihn bliebe die Such-API ohne für Anwenderinnen und
Anwender erreichbaren Zugang. Entsperrt QA-03 (gemeinsam mit SRC-02).