From ab1112bfb34a68f8bd4b67dcee815ba04bc7333d Mon Sep 17 00:00:00 2001 From: Alan Ren Date: Wed, 25 Aug 2021 14:52:45 -0700 Subject: [PATCH] fix refresh node and add sample (#16888) --- samples/sqlservices/package.json | 8 ++- .../src/controllers/mainController.ts | 4 ++ .../objectExplorerProvider.ts | 71 ++++++++++++------- .../browser/objectExplorerService.ts | 4 +- 4 files changed, 58 insertions(+), 29 deletions(-) diff --git a/samples/sqlservices/package.json b/samples/sqlservices/package.json index f2b256f805..45404b6cf2 100644 --- a/samples/sqlservices/package.json +++ b/samples/sqlservices/package.json @@ -44,6 +44,10 @@ { "command": "sqlservices.openModelViewDashboard", "title": "sqlservices.openModelViewDashboard" + }, + { + "command": "sqlservices.updateObjectExplorerNode", + "title": "sqlservices.updateObjectExplorerNode" } ], "dashboard.tabs": [ @@ -193,8 +197,8 @@ "menus": { "objectExplorer/item/context": [ { - "command": "sqlservices.openDialog", - "when": "nodeType =~ /^(Database|Server)$/ && connectionProvider == TESTPROVIDER" + "command": "sqlservices.updateObjectExplorerNode", + "when": "connectionProvider == TESTPROVIDER" } ] } diff --git a/samples/sqlservices/src/controllers/mainController.ts b/samples/sqlservices/src/controllers/mainController.ts index 71408bd3fa..9c2f26f033 100644 --- a/samples/sqlservices/src/controllers/mainController.ts +++ b/samples/sqlservices/src/controllers/mainController.ts @@ -87,6 +87,10 @@ export default class MainController implements vscode.Disposable { dashboard.openModelViewDashboard(this.context); }); + vscode.commands.registerCommand('sqlservices.updateObjectExplorerNode', async (context: azdata.ObjectExplorerContext) => { + await objectExplorer.updateNode(context); + }); + return Promise.resolve(true); } diff --git a/samples/sqlservices/src/featureProviders/objectExplorerProvider.ts b/samples/sqlservices/src/featureProviders/objectExplorerProvider.ts index c70aa162a0..55ce85a34c 100644 --- a/samples/sqlservices/src/featureProviders/objectExplorerProvider.ts +++ b/samples/sqlservices/src/featureProviders/objectExplorerProvider.ts @@ -6,6 +6,8 @@ import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { ProviderId } from './connectionProvider'; +const RootNode: string = 'root'; + /** * This class implements the ObjectExplorerProvider interface that is responsible for providing the connection tree view content. */ @@ -28,7 +30,7 @@ export class ObjectExplorerProvider implements azdata.ObjectExplorerProvider { sessionId: '1', success: true, rootNode: { - nodePath: 'root', + nodePath: RootNode, nodeType: 'server', label: 'abc', isLeaf: false @@ -55,34 +57,20 @@ export class ObjectExplorerProvider implements azdata.ObjectExplorerProvider { handler(e); }); } + + /** + * This is called when a node is being expanded for the first time + */ expandNode(nodeInfo: azdata.ExpandNodeInfo): Thenable { - setTimeout(() => { - this.onExpandCompletedEmitter.fire({ - sessionId: nodeInfo.sessionId, - nodePath: nodeInfo.nodePath, - nodes: [ - { - nodePath: 'root/1', - nodeType: '', - icon: { - light: this.context.asAbsolutePath('images/group.svg'), - dark: this.context.asAbsolutePath('images/group_inverse.svg') - }, - label: 'obj 1', - isLeaf: false - }, { - nodePath: 'root/2', - nodeType: '', - icon: azdata.SqlThemeIcon.Column, - label: 'obj 2', - isLeaf: false - } - ] - }); - }, 500); + this.executeExpandNode(nodeInfo); return Promise.resolve(true); } + + /** + * This is called when a node is being refreshed, This is triggered by the 'Refresh' context menu item of the node. + */ refreshNode(nodeInfo: azdata.ExpandNodeInfo): Thenable { + this.executeExpandNode(nodeInfo); return Promise.resolve(true); } findNodes(findNodesInfo: azdata.FindNodesInfo): Thenable { @@ -95,4 +83,37 @@ export class ObjectExplorerProvider implements azdata.ObjectExplorerProvider { } handle?: number; providerId: string = ProviderId; + + private executeExpandNode(nodeInfo: azdata.ExpandNodeInfo): void { + setTimeout(() => { + const timestamp = new Date(Date.now()).toLocaleTimeString(); + this.onExpandCompletedEmitter.fire({ + sessionId: nodeInfo.sessionId, + nodePath: nodeInfo.nodePath, + nodes: [ + { + nodePath: nodeInfo.nodePath + '/1', + nodeType: '', + icon: { + light: this.context.asAbsolutePath('images/group.svg'), + dark: this.context.asAbsolutePath('images/group_inverse.svg') + }, + label: `obj 1 - ${timestamp}`, + isLeaf: false + }, { + nodePath: nodeInfo.nodePath + '/2', + nodeType: '', + icon: azdata.SqlThemeIcon.Column, + label: `obj 2 - ${timestamp}`, + isLeaf: false + } + ] + }); + }, 500); + } + + public async updateNode(node: azdata.ObjectExplorerContext): Promise { + const node1 = await azdata.objectexplorer.getNode(node.connectionProfile.id, node.isConnectionNode ? RootNode : node.nodeInfo.nodePath); + await node1.refresh(); + } } diff --git a/src/sql/workbench/services/objectExplorer/browser/objectExplorerService.ts b/src/sql/workbench/services/objectExplorer/browser/objectExplorerService.ts index 492a3ce774..28da3153ac 100644 --- a/src/sql/workbench/services/objectExplorer/browser/objectExplorerService.ts +++ b/src/sql/workbench/services/objectExplorer/browser/objectExplorerService.ts @@ -44,7 +44,7 @@ export interface IServerTreeView { deleteObjectExplorerNodeAndRefreshTree(profile: ConnectionProfile): Promise; getSelection(): Array; isFocused(): boolean; - refreshElement(node: TreeNode): Promise; + refreshElement(node: ServerTreeElement): Promise; readonly treeActionProvider: ServerTreeActionProvider; isExpanded(node?: ServerTreeElement): boolean; reveal(node: ServerTreeElement): Promise; @@ -722,7 +722,7 @@ export class ObjectExplorerService implements IObjectExplorerService { if (!treeNode) { return undefined; } - await this._serverTreeView?.refreshElement(treeNode); + await this._serverTreeView?.refreshElement(this.getTreeItem(treeNode)); if (treeNode?.children?.length ?? -1 > 0) { await treeNode?.setExpandedState(TreeItemCollapsibleState.Expanded); }