diff --git a/frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte b/frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte index 52c68aeed9..0da3f98b9c 100644 --- a/frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte +++ b/frontend/src/lib/components/triggers/TriggerEditorToolbar.svelte @@ -21,7 +21,7 @@ extra?: Snippet onDelete?: () => void onReset?: () => void - onToggleMode: (mode: TriggerMode) => void + onToggleMode: (mode: TriggerMode) => void | boolean | Promise onUpdate?: () => void cloudDisabled?: boolean trigger?: Trigger diff --git a/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte b/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte index 2985a38fdb..8ad0bf6e6f 100644 --- a/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte +++ b/frontend/src/lib/components/triggers/TriggerSuspendedJobsModal.svelte @@ -43,7 +43,7 @@ triggerPath: string triggerKind: JobTriggerKind hasChanged: boolean - onToggleMode: (mode: TriggerMode) => void + onToggleMode: (mode: TriggerMode) => void | boolean | Promise runnableConfig: TriggerRunnableConfig } diff --git a/frontend/src/routes/(root)/(logged)/schedules/+page.svelte b/frontend/src/routes/(root)/(logged)/schedules/+page.svelte index a1838056a1..9298c627e5 100644 --- a/frontend/src/routes/(root)/(logged)/schedules/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/schedules/+page.svelte @@ -141,14 +141,18 @@ loadingSchedulesWithJobStats = false } - // Bumped when a schedule toggle is cancelled or errors, to force-remount - // the affected row's . Toggle uses `bind:checked` on its native - // input internally; once the user clicks, the local checkbox state + // Per-path counter bumped when a schedule toggle is cancelled or errors, + // to force-remount that row's . Toggle uses `bind:checked` on + // its native input; once the user clicks, the local checkbox state // diverges from the parent's prop expression, and Svelte 5 prop // reactivity won't push a same-valued prop back down. Re-mounting // re-initializes from the prop. List-page rows don't optimistically - // flip `enabled`, so they need this nudge. - let toggleResetVersion = $state(0) + // flip `enabled`, so they need this nudge — but only the affected row, + // not all rows on the page. + let toggleResetVersions = $state>({}) + function bumpToggleReset(path: string) { + toggleResetVersions[path] = (toggleResetVersions[path] ?? 0) + 1 + } async function setScheduleEnabled(path: string, enabled: boolean): Promise { try { @@ -167,11 +171,11 @@ // Cancelled — nothing changed on the server, skip the reload // (which would re-fetch job stats and flash the loading flag) // and just nudge the toggle back to the prop value. - toggleResetVersion++ + bumpToggleReset(path) } } catch (err) { sendUserToast(`Cannot ` + (enabled ? 'enable' : 'disable') + ` schedule: ${err.body}`, true) - toggleResetVersion++ + bumpToggleReset(path) loadSchedules() } } @@ -438,7 +442,7 @@ {/if} - {#key toggleResetVersion} + {#key toggleResetVersions[path] ?? 0} {