diff --git a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte index 4fcd951a96..e46b843351 100644 --- a/frontend/src/lib/components/apps/components/helpers/InputValue.svelte +++ b/frontend/src/lib/components/apps/components/helpers/InputValue.svelte @@ -7,7 +7,13 @@ TemplateV2Input, UploadAppInput } from '../../inputType' - import type { AppViewerContext, GroupContext, ListContext, RichConfiguration } from '../../types' + import type { + AppEditorContext, + AppViewerContext, + GroupContext, + ListContext, + RichConfiguration + } from '../../types' import { accessPropertyByPath } from '../../utils' import { computeGlobalContext, eval_like } from './eval' import deepEqualWithOrderedArray from './deepEqualWithOrderedArray' @@ -21,8 +27,10 @@ export let id: string | undefined = undefined export let error: string = '' export let key: string = '' + export let field: string = key const { componentControl, runnableComponents } = getContext('AppViewerContext') + const { evalPreview } = getContext('AppEditorContext') const iterContext = getContext('ListWrapperContext') const rowContext = getContext('RowWrapperContext') @@ -138,6 +146,12 @@ const debounceEval = async () => { let nvalue = await evalExpr(lastInput as EvalAppInput) + if (field) { + evalPreview.update((x) => { + x[`${id}.${field}`] = nvalue + return x + }) + } if (!deepEqual(nvalue, value)) { if ( typeof nvalue == 'string' || diff --git a/frontend/src/lib/components/apps/components/helpers/ResolveConfig.svelte b/frontend/src/lib/components/apps/components/helpers/ResolveConfig.svelte index ced01cfec9..e08e82fafc 100644 --- a/frontend/src/lib/components/apps/components/helpers/ResolveConfig.svelte +++ b/frontend/src/lib/components/apps/components/helpers/ResolveConfig.svelte @@ -22,6 +22,7 @@ {#each Object.keys(configuration.configuration?.[choice] ?? {}) as nestedKey (nestedKey)} {#if resolvedConfig.configuration?.[choice] != undefined} + {/if} diff --git a/frontend/src/lib/components/apps/components/helpers/ResolveStyle.svelte b/frontend/src/lib/components/apps/components/helpers/ResolveStyle.svelte index 2e92782290..8f845b7cb7 100644 --- a/frontend/src/lib/components/apps/components/helpers/ResolveStyle.svelte +++ b/frontend/src/lib/components/apps/components/helpers/ResolveStyle.svelte @@ -53,6 +53,7 @@ {@const property = customCss[key]} {#if property?.evalClass} ('AppEditorContext', { yTop, + evalPreview: writable({}), componentActive, dndItem: writable({}), refreshComponents: writable(undefined), diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/CssEval.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/CssEval.svelte index 7742608d88..a994522bd9 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/CssEval.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/CssEval.svelte @@ -4,6 +4,7 @@ import InputsSpecEditor from '../settingsPanel/InputsSpecEditor.svelte' export let evalClass: RichConfiguration + export let key: string const { selectedComponent } = getContext('AppViewerContext') @@ -26,6 +27,6 @@ selectOptions={undefined} subFieldType={undefined} allowTypeChange={false} - key="" + {key} /> {/if} diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte b/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte index 07d986299b..6cddad39c1 100644 --- a/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte +++ b/frontend/src/lib/components/apps/editor/componentsPanel/CssProperty.svelte @@ -246,7 +246,7 @@ /> {#if value?.evalClass && dynamicClass} - + {/if} {/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte index d14822b67b..4194c13a9b 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte @@ -221,14 +221,16 @@ - - {#if subFieldType === 'table-column'} + {#if subFieldType === 'table-column' || subFieldType == 'ag-grid'} item.field)} on:add={({ detail }) => { if (!componentInput.value) componentInput.value = [] - - componentInput.value.push({ field: detail, headerName: detail, type: 'text' }) + if (subFieldType === 'table-column') { + componentInput.value.push({ field: detail, headerName: detail, type: 'text' }) + } else if (subFieldType === 'ag-grid') { + componentInput.value.push({ field: detail, headerName: detail, flex: 1 }) + } componentInput = componentInput if (componentInput.value) { diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 1fcecc1c59..5371267b56 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -263,6 +263,7 @@ /> {:else if componentSettings.item.data.componentInput.type === 'evalv2' && component.componentInput !== undefined} {:else if componentInput?.type === 'evalv2'} - + {:else if componentInput?.type === 'upload'} {:else if componentInput?.type === 'user'} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte index af27d9fc00..9513854eac 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/QuickAddColumn.svelte @@ -33,7 +33,7 @@ } function updateRemainingColumns(result: any[], columns: string[]) { - if (result?.length > 0) { + if (Array.isArray(result) && result?.length > 0) { const allKeysSet: Set = result.reduce((acc, obj) => { Object.keys(obj).forEach((key) => acc.add(key)) return acc diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte index 5b469aacd0..31dce75230 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/inputEditor/EvalV2InputEditor.svelte @@ -2,17 +2,21 @@ import type { EvalV2AppInput } from '../../../inputType' import { getContext } from 'svelte' - import type { AppViewerContext } from '$lib/components/apps/types' + import type { AppEditorContext, AppViewerContext } from '$lib/components/apps/types' import SimpleEditor from '$lib/components/SimpleEditor.svelte' import { buildExtraLib } from '$lib/components/apps/utils' import { inferDeps } from '../../appUtilsInfer' import { Maximize2 } from 'lucide-svelte' import { Drawer } from '$lib/components/common' + import { Highlight } from 'svelte-highlight' + import { json } from 'svelte-highlight/languages' export let componentInput: EvalV2AppInput | undefined export let id: string + export let field: string const { onchange, worldStore, state, app } = getContext('AppViewerContext') + const { evalPreview } = getContext('AppEditorContext') let editor: SimpleEditor export function setCode(code: string) { @@ -43,6 +47,7 @@ } let fullscreen = false + let focus = false {#if componentInput?.type === 'evalv2'} @@ -75,6 +80,12 @@ shouldBindKey={false} {extraLib} autoHeight + on:focus={() => { + focus = true + }} + on:blur={() => { + focus = false + }} on:change={async (e) => { if (onchange) { onchange() @@ -86,10 +97,24 @@ class="border bg-surface absolute top-0.5 right-2 p-0.5" on:click={() => (fullscreen = true)}> + {#if focus} +
+
+ +
+
+ {/if} {:else}
{componentInput.expr}
{/if} + {#if componentInput?.expr && componentInput.expr != '' && componentInput.expr .trim() diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index 0794704e40..398e262492 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -259,6 +259,7 @@ export type AppViewerContext = { export type AppEditorContext = { yTop: Writable + evalPreview: Writable> componentActive: Writable dndItem: Writable void>> refreshComponents: Writable<(() => void) | undefined> diff --git a/frontend/src/lib/components/apps/utils.ts b/frontend/src/lib/components/apps/utils.ts index 71933f9817..e88e235b02 100644 --- a/frontend/src/lib/components/apps/utils.ts +++ b/frontend/src/lib/components/apps/utils.ts @@ -183,7 +183,7 @@ declare async function goto(path: string, newTab?: boolean): Promise; * @param id component's id * @param index index of the tab to set */ -declare function setTab(id: string, index: string): void; +declare function setTab(id: string, index: number): void; /** recompute a component's runnable or background runnable * @param id component's id @@ -247,7 +247,7 @@ declare const state: ${JSON.stringify(state)}; declare const iter: {index: number, value: any}; /** The row within the context of a table */ -declare const row: Record; +declare const row: {index: number, value: Record, disabled: boolean}; /** The group fields within the context of a container's group */ declare const group: Record;