Change execution plan default save location when not in a workspace (#21461)

This commit is contained in:
Josh Parnham
2023-01-04 09:51:30 +11:00
committed by GitHub
parent af99e62385
commit 7d11b88b43

View File

@@ -39,6 +39,9 @@ import { QueryResultsView } from 'sql/workbench/contrib/query/browser/queryResul
import { formatDocumentWithSelectedProvider, FormattingMode } from 'vs/editor/contrib/format/browser/format';
import { HighlightExpensiveOperationWidget } from 'sql/workbench/contrib/executionPlan/browser/widgets/highlightExpensiveNodeWidget';
import { Disposable } from 'vs/base/common/lifecycle';
import { joinPath, dirname } from 'vs/base/common/resources';
import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage';
import { Schemas } from 'vs/base/common/network';
export class ExecutionPlanView extends Disposable implements IHorizontalSashLayoutProvider {
@@ -165,7 +168,7 @@ export class ExecutionPlanView extends Disposable implements IHorizontalSashLayo
this.actionBarToggleTopTip = this._register(new ActionBarToggleTooltip());
const actionBarActions = [
this._register(new SavePlanFile()),
this._register(this._instantiationService.createInstance(SavePlanFile)),
this._register(new OpenPlanFile()),
this._register(this._instantiationService.createInstance(OpenQueryAction, 'ActionBar')),
this._register(new Separator()),
@@ -183,7 +186,7 @@ export class ExecutionPlanView extends Disposable implements IHorizontalSashLayo
// Setting up context menu
this.contextMenuToggleTooltipAction = this._register(new ContextMenuTooltipToggle());
const contextMenuAction = [
this._register(new SavePlanFile()),
this._register(this._instantiationService.createInstance(SavePlanFile)),
this._register(new OpenPlanFile()),
this._register(this._instantiationService.createInstance(OpenQueryAction, 'ContextMenu')),
this._register(new Separator()),
@@ -431,32 +434,48 @@ export class ZoomToFitAction extends Action {
export class SavePlanFile extends Action {
public static ID = 'ep.saveXML';
public static LABEL = localize('executionPlanSavePlanXML', "Save Plan File");
private static readonly LAST_USED_EXECUTION_PLAN_SAVE_PATH_STORAGE_KEY = 'qp.explorer.savePath';
constructor() {
constructor(
@IFileDialogService private readonly fileDialogService: IFileDialogService,
@IStorageService private readonly storageService: IStorageService
) {
super(SavePlanFile.ID, SavePlanFile.LABEL, constants.savePlanIconClassNames);
}
public override async run(context: ExecutionPlanView): Promise<void> {
const workspaceFolders = await context.workspaceContextService.getWorkspace().folders;
const workspaceFolders = 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
let defaultUri: URI;
const lastUsedSavePath = this.storageService.get(SavePlanFile.LAST_USED_EXECUTION_PLAN_SAVE_PATH_STORAGE_KEY, StorageScope.GLOBAL);
if (lastUsedSavePath) {
defaultUri = joinPath(URI.file(lastUsedSavePath), defaultFileName);
} else {
currentWorkSpaceFolder = URI.parse(defaultFileName); // giving default name
if (workspaceFolders.length !== 0) {
defaultUri = URI.joinPath(workspaceFolders[0].uri, defaultFileName); // appending default file name to workspace uri
} else {
defaultUri = URI.joinPath(await this.fileDialogService.defaultFolderPath(Schemas.file), defaultFileName);
}
}
const saveFileUri = await context.fileDialogService.showSaveDialog({
const destination = await this.fileDialogService.showSaveDialog({
filters: [
{
extensions: ['sqlplan'], //TODO: Get this extension from provider
name: localize('executionPlan.SaveFileDescription', 'Execution Plan Files') //TODO: Get the names from providers.
}
],
defaultUri: currentWorkSpaceFolder // If no workspaces are opened this will be undefined
defaultUri
});
if (saveFileUri) {
await context.fileService.writeFile(saveFileUri, VSBuffer.fromString(context.model.graphFile.graphFileContent));
if (destination) {
// Remember as last used save folder
this.storageService.store(SavePlanFile.LAST_USED_EXECUTION_PLAN_SAVE_PATH_STORAGE_KEY, dirname(destination).fsPath, StorageScope.GLOBAL, StorageTarget.MACHINE);
// Perform save
await context.fileService.writeFile(destination, VSBuffer.fromString(context.model.graphFile.graphFileContent));
}
}
}