"use client"; import { useRouter } from "next/navigation"; import { useMemo, useState } from "react"; export interface SuchEintrag { typ: "Host" | "Kunde" | "Rechnung"; titel: string; untertitel: string; href: string; /** Alle durchsuchbaren Werte in Kleinschreibung. */ begriffe: string[]; } const TYP_FARBE: Record = { Host: "pl-bg-info", Kunde: "pl-bg-primary", Rechnung: "pl-bg-neutral", }; /** * Globale Suche als Dialog, per Strg+K oder über die Kopfleiste. * Wird nur gerendert, solange er offen ist – dadurch startet er jedes Mal leer. */ export function SearchDialog({ eintraege, onSchliessen, }: { eintraege: SuchEintrag[]; onSchliessen: () => void; }) { const [begriff, setBegriff] = useState(""); const [markiert, setMarkiert] = useState(0); const router = useRouter(); const treffer = useMemo(() => { const q = begriff.trim().toLowerCase(); if (q.length < 2) return []; return eintraege.filter((e) => e.begriffe.some((b) => b.includes(q))).slice(0, 12); }, [begriff, eintraege]); function oeffnen(eintrag: SuchEintrag) { onSchliessen(); router.push(eintrag.href); } function tasten(event: React.KeyboardEvent) { if (event.key === "Escape") onSchliessen(); if (event.key === "ArrowDown") { event.preventDefault(); setMarkiert((i) => Math.min(i + 1, treffer.length - 1)); } if (event.key === "ArrowUp") { event.preventDefault(); setMarkiert((i) => Math.max(i - 1, 0)); } if (event.key === "Enter" && treffer[markiert]) { event.preventDefault(); oeffnen(treffer[markiert]); } } return ( <>