From 2d495ef714a92d06ac74cc51a5501ed07a2f4136 Mon Sep 17 00:00:00 2001 From: Diego Imbert Date: Tue, 12 May 2026 17:13:22 +0200 Subject: [PATCH] feat(frontend): wire NatsTrigger editor to UserDraft Same pattern as the Kafka trigger: persist getSaveCfg() on every edit, overlay any local autosave on top of the backend value when openEdit loads the trigger (with initialConfig/originalConfig snapshotted from backend first so hasChanged correctly reports the overlay as unsaved), drop the entry on successful update. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../nats/NatsTriggerEditorInner.svelte | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte index f2c2688009..8958b61d77 100644 --- a/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte +++ b/frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte @@ -23,6 +23,7 @@ import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte' import TriggerAdvancedBadges from '../TriggerAdvancedBadges.svelte' import { deepEqual } from 'fast-equals' + import { UserDraft } from '$lib/userDraft.svelte' import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte' import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte' @@ -132,16 +133,20 @@ edit = true dirtyPath = false await loadTrigger(defaultConfig) + if (!defaultConfig) { + initialConfig = structuredClone($state.snapshot(getSaveCfg())) + } + originalConfig = structuredClone($state.snapshot(getSaveCfg())) + const localCfg = UserDraft.get>('schedule_nats', ePath) + if (localCfg && !deepEqual(localCfg, getSaveCfg())) { + await loadTriggerConfig(localCfg) + } } catch (err) { sendUserToast(`Could not load nats trigger: ${err}`, true) } finally { clearTimeout(loadingTimeout) drawerLoading = false showLoading = false - if (!defaultConfig) { - initialConfig = structuredClone($state.snapshot(getSaveCfg())) - } - originalConfig = structuredClone($state.snapshot(getSaveCfg())) } } @@ -248,6 +253,7 @@ async function updateTrigger(): Promise { deploymentLoading = true + const previousPath = initialPath const cfg = natsConfig const isSaved = await saveNatsTriggerFromCfg( initialPath, @@ -257,6 +263,7 @@ usedTriggerKinds ) if (isSaved) { + UserDraft.remove('schedule_nats', previousPath) onUpdate?.(cfg.path) originalConfig = structuredClone($state.snapshot(getSaveCfg())) initialPath = cfg.path @@ -321,6 +328,11 @@ !drawerLoading && handleConfigChange(natsConfig, initialConfig, saveDisabled, edit, onConfigChange) }) + + $effect(() => { + if (drawerLoading || !initialPath) return + UserDraft.save('schedule_nats', initialPath, natsConfig) + }) {#if mode === 'suspended'}