From 2f90b56877672029bfdaf7d8da865acbb68ab029 Mon Sep 17 00:00:00 2001 From: Charles Gagnon Date: Wed, 24 Jun 2020 18:07:52 -0700 Subject: [PATCH] Add resource type filtering to deployment wizard (#11079) --- extensions/arc/src/extension.ts | 2 +- .../controllerDashboardOverviewPage.ts | 2 +- extensions/resource-deployment/src/main.ts | 29 +++++++++++++------ .../src/ui/resourceTypePickerDialog.ts | 14 +++++---- 4 files changed, 31 insertions(+), 16 deletions(-) diff --git a/extensions/arc/src/extension.ts b/extensions/arc/src/extension.ts index a5bddf93aa..8369e3d319 100644 --- a/extensions/arc/src/extension.ts +++ b/extensions/arc/src/extension.ts @@ -20,7 +20,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.window.registerTreeDataProvider('azureArc', treeDataProvider); vscode.commands.registerCommand('arc.createController', async () => { - await vscode.commands.executeCommand('azdata.resource.deploy'); + await vscode.commands.executeCommand('azdata.resource.deploy', 'arc.control.create', ['arc.control.create']); }); vscode.commands.registerCommand('arc.connectToController', async () => { diff --git a/extensions/arc/src/ui/dashboards/controller/controllerDashboardOverviewPage.ts b/extensions/arc/src/ui/dashboards/controller/controllerDashboardOverviewPage.ts index e1b55e3c5a..6231b99998 100644 --- a/extensions/arc/src/ui/dashboards/controller/controllerDashboardOverviewPage.ts +++ b/extensions/arc/src/ui/dashboards/controller/controllerDashboardOverviewPage.ts @@ -147,7 +147,7 @@ export class ControllerDashboardOverviewPage extends DashboardPage { this.disposables.push( newInstance.onDidClick(async () => { - await vscode.commands.executeCommand('azdata.resource.deploy'); + await vscode.commands.executeCommand('azdata.resource.deploy', 'arc.sql', ['arc.sql', 'arc.postgres']); })); // Refresh diff --git a/extensions/resource-deployment/src/main.ts b/extensions/resource-deployment/src/main.ts index 3c2b13d019..f06ed78dd7 100644 --- a/extensions/resource-deployment/src/main.ts +++ b/extensions/resource-deployment/src/main.ts @@ -29,12 +29,18 @@ export async function activate(context: vscode.ExtensionContext): Promise validationFailures.forEach(message => console.error(message)); return; } - const openDialog = (resourceTypeName: string) => { - const filtered = resourceTypes.filter(resourceType => resourceType.name === resourceTypeName); - if (filtered.length !== 1) { - vscode.window.showErrorMessage(localize('resourceDeployment.UnknownResourceType', "The resource type: {0} is not defined", resourceTypeName)); + /** + * Opens a new ResourceTypePickerDialog + * @param defaultResourceTypeName The resource type name to have selected by default + * @param resourceTypeNameFilters Optional filters to apply to the resource types displayed. If undefined all + * resource types will be displayed + */ + const openDialog = (defaultResourceTypeName: string, resourceTypeNameFilters?: string[]) => { + const defaultResourceType = resourceTypes.find(resourceType => resourceType.name === defaultResourceTypeName); + if (!defaultResourceType) { + vscode.window.showErrorMessage(localize('resourceDeployment.UnknownResourceType', "The resource type: {0} is not defined", defaultResourceTypeName)); } else { - const dialog = new ResourceTypePickerDialog(toolsService, resourceTypeService, filtered[0]); + const dialog = new ResourceTypePickerDialog(toolsService, resourceTypeService, defaultResourceType, resourceTypeNameFilters); dialog.open(); } }; @@ -45,9 +51,14 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand('azdata.resource.sql-bdc.deploy', () => { openDialog('sql-bdc'); }); - vscode.commands.registerCommand('azdata.resource.deploy', (resourceType: string) => { - if (typeof resourceType === 'string') { - openDialog(resourceType); + vscode.commands.registerCommand('azdata.resource.deploy', (defaultResourceTypeName?: string, resourceTypeNameFilters?: string[]) => { + if ((resourceTypeNameFilters && !Array.isArray(resourceTypeNameFilters) || + (resourceTypeNameFilters && resourceTypeNameFilters.length > 0 && typeof resourceTypeNameFilters[0] !== 'string'))) { + throw new Error('resourceTypeNameFilters must either be undefined or an array of strings'); + } + + if (typeof defaultResourceTypeName === 'string') { + openDialog(defaultResourceTypeName, resourceTypeNameFilters); } else { let defaultDeploymentType: string; if (platformService.platform() === 'win32') { @@ -55,7 +66,7 @@ export async function activate(context: vscode.ExtensionContext): Promise } else { defaultDeploymentType = 'sql-image'; } - openDialog(defaultDeploymentType); + openDialog(defaultDeploymentType, resourceTypeNameFilters); } }); vscode.commands.registerCommand('azdata.openNotebookInputDialog', (dialogInfo: NotebookBasedDialogInfo) => { diff --git a/extensions/resource-deployment/src/ui/resourceTypePickerDialog.ts b/extensions/resource-deployment/src/ui/resourceTypePickerDialog.ts index 4bef800891..0e443292f9 100644 --- a/extensions/resource-deployment/src/ui/resourceTypePickerDialog.ts +++ b/extensions/resource-deployment/src/ui/resourceTypePickerDialog.ts @@ -33,9 +33,10 @@ export class ResourceTypePickerDialog extends DialogBase { constructor( private toolsService: IToolsService, private resourceTypeService: IResourceTypeService, - resourceType: ResourceType) { + defaultResourceType: ResourceType, + private _resourceTypeNameFilters?: string[]) { super(localize('resourceTypePickerDialog.title', "Select the deployment options"), 'ResourceTypePickerDialog', true); - this._selectedResourceType = resourceType; + this._selectedResourceType = defaultResourceType; this._installToolButton = azdata.window.createButton(localize('deploymentDialog.InstallToolsButton', "Install tools")); this._toDispose.push(this._installToolButton.onClick(() => { this.installTools().catch(error => console.log(error)); @@ -61,9 +62,12 @@ export class ResourceTypePickerDialog extends DialogBase { tab.registerContent((view: azdata.ModelView) => { const tableWidth = 1126; this._view = view; - const resourceTypes = this.resourceTypeService.getResourceTypes().sort((a: ResourceType, b: ResourceType) => { - return (a.displayIndex || Number.MAX_VALUE) - (b.displayIndex || Number.MAX_VALUE); - }); + const resourceTypes = this.resourceTypeService + .getResourceTypes() + .filter(rt => !this._resourceTypeNameFilters || this._resourceTypeNameFilters.find(rtn => rt.name === rtn)) + .sort((a: ResourceType, b: ResourceType) => { + return (a.displayIndex || Number.MAX_VALUE) - (b.displayIndex || Number.MAX_VALUE); + }); this._cardGroup = view.modelBuilder.radioCardGroup().withProperties({ cards: resourceTypes.map((resourceType) => { return {