Skip to content

Commit d1191a5

Browse files
zhangtengjinwewoor
authored andcommitted
feat: optimize folderPanel contextMenu logic and extract style to mo
optimize folderPanel contextMenu logic and extract style to mo
1 parent dbe3558 commit d1191a5

File tree

7 files changed

+65
-34
lines changed

7 files changed

+65
-34
lines changed

build/webpack.css.js

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ const styles = [
2929
'workbench/settings/style',
3030
'workbench/sidebar/style',
3131
'workbench/statusBar/style',
32+
'workbench/sidebar/explore/style',
3233
// ============= Molecule.css =============
3334
'style/mo',
3435
];

src/controller/explorer/explorer.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ export class ExplorerController
103103
const folderProps: IFolderTree = {
104104
data: explorerState.folderTree?.data,
105105
contextMenu: explorerState.folderTree?.contextMenu,
106+
folderPanelContextMenu: explorerState.folderTree?.folderPanelContextMenu
106107
};
107108
return (
108109
<FolderTreeView

src/controller/explorer/folderTree.tsx

+26-9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { editorService, explorerService } from 'mo';
66
import { EditorController } from 'mo/controller/editor';
77
import { IMenuItem } from 'mo/components/menu';
88
import Modal from 'mo/components/dialog';
9+
import { IFolderInputEvent, TreeNodeModel } from 'mo/model';
910
const confirm = Modal.confirm;
1011

1112
export interface IFolderTreeController {
@@ -15,13 +16,14 @@ export interface IFolderTreeController {
1516
readonly onClickContextMenu?: (
1617
e: React.MouseEvent,
1718
item: IMenuItem,
18-
node: ITreeNodeItem,
19-
events?: Object
19+
node?: ITreeNodeItem,
20+
events?: IFolderInputEvent
2021
) => void;
2122
readonly filterContextMenu?: (
2223
menus: IMenuItem[],
2324
treeNode: ITreeNodeItem
2425
) => IMenuItem[];
26+
readonly getInputEvent?: (events: IFolderInputEvent) => IFolderInputEvent;
2527
}
2628

2729
@singleton()
@@ -33,7 +35,7 @@ export class FolderTreeController
3335
this.initView();
3436
}
3537

36-
private initView() {}
38+
private initView() { }
3739

3840
public readonly onSelectFile = (file: ITreeNodeItem, isAuto?: boolean) => {
3941
const tabData = {
@@ -72,19 +74,24 @@ export class FolderTreeController
7274
explorerService.onDropTree(treeNode);
7375
};
7476

77+
public readonly getInputEvent = (events: IFolderInputEvent): IFolderInputEvent => {
78+
return events;
79+
}
80+
7581
public readonly onClickContextMenu = (
7682
e: React.MouseEvent,
7783
item: IMenuItem,
78-
node: ITreeNodeItem,
79-
events?: Object
84+
node = {},
85+
events?: IFolderInputEvent
8086
) => {
8187
const menuId = item.id;
8288
const { id: nodeId, name } = node as any;
89+
console.log('onClickContextMenu => Item', item)
8390
switch (menuId) {
8491
case 'rename': {
8592
explorerService.rename(nodeId, () => {
86-
events?.['setValue'](name);
87-
events?.['onFocus']();
93+
events?.setValue?.(name);
94+
events?.onFocus();
8895
});
8996
break;
9097
}
@@ -105,20 +112,29 @@ export class FolderTreeController
105112
}
106113
case 'newFile': {
107114
explorerService.newFile(nodeId, () => {
108-
events?.['onFocus']();
115+
events?.onFocus();
109116
});
110117
break;
111118
}
112119
case 'newFolder': {
113120
explorerService.newFolder(nodeId, () => {
114-
events?.['onFocus']();
121+
events?.onFocus();
115122
});
116123
break;
117124
}
118125
case 'remove': {
119126
explorerService.removeRootFolder(nodeId);
120127
break;
121128
}
129+
case 'addRootFolder': {
130+
explorerService.addRootFolder?.(
131+
new TreeNodeModel({
132+
name: `molecule_temp${Math.random()}`,
133+
fileType: 'rootFolder',
134+
})
135+
);
136+
break;
137+
}
122138
case 'openTab': {
123139
console.log('OpenTab');
124140
break;
@@ -178,4 +194,5 @@ export class FolderTreeController
178194
}
179195
return menu;
180196
};
197+
181198
}

src/model/workbench/explorer.tsx

+23
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,15 @@ export interface IPanelItem<T = any> extends IActivityBarItem {
1313
toolbar?: T;
1414
}
1515

16+
export interface IFolderInputEvent {
17+
onFocus: () => void;
18+
setValue: (value: string) => void;
19+
}
20+
1621
export interface IFolderTree {
1722
data?: ITreeNodeItem[];
1823
contextMenu?: IMenuItem[];
24+
folderPanelContextMenu?: IMenuItem[];
1925
current?: ITreeNodeItem | null;
2026
}
2127
export interface IExplorer {
@@ -60,6 +66,22 @@ const commonContextMenu = [
6066
name: 'Delete',
6167
},
6268
];
69+
70+
// Sample folder panel area ContextMenu
71+
const folderPanelContextMenu = [
72+
{
73+
id: 'addRootFolder',
74+
name: 'Add Folder to Workspace...'
75+
},
76+
{
77+
id: 'find',
78+
name: 'Find in Workspace...'
79+
},
80+
{
81+
id: 'download',
82+
name: 'Download...'
83+
},
84+
]
6385
// Dedault Panel
6486
export const EDITOR_PANEL = {
6587
id: 'OpenEditors',
@@ -141,6 +163,7 @@ export class IExplorerModel implements IExplorer {
141163
public folderTree: IFolderTree = {
142164
contextMenu: commonContextMenu,
143165
current: null,
166+
folderPanelContextMenu: folderPanelContextMenu,
144167
data: [],
145168
};
146169
public headerToolBar: IActivityBarItem[] = builtInHeaderToolbar;

src/style/mo.scss

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
@import 'mo/workbench/settings/style';
3131
@import 'mo/workbench/sidebar/style';
3232
@import 'mo/workbench/statusBar/style';
33+
@import 'mo/workbench/sidebar/explore/style';
3334

3435
.#{$prefix} {
3536
bottom: 0;

src/workbench/sidebar/explore/folderTree.tsx

+13-24
Original file line numberDiff line numberDiff line change
@@ -10,51 +10,40 @@ import { IFolderTreeController } from 'mo/controller/explorer/folderTree';
1010
import { useContextView } from 'mo/components/contextView';
1111
import { useContextMenu } from 'mo/components/contextMenu';
1212
import { explorerService } from 'mo/services';
13-
import { TreeNodeModel } from 'mo/model';
13+
import { TreeNodeModel, IFolderInputEvent } from 'mo/model';
1414

1515
const FolderTree: React.FunctionComponent<IFolderTree> = (
1616
props: IFolderTree & IFolderTreeController
1717
) => {
1818
const {
1919
data = [],
2020
contextMenu = [],
21+
folderPanelContextMenu = [],
2122
onSelectFile,
2223
onDropTree,
2324
filterContextMenu,
2425
onClickContextMenu,
26+
getInputEvent,
2527
...restProps
2628
} = props;
2729
const inputRef = useRef<any>(null);
2830

2931
const contextView = useContextView();
3032

3133
let contextViewMenu;
32-
const folderContextMenu = [
33-
{
34-
id: 'addFolder',
35-
name: 'Add Folder to Workspace',
36-
onClick: () => {
37-
explorerService.addRootFolder?.(
38-
new TreeNodeModel({
39-
name: `molecule_temp${Math.random()}`,
40-
fileType: 'rootFolder',
41-
})
42-
);
43-
},
44-
},
45-
];
4634
const onClickMenuItem = useCallback(
4735
(e, item) => {
36+
onClickContextMenu?.(e, item)
4837
contextViewMenu?.dispose();
4938
},
50-
[folderContextMenu]
39+
[folderPanelContextMenu]
5140
);
5241
const renderContextMenu = () => (
53-
<Menu onClick={onClickMenuItem} data={folderContextMenu} />
42+
<Menu onClick={onClickMenuItem} data={folderPanelContextMenu} />
5443
);
5544

5645
useEffect(() => {
57-
if (folderContextMenu.length > 0) {
46+
if (folderPanelContextMenu.length > 0) {
5847
contextViewMenu = useContextMenu({
5948
anchor: select('.samplefolder'),
6049
render: renderContextMenu,
@@ -73,23 +62,23 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
7362
});
7463
};
7564

76-
const setInputVal = (val) => {
65+
const setInputValue = (val) => {
7766
setTimeout(() => {
7867
if (inputRef.current) {
7968
inputRef.current.value = val;
8069
}
8170
});
8271
};
8372

84-
const inputEvents = {
73+
const inputEvents: IFolderInputEvent = {
8574
onFocus,
86-
setValue: (val) => setInputVal(val),
75+
setValue: (val) => setInputValue(val),
8776
};
8877

8978
const handleRightClick = ({ event, node }) => {
9079
const menuItems = filterContextMenu?.(contextMenu, node.data);
9180
const handleOnMenuClick = (e: React.MouseEvent, item) => {
92-
onClickContextMenu?.(e, item, node.data, inputEvents);
81+
onClickContextMenu?.(e, item, node.data, getInputEvent?.(inputEvents));
9382
contextView.hide();
9483
};
9584
contextView?.show(getEventPosition(event), () => (
@@ -141,8 +130,8 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
141130
onBlur={handleInputBlur}
142131
/>
143132
) : (
144-
name
145-
);
133+
name
134+
);
146135
};
147136

148137
const renderByData = (

src/workbench/sidebar/explore/index.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'mo/workbench/sidebar/explore/style.scss';
21
import { connect } from 'mo/react';
32
import { explorerService } from 'mo/services';
43
import { explorerController, folderTreeController } from 'mo/controller';

0 commit comments

Comments
 (0)