Avoid running query when a user cancels when there are unsaved changes

Fixes #538

Adds a new menu item to cancel a query run when the query is unsaved.

Also, ensures that no warning message is sent to the console.
This commit is contained in:
Andrew Eisenberg 2020-08-21 08:48:30 -07:00
Родитель f968f8e2f5
Коммит cb03da3716
3 изменённых файлов: 31 добавлений и 6 удалений

Просмотреть файл

@ -3,7 +3,7 @@
## 1.3.3 - [UNRELEASED]
- Fix display of raw results entities with label but no url.
- Fix bug where sort order is forgotten when changing raw results page
- Fix bug where sort order is forgotten when changing raw results page.
## 1.3.2 - 12 August 2020

Просмотреть файл

@ -408,7 +408,11 @@ async function activateWithInstalledDistribution(
await showResultsForCompletedQuery(item, WebviewReveal.NotForced);
} catch (e) {
if (e instanceof UserCancellationException) {
helpers.showAndLogWarningMessage(e.message);
if (e.silent) {
logger.log(e.message);
} else {
helpers.showAndLogWarningMessage(e.message);
}
} else if (e instanceof Error) {
helpers.showAndLogErrorMessage(e.message);
} else {

Просмотреть файл

@ -34,7 +34,15 @@ export const tmpDirDisposal = {
}
};
export class UserCancellationException extends Error { }
export class UserCancellationException extends Error {
/**
* @param message The error message
* @param silent If silent is true, then this exception will avoid showing a warning message to the user.
*/
constructor(message?: string, public readonly silent = false) {
super(message);
}
}
/**
* A collection of evaluation-time information about a query,
@ -307,7 +315,11 @@ async function checkDbschemeCompatibility(
/**
* Prompts the user to save `document` if it has unsaved changes.
* Returns true if we should save changes.
*
* @param document The document to save.
*
* @returns true if we should save changes and false if we should continue without saving changes.
* @throws UserCancellationException if we should abort whatever operation triggered this prompt
*/
async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<boolean> {
if (document.isDirty) {
@ -317,9 +329,14 @@ async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<b
else {
const yesItem = { title: 'Yes', isCloseAffordance: false };
const alwaysItem = { title: 'Always Save', isCloseAffordance: false };
const noItem = { title: 'No', isCloseAffordance: true };
const noItem = { title: 'No (run anyway)', isCloseAffordance: false };
const cancelItem = { title: 'Cancel', isCloseAffordance: true };
const message = 'Query file has unsaved changes. Save now?';
const chosenItem = await vscode.window.showInformationMessage(message, { modal: true }, yesItem, alwaysItem, noItem);
const chosenItem = await vscode.window.showInformationMessage(
message,
{ modal: true },
yesItem, alwaysItem, noItem, cancelItem
);
if (chosenItem === alwaysItem) {
await config.AUTOSAVE_SETTING.updateValue(true, vscode.ConfigurationTarget.Workspace);
@ -329,6 +346,10 @@ async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<b
if (chosenItem === yesItem) {
return true;
}
if (chosenItem === cancelItem) {
throw new UserCancellationException('Query run cancelled.', true);
}
}
}
return false;