Skip to content

Commit 61955c1

Browse files
committed
expand a collapsed collection when creating items
1 parent 434d656 commit 61955c1

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";
@@ -66,6 +66,7 @@ export class FSCore {
6666
updating = false;
6767
renaming = '';
6868
dict: Record<string, FSNode> = {};
69+
loadEvents: Record<string, (FSLoadEvent)[]> = {};
6970

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

195196
protected removeNode(child: FSNode) {
197+
if (this.loadEvents[child.id]) {
198+
delete(this.loadEvents[child.id]);
199+
}
196200
const removeNodeId = (node: FSNode) => {
197201
delete(this.dict[node.nodeId]);
198202
if (CompositeTreeNode.is(node)) {
@@ -255,8 +259,24 @@ export class FSCore {
255259
}
256260
}
257261

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

262282
public getNode(id: string): FSNode | undefined {
@@ -361,10 +381,54 @@ export class FSCore {
361381
return false;
362382
}
363383

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

@@ -1449,6 +1513,7 @@ export class FSCore {
14491513
return false;
14501514
}
14511515
const collection = this.node as FSCollectionNode;
1516+
await this.ensureExpanded(collection);
14521517
const validator = (input: string) => input !== '' && !this.fileExists(input);
14531518
let initialName = this.newName(validator);
14541519
if (extension) {
@@ -1544,6 +1609,7 @@ export class FSCore {
15441609
}
15451610
}
15461611
if (FSNode.isCollection(collection)) {
1612+
await this.ensureExpanded(collection);
15471613
const validator = (input: string) => input !== '' && !this.fileExists(input);
15481614
const dialog = new SingleTextInputDialog({
15491615
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)