diff --git a/frontend/src/lib/components/Dev.svelte b/frontend/src/lib/components/Dev.svelte index 4eececb8ef..cf3b687852 100644 --- a/frontend/src/lib/components/Dev.svelte +++ b/frontend/src/lib/components/Dev.svelte @@ -48,7 +48,7 @@ import type { FlowPropPickerConfig, PropPickerContext } from './prop_picker' import type { PickableProperties } from './flows/previousResults' import { Triggers } from './triggers/triggers.svelte' - import { TestSteps } from './flows/testSteps.svelte' + import { StepsInputArgs } from './flows/stepsInputArgs.svelte' import { ModulesTestStates } from './modulesTest.svelte' import type { GraphModuleState } from './graph' @@ -457,7 +457,7 @@ const scriptEditorDrawer = writable(undefined) const moving = writable<{ id: string } | undefined>(undefined) const history = initHistory(flowStore.val) - const testSteps = new TestSteps() + const stepsInputArgs = new StepsInputArgs() const selectedIdStore = writable('settings-metadata') const triggersCount = writable(undefined) const modulesTestStates = new ModulesTestStates((moduleId) => { @@ -481,7 +481,7 @@ pathStore: writable(''), flowStateStore, flowStore, - testSteps, + stepsInputArgs, saveDraft: () => {}, initialPathStore: writable(''), fakeInitialPath: '', @@ -806,7 +806,7 @@ noEditor on:applyArgs={(ev) => { if (ev.detail.kind === 'preprocessor') { - testSteps.setStepArgs('preprocessor', ev.detail.args ?? {}) + stepsInputArgs.setStepArgs('preprocessor', ev.detail.args ?? {}) $selectedIdStore = 'preprocessor' } else { previewArgsStore.val = ev.detail.args ?? {} @@ -818,6 +818,7 @@ isOwner={flowPreviewContent?.getIsOwner()} {suspendStatus} onOpenDetails={flowPreviewButtons?.openPreview} + previewOpen={flowPreviewButtons?.getPreviewOpen()} /> {/key} diff --git a/frontend/src/lib/components/FlowBuilder.svelte b/frontend/src/lib/components/FlowBuilder.svelte index 0573c67c40..4f764065e4 100644 --- a/frontend/src/lib/components/FlowBuilder.svelte +++ b/frontend/src/lib/components/FlowBuilder.svelte @@ -77,7 +77,7 @@ } from './triggers/utils' import DraftTriggersConfirmationModal from './common/confirmationModal/DraftTriggersConfirmationModal.svelte' import { Triggers } from './triggers/triggers.svelte' - import { TestSteps } from './flows/testSteps.svelte' + import { StepsInputArgs } from './flows/stepsInputArgs.svelte' import { aiChatManager } from './copilot/chat/AIChatManager.svelte' import type { GraphModuleState } from './graph' import { @@ -571,7 +571,7 @@ payloadData: undefined }) - const testSteps = new TestSteps() + const stepsInputArgs = new StepsInputArgs() function select(selectedId: string) { selectedIdStore.set(selectedId) @@ -592,7 +592,7 @@ flowStateStore, flowStore, pathStore, - testSteps, + stepsInputArgs, saveDraft, initialPathStore, fakeInitialPath, @@ -1129,6 +1129,8 @@ bind:this={flowPreviewButtons} {loading} onRunPreview={() => { + // Reset manually edited args inputs when running a preview + stepsInputArgs.resetManuallyEditedArgs() modulesTestStates.hideJobsInGraph() localModuleStates = {} showJobStatus = true @@ -1170,7 +1172,7 @@ {newFlow} on:applyArgs={(ev) => { if (ev.detail.kind === 'preprocessor') { - testSteps.setStepArgs('preprocessor', ev.detail.args ?? {}) + stepsInputArgs.setStepArgs('preprocessor', ev.detail.args ?? {}) $selectedIdStore = 'preprocessor' } }} @@ -1218,6 +1220,7 @@ delete modulesTestStates.states[id] }} {flowHasChanged} + previewOpen={flowPreviewButtons?.getPreviewOpen()} /> {:else} Loading... diff --git a/frontend/src/lib/components/FlowPreviewContent.svelte b/frontend/src/lib/components/FlowPreviewContent.svelte index 01163fa07d..77c3c17e93 100644 --- a/frontend/src/lib/components/FlowPreviewContent.svelte +++ b/frontend/src/lib/components/FlowPreviewContent.svelte @@ -140,7 +140,7 @@ jobId = await runFlowPreview(args, newFlow, $pathStore, restartedFrom) isRunning = true if (inputSelected) { - savedArgs = previewArgs.val + savedArgs = $state.snapshot(previewArgs.val) inputSelected = undefined } onRunPreview?.() @@ -166,7 +166,7 @@ if (preventEscape) { selectInput(undefined) event.preventDefault() - event.stopPropagation + event.stopPropagation() } break } @@ -506,7 +506,7 @@ schema={flowStore.val.schema} bind:args={previewArgs.val} on:change={() => { - savedArgs = previewArgs.val + savedArgs = $state.snapshot(previewArgs.val) }} bind:isValid helperScript={flowStore.val.schema?.['x-windmill-dyn-select-code'] && diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index 93ea296ec6..ebee88985f 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -18,6 +18,7 @@ noEditor?: boolean scriptProgress?: any focusArg?: string + onJobDone?: () => void } let { @@ -28,7 +29,8 @@ testIsLoading = $bindable(false), noEditor = false, scriptProgress = $bindable(undefined), - focusArg = undefined + focusArg = undefined, + onJobDone }: Props = $props() const { flowStore } = getContext('FlowEditorContext') @@ -46,6 +48,7 @@ bind:testIsLoading bind:scriptProgress bind:this={moduleTest} + {onJobDone} />
diff --git a/frontend/src/lib/components/ModulePreviewForm.svelte b/frontend/src/lib/components/ModulePreviewForm.svelte index 4c8c78e4e6..9c21d1e173 100644 --- a/frontend/src/lib/components/ModulePreviewForm.svelte +++ b/frontend/src/lib/components/ModulePreviewForm.svelte @@ -32,7 +32,7 @@ focusArg = undefined }: Props = $props() - const { testSteps, flowStateStore, flowStore, previewArgs } = + const { stepsInputArgs, flowStateStore, flowStore, previewArgs } = getContext('FlowEditorContext') let inputCheck: { [id: string]: boolean } = $state({}) @@ -45,12 +45,12 @@ let lkeys = Object.keys(schema?.properties ?? {}) if (schema?.properties && JSON.stringify(lkeys) != JSON.stringify(keys)) { keys = lkeys - untrack(() => testSteps?.removeExtraKey(mod.id, keys)) + untrack(() => stepsInputArgs?.removeExtraKey(mod.id, keys)) } }) function plugIt(argName: string) { - testSteps?.setEvaluatedStepArg( + stepsInputArgs?.setEvaluatedStepArg( mod.id, argName, $state.snapshot(evalValue(argName, mod, pickableProperties, true)) @@ -102,8 +102,8 @@ $effect.pre(() => { if (!initialized) { - if (testSteps) { - testSteps?.updateStepArgs(mod.id, flowStateStore.val, flowStore?.val, previewArgs?.val) + if (stepsInputArgs) { + stepsInputArgs?.updateStepArgs(mod.id, flowStateStore.val, flowStore?.val, previewArgs?.val) initialized = true } } @@ -130,8 +130,8 @@ label={argName} description={schema.properties[argName].description} bind:value={ - () => testSteps?.getStepInputArgs(mod.id, argName), - (v) => testSteps?.setStepInputArgs(mod.id, argName, v) + () => stepsInputArgs?.getStepInputArgs(mod.id, argName), + (v) => stepsInputArgs?.setStepInputArgs(mod.id, argName, v) } type={schema.properties[argName].type} oneOf={schema.properties[argName].oneOf} @@ -152,7 +152,7 @@ placeholder={schema.properties[argName].placeholder} /> {/if} - {#if testSteps?.isArgManuallySet(mod.id, argName)} + {#if stepsInputArgs?.isArgManuallySet(mod.id, argName)}
{:else if connectingData !== undefined || simpleViewer} + {:else if jsonView} + {#await import('$lib/components/JsonEditor.svelte')} {:then Module} @@ -653,12 +634,12 @@ class="h-full" /> {/await} - {:else if (mock?.enabled || preview == 'mock') && preview != 'job'} + {:else if (mock?.enabled || preview == 'mock') && preview != 'job' && !executingTestJob} + {#if fullResult}
{/if} {:else if selectedJob != undefined && (selectedJob.result_stream || selectedJob.type == 'CompletedJob')} + {#if fullResult}
{#key selectedJob} {/if} - {:else if !job} + {:else if !lastJob}

{customEmptyJobMessage ?? 'Test this step to see results'}{#if !disableMock} @@ -753,6 +734,47 @@ {/snippet} +{#snippet historyPicker()} + + {#snippet trigger()} +