From f92d3ca474359e941b05f78b2bd316e3b6da1926 Mon Sep 17 00:00:00 2001 From: zqm Date: Thu, 20 Nov 2025 09:44:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=85=B3=E9=97=AD=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E6=8E=A5=E5=85=A5=E6=80=BB=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Windows/Robot/Web/src/DockLayout/Area.vue | 50 ++++- .../Robot/Web/src/DockLayout/Panel.vue | 175 +++++++++++++++--- .../Robot/Web/src/DockLayout/ToDoList.md | 5 + .../Robot/Web/src/DockLayout/eventBus.js | 2 +- 4 files changed, 202 insertions(+), 30 deletions(-) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue index defb9e7..70e12a6 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue @@ -586,9 +586,27 @@ const mergeAreaContent = (sourceArea) => { // 4.2.1 如果目标Area内容区为空,将源Area内容区的子组件添加到目标Area内容区 // console.log('[Area] 目标Area为空,添加源Area的子组件') - // 处理源Area的所有tabPages - if (sourceArea.tabPages && sourceArea.tabPages.length > 0) { - sourceArea.tabPages.forEach((tabPage, tabIndex) => { + // 处理源Area的所有tabPages(支持两种模式:tabPages和children) + let tabPagesData = [] + + if (sourceArea.tabPages && Array.isArray(sourceArea.tabPages)) { + // 模式1:直接tabPages结构 + tabPagesData = sourceArea.tabPages + } else if (sourceArea.children && Array.isArray(sourceArea.children)) { + // 模式2:children结构,需要遍历查找TabPage类型 + for (const child of sourceArea.children) { + if (child.type === 'TabPage' && child.children && child.children.type === 'Panel') { + tabPagesData.push({ + id: child.id, + title: child.title, + panels: child.children.items || [] + }) + } + } + } + + if (tabPagesData.length > 0) { + tabPagesData.forEach((tabPage, tabIndex) => { // 保持原有的tabPage ID,确保Vue组件状态连续性 const tabPageId = `merged-tabpage-${tabPage.id}` const newPanels = (tabPage.panels || []).map((panel, panelIndex) => { @@ -637,9 +655,27 @@ const mergeAreaContent = (sourceArea) => { return false } - // 处理源Area的所有tabPages - if (sourceArea.tabPages && sourceArea.tabPages.length > 0) { - sourceArea.tabPages.forEach((sourceTabPage, tabIndex) => { + // 处理源Area的所有tabPages(支持两种模式:tabPages和children) + let tabPagesData = [] + + if (sourceArea.tabPages && Array.isArray(sourceArea.tabPages)) { + // 模式1:直接tabPages结构 + tabPagesData = sourceArea.tabPages + } else if (sourceArea.children && Array.isArray(sourceArea.children)) { + // 模式2:children结构,需要遍历查找TabPage类型 + for (const child of sourceArea.children) { + if (child.type === 'TabPage' && child.children && child.children.type === 'Panel') { + tabPagesData.push({ + id: child.id, + title: child.title, + panels: child.children.items || [] + }) + } + } + } + + if (tabPagesData.length > 0) { + tabPagesData.forEach((sourceTabPage, tabIndex) => { if (sourceTabPage && sourceTabPage.panels) { // 保持原有Panel ID不变,避免Vue组件重新创建和状态丢失 const newPanels = sourceTabPage.panels.map((panel, panelIndex) => { @@ -664,7 +700,7 @@ const mergeAreaContent = (sourceArea) => { targetAreaId: props.id, targetAreaHasContent: true, // 目标Area已有内容 operation: 'merge-tabpages', - sourceTabPages: sourceArea.tabPages || [] + sourceTabPages: tabPagesData }) // 更新完成 // // console.log(`[Area] 合并完成,现有TabPage共有 ${existingTabPage.tabPage.panels.length} 个Panel`) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/Panel.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/Panel.vue index 991b60b..40fffdd 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/Panel.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/Panel.vue @@ -1,6 +1,7 @@