From 77d282bbebb35e3a54c691edc9395589f5828103 Mon Sep 17 00:00:00 2001 From: Marcel Date: Fri, 8 May 2026 10:02:02 +0200 Subject: [PATCH] refactor(documents): split triggerSearch by zoom semantics (#385) triggerSearch(zoomOverride?) made the call site read "depends on whether the source event happened to include zoomFrom/zoomTo". Splits into triggerSearchKeepZoom() and triggerSearchWithZoom(from, to) so the contract is explicit at every call site. Closes Felix's review nit. Co-Authored-By: Claude Opus 4.7 --- frontend/src/routes/documents/+page.svelte | 41 +++++++++++++--------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/frontend/src/routes/documents/+page.svelte b/frontend/src/routes/documents/+page.svelte index 311f0d81..72fb84e8 100644 --- a/frontend/src/routes/documents/+page.svelte +++ b/frontend/src/routes/documents/+page.svelte @@ -81,10 +81,23 @@ function buildSearchParams(filters: FilterSnapshot, targetPage?: number): Svelte } /** - * Rebuilds the URL from the CURRENT local filter state. `page` is intentionally - * not carried over — any filter change implicitly resets back to page 0. + * Rebuilds the URL from the CURRENT local filter state, preserving the zoom + * range carried in `data.zoom{From,To}`. `page` is intentionally not carried + * over — any filter change implicitly resets back to page 0. */ -function triggerSearch(zoomOverride?: { zoomFrom: string | null; zoomTo: string | null }) { +function triggerSearchKeepZoom() { + navigateWithZoom(data.zoomFrom ?? null, data.zoomTo ?? null); +} + +/** + * Rebuilds the URL from the CURRENT local filter state and replaces the zoom + * range with the provided values (or clears it if both are null). + */ +function triggerSearchWithZoom(zoomFrom: string | null, zoomTo: string | null) { + navigateWithZoom(zoomFrom, zoomTo); +} + +function navigateWithZoom(zoomFrom: string | null, zoomTo: string | null) { const params = buildSearchParams({ q, from, @@ -96,8 +109,8 @@ function triggerSearch(zoomOverride?: { zoomFrom: string | null; zoomTo: string dir, tagQ, tagOp: tagOperator, - zoomFrom: zoomOverride ? zoomOverride.zoomFrom : data.zoomFrom, - zoomTo: zoomOverride ? zoomOverride.zoomTo : data.zoomTo + zoomFrom, + zoomTo }); goto(`/documents?${params.toString()}`, { keepFocus: true, noScroll: true }); } @@ -130,12 +143,12 @@ function buildPageHref(targetPage: number): string { function handleTextSearch() { clearTimeout(searchTimer); - searchTimer = setTimeout(() => triggerSearch(), 500); + searchTimer = setTimeout(() => triggerSearchKeepZoom(), 500); } function handleImmediateSearch() { clearTimeout(searchTimer); - triggerSearch(); + triggerSearchKeepZoom(); } // Trigger search reactively when the tag list changes. @@ -144,7 +157,7 @@ $effect(() => { const cur = tagNames.map((t) => t.name).join(','); if (cur !== prevTagStr) { prevTagStr = cur; - triggerSearch(); + triggerSearchKeepZoom(); } }); @@ -256,19 +269,13 @@ $effect(() => { // Drag commits filter + zoom atomically (Graylog-style range selector). // Single click and clear omit zoomFrom/zoomTo so existing zoom is preserved. if ('zoomFrom' in event) { - triggerSearch({ - zoomFrom: event.zoomFrom ?? null, - zoomTo: event.zoomTo ?? null - }); + triggerSearchWithZoom(event.zoomFrom ?? null, event.zoomTo ?? null); } else { - triggerSearch(); + triggerSearchKeepZoom(); } }} onzoomchange={(event) => { - triggerSearch({ - zoomFrom: event?.zoomFrom ?? null, - zoomTo: event?.zoomTo ?? null - }); + triggerSearchWithZoom(event?.zoomFrom ?? null, event?.zoomTo ?? null); }} />