支持关闭标签页
This commit is contained in:
@@ -446,7 +446,83 @@ const onTabChange = async (data) => {
|
|||||||
|
|
||||||
const onTabClose = async (data) => {
|
const onTabClose = async (data) => {
|
||||||
try {
|
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) {
|
} catch (error) {
|
||||||
console.error('Failed to handle tab close:', error);
|
console.error('Failed to handle tab close:', error);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -182,22 +182,36 @@ class PanelEventHandler {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 关闭Panel
|
||||||
|
*/
|
||||||
|
async close(panelId, areaId, options = {}) {
|
||||||
|
const { priority = 1 } = options
|
||||||
|
|
||||||
|
console.log(`[PanelHandler] 关闭Panel: ${panelId}, areaId: ${areaId}`)
|
||||||
|
|
||||||
|
// 执行关闭操作
|
||||||
|
return this._executeClose(panelId, areaId)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行Panel关闭
|
* 执行Panel关闭
|
||||||
*/
|
*/
|
||||||
async _executeClose(panelId) {
|
async _executeClose(panelId, areaId) {
|
||||||
console.log(`[PanelHandler] 执行Panel关闭: ${panelId}`)
|
console.log(`[PanelHandler] 执行Panel关闭: ${panelId}, areaId: ${areaId}`)
|
||||||
|
|
||||||
// 更新状态
|
// 更新状态
|
||||||
const panelState = this.panelStates.get(panelId)
|
const panelState = this.panelStates.get(panelId)
|
||||||
if (panelState) {
|
if (panelState) {
|
||||||
panelState.closed = true
|
panelState.closed = true
|
||||||
panelState.closedAt = Date.now()
|
panelState.closedAt = Date.now()
|
||||||
|
panelState.areaId = areaId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发关闭事件
|
// 触发关闭事件
|
||||||
await emitEvent(PANEL_EVENT_TYPES.CLOSE, {
|
await emitEvent(PANEL_EVENT_TYPES.CLOSE, {
|
||||||
panelId,
|
panelId,
|
||||||
|
areaId,
|
||||||
source: 'PanelHandler',
|
source: 'PanelHandler',
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
})
|
})
|
||||||
@@ -206,6 +220,7 @@ class PanelEventHandler {
|
|||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
emitEvent(PANEL_EVENT_TYPES.CLOSED, {
|
emitEvent(PANEL_EVENT_TYPES.CLOSED, {
|
||||||
panelId,
|
panelId,
|
||||||
|
areaId,
|
||||||
source: 'PanelHandler',
|
source: 'PanelHandler',
|
||||||
timestamp: Date.now()
|
timestamp: Date.now()
|
||||||
})
|
})
|
||||||
@@ -838,6 +853,7 @@ export const panelActions = {
|
|||||||
toggleCollapse: (panelId, options) => panelHandler.toggleCollapse(panelId, options),
|
toggleCollapse: (panelId, options) => panelHandler.toggleCollapse(panelId, options),
|
||||||
maximize: (panelId, options) => panelHandler.maximize(panelId, options),
|
maximize: (panelId, options) => panelHandler.maximize(panelId, options),
|
||||||
restore: (panelId, options) => panelHandler.restore(panelId, options),
|
restore: (panelId, options) => panelHandler.restore(panelId, options),
|
||||||
|
close: (panelId, areaId, options) => panelHandler.close(panelId, areaId, options),
|
||||||
requestClose: (panelId, options) => panelHandler.requestClose(panelId, options),
|
requestClose: (panelId, options) => panelHandler.requestClose(panelId, options),
|
||||||
toggleToolbar: (panelId, options) => panelHandler.toggleToolbar(panelId, options),
|
toggleToolbar: (panelId, options) => panelHandler.toggleToolbar(panelId, options),
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user