diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 7e86b99fb3..b75d1dd443 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -212,5 +212,5 @@

Not recognized arg type {arg.type}

{/if} {:else} -

Arg at {argName} is undefined

+

Arg at {argName} is undefined

{/if} diff --git a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte index 631079d0d0..4735c2ab6f 100644 --- a/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte +++ b/frontend/src/lib/components/flows/content/FlowEditorPanel.svelte @@ -23,7 +23,7 @@ {:else if $selectedId === 'failure'} {:else} - {#each $flowStore.value.modules as flowModule, index (index)} + {#each $flowStore.value.modules as flowModule, index (flowModule.id)} = + flowModule.value.type === 'rawscript' || flowModule.value.type === 'script' + ? flowModule.value.input_transforms + : {} + + $: if (flowModule.value.type === 'rawscript' || flowModule.value.type === 'script') { + flowModule.value.input_transforms = inputTransforms + } + $: stepPropPicker = failureModule ? { pickableProperties: { previous_result: { error: 'the error message' } }, extraLib: '' } : getStepPropPicker($flowStateStore, parentModule, previousModuleId, $flowStore, previewArgs) @@ -62,23 +71,17 @@ async function reload(flowModule: FlowModule) { const { input_transforms, schema } = await loadSchemaFromModule(flowModule) - let hasChanged = false + setTimeout(() => { + if ( + (flowModule.value.type == 'script' || flowModule.value.type == 'rawscript') && + JSON.stringify(flowModule.value.input_transforms) !== JSON.stringify(input_transforms) + ) { + inputTransforms = input_transforms + } + }) + if (JSON.stringify(schema) !== JSON.stringify($flowStateStore[flowModule.id].schema)) { $flowStateStore[flowModule.id].schema = schema - hasChanged = true - } - - if ( - flowModule.value.type == 'script' || - (flowModule.value.type == 'rawscript' && - JSON.stringify(flowModule.value.input_transforms) !== JSON.stringify(input_transforms)) - ) { - flowModule.value.input_transforms = input_transforms - hasChanged = true - } - - if (hasChanged) { - flowModule = flowModule } } diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index 49d8cf8934..be3114562d 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -79,7 +79,7 @@ }} failureModule={$selectedId === 'failure'} /> - {:else} + {:else if flowModule.value.type === 'rawscript' || flowModule.value.type === 'script'} {/if} {:else if flowModule.value.type === 'forloopflow'} diff --git a/frontend/src/lib/components/flows/flowStateUtils.ts b/frontend/src/lib/components/flows/flowStateUtils.ts index e777adb132..e5dcadf403 100644 --- a/frontend/src/lib/components/flows/flowStateUtils.ts +++ b/frontend/src/lib/components/flows/flowStateUtils.ts @@ -1,5 +1,5 @@ import type { Schema } from '$lib/common' -import { Script, ScriptService, type FlowModule, type RawScript } from '$lib/gen' +import { Script, ScriptService, type FlowModule, type PathScript, type RawScript } from '$lib/gen' import { initialCode } from '$lib/script_helpers' import { userStore, workspaceStore } from '$lib/stores' import { getScriptByPath } from '$lib/utils' @@ -57,8 +57,8 @@ export async function pickScript( path: string, summary: string, id: string -): Promise<[FlowModule, FlowModuleState]> { - const flowModule: FlowModule = { +): Promise<[FlowModule & { value: PathScript }, FlowModuleState]> { + const flowModule: FlowModule & { value: PathScript } = { id, value: { type: 'script', path, input_transforms: {} }, summary @@ -129,7 +129,7 @@ export async function createBranchAll(id: string): Promise<[FlowModule, FlowModu return [branchesFlowModules, flowModuleState] } -export async function fork(flowModule: FlowModule): Promise<[FlowModule, FlowModuleState]> { +export async function fork(flowModule: FlowModule): Promise<[FlowModule & { value: RawScript }, FlowModuleState]> { if (flowModule.value.type !== 'script') { throw new Error('Can only fork a script module') } @@ -141,7 +141,7 @@ export async function fork(flowModule: FlowModule): Promise<[FlowModule, FlowMod return [forkedFlowModule, flowModuleState] } -async function createInlineScriptModuleFromPath(path: string, id: string): Promise { +async function createInlineScriptModuleFromPath(path: string, id: string): Promise { const { content, language } = await getScriptByPath(path) return { @@ -167,7 +167,7 @@ export async function createScriptFromInlineScript( flowModule: FlowModule, suffix: string, schema: Schema -): Promise<[FlowModule, FlowModuleState]> { +): Promise<[FlowModule & { value: PathScript }, FlowModuleState]> { const flow = get(flowStore) const user = get(userStore) diff --git a/frontend/src/lib/components/flows/utils.ts b/frontend/src/lib/components/flows/utils.ts index fb75b125af..85d99892d4 100644 --- a/frontend/src/lib/components/flows/utils.ts +++ b/frontend/src/lib/components/flows/utils.ts @@ -19,7 +19,7 @@ export function cleanInputs(flow: Flow | any): Flow { newFlow.value.modules.forEach((mod) => { if (mod.value.type == 'rawscript' || mod.value.type == 'script') { if (Object.keys(mod.input_transforms ?? {}).length > 0) { - mod.value.input_transforms = mod.input_transforms + mod.value.input_transforms = mod.input_transforms! delete mod.input_transforms } Object.values(mod.input_transforms ?? {}).forEach((inp) => { @@ -81,7 +81,7 @@ export async function loadSchemaFromModule(module: FlowModule): Promise<{ const keys = Object.keys(schema?.properties ?? {}) if (Object.keys(module.input_transforms ?? {}).length > 0) { - mod.input_transforms = module.input_transforms + mod.input_transforms = module.input_transforms! } let input_transforms = mod.input_transforms ?? module.input_transforms ?? {} @@ -124,9 +124,8 @@ export function getDefaultExpr( previousExpr?: string ) { const expr = previousExpr ?? `previous_result.${key}` - return `import { previous_result, flow_input, step, variable, resource, params } from 'windmill${ - importPath ? `@${importPath}` : '' - }' + return `import { previous_result, flow_input, step, variable, resource, params } from 'windmill${importPath ? `@${importPath}` : '' + }' ${expr}` } diff --git a/openflow.openapi.yaml b/openflow.openapi.yaml index ff8baf2281..77a660ee6d 100644 --- a/openflow.openapi.yaml +++ b/openflow.openapi.yaml @@ -185,6 +185,7 @@ components: - type - content - language + - input_transforms PathScript: type: object @@ -203,6 +204,7 @@ components: required: - type - path + - input_transforms ForloopFlow: type: object