fix(forks-ui): widen onToggleMode types, scope schedule toggle reset by path

- TriggerEditorToolbar and TriggerSuspendedJobsModal forwarded
  onToggleMode as `(mode) => void`, dropping the new boolean return so
  any caller wired through them would silently no-op the cancel-revert.
  Match the wider TriggerModeToggle signature.
- Schedule list page used a single resetVersion counter for every row's
  {#key}, so cancelling on any one schedule remounted every <Toggle> on
  the page. Switch to a per-path Record<string, number> bumped only for
  the affected row.
This commit is contained in:
hugocasa
2026-05-01 17:18:12 +02:00
parent 336e9ecda5
commit bdd7a68229
3 changed files with 14 additions and 10 deletions
@@ -21,7 +21,7 @@
extra?: Snippet
onDelete?: () => void
onReset?: () => void
onToggleMode: (mode: TriggerMode) => void
onToggleMode: (mode: TriggerMode) => void | boolean | Promise<void | boolean>
onUpdate?: () => void
cloudDisabled?: boolean
trigger?: Trigger
@@ -43,7 +43,7 @@
triggerPath: string
triggerKind: JobTriggerKind
hasChanged: boolean
onToggleMode: (mode: TriggerMode) => void
onToggleMode: (mode: TriggerMode) => void | boolean | Promise<void | boolean>
runnableConfig: TriggerRunnableConfig
}
@@ -141,14 +141,18 @@
loadingSchedulesWithJobStats = false
}
// Bumped when a schedule toggle is cancelled or errors, to force-remount
// the affected row's <Toggle>. 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>. 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<Record<string, number>>({})
function bumpToggleReset(path: string) {
toggleResetVersions[path] = (toggleResetVersions[path] ?? 0) + 1
}
async function setScheduleEnabled(path: string, enabled: boolean): Promise<void> {
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}
</div>
{#key toggleResetVersion}
{#key toggleResetVersions[path] ?? 0}
<Toggle
checked={enabled}
on:change={(e) => {