修复bug,统一事件定义

This commit is contained in:
zqm
2026-01-15 14:28:29 +08:00
parent 8a2b07d36f
commit dd421b5d1e
4 changed files with 108 additions and 51 deletions

View File

@@ -764,7 +764,7 @@ const onToggleMaximize = () => {
}) })
} }
const onClose = () => emitEvent(EVENT_TYPES.PANEL_CLOSE_REQUEST, { const onClose = () => emitEvent(EVENT_TYPES.AREA_CLOSE_REQUEST, {
areaId: props.id areaId: props.id
}, { }, {
source: { component: 'Area', areaId: props.id } source: { component: 'Area', areaId: props.id }

View File

@@ -58,7 +58,7 @@ import DockIndicator from './DockIndicator.vue';
import ResizeBar from './ResizeBar.vue'; import ResizeBar from './ResizeBar.vue';
import Render from './Render.vue'; import Render from './Render.vue';
import { zIndexManager } from './dockLayers'; import { zIndexManager } from './dockLayers';
import { eventBus, EVENT_TYPES } from './eventBus'; import { eventBus, EVENT_TYPES, emitEvent } from './eventBus';
import { areaActions } from './handlers/AreaHandler'; import { areaActions } from './handlers/AreaHandler';
import { dragStateActions } from './handlers/DragStateManager'; import { dragStateActions } from './handlers/DragStateManager';
import { panelActions } from './handlers/PanelHandler'; import { panelActions } from './handlers/PanelHandler';
@@ -349,6 +349,71 @@ const onPanelClose = (event) => {
} }
}; };
// 处理Area关闭请求事件
const onAreaCloseRequest = (event) => {
const { areaId } = event;
// 查找要关闭的Area
const areaIndex = floatingAreas.value.findIndex(a => a.id === areaId);
if (areaIndex === -1) {
console.error(`❌ 找不到要关闭的Area: ${areaId}`);
return;
}
const area = floatingAreas.value[areaIndex];
// 1. 处理Area下的所有子组件
if (area.children) {
const areaChildrenArray = Array.isArray(area.children) ? area.children : [area.children];
areaChildrenArray.forEach((child, childIndex) => {
if (child.type === 'TabPage') {
// 2. 处理TabPage下的所有Panel
if (child.children) {
const tabChildrenArray = Array.isArray(child.children) ? child.children : [child.children];
// 3. 遍历并关闭每个Panel
tabChildrenArray.forEach(panel => {
if (panel.type === 'Panel' && panel.id) {
try {
// 4. 关闭Panel资源异步执行
panelActions.close(panel.id, areaId);
// 注意panelActions.close内部已经会发送PANEL_CLOSED事件不需要手动发送
} catch (error) {
console.error(`❌ 关闭Panel ${panel.id}失败:`, error);
// 继续处理下一个Panel避免单个Panel关闭失败导致整个流程中断
}
}
});
// 6. 清理TabPage的children引用
child.children = [];
}
// 7. 从Area中移除TabPage
if (Array.isArray(area.children)) {
area.children.splice(childIndex, 1);
} else {
area.children = null;
}
}
});
}
// 8. 关闭Area资源此时Area的children已清空
areaActions.closeFloating(areaId);
// 9. 从floatingAreas中移除Area
floatingAreas.value.splice(areaIndex, 1);
// 10. 发送Area关闭事件
emitEvent(EVENT_TYPES.AREA_CLOSED, {
areaId: areaId
});
console.log(`✅ 成功关闭Area及其所有子组件: ${areaId}`);
};
// 简单的拖拽事件处理 // 简单的拖拽事件处理
const handleMainAreaDragOver = (event) => { const handleMainAreaDragOver = (event) => {
event.preventDefault(); event.preventDefault();
@@ -726,6 +791,7 @@ const setupEventListeners = () => {
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_DRAG_LEAVE, handleAreaDragLeave, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_DRAG_LEAVE, handleAreaDragLeave, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_MERGE_REQUEST, handleAreaMergeRequest, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_MERGE_REQUEST, handleAreaMergeRequest, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_UPDATED, onAreaUpdated, { componentId: 'dock-layout' })); unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_UPDATED, onAreaUpdated, { componentId: 'dock-layout' }));
unsubscribeFunctions.push(eventBus.on(EVENT_TYPES.AREA_CLOSE_REQUEST, onAreaCloseRequest, { componentId: 'dock-layout' }));

View File

@@ -102,6 +102,8 @@ export const EVENT_TYPES = {
AREA_DESTROYED: 'area.destroyed', AREA_DESTROYED: 'area.destroyed',
AREA_UPDATED: 'area.updated', AREA_UPDATED: 'area.updated',
AREA_ERROR: 'area.error', AREA_ERROR: 'area.error',
AREA_CLOSED: 'area.closed',
AREA_CLOSE_REQUEST: 'area.close.request',
// 浮动区域管理 // 浮动区域管理
AREA_FLOATING_CREATE: 'area.floating.create', AREA_FLOATING_CREATE: 'area.floating.create',
@@ -145,6 +147,9 @@ export const EVENT_TYPES = {
PANEL_MAXIMIZE_SYNC: 'panel.maximize.sync', PANEL_MAXIMIZE_SYNC: 'panel.maximize.sync',
PANEL_MAXIMIZE: 'panel.maximize', PANEL_MAXIMIZE: 'panel.maximize',
PANEL_COLLAPSE: 'panel.collapse',
PANEL_EXPAND: 'panel.expand',
PANEL_RESTORE: 'panel.restore',
PANEL_CLOSE: 'panel.close', PANEL_CLOSE: 'panel.close',
PANEL_CLOSE_REQUEST: 'panel.close.request', PANEL_CLOSE_REQUEST: 'panel.close.request',
PANEL_CLOSED: 'panel.closed', PANEL_CLOSED: 'panel.closed',
@@ -160,6 +165,8 @@ export const EVENT_TYPES = {
PANEL_RESIZE_START: 'panel.resize.start', PANEL_RESIZE_START: 'panel.resize.start',
PANEL_RESIZE_MOVE: 'panel.resize.move', PANEL_RESIZE_MOVE: 'panel.resize.move',
PANEL_RESIZE_END: 'panel.resize.end', PANEL_RESIZE_END: 'panel.resize.end',
PANEL_ACTIVATED: 'panel.activated',
PANEL_DEACTIVATED: 'panel.deactivated',
PANEL_DRAG_START_FROM_TABPAGE: 'panel.drag.start.fromTabPage', PANEL_DRAG_START_FROM_TABPAGE: 'panel.drag.start.fromTabPage',
PANEL_DRAG_MOVE_FROM_TABPAGE: 'panel.drag.move.fromTabPage', PANEL_DRAG_MOVE_FROM_TABPAGE: 'panel.drag.move.fromTabPage',
PANEL_DRAG_END_FROM_TABPAGE: 'panel.drag.end.fromTabPage', PANEL_DRAG_END_FROM_TABPAGE: 'panel.drag.end.fromTabPage',

View File

@@ -1,21 +1,5 @@
import { nanoid } from 'nanoid' import { nanoid } from 'nanoid'
import { emitEvent, onEvent, onceEvent, registerHandler, unregisterHandler, getHandlerSnapshot } from '../eventBus' import { emitEvent, onEvent, onceEvent, registerHandler, unregisterHandler, getHandlerSnapshot, EVENT_TYPES } from '../eventBus'
// Panel事件类型常量
export const PANEL_EVENT_TYPES = {
TOGGLE_COLLAPSE: 'panel.toggleCollapse',
MAXIMIZE: 'panel.maximize',
CLOSE_REQUEST: 'panel.close.request',
CLOSE: 'panel.close',
CLOSED: 'panel.closed',
TOGGLE_TOOLBAR: 'panel.toggleToolbar',
DRAG_START: 'panel.drag.start',
DRAG_MOVE: 'panel.drag.move',
DRAG_END: 'panel.drag.end',
MAXIMIZE_SYNC: 'panel.maximize.sync',
ACTIVATED: 'panel.activated',
DEACTIVATED: 'panel.deactivated'
}
/** /**
* Panel事件处理器类 * Panel事件处理器类
@@ -98,7 +82,7 @@ class PanelEventHandler {
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
// 触发事件 // 触发事件
return emitEvent(PANEL_EVENT_TYPES.TOGGLE_COLLAPSE, { return emitEvent(EVENT_TYPES.PANEL_TOGGLE_COLLAPSE, {
panelId, panelId,
collapsed: panelState.collapsed, collapsed: panelState.collapsed,
source: 'PanelHandler' source: 'PanelHandler'
@@ -120,7 +104,7 @@ class PanelEventHandler {
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
// 触发最大化事件 // 触发最大化事件
await emitEvent(PANEL_EVENT_TYPES.MAXIMIZE, { await emitEvent(EVENT_TYPES.PANEL_MAXIMIZE, {
panelId, panelId,
maximized: true, maximized: true,
source: 'PanelHandler' source: 'PanelHandler'
@@ -149,7 +133,7 @@ class PanelEventHandler {
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
// 触发最大化事件false表示还原 // 触发最大化事件false表示还原
await emitEvent(PANEL_EVENT_TYPES.MAXIMIZE, { await emitEvent(EVENT_TYPES.PANEL_MAXIMIZE, {
panelId, panelId,
maximized: false maximized: false
}, { }, {
@@ -173,7 +157,7 @@ class PanelEventHandler {
*/ */
requestClose(eventData) { requestClose(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
emitEvent(PANEL_EVENT_TYPES.CLOSE_REQUEST, { emitEvent(EVENT_TYPES.PANEL_CLOSE_REQUEST, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -211,7 +195,7 @@ class PanelEventHandler {
} }
// 触发关闭事件 // 触发关闭事件
await emitEvent(PANEL_EVENT_TYPES.CLOSE, { await emitEvent(EVENT_TYPES.PANEL_CLOSE, {
panelId, panelId,
areaId, areaId,
source: 'PanelHandler', source: 'PanelHandler',
@@ -220,7 +204,7 @@ class PanelEventHandler {
// 延迟触发已关闭事件(给组件销毁留时间) // 延迟触发已关闭事件(给组件销毁留时间)
setTimeout(() => { setTimeout(() => {
emitEvent(PANEL_EVENT_TYPES.CLOSED, { emitEvent(EVENT_TYPES.PANEL_CLOSED, {
panelId, panelId,
areaId, areaId,
source: 'PanelHandler', source: 'PanelHandler',
@@ -250,7 +234,7 @@ class PanelEventHandler {
panelState.lastModified = Date.now() panelState.lastModified = Date.now()
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
return emitEvent(PANEL_EVENT_TYPES.TOGGLE_TOOLBAR, { return emitEvent(EVENT_TYPES.PANEL_TOGGLE_TOOLBAR, {
panelId, panelId,
toolbarExpanded: panelState.toolbarExpanded toolbarExpanded: panelState.toolbarExpanded
}, { }, {
@@ -281,7 +265,7 @@ class PanelEventHandler {
this.dragStates.set(panelId, dragState) this.dragStates.set(panelId, dragState)
// 触发拖拽开始事件 // 触发拖拽开始事件
return emitEvent(PANEL_EVENT_TYPES.DRAG_START, { return emitEvent(EVENT_TYPES.PANEL_DRAG_START, {
panelId, panelId,
event: dragEvent, event: dragEvent,
dragState dragState
@@ -311,7 +295,7 @@ class PanelEventHandler {
dragState.lastMove = Date.now() dragState.lastMove = Date.now()
// 触发拖拽移动事件 // 触发拖拽移动事件
return emitEvent(PANEL_EVENT_TYPES.DRAG_MOVE, { return emitEvent(EVENT_TYPES.PANEL_DRAG_MOVE, {
panelId, panelId,
event: dragEvent, event: dragEvent,
dragState, dragState,
@@ -346,7 +330,7 @@ class PanelEventHandler {
} }
// 触发拖拽结束事件 // 触发拖拽结束事件
const result = await emitEvent(PANEL_EVENT_TYPES.DRAG_END, { const result = await emitEvent(EVENT_TYPES.PANEL_DRAG_END, {
panelId, panelId,
event: dragEvent, event: dragEvent,
dragState, dragState,
@@ -379,7 +363,7 @@ class PanelEventHandler {
panelState.lastModified = Date.now() panelState.lastModified = Date.now()
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
return emitEvent(PANEL_EVENT_TYPES.ACTIVATED, { return emitEvent(EVENT_TYPES.PANEL_ACTIVATED, {
panelId panelId
}, { }, {
priority, priority,
@@ -404,7 +388,7 @@ class PanelEventHandler {
panelState.lastModified = Date.now() panelState.lastModified = Date.now()
this.panelStates.set(panelId, panelState) this.panelStates.set(panelId, panelState)
return emitEvent(PANEL_EVENT_TYPES.DEACTIVATED, { return emitEvent(EVENT_TYPES.PANEL_DEACTIVATED, {
panelId panelId
}, { }, {
priority, priority,
@@ -418,7 +402,7 @@ class PanelEventHandler {
*/ */
onDragEnd(eventData) { onDragEnd(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
this.emitEvent(PANEL_EVENT_TYPES.DRAG_END, { this.emitEvent(EVENT_TYPES.PANEL_DRAG_END, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -431,7 +415,7 @@ class PanelEventHandler {
*/ */
onActivate(eventData) { onActivate(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
this.emitEvent(PANEL_EVENT_TYPES.ACTIVATED, { this.emitEvent(EVENT_TYPES.PANEL_ACTIVATED, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -444,7 +428,7 @@ class PanelEventHandler {
*/ */
onDeactivate(eventData) { onDeactivate(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
this.emitEvent(PANEL_EVENT_TYPES.DEACTIVATED, { this.emitEvent(EVENT_TYPES.PANEL_DEACTIVATED, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -457,7 +441,7 @@ class PanelEventHandler {
*/ */
onCollapse(eventData) { onCollapse(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
this.emitEvent(PANEL_EVENT_TYPES.COLLAPSE, { this.emitEvent(EVENT_TYPES.PANEL_COLLAPSE, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -470,7 +454,7 @@ class PanelEventHandler {
*/ */
onExpand(eventData) { onExpand(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
emitEvent(PANEL_EVENT_TYPES.EXPAND, { emitEvent(EVENT_TYPES.PANEL_EXPAND, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -485,7 +469,7 @@ class PanelEventHandler {
*/ */
onMaximize(eventData) { onMaximize(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
emitEvent(PANEL_EVENT_TYPES.MAXIMIZE, { emitEvent(EVENT_TYPES.PANEL_MAXIMIZE, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -500,7 +484,7 @@ class PanelEventHandler {
*/ */
onRestore(eventData) { onRestore(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
this.emitEvent(PANEL_EVENT_TYPES.RESTORE, { this.emitEvent(EVENT_TYPES.PANEL_RESTORE, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -513,7 +497,7 @@ class PanelEventHandler {
*/ */
onToggleToolbar(eventData) { onToggleToolbar(eventData) {
const { areaId, panelId } = eventData; const { areaId, panelId } = eventData;
emitEvent(PANEL_EVENT_TYPES.TOGGLE_TOOLBAR, { emitEvent(EVENT_TYPES.PANEL_TOGGLE_TOOLBAR, {
areaId, areaId,
panelId, panelId,
timestamp: Date.now() timestamp: Date.now()
@@ -601,7 +585,7 @@ class PanelEventHandler {
if (!panelState) return if (!panelState) return
// 触发Area同步事件 // 触发Area同步事件
return emitEvent(PANEL_EVENT_TYPES.MAXIMIZE_SYNC, { return emitEvent(EVENT_TYPES.PANEL_MAXIMIZE_SYNC, {
panelId, panelId,
maximized, maximized,
areaId: panelState.areaId areaId: panelState.areaId
@@ -615,11 +599,11 @@ class PanelEventHandler {
*/ */
async _registerEventListeners() { async _registerEventListeners() {
const events = [ const events = [
PANEL_EVENT_TYPES.CLOSE_REQUEST, EVENT_TYPES.PANEL_CLOSE_REQUEST,
PANEL_EVENT_TYPES.DRAG_START, EVENT_TYPES.PANEL_DRAG_START,
PANEL_EVENT_TYPES.DRAG_MOVE, EVENT_TYPES.PANEL_DRAG_MOVE,
PANEL_EVENT_TYPES.DRAG_END, EVENT_TYPES.PANEL_DRAG_END,
PANEL_EVENT_TYPES.MAXIMIZE_SYNC EVENT_TYPES.PANEL_MAXIMIZE_SYNC
] ]
for (const eventType of events) { for (const eventType of events) {
@@ -642,19 +626,19 @@ class PanelEventHandler {
*/ */
_handleEvent(eventType, data, event) { _handleEvent(eventType, data, event) {
switch (eventType) { switch (eventType) {
case PANEL_EVENT_TYPES.CLOSE_REQUEST: case EVENT_TYPES.PANEL_CLOSE_REQUEST:
this._handleCloseRequest(data, event) this._handleCloseRequest(data, event)
break break
case PANEL_EVENT_TYPES.DRAG_START: case EVENT_TYPES.PANEL_DRAG_START:
this._handleDragStart(data, event) this._handleDragStart(data, event)
break break
case PANEL_EVENT_TYPES.DRAG_MOVE: case EVENT_TYPES.PANEL_DRAG_MOVE:
this._handleDragMove(data, event) this._handleDragMove(data, event)
break break
case PANEL_EVENT_TYPES.DRAG_END: case EVENT_TYPES.PANEL_DRAG_END:
this._handleDragEnd(data, event) this._handleDragEnd(data, event)
break break
case PANEL_EVENT_TYPES.MAXIMIZE_SYNC: case EVENT_TYPES.PANEL_MAXIMIZE_SYNC:
this._handleMaximizeSync(data, event) this._handleMaximizeSync(data, event)
break break
} }
@@ -930,7 +914,7 @@ export const destroyPanelHandler = () => panelHandler.destroy()
// 注册到事件处理器注册表 // 注册到事件处理器注册表
export const registerPanelHandler = () => { export const registerPanelHandler = () => {
return registerHandler('PanelHandler', Object.values(PANEL_EVENT_TYPES), panelHandler) return registerHandler('PanelHandler', Object.values(EVENT_TYPES), panelHandler)
} }
export const unregisterPanelHandler = () => { export const unregisterPanelHandler = () => {