支持关闭标签页
This commit is contained in:
@@ -446,7 +446,83 @@ const onTabChange = async (data) => {
|
||||
|
||||
const onTabClose = async (data) => {
|
||||
try {
|
||||
await tabPageActions.requestClose(data.tabPageId, data.areaId);
|
||||
// 适配数据结构:从data.id获取Panel ID
|
||||
const panelId = data.id;
|
||||
if (!panelId) {
|
||||
console.error('Tab close event missing panelId');
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`📋 处理标签页关闭事件:`, { data, panelId });
|
||||
|
||||
// 1. 查找包含该Panel的Area
|
||||
let targetArea = null;
|
||||
let targetTabPage = null;
|
||||
let panelIndex = -1;
|
||||
let areaId = null;
|
||||
|
||||
for (const area of floatingAreas.value) {
|
||||
if (area.children && area.children.type === 'TabPage') {
|
||||
const tabPage = area.children;
|
||||
if (tabPage.children) {
|
||||
const childrenArray = Array.isArray(tabPage.children) ? tabPage.children : [tabPage.children];
|
||||
const index = childrenArray.findIndex(child => child.id === panelId);
|
||||
|
||||
if (index !== -1) {
|
||||
targetArea = area;
|
||||
targetTabPage = tabPage;
|
||||
panelIndex = index;
|
||||
areaId = area.id;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!targetArea || !targetTabPage || !areaId) {
|
||||
console.error(`❌ 找不到包含Panel ${panelId}的Area`);
|
||||
return;
|
||||
}
|
||||
|
||||
const tabPageId = targetTabPage.id || `tabPage-${areaId}`;
|
||||
|
||||
console.log(`✅ 找到目标Area和TabPage:`, { areaId, tabPageId, panelId });
|
||||
|
||||
// 2. 调用TabPageActions处理关闭请求
|
||||
await tabPageActions.requestClose(tabPageId, areaId);
|
||||
|
||||
// 3. 移除Panel
|
||||
if (Array.isArray(targetTabPage.children)) {
|
||||
targetTabPage.children.splice(panelIndex, 1);
|
||||
console.log(`📌 从TabPage移除Panel后,剩余Panel数量: ${targetTabPage.children.length}`);
|
||||
} else {
|
||||
targetTabPage.children = null;
|
||||
console.log(`📌 移除了唯一的Panel`);
|
||||
}
|
||||
|
||||
// 4. 如果TabPage没有子元素了,移除整个TabPage
|
||||
if (!targetTabPage.children || (Array.isArray(targetTabPage.children) && targetTabPage.children.length === 0)) {
|
||||
// 从Area的children中移除TabPage
|
||||
targetArea.children = null;
|
||||
console.log(`📌 TabPage已无Panel,移除TabPage`);
|
||||
}
|
||||
|
||||
// 5. 更新floatingAreas中的Area配置
|
||||
const areaIndex = floatingAreas.value.findIndex(a => a.id === areaId);
|
||||
if (areaIndex !== -1) {
|
||||
floatingAreas.value[areaIndex] = { ...targetArea };
|
||||
console.log(`📌 更新floatingAreas中的Area配置`);
|
||||
|
||||
// 6. 触发Area更新事件,确保状态同步
|
||||
areaActions.updateState(areaId, { children: targetArea.children });
|
||||
console.log(`📌 触发Area更新事件`);
|
||||
|
||||
// 7. 调用PanelHandler的close方法回收Panel资源
|
||||
panelActions.close(panelId, areaId);
|
||||
console.log(`📌 调用PanelHandler回收Panel资源`);
|
||||
|
||||
console.log(`✅ 成功移除标签页和回收Panel: areaId=${areaId}, panelId=${panelId}`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to handle tab close:', error);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user