/* ========================================================================== SUCHE: eine Ergebnisseite über Wissensbasis, Forum und Kommentare. Jeder Treffer zeigt die Stelle, an der das Wort steht. ========================================================================== */ /** Die Fundstelle kommt fertig maskiert vom Server, nur die Marke ist HTML. */ function Snippet({ html }) { return

; } function HitRow({ post }) { return (

{post.author && {post.author.displayName}}

{post.title}

{(post.snippets || []).map((s, i) => )} ); } function CommentHit({ hit }) { return (
{BB.t("Kommentar")} {BB.t("Im Kommentar von")} {hit.author.displayName} {BB.when(hit.createdAt)}

{hit.postTitle}

{(hit.snippets || []).map((s, i) => )} ); } function HitGroup({ title, count, children }) { if (!count) return null; return (

{title}

{BB.num(count)} {BB.t("Treffer")}
{children}
); } function SearchPage({ params }) { const { go } = useRouter(); const q = params.get("q") || ""; const [draft, setDraft] = useState(q); const [data, setData] = useState(null); const [loading, setLoading] = useState(!!q); useEffect(() => { setDraft(q); }, [q]); useEffect(() => { if (!q.trim()) { setData(null); setLoading(false); return; } let alive = true; setLoading(true); BB.get("/search" + BB.qs({ q: q.trim(), limit: 25 })) .then((d) => { if (alive) { setData(d); setLoading(false); } }) .catch(() => { if (alive) { setData(null); setLoading(false); } }); return () => { alive = false; }; }, [q]); const total = data ? data.wiki.total + data.forum.total + data.comments.total : 0; return (
{BB.t("Suchergebnisse")}

{q ? BB.t("Treffer für") + " „" + q + "“" : BB.t("Website durchsuchen")}

{BB.t("Titel, Aliase, Kurzbeschreibung und Fließtext werden durchsucht, Treffer im Titel stehen oben.")}

{ e.preventDefault(); if (draft.trim()) go("/suche?q=" + encodeURIComponent(draft.trim())); }} > setDraft(e.target.value)} placeholder={BB.t("Suchen …")} aria-label={BB.t("Website durchsuchen")} />
{!q.trim() ? ( ) : loading ? ( ) : total === 0 ? ( {BB.t("Nichts passt zu diesem Wort.")} ) : ( <> {data.wiki.items.map((p) => )} {data.forum.items.map((p) => )} {data.comments.items.map((c) => )} )}
); } Object.assign(window, { SearchPage });