Skip to content

Commit e9b9576

Browse files
committed
expand a collapsed collection when creating items
1 parent 800fa00 commit e9b9576

File tree

2 files changed

+73
-5
lines changed

2 files changed

+73
-5
lines changed

fusion-studio-extension/src/browser/core.ts

Lines changed: 71 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { injectable, inject } from "inversify";
22
import { v4 } from "uuid";
3-
import { FSNode, FSDocumentNode, FSCollectionNode, FSToolbarNode, FSConnectionNode, FSItemNode, FSSecurityNode, FSUsersNode, FSGroupsNode, FSUserNode, FSGroupNode, FSContainerNode, FSIndexesNode, FSIndexNode, FSRestNode, FSRestURINode, FSRestMethodNode } from "../classes/node";
3+
import { FSNode, FSDocumentNode, FSCollectionNode, FSToolbarNode, FSConnectionNode, FSItemNode, FSSecurityNode, FSUsersNode, FSGroupsNode, FSUserNode, FSGroupNode, FSContainerNode, FSIndexesNode, FSIndexNode, FSRestNode, FSRestURINode, FSRestMethodNode, FSLoadEvent } from "../classes/node";
44
import { open, TreeNode, CompositeTreeNode, ConfirmDialog, SingleTextInputDialog, OpenerService, StatusBar, StatusBarAlignment, WidgetManager } from "@theia/core/lib/browser";
55
import { WorkspaceService } from "@theia/workspace/lib/browser";
66
import { OpenFileDialogProps, FileDialogService } from "@theia/filesystem/lib/browser";
@@ -65,6 +65,7 @@ export class FSCore {
6565
updating = false;
6666
renaming = '';
6767
dict: Record<string, FSNode> = {};
68+
loadEvents: Record<string, (FSLoadEvent)[]> = {};
6869

6970
setLabelProvider(labelProvider: FSLabelProviderContribution) {
7071
this._labelProvider = labelProvider;
@@ -192,6 +193,9 @@ export class FSCore {
192193
}
193194

194195
protected removeNode(child: FSNode) {
196+
if (this.loadEvents[child.id]) {
197+
delete(this.loadEvents[child.id]);
198+
}
195199
const removeNodeId = (node: FSNode) => {
196200
delete(this.dict[node.nodeId]);
197201
if (CompositeTreeNode.is(node)) {
@@ -254,8 +258,24 @@ export class FSCore {
254258
}
255259
}
256260

257-
public expand(node: CompositeTreeNode) {
258-
this.model && this.model.expandNode(node as any);
261+
public async expand(node: CompositeTreeNode) {
262+
this.model && await this.model.expandNode(node as any);
263+
}
264+
265+
public expandAndWait(node: FSContainerNode) {
266+
return new Promise(resolve => {
267+
this.addLoadEvent(node, node => {
268+
resolve(null);
269+
return true;
270+
});
271+
this.expand(node);
272+
})
273+
}
274+
275+
public async ensureExpanded(node: FSContainerNode) {
276+
if (!node.expanded && !node.loaded) {
277+
await this.expandAndWait(node);
278+
}
259279
}
260280

261281
public getNode(id: string): FSNode | undefined {
@@ -360,10 +380,54 @@ export class FSCore {
360380
return false;
361381
}
362382

363-
protected endLoading(node: TreeNode): void {
383+
protected async endLoading(node: TreeNode) {
364384
if (FSNode.is(node)) {
365385
node.loading = false;
366-
this.refresh();
386+
await this.refresh();
387+
if (this.loadEvents[node.id]) {
388+
// const a =
389+
this.loadEvents[node.id] = await (await Promise.all(this.loadEvents[node.id].map(async event => {
390+
const result = event(node);
391+
if (!result) {
392+
return event;
393+
}
394+
if (result === true) {
395+
return null;
396+
}
397+
return await result ? null : event
398+
}))).filter(event => event != null) as FSLoadEvent[];
399+
if (this.loadEvents[node.id].length < 1) {
400+
delete(this.loadEvents[node.id]);
401+
}
402+
}
403+
}
404+
(window as any).loadEvents = this.loadEvents;
405+
}
406+
407+
protected addLoadEvent(node: TreeNode, event: FSLoadEvent): void {
408+
if (FSNode.is(node)) {
409+
if (!this.loadEvents[node.id]) {
410+
this.loadEvents[node.id] = [event];
411+
} else {
412+
if (!this.loadEvents[node.id].find(value => value === event)) {
413+
this.loadEvents[node.id].push(event);
414+
}
415+
}
416+
}
417+
}
418+
419+
protected removeLoadEvent(node: TreeNode, event?: FSLoadEvent): void {
420+
if (FSNode.is(node)) {
421+
if (this.loadEvents[node.id]) {
422+
if (event) {
423+
this.loadEvents[node.id] = this.loadEvents[node.id].filter(value => value != event);
424+
if (this.loadEvents[node.id].length < 1) {
425+
delete(this.loadEvents[node.id]);
426+
}
427+
} else {
428+
delete(this.loadEvents[node.id]);
429+
}
430+
}
367431
}
368432
}
369433

@@ -1450,6 +1514,7 @@ export class FSCore {
14501514
return false;
14511515
}
14521516
const collection = this.node as FSCollectionNode;
1517+
await this.ensureExpanded(collection);
14531518
const validator = (input: string) => input !== '' && !this.fileExists(input);
14541519
let initialName = this.newName(validator);
14551520
if (extension) {
@@ -1545,6 +1610,7 @@ export class FSCore {
15451610
}
15461611
}
15471612
if (FSNode.isCollection(collection)) {
1613+
await this.ensureExpanded(collection);
15481614
const validator = (input: string) => input !== '' && !this.fileExists(input);
15491615
const dialog = new SingleTextInputDialog({
15501616
initialValue: this.newName(validator),

fusion-studio-extension/src/classes/node.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import { FSRestURI, FSRestMethod } from "./rest";
55

66

77
export type FSNodeType = 'connection' | 'toolbar' | 'item' | 'users' | 'groups' | 'user' | 'group' | 'security' | 'indexes' | 'index' | 'rest' | 'rest-uri' | 'rest-method';
8+
export type FSLoadEvent = (mode: FSNode) => void | true | Promise<void | true>;
9+
810
export interface FSNode extends TreeNode {
911
type: FSNodeType;
1012
connectionNode: FSConnectionNode;

0 commit comments

Comments
 (0)