diff --git a/src/lib/views/MeetingsList.svelte b/src/lib/views/MeetingsList.svelte index d93cdf9..d7961ff 100644 --- a/src/lib/views/MeetingsList.svelte +++ b/src/lib/views/MeetingsList.svelte @@ -12,6 +12,28 @@ searchTimer = setTimeout(() => meetings.search(query), 250); } + // Tag/date filters (T8.3, FR-SEARCH-2) apply to the plain list, not + // full-text search — changing one drops out of search mode so the + // filtered list is immediately visible rather than hidden behind results. + let tagFilter = $state(""); + let fromFilter = $state(""); + let toFilter = $state(""); + + function toUnix(dateStr: string): number | undefined { + if (!dateStr) return undefined; + return Math.floor(new Date(dateStr).getTime() / 1000); + } + + function onFilterChange() { + query = ""; + meetings.search(null); + meetings.load({ + tag: tagFilter || undefined, + from: toUnix(fromFilter), + to: toUnix(toFilter), + }); + } + // Unified view: full-text results (with snippets) while searching, else the // plain list. Same underlying fields either way. let displayItems = $derived<(MeetingListItem | SearchHit)[]>( @@ -61,6 +83,16 @@ bind:value={query} oninput={onSearchInput} /> +
Searching…
{:else if displayItems.length === 0 && meetings.loading} @@ -91,6 +123,13 @@ {#if snippetOf(m)} {snippetOf(m)} {/if} + {#if m.tags.length > 0} + + {/if}