Skip to content

Commit c230885

Browse files
authored
feat: support listen to onCollapseAllFolders (#673)
* feat: support listen to onCollapseAllFolders * test: update tests * test: update tests
1 parent 3e9ed61 commit c230885

File tree

8 files changed

+51
-9
lines changed

8 files changed

+51
-9
lines changed

src/components/tree/index.tsx

+8-7
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ const TreeView = ({
8585
onLoadData,
8686
onTreeClick,
8787
}: ITreeProps) => {
88-
const [expandKeys, setExpandKeys] = useState<string[]>([]);
88+
const [expandKeys, setExpandKeys] = useState<UniqueId[]>([]);
8989
const [activeKey, setActiveKey] = useState<string | null>(null);
9090
const loadDataCache = useRef<Record<string, boolean>>({});
9191
const [loadingKeys, setLoadingKeys] = useState<string[]>([]);
@@ -125,15 +125,16 @@ const TreeView = ({
125125
};
126126

127127
const handleExpandKey = (key: string, node: ITreeNodeItemProps) => {
128-
const index = expandKeys.findIndex((e) => e === key);
128+
const nextExpandKeys = (controlExpandKeys || expandKeys).concat();
129+
const index = nextExpandKeys.findIndex((e) => e === key);
129130
if (index > -1) {
130-
expandKeys.splice(index, 1);
131+
nextExpandKeys.splice(index, 1);
131132
} else {
132-
expandKeys.push(key);
133+
nextExpandKeys.push(key);
133134
}
134135
onExpand
135-
? onExpand(expandKeys.concat(), node)
136-
: setExpandKeys(expandKeys.concat());
136+
? onExpand(nextExpandKeys.concat(), node)
137+
: setExpandKeys(nextExpandKeys.concat());
137138
};
138139

139140
const handleNodeClick = (
@@ -415,7 +416,7 @@ const TreeView = ({
415416
return node.id.toString();
416417
});
417418
const nextExpandKeys = Array.from(
418-
new Set([...keys, ...expandKeys])
419+
new Set([...keys, ...(controlExpandKeys || expandKeys)])
419420
);
420421

421422
onExpand

src/controller/__tests__/explorer.test.ts

+13
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,19 @@ describe('The explorer controller', () => {
190190

191191
expect(mockFn).toBeCalled();
192192

193+
// COLLAPSE_COMMAND_ID
194+
mockItem.id = constants.COLLAPSE_COMMAND_ID;
195+
mockFn.mockClear();
196+
expect(mockFn).not.toBeCalled();
197+
explorerController.subscribe(
198+
ExplorerEvent.onCollapseAllFolders,
199+
mockFn
200+
);
201+
202+
explorerController.onToolbarClick(mockItem, mockParentPanel);
203+
204+
expect(mockFn).toBeCalled();
205+
193206
// default
194207
mockItem.id = 'custom-id';
195208
mockFn.mockClear();

src/controller/explorer/explorer.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export class ExplorerController
131131
NEW_FILE_COMMAND_ID,
132132
NEW_FOLDER_COMMAND_ID,
133133
REMOVE_COMMAND_ID,
134+
COLLAPSE_COMMAND_ID,
134135
EXPLORER_TOGGLE_CLOSE_ALL_EDITORS,
135136
EXPLORER_TOGGLE_SAVE_ALL,
136137
EXPLORER_TOGGLE_VERTICAL,
@@ -149,6 +150,10 @@ export class ExplorerController
149150
this.emit(ExplorerEvent.onRemovePanel, parentPanel);
150151
break;
151152
}
153+
case COLLAPSE_COMMAND_ID: {
154+
this.emit(ExplorerEvent.onCollapseAllFolders);
155+
break;
156+
}
152157
case EXPLORER_TOGGLE_CLOSE_ALL_EDITORS: {
153158
this.emit(EditorTreeEvent.onCloseAll);
154159
break;

src/model/workbench/explorer/explorer.tsx

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export enum ExplorerEvent {
77
onPanelToolbarClick = 'explorer.onPanelToolbarClick',
88
onCollapseChange = 'explorer.onCollapseChange',
99
onRemovePanel = 'explorer.onRemovePanel',
10+
onCollapseAllFolders = 'explorer.onCollapseAllFolders',
1011
}
1112

1213
export type RenderFunctionProps = (props) => React.ReactNode;

src/services/__tests__/explorerService.test.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ExplorerEvent, IExplorerPanelItem } from 'mo/model';
22
import 'reflect-metadata';
3-
import { expectLoggerErrorToBeCalled } from '@test/utils';
3+
import { expectFnCalled, expectLoggerErrorToBeCalled } from '@test/utils';
44
import { container } from 'tsyringe';
55
import { searchById } from 'mo/common/utils';
66
import { ExplorerService } from '../workbench';
@@ -290,4 +290,12 @@ describe('Test the Explorer Service', () => {
290290
expect(mockFn.mock.calls[0][0]).toEqual(panelData);
291291
expect(mockFn.mock.calls[0][1]).toEqual('toolbar-id');
292292
});
293+
294+
test('Should support to subscribe onCollapseAllFolders event', () => {
295+
expectFnCalled((fn) => {
296+
explorerService.onCollapseAllFolders(fn);
297+
298+
explorerService.emit(ExplorerEvent.onCollapseAllFolders);
299+
});
300+
});
293301
});

src/services/builtinService/const.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export const constants = {
2929
EXPLORER_TOGGLE_CLOSE_GROUP_EDITORS: 'sidebar.explore.closeGroupEditors',
3030
NEW_FILE_COMMAND_ID: 'explorer.newFile',
3131
NEW_FOLDER_COMMAND_ID: 'explorer.newFolder',
32+
COLLAPSE_COMMAND_ID: 'explorer.collapse',
3233
RENAME_COMMAND_ID: 'explorer.rename',
3334
REMOVE_COMMAND_ID: 'explorer.remove',
3435
DELETE_COMMAND_ID: 'explorer.delete',
@@ -127,7 +128,7 @@ export const modules = {
127128
icon: 'refresh',
128129
},
129130
{
130-
id: 'collapse',
131+
id: constants.COLLAPSE_COMMAND_ID,
131132
title: localize(
132133
'sidebar.explore.collapseFolders',
133134
'Collapse Folders in Explorer'

src/services/workbench/explorer/explorerService.ts

+9
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ export interface IExplorerService extends Component<IExplorer> {
6868
* @param callback
6969
*/
7070
onRemovePanel(callback: (panel: IExplorerPanelItem) => void): void;
71+
/**
72+
* Listen to the FolderTree Panel collapse all folders event
73+
* @param callback
74+
*/
75+
onCollapseAllFolders(callback: () => void): void;
7176
/**
7277
* Listen to the Explorer panel toolbar click event
7378
* @param callback
@@ -313,6 +318,10 @@ export class ExplorerService
313318
this.subscribe(ExplorerEvent.onRemovePanel, callback);
314319
}
315320

321+
public onCollapseAllFolders(callback: () => void) {
322+
this.subscribe(ExplorerEvent.onCollapseAllFolders, callback);
323+
}
324+
316325
public onPanelToolbarClick(
317326
callback: (panel: IExplorerPanelItem, toolbarId: string) => void
318327
) {

stories/extensions/test/index.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -175,5 +175,9 @@ export const ExtendsTestPane: IExtension = {
175175
molecule.folderTree.onRemove((id) => {
176176
molecule.folderTree.remove(id);
177177
});
178+
179+
molecule.explorer.onCollapseAllFolders(() => {
180+
molecule.folderTree.setExpandKeys([]);
181+
});
178182
},
179183
};

0 commit comments

Comments
 (0)