CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (push) Canceled after 0s
CI / Web-Barrierefreiheitspruefung (axe, Tastatur, Reflow, Textabstaende) (pull_request) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (push) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (push) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (push) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (push) Canceled after 0s
CI / Web (dms-browser) (push) Canceled after 0s
CI / Web (pdf-viewer) (push) Canceled after 0s
CI / Web (shl) (push) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (push) Canceled after 0s
CI / Core-Modul (Build/Vet/Test) (pull_request) Canceled after 0s
CI / DMS Security-Test-Gate (AC5, Merge-Gate) (pull_request) Canceled after 0s
CI / Connect Security-Test-Gate (QA-01 AC4, Merge-Gate) (pull_request) Canceled after 0s
CI / DMS-Modul Supply-Chain-Scan (govulncheck) (pull_request) Canceled after 0s
CI / Web (dms-browser) (pull_request) Canceled after 0s
CI / Web (pdf-viewer) (pull_request) Canceled after 0s
CI / Web (shl) (pull_request) Canceled after 0s
Core-Schnittstellen-Vertragstests / contract-tests (pull_request) Canceled after 0s
Supply-Chain-Scan (Go) / govulncheck (pull_request) Canceled after 0s
Mail-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
Supply-Chain-Scan (npm) / npm-audit (pull_request) Canceled after 0s
Core-Pflichttest-Gate / pflichttest-gate (pull_request) Canceled after 0s
RBAC-Rollenhierarchie-Pflichtgate / rbac-policy-invariant (pull_request) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (push) Canceled after 0s
CI / DMS-Modul (Lint/Build/Test/Coverage/Artefakt) (pull_request) Canceled after 0s
Detailansicht fuer web/mail-postfach (UX-01-App erweitert, nicht neu gebaut): Header (Von/Betreff/Ordner/Datum/Nachricht-ID), Nachrichtentext, Anhangsliste mit Download (Dateiname nicht verfuegbar -- System persistiert keinen Originalnamen, daher Anhang N + aus dem Content-Type geratene Endung). Thread-Gruppierung ueber normalisierten Betreff (keine In-Reply-To/References-Header im System), Navigation zwischen Thread-Nachrichten als reiner Komponentenzustand derselben Seite (kein Routenwechsel -- Ordner-/Suchkontext bleibt dadurch strukturell erhalten, Akzeptanzkriterium 3). UX-03 (eigener offener Branch, eigenes Frontend web/mail-search) wird NICHT wiederverwendet -- getrennte Apps ohne Komponentenfreigabe, siehe UX-02-PRUEFPROTOKOLL.md fuer die Abgrenzung und die Begruendung der Backend-Erweiterung. Tests: lib/threading, lib/threadNavigation, lib/attachmentNaming, components/MessageDetail (Komponententest je Akzeptanzkriterium), __tests__/a11y (jest-axe, Pruefung 3), e2e/ux02 gegen die echte mailpostfach-fixture (Pruefungen 1+2, Mandantentrennung). Bestehender e2e/ux01-Satz bleibt unveraendert gruen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
18 lines
793 B
TypeScript
18 lines
793 B
TypeScript
import type { MessageListItemDTO } from "./api";
|
|
|
|
// Reine Funktionen, unabhängig vom DOM testbar -- Navigation bleibt im
|
|
// Komponentenzustand (kein Routenwechsel), damit Ordner-/Suchkontext
|
|
// beim Wechsel innerhalb eines Threads nicht verloren geht
|
|
// (Akzeptanzkriterium 3).
|
|
export function findNextInThread(thread: MessageListItemDTO[], currentId: string): string | null {
|
|
const index = thread.findIndex((m) => m.messageId === currentId);
|
|
if (index === -1 || index + 1 >= thread.length) return null;
|
|
return thread[index + 1].messageId;
|
|
}
|
|
|
|
export function findPreviousInThread(thread: MessageListItemDTO[], currentId: string): string | null {
|
|
const index = thread.findIndex((m) => m.messageId === currentId);
|
|
if (index <= 0) return null;
|
|
return thread[index - 1].messageId;
|
|
}
|