diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 0e8bd9b601..2c3bef45a8 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -6,7 +6,7 @@ import ArgInput from './ArgInput.svelte' import FieldHeader from './FieldHeader.svelte' import DynamicInputHelpBox from './flows/content/DynamicInputHelpBox.svelte' - import type { PropPickerWrapperContext } from './flows/propPicker/PropPickerWrapper.svelte' + import type { FlowEditorContext } from './flows/types' import { codeToStaticTemplate, getDefaultExpr } from './flows/utils' import SimpleEditor from './SimpleEditor.svelte' import { Button } from '$lib/components/common' @@ -39,6 +39,7 @@ export let argExtra: Record = {} export let pickableProperties: PickableProperties | undefined = undefined export let enableAi = false + export let id: string let monaco: SimpleEditor | undefined = undefined let monacoTemplate: TemplateEditor | undefined = undefined @@ -146,6 +147,8 @@ function onFocus() { focused = true + if (!focusProp) return + if (isStaticTemplate(inputCat)) { focusProp(argName, 'append', (path) => { const toAppend = `\$\{${path}}` @@ -166,7 +169,7 @@ } } - const { focusProp, propPickerConfig } = getContext('PropPickerWrapper') + const { flowInputsStore } = getContext('FlowEditorContext') $: isStaticTemplate(inputCat) && propertyType == 'static' && setPropertyType(arg?.value) @@ -189,11 +192,14 @@ loadResourceTypes() + $: propPickerConfig = $flowInputsStore[id]?.connectingInputs?.propPickerConfig + $: focusProp = $flowInputsStore[id]?.connectingInputs?.focusProp + $: connecting = $propPickerConfig?.propName == argName && $propPickerConfig?.insertionMode == 'connect' -{#if arg != undefined} +{#if arg != undefined && focusProp}
- {#if $propPickerConfig?.propName == argName && $propPickerConfig?.insertionMode == 'insert'} + {#if $propPickerConfig?.propName == argName && ($propPickerConfig?.insertionMode == 'insert' || $propPickerConfig?.insertionMode == 'append')}
{ + dispatch('connect', e.detail) + console.log('dbg connect 2', e.detail) + }} + {id} />
{/if} diff --git a/frontend/src/lib/components/common/button/AnimatedButton.svelte b/frontend/src/lib/components/common/button/AnimatedButton.svelte index 40dfa1f024..f6696fb79b 100644 --- a/frontend/src/lib/components/common/button/AnimatedButton.svelte +++ b/frontend/src/lib/components/common/button/AnimatedButton.svelte @@ -4,7 +4,7 @@ export let marginWidth = '2px' export let animationDuration = '2s' export let baseRadius = '4px' - export let animate = true + export let animate: boolean = true export let wrapperClasses = '' export let ringColor = 'transparent' diff --git a/frontend/src/lib/components/flows/content/FlowConstants.svelte b/frontend/src/lib/components/flows/content/FlowConstants.svelte index df0688f177..52b7256e0e 100644 --- a/frontend/src/lib/components/flows/content/FlowConstants.svelte +++ b/frontend/src/lib/components/flows/content/FlowConstants.svelte @@ -3,9 +3,7 @@ import FlowCard from '../common/FlowCard.svelte' import { Alert, Badge } from '$lib/components/common' import type { FlowModule, FlowModuleValue, InputTransform, PathScript, RawScript } from '$lib/gen' - import { getContext, setContext } from 'svelte' - import type { PropPickerWrapperContext } from '../propPicker/PropPickerWrapper.svelte' - import { writable } from 'svelte/store' + import { getContext } from 'svelte' import Toggle from '../../Toggle.svelte' import InputTransformSchemaForm from '$lib/components/InputTransformSchemaForm.svelte' import type { FlowEditorContext } from '../types' @@ -75,12 +73,6 @@ ] as [Record, string[], FlowModule] ) .filter(([i, f, m]) => f.length > 0) - - setContext('PropPickerWrapper', { - focusProp: () => {}, - propPickerConfig: writable(undefined), - clearFocus: () => {} - })
@@ -135,6 +127,7 @@ class="mt-2" schema={$flowStateStore[m.id]?.schema ?? {}} bind:args + id={m.id} />
{/if} diff --git a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte index 12df94be76..321b190af6 100644 --- a/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte +++ b/frontend/src/lib/components/flows/content/FlowModuleComponent.svelte @@ -13,7 +13,7 @@ import FlowModuleHeader from './FlowModuleHeader.svelte' import { getLatestHashForScript, scriptLangToEditorLang } from '$lib/scripts' import PropPickerWrapper from '../propPicker/PropPickerWrapper.svelte' - import { afterUpdate, getContext, tick } from 'svelte' + import { afterUpdate, getContext, tick, createEventDispatcher } from 'svelte' import type { FlowEditorContext } from '../types' import FlowModuleScript from './FlowModuleScript.svelte' import FlowModuleEarlyStop from './FlowModuleEarlyStop.svelte' @@ -48,6 +48,8 @@ import { debounce } from '$lib/utils' import { dfs } from '../dfs' import FlowModuleSkip from './FlowModuleSkip.svelte' + import { writable } from 'svelte/store' + import type { PropPickerConfig } from '../types' const { selectedId, @@ -213,6 +215,33 @@ } debouncedWarning(argName) } + + function setConnect() { + const dispatch = createEventDispatcher() + if ($flowInputsStore && flowModule.id && $flowInputsStore?.[flowModule.id] === undefined) { + $flowInputsStore[flowModule.id] = {} + } + + const propPickerConfig = writable(undefined) + $flowInputsStore[flowModule.id] = { + connectingInputs: { + propPickerConfig, + focusProp: (propName, insertionMode, onSelect) => { + propPickerConfig.set({ + propName, + insertionMode, + onSelect + }) + }, + clearFocus: () => { + propPickerConfig.set(undefined) + dispatch('connect', false) + } + } + } + } + + setConnect() @@ -379,6 +408,10 @@ pickableProperties={stepPropPicker.pickableProperties} error={failureModule} noPadding + on:connect={(e) => { + console.log('dbg connect', e.detail) + }} + id={flowModule.id} > { const { argName } = e.detail setFlowInput(argName) + console.log('dbg changeArg', argName) }} + on:connect={(e) => { + console.log('dbg connect 3', e.detail) + }} + id={flowModule.id} />
diff --git a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte index d93d85366d..abdf5d45df 100644 --- a/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte +++ b/frontend/src/lib/components/flows/map/FlowModuleSchemaItem.svelte @@ -15,7 +15,8 @@ Square, SkipForward, Voicemail, - X + X, + Plug } from 'lucide-svelte' import { createEventDispatcher, getContext } from 'svelte' import { fade } from 'svelte/transition' @@ -28,6 +29,7 @@ import DrawerContent from '$lib/components/common/drawer/DrawerContent.svelte' import { getDependeeAndDependentComponents } from '../flowExplorer' import { replaceId } from '../flowStore' + import AnimatedButton from '$lib/components/common/button/AnimatedButton.svelte' export let selected: boolean = false export let deletable: boolean = false @@ -290,6 +292,25 @@ outline-[1px] outline dark:outline-gray-500 outline-gray-300 bg-surface duration {/if} + {#if hover || selected} + + + + {/if} + {#if (id && Object.values($flowInputsStore?.[id]?.flowStepWarnings || {}).length > 0) || Boolean(warningMessage)}
diff --git a/frontend/src/lib/components/flows/propPicker/PropPickerWrapper.svelte b/frontend/src/lib/components/flows/propPicker/PropPickerWrapper.svelte index 13bbb6c611..dd42f90465 100644 --- a/frontend/src/lib/components/flows/propPicker/PropPickerWrapper.svelte +++ b/frontend/src/lib/components/flows/propPicker/PropPickerWrapper.svelte @@ -1,31 +1,15 @@ - -
{#if result} @@ -93,11 +104,12 @@ {notSelectable} allowCopy={!notSelectable && !$propPickerConfig} on:select={({ detail }) => { - dispatch('select', detail) + //dispatch('select', detail) if ($propPickerConfig?.onSelect(detail)) { propPickerConfig.set(undefined) } }} + {id} /> {/if} diff --git a/frontend/src/lib/components/flows/types.ts b/frontend/src/lib/components/flows/types.ts index 2cf7127018..fd3d881fd5 100644 --- a/frontend/src/lib/components/flows/types.ts +++ b/frontend/src/lib/components/flows/types.ts @@ -5,9 +5,25 @@ import type ScriptEditorDrawer from './content/ScriptEditorDrawer.svelte' import type { FlowState } from './flowState' import type { FlowBuilderWhitelabelCustomUi } from '../custom_ui' +export type InsertionMode = 'connect' | 'insert' | 'append' +export type SelectCallback = (detail: any) => boolean + +export type PropPickerConfig = { + propName: string + insertionMode: InsertionMode + onSelect: SelectCallback +} + +export type PropPickerWrapper = { + propPickerConfig: Writable + focusProp: (propName: string, insertionMode: InsertionMode, onSelect: SelectCallback) => void + clearFocus: () => void +} + export type FlowInput = Record< string, { + connectingInputs?: PropPickerWrapper flowStepWarnings?: Record< string, { diff --git a/frontend/src/lib/components/propertyPicker/PropPicker.svelte b/frontend/src/lib/components/propertyPicker/PropPicker.svelte index 5311c4ae53..a00f0ea237 100644 --- a/frontend/src/lib/components/propertyPicker/PropPicker.svelte +++ b/frontend/src/lib/components/propertyPicker/PropPicker.svelte @@ -3,7 +3,7 @@ import { workspaceStore } from '$lib/stores' import { getContext } from 'svelte' import { Badge, Button } from '../common' - import type { PropPickerWrapperContext } from '../flows/propPicker/PropPickerWrapper.svelte' + import type { FlowEditorContext } from '../flows/types' import ObjectViewer from './ObjectViewer.svelte' import { keepByKey } from './utils' @@ -15,6 +15,7 @@ export let notSelectable: boolean export let error: boolean = false export let allowCopy = false + export let id: string $: previousId = pickableProperties?.previousId let variables: Record = {} @@ -26,7 +27,9 @@ const EMPTY_STRING = '' let search = '' - const { propPickerConfig } = getContext('PropPickerWrapper') + const { flowInputsStore } = getContext('FlowEditorContext') + + $: propPickerConfig = flowInputsStore[id]?.connectingInputs?.propPickerConfig $: flowInputsFiltered = search === EMPTY_STRING