diff --git a/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte b/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte index 2c6d5c0df9..2769b03c59 100644 --- a/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte +++ b/frontend/src/lib/components/apps/editor/contextPanel/ContextPanel.svelte @@ -2,6 +2,7 @@ import { classNames } from '$lib/utils' import { getContext } from 'svelte' import type { AppEditorContext } from '../../types' + import { findParent } from '../../utils' import { components } from '../component' import PanelSection from '../settingsPanel/common/PanelSection.svelte' import ComponentOutputViewer from './ComponentOutputViewer.svelte' @@ -26,7 +27,7 @@ } function getComponentNameById(componentId: string) { - const component = $app.grid.find((c) => c?.data?.id === componentId) + const component = findParent($app.grid, componentId) if (component?.data.type) { return components[component?.data.type].name diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index 15d0d9f88f..5ecae773e3 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -13,6 +13,7 @@ import { buildExtraLib, createNewGridItem, + deleteComponent, fieldTypeToTsType, findParent, getNextGridItemId, @@ -65,34 +66,12 @@ function removeGridElement() { $selectedComponent = undefined if (component) { - if (gridItems) { - gridItems = gridItems.filter((gridComponent) => gridComponent.data.id !== component?.id) - } - - delete $staticOutputs[component.id] - $staticOutputs = $staticOutputs - - delete $runnableComponents[component.id] - $runnableComponents = $runnableComponents - - if ( - component.componentInput?.type === 'runnable' && - component.componentInput?.runnable?.type === 'runnableByName' - ) { - const { name, inlineScript } = component.componentInput.runnable - - if (inlineScript) { - if (!$app.unusedInlineScripts) { - $app.unusedInlineScripts = [] - } - - $app.unusedInlineScripts.push({ - name, - inlineScript - }) - } - } + deleteComponent(gridItems, component, $app, $staticOutputs, $runnableComponents) } + gridItems = gridItems + $staticOutputs = $staticOutputs + $runnableComponents = $runnableComponents + onDelete?.() } @@ -197,7 +176,7 @@ {/if} {#if component.type === 'tabscomponent' && Array.isArray(component.subGrids)} - + {/if} {#if component.type === 'tablecomponent' && Array.isArray(component.actionButtons)} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte index 779416c01e..d7377a6adc 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/GridTab.svelte @@ -1,28 +1,31 @@ @@ -52,10 +55,7 @@ color="light" variant="border" on:click={() => { - tabs.splice(index, 1) - subGrids.splice(index, 1) - tabs = tabs - subGrids = subGrids + deleteSubgrid(index) }} iconOnly btnClasses="!text-red-500" diff --git a/frontend/src/lib/components/apps/utils.ts b/frontend/src/lib/components/apps/utils.ts index 74fd33a75a..48621ebd99 100644 --- a/frontend/src/lib/components/apps/utils.ts +++ b/frontend/src/lib/components/apps/utils.ts @@ -16,6 +16,45 @@ import type { Output } from './rx' import type { App, GridItem } from './types' import { getNextId } from '../flows/flowStateUtils' +export function deleteComponent(parentItems: GridItem[] | undefined, component: AppComponent, app: App, staticOutputs: Record, runnableComponents: Record) { + (component.subGrids ?? []).forEach((subgrid) => { + if (subgrid) { + subgrid.forEach((item) => { + if (item.data) { + deleteComponent(undefined, item.data, app, staticOutputs, runnableComponents) + } + }) + } + }) + + if (parentItems) { + let index = parentItems.findIndex((item) => item.data?.id === component.id) + if (index != -1) { + parentItems.splice(index, 1) + } + } + + delete staticOutputs[component.id] + delete runnableComponents[component.id] + + if ( + component.componentInput?.type === 'runnable' && + component.componentInput?.runnable?.type === 'runnableByName' + ) { + const { name, inlineScript } = component.componentInput.runnable + + if (inlineScript) { + if (!app.unusedInlineScripts) { + app.unusedInlineScripts = [] + } + + app.unusedInlineScripts.push({ + name, + inlineScript + }) + } + } +} export async function loadSchema( workspace: string, path: string,