Skip to content

Commit 3d10746

Browse files
authored
fix: panels support to close (#257)
* fix: panels support to close * feat: panel close event support subscribe
1 parent 4399719 commit 3d10746

File tree

8 files changed

+43
-1
lines changed

8 files changed

+43
-1
lines changed

src/components/tabs/index.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export function Tabs<T>(props: ITabsProps<T>) {
7777
index={index}
7878
name={tab.name}
7979
data={tab.data}
80+
closable={tab.closable}
8081
onMoveTab={onChangeTab}
8182
{...resetProps}
8283
/>

src/components/tabs/style.scss

+4
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@
8585
height: 18px;
8686
width: 18px;
8787
}
88+
89+
&__button {
90+
font-size: 0;
91+
}
8892
}
8993
}
9094
}

src/controller/panel.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { QuickTogglePanelAction } from 'mo/monaco/quickTogglePanelAction';
1515
export interface IPanelController {
1616
onTabChange(key: string | undefined): void;
1717
onToolbarClick(e: React.MouseEvent, item: IActionBarItemProps): void;
18+
onClose(key?: string): void;
1819
}
1920

2021
@singleton()
@@ -38,6 +39,12 @@ export class PanelController extends Controller implements IPanelController {
3839
this.emit(PanelEvent.onTabChange, key);
3940
};
4041

42+
public readonly onClose = (key?: string) => {
43+
if (key) {
44+
this.emit(PanelEvent.onTabClose, key);
45+
}
46+
};
47+
4148
public readonly onToolbarClick = (
4249
e: React.MouseEvent,
4350
item: IActionBarItemProps

src/extensions/panel/index.ts

+15
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,20 @@ export const ExtendsPanel: IExtension = {
1111
toolbox: builtInPanelToolbox(),
1212
});
1313
molecule.panel.add(output);
14+
15+
molecule.panel.onTabClose((key) => {
16+
const { data = [], current } = molecule.panel.getState();
17+
if (current?.id === key) {
18+
const index = data.findIndex((item) => item.id === key);
19+
const next =
20+
index === data.length - 1 ? data.length - 2 : index + 1;
21+
const nextPanel = data[next];
22+
if (nextPanel) {
23+
molecule.panel.open(nextPanel);
24+
}
25+
}
26+
27+
molecule.panel.remove(key);
28+
});
1429
},
1530
};

src/model/workbench/panel.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export interface IPanelItem<T = any> extends ITabProps<any> {
1414
export enum PanelEvent {
1515
onTabChange = 'panel.onTabChange',
1616
onToolbarClick = 'panel.onToolbarClick',
17+
onTabClose = 'panel.onTabClose',
1718
}
1819

1920
export const PANEL_TOOLBOX_CLOSE = 'panel.toolbox.closePanel';

src/services/workbench/panelService.ts

+5
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export interface IPanelService extends Component<IPanel> {
3737
onToolbarClick(
3838
callback: (e: React.MouseEvent, item: IActionBarItemProps) => void
3939
): void;
40+
onTabClose(callback: (key: string) => void): void;
4041
}
4142

4243
@singleton()
@@ -161,4 +162,8 @@ export class PanelService extends Component<IPanel> implements IPanelService {
161162
) {
162163
this.subscribe(PanelEvent.onToolbarClick, callback);
163164
}
165+
166+
public onTabClose(callback: (key: string) => void) {
167+
this.subscribe(PanelEvent.onTabClose, callback);
168+
}
164169
}

src/workbench/panel/panel.tsx

+9-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,14 @@ const panelToolbarClassName = getBEMElement(defaultClassName, 'toolbar');
1111
const panelContainerClassName = getBEMElement(defaultClassName, 'container');
1212

1313
export function Panel(props: IPanel & IPanelController) {
14-
const { data, current, toolbox = [], onTabChange, onToolbarClick } = props;
14+
const {
15+
data,
16+
current,
17+
toolbox = [],
18+
onTabChange,
19+
onToolbarClick,
20+
onClose,
21+
} = props;
1522
let toolboxData = toolbox;
1623
if (current && current.toolbox) {
1724
toolboxData = current.toolbox.concat(toolbox);
@@ -29,6 +36,7 @@ export function Panel(props: IPanel & IPanelController) {
2936
activeTab={current?.id}
3037
data={data}
3138
onSelectTab={onTabChange}
39+
onCloseTab={onClose}
3240
/>
3341
<ActionBar
3442
className={panelToolbarClassName}

stories/extensions/test/testPane.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export default class TestPane extends React.Component {
8484
molecule.panel.open({
8585
id: 'Pane' + id,
8686
name: 'Panel' + id,
87+
closable: true,
8788
render: () => <h1>Test Pane</h1>,
8889
});
8990
};

0 commit comments

Comments
 (0)