Skip to content

Commit 3061b68

Browse files
authored
fix: improve the insert strategy in folderTree (#486)
* fix: improve the insert strategy in folderTree * test: improve tests for folderTree
1 parent 22a59c7 commit 3061b68

File tree

4 files changed

+83
-4
lines changed

4 files changed

+83
-4
lines changed

src/controller/explorer/folderTree.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ export class FolderTreeController
105105
const folderTreeState = this.folderTreeService.getState();
106106
const { data, current } = folderTreeState?.folderTree || {};
107107
// The current selected node id or the first root node
108-
const nodeId = current?.id || data?.[0]?.id;
108+
const nodeId =
109+
typeof current?.id === 'undefined' ? data?.[0]?.id : current?.id;
110+
109111
this.emit(FolderTreeEvent.onCreate, type, nodeId);
110112
};
111113

src/services/workbench/__tests__/folderTreeService.test.ts

+49
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { container } from 'tsyringe';
44
import {
55
FileTypes,
66
IFolderTreeNodeProps,
7+
TreeNodeModel,
78
} from 'mo/model/workbench/explorer/folderTree';
89
import { expectFnCalled, expectLoggerErrorToBeCalled } from '@test/utils';
910

@@ -12,6 +13,7 @@ import {
1213
FolderTreeService,
1314
} from '../explorer/folderTreeService';
1415
import { FolderTreeEvent } from 'mo/model/workbench/explorer/folderTree';
16+
import { randomId } from 'mo/common/utils';
1517

1618
const TEST_ID = 'test-id';
1719

@@ -135,6 +137,53 @@ describe('Test StatusBarService', () => {
135137
expect(folderTreeService.get(mockTreeData.id)?.name).toBe(TEST_ID);
136138
});
137139

140+
test('Should insert a file or a folder in a sorted way', () => {
141+
const mockRootTree = new TreeNodeModel({
142+
id: randomId(),
143+
name: 'molecule_temp',
144+
fileType: FileTypes.RootFolder,
145+
});
146+
folderTreeService.add(mockRootTree);
147+
const mockFolder = new TreeNodeModel({
148+
id: randomId(),
149+
name: 'mock_folder',
150+
fileType: FileTypes.Folder,
151+
isLeaf: false,
152+
});
153+
folderTreeService.add(mockFolder, mockRootTree.id);
154+
let rootFolder = folderTreeService.get(mockRootTree.id)!;
155+
156+
expect(rootFolder.children).toHaveLength(1);
157+
158+
const anotherMockFolder = new TreeNodeModel({
159+
id: randomId(),
160+
name: 'another_mock_folder',
161+
fileType: FileTypes.Folder,
162+
isLeaf: false,
163+
});
164+
folderTreeService.add(anotherMockFolder, mockRootTree.id);
165+
rootFolder = folderTreeService.get(mockRootTree.id)!;
166+
167+
expect(rootFolder.children).toHaveLength(2);
168+
expect(rootFolder.children).toEqual([anotherMockFolder, mockFolder]);
169+
170+
const mockFile = new TreeNodeModel({
171+
id: randomId(),
172+
name: 'mock_file',
173+
fileType: FileTypes.File,
174+
isLeaf: true,
175+
});
176+
folderTreeService.add(mockFile, mockRootTree.id);
177+
rootFolder = folderTreeService.get(mockRootTree.id)!;
178+
179+
expect(rootFolder.children).toHaveLength(3);
180+
expect(rootFolder.children).toEqual([
181+
anotherMockFolder,
182+
mockFolder,
183+
mockFile,
184+
]);
185+
});
186+
138187
test('Should NOT add root folder when there is a root folder', () => {
139188
const mockRootTree: IFolderTreeNodeProps = {
140189
id: '0',

src/services/workbench/explorer/folderTreeService.ts

+29-2
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,23 @@ export class FolderTreeService
257257
};
258258
}
259259

260+
// Get the position of file by type
261+
// We considered by default that the list is sorted in fileType
262+
private getPosOfType(
263+
type: keyof typeof FileTypes,
264+
folderList: IFolderTreeNodeProps[]
265+
) {
266+
if (!folderList.length) return 0;
267+
if (type === FileTypes.Folder || type === FileTypes.RootFolder) {
268+
return 0;
269+
}
270+
// find the first file type
271+
const index = folderList.findIndex(
272+
(list) => list.fileType === FileTypes.File
273+
);
274+
return index === -1 ? folderList.length : index;
275+
}
276+
260277
public add(data: IFolderTreeNodeProps, id?: UniqueId): void {
261278
const isRootFolder = data.fileType === 'RootFolder';
262279

@@ -284,10 +301,20 @@ export class FolderTreeService
284301
/(?<=\/)[^\/]+$/,
285302
`${data.name}`
286303
) || '';
287-
tree!.prepend(data, currentIndex.parent!);
304+
305+
const parentNode = tree!.getNode(currentIndex.parent!)!;
306+
const pos = this.getPosOfType(
307+
data.fileType!,
308+
parentNode.children || []
309+
);
310+
tree!.insertNode(data, currentIndex.parent!, pos);
288311
} else {
289312
this.setCurrentFolderLocation(data, id);
290-
tree!.append(data, id);
313+
const pos = this.getPosOfType(
314+
data.fileType!,
315+
currentIndex.node.children || []
316+
);
317+
tree?.insertNode(data, currentIndex.id, pos);
291318
}
292319

293320
cloneData[index] = tree!.obj;

src/workbench/sidebar/explore/style.scss

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@
1010
}
1111

1212
#{$folderTree} {
13-
height: 100%;
13+
min-height: 100%;
14+
padding-bottom: 22px;
1415

1516
&--editable {
1617
background: rgba(0, 0, 0, 0.3);

0 commit comments

Comments
 (0)