Skip to content

Commit c49e534

Browse files
authored
fix(folderTree): improve add root folder & delete dialog (#192)
* fix: improve add root folder * fix: optimize dialog style * fix: fix typo * fix: use ITreeNodeItemProps instead of TreeNodeModel to as a value of type
1 parent a15245f commit c49e534

File tree

13 files changed

+119
-79
lines changed

13 files changed

+119
-79
lines changed

src/components/collapse/style.scss

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ $collapse__extra: #{$collapse}__extra;
7171

7272
&__content {
7373
border: 1px solid transparent;
74-
flex: 1;
74+
height: calc(100% - 2px);
7575
width: calc(100% - 3px);
7676

7777
&:focus {

src/components/dialog/style.scss

+5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,12 @@
99
pointer-events: none;
1010
position: relative;
1111
top: 100px;
12+
user-select: none;
1213
width: auto;
14+
1315
// TODO rc-dialog提pr解决
1416
&-mask {
17+
background-color: transparent;
1518
bottom: 0;
1619
height: 100%;
1720
left: 0;
@@ -44,6 +47,8 @@
4447
}
4548

4649
&-content {
50+
background-color: var(--workbenchBackground);
51+
box-shadow: var(--widget-shadow) 0 0 10px 2px;
4752
font-size: 18px;
4853
padding: 0 15px;
4954
pointer-events: auto;

src/components/scrollable/style.scss

+13-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
@import 'mo/style/common';
22

3+
$react-custom-scrollbars: '.ScrollbarsCustom';
4+
35
#{$scrollbar} {
46
.shadow.top {
57
box-shadow: none;
@@ -9,7 +11,17 @@
911
width: 100%;
1012

1113
&.active {
12-
box-shadow: #000 0 6px 6px -6px inset;
14+
box-shadow: var(--widget-shadow) 0 6px 6px -6px inset;
1315
}
1416
}
1517
}
18+
19+
#{$react-custom-scrollbars} {
20+
&-Scroller {
21+
height: 100%;
22+
}
23+
24+
&-Content {
25+
height: 100%;
26+
}
27+
}

src/components/tree/index.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,11 @@ const TreeView = ({
163163
onSelectNode?.(node.data);
164164
};
165165

166+
const handleRightClick = (info) => {
167+
setKeys([info.node.key]);
168+
onRightClick?.(info);
169+
};
170+
166171
return (
167172
<div className={classNames(prefixClaName('tree'), className)}>
168173
<div className={prefixClaName('tree', 'sidebar')}>
@@ -174,7 +179,7 @@ const TreeView = ({
174179
onDrop={onDrop}
175180
switcherIcon={<Icon type="chevron-right" />}
176181
onSelect={handleSelect}
177-
onRightClick={onRightClick}
182+
onRightClick={handleRightClick}
178183
{...restProps}
179184
>
180185
{renderTreeNodes(data, 0)}

src/controller/explorer/explorer.tsx

+4-12
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import {
2323
EXPLORER_ACTIVITY_ITEM,
2424
REMOVE_COMMAND_ID,
2525
FileTypes,
26-
FolderTreeEvent,
2726
EditorTreeEvent,
2827
} from 'mo/model';
2928
import { IActionBarItemProps } from 'mo/components/actionBar';
@@ -129,15 +128,6 @@ export class ExplorerController
129128
});
130129
}
131130

132-
private createFileOrFolder = (type: keyof typeof FileTypes) => {
133-
const folderTreeState = this.folderTreeService.getState();
134-
const { data, current } = folderTreeState?.folderTree || {};
135-
// The current selected node id or the first root node
136-
const nodeId = current?.id || data?.[0]?.id;
137-
// emit onNewFile or onNewFolder event
138-
this.emit(FolderTreeEvent[`onNew${type}`], nodeId);
139-
};
140-
141131
public readonly onClick = (
142132
event: React.MouseEvent,
143133
item: IActionBarItemProps
@@ -166,11 +156,13 @@ export class ExplorerController
166156
const toolbarId = item.id;
167157
switch (toolbarId) {
168158
case NEW_FILE_COMMAND_ID: {
169-
this.createFileOrFolder(FileTypes.File);
159+
this.folderTreeController.createFileOrFolder?.(FileTypes.File);
170160
break;
171161
}
172162
case NEW_FOLDER_COMMAND_ID: {
173-
this.createFileOrFolder(FileTypes.Folder);
163+
this.folderTreeController.createFileOrFolder?.(
164+
FileTypes.Folder
165+
);
174166
break;
175167
}
176168
case REMOVE_COMMAND_ID: {

src/controller/explorer/folderTree.tsx

+24-23
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,23 @@ import { IMenuItemProps } from 'mo/components/menu';
77
import { Modal } from 'mo/components/dialog';
88
import {
99
IFolderInputEvent,
10-
TreeNodeModel,
1110
BASE_CONTEXT_MENU,
1211
ROOT_FOLDER_CONTEXT_MENU,
1312
FILE_CONTEXT_MENU,
1413
NEW_FILE_COMMAND_ID,
1514
NEW_FOLDER_COMMAND_ID,
1615
RENAME_COMMAND_ID,
17-
REMOVE_COMMAND_ID,
1816
DELETE_COMMAND_ID,
1917
OPEN_TO_SIDE_COMMAND_ID,
20-
ADD_ROOT_FOLDER_COMMAND_ID,
2118
FolderTreeEvent,
2219
FileTypes,
2320
} from 'mo/model';
2421
import { FolderTreeService, IFolderTreeService } from 'mo/services';
22+
import { randomId } from 'mo/common/utils';
2523

2624
const confirm = Modal.confirm;
2725
export interface IFolderTreeController {
26+
readonly createFileOrFolder?: (type: keyof typeof FileTypes) => void;
2827
readonly onClickContextMenu?: (
2928
e: React.MouseEvent,
3029
item: IMenuItemProps,
@@ -38,6 +37,10 @@ export interface IFolderTreeController {
3837
readonly getInputEvent?: (events: IFolderInputEvent) => IFolderInputEvent;
3938
readonly onNewFile?: (id: number) => void;
4039
readonly onNewFolder?: (id: number) => void;
40+
/**
41+
* If not provide id, it will use a random id
42+
*/
43+
readonly onNewRootFolder?: (id?: number) => void;
4144
readonly onRename?: (id: number) => void;
4245
readonly onDelete?: (id: number) => void;
4346
readonly onUpdateFileName?: (file: ITreeNodeItemProps) => void;
@@ -63,6 +66,15 @@ export class FolderTreeController
6366

6467
private initView() {}
6568

69+
public createFileOrFolder = (type: keyof typeof FileTypes) => {
70+
const folderTreeState = this.folderTreeService.getState();
71+
const { data, current } = folderTreeState?.folderTree || {};
72+
// The current selected node id or the first root node
73+
const nodeId = current?.id || data?.[0]?.id;
74+
// emit onNewFile or onNewFolder event
75+
this.emit(FolderTreeEvent[`onNew${type}`], nodeId);
76+
};
77+
6678
public readonly getInputEvent = (
6779
events: IFolderInputEvent
6880
): IFolderInputEvent => {
@@ -85,6 +97,10 @@ export class FolderTreeController
8597
this.emit(FolderTreeEvent.onNewFolder, id);
8698
};
8799

100+
public onNewRootFolder = (id?: number) => {
101+
this.emit(FolderTreeEvent.onNewRootFolder, id || randomId());
102+
};
103+
88104
public onUpdateFileName = (file: ITreeNodeItemProps) => {
89105
this.emit(FolderTreeEvent.onUpdateFileName, file);
90106
};
@@ -107,12 +123,11 @@ export class FolderTreeController
107123
public readonly onClickContextMenu = (
108124
e: React.MouseEvent,
109125
item: IMenuItemProps,
110-
node = {}
126+
node?: ITreeNodeItemProps
111127
) => {
112128
const menuId = item.id;
113129
const ctx = this;
114-
const { id: nodeId, name } = node as any;
115-
console.log('onClickContextMenu => Item', item);
130+
const { id: nodeId, name } = node || {};
116131
switch (menuId) {
117132
case RENAME_COMMAND_ID: {
118133
this.onRename(nodeId);
@@ -129,30 +144,16 @@ export class FolderTreeController
129144
break;
130145
}
131146
case NEW_FILE_COMMAND_ID: {
132-
this.onNewFile(nodeId);
147+
this.createFileOrFolder(FileTypes.File);
133148
break;
134149
}
135150
case NEW_FOLDER_COMMAND_ID: {
136-
this.onNewFolder(nodeId);
137-
break;
138-
}
139-
case REMOVE_COMMAND_ID: {
140-
this.folderTreeService.removeRootFolder(nodeId);
141-
break;
142-
}
143-
case ADD_ROOT_FOLDER_COMMAND_ID: {
144-
this.folderTreeService.addRootFolder?.(
145-
new TreeNodeModel({
146-
title: `molecule_temp${Math.random()}`,
147-
fileType: 'rootFolder',
148-
})
149-
);
151+
this.createFileOrFolder(FileTypes.Folder);
150152
break;
151153
}
152154
case OPEN_TO_SIDE_COMMAND_ID: {
153-
console.log('OpenTab');
155+
this.onSelectFile(node!, false);
154156
break;
155-
// editorService.open();
156157
}
157158
}
158159
};

src/controller/search/search.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'reflect-metadata';
22
import { Controller } from 'mo/react/controller';
33
import { container, singleton } from 'tsyringe';
44
import { connect } from 'mo/react';
5-
import { IActivityBarItem, TreeNodeModel } from 'mo/model';
5+
import { IActivityBarItem } from 'mo/model';
66
import * as React from 'react';
77
import { SearchPanel } from 'mo/workbench/sidebar/search';
88
import { IActionBarItemProps } from 'mo/components/actionBar';
@@ -34,7 +34,7 @@ export interface ISearchController {
3434
setSearchValue?: (value?: string) => void;
3535
setReplaceValue?: (value?: string) => void;
3636
convertFoldToSearchTree?: (
37-
data: TreeNodeModel[],
37+
data: ITreeNodeItemProps[],
3838
queryVal?: string
3939
) => ITreeNodeItemProps[];
4040
getSearchIndex: (text: string, queryVal?: string) => number;

src/extensions/folderTree/index.tsx

+30-11
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,45 @@
11
import molecule from 'mo';
22
import { IExtension } from 'mo/model/extension';
33
import { ITreeNodeItemProps } from 'mo/components/tree';
4-
import { FileTypes } from 'mo/model';
4+
import { FileTypes, TreeNodeModel } from 'mo/model';
5+
import { randomId } from 'mo/common/utils';
56

67
export const ExtendsFolderTree: IExtension = {
78
activate() {
89
molecule.folderTree.onNewFile((id: number) => {
910
// work through addNode function
10-
molecule.folderTree.addNode(id, {
11-
name: '',
12-
fileType: FileTypes.File,
13-
isEditable: true,
14-
});
11+
molecule.folderTree.addNode(
12+
id,
13+
new TreeNodeModel({
14+
id: randomId(),
15+
name: '',
16+
fileType: FileTypes.File,
17+
isEditable: true,
18+
})
19+
);
1520
});
1621

1722
molecule.folderTree.onNewFolder((id: number) => {
1823
// work through addNode function
19-
molecule.folderTree.addNode(id, {
20-
name: '',
21-
fileType: FileTypes.Folder,
22-
isEditable: true,
23-
});
24+
molecule.folderTree.addNode(
25+
id,
26+
new TreeNodeModel({
27+
id: randomId(),
28+
name: '',
29+
fileType: FileTypes.Folder,
30+
isEditable: true,
31+
})
32+
);
33+
});
34+
35+
molecule.folderTree.onNewRootFolder((id: number) => {
36+
molecule.folderTree.addRootFolder?.(
37+
new TreeNodeModel({
38+
id,
39+
name: 'molecule',
40+
fileType: FileTypes.RootFolder,
41+
})
42+
);
2443
});
2544

2645
molecule.folderTree.onDelete((id: number) => {

src/model/workbench/explorer/folderTree.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export enum FolderTreeEvent {
1717
onSelectFile = 'folderTree.onSelectFile',
1818
onNewFile = 'folderTree.onNewFile',
1919
onNewFolder = 'folderTree.onNewFolder',
20+
onNewRootFolder = 'folderTree.onNewRootFolder',
2021
onDelete = 'folderTree.onDelete',
2122
onRename = 'folderTree.onRename',
2223
onUpdateFileName = 'folderTree.onUpdateFileName',
@@ -29,10 +30,10 @@ export interface IFolderInputEvent {
2930
}
3031

3132
export interface IFolderTreeSubItem {
32-
data?: TreeNodeModel[];
33+
data?: ITreeNodeItemProps[];
3334
contextMenu?: IMenuItemProps[];
3435
folderPanelContextMenu?: IMenuItemProps[];
35-
current?: TreeNodeModel | null;
36+
current?: ITreeNodeItemProps | null;
3637
}
3738
export interface IFolderTree {
3839
folderTree?: IFolderTreeSubItem;
@@ -44,7 +45,6 @@ export const RENAME_COMMAND_ID = 'explorer.rename';
4445
export const REMOVE_COMMAND_ID = 'explorer.remove';
4546
export const DELETE_COMMAND_ID = 'explorer.delete';
4647
export const OPEN_TO_SIDE_COMMAND_ID = 'explorer.openToSide';
47-
export const ADD_ROOT_FOLDER_COMMAND_ID = 'addRootFolder';
4848
export const FIND_IN_WORKSPACE_ID = 'filesExplorer.findInWorkspace';
4949
export const DOWNLOAD_COMMAND_ID = 'explorer.download';
5050

@@ -84,7 +84,7 @@ export const FILE_CONTEXT_MENU = [
8484
// Sample folder panel area ContextMenu
8585
export const FOLDER_PANEL_CONTEXT_MENU = [
8686
{
87-
id: ADD_ROOT_FOLDER_COMMAND_ID,
87+
id: NEW_FOLDER_COMMAND_ID,
8888
name: 'Add Folder to Workspace...',
8989
},
9090
{
@@ -102,7 +102,7 @@ export class TreeNodeModel implements ITreeNodeItemProps {
102102
name?: string;
103103
location?: string;
104104
fileType?: FileType;
105-
children?: TreeNodeModel[];
105+
children?: ITreeNodeItemProps[];
106106
icon?: string | React.ReactNode;
107107
isEditable?: boolean;
108108
content?: string;

0 commit comments

Comments
 (0)