Skip to content

Commit

Permalink
feat: close tab with middle btn
Browse files Browse the repository at this point in the history
  • Loading branch information
mathuo committed Jan 30, 2025
1 parent bb93c9e commit 0e9c648
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 64 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,6 @@ export class DefaultTab extends CompositeDisposable implements ITabRenderer {
this._element.appendChild(this._content);
this._element.appendChild(this.action);

this.addDisposables(
addDisposableListener(this.action, 'pointerdown', (ev) => {
ev.preventDefault();
})
);

this.render();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,10 @@ export class TabsContainer
this._onTabDragStart.fire({ nativeEvent: event, panel });
}),
tab.onChanged((event) => {
if (event.defaultPrevented) {
return;
}

const isFloatingGroupsEnabled =
!this.accessor.options.disableFloatingGroups;

Expand Down Expand Up @@ -342,14 +346,15 @@ export class TabsContainer
return;
}

const isLeftClick = event.button === 0;

if (!isLeftClick || event.defaultPrevented) {
return;
}

if (this.group.activePanel !== panel) {
this.group.model.openPanel(panel);
switch (event.button) {
case 0: // left click or touch
if (this.group.activePanel !== panel) {
this.group.model.openPanel(panel);
}
break;
case 1: // middle click
panel.api.close();
break;
}
}),
tab.onDrop((event) => {
Expand Down
52 changes: 18 additions & 34 deletions packages/dockview/src/__tests__/dockview/defaultTab.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ import { Disposable } from 'dockview-core/dist/cjs/lifecycle';
describe('defaultTab', () => {
test('has close button by default', async () => {
const api = fromPartial<DockviewPanelApi>({
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand All @@ -30,7 +32,9 @@ describe('defaultTab', () => {
test('that title is displayed', async () => {
const api = fromPartial<DockviewPanelApi>({
title: 'test_title',
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand Down Expand Up @@ -84,7 +88,9 @@ describe('defaultTab', () => {

test('has no close button when hideClose=true', async () => {
const api = fromPartial<DockviewPanelApi>({
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand All @@ -105,7 +111,9 @@ describe('defaultTab', () => {
test('that settings closeActionOverride skips api.close()', async () => {
const api = fromPartial<DockviewPanelApi>({
close: jest.fn(),
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand Down Expand Up @@ -134,7 +142,9 @@ describe('defaultTab', () => {
test('that clicking close calls api.close()', async () => {
const api = fromPartial<DockviewPanelApi>({
close: jest.fn(),
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand All @@ -158,7 +168,9 @@ describe('defaultTab', () => {

test('has close button when hideClose=false', async () => {
const api = fromPartial<DockviewPanelApi>({
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
onDidTitleChange: jest
.fn()
.mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};
Expand All @@ -175,32 +187,4 @@ describe('defaultTab', () => {
const element = await screen.getByTestId('dockview-dv-default-tab');
expect(element.querySelector('.dv-default-tab-action')).toBeTruthy();
});

test('that pointerDown on close button prevents panel becoming active', async () => {
const api = fromPartial<DockviewPanelApi>({
setActive: jest.fn(),
onDidTitleChange: jest.fn().mockImplementation(() => Disposable.NONE),
});
const containerApi = fromPartial<DockviewApi>({});
const params = {};

render(
<DockviewDefaultTab
api={api}
containerApi={containerApi}
params={params}
/>
);

const element = await screen.getByTestId('dockview-dv-default-tab');
const btn = element.querySelector(
'.dv-default-tab-action'
) as HTMLElement;

fireEvent.pointerDown(btn);
expect(api.setActive).toHaveBeenCalledTimes(0);

fireEvent.click(element);
expect(api.setActive).toHaveBeenCalledTimes(1);
});
});
16 changes: 0 additions & 16 deletions packages/dockview/src/dockview/defaultTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -53,26 +53,10 @@ export const DockviewDefaultTab: React.FunctionComponent<
e.preventDefault();
}, []);

const onClick = React.useCallback(
(event: React.MouseEvent<HTMLDivElement>) => {
if (event.defaultPrevented) {
return;
}

api.setActive();

if (rest.onClick) {
rest.onClick(event);
}
},
[api, rest.onClick]
);

return (
<div
data-testid="dockview-dv-default-tab"
{...rest}
onClick={onClick}
className="dv-default-tab"
>
<span className="dv-default-tab-content">{title}</span>
Expand Down

0 comments on commit 0e9c648

Please sign in to comment.