From 1de10986c31477d5647fd07c75e6b9c4a741bf58 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 12 Jun 2026 09:27:20 +0200 Subject: [PATCH] feat(geschichten): integrate DocumentFilterChip into list page Add DocumentFilterChip to the filter bar, extract emptyMessage as $derived.by() with person-wins precedence, and add removeDocument navigation helper. Update tests: add document-filter chip and empty-state-precedence suites, fix person-chip click test to use native element.click() + vi.waitFor() for reliable Svelte 5 onclick triggering. Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/routes/geschichten/+page.svelte | 36 +++- .../routes/geschichten/page.svelte.spec.ts | 161 +++++++++++++++++- 2 files changed, 187 insertions(+), 10 deletions(-) diff --git a/frontend/src/routes/geschichten/+page.svelte b/frontend/src/routes/geschichten/+page.svelte index 3e4e681a..35d67301 100644 --- a/frontend/src/routes/geschichten/+page.svelte +++ b/frontend/src/routes/geschichten/+page.svelte @@ -3,6 +3,7 @@ import { goto } from '$app/navigation'; import { m } from '$lib/paraglide/messages.js'; import PersonTypeahead from '$lib/person/PersonTypeahead.svelte'; import GeschichteListRow from '$lib/geschichte/GeschichteListRow.svelte'; +import DocumentFilterChip from './DocumentFilterChip.svelte'; import type { PageData } from './$types'; let { data }: { data: PageData } = $props(); @@ -10,11 +11,24 @@ let { data }: { data: PageData } = $props(); let showPersonPicker = $state(false); const selectedPersonIds = $derived(data.personFilters.map((p) => p.id!)); -const hasFilters = $derived(data.personFilters.length > 0); +const hasFilters = $derived(data.personFilters.length > 0 || data.documentFilter !== null); + +const emptyMessage = $derived.by(() => { + if (data.personFilters.length > 0) { + return m.geschichten_empty_for_persons({ + names: data.personFilters.map((p) => p.displayName).join(' & ') + }); + } + if (data.documentFilter) { + return m.geschichten_empty_for_document(); + } + return m.geschichten_empty_no_filter(); +}); function rebuildUrl(personIds: string[]) { const url = new URL(window.location.href); url.searchParams.delete('personId'); + url.searchParams.delete('documentId'); for (const id of personIds) url.searchParams.append('personId', id); return url.pathname + url.search; } @@ -35,6 +49,10 @@ function addPerson(personId: string) { function removePerson(personId: string) { goto(rebuildUrl(selectedPersonIds.filter((id) => id !== personId))); } + +function removeDocument() { + goto(rebuildUrl(selectedPersonIds)); +}
@@ -76,6 +94,14 @@ function removePerson(personId: string) { {/each} + {#if data.documentFilter} + + {/if} +