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,