From 08815a3c0f14d7066a06248e9f5777c90508f9b9 Mon Sep 17 00:00:00 2001 From: Aasim Khan Date: Fri, 11 Feb 2022 19:53:11 -0800 Subject: [PATCH] Adding save file functionality to query plan (#18337) --- .../contrib/queryplan2/browser/queryPlan.ts | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts b/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts index 0e163496fd..31a924f605 100644 --- a/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts +++ b/src/sql/workbench/contrib/queryplan2/browser/queryPlan.ts @@ -33,6 +33,11 @@ import { EDITOR_FONT_DEFAULTS } from 'vs/editor/common/config/editorOptions'; import { QueryPlanWidgetController } from 'sql/workbench/contrib/queryplan2/browser/queryPlanWidgetController'; import { CustomZoomWidget } from 'sql/workbench/contrib/queryplan2/browser/widgets/customZoomWidget'; import { NodeSearchWidget } from 'sql/workbench/contrib/queryplan2/browser/widgets/nodeSearchWidget'; +import { IFileDialogService } from 'vs/platform/dialogs/common/dialogs'; +import { IFileService } from 'vs/platform/files/common/files'; +import { VSBuffer } from 'vs/base/common/buffer'; +import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; +import { URI } from 'vs/base/common/uri'; let azdataGraph = azdataGraphModule(); @@ -161,6 +166,9 @@ export class QueryPlan2 implements ISashLayoutProvider { @IUntitledTextEditorService private readonly _untitledEditorService: IUntitledTextEditorService, @IEditorService private readonly editorService: IEditorService, @IContextMenuService private _contextMenuService: IContextMenuService, + @IFileDialogService public fileDialogService: IFileDialogService, + @IFileService public fileService: IFileService, + @IWorkspaceContextService public workspaceContextService: IWorkspaceContextService ) { // parent container for query plan. this._container = DOM.$('.query-plan'); @@ -515,6 +523,27 @@ class SavePlanFile extends Action { } public override async run(context: QueryPlan2): Promise { + const workspaceFolders = await context.workspaceContextService.getWorkspace().folders; + const defaultFileName = 'plan'; + let currentWorkSpaceFolder: URI; + if (workspaceFolders.length !== 0) { + currentWorkSpaceFolder = workspaceFolders[0].uri; + currentWorkSpaceFolder = URI.joinPath(currentWorkSpaceFolder, defaultFileName); //appending default file name to workspace uri + } else { + currentWorkSpaceFolder = URI.parse(defaultFileName); // giving default name + } + const saveFileUri = await context.fileDialogService.showSaveDialog({ + filters: [ + { + extensions: ['sqlplan'], //TODO: Get this extension from provider + name: localize('queryPlan.SaveFileDescription', 'Execution Plan Files') //TODO: Get the names from providers. + } + ], + defaultUri: currentWorkSpaceFolder // If no workspaces are opened this will be undefined + }); + if (saveFileUri) { + await context.fileService.writeFile(saveFileUri, VSBuffer.fromString(context.graphModel.graphFile.graphFileContent)); + } } }