diff --git a/frontend/src/lib/components/ArgInput.svelte b/frontend/src/lib/components/ArgInput.svelte index 1d513cbb2e..1797b8a92e 100644 --- a/frontend/src/lib/components/ArgInput.svelte +++ b/frontend/src/lib/components/ArgInput.svelte @@ -57,6 +57,7 @@ export let itemPicker: ItemPicker | undefined = undefined export let noMargin = false export let extra: Record = {} + export let minW = true let seeEditable: boolean = enum_ != undefined || pattern != undefined const dispatch = createEventDispatcher() @@ -141,6 +142,12 @@ } } + function onKeyDown(e: KeyboardEvent) { + if ((e.ctrlKey || e.metaKey) && e.key == 'Enter') { + return + } + e.stopPropagation() + } $: { if (value == undefined || value == null) { value = defaultValue @@ -165,7 +172,7 @@ -
+
{#if displayHeader} @@ -192,7 +199,7 @@ use:autosize rows="1" bind:value={description} - on:keydown|stopPropagation + on:keydown={onKeyDown} placeholder="Field description" /> {#if type == 'string' && format != 'date-time'} @@ -408,7 +415,7 @@ dispatch('focus') }} use:autosize - on:keydown|stopPropagation + on:keydown={onKeyDown} type="text" {disabled} class="col-span-10 {valid diff --git a/frontend/src/lib/components/DisplayResult.svelte b/frontend/src/lib/components/DisplayResult.svelte index aea7e4993d..21f5e7301e 100644 --- a/frontend/src/lib/components/DisplayResult.svelte +++ b/frontend/src/lib/components/DisplayResult.svelte @@ -203,7 +203,8 @@
{:else if !forceJson && resultKind == 'error'}
{result.error.name}: {result.error.message}{#if result.error.name || result.error.message}{result.error.name}: {result.error + .message}{:else}{JSON.stringify(result.error, null, 4)}{/if}
{result.error.stack ?? ''}
@@ -261,7 +262,15 @@
Copy to clipboard
- + {@const str = JSON.stringify(result, null, 4).replace(/\\n/g, '\n')} + {#if str.length > 100000} + JSON too large. Download + {:else} + + {/if} diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index 6e462703fa..68edcd17ee 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -1,6 +1,6 @@ + +
+ {#if keys.length > 0} + {#each keys as argName, i (argName)} + {#if Object.keys(schema.properties ?? {}).includes(argName)} +
+ {#if typeof args == 'object' && schema?.properties[argName]} + + {/if} +
+ +
+
+ {/if} + {/each} + {/if} +
diff --git a/frontend/src/lib/components/Toggle.svelte b/frontend/src/lib/components/Toggle.svelte index ff81886338..90a69ea7d7 100644 --- a/frontend/src/lib/components/Toggle.svelte +++ b/frontend/src/lib/components/Toggle.svelte @@ -2,10 +2,12 @@ import { classNames } from '$lib/utils' import { createEventDispatcher } from 'svelte' import { twMerge } from 'tailwind-merge' + import Tooltip from './Tooltip.svelte' export let options: { left?: string right?: string + rightTooltip?: string } = {} export let checked: boolean = false export let disabled = false @@ -74,6 +76,9 @@ style={textStyle} > {options?.right} + {#if options?.rightTooltip} + {options?.rightTooltip} + {/if} {/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index ffbb3cbe1f..86881b05e5 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -63,6 +63,9 @@ if (onDeleteComponentControl) { onDeleteComponentControl() } + if (onDelete) { + onDelete() + } if (componentSettings?.item.id) { delete $worldStore.outputsById[componentSettings?.item.id] diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte index 47ff46f9f4..ededf9218f 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/JsonEditor.svelte @@ -5,6 +5,7 @@ export let error = '' export let editor: SimpleEditor | undefined = undefined + $: tooBig = code && code?.length > 1000000 function parseJson() { try { value = JSON.parse(code ?? '') @@ -16,11 +17,15 @@ $: code && parseJson() -
-
- +{#if tooBig} + JSON to edit is too big +{:else} +
+
+ +
+ {#if error != ''} + {error} + {/if}
- {#if error != ''} - {error} - {/if} -
+{/if} diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index 8b112bfc43..6d7b136864 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -242,6 +242,7 @@
{:else if selected === 'test'} ('FlowEditorContext') export let initialPath: string $: url = `${$page.url.hostname}/api/w/${$workspaceStore}/jobs/run/f/${$flowStore?.path}` + $: syncedUrl = `${$page.url.hostname}/api/w/${$workspaceStore}/jobs/run_wait_result/f/${$flowStore?.path}`
@@ -69,52 +71,87 @@ On-demand:
@@ -122,7 +159,11 @@
- + Flows can be triggered by any schedules, their webhooks or their UI but they only have only one primary schedules with which they share the same path. The primary schedule can be set here. diff --git a/frontend/src/lib/components/flows/utils.ts b/frontend/src/lib/components/flows/utils.ts index 5041bb0860..516ad7c516 100644 --- a/frontend/src/lib/components/flows/utils.ts +++ b/frontend/src/lib/components/flows/utils.ts @@ -10,9 +10,60 @@ import { import { inferArgs } from '$lib/infer' import { loadSchema, loadSchemaFlow } from '$lib/scripts' import { workspaceStore } from '$lib/stores' -import { emptySchema } from '$lib/utils' +import { emptySchema, sendUserToast } from '$lib/utils' import { get } from 'svelte/store' import type { FlowModuleState } from './flowState' +import type { PickableProperties } from './previousResults' + +function create_context_function_template(eval_string: string, context: Record) { + return ` +return function (context) { +"use strict"; +${ + Object.keys(context).length > 0 + ? `let ${Object.keys(context).map((key) => ` ${key} = context['${key}']`)};` + : `` +} +return ${eval_string} +}` +} + +function make_context_evaluator(eval_string, context): (context) => any { + let template = create_context_function_template(eval_string, context) + let functor = Function(template) + return functor() +} + +export function evalValue( + k: string, + mod: FlowModule, + testStepStore: Record, + pickableProperties: PickableProperties | undefined, + showError: boolean +) { + let inputTransforms = (mod.value['input_transforms'] ?? {}) as Record + let v = testStepStore[mod.id]?.[k] + let t = inputTransforms?.[k] + if (!v) { + if (t.type == 'static') { + v = t.value + } else { + try { + let context = { + flow_input: pickableProperties?.flow_input, + results: pickableProperties?.priorIds + } + v = make_context_evaluator(t.expr, context)(context) + } catch (e) { + if (showError) { + sendUserToast(`Error evaluating ${k}: ${e.message}`, true) + } + v = undefined + } + } + } + return v +} export function cleanInputs(flow: Flow | any): Flow { const newFlow: Flow = JSON.parse(JSON.stringify(flow)) diff --git a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte index cf6cb33f37..bf6b0bf60f 100644 --- a/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte +++ b/frontend/src/lib/components/propertyPicker/ObjectViewer.svelte @@ -136,7 +136,7 @@ {:else if topBrackets} {openBracket}{closeBracket} {:else} - No items + No items ([]) {/if}