Postfach- und Ordneransicht fuer archivierte Mails (Next.js/React/TS, @nexarch/shl). Ordnerbaum (aus der flachen Postfachliste der Mail-API clientseitig aufgebaut), virtualisierte Nachrichtenliste mit Sortierung nach Datum/Absender/Betreff, Grundsuche. Aufbau nach etabliertem Muster (web/mail-search fuer die App-Struktur, web/dms-browser fuer Ordnerbaum/ virtualisierte Liste), bewusst schlicht gehalten (Mailpit/MailHog als Vorbild, nicht die Komplexitaet eines nativen Mailprogramms). Automatisierte Tests je Akzeptanzkriterium, inkl. eines echten Backend-Integrationstests (e2e/ux01.e2e.test.ts) gegen den echten mailapi.Server (mail/cmd/mailpostfach-fixture) mit zwei Mandanten und einem gleichnamigen Ordner — keine Mandanten-Isolationslogik wird gemockt. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
22 lines
972 B
TypeScript
22 lines
972 B
TypeScript
// Akzeptanzkriterium 2: Sortierung nach Datum/Absender/Betreff. Läuft
|
|
// clientseitig auf der bereits vom Backend mandantengebundenen Liste —
|
|
// die Mail-API liefert hier keinen sort-Parameter (siehe
|
|
// mail/internal/mailapi/openapi.yaml), daher keine zusätzliche
|
|
// Server-Rundreise je Spaltenklick.
|
|
import type { MessageListItemDTO } from "./api";
|
|
|
|
export type SortColumn = "sentAt" | "sender" | "subject";
|
|
export type SortOrder = "asc" | "desc";
|
|
|
|
const collator = new Intl.Collator("de", { sensitivity: "base" });
|
|
|
|
function compare(a: MessageListItemDTO, b: MessageListItemDTO, column: SortColumn): number {
|
|
if (column === "sentAt") return a.sentAt - b.sentAt;
|
|
return collator.compare(a[column], b[column]);
|
|
}
|
|
|
|
export function sortMessages(messages: MessageListItemDTO[], column: SortColumn, order: SortOrder): MessageListItemDTO[] {
|
|
const sorted = [...messages].sort((a, b) => compare(a, b, column));
|
|
return order === "asc" ? sorted : sorted.reverse();
|
|
}
|