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 (