diff --git a/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte b/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte index 43db70a0fd..4975a254eb 100644 --- a/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte +++ b/frontend/src/lib/components/apps/components/display/dbtable/AppDbExplorer.svelte @@ -64,6 +64,10 @@ lastTable = undefined } + clearColumnDefs() + } + + function clearColumnDefs() { const gridItem = findGridItem($app, id) if (!gridItem) { @@ -445,6 +449,11 @@ state = undefined + // If in the mean time the table has changed, we don't want to update the columnDefs + if (lastTable !== table) { + return + } + //@ts-ignore gridItem.data.configuration.columnDefs = { value: ncols, type: 'static', loading: false } gridItem.data = gridItem.data @@ -669,6 +678,11 @@ on:update={onUpdate} on:delete={onDelete} allowColumnDefsActions={false} + on:recompute={() => { + lastTable = undefined + clearColumnDefs() + listColumnsIfAvailable() + }} {actions} /> {/key} diff --git a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte index 59879c083b..95d1ea636e 100644 --- a/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte +++ b/frontend/src/lib/components/apps/components/display/table/AppAggridExplorerTable.svelte @@ -301,6 +301,9 @@ agGrid: { api: e.api, columnApi: e.columnApi }, setSelectedIndex: (index) => { e.api.getRowNode(index.toString())?.setSelected(true) + }, + recompute: () => { + dispatch('recompute') } } api = e.api diff --git a/frontend/src/lib/components/apps/editor/DecisionTreeDebug.svelte b/frontend/src/lib/components/apps/editor/DecisionTreeDebug.svelte index ec4cdc47b3..d2c525aecc 100644 --- a/frontend/src/lib/components/apps/editor/DecisionTreeDebug.svelte +++ b/frontend/src/lib/components/apps/editor/DecisionTreeDebug.svelte @@ -17,95 +17,127 @@ let currentNodeId: string = $worldStore.outputsById[id]?.currentNodeId?.peak() ?? 'a' - $worldStore.outputsById[id]?.currentNodeId?.subscribe( - { - id: id, - next: (value) => { - currentNodeId = value - } - }, - currentNodeId - ) - - $: if (nodes[$debuggingComponents[id] ?? 0]?.id === undefined) { - currentNodeId = '' - $componentControl?.[id]?.setTab?.(0) - - $debuggingComponents = Object.fromEntries( - Object.entries($debuggingComponents).filter(([key]) => key !== id) + function subscribeToCurrentNode(id: string) { + return $worldStore.outputsById[id]?.currentNodeId?.subscribe( + { + id: `id-${id}-${currentNodeId}`, + next: (value) => { + currentNodeId = value + } + }, + currentNodeId ) } + + let subscription = subscribeToCurrentNode(id) + + function onDebugNode(debuggedNodeIndex: number | undefined) { + if (debuggedNodeIndex === undefined) { + return + } + + if (debuggedNodeIndex !== undefined && nodes[debuggedNodeIndex]?.id === undefined) { + currentNodeId = nodes[0]?.id ?? '' + $componentControl?.[id]?.setTab?.(0) + + $debuggingComponents = Object.fromEntries( + Object.entries($debuggingComponents).filter(([key]) => key !== id) + ) + } + } + + $: onDebugNode($debuggingComponents[id]) + + let renderCount: number = 0 + let lastNodes: DecisionTreeNode[] = nodes + + function onNodesChange(newNodes: DecisionTreeNode[]) { + if (JSON.stringify(newNodes) !== JSON.stringify(lastNodes)) { + lastNodes = newNodes + + if (subscription) { + subscription?.() + } + subscription = subscribeToCurrentNode(id) + + renderCount++ + } + } + + $: onNodesChange(nodes) - + + {:else} + {`Debug nodes (current node: ${currentNodeId})`} + {/if} + + + + {#each nodes ?? [] as node, index} + { + $componentControl?.[id]?.setTab?.(index) + + $debuggingComponents[id] = index + }} + > +
- - -
- {:else} - {`Debug nodes (current node: ${currentNodeId})`} - {/if} - -
- - {#each nodes ?? [] as node, index} + {`Debug node ${node.label}`} + + + {/each} { - $componentControl?.[id]?.setTab?.(index) + $componentControl?.[id]?.setTab?.(0) - $debuggingComponents[id] = index + $debuggingComponents = Object.fromEntries( + Object.entries($debuggingComponents).filter(([key]) => key !== id) + ) }} >
- {`Debug node ${node.label}`} + {`Reset debug mode`}
- {/each} - { - $componentControl?.[id]?.setTab?.(0) - - $debuggingComponents = Object.fromEntries( - Object.entries($debuggingComponents).filter(([key]) => key !== id) - ) - }} - > -
- {`Reset debug mode`} -
-
-
- - + + + +{/key} diff --git a/frontend/src/lib/components/apps/editor/component/default-codes.ts b/frontend/src/lib/components/apps/editor/component/default-codes.ts index f304be66d3..2ec82a1040 100644 --- a/frontend/src/lib/components/apps/editor/component/default-codes.ts +++ b/frontend/src/lib/components/apps/editor/component/default-codes.ts @@ -115,9 +115,9 @@ export async function main(db: Postgresql) { email: string; created_at: string; }; - const GLOBAL_COUNT = 25000; +const GLOBAL_COUNT = 25000; - function getUsers(limit: number, offset: number): User[] { +function getUsers(limit: number, offset: number): User[] { if (offset > GLOBAL_COUNT) { return [] @@ -130,28 +130,28 @@ export async function main(db: Postgresql) { email: \`user\${offset + index}@example.com\`, created_at: new Date().toISOString(), })); - } +} - export async function main(offset: number, limit: number, orderBy: string, isDesc: boolean, search: string): Promise { +export async function main(offset: number, limit: number, orderBy: string, isDesc: boolean, search: string): Promise { let users = getUsers(limit, offset); if (orderBy && Object.keys(users[0]).includes(orderBy)) { users.sort((a, b) => { - const aValue = a[orderBy as keyof User]; - const bValue = b[orderBy as keyof User]; + const aValue = a[orderBy as keyof User]; + const bValue = b[orderBy as keyof User]; - if (typeof aValue === 'string' && typeof bValue === 'string') { - return isDesc ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue); - } - return 0; + if (typeof aValue === 'string' && typeof bValue === 'string') { + return isDesc ? bValue.localeCompare(aValue) : aValue.localeCompare(bValue); + } + return 0; }); } if (search) { return users.filter(user => - Object.values(user).some(value => - typeof value === 'string' && value.toLowerCase().includes(search.toLowerCase()) - ) + Object.values(user).some(value => + typeof value === 'string' && value.toLowerCase().includes(search.toLowerCase()) + ) ); } diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte index 494702d7fa..093b2a49a6 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ArrayStaticInputEditor.svelte @@ -8,6 +8,7 @@ import { generateRandomString, pluralize } from '$lib/utils' import Toggle from '$lib/components/Toggle.svelte' import QuickAddColumn from './QuickAddColumn.svelte' + import RefreshDatabaseStudioTable from './RefreshDatabaseStudioTable.svelte' export let componentInput: StaticInput & { loading?: boolean } export let subFieldType: InputType | undefined = undefined @@ -192,11 +193,23 @@ componentInput.value = reorderedValues } - let items = (Array.isArray(componentInput.value) ? componentInput.value : []) - .filter((x) => x != undefined) - .map((item, index) => { - return { value: item, id: generateRandomString() } - }) + let items = getItems(componentInput) + + function getItems(componentInput: StaticInput & { loading?: boolean }) { + return (Array.isArray(componentInput.value) ? componentInput.value : []) + .filter((x) => x != undefined) + .map((item) => { + return { value: item, id: generateRandomString() } + }) + } + + function clearTableOnComponentReset(value: any[] | undefined) { + if (Array.isArray(value) && value.length === 0 && items.length > 0) { + items = [] + } + } + + $: subFieldType === 'db-explorer' && clearTableOnComponentReset(componentInput?.value) $: items != undefined && handleItemsChange() @@ -287,11 +300,14 @@ {/if} {#if subFieldType === 'db-explorer'} {#if componentInput.loading} -
- - Loading columns defintions... +
+
+ + Loading columns defintions... +
{/if} + {/if} {#if subFieldType !== 'db-explorer'} +{/if} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte index 881902abca..c9b808d166 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/decisionTree/DecisionTreePreview.svelte @@ -222,13 +222,18 @@ } case 'delete': { - const graphhNodeIndex = nodes.findIndex((node) => node.id == graphNode?.id) + const graphNodeIndex = nodes.findIndex((node) => node.id == graphNode?.id) - if (graphhNodeIndex > -1) { - deleteSubgrid(graphhNodeIndex) + if (graphNodeIndex > -1) { + deleteSubgrid(graphNodeIndex) } nodes = removeNode(nodes, graphNode) + + $debuggingComponents = Object.fromEntries( + Object.entries($debuggingComponents).filter(([key]) => key !== component.id) + ) + break } case 'addBranch': { diff --git a/frontend/src/lib/components/apps/types.ts b/frontend/src/lib/components/apps/types.ts index eaa32bc70d..1c491ec48a 100644 --- a/frontend/src/lib/components/apps/types.ts +++ b/frontend/src/lib/components/apps/types.ts @@ -259,6 +259,7 @@ export type AppViewerContext = { validateAll?: () => void clearFiles?: () => void showToast?: (message: string, error?: boolean) => void + recompute?: () => void } > >