mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-31 01:25:38 -05:00
CMS Extension - 2 (#4908)
* first set of changes to experiment the registration of cms related apis * Adding cms service entry to workbench * Adding basic functionality for add remove reg servers and group * Returning relative path as part of RegServerResult as string * initial extension * cleaned building with connecting to server * get list of registered servers * progress with registered servers tree * cms base node with server selection * removed unused services * replaced azure stuff with cms * removed cmsResourceService * list servers progress * Removing the cms apis from core. Having mssql extension expose them for cms extension * create server working fine * initial expansion and nodes * Propogating the backend name changes to apis * initial cms extension working * cached connection needs change in api * connect without dashboard in proposed * Fixing some missing sqlops references * add registered server bug found * added refresh context menu option * added payload * server description not disabled after reject connection * added more context actions and action icons * added empty resource and error when same name server is added * fixed connection issues with cms and normal connections * added initial tests * added cms icons * removed azure readme * test script revert * fix build tests * added more cms tests * fixed test script * fixed silent error when expanding servers * added more cms tests * removed cmsdialog from api * cms dialog without object * fixed theming issues * initial connection dialog done * can make connections * PM asks for strings and icons * removed search * removed unused code and fixed 1 test * fix connection management tests * changed icons * format file * fixed hygiene * initial cr comments * refactored cms connection dialog * fixed bug when switching dialogs * localized connection provider options * fixed cms provider name * code review comments * localized options in cms and mssql * localized more options
This commit is contained in:
44
extensions/cms/src/cmsResource/tree/baseTreeNodes.ts
Normal file
44
extensions/cms/src/cmsResource/tree/baseTreeNodes.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
import * as azdata from 'azdata';
|
||||
import { AppContext } from '../../appContext';
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { ICmsResourceTreeChangeHandler } from './treeChangeHandler';
|
||||
|
||||
export abstract class CmsResourceTreeNodeBase extends TreeNode {
|
||||
|
||||
public constructor(
|
||||
private _name: string,
|
||||
private _description: string,
|
||||
private _ownerUri: string,
|
||||
public readonly appContext: AppContext,
|
||||
public readonly treeChangeHandler: ICmsResourceTreeChangeHandler,
|
||||
parent: TreeNode
|
||||
) {
|
||||
super();
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
public get name(): string {
|
||||
return this._name;
|
||||
}
|
||||
|
||||
public get description(): string {
|
||||
return this._description;
|
||||
}
|
||||
|
||||
public get ownerUri(): string {
|
||||
return this._ownerUri;
|
||||
}
|
||||
}
|
||||
|
||||
export interface ICmsResourceNodeInfo {
|
||||
name: string;
|
||||
description: string;
|
||||
ownerUri: string;
|
||||
connection: azdata.connection.Connection;
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
|
||||
import { NodeInfo } from 'azdata';
|
||||
import * as nls from 'vscode-nls';
|
||||
const localize = nls.loadMessageBundle();
|
||||
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { CmsResourceItemType } from '../constants';
|
||||
|
||||
export class CmsResourceEmptyTreeNode extends TreeNode {
|
||||
public getChildren(): TreeNode[] | Promise<TreeNode[]> {
|
||||
return [];
|
||||
}
|
||||
|
||||
public getTreeItem(): TreeItem | Promise<TreeItem> {
|
||||
let item = new TreeItem(CmsResourceEmptyTreeNode.addCmsServerLabel, TreeItemCollapsibleState.None);
|
||||
item.command = {
|
||||
title: CmsResourceEmptyTreeNode.addCmsServerLabel,
|
||||
command: 'cms.resource.registerCMSServer',
|
||||
arguments: [this]
|
||||
};
|
||||
item.contextValue = CmsResourceItemType.cmsEmptyNodeContainer;
|
||||
return item;
|
||||
}
|
||||
|
||||
public getNodeInfo(): NodeInfo {
|
||||
return {
|
||||
label: CmsResourceEmptyTreeNode.addCmsServerLabel,
|
||||
isLeaf: true,
|
||||
errorMessage: undefined,
|
||||
metadata: undefined,
|
||||
nodePath: this.generateNodePath(),
|
||||
nodeStatus: undefined,
|
||||
nodeType: CmsResourceItemType.cmsEmptyNodeContainer,
|
||||
iconType: CmsResourceItemType.cmsEmptyNodeContainer,
|
||||
nodeSubType: undefined
|
||||
};
|
||||
}
|
||||
|
||||
public get nodePathValue(): string {
|
||||
return 'message_cmsTreeNode';
|
||||
}
|
||||
|
||||
private static readonly addCmsServerLabel = localize('cms.resource.tree.CMSTreeNode.addCmsServerLabel', 'Add Central Management Server...');
|
||||
}
|
||||
124
extensions/cms/src/cmsResource/tree/cmsResourceTreeNode.ts
Normal file
124
extensions/cms/src/cmsResource/tree/cmsResourceTreeNode.ts
Normal file
@@ -0,0 +1,124 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
import * as azdata from 'azdata';
|
||||
import * as nls from 'vscode-nls';
|
||||
import { TreeItemCollapsibleState } from 'vscode';
|
||||
import { AppContext } from '../../appContext';
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { CmsResourceTreeNodeBase } from './baseTreeNodes';
|
||||
import { CmsResourceItemType } from '../constants';
|
||||
import { ICmsResourceTreeChangeHandler } from './treeChangeHandler';
|
||||
import { RegisteredServerTreeNode } from './registeredServerTreeNode';
|
||||
import { ServerGroupTreeNode } from './serverGroupTreeNode';
|
||||
import { CmsResourceMessageTreeNode } from '../messageTreeNode';
|
||||
|
||||
const localize = nls.loadMessageBundle();
|
||||
|
||||
export class CmsResourceTreeNode extends CmsResourceTreeNodeBase {
|
||||
|
||||
private _id: string = undefined;
|
||||
private _serverGroupNodes: ServerGroupTreeNode[] = [];
|
||||
|
||||
public constructor(
|
||||
name: string,
|
||||
description: string,
|
||||
ownerUri: string,
|
||||
private _connection: azdata.connection.Connection,
|
||||
appContext: AppContext,
|
||||
treeChangeHandler: ICmsResourceTreeChangeHandler,
|
||||
parent: TreeNode
|
||||
) {
|
||||
super(name, description, ownerUri, appContext, treeChangeHandler, parent);
|
||||
this._id = `cms_cmsServer_${this.name}`;
|
||||
}
|
||||
|
||||
public async getChildren(): Promise<TreeNode[]> {
|
||||
try {
|
||||
let nodes: TreeNode[] = [];
|
||||
return this.appContext.apiWrapper.createCmsServer(this.connection, this.name, this.description).then(async (result) => {
|
||||
if (result) {
|
||||
if (result.registeredServersList) {
|
||||
result.registeredServersList.forEach((registeredServer) => {
|
||||
nodes.push(new RegisteredServerTreeNode(
|
||||
registeredServer.name,
|
||||
registeredServer.description,
|
||||
registeredServer.serverName,
|
||||
registeredServer.relativePath,
|
||||
this.ownerUri,
|
||||
this.appContext,
|
||||
this.treeChangeHandler, this));
|
||||
});
|
||||
}
|
||||
if (result.registeredServerGroups) {
|
||||
if (result.registeredServerGroups) {
|
||||
this._serverGroupNodes = [];
|
||||
result.registeredServerGroups.forEach((serverGroup) => {
|
||||
let serverGroupNode = new ServerGroupTreeNode(
|
||||
serverGroup.name,
|
||||
serverGroup.description,
|
||||
serverGroup.relativePath,
|
||||
this.ownerUri,
|
||||
this.appContext,
|
||||
this.treeChangeHandler, this);
|
||||
nodes.push(serverGroupNode);
|
||||
this._serverGroupNodes.push(serverGroupNode);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (nodes.length > 0) {
|
||||
return nodes;
|
||||
} else {
|
||||
return [CmsResourceMessageTreeNode.create(CmsResourceTreeNode.noResourcesLabel, undefined)];
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
public getTreeItem(): azdata.TreeItem | Promise<azdata.TreeItem> {
|
||||
const item = new azdata.TreeItem(this.name, TreeItemCollapsibleState.Collapsed);
|
||||
item.contextValue = CmsResourceItemType.cmsNodeContainer;
|
||||
item.id = this._id;
|
||||
item.tooltip = this.description;
|
||||
item.iconPath = {
|
||||
dark: this.appContext.extensionContext.asAbsolutePath('resources/light/centralmanagement_server.svg'),
|
||||
light: this.appContext.extensionContext.asAbsolutePath('resources/light/centralmanagement_server.svg')
|
||||
};
|
||||
return item;
|
||||
}
|
||||
|
||||
public getNodeInfo(): azdata.NodeInfo {
|
||||
return {
|
||||
label: this.name,
|
||||
isLeaf: false,
|
||||
errorMessage: undefined,
|
||||
metadata: undefined,
|
||||
nodePath: this.generateNodePath(),
|
||||
nodeStatus: undefined,
|
||||
nodeType: CmsResourceItemType.cmsNodeContainer,
|
||||
nodeSubType: undefined,
|
||||
iconType: CmsResourceItemType.cmsNodeContainer
|
||||
};
|
||||
}
|
||||
|
||||
public get nodePathValue(): string {
|
||||
return this._id;
|
||||
}
|
||||
|
||||
public get connection(): azdata.connection.Connection {
|
||||
return this._connection;
|
||||
}
|
||||
|
||||
public get serverGroupNodes(): ServerGroupTreeNode[] {
|
||||
return this._serverGroupNodes;
|
||||
}
|
||||
|
||||
public static readonly noResourcesLabel = localize('cms.resource.cmsResourceTreeNode.noResourcesLabel', 'No resources found');
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
import * as azdata from 'azdata';
|
||||
import { TreeItemCollapsibleState } from 'vscode';
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { CmsResourceItemType } from '../constants';
|
||||
import { CmsResourceTreeNodeBase } from './baseTreeNodes';
|
||||
import { AppContext } from '../../appContext';
|
||||
import { ICmsResourceTreeChangeHandler } from './treeChangeHandler';
|
||||
import { generateGuid } from '../utils';
|
||||
|
||||
export class RegisteredServerTreeNode extends CmsResourceTreeNodeBase {
|
||||
|
||||
private _id: string = undefined;
|
||||
|
||||
constructor(
|
||||
name: string,
|
||||
description: string,
|
||||
private serverName: string,
|
||||
private _relativePath: string,
|
||||
ownerUri: string,
|
||||
appContext: AppContext,
|
||||
treeChangeHandler: ICmsResourceTreeChangeHandler,
|
||||
parent: TreeNode
|
||||
) {
|
||||
super(name, description, ownerUri, appContext, treeChangeHandler, parent);
|
||||
this._id = `cms_registeredServer_${this.name ? this.name : this.serverName}`;
|
||||
}
|
||||
|
||||
public async getChildren(): Promise<TreeNode[]> {
|
||||
return;
|
||||
}
|
||||
|
||||
public getTreeItem(): azdata.TreeItem | Promise<azdata.TreeItem> {
|
||||
let payload = {
|
||||
id: generateGuid(),
|
||||
connectionName: this.name ? this.name : this.serverName,
|
||||
serverName: this.serverName,
|
||||
databaseName: '',
|
||||
userName: undefined,
|
||||
password: undefined,
|
||||
authenticationType: 'Integrated',
|
||||
savePassword: false,
|
||||
groupFullName: '',
|
||||
groupId: '',
|
||||
providerName: 'MSSQL',
|
||||
saveProfile: false,
|
||||
options: {}
|
||||
};
|
||||
let treeItem = {
|
||||
payload: payload,
|
||||
id: this._id,
|
||||
tooltip: this.description,
|
||||
contextValue: CmsResourceItemType.registeredServer,
|
||||
collapsibleState: TreeItemCollapsibleState.Collapsed,
|
||||
label: this.name ? this.name : this.serverName,
|
||||
childProvider: 'MSSQL',
|
||||
iconPath: {
|
||||
dark: this.appContext.extensionContext.asAbsolutePath('resources/light/regserverserver.svg'),
|
||||
light: this.appContext.extensionContext.asAbsolutePath('resources/light/regserverserver.svg')
|
||||
}
|
||||
};
|
||||
|
||||
return treeItem;
|
||||
}
|
||||
|
||||
public getNodeInfo(): azdata.NodeInfo {
|
||||
return {
|
||||
label: this.name ? this.name : this.serverName,
|
||||
isLeaf: false,
|
||||
errorMessage: undefined,
|
||||
metadata: undefined,
|
||||
nodePath: this.generateNodePath(),
|
||||
nodeStatus: undefined,
|
||||
nodeType: CmsResourceItemType.registeredServer,
|
||||
nodeSubType: undefined
|
||||
};
|
||||
}
|
||||
|
||||
public get nodePathValue(): string {
|
||||
return this._id;
|
||||
}
|
||||
|
||||
public get relativePath(): string {
|
||||
return this._relativePath;
|
||||
}
|
||||
}
|
||||
119
extensions/cms/src/cmsResource/tree/serverGroupTreeNode.ts
Normal file
119
extensions/cms/src/cmsResource/tree/serverGroupTreeNode.ts
Normal file
@@ -0,0 +1,119 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import { TreeItem, TreeItemCollapsibleState } from 'vscode';
|
||||
import * as azdata from 'azdata';
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { CmsResourceItemType } from '../constants';
|
||||
import { CmsResourceTreeNodeBase } from './baseTreeNodes';
|
||||
import { AppContext } from '../../appContext';
|
||||
import { ICmsResourceTreeChangeHandler } from './treeChangeHandler';
|
||||
import { RegisteredServerTreeNode } from './registeredServerTreeNode';
|
||||
import { CmsResourceMessageTreeNode } from '../messageTreeNode';
|
||||
import { CmsResourceTreeNode } from './cmsResourceTreeNode';
|
||||
|
||||
export class ServerGroupTreeNode extends CmsResourceTreeNodeBase {
|
||||
|
||||
private _id: string = undefined;
|
||||
private _serverGroupNodes: ServerGroupTreeNode[] = [];
|
||||
|
||||
constructor(
|
||||
name: string,
|
||||
description: string,
|
||||
private _relativePath: string,
|
||||
ownerUri: string,
|
||||
appContext: AppContext,
|
||||
treeChangeHandler: ICmsResourceTreeChangeHandler,
|
||||
parent: TreeNode
|
||||
) {
|
||||
super(name, description, ownerUri, appContext, treeChangeHandler, parent);
|
||||
this._id = `cms_serverGroup_${this.name}`;
|
||||
}
|
||||
public getChildren(): TreeNode[] | Promise<TreeNode[]> {
|
||||
try {
|
||||
let nodes = [];
|
||||
return this.appContext.apiWrapper.getRegisteredServers(this.ownerUri, this.relativePath).then((result) => {
|
||||
if (result) {
|
||||
if (result.registeredServersList) {
|
||||
result.registeredServersList.forEach((registeredServer) => {
|
||||
nodes.push(new RegisteredServerTreeNode(
|
||||
registeredServer.name,
|
||||
registeredServer.description,
|
||||
registeredServer.serverName,
|
||||
registeredServer.relativePath,
|
||||
this.ownerUri,
|
||||
this.appContext,
|
||||
this.treeChangeHandler, this));
|
||||
});
|
||||
}
|
||||
if (result.registeredServerGroups) {
|
||||
if (result.registeredServerGroups) {
|
||||
this._serverGroupNodes = [];
|
||||
result.registeredServerGroups.forEach((serverGroup) => {
|
||||
let serverGroupNode = new ServerGroupTreeNode(
|
||||
serverGroup.name,
|
||||
serverGroup.description,
|
||||
serverGroup.relativePath,
|
||||
this.ownerUri,
|
||||
this.appContext, this.treeChangeHandler, this);
|
||||
nodes.push(serverGroupNode);
|
||||
this._serverGroupNodes.push(serverGroupNode);
|
||||
});
|
||||
}
|
||||
}
|
||||
if (nodes.length > 0) {
|
||||
return nodes;
|
||||
} else {
|
||||
return [CmsResourceMessageTreeNode.create(CmsResourceTreeNode.noResourcesLabel, undefined)];
|
||||
}
|
||||
} else {
|
||||
return [CmsResourceMessageTreeNode.create(CmsResourceTreeNode.noResourcesLabel, undefined)];
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public getTreeItem(): TreeItem | Promise<TreeItem> {
|
||||
let item = new TreeItem(this.name, TreeItemCollapsibleState.Collapsed);
|
||||
item.contextValue = CmsResourceItemType.serverGroup;
|
||||
item.id = this._id;
|
||||
item.tooltip = this.description;
|
||||
item.iconPath = {
|
||||
dark: this.appContext.extensionContext.asAbsolutePath('resources/light/folder.svg'),
|
||||
light: this.appContext.extensionContext.asAbsolutePath('resources/light/folder.svg')
|
||||
};
|
||||
return item;
|
||||
}
|
||||
|
||||
public getNodeInfo(): azdata.NodeInfo {
|
||||
return {
|
||||
label: this.name,
|
||||
isLeaf: false,
|
||||
errorMessage: undefined,
|
||||
metadata: undefined,
|
||||
nodePath: this.generateNodePath(),
|
||||
nodeStatus: undefined,
|
||||
nodeType: CmsResourceItemType.serverGroup,
|
||||
nodeSubType: undefined
|
||||
};
|
||||
}
|
||||
|
||||
public get nodePathValue(): string {
|
||||
return this._id;
|
||||
}
|
||||
|
||||
public get relativePath(): string {
|
||||
return this._relativePath;
|
||||
}
|
||||
|
||||
public get serverGroupNodes(): ServerGroupTreeNode[] {
|
||||
return this._serverGroupNodes;
|
||||
}
|
||||
}
|
||||
12
extensions/cms/src/cmsResource/tree/treeChangeHandler.ts
Normal file
12
extensions/cms/src/cmsResource/tree/treeChangeHandler.ts
Normal file
@@ -0,0 +1,12 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
import { TreeNode } from '../treeNode';
|
||||
|
||||
export interface ICmsResourceTreeChangeHandler {
|
||||
notifyNodeChanged(node: TreeNode): void;
|
||||
}
|
||||
104
extensions/cms/src/cmsResource/tree/treeProvider.ts
Normal file
104
extensions/cms/src/cmsResource/tree/treeProvider.ts
Normal file
@@ -0,0 +1,104 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
import { TreeDataProvider, EventEmitter, Event, TreeItem } from 'vscode';
|
||||
import { AppContext } from '../../appContext';
|
||||
import * as nls from 'vscode-nls';
|
||||
const localize = nls.loadMessageBundle();
|
||||
|
||||
import { TreeNode } from '../treeNode';
|
||||
import { CmsResourceEmptyTreeNode } from './cmsResourceEmptyTreeNode';
|
||||
import { ICmsResourceTreeChangeHandler } from './treeChangeHandler';
|
||||
import { CmsResourceMessageTreeNode } from '../messageTreeNode';
|
||||
import { CmsResourceTreeNode } from './cmsResourceTreeNode';
|
||||
|
||||
export class CmsResourceTreeProvider implements TreeDataProvider<TreeNode>, ICmsResourceTreeChangeHandler {
|
||||
|
||||
private _appContext: AppContext;
|
||||
|
||||
public constructor(
|
||||
public readonly appContext: AppContext
|
||||
) {
|
||||
this._appContext = appContext;
|
||||
}
|
||||
|
||||
public async getChildren(element?: TreeNode): Promise<TreeNode[]> {
|
||||
if (element) {
|
||||
return element.getChildren(true);
|
||||
}
|
||||
|
||||
if (!this.isSystemInitialized) {
|
||||
try {
|
||||
// Call to collect all locally saved CMS servers
|
||||
// to determine whether the system has been initialized.
|
||||
let cmsConfig = this._appContext.apiWrapper.getConfiguration();
|
||||
let cachedServers = cmsConfig ? cmsConfig.cmsServers : [];
|
||||
if (cachedServers && cachedServers.length > 0) {
|
||||
let servers = [];
|
||||
cachedServers.forEach((server) => {
|
||||
servers.push(new CmsResourceTreeNode(
|
||||
server.name,
|
||||
server.description,
|
||||
server.ownerUri,
|
||||
server.connection,
|
||||
this._appContext, this, null));
|
||||
this.appContext.apiWrapper.cacheRegisteredCmsServer(server.name, server.description,
|
||||
server.ownerUri, server.connection);
|
||||
});
|
||||
return servers;
|
||||
}
|
||||
this.isSystemInitialized = true;
|
||||
this._onDidChangeTreeData.fire(undefined);
|
||||
} catch (error) {
|
||||
// System not initialized yet
|
||||
this.isSystemInitialized = false;
|
||||
}
|
||||
return [CmsResourceMessageTreeNode.create(CmsResourceTreeProvider.loadingLabel, undefined)];
|
||||
}
|
||||
try {
|
||||
let registeredCmsServers = this.appContext.apiWrapper.registeredCmsServers;
|
||||
if (registeredCmsServers && registeredCmsServers.length > 0) {
|
||||
this.isSystemInitialized = true;
|
||||
// save the CMS Servers for future use
|
||||
await this._appContext.apiWrapper.setConfiguration(registeredCmsServers);
|
||||
return registeredCmsServers.map((server) => {
|
||||
return new CmsResourceTreeNode(
|
||||
server.name,
|
||||
server.description,
|
||||
server.ownerUri,
|
||||
server.connection,
|
||||
this._appContext, this, null);
|
||||
});
|
||||
} else {
|
||||
return [new CmsResourceEmptyTreeNode()];
|
||||
|
||||
}
|
||||
} catch (error) {
|
||||
return [new CmsResourceEmptyTreeNode()];
|
||||
}
|
||||
}
|
||||
|
||||
public get onDidChangeTreeData(): Event<TreeNode> {
|
||||
return this._onDidChangeTreeData.event;
|
||||
}
|
||||
|
||||
public notifyNodeChanged(node: TreeNode): void {
|
||||
this._onDidChangeTreeData.fire(node);
|
||||
}
|
||||
|
||||
public async refresh(node: TreeNode): Promise<void> {
|
||||
this._onDidChangeTreeData.fire(node);
|
||||
}
|
||||
|
||||
public getTreeItem(element: TreeNode): TreeItem | Thenable<TreeItem> {
|
||||
return element.getTreeItem();
|
||||
}
|
||||
|
||||
public isSystemInitialized: boolean = false;
|
||||
private _onDidChangeTreeData = new EventEmitter<TreeNode>();
|
||||
|
||||
private static readonly loadingLabel = localize('cms.resource.tree.treeProvider.loadingLabel', 'Loading ...');
|
||||
}
|
||||
Reference in New Issue
Block a user