From ef8afab7e8e6257726e5d7677de0cb213b0b6558 Mon Sep 17 00:00:00 2001 From: Yurong He <43652751+YurongHe@users.noreply.github.com> Date: Mon, 4 Feb 2019 19:18:58 -0800 Subject: [PATCH] Added error node to OE tree (#3889) * Add error node to OE tree * Add globalerror_red.svg for error node. * Fixed wrong import resolved automatically * Resolve PR comments --- extensions/mssql/src/constants.ts | 2 +- .../hdfsProvider.ts | 16 +++++++------- .../objectExplorerNodeProvider.ts | 8 +++++++ src/sql/media/icons/common-icons.css | 6 +++++ src/sql/media/icons/globalerror_red.svg | 1 + .../common/objectExplorerService.ts | 22 ++++++++++++------- 6 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 src/sql/media/icons/globalerror_red.svg diff --git a/extensions/mssql/src/constants.ts b/extensions/mssql/src/constants.ts index e693de94a3..7bbd5deb0c 100644 --- a/extensions/mssql/src/constants.ts +++ b/extensions/mssql/src/constants.ts @@ -52,7 +52,7 @@ export enum MssqlClusterItems { Connection = 'mssqlCluster:connection', Folder = 'mssqlCluster:folder', File = 'mssqlCluster:file', - Message = 'mssqlCluster:message' + Error = 'mssqlCluster:error' } export enum MssqlClusterItemsSubType { diff --git a/extensions/mssql/src/objectExplorerNodeProvider/hdfsProvider.ts b/extensions/mssql/src/objectExplorerNodeProvider/hdfsProvider.ts index b90383a127..778e8de7fc 100644 --- a/extensions/mssql/src/objectExplorerNodeProvider/hdfsProvider.ts +++ b/extensions/mssql/src/objectExplorerNodeProvider/hdfsProvider.ts @@ -55,7 +55,7 @@ export class HdfsProvider implements vscode.TreeDataProvider, ITreeCha if (element) { return element.getChildren(false); } else { - return this.connections.length > 0 ? this.connections : [MessageNode.create(HdfsProvider.NoConnectionsMessage, element)]; + return this.connections.length > 0 ? this.connections : [ErrorNode.create(HdfsProvider.NoConnectionsMessage, element)]; } } @@ -136,7 +136,7 @@ export class FolderNode extends HdfsFileSourceNode { }); } } catch (error) { - this.children = [MessageNode.create(localize('errorExpanding', 'Error: {0}', utils.getErrorMessage(error)), this)]; + this.children = [ErrorNode.create(localize('errorExpanding', 'Error: {0}', utils.getErrorMessage(error)), this)]; } } return this.children; @@ -313,7 +313,7 @@ export class FileNode extends HdfsFileSourceNode implements IFileNode { } } -export class MessageNode extends TreeNode { +export class ErrorNode extends TreeNode { static messageNum: number = 0; private _nodePathValue: string; @@ -321,15 +321,15 @@ export class MessageNode extends TreeNode { super(); } - public static create(message: string, parent: TreeNode): MessageNode { - let node = new MessageNode(message); + public static create(message: string, parent: TreeNode): ErrorNode { + let node = new ErrorNode(message); node.parent = parent; return node; } private ensureNodePathValue(): void { if (!this._nodePathValue) { - this._nodePathValue = `message_${MessageNode.messageNum++}`; + this._nodePathValue = `message_${ErrorNode.messageNum++}`; } } @@ -344,7 +344,7 @@ export class MessageNode extends TreeNode { public getTreeItem(): vscode.TreeItem | Promise { let item = new vscode.TreeItem(this.message, vscode.TreeItemCollapsibleState.None); - item.contextValue = Constants.MssqlClusterItems.Message; + item.contextValue = Constants.MssqlClusterItems.Error; return item; } @@ -357,7 +357,7 @@ export class MessageNode extends TreeNode { metadata: undefined, nodePath: this.generateNodePath(), nodeStatus: undefined, - nodeType: Constants.MssqlClusterItems.Message, + nodeType: Constants.MssqlClusterItems.Error, nodeSubType: undefined, iconType: 'MessageType' }; diff --git a/extensions/mssql/src/objectExplorerNodeProvider/objectExplorerNodeProvider.ts b/extensions/mssql/src/objectExplorerNodeProvider/objectExplorerNodeProvider.ts index 64aa23ea07..3223ba7803 100644 --- a/extensions/mssql/src/objectExplorerNodeProvider/objectExplorerNodeProvider.ts +++ b/extensions/mssql/src/objectExplorerNodeProvider/objectExplorerNodeProvider.ts @@ -139,6 +139,14 @@ export class MssqlObjectExplorerNodeProvider extends ProviderBase implements sql let children = await node.getChildren(true); if (children) { expandResult.nodes = children.map(c => c.getNodeInfo()); + // There is only child returned when failure happens + if (children.length === 1) { + let child = children[0].getNodeInfo(); + if (child && child.nodeType === constants.MssqlClusterItems.Error) { + expandResult.errorMessage = child.label; + expandResult.nodes = []; + } + } } } } catch (error) { diff --git a/src/sql/media/icons/common-icons.css b/src/sql/media/icons/common-icons.css index ca4c21c22e..2960f0d6fe 100644 --- a/src/sql/media/icons/common-icons.css +++ b/src/sql/media/icons/common-icons.css @@ -30,6 +30,12 @@ background: url("database_inverse.svg") center center no-repeat; } +.vs .icon.error, +.vs-dark .icon.error, +.hc-black .icon.error { + background: url("globalerror_red.svg") center center no-repeat; +} + .vs .icon.file { background: url("file.svg") center center no-repeat; } diff --git a/src/sql/media/icons/globalerror_red.svg b/src/sql/media/icons/globalerror_red.svg new file mode 100644 index 0000000000..309574a48e --- /dev/null +++ b/src/sql/media/icons/globalerror_red.svg @@ -0,0 +1 @@ +globalerror_red \ No newline at end of file diff --git a/src/sql/parts/objectExplorer/common/objectExplorerService.ts b/src/sql/parts/objectExplorer/common/objectExplorerService.ts index cfa3e6f307..a958b921d3 100644 --- a/src/sql/parts/objectExplorer/common/objectExplorerService.ts +++ b/src/sql/parts/objectExplorer/common/objectExplorerService.ts @@ -375,7 +375,7 @@ export class ObjectExplorerService implements IObjectExplorerService { if (expandResult && expandResult.providerId) { resultMap.set(expandResult.providerId, expandResult); } else { - console.log('OE provider returns empty result or providerId'); + error('OE provider returns empty result or providerId'); } // When get all responses from all providers, merge results @@ -390,7 +390,6 @@ export class ObjectExplorerService implements IObjectExplorerService { }); if (newRequest) { allProviders.forEach(provider => { - TelemetryUtils.addTelemetry(this._telemetryService, TelemetryKeys.ObjectExplorerExpand, { refresh: 0, provider: providerId }); self.callExpandOrRefreshFromProvider(provider, { sessionId: session.sessionId, nodePath: nodePath @@ -424,29 +423,36 @@ export class ObjectExplorerService implements IObjectExplorerService { nodePath: nodePath, label: 'Error', errorMessage: '', - nodeType: 'folder', + nodeType: 'error', isLeaf: true, nodeSubType: '', nodeStatus: '', metadata: null }; - + let errorMessages: string[] = []; for (let provider of allProviders) { if (resultMap.has(provider.providerId)) { let result = resultMap.get(provider.providerId); if (result) { if (!result.errorMessage) { finalResult = result; - allNodes = allNodes.concat(result.nodes); + if (result.nodes !== undefined && result.nodes) { + allNodes = allNodes.concat(result.nodes); + } } else { - errorNode.errorMessage += provider.providerId + 'returns ' + result.errorMessage + ' '; + errorMessages.push(result.errorMessage); } } } } if (finalResult) { - if (errorNode.errorMessage && errorNode.errorMessage.length > 0) { - allNodes = allNodes.concat([errorNode]); + if (errorMessages.length > 0) { + if (errorMessages.length > 1) { + errorMessages.unshift(nls.localize('nodeExpansionError', 'Mulitiple errors:')); + } + errorNode.errorMessage = errorMessages.join('\n'); + errorNode.label = errorNode.errorMessage; + allNodes = [errorNode].concat(allNodes); } finalResult.nodes = allNodes;