From 99c01bca3863ac9b2882948bb5914f051a7716a4 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Thu, 26 Feb 2026 19:32:36 +0100 Subject: [PATCH] fix: remove duplicate job loading on chart zoom (#8121) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove explicit loadJobs(true) calls from onZoom handlers in RunChart and ConcurrentJobsChart — setting _timeframe.val already triggers the effect which calls onParamChanges - Fix debounce by hoisting promise ref outside effect closure so cleanup can properly cancel in-flight requests Co-authored-by: Claude Opus 4.6 --- frontend/src/lib/components/RunsPage.svelte | 6 ++---- frontend/src/lib/components/runs/useJobsLoader.svelte.ts | 7 ++++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/frontend/src/lib/components/RunsPage.svelte b/frontend/src/lib/components/RunsPage.svelte index 94939143cc..541f12f1ca 100644 --- a/frontend/src/lib/components/RunsPage.svelte +++ b/frontend/src/lib/components/RunsPage.svelte @@ -776,9 +776,8 @@ maxTimeSet={manualTimeframe?.maxTs} maxIsNow={manualTimeframe?.maxTs == undefined} jobs={completedJobs} - onZoom={async (zoom) => { + onZoom={(zoom) => { _timeframe.val = buildManualTimeframe(zoom.min.toISOString(), zoom.max.toISOString()) - jobsLoader?.loadJobs(true) }} onPointClicked={(ids) => { runsTable?.scrollToRun(ids) @@ -790,9 +789,8 @@ maxTimeSet={manualTimeframe?.maxTs} maxIsNow={manualTimeframe?.maxTs == undefined} {extendedJobs} - onZoom={async (zoom) => { + onZoom={(zoom) => { _timeframe.val = buildManualTimeframe(zoom.min.toISOString(), zoom.max.toISOString()) - jobsLoader?.loadJobs(true) }} /> {/if} diff --git a/frontend/src/lib/components/runs/useJobsLoader.svelte.ts b/frontend/src/lib/components/runs/useJobsLoader.svelte.ts index 6d6085e437..e2bbeb3fe0 100644 --- a/frontend/src/lib/components/runs/useJobsLoader.svelte.ts +++ b/frontend/src/lib/components/runs/useJobsLoader.svelte.ts @@ -110,6 +110,7 @@ export function useJobsLoader(args: () => UseJobLoaderArgs) { let intervalId: ReturnType | undefined = $state() let sync = true let paramChangeTimeout: ReturnType | undefined + let paramChangePromise: CancelablePromise | undefined function onParamChanges() { resetJobs() @@ -545,14 +546,14 @@ export function useJobsLoader(args: () => UseJobLoaderArgs) { perPage showSchedules showFutureJobs - let p: CancelablePromise | undefined clearTimeout(paramChangeTimeout) + paramChangePromise?.cancel() paramChangeTimeout = setTimeout(() => { - p = untrack(() => onParamChanges()) + paramChangePromise = untrack(() => onParamChanges()) }, 0) return () => { clearTimeout(paramChangeTimeout) - p?.cancel() + paramChangePromise?.cancel() } }) $effect(() => {