teamsfx-extension
Version:
Create, debug, and deploy Teams apps with Teams Toolkit
382 lines • 19.7 kB
JavaScript
;
// 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