UNPKG

teamsfx-extension

Version:

Create, debug, and deploy Teams apps with Teams Toolkit

382 lines 19.7 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.VS_CODE_UI = exports.VsCodeUI = void 0; const vscode_1 = require("vscode"); const teamsfx_api_1 = require("@microsoft/teamsfx-api"); const error_1 = require("../error"); const extensionVariables_1 = require("../extensionVariables"); class VsCodeUI { showQuickPick(option) { return __awaiter(this, void 0, void 0, function* () { //if(option.canSelectMany) return await multiQuickPick(option); const okButton = { iconPath: vscode_1.Uri.file(extensionVariables_1.ext.context.asAbsolutePath("media/ok.svg")), tooltip: "ok", }; const disposables = []; try { const quickPick = vscode_1.window.createQuickPick(); disposables.push(quickPick); quickPick.title = option.title; if (option.backButton) quickPick.buttons = [vscode_1.QuickInputButtons.Back, okButton]; else quickPick.buttons = [okButton]; quickPick.placeholder = option.placeholder; quickPick.ignoreFocusOut = true; quickPick.matchOnDescription = true; quickPick.matchOnDetail = true; quickPick.canSelectMany = option.canSelectMany; // quickPick.step = option.step; // quickPick.totalSteps = option.totalSteps; let previousSelectedItems = []; return yield new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { const onDidAccept = () => __awaiter(this, void 0, void 0, function* () { let selectedItems = quickPick.selectedItems; if (option.canSelectMany) { const strArray = Array.from(selectedItems.map((i) => i.id)); if (option.validation) { const validateRes = yield option.validation(strArray); if (validateRes) { return; } } let result = strArray; if (option.returnObject) { result = selectedItems.map((i) => { const item = { id: i.id, label: i.label, description: i.description, detail: i.detail, data: i.data, }; return item; }); } resolve({ type: teamsfx_api_1.InputResultType.sucess, result: result, }); } else { if (!selectedItems || selectedItems.length === 0) selectedItems = [quickPick.items[0]]; const item = selectedItems[0]; let result = item.id; if (option.returnObject) { result = { id: item.id, label: item.label, description: item.description, detail: item.detail, data: item.data, }; } resolve({ type: teamsfx_api_1.InputResultType.sucess, result: result }); } }); disposables.push(quickPick.onDidAccept(onDidAccept), quickPick.onDidHide(() => { resolve({ type: teamsfx_api_1.InputResultType.cancel }); })); disposables.push(quickPick.onDidTriggerButton((button) => { if (button === vscode_1.QuickInputButtons.Back) resolve({ type: teamsfx_api_1.InputResultType.back }); else onDidAccept(); })); try { const optionIsString = !!(typeof option.items[0] === "string"); /// set items if (optionIsString) { quickPick.items = option.items.map((i) => { return { label: i, id: i }; }); } else { quickPick.items = option.items.map((i) => { return { id: i.id, label: i.label, description: i.description, detail: i.detail, data: i.data, }; }); } const items = quickPick.items; const optionMap = new Map(); for (const item of items) { optionMap.set(item.id, item); } /// set default values if (option.defaultValue) { const items = quickPick.items; if (option.canSelectMany) { const ids = option.defaultValue; quickPick.selectedItems = ids.map((id) => optionMap.get(id)); previousSelectedItems = ids.map((id) => optionMap.get(id)); } else { const defaultStringValue = option.defaultValue; const newitems = items.filter((i) => i.id !== defaultStringValue); for (const i of items) { if (i.id === defaultStringValue) { newitems.unshift(i); break; } } quickPick.items = newitems; } } if (option.onDidChangeSelection) { const changeHandler = function (items) { return __awaiter(this, void 0, void 0, function* () { const optionItems = items.map((i) => { const fxitem = i; return { id: fxitem.id, label: fxitem.label, description: fxitem.description, detail: fxitem.detail, data: fxitem.data, }; }); const oldIds = quickPick.selectedItems .map((i) => { return i.id; }) .sort(); if (option.onDidChangeSelection) { const newIds = (yield option.onDidChangeSelection(optionItems, previousSelectedItems)).sort(); previousSelectedItems = newIds.map((id) => optionMap.get(id)); if (oldIds.join(",") !== newIds.join(",")) { quickPick.selectedItems = newIds.map((id) => optionMap.get(id)); } } }); }; disposables.push(quickPick.onDidChangeSelection(changeHandler)); } quickPick.show(); } catch (err) { resolve({ type: teamsfx_api_1.InputResultType.error, error: teamsfx_api_1.returnSystemError(err, error_1.ExtensionSource, error_1.ExtensionErrors.UnknwonError), }); } })); } finally { disposables.forEach((d) => { d.dispose(); }); } }); } showInputBox(option) { return __awaiter(this, void 0, void 0, function* () { const okButton = { iconPath: vscode_1.Uri.file(extensionVariables_1.ext.context.asAbsolutePath("media/ok.svg")), tooltip: "ok", }; const disposables = []; try { const inputBox = vscode_1.window.createInputBox(); disposables.push(inputBox); inputBox.title = option.title; if (option.backButton) inputBox.buttons = [vscode_1.QuickInputButtons.Back, okButton]; else inputBox.buttons = [okButton]; inputBox.value = option.defaultValue || ""; inputBox.ignoreFocusOut = true; inputBox.password = option.password; inputBox.placeholder = option.placeholder; inputBox.prompt = option.prompt; // inputBox.step = option.step; // inputBox.totalSteps = option.totalSteps; if (option.number) { const numberValidation = function (input) { return __awaiter(this, void 0, void 0, function* () { if (!input || input.trim() === "" || isNaN(Number(input))) return `'${input}' is not a valid number`; return undefined; }); }; const oldValidation = option.validation; const newValidation = function (input) { return __awaiter(this, void 0, void 0, function* () { const res = oldValidation ? yield oldValidation(input) : undefined; if (res !== undefined) return res; return yield numberValidation(input); }); }; option.validation = newValidation; } return yield new Promise((resolve) => { const onDidAccept = () => __awaiter(this, void 0, void 0, function* () { const validationRes = option.validation ? yield option.validation(inputBox.value) : undefined; if (!validationRes) { resolve({ type: teamsfx_api_1.InputResultType.sucess, result: inputBox.value }); } else { inputBox.validationMessage = validationRes; } }); disposables.push(inputBox.onDidChangeValue((text) => __awaiter(this, void 0, void 0, function* () { if (option.validation) { const validationRes = option.validation ? yield option.validation(text) : undefined; if (!!validationRes) { inputBox.validationMessage = validationRes; } else { inputBox.validationMessage = undefined; } } })), inputBox.onDidAccept(onDidAccept), inputBox.onDidHide(() => { resolve({ type: teamsfx_api_1.InputResultType.cancel }); })); disposables.push(inputBox.onDidTriggerButton((button) => { if (button === vscode_1.QuickInputButtons.Back) resolve({ type: teamsfx_api_1.InputResultType.back }); else onDidAccept(); })); inputBox.show(); }); } finally { disposables.forEach((d) => { d.dispose(); }); } }); } showOpenDialog(option) { return __awaiter(this, void 0, void 0, function* () { const okButton = { iconPath: vscode_1.Uri.file(extensionVariables_1.ext.context.asAbsolutePath("media/ok.svg")), tooltip: "ok", }; const disposables = []; let fileSelectorIsOpen = false; try { const quickPick = vscode_1.window.createQuickPick(); disposables.push(quickPick); quickPick.title = option.title; if (option.backButton) quickPick.buttons = [vscode_1.QuickInputButtons.Back, okButton]; else quickPick.buttons = [okButton]; quickPick.ignoreFocusOut = true; quickPick.matchOnDescription = false; quickPick.matchOnDetail = false; quickPick.canSelectMany = false; // quickPick.step = option.step; // quickPick.totalSteps = option.totalSteps; const res = yield new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { const onDidAccept = () => __awaiter(this, void 0, void 0, function* () { const result = quickPick.items[0].detail; if (result && result.length > 0) resolve({ type: teamsfx_api_1.InputResultType.sucess, result: result }); }); const onDidChangeSelection = function (items) { return __awaiter(this, void 0, void 0, function* () { const defaultUrl = items[0].detail; fileSelectorIsOpen = true; const uri = yield vscode_1.window.showOpenDialog({ defaultUri: defaultUrl ? vscode_1.Uri.file(defaultUrl) : undefined, canSelectFiles: false, canSelectFolders: true, canSelectMany: false, title: option.title, }); fileSelectorIsOpen = false; const res = uri && uri.length > 0 ? uri[0].fsPath : undefined; if (res) { quickPick.items = [{ label: "Select the workspace folder", detail: res }]; resolve({ type: teamsfx_api_1.InputResultType.sucess, result: res }); } }); }; disposables.push( // quickPick.onDidAccept(onDidAccept), quickPick.onDidHide(() => { if (fileSelectorIsOpen === false) resolve({ type: teamsfx_api_1.InputResultType.cancel }); }), quickPick.onDidTriggerButton((button) => { if (button === vscode_1.QuickInputButtons.Back) resolve({ type: teamsfx_api_1.InputResultType.back }); else onDidAccept(); }), quickPick.onDidChangeSelection(onDidChangeSelection)); quickPick.items = [{ label: "Select the workspace folder", detail: option.defaultUri }]; quickPick.show(); // pop up the dialog automatically fileSelectorIsOpen = true; const uri = yield vscode_1.window.showOpenDialog({ defaultUri: option.defaultUri ? vscode_1.Uri.file(option.defaultUri) : undefined, canSelectFiles: false, canSelectFolders: true, canSelectMany: false, title: option.title, }); fileSelectorIsOpen = false; const res = uri && uri.length > 0 ? uri[0].fsPath : undefined; if (res) { quickPick.items = [{ label: "path", detail: res }]; resolve({ type: teamsfx_api_1.InputResultType.sucess, result: res }); } })); return res; } finally { disposables.forEach((d) => { d.dispose(); }); } // while (true) { // const uri = await window.showOpenDialog({ // defaultUri: option.defaultUri ? Uri.file(option.defaultUri) : undefined, // canSelectFiles: false, // canSelectFolders: true, // canSelectMany: false, // title: option.title // }); // const res = uri && uri.length > 0 ? uri[0].fsPath : undefined; // if (!res) { // return { type: InputResultType.cancel }; // } // if(!option.validation){ // return { type: InputResultType.sucess, result: res }; // } // const validationRes = await option.validation(res); // if (!validationRes) { // return { type: InputResultType.sucess, result: res }; // } // else { // await window.showErrorMessage(validationRes); // } // } }); } } exports.VsCodeUI = VsCodeUI; exports.VS_CODE_UI = new VsCodeUI(); //# sourceMappingURL=vsc_ui.js.map