UNPKG

teamsfx-extension

Version:

Create, debug, and deploy Teams apps with Teams Toolkit

294 lines 17.1 kB
"use strict"; // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TreeViewCommand = exports.CommandsTreeViewProvider = void 0; const vscode = require("vscode"); const path = require("path"); const extensionVariables_1 = require("./extensionVariables"); const teamsfx_api_1 = require("@microsoft/teamsfx-api"); const StringResources = require("./resources/Strings.json"); class TreeViewManager { constructor() { this.treeviewMap = new Map(); } static getInstance() { if (!TreeViewManager.instance) { TreeViewManager.instance = new TreeViewManager(); } return TreeViewManager.instance; } registerTreeViews() { const disposables = []; const getStartTreeViewCommand = [ new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.quickStartTitle, StringResources.vsc.commandsTreeViewProvider.quickStartDescription, "fx-extension.openWelcome", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "lightningBolt_16"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.samplesTitle, StringResources.vsc.commandsTreeViewProvider.samplesDescription, "fx-extension.openSamples", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "heart_16"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.documentationTitle, StringResources.vsc.commandsTreeViewProvider.documentationDescription, "fx-extension.openDocument", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.GettingStarted, undefined, "book_16"), ]; const getStartedProvider = new CommandsTreeViewProvider(getStartTreeViewCommand); disposables.push(vscode.window.registerTreeDataProvider("teamsfx-getting-started", getStartedProvider)); const accountProvider = new CommandsTreeViewProvider([]); disposables.push(vscode.window.registerTreeDataProvider("teamsfx-accounts", accountProvider)); const projectTreeViewCommand = [ new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.createProjectTitle, StringResources.vsc.commandsTreeViewProvider.createProjectDescription, "fx-extension.create", vscode.TreeItemCollapsibleState.None, undefined, undefined, "createProject"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.addCapabilitiesTitle, StringResources.vsc.commandsTreeViewProvider.addCapabilitiesDescription, "fx-extension.addCapability", vscode.TreeItemCollapsibleState.None, undefined, undefined, "addCapability"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.addResourcesTitle, StringResources.vsc.commandsTreeViewProvider.addResourcesDescription, "fx-extension.update", vscode.TreeItemCollapsibleState.None, undefined, undefined, "addResources"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.manifestEditorTitle, StringResources.vsc.commandsTreeViewProvider.manifestEditorDescription, "fx-extension.openManifest", vscode.TreeItemCollapsibleState.None, undefined, undefined, "manifestEditor"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.validateManifestTitle, StringResources.vsc.commandsTreeViewProvider.validateManifestDescription, "fx-extension.validateManifest", vscode.TreeItemCollapsibleState.None, undefined, undefined, "validatemanifest"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.buildPackageTitle, StringResources.vsc.commandsTreeViewProvider.buildPackageDescription, "fx-extension.build", vscode.TreeItemCollapsibleState.None, undefined, undefined, "build"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.provisionTitle, StringResources.vsc.commandsTreeViewProvider.provisionDescription, "fx-extension.provision", vscode.TreeItemCollapsibleState.None, undefined, undefined, "provision"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.deployTitle, StringResources.vsc.commandsTreeViewProvider.deployDescription, "fx-extension.deploy", vscode.TreeItemCollapsibleState.None, undefined, undefined, "deploy"), new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.publishTitle, StringResources.vsc.commandsTreeViewProvider.publishDescription, "fx-extension.publish", vscode.TreeItemCollapsibleState.None, undefined, undefined, "publish"), ]; const projectProvider = new CommandsTreeViewProvider(projectTreeViewCommand); disposables.push(vscode.window.registerTreeDataProvider("teamsfx-project", projectProvider)); const teamDevCenterTreeViewCommand = [ //TODO temp solution new TreeViewCommand("Go To Teams Developer Portal", "Go To Teams Developer Portal", "fx-extension.openAppManagement", vscode.TreeItemCollapsibleState.None, undefined, undefined, "appManagement"), // new TreeViewCommand( // StringResources.vsc.commandsTreeViewProvider.appManagementTitle, // StringResources.vsc.commandsTreeViewProvider.appManagementDescription, // "fx-extension.openAppManagement", // vscode.TreeItemCollapsibleState.None, // undefined, // undefined, // "appManagement" // ), // new TreeViewCommand( // StringResources.vsc.commandsTreeViewProvider.botManagementTitle, // StringResources.vsc.commandsTreeViewProvider.botManagementDescription, // "fx-extension.openBotManagement", // vscode.TreeItemCollapsibleState.None, // undefined, // undefined, // "bot" // ) ]; const teamDevCenterProvider = new CommandsTreeViewProvider(teamDevCenterTreeViewCommand); disposables.push(vscode.window.registerTreeDataProvider("teamsfx-teams-dev-center", teamDevCenterProvider)); const feedbackTreeViewCommand = [ new TreeViewCommand(StringResources.vsc.commandsTreeViewProvider.reportIssuesTitle, StringResources.vsc.commandsTreeViewProvider.reportIssuesDescription, "fx-extension.openReportIssues", vscode.TreeItemCollapsibleState.None, teamsfx_api_1.TreeCategory.Feedback, undefined, "reportIssues"), ]; const feedbackProvider = new CommandsTreeViewProvider(feedbackTreeViewCommand); disposables.push(vscode.window.registerTreeDataProvider("teamsfx-feedback", feedbackProvider)); this.treeviewMap.set("teamsfx-getting-started", getStartedProvider); this.treeviewMap.set("teamsfx-accounts", accountProvider); this.treeviewMap.set("teamsfx-project", projectProvider); this.treeviewMap.set("teamsfx-teams-dev-center", teamDevCenterProvider); this.treeviewMap.set("teamsfx-feedback", feedbackProvider); return disposables; } getTreeView(viewName) { return this.treeviewMap.get(viewName); } dispose() { this.treeviewMap.forEach((value) => { value.dispose(); }); } } exports.default = TreeViewManager.getInstance(); class CommandsTreeViewProvider { constructor(commands) { this._onDidChangeTreeData = new vscode.EventEmitter(); this.onDidChangeTreeData = this._onDidChangeTreeData.event; this.commands = []; this.disposableMap = new Map(); this.commands.push(...commands); } findCommand(commandId) { const commandStack = []; for (const command of this.commands) { commandStack.push(command); } while (commandStack.length > 0) { const curCommand = commandStack.shift(); if ((curCommand === null || curCommand === void 0 ? void 0 : curCommand.commandId) === commandId) { return curCommand; } if (curCommand === null || curCommand === void 0 ? void 0 : curCommand.children) { for (const subCommand of curCommand === null || curCommand === void 0 ? void 0 : curCommand.children) { commandStack.push(subCommand); } } } return undefined; } isRegistered(commandId) { return __awaiter(this, void 0, void 0, function* () { const target = this.disposableMap.get(commandId); if (target !== undefined) { return true; } return false; }); } refresh(items) { return __awaiter(this, void 0, void 0, function* () { for (const treeItem of items) { const originalCommand = this.findCommand(treeItem.commandId); if (originalCommand !== undefined) { originalCommand.label = treeItem.label; if (treeItem.tooltip) { if (treeItem.tooltip.isMarkdown) { const markdown = new vscode.MarkdownString(treeItem.tooltip.value); originalCommand.tooltip = markdown; } else { originalCommand.tooltip = treeItem.tooltip.value; } } originalCommand.contextValue = treeItem.contextValue; if (treeItem.icon) { originalCommand.iconPath = path.join(extensionVariables_1.ext.context.extensionPath, "media", `${treeItem.icon}.svg`); } } } this._onDidChangeTreeData.fire(); return Promise.resolve(teamsfx_api_1.ok(null)); }); } add(items) { var _a, _b; return __awaiter(this, void 0, void 0, function* () { for (const treeItem of items) { if (this.disposableMap.get(treeItem.commandId) !== undefined) { continue; } const disposable = vscode.commands.registerCommand(treeItem.commandId, treeItem.callback); this.disposableMap.set(treeItem.commandId, disposable); let tooltip = treeItem.label; if (treeItem.tooltip) { if (treeItem.tooltip.isMarkdown) { const markdown = new vscode.MarkdownString(treeItem.tooltip.value); tooltip = markdown; } else { tooltip = treeItem.tooltip.value; } } const command = new TreeViewCommand(treeItem.label, tooltip, treeItem.commandId, treeItem.subTreeItems && treeItem.subTreeItems.length > 0 ? vscode.TreeItemCollapsibleState.Expanded : undefined, typeof treeItem.parent === "number" ? treeItem.parent : undefined, [], treeItem.icon, treeItem.contextValue); let parentCmd = undefined; if (typeof treeItem.parent === "number") { this.commands.push(command); } else { parentCmd = this.findCommand(treeItem.parent); if (parentCmd) { parentCmd.collapsibleState = vscode.TreeItemCollapsibleState.Expanded; (_a = parentCmd.children) === null || _a === void 0 ? void 0 : _a.push(command); } } if (parentCmd || typeof treeItem.parent === "number") { if (treeItem.subTreeItems) { for (const subTreeItem of treeItem.subTreeItems) { const registered = yield this.isRegistered(subTreeItem.commandId); if (!registered && subTreeItem.callback !== undefined) { const disposable = vscode.commands.registerCommand(subTreeItem.commandId, subTreeItem.callback); this.disposableMap.set(subTreeItem.commandId, disposable); } const subCommand = new TreeViewCommand(subTreeItem.label, subTreeItem.label, subTreeItem.commandId, subTreeItem.subTreeItems && subTreeItem.subTreeItems.length > 0 ? vscode.TreeItemCollapsibleState.Expanded : undefined); if (command.children === undefined) { command.children = []; } (_b = command.children) === null || _b === void 0 ? void 0 : _b.push(subCommand); } } } } this._onDidChangeTreeData.fire(); return Promise.resolve(teamsfx_api_1.ok(null)); }); } remove(items) { var _a; for (const treeItem of items) { let parentCmd = undefined; if (typeof treeItem.parent === "number") { parentCmd = this.commands.find((rootCommand) => rootCommand.category === treeItem.parent); } else { parentCmd = this.findCommand(treeItem.parent); } if (parentCmd && parentCmd.children) { for (let i = 0; i < ((_a = parentCmd.children) === null || _a === void 0 ? void 0 : _a.length); i++) { if (parentCmd.children[i].commandId === treeItem.commandId) { if (parentCmd.children.length === 1) parentCmd.collapsibleState = vscode.TreeItemCollapsibleState.None; const removeCmd = parentCmd.children.splice(i--, 1); const disposable = this.disposableMap.get(removeCmd[0].commandId); disposable === null || disposable === void 0 ? void 0 : disposable.dispose(); this.disposableMap.delete(removeCmd[0].commandId); if (removeCmd[0].children) { for (const child of removeCmd[0].children) { const subDisposable = this.disposableMap.get(child.commandId); subDisposable === null || subDisposable === void 0 ? void 0 : subDisposable.dispose(); this.disposableMap.delete(child.commandId); } } } } } } this._onDidChangeTreeData.fire(); return Promise.resolve(teamsfx_api_1.ok(null)); } getTreeItem(element) { return element; } getChildren(element) { if (element && element.children) { return Promise.resolve(element.children); } else { return Promise.resolve(this.commands); } } dispose() { this.disposableMap.forEach((value) => { value.dispose(); }); } } exports.CommandsTreeViewProvider = CommandsTreeViewProvider; CommandsTreeViewProvider.TreeViewFlag = "TreeView"; class TreeViewCommand extends vscode.TreeItem { constructor(label, tooltip, commandId, collapsibleState, category, children, imageName, contextValue) { super(label, collapsibleState ? collapsibleState : vscode.TreeItemCollapsibleState.None); this.label = label; this.tooltip = tooltip; this.commandId = commandId; this.collapsibleState = collapsibleState; this.category = category; this.children = children; this.imageName = imageName; this.contextValue = contextValue; this.description = ""; this.contextValue = contextValue; if (imageName !== undefined) { this.iconPath = path.join(extensionVariables_1.ext.context.extensionPath, "media", `${this.imageName}.svg`); } if (commandId) { this.command = { title: label, command: commandId, arguments: [[CommandsTreeViewProvider.TreeViewFlag]], }; } } } exports.TreeViewCommand = TreeViewCommand; //# sourceMappingURL=commandsTreeViewProvider.js.map