From 76e092e5e50203cd007ce94d35d1cb49fd98c572 Mon Sep 17 00:00:00 2001 From: duranb Date: Tue, 24 Mar 2026 10:19:46 -0700 Subject: [PATCH 1/2] fix(sequencing): refresh editor output when extension changes This ensures the editor output view correctly refreshes when its configuration changes. --- src/components/sequencing/SequenceEditor.svelte | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/components/sequencing/SequenceEditor.svelte b/src/components/sequencing/SequenceEditor.svelte index 45d3f4b0ef..24653d3e4a 100644 --- a/src/components/sequencing/SequenceEditor.svelte +++ b/src/components/sequencing/SequenceEditor.svelte @@ -25,6 +25,7 @@ import { getLintDiagnostics } from '../../utilities/codemirror/lint'; import { blockTheme } from '../../utilities/codemirror/themes/block'; import { phoenixResources } from '../../utilities/sequence-editor/adaptation-resources'; + import { safeStringify } from '../../utilities/text'; import { showFailureToast, showSuccessToast } from '../../utilities/toast'; import { replaceFileExtension } from '../../utilities/workspaces'; import CssGrid from '../ui/CssGrid.svelte'; @@ -86,6 +87,7 @@ let commandInfoMapper: CommandInfoMapper; let inputEditorExtension: Extension = []; let outputEditorExtension: Extension = []; + let previousOutputEditorExtension: Extension | null = null; let previousSequenceFilePath: string = sequenceFilePath; // Debounce only the expensive output format computation, not the state sync @@ -158,7 +160,15 @@ selectedOutputFormat = sequenceAdaptation.outputs[0]; } - $: if (showOutputs && previousShowOutputs !== showOutputs && editorOutputDiv) { + $: if ( + showOutputs && + (previousShowOutputs !== showOutputs || + safeStringify(previousOutputEditorExtension) !== safeStringify(outputEditorExtension)) && + editorOutputDiv + ) { + if (safeStringify(previousOutputEditorExtension) !== safeStringify(outputEditorExtension)) { + previousOutputEditorExtension = outputEditorExtension; + } if (editorOutputView) { editorOutputView.destroy(); } @@ -176,6 +186,7 @@ ], parent: editorOutputDiv, }); + debouncedOutputUpdate(editorSequenceView?.state.doc.toString() ?? ''); } $: updatedSequenceDefinition = sequenceDefinition; From 0e7fdd4e0773ae21a28313020ad322f7f5e3c42a Mon Sep 17 00:00:00 2001 From: duranb Date: Wed, 22 Apr 2026 12:15:37 -0700 Subject: [PATCH 2/2] refactor(sequencing): simplify output editor extension handling and reconfiguration - Remove previousOutputEditorExtension tracking and safeStringify comparison - Add explicit empty array fallback when no output extension is available - Move output format initialization before extension computation for proper dependency order - Replace complex conditional logic with simpler reactive statement for output editor updates - Add dedicated reactive block to reconfigure output editor when adaptation extensions change --- .../sequencing/SequenceEditor.svelte | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/sequencing/SequenceEditor.svelte b/src/components/sequencing/SequenceEditor.svelte index 24653d3e4a..7c358cfabe 100644 --- a/src/components/sequencing/SequenceEditor.svelte +++ b/src/components/sequencing/SequenceEditor.svelte @@ -25,7 +25,6 @@ import { getLintDiagnostics } from '../../utilities/codemirror/lint'; import { blockTheme } from '../../utilities/codemirror/themes/block'; import { phoenixResources } from '../../utilities/sequence-editor/adaptation-resources'; - import { safeStringify } from '../../utilities/text'; import { showFailureToast, showSuccessToast } from '../../utilities/toast'; import { replaceFileExtension } from '../../utilities/workspaces'; import CssGrid from '../ui/CssGrid.svelte'; @@ -87,7 +86,6 @@ let commandInfoMapper: CommandInfoMapper; let inputEditorExtension: Extension = []; let outputEditorExtension: Extension = []; - let previousOutputEditorExtension: Extension | null = null; let previousSequenceFilePath: string = sequenceFilePath; // Debounce only the expensive output format computation, not the state sync @@ -99,8 +97,14 @@ inputEditorExtension = sequenceAdaptation.input.getEditorExtension(phoenixContext, phoenixResources); } + $: if (sequenceAdaptation.outputs.length > 0) { + selectedOutputFormat = sequenceAdaptation.outputs[0]; + } + $: if (phoenixContext && selectedOutputFormat?.getEditorExtension) { outputEditorExtension = selectedOutputFormat.getEditorExtension(phoenixContext, phoenixResources); + } else { + outputEditorExtension = []; } // insert sequence - use sequenceFilePath as dependency to ensure editor updates when switching files @@ -156,19 +160,7 @@ editorHeights = '1fr 3px'; } - $: if (sequenceAdaptation.outputs.length > 0) { - selectedOutputFormat = sequenceAdaptation.outputs[0]; - } - - $: if ( - showOutputs && - (previousShowOutputs !== showOutputs || - safeStringify(previousOutputEditorExtension) !== safeStringify(outputEditorExtension)) && - editorOutputDiv - ) { - if (safeStringify(previousOutputEditorExtension) !== safeStringify(outputEditorExtension)) { - previousOutputEditorExtension = outputEditorExtension; - } + $: if (showOutputs && previousShowOutputs !== showOutputs && editorOutputDiv) { if (editorOutputView) { editorOutputView.destroy(); } @@ -186,7 +178,6 @@ ], parent: editorOutputDiv, }); - debouncedOutputUpdate(editorSequenceView?.state.doc.toString() ?? ''); } $: updatedSequenceDefinition = sequenceDefinition; @@ -205,6 +196,15 @@ debouncedOutputUpdate(editorSequenceView?.state.doc.toString() ?? ''); } } + $: { + // Reconfigure output editor when adaptation extensions change + if (editorOutputView) { + editorOutputView.dispatch({ + effects: [compartmentOutputAdaptation.reconfigure(outputEditorExtension)], + }); + debouncedOutputUpdate(editorSequenceView?.state.doc.toString() ?? ''); + } + } function sequenceUpdateListener(viewUpdate: ViewUpdate): void { const sequence = viewUpdate.state.doc.toString();