diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index e0c04392e2..4c379ea61d 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -102,7 +102,7 @@
{#if testJob && 'result' in testJob && testJob.result}{#if testJob && 'result' in testJob && testJob.result != undefined}
 						{:else if testIsLoading}Waiting for Result...
diff --git a/frontend/src/lib/components/flows/content/FlowFailureModule.svelte b/frontend/src/lib/components/flows/content/FlowFailureModule.svelte
index a36bdae218..edef3b6b53 100644
--- a/frontend/src/lib/components/flows/content/FlowFailureModule.svelte
+++ b/frontend/src/lib/components/flows/content/FlowFailureModule.svelte
@@ -12,11 +12,12 @@
 
 {#if $flowStore.value.failure_module}
 	 {
 			$flowStore.value.failure_module = undefined
 		}}
+		failureModule={true}
 	/>
 {/if}
diff --git a/frontend/src/lib/components/flows/content/FlowInputs.svelte b/frontend/src/lib/components/flows/content/FlowInputs.svelte
index d84f971b32..8b5a77d5ea 100644
--- a/frontend/src/lib/components/flows/content/FlowInputs.svelte
+++ b/frontend/src/lib/components/flows/content/FlowInputs.svelte
@@ -9,6 +9,8 @@
 
 	export let shouldDisableLoopCreation: boolean = false
 	export let shouldDisableTriggerScripts: boolean = false
+	export let failureModule: boolean
+
 	const dispatch = createEventDispatcher()
 
 
@@ -18,8 +20,8 @@
 	{/if}
 
 	
- - + + dispatch('loop')} /> - - dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'pgsql' })} - /> + {#if !failureModule} + + dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'pgsql' })} + /> + {/if} - dispatch('new', { language: RawScript.language.PYTHON3, kind: 'script', subkind: 'flow' })} + dispatch('new', { + language: RawScript.language.PYTHON3, + kind: 'script', + subkind: failureModule ? 'failure' : 'flow' + })} /> - dispatch('new', { language: RawScript.language.DENO, kind: 'script', subkind: 'flow' })} + dispatch('new', { + language: RawScript.language.DENO, + kind: 'script', + subkind: failureModule ? 'failure' : 'flow' + })} /> - dispatch('new', { language: RawScript.language.GO, kind: 'script', subkind: 'flow' })} + dispatch('new', { + language: RawScript.language.GO, + kind: 'script', + subkind: failureModule ? 'failure' : 'flow' + })} />
diff --git a/frontend/src/lib/components/flows/content/FlowModule.svelte b/frontend/src/lib/components/flows/content/FlowModule.svelte index bbc90ee775..b2d5268f67 100644 --- a/frontend/src/lib/components/flows/content/FlowModule.svelte +++ b/frontend/src/lib/components/flows/content/FlowModule.svelte @@ -45,6 +45,7 @@ export let flowModule: FlowModule export let previewArgs: Record = {} export let flowModuleState: FlowModuleState + export let failureModule: boolean $: [parentIndex, childIndex] = $selectedId.split('-').map(Number) @@ -54,12 +55,14 @@ let selected = 'inputs' $: shouldPick = isEmptyFlowModule(flowModule) - $: stepPropPicker = getStepPropPicker( - $selectedId.split('-').map(Number), - $flowStore.schema, - $flowStateStore, - previewArgs - ) + $: stepPropPicker = failureModule + ? { pickableProperties: { previous_result: { error: 'the error message' } }, extraLib: '' } + : getStepPropPicker( + $selectedId.split('-').map(Number), + $flowStore.schema, + $flowStateStore, + previewArgs + ) function onKeyDown(event: KeyboardEvent) { if ((event.ctrlKey || event.metaKey) && event.key == 'Enter') { @@ -136,6 +139,7 @@ kind: e.detail.kind, subkind: e.detail.subkind })} + {failureModule} /> {:else} {#if flowModule.value.type === 'rawscript'} diff --git a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte index a3e6d84811..da1e88cb62 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleWrapper.svelte @@ -19,6 +19,7 @@ {#each [$flowStateStore.modules[parentIndex].childFlowModules] as state} {#if mod.type == 'forloopflow' && state != undefined} { const code = initialCode(language, kind, subkind) @@ -184,7 +184,7 @@ type Result = any type PickableProperties = { flow_input?: Object previous_result: Result | undefined - step: Result[] + step?: Result[] } type StepPropPicker = { @@ -210,8 +210,8 @@ export function getStepPropPicker( parentIndex == 0 ? flowInput : results.length > 0 - ? results[results.length - 1] - : NEVER_TESTED_THIS_FAR + ? results[results.length - 1] + : NEVER_TESTED_THIS_FAR if (isInsideLoop) { let forLoopFlowInput = { @@ -235,8 +235,8 @@ export function getStepPropPicker( childIndex == 0 ? forLoopFlowInput : innerResults.length > 0 - ? innerResults[innerResults.length - 1] - : NEVER_TESTED_THIS_FAR + ? innerResults[innerResults.length - 1] + : NEVER_TESTED_THIS_FAR const extraLib = buildExtraLib( objectToTsType(forLoopFlowInput), diff --git a/frontend/src/lib/components/flows/header/FlowImportExportMenu.svelte b/frontend/src/lib/components/flows/header/FlowImportExportMenu.svelte index d3e42516a8..36af92cea4 100644 --- a/frontend/src/lib/components/flows/header/FlowImportExportMenu.svelte +++ b/frontend/src/lib/components/flows/header/FlowImportExportMenu.svelte @@ -28,7 +28,7 @@ diff --git a/frontend/src/lib/script_helpers.ts b/frontend/src/lib/script_helpers.ts index 4aac9f09a2..9769ab9526 100644 --- a/frontend/src/lib/script_helpers.ts +++ b/frontend/src/lib/script_helpers.ts @@ -61,6 +61,20 @@ func main(x string) (interface{}, error) { } ` +export const GO_FAILURE_MODULE_CODE = `import ( + "fmt" + "os" +) + +// connect the error parameter to 'previous_result.error' + +func main(error string) (interface{}, error) { + fmt.Println(error) + fmt.Println("job", os.Getenv("WM_JOB_ID")) + return x, nil +} +` + export const DENO_INIT_CODE_CLEAR = `// import * as wmill from "https://deno.land/x/windmill@v${__pkg__.version}/mod.ts" export async function main(x: string) { @@ -68,12 +82,34 @@ export async function main(x: string) { } ` +export const DENO_FAILURE_MODULE_CODE = ` +// connect the error parameter to 'previous_result.error' + +export async function main(error: string) { + const job = Deno.env.get("WM_JOB_ID") + console.log("error", error) + console.log("job", job) + return { error, job } +} +` + export const PYTHON_INIT_CODE_CLEAR = `#import wmill def main(x: str): return x ` +export const PYTHON_FAILURE_MODULE_CODE = `import os + +# connect the error parameter to 'previous_result.error' + +def main(error: str): + job = os.environ.get("WM_JOB_ID") + print("error", error) + print("job", job) + return error, job +` + export const POSTGRES_INIT_CODE = `import { pgSql, type Resource, @@ -123,14 +159,17 @@ export function isInitialCode(content: string): boolean { return false } -export function initialCode(language: 'deno' | 'python3' | 'go', kind: Script.kind, subkind: 'pgsql' | 'flow' | 'script' | undefined): string { +export function initialCode(language: 'deno' | 'python3' | 'go', kind: Script.kind, subkind: 'pgsql' | 'flow' | 'script' | 'failure' | undefined): string { if (language === 'deno') { if (kind === 'trigger') { return DENO_INIT_CODE_TRIGGER } else if (kind === 'script') { if (subkind === 'flow') { return DENO_INIT_CODE_CLEAR - } else if (subkind === 'pgsql') { + } else if (subkind === 'failure') { + return DENO_FAILURE_MODULE_CODE + } + else if (subkind === 'pgsql') { return POSTGRES_INIT_CODE } else { return DENO_INIT_CODE @@ -141,10 +180,16 @@ export function initialCode(language: 'deno' | 'python3' | 'go', kind: Script.ki } else if (language === 'python3') { if (subkind === 'flow') { return PYTHON_INIT_CODE_CLEAR + } else if (subkind === 'failure') { + return PYTHON_FAILURE_MODULE_CODE } else { return PYTHON_INIT_CODE } } else { - return GO_INIT_CODE + if (subkind === 'failure') { + return GO_FAILURE_MODULE_CODE + } else { + return GO_INIT_CODE + } } }