Skip to content

Commit 9963180

Browse files
zhangtengjinwewoor
authored andcommitted
feat: explorer service add
explorer service add
1 parent 4d13957 commit 9963180

File tree

9 files changed

+573
-387
lines changed

9 files changed

+573
-387
lines changed

src/components/menu/menu.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@ import {
88
verticalMenuClassName,
99
} from './base';
1010

11-
export interface IMenu extends ISubMenu {}
11+
export interface IMenu extends ISubMenu { }
1212

1313
export function Menu(props: React.PropsWithChildren<IMenu>) {
1414
const {
1515
className,
1616
mode = MenuMode.Vertical,
1717
data = [],
1818
children,
19+
onClick,
1920
...custom
2021
} = props;
2122
let content = children;
@@ -37,7 +38,7 @@ export function Menu(props: React.PropsWithChildren<IMenu>) {
3738
);
3839
}
3940
return (
40-
<MenuItem key={item.id} {...item}>
41+
<MenuItem key={item.id} onClick={onClick} {...item}>
4142
{item.name}
4243
</MenuItem>
4344
);

src/components/menu/subMenu.tsx

+4-4
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,10 @@ export function SubMenu(props: React.PropsWithChildren<ISubMenu>) {
177177
data={data}
178178
/>
179179
) : (
180-
<Menu className={cNames} style={{ visibility: 'hidden' }}>
181-
{children}
182-
</Menu>
183-
);
180+
<Menu className={cNames} style={{ visibility: 'hidden' }}>
181+
{children}
182+
</Menu>
183+
);
184184

185185
return (
186186
<li className={defaultMenuItemClassName} {...events} {...custom}>

src/components/tree/index.tsx

+5-3
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ import { prefixClaName, classNames } from 'mo/common/className';
1414
export const FileTypes = {
1515
FILE: 'file',
1616
FOLDER: 'folder',
17+
ROOT: 'rootFolder'
1718
};
18-
export type FileType = 'file' | 'folder';
19+
export type FileType = 'file' | 'folder' | 'rootFolder';
1920

2021
export interface ITreeNodeItem {
2122
name?: string;
2223
location?: string;
2324
fileType?: FileType;
2425
children?: ITreeNodeItem[];
25-
readonly id?: string;
26+
readonly id?: number;
2627
icon?: string | React.ReactNode;
2728
modify?: boolean; // Edit status
2829
className?: string;
@@ -202,7 +203,7 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
202203
data-index={index}
203204
data={item}
204205
title={renderTitle?.(item, index)} // dynamic title
205-
key={id}
206+
key={`${id}`}
206207
icon={modify ? '' : <Icon type={icon} />}
207208
>
208209
{children && renderTreeNodes(children)}
@@ -224,6 +225,7 @@ const TreeView: React.FunctionComponent<ITreeProps> = (props: ITreeProps) => {
224225
props.onSelectFile(e.node.data);
225226
}
226227
}}
228+
onRightClick={onRightClick}
227229
{...restProps}
228230
>
229231
{renderTreeNodes(data)}

src/controller/explorer/explorer.tsx

+8-6
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,13 @@ export class ExplorerController
117117
iconName: 'codicon-collapse-all',
118118
},
119119
],
120-
renderPanel: () => (
121-
<FolderTreeView
122-
data={explorerState.folderTree?.data}
123-
contextMenu={explorerState.folderTree?.contextMenu} />
124-
),
120+
renderPanel: () => {
121+
const folderProps: any = {
122+
data: explorerState.folderTree?.data,
123+
contextMenu: explorerState.folderTree?.contextMenu
124+
}
125+
return <FolderTreeView {...folderProps} />
126+
}
125127
};
126128

127129
const outlinePanel = {
@@ -138,7 +140,7 @@ export class ExplorerController
138140
title: 'More Actions...',
139141
iconName: 'codicon-ellipsis',
140142
},
141-
],
143+
]
142144
};
143145

144146
explorerService.addPanel([
+84-66
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,28 @@
11
import { singleton } from 'tsyringe';
22
import { Controller } from 'mo/react/controller';
33

4-
import { ITreeNodeItem, FileType, FileTypes } from 'mo/components/tree';
4+
import { ITreeNodeItem, FileTypes } from 'mo/components/tree';
55

66
import { editorService, explorerService } from 'mo';
7+
import { EditorController } from 'mo/controller/editor';
78
import { IMenuItem } from 'mo/components/menu';
89
import Modal from 'mo/components/dialog';
910
const confirm = Modal.confirm;
1011

1112
export interface IFolderTreeController {
1213
readonly onSelectFile?: (file: ITreeNodeItem) => void;
13-
readonly onCreateFile?: (e: React.MouseEvent) => void;
14-
readonly onUpdateFile?: (
15-
file: ITreeNodeItem,
16-
newName: string,
17-
index: number
18-
) => void;
19-
readonly onRename?: (file: ITreeNodeItem, callback: Function) => void;
20-
readonly onDeleteFile?: (file: ITreeNodeItem) => void;
2114
readonly onDropTree?: (treeNode: ITreeNodeItem[]) => void;
2215
readonly onClickContextMenu?: (
2316
e: React.MouseEvent,
2417
item: IMenuItem,
25-
node: ITreeNodeItem
18+
node: ITreeNodeItem,
19+
callback?: Function
2620
) => void;
2721
readonly filterContextMenu?: (
2822
menus: IMenuItem[],
29-
treeNode: IMenuItem
23+
treeNode: ITreeNodeItem
3024
) => IMenuItem[];
3125

32-
readonly onAddFolder?: (folder: ITreeNodeItem) => void;
3326
}
3427

3528
@singleton()
@@ -44,39 +37,17 @@ export class FolderTreeController
4437
private initView() { }
4538

4639
public readonly onSelectFile = (file: ITreeNodeItem) => {
47-
const tabData = {
40+
const tabData: any = {
4841
...file,
49-
activeTab: file.id,
5042
modified: false,
43+
data: {
44+
value: `hello tree ${file.id}`,
45+
path: 'desktop/molecule/editor1',
46+
language: 'ini',
47+
},
48+
breadcrumb: [{ id: `${file.id}`, name: 'editor.js' }],
5149
};
52-
editorService.open(tabData, Number(tabData.activeTab!));
53-
};
54-
55-
public readonly onCreateFile = (e: React.MouseEvent) => {
56-
const file: ITreeNodeItem = {
57-
id: '1',
58-
name: '',
59-
fileType: 'folder',
60-
modify: true,
61-
};
62-
const fileType = FileTypes.FOLDER as FileType;
63-
explorerService.createFile(file, fileType);
64-
};
65-
66-
public readonly onUpdateFile = (
67-
file: ITreeNodeItem,
68-
newName: string,
69-
index: number
70-
) => {
71-
explorerService.updateFile(file, newName, index);
72-
};
73-
74-
public readonly onRename = (file: ITreeNodeItem, callback: Function) => {
75-
explorerService.rename(file, callback);
76-
};
77-
78-
public readonly onDeleteFile = (file: ITreeNodeItem) => {
79-
explorerService.deleteFile(file);
50+
editorService.open(tabData);
8051
};
8152

8253
public readonly onDropTree = (treeNode: ITreeNodeItem[]) => {
@@ -86,54 +57,101 @@ export class FolderTreeController
8657
public readonly onClickContextMenu = (
8758
e: React.MouseEvent,
8859
item: IMenuItem,
89-
node: ITreeNodeItem
60+
node: ITreeNodeItem,
61+
callback?: Function
9062
) => {
9163
const menuId = item.id;
92-
const ctx = this;
93-
64+
const { id: nodeId, name } = node as any;
9465
switch (menuId) {
9566
case 'rename': {
96-
this.onRename(node, () => {
97-
console.log('Rename file item:', node);
67+
explorerService.rename(nodeId, () => {
68+
if (callback) callback()
9869
});
70+
break;
9971
}
10072
case 'delete': {
10173
confirm({
102-
title: `Are you sure you want to delete '${node?.name}' ?`,
74+
title: `Are you sure you want to delete '${name}' ?`,
10375
content: 'This action is irreversible!',
10476
onOk() {
105-
ctx.onDeleteFile(node);
77+
explorerService.delete(nodeId, () => {
78+
new EditorController().onCloseTab(nodeId)
79+
});
10680
},
10781
});
82+
break;
10883
}
10984
case 'newFile': {
110-
this.onCreateFile(e);
85+
explorerService.newFile(nodeId, () => {
86+
if (callback) callback()
87+
});
88+
break;
11189
}
11290
case 'newFolder': {
113-
const file: ITreeNodeItem = {
114-
id: '1',
115-
name: '',
116-
fileType: 'folder',
117-
modify: true,
118-
};
119-
const fileType = FileTypes.FOLDER as FileType;
120-
explorerService.createFile(file, fileType);
91+
explorerService.newFolder(nodeId, () => {
92+
if (callback) callback()
93+
});
94+
break;
95+
}
96+
case 'remove': {
97+
explorerService.removeRootFolder(nodeId);
98+
break;
12199
}
122100
case 'openTab': {
123101
console.log('OpenTab');
102+
break;
124103
// editorService.open();
125104
}
126105
}
127106
};
128107

129-
public readonly filterContextMenu = (
130-
menus: IMenuItem[],
131-
menuItem: IMenuItem
132-
) => {
133-
return menus;
108+
public readonly filterContextMenu = (menus, node) => {
109+
let menu;
110+
const baseContextMenu = [
111+
{
112+
id: 'newFile',
113+
name: 'New File',
114+
},
115+
{
116+
id: 'newFolder',
117+
name: 'New Folder',
118+
}
119+
];
120+
121+
const rootFolderContextMenu = [
122+
{
123+
id: 'remove',
124+
name: 'Remove Folder',
125+
}
126+
]
127+
128+
const folderContextMenu: any = baseContextMenu.concat(menus);
129+
130+
const fileContextMenu = [
131+
{
132+
id: 'openToSide',
133+
name: 'Open to the side',
134+
}
135+
].concat(menus);
136+
137+
const rootFodlerContextMenu = baseContextMenu.concat(rootFolderContextMenu);
138+
139+
switch (node.fileType) {
140+
case FileTypes.FILE: {
141+
menu = fileContextMenu;
142+
break;
143+
}
144+
case FileTypes.FOLDER: {
145+
menu = folderContextMenu;
146+
break;
147+
};
148+
case FileTypes.ROOT: {
149+
menu = rootFodlerContextMenu;
150+
break;
151+
};
152+
default: menu = menus
153+
}
154+
return menu;
134155
};
135156

136-
public readonly onAddFolder = (folder) => {
137-
explorerService.addFolder(folder);
138-
}
139157
}

src/extensions/search/searchPane.tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { IColorTheme } from 'mo/model/colorTheme';
1414
import SearchTree from './searchTree';
1515
import { IEditorTab } from 'mo/model';
1616

17-
interface ISearchPaneToolBar {}
17+
interface ISearchPaneToolBar { }
1818

1919
const initialState = {
2020
input: '',
@@ -46,7 +46,7 @@ type State = typeof initialState;
4646
export default class SearchPane extends React.Component<
4747
ISearchPaneToolBar,
4848
State
49-
> {
49+
> {
5050
state: State;
5151

5252
constructor(props) {
@@ -133,7 +133,7 @@ export default class SearchPane extends React.Component<
133133
editorService.open(tabData);
134134
};
135135

136-
const openCommand = function () {};
136+
const openCommand = function () { };
137137
const { input } = this.state;
138138
return (
139139
<div className={prefixClaName('search-pane', 'sidebar')}>

0 commit comments

Comments
 (0)