Skip to content

Commit 46343fd

Browse files
zhangtengjinwewoor
authored andcommitted
feat: listen sample folder contextmenu event
listen sample folder contextmenu event
1 parent 0b0742d commit 46343fd

File tree

7 files changed

+86
-53
lines changed

7 files changed

+86
-53
lines changed

src/components/collapse/index.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export interface IExpandProps {
1616
export interface ICollapseProps<T = any> {
1717
data?: T;
1818
className?: string;
19+
onCollapseChange?: (keys) => void;
1920
}
2021

2122
interface IState {
@@ -34,8 +35,9 @@ const Collapse: React.FunctionComponent<ICollapseProps> = (
3435
props: ICollapseProps
3536
) => {
3637
const [state, setState] = useState<IState>(initState);
37-
const { className, data = [], ...restProps } = props;
38+
const { className, data = [], onCollapseChange, ...restProps } = props;
3839
const onChangeCallback = (key: React.Key[]) => {
40+
onCollapseChange?.(key)
3941
setState((state: IState) => ({ ...state, activePanelKeys: key }));
4042
};
4143
const onClick = (e, item) => {
@@ -69,6 +71,7 @@ const Collapse: React.FunctionComponent<ICollapseProps> = (
6971
<Panel
7072
key={panel.id}
7173
header={panel.name}
74+
className={panel.className}
7275
extra={
7376
activePanelKeys?.includes(panel.id) && (
7477
<Toolbar

src/components/collapse/style.scss

+7
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,12 @@
6464
display: none;
6565
}
6666
}
67+
68+
// test
69+
.samplefolder {
70+
.rc-collapse-content {
71+
height: 800px;
72+
}
73+
}
6774
}
6875
}

src/components/tree/index.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -52,11 +52,11 @@ export interface ITreeProps {
5252
expandedKeys?: Key[];
5353
defaultCheckedKeys?: Key[];
5454
checkedKeys?:
55-
| Key[]
56-
| {
57-
checked: Key[];
58-
halfChecked: Key[];
59-
};
55+
| Key[]
56+
| {
57+
checked: Key[];
58+
halfChecked: Key[];
59+
};
6060
defaultSelectedKeys?: Key[];
6161
selectedKeys?: Key[];
6262
titleRender?: (node: DataNode) => React.ReactNode;

src/controller/explorer/explorer.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export interface IExplorerController {
1717
e: React.MouseEvent,
1818
item: IActionBarItem
1919
) => void;
20+
onCollapseChange?: (keys) => void;
2021
}
2122

2223
@singleton()
@@ -69,6 +70,7 @@ export class ExplorerController
6970
const sampleFolderPanel = {
7071
id: 'Folders',
7172
name: 'Sample Folder',
73+
className: 'samplefolder',
7274
toolbar: [
7375
{
7476
id: 'new_file',
@@ -112,6 +114,7 @@ export class ExplorerController
112114
};
113115

114116
explorerService.addPanel([sampleFolderPanel]);
117+
115118
}
116119

117120
private createFile = (e, type) => {
@@ -137,4 +140,8 @@ export class ExplorerController
137140
if (panelId === 'Folders') return;
138141
explorerService.addOrRemovePanel(panelId);
139142
};
143+
144+
public readonly onCollapseChange = (keys) => {
145+
console.log('keys', keys)
146+
}
140147
}

src/controller/explorer/folderTree.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { singleton } from 'tsyringe';
22
import { Controller } from 'mo/react/controller';
33

44
import { ITreeNodeItem, FileTypes } from 'mo/components/tree';
5-
65
import { editorService, explorerService } from 'mo';
76
import { EditorController } from 'mo/controller/editor';
87
import { IMenuItem } from 'mo/components/menu';
@@ -34,7 +33,8 @@ export class FolderTreeController
3433
this.initView();
3534
}
3635

37-
private initView() { }
36+
private initView() {
37+
}
3838

3939
public readonly onSelectFile = (file: ITreeNodeItem, isAuto?: boolean) => {
4040
const tabData = {
@@ -54,9 +54,9 @@ export class FolderTreeController
5454

5555
const { id, data = [] } = editorState?.current || {};
5656
const tabId = file.id;
57-
const index = data?.findIndex(tab => tab.id == tabId);
57+
const index = data?.findIndex((tab) => tab.id == tabId);
5858
if (index > -1) {
59-
if (id) editorService.updateTab(tabData, id)
59+
if (id) editorService.updateTab(tabData, id);
6060
} else {
6161
editorService.open(tabData);
6262
}

src/workbench/sidebar/explore/explore.tsx

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export const Explorer: React.FunctionComponent<IExplorer> = (
1717
data = [],
1818
headerToolBar = [],
1919
onHeaderToolbarContextMenuClick,
20+
onCollapseChange,
2021
} = props;
2122
const renderItems = (item: IActivityBarItem, index: number) => {
2223
return (
@@ -36,7 +37,7 @@ export const Explorer: React.FunctionComponent<IExplorer> = (
3637
toolbar={headerToolBar.map(renderItems)}
3738
/>
3839
<Content>
39-
<Collapse data={data} />
40+
<Collapse data={data} onCollapseChange={onCollapseChange} />
4041
</Content>
4142
</div>
4243
);

src/workbench/sidebar/explore/folderTree.tsx

+57-42
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import * as React from 'react';
2-
import { memo, useRef } from 'react';
2+
import { memo, useRef, useEffect, useCallback } from 'react';
33
import { IFolderTree } from 'mo';
4+
import { select } from 'mo/common/dom';
45
import Tree, { FileTypes } from 'mo/components/tree';
56
import { Menu } from 'mo/components/menu';
67
import { getEventPosition } from 'mo/common/dom';
78
import { Button } from 'mo/components/button';
89
import { IFolderTreeController } from 'mo/controller/explorer/folderTree';
910
import { useContextView } from 'mo/components/contextView';
11+
import { useContextMenu } from 'mo/components/contextMenu';
1012
import { explorerService } from 'mo/services';
1113
import { TreeNodeModel } from 'mo/model';
1214

@@ -26,6 +28,41 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
2628

2729
const contextView = useContextView();
2830

31+
let contextViewMenu;
32+
const folderContextMenu = [{
33+
id: 'addFolder',
34+
name: 'Add Folder to Workspace',
35+
onClick: () => {
36+
explorerService.addRootFolder?.(
37+
new TreeNodeModel({
38+
name: `molecule_temp${Math.random()}`,
39+
fileType: 'rootFolder',
40+
})
41+
);
42+
}
43+
}]
44+
const onClickMenuItem = useCallback(
45+
(e, item) => {
46+
contextViewMenu?.dispose();
47+
},
48+
[folderContextMenu]
49+
);
50+
const renderContextMenu = () => (
51+
<Menu onClick={onClickMenuItem} data={folderContextMenu} />
52+
);
53+
54+
useEffect(() => {
55+
if (folderContextMenu.length > 0) {
56+
contextViewMenu = useContextMenu({
57+
anchor: select('.samplefolder'),
58+
render: renderContextMenu,
59+
});
60+
}
61+
return function cleanup() {
62+
contextViewMenu?.dispose();
63+
};
64+
});
65+
2966
const onFocus = () => {
3067
setTimeout(() => {
3168
if (inputRef.current) {
@@ -37,15 +74,15 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
3774
const setInputVal = (val) => {
3875
setTimeout(() => {
3976
if (inputRef.current) {
40-
inputRef.current.value = val
77+
inputRef.current.value = val;
4178
}
4279
});
43-
}
80+
};
4481

4582
const inputEvents = {
4683
onFocus,
47-
setValue: (val) => setInputVal(val)
48-
}
84+
setValue: (val) => setInputVal(val),
85+
};
4986

5087
const handleRightClick = ({ event, node }) => {
5188
const menuItems = filterContextMenu?.(contextMenu, node.data);
@@ -67,10 +104,13 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
67104
},
68105
() => {
69106
if (node?.fileType === FileTypes.file && newName) {
70-
onSelectFile?.({
71-
...node,
72-
name: newName,
73-
}, true);
107+
onSelectFile?.(
108+
{
109+
...node,
110+
name: newName,
111+
},
112+
true
113+
);
74114
}
75115
}
76116
);
@@ -104,39 +144,14 @@ const FolderTree: React.FunctionComponent<IFolderTree> = (
104144
};
105145

106146
const renderByData = (
107-
<>
108-
<Tree
109-
data={data}
110-
draggable
111-
onSelectFile={onSelectFile}
112-
onRightClick={handleRightClick}
113-
renderTitle={renderTitle}
114-
{...restProps}
115-
/>
116-
{/* test service */}
117-
<div style={{ marginTop: '100px' }}>
118-
<Button
119-
onClick={() => {
120-
explorerService.addRootFolder?.(
121-
new TreeNodeModel({
122-
name: `tree_${Math.random() * 10 + 1}`,
123-
fileType: 'rootFolder',
124-
})
125-
);
126-
}}
127-
>
128-
Add Folder
129-
</Button>
130-
<Button
131-
onClick={() => {
132-
console.log('test');
133-
explorerService.newFile?.();
134-
}}
135-
>
136-
New File
137-
</Button>
138-
</div>
139-
</>
147+
<Tree
148+
data={data}
149+
draggable
150+
onSelectFile={onSelectFile}
151+
onRightClick={handleRightClick}
152+
renderTitle={renderTitle}
153+
{...restProps}
154+
/>
140155
);
141156

142157
const renderInitial = (

0 commit comments

Comments
 (0)