🐛 fix(tab-manager): 修复工作区标签批量关闭菜单失效

- 将右键菜单项和下拉菜单排除在标签拖拽触发区域外
- 避免 dnd-kit 指针捕获吞掉关闭其他页及左右侧关闭操作
- 补充菜单项不触发拖拽的指针回归测试
This commit is contained in:
Syngnat
2026-07-20 13:40:29 +08:00
parent 02eec5aee3
commit 258f5bdd64
2 changed files with 12 additions and 0 deletions

View File

@@ -68,10 +68,15 @@ describe('TabManager hover info', () => {
closest: vi.fn((selector: string) =>
selector.includes('.ant-tabs-tab-remove') ? { className: 'ant-tabs-tab-remove' } : null),
} as unknown as EventTarget;
const contextMenuItem = {
closest: vi.fn((selector: string) =>
selector.includes('[role="menuitem"]') ? { role: 'menuitem' } : null),
} as unknown as EventTarget;
expect(shouldActivateTabDragPointer({ button: 0, target: tabContent })).toBe(true);
expect(shouldActivateTabDragPointer({ button: 0, target: closeIcon })).toBe(false);
expect(shouldActivateTabDragPointer({ button: 0, target: legacyCloseIcon })).toBe(false);
expect(shouldActivateTabDragPointer({ button: 0, target: contextMenuItem })).toBe(false);
expect(shouldActivateTabDragPointer({ button: 1, target: tabContent })).toBe(false);
expect(shouldActivateTabDragPointer({ button: 2, target: tabContent })).toBe(false);
expect(shouldActivateTabDragPointer({ button: 0, ctrlKey: true, target: tabContent })).toBe(false);
@@ -85,6 +90,10 @@ describe('TabManager hover info', () => {
const closeIcon = {
closest: vi.fn(() => ({ className: 'gn-v2-tab-close' })),
} as unknown as EventTarget;
const contextMenuItem = {
closest: vi.fn((selector: string) =>
selector.includes('[role="menuitem"]') ? { role: 'menuitem' } : null),
} as unknown as EventTarget;
const buildEvent = (overrides: Record<string, unknown> = {}) => ({
button: 0,
ctrlKey: false,
@@ -102,6 +111,7 @@ describe('TabManager hover info', () => {
setPointerCapture.mockClear();
listener.mockClear();
handleTabDragPointerDown(buildEvent({ target: closeIcon }), listener);
handleTabDragPointerDown(buildEvent({ target: contextMenuItem }), listener);
handleTabDragPointerDown(buildEvent({ button: 2 }), listener);
handleTabDragPointerDown(buildEvent({ ctrlKey: true }), listener);
expect(setPointerCapture).not.toHaveBeenCalled();

View File

@@ -521,7 +521,9 @@ const TAB_DRAG_INTERACTIVE_SELECTOR = [
'select',
'[contenteditable="true"]',
'[role="button"]',
'[role="menuitem"]',
'[data-tab-drag-ignore="true"]',
'.ant-dropdown-menu',
'.ant-tabs-tab-remove',
'.gn-v2-tab-close',
].join(', ');