From e2c45452401022b00285b21551ffaf35a114be33 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Fri, 3 Mar 2023 17:34:08 +0100 Subject: [PATCH] fix(frontend): arginput + apppreview fixes --- .../lib/components/InputTransformForm.svelte | 2 - .../InputTransformSchemaForm.svelte | 114 ++++++++++++++++++ frontend/src/lib/components/SchemaForm.svelte | 114 +++++++++--------- .../apps/components/helpers/InputValue.svelte | 23 +++- .../components/apps/editor/AppPreview.svelte | 3 +- .../apps/editor/SubGridEditor.svelte | 2 + .../lib/components/apps/editor/appUtils.ts | 8 +- .../editor/contextPanel/ContextPanel.svelte | 2 +- .../InlineScriptEditor.svelte | 2 +- .../settingsPanel/ComponentPanel.svelte | 2 +- frontend/src/lib/components/apps/utils.ts | 43 +------ .../flows/content/FlowConstants.svelte | 4 +- .../flows/content/FlowModuleComponent.svelte | 4 +- frontend/src/types.d.ts | 2 +- 14 files changed, 208 insertions(+), 117 deletions(-) create mode 100644 frontend/src/lib/components/InputTransformSchemaForm.svelte diff --git a/frontend/src/lib/components/InputTransformForm.svelte b/frontend/src/lib/components/InputTransformForm.svelte index 3fb2317685..74ae5dd6a7 100644 --- a/frontend/src/lib/components/InputTransformForm.svelte +++ b/frontend/src/lib/components/InputTransformForm.svelte @@ -299,6 +299,4 @@ Not recognized input type {argName} {/if} -{:else} -

Argument at {argName} is undefined

{/if} diff --git a/frontend/src/lib/components/InputTransformSchemaForm.svelte b/frontend/src/lib/components/InputTransformSchemaForm.svelte new file mode 100644 index 0000000000..b3cf89152f --- /dev/null +++ b/frontend/src/lib/components/InputTransformSchemaForm.svelte @@ -0,0 +1,114 @@ + + +
+ {#if keys.length > 0} + {#each keys as argName, i (argName)} + {#if (!filter || filter.includes(argName)) && Object.keys(schema.properties ?? {}).includes(argName)} +
+ +
+ {/if} + {/each} + {:else} +
No inputs
+ {/if} +
+ + { + if (pickForField) { + args[pickForField].value = '$var:' + path + } + }} + itemName="Variable" + extraField="path" + loadItems={async () => + (await VariableService.listVariable({ workspace: $workspaceStore ?? '' })).map((x) => ({ + name: x.path, + ...x + }))} +> +
+ +
+
+ + diff --git a/frontend/src/lib/components/SchemaForm.svelte b/frontend/src/lib/components/SchemaForm.svelte index 61db77d490..12b75efc65 100644 --- a/frontend/src/lib/components/SchemaForm.svelte +++ b/frontend/src/lib/components/SchemaForm.svelte @@ -6,11 +6,9 @@ import { faPlus } from '@fortawesome/free-solid-svg-icons' import ArgInput from './ArgInput.svelte' import { Button } from './common' - import InputTransformForm from './InputTransformForm.svelte' import ItemPicker from './ItemPicker.svelte' import VariableEditor from './VariableEditor.svelte' - export let inputTransform = false export let schema: Schema export let args: Record = {} export let disabledArgs: string[] = [] @@ -18,16 +16,12 @@ export let editableSchema = false export let isValid: boolean = true - export let extraLib: string = 'missing extraLib' export let autofocus = false - export let previousModuleId: string | undefined = undefined export let shouldHideNoInputs: boolean = false export let compact = false export let password: string | undefined = undefined export let noVariablePicker = false - export let filter: string[] | undefined = undefined - export let noDynamicToggle = false export let flexWrap = false export let noDelete = false @@ -42,17 +36,19 @@ } function removeExtraKey() { + const nargs = {} Object.keys(args ?? {}).forEach((key) => { - if (!keys.includes(key)) { - delete args[key] - delete inputCheck[key] + if (keys.includes(key)) { + nargs[key] = args[key] } }) + args = nargs } let pickForField: string | undefined let itemPicker: ItemPicker | undefined = undefined let variableEditor: VariableEditor | undefined = undefined + let keys: string[] = [] $: { let lkeys = Object.keys(schema?.properties ?? {}) @@ -68,48 +64,60 @@
{#if keys.length > 0} {#each keys as argName, i (argName)} - {#if (!filter || filter.includes(argName)) && Object.keys(schema.properties ?? {}).includes(argName)} + {#if Object.keys(schema.properties ?? {}).includes(argName)}
- {#if inputTransform} - - {:else if typeof args == 'object' && schema?.properties[argName]} - - {:else} - Expected argument to be an object, got {JSON.stringify(args)} instead + {#if typeof args == 'object' && schema?.properties[argName]} + {#if editableSchema} + + {:else} + + {/if} {/if}
{/if} @@ -124,11 +132,7 @@ bind:this={itemPicker} pickCallback={(path, _) => { if (pickForField) { - if (inputTransform) { - args[pickForField].value = '$var:' + path - } else { - args[pickForField] = '$var:' + path - } + args[pickForField] = '$var:' + path } }} itemName="Variable" diff --git a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte index 86b476867d..d2c83342f9 100644 --- a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte +++ b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte @@ -23,12 +23,26 @@ $: state = $worldStore?.state - $: lastInput && $worldStore && handleConnection() - $: lastInput && lastInput.type == 'template' && $state && (value = getValue(lastInput)) - $: lastInput && lastInput.type == 'eval' && $state && (value = evalExpr(lastInput)) + let timeout: NodeJS.Timeout | undefined = undefined + const debounce_ms = 50 + function debounce(cb: () => void) { + if (timeout) { + clearTimeout(timeout) + } + timeout = setTimeout(cb, debounce_ms) + } + + $: lastInput && $worldStore && debounce(handleConnection) + $: lastInput && + lastInput.type == 'template' && + $state && + debounce(() => (value = getValue(lastInput))) + $: lastInput && + lastInput.type == 'eval' && + $state && + debounce(() => (value = evalExpr(lastInput))) function handleConnection() { - // console.log('handle connection', id, lastInput) if (lastInput.type === 'connected') { $worldStore?.connect(lastInput, onValueChange) } else if (lastInput.type === 'static' || lastInput.type == 'template') { @@ -108,6 +122,7 @@ } function onValueChange(newValue: any): void { + console.log('newValue', newValue, id) if (lastInput.type === 'connected' && newValue !== undefined && newValue !== null) { const { connection } = lastInput diff --git a/frontend/src/lib/components/apps/editor/AppPreview.svelte b/frontend/src/lib/components/apps/editor/AppPreview.svelte index 09d2778a3e..c55a016ea9 100644 --- a/frontend/src/lib/components/apps/editor/AppPreview.svelte +++ b/frontend/src/lib/components/apps/editor/AppPreview.svelte @@ -72,7 +72,7 @@ mounted = true }) - $: mounted && ($worldStore = buildWorld($staticOutputs, undefined, context)) + $: mounted && ($worldStore = buildWorld($staticOutputs, $worldStore, context)) $: width = $breakpoint === 'sm' ? 'max-w-[640px]' : 'w-full ' $: lockedClasses = isLocked ? '!max-h-[400px] overflow-hidden pointer-events-none' : '' @@ -94,7 +94,6 @@ {#if isLocked}
(isLocked = false)} class="absolute inset-0 center-center bg-black/20 z-50 backdrop-blur-[1px] cursor-pointer" > diff --git a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte index 0fa61ad97e..af5dcfdd9f 100644 --- a/frontend/src/lib/components/apps/editor/SubGridEditor.svelte +++ b/frontend/src/lib/components/apps/editor/SubGridEditor.svelte @@ -64,6 +64,8 @@ // @ts-ignore let container + + // $: containerHeight = subGrid.map((item) => columnConfiguration.map((c) => item[c[1]].h))
-
+
-
+
{#if name !== undefined} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 9f38100b1d..e480092455 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -191,7 +191,7 @@
{#if viewCssOptions} -
+
{#each Object.keys(component.customCss ?? {}) as name} {#if component?.customCss?.[name]}
diff --git a/frontend/src/lib/components/apps/utils.ts b/frontend/src/lib/components/apps/utils.ts index a1fcf1efc9..e01a5abb44 100644 --- a/frontend/src/lib/components/apps/utils.ts +++ b/frontend/src/lib/components/apps/utils.ts @@ -4,13 +4,11 @@ import { inferArgs } from '$lib/infer' import { emptySchema } from '$lib/utils' import type { AppComponent } from './editor/component' import type { App, ComponentCssProperty, ComponentCustomCSS, GridItem } from './types' -import { getRecommendedDimensionsByComponent } from './editor/component' -import { gridColumns } from './gridUtils' -import gridHelp from '@windmill-labs/svelte-grid/src/utils/helper' import { twMerge } from 'tailwind-merge' import type { AppInput, InputType, ResultAppInput, StaticAppInput } from './inputType' import type { Output } from './rx' import { getNextId } from '../flows/flowStateUtils' +import { createNewGridItem } from './editor/appUtils' export function allItems( grid: GridItem[], @@ -283,45 +281,6 @@ export function insertNewGridItem( return root } -// The grid is needed to find a space for the new component -export function createNewGridItem(grid: GridItem[], id: string, data: AppComponent): GridItem { - const appComponent = data - - appComponent.id = id - - const newComponent = { - fixed: false, - resizable: true, - draggable: true, - customDragger: false, - customResizer: false, - x: 0, - y: 0 - } - - let newData: AppComponent = JSON.parse(JSON.stringify(appComponent)) - - const newItem: GridItem = { - data: newData, - id: id - } - - gridColumns.forEach((column) => { - const rec = getRecommendedDimensionsByComponent(appComponent.type, column) - - newItem[column] = { - ...newComponent, - min: { w: 1, h: 1 }, - max: { w: column, h: 100 }, - w: rec.w, - h: rec.h - } - const position = gridHelp.findSpace(newItem, grid, column) as { x: number; y: number } - newItem[column] = { ...newItem[column], ...position } - }) - - return newItem -} function recursiveGetIds(gridItem: GridItem): string[] { const subGrids = gridItem.data.subGrids ?? [] diff --git a/frontend/src/lib/components/flows/content/FlowConstants.svelte b/frontend/src/lib/components/flows/content/FlowConstants.svelte index 17eb3e5561..c61fb5856c 100644 --- a/frontend/src/lib/components/flows/content/FlowConstants.svelte +++ b/frontend/src/lib/components/flows/content/FlowConstants.svelte @@ -9,6 +9,7 @@ import type { PropPickerWrapperContext } from '../propPicker/PropPickerWrapper.svelte' import { writable } from 'svelte/store' import Toggle from '../../Toggle.svelte' + import InputTransformSchemaForm from '$lib/components/InputTransformSchemaForm.svelte' let hideOptional = false @@ -75,9 +76,8 @@ {m.id} - ('FlowEditorContext') @@ -225,9 +226,8 @@ pickableProperties={stepPropPicker.pickableProperties} error={failureModule} > - & { data: AppComponent } } } - export default class Grid extends SvelteComponentTyped, {}, Slots> {} + export default class Grid extends SvelteComponentTyped, {}, Slots> { } } declare module '@windmill-labs/svelte-grid/build/helper/index.mjs' {