diff --git a/src/sql/base/parts/tree/browser/treeModel.ts b/src/sql/base/parts/tree/browser/treeModel.ts index 92d1aeda79..68a7ef5573 100644 --- a/src/sql/base/parts/tree/browser/treeModel.ts +++ b/src/sql/base/parts/tree/browser/treeModel.ts @@ -959,7 +959,7 @@ export class TreeModel { return this.input ? this.input.getElement() : null; } - public refresh(element: any = null, recursive: boolean = true): Promise { + public async refresh(element: any = null, recursive: boolean = true): Promise { let item = this.getItem(element); if (!item) { @@ -968,9 +968,8 @@ export class TreeModel { let eventData: IRefreshEvent = { item: item, recursive: recursive }; this._onRefresh.fire(eventData); - return item.refresh(recursive).then(() => { - this._onDidRefresh.fire(eventData); - }); + await item.refresh(recursive); + this._onDidRefresh.fire(eventData); } public expand(element: any): Promise { diff --git a/src/sql/base/parts/tree/browser/treeView.ts b/src/sql/base/parts/tree/browser/treeView.ts index 30d2ed8d34..ba7fbf5007 100644 --- a/src/sql/base/parts/tree/browser/treeView.ts +++ b/src/sql/base/parts/tree/browser/treeView.ts @@ -392,7 +392,13 @@ function reactionEquals(one: _.IDragOverReaction, other: _.IDragOverReaction | n export class TreeView extends HeightMap { static readonly BINDING = 'monaco-tree-row'; - static readonly LOADING_DECORATION_DELAY = 800; + + /** + * The delay here is used here to display the loading status after a certain number of milliseconds. + * It was changed from 800 as it turns out that refreshes happen instantly before the status + * can be notified to the user. With 100 ms, the refresh indicator will now be visible in most instances. + * */ + static readonly LOADING_DECORATION_DELAY = 100; private static counter: number = 0; private instance: number; diff --git a/src/sql/workbench/contrib/objectExplorer/test/browser/connectionTreeActions.test.ts b/src/sql/workbench/contrib/objectExplorer/test/browser/connectionTreeActions.test.ts index 24b9d71c0f..489906fe26 100644 --- a/src/sql/workbench/contrib/objectExplorer/test/browser/connectionTreeActions.test.ts +++ b/src/sql/workbench/contrib/objectExplorer/test/browser/connectionTreeActions.test.ts @@ -450,7 +450,7 @@ suite('SQL Connection Tree Action tests', () => { return refreshAction.run().then((value) => { connectionManagementService.verify(x => x.isConnected(undefined, TypeMoq.It.isAny()), TypeMoq.Times.atLeastOnce()); objectExplorerService.verify(x => x.getObjectExplorerNode(TypeMoq.It.isAny()), TypeMoq.Times.atLeastOnce()); - objectExplorerService.verify(x => x.refreshTreeNode(TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.Times.atLeastOnce()); + objectExplorerService.verify(x => x.refreshTreeNode(TypeMoq.It.isAny(), TypeMoq.It.isAny()), TypeMoq.Times.exactly(0)); tree.verify(x => x.refresh(TypeMoq.It.isAny()), TypeMoq.Times.atLeastOnce()); }); }); diff --git a/src/sql/workbench/services/objectExplorer/browser/connectionTreeAction.ts b/src/sql/workbench/services/objectExplorer/browser/connectionTreeAction.ts index 635b5dfa71..80ebd4cdcd 100644 --- a/src/sql/workbench/services/objectExplorer/browser/connectionTreeAction.ts +++ b/src/sql/workbench/services/objectExplorer/browser/connectionTreeAction.ts @@ -60,16 +60,17 @@ export class RefreshAction extends Action { if (treeNode) { try { - try { - const session = treeNode.getSession(); - if (session) { - await this._objectExplorerService.refreshTreeNode(session, treeNode); - } - } catch (error) { - this.showError(error); - return; - } if (this._tree instanceof AsyncServerTree) { + // Code moved here as non async tree already does it in it's refresh function (required to show loading spinner) + try { + const session = treeNode.getSession(); + if (session) { + await this._objectExplorerService.refreshTreeNode(session, treeNode); + } + } catch (error) { + this.showError(error); + return; + } await this._tree.updateChildren(this.element); } else { await this._tree.refresh(this.element); diff --git a/src/sql/workbench/services/objectExplorer/browser/serverTreeDataSource.ts b/src/sql/workbench/services/objectExplorer/browser/serverTreeDataSource.ts index 989218b147..ee1dc49f1e 100644 --- a/src/sql/workbench/services/objectExplorer/browser/serverTreeDataSource.ts +++ b/src/sql/workbench/services/objectExplorer/browser/serverTreeDataSource.ts @@ -62,21 +62,20 @@ export class ServerTreeDataSource implements IDataSource { return (element as ConnectionProfileGroup).getChildren(); } else if (element instanceof TreeNode) { let node = element; - if (node.children) { + try { + // Grab the latest data from the server of the node's children. + await this._objectExplorerService.refreshTreeNode(node.getSession()!, node); return node.children; - } else { - try { - return this._objectExplorerService.resolveTreeNodeChildren(node.getSession()!, node); - } catch (expandError) { - await node.setExpandedState(TreeItemCollapsibleState.Collapsed); - node.errorStateMessage = expandError; - this.showError(expandError); - // collapse node and refresh in case of error so remove tree cache - setTimeout(() => { - tree.collapse(element).then(() => tree.refresh(element)); - }); - return []; - } + } + catch (expandRefreshError) { + await node.setExpandedState(TreeItemCollapsibleState.Collapsed); + node.errorStateMessage = expandRefreshError; + this.showError(expandRefreshError); + // collapse node and refresh in case of error so remove tree cache + setTimeout(() => { + tree.collapse(element).then(() => tree.refresh(element)); + }); + return []; } } return []; diff --git a/src/sql/workbench/services/objectExplorer/browser/treeCreationUtils.ts b/src/sql/workbench/services/objectExplorer/browser/treeCreationUtils.ts index 107ec4ddc2..c46cbcb158 100644 --- a/src/sql/workbench/services/objectExplorer/browser/treeCreationUtils.ts +++ b/src/sql/workbench/services/objectExplorer/browser/treeCreationUtils.ts @@ -134,7 +134,8 @@ export class TreeCreationUtils { indentPixels: 10, twistiePixels: 20, ariaLabel: nls.localize('treeCreation.regTreeAriaLabel', "Servers"), - horizontalScrollMode: horizontalScrollMode ? ScrollbarVisibility.Auto : ScrollbarVisibility.Hidden + horizontalScrollMode: horizontalScrollMode ? ScrollbarVisibility.Auto : ScrollbarVisibility.Hidden, + showLoading: true }); }