Skip to content

Commit 9d32635

Browse files
diegoimbertclaude
andcommitted
fix(frontend): trigger autosave no longer false-restores on plain open
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 22060b7 commit 9d32635

13 files changed

Lines changed: 187 additions & 35 deletions

frontend/src/lib/components/triggers/azure/AzureTriggerEditorInner.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import { saveAzureTriggerFromCfg } from './utils'
2626
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
2727
import { deepEqual } from 'fast-equals'
28-
import { UserDraft } from '$lib/userDraft.svelte'
28+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
2929
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
3030
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
3131
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -131,7 +131,7 @@
131131
}
132132
originalConfig = structuredClone($state.snapshot(getAzureConfig()))
133133
const localCfg = UserDraft.get<Record<string, any>>('trigger_azure', ePath)
134-
if (localCfg && !deepEqual(localCfg, getAzureConfig())) {
134+
if (localDraftDiffers(localCfg, getAzureConfig())) {
135135
const deployedCfg = structuredClone($state.snapshot(getAzureConfig()))
136136
await loadTriggerConfig(localCfg)
137137
notifyRestoredFromLocal(false, true, {
@@ -314,7 +314,8 @@
314314
315315
$effect(() => {
316316
if (drawerLoading || !initialPath) return
317-
azureConfig && UserDraft.save('trigger_azure', initialPath, azureConfig)
317+
azureConfig &&
318+
UserDraft.saveIfChanged('trigger_azure', initialPath, azureConfig, originalConfig)
318319
})
319320
</script>
320321

frontend/src/lib/components/triggers/email/EmailTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import TriggerAdvancedBadges from '../TriggerAdvancedBadges.svelte'
3030
import { saveEmailTriggerFromCfg } from './utils'
3131
import { deepEqual } from 'fast-equals'
32-
import { UserDraft } from '$lib/userDraft.svelte'
32+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
3333
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
3434
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
3535
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -128,7 +128,7 @@
128128
}
129129
originalConfig = structuredClone($state.snapshot(getEmailTriggerConfig()))
130130
const localCfg = UserDraft.get<Record<string, any>>('trigger_email', ePath)
131-
if (localCfg && !deepEqual(localCfg, getEmailTriggerConfig())) {
131+
if (localDraftDiffers(localCfg, getEmailTriggerConfig())) {
132132
const deployedCfg = structuredClone($state.snapshot(getEmailTriggerConfig()))
133133
loadTriggerConfig(localCfg as Partial<EmailTrigger>)
134134
notifyRestoredFromLocal(false, true, {
@@ -311,7 +311,7 @@
311311
312312
$effect(() => {
313313
if (drawerLoading || !initialPath) return
314-
UserDraft.save('trigger_email', initialPath, emailConfig)
314+
UserDraft.saveIfChanged('trigger_email', initialPath, emailConfig, originalConfig)
315315
})
316316
</script>
317317

frontend/src/lib/components/triggers/gcp/GcpTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import { saveGcpTriggerFromCfg } from './utils'
2828
import { getHandlerType, handleConfigChange, type Trigger } from '../utils'
2929
import { deepEqual } from 'fast-equals'
30-
import { UserDraft } from '$lib/userDraft.svelte'
30+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
3131
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
3232
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
3333
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -133,7 +133,7 @@
133133
}
134134
originalConfig = structuredClone($state.snapshot(getGcpConfig()))
135135
const localCfg = UserDraft.get<Record<string, any>>('trigger_gcp', ePath)
136-
if (localCfg && !deepEqual(localCfg, getGcpConfig())) {
136+
if (localDraftDiffers(localCfg, getGcpConfig())) {
137137
const deployedCfg = structuredClone($state.snapshot(getGcpConfig()))
138138
await loadTriggerConfig(localCfg)
139139
notifyRestoredFromLocal(false, true, {
@@ -331,7 +331,7 @@
331331
332332
$effect(() => {
333333
if (drawerLoading || !initialPath) return
334-
gcpConfig && UserDraft.save('trigger_gcp', initialPath, gcpConfig)
334+
gcpConfig && UserDraft.saveIfChanged('trigger_gcp', initialPath, gcpConfig, originalConfig)
335335
})
336336
</script>
337337

frontend/src/lib/components/triggers/http/RouteEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte'
5656
import TriggerAdvancedBadges from '../TriggerAdvancedBadges.svelte'
5757
import { deepEqual } from 'fast-equals'
58-
import { UserDraft } from '$lib/userDraft.svelte'
58+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
5959
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
6060
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
6161
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -227,7 +227,7 @@
227227
}
228228
originalConfig = structuredClone($state.snapshot(getRouteConfig()))
229229
const localCfg = UserDraft.get<Record<string, any>>('trigger_http', ePath)
230-
if (localCfg && !deepEqual(localCfg, getRouteConfig())) {
230+
if (localDraftDiffers(localCfg, getRouteConfig())) {
231231
const deployedCfg = structuredClone($state.snapshot(getRouteConfig()))
232232
loadTriggerConfig(localCfg as Partial<HttpTrigger>)
233233
notifyRestoredFromLocal(false, true, {
@@ -465,7 +465,7 @@
465465
466466
$effect(() => {
467467
if (drawerLoading || !initialPath) return
468-
UserDraft.save('trigger_http', initialPath, routeConfig)
468+
UserDraft.saveIfChanged('trigger_http', initialPath, routeConfig, originalConfig)
469469
})
470470
</script>
471471

frontend/src/lib/components/triggers/kafka/KafkaTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte'
2525
import TriggerAdvancedBadges from '../TriggerAdvancedBadges.svelte'
2626
import { deepEqual } from 'fast-equals'
27-
import { UserDraft } from '$lib/userDraft.svelte'
27+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
2828
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
2929
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
3030
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -155,7 +155,7 @@
155155
}
156156
originalConfig = structuredClone($state.snapshot(getSaveCfg()))
157157
const localCfg = UserDraft.get<Record<string, any>>('trigger_kafka', ePath)
158-
if (localCfg && !deepEqual(localCfg, getSaveCfg())) {
158+
if (localDraftDiffers(localCfg, getSaveCfg())) {
159159
const deployedCfg = structuredClone($state.snapshot(getSaveCfg()))
160160
loadTriggerConfig(localCfg)
161161
notifyRestoredFromLocal(false, true, {
@@ -369,7 +369,7 @@
369369
370370
$effect(() => {
371371
if (drawerLoading || !initialPath) return
372-
UserDraft.save('trigger_kafka', initialPath, kafkaConfig)
372+
UserDraft.saveIfChanged('trigger_kafka', initialPath, kafkaConfig, originalConfig)
373373
})
374374
</script>
375375

frontend/src/lib/components/triggers/mqtt/MqttTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
4040
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
4141
import { deepEqual } from 'fast-equals'
42-
import { UserDraft } from '$lib/userDraft.svelte'
42+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
4343
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
4444
4545
interface Props {
@@ -151,7 +151,7 @@
151151
}
152152
originalConfig = structuredClone($state.snapshot(getSaveCfg()))
153153
const localCfg = UserDraft.get<Record<string, any>>('trigger_mqtt', ePath)
154-
if (localCfg && !deepEqual(localCfg, getSaveCfg())) {
154+
if (localDraftDiffers(localCfg, getSaveCfg())) {
155155
const deployedCfg = structuredClone($state.snapshot(getSaveCfg()))
156156
await loadTriggerConfig(localCfg)
157157
notifyRestoredFromLocal(false, true, {
@@ -355,7 +355,7 @@
355355
356356
$effect(() => {
357357
if (drawerLoading || !initialPath) return
358-
UserDraft.save('trigger_mqtt', initialPath, mqttConfig)
358+
UserDraft.saveIfChanged('trigger_mqtt', initialPath, mqttConfig, originalConfig)
359359
})
360360
</script>
361361

frontend/src/lib/components/triggers/nats/NatsTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
import TriggerRetriesAndErrorHandler from '../TriggerRetriesAndErrorHandler.svelte'
2424
import TriggerAdvancedBadges from '../TriggerAdvancedBadges.svelte'
2525
import { deepEqual } from 'fast-equals'
26-
import { UserDraft } from '$lib/userDraft.svelte'
26+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
2727
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
2828
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
2929
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
@@ -139,7 +139,7 @@
139139
}
140140
originalConfig = structuredClone($state.snapshot(getSaveCfg()))
141141
const localCfg = UserDraft.get<Record<string, any>>('trigger_nats', ePath)
142-
if (localCfg && !deepEqual(localCfg, getSaveCfg())) {
142+
if (localDraftDiffers(localCfg, getSaveCfg())) {
143143
const deployedCfg = structuredClone($state.snapshot(getSaveCfg()))
144144
await loadTriggerConfig(localCfg)
145145
notifyRestoredFromLocal(false, true, {
@@ -339,7 +339,7 @@
339339
340340
$effect(() => {
341341
if (drawerLoading || !initialPath) return
342-
UserDraft.save('trigger_nats', initialPath, natsConfig)
342+
UserDraft.saveIfChanged('trigger_nats', initialPath, natsConfig, originalConfig)
343343
})
344344
</script>
345345

frontend/src/lib/components/triggers/postgres/PostgresTriggerEditorInner.svelte

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
4646
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
4747
import { deepEqual } from 'fast-equals'
48-
import { UserDraft } from '$lib/userDraft.svelte'
48+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
4949
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
5050
import { capitalize } from '$lib/utils'
5151
@@ -246,7 +246,7 @@
246246
}
247247
originalConfig = structuredClone($state.snapshot(getSaveCfg()))
248248
const localCfg = UserDraft.get<Record<string, any>>('trigger_postgres', ePath)
249-
if (localCfg && !deepEqual(localCfg, getSaveCfg())) {
249+
if (localDraftDiffers(localCfg, getSaveCfg())) {
250250
const deployedCfg = structuredClone($state.snapshot(getSaveCfg()))
251251
await loadTriggerConfig(localCfg)
252252
notifyRestoredFromLocal(false, true, {
@@ -496,7 +496,8 @@
496496
497497
$effect(() => {
498498
if (drawerLoading || !initialPath) return
499-
postgresConfig && UserDraft.save('trigger_postgres', initialPath, postgresConfig)
499+
postgresConfig &&
500+
UserDraft.saveIfChanged('trigger_postgres', initialPath, postgresConfig, originalConfig)
500501
})
501502
502503
$effect(() => {

frontend/src/lib/components/triggers/schedules/ScheduleEditorInner.svelte

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@
3838
import { runScheduleNow } from '../scheduled/utils'
3939
import { handleConfigChange } from '../utils'
4040
import { withForkConflictRetry } from '$lib/utils/forkConflict'
41-
import { deepEqual } from 'fast-equals'
42-
import { UserDraft } from '$lib/userDraft.svelte'
41+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
4342
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
4443
import TextInput from '$lib/components/text_input/TextInput.svelte'
4544
import { twMerge } from 'tailwind-merge'
@@ -149,7 +148,7 @@
149148
initialConfig = structuredClone($state.snapshot(getScheduleCfg()))
150149
}
151150
const localCfg = UserDraft.get<Record<string, any>>('trigger_schedule', ePath)
152-
if (localCfg && !deepEqual(localCfg, getScheduleCfg())) {
151+
if (localDraftDiffers(localCfg, getScheduleCfg())) {
153152
// Snapshot the just-loaded backend config so "Reset to
154153
// deployed" can re-apply it, then overlay the local autosave.
155154
const deployedCfg = structuredClone($state.snapshot(getScheduleCfg()))
@@ -675,7 +674,7 @@
675674
676675
$effect(() => {
677676
if (drawerLoading || !initialPath) return
678-
UserDraft.save('trigger_schedule', initialPath, scheduleCfg)
677+
UserDraft.saveIfChanged('trigger_schedule', initialPath, scheduleCfg, initialConfig)
679678
})
680679
</script>
681680

frontend/src/lib/components/triggers/sqs/SqsTriggerEditorInner.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import TriggerSuspendedJobsAlert from '../TriggerSuspendedJobsAlert.svelte'
3232
import TriggerSuspendedJobsModal from '../TriggerSuspendedJobsModal.svelte'
3333
import { deepEqual } from 'fast-equals'
34-
import { UserDraft } from '$lib/userDraft.svelte'
34+
import { UserDraft, localDraftDiffers } from '$lib/userDraft.svelte'
3535
import { notifyRestoredFromLocal } from '$lib/userDraftToast'
3636
3737
interface Props {
@@ -137,7 +137,7 @@
137137
}
138138
originalConfig = structuredClone($state.snapshot(getSaveCfg()))
139139
const localCfg = UserDraft.get<Record<string, any>>('trigger_sqs', ePath)
140-
if (localCfg && !deepEqual(localCfg, getSaveCfg())) {
140+
if (localDraftDiffers(localCfg, getSaveCfg())) {
141141
const deployedCfg = structuredClone($state.snapshot(getSaveCfg()))
142142
loadTriggerConfig(localCfg)
143143
notifyRestoredFromLocal(false, true, {
@@ -332,7 +332,7 @@
332332
// a path (no localStorage write would happen anyway).
333333
$effect(() => {
334334
if (drawerLoading || !initialPath) return
335-
UserDraft.save('trigger_sqs', initialPath, sqsConfig)
335+
UserDraft.saveIfChanged('trigger_sqs', initialPath, sqsConfig, originalConfig)
336336
})
337337
</script>
338338

0 commit comments

Comments
 (0)