diff --git a/web/app/(app)/layout.tsx b/web/app/(app)/layout.tsx index 439793e..520c8c7 100644 --- a/web/app/(app)/layout.tsx +++ b/web/app/(app)/layout.tsx @@ -3,6 +3,7 @@ import { signOut } from '@/auth' import { requireUser } from '@/lib/auth/current' import { de } from '@/lib/i18n/de' import { PaletteTrigger } from '@/components/palette/PaletteTrigger' +import { NavLinks } from '@/components/NavLinks' import { ProfileMenu } from '@/components/ProfileMenu' import { Avatar } from '@/components/Avatar' import { SearchBar } from '@/components/SearchBar' @@ -40,15 +41,19 @@ export default async function AppLayout({ children }: { children: React.ReactNod {de.app.shortName} - +
diff --git a/web/app/(app)/suche/page.tsx b/web/app/(app)/suche/page.tsx index 34899e2..33f1da8 100644 --- a/web/app/(app)/suche/page.tsx +++ b/web/app/(app)/suche/page.tsx @@ -2,8 +2,14 @@ import type { Metadata } from 'next' import Link from 'next/link' import { db } from '@/lib/db' import { requireUser } from '@/lib/auth/current' -import { parseFilters, toSearchParams, SEARCH_KINDS } from '@/lib/search/query' import { + parseFilters, + toSearchParams, + SEARCH_KINDS, + SEARCH_SCOPES, +} from '@/lib/search/query' +import { + PREVIEW_SIZE, searchCases, searchCounts, searchDocuments, @@ -49,34 +55,50 @@ export default async function SearchPage({ ]) const levelName = new Map(levels.map((l) => [l.level, l.name])) - const [ergebnis, zahlen] = await Promise.all([ - filters.kind === 'document' - ? searchDocuments(user.permissions, filters) - : filters.kind === 'personnel' - ? searchPersonnel(user.permissions, filters) - : searchCases(user.permissions, filters), - // Die Zahlen der anderen Arten. Ohne sie sucht man nach einem Namen, landet - // auf den Fallakten und erfährt nie, dass es dazu auch eine Personalakte - // gibt — der Reiter sieht leer aus wie jeder andere. + const alle = filters.kind === 'all' + + // In der gemeinsamen Ansicht je Art nur eine Handvoll: dort geht es darum, + // **wo** etwas liegt. Der Weg in die volle Liste steht daneben. + const stueck = alle ? { take: PREVIEW_SIZE } : {} + + const [faelle, dokumente, personen, zahlen] = await Promise.all([ + alle || filters.kind === 'case' ? searchCases(user.permissions, filters, stueck) : null, + alle || filters.kind === 'document' + ? searchDocuments(user.permissions, filters, stueck) + : null, + alle || filters.kind === 'personnel' + ? searchPersonnel(user.permissions, filters, stueck) + : null, + // Die Zahlen aller Arten. Ohne sie sucht man nach einem Namen, landet auf + // den Fallakten und erfährt nie, dass es dazu auch eine Personalakte gibt. searchCounts(user.permissions, filters), ]) - const statusTags = filters.kind === 'personnel' ? await listStatusTags() : [] + // Bei einer einzelnen Art hängt alles Weitere an ihr: Facetten, Blättern, + // die Trefferzahl in der Kopfzeile. Bei „Alle" gibt es das nicht — dort ist + // jede Art ein eigener Block mit eigenem Weg in die Vollansicht. + const ergebnis = alle ? null : (faelle ?? dokumente ?? personen)! + const gesamt = alle + ? zahlen.case + zahlen.document + (zahlen.personnel ?? 0) + : (ergebnis?.total ?? 0) + + const statusTags = + alle || filters.kind === 'personnel' ? await listStatusTags() : [] return (

{de.search.heading}

- {de.search.countLabel(ergebnis.total)} + {de.search.countLabel(gesamt)}