Add dialog close validation (#1704)

This commit is contained in:
Matt Irvine
2018-06-21 16:55:47 -07:00
committed by GitHub
parent 1871fd383e
commit 6c5fac997f
8 changed files with 84 additions and 5 deletions

View File

@@ -120,11 +120,13 @@ export class DialogModal extends Modal {
this.show();
}
public done(): void {
public async done(): Promise<void> {
if (this._dialog.okButton.enabled) {
this._onDone.fire();
this.dispose();
this.hide();
if (await this._dialog.validateClose()) {
this._onDone.fire();
this.dispose();
this.hide();
}
}
}

View File

@@ -49,6 +49,7 @@ export class Dialog extends ModelViewPane {
private _onMessageChange = new Emitter<DialogMessage>();
public readonly onMessageChange = this._onMessageChange.event;
private _message: DialogMessage;
private _closeValidator: () => boolean | Thenable<boolean>;
constructor(public title: string, content?: string | DialogTab[]) {
super();
@@ -67,6 +68,18 @@ export class Dialog extends ModelViewPane {
this._onMessageChange.fire(this._message);
}
}
public registerCloseValidator(validator: () => boolean | Thenable<boolean>): void {
this._closeValidator = validator;
}
public validateClose(): Thenable<boolean> {
if (this._closeValidator) {
return Promise.resolve(this._closeValidator());
} else {
return Promise.resolve(true);
}
}
}
export class DialogButton implements sqlops.window.modelviewdialog.Button {

View File

@@ -660,6 +660,15 @@ declare module 'sqlops' {
* undefined or the text is empty or undefined. The default level is error.
*/
message: DialogMessage;
/**
* Register a callback that will be called when the user tries to click done. Only
* one callback can be registered at once, so each registration call will clear
* the previous registration.
* @param validator The callback that gets executed when the user tries to click
* done. Return true to allow the dialog to close or false to block it from closing
*/
registerCloseValidator(validator: () => boolean | Thenable<boolean>): void;
}
export interface DialogTab extends ModelViewPanel {

View File

@@ -94,6 +94,7 @@ class DialogImpl extends ModelViewPanelImpl implements sqlops.window.modelviewdi
public cancelButton: sqlops.window.modelviewdialog.Button;
public customButtons: sqlops.window.modelviewdialog.Button[];
private _message: sqlops.window.modelviewdialog.DialogMessage;
private _closeValidator: () => boolean | Thenable<boolean>;
constructor(extHostModelViewDialog: ExtHostModelViewDialog,
extHostModelView: ExtHostModelViewShape) {
@@ -115,6 +116,18 @@ class DialogImpl extends ModelViewPanelImpl implements sqlops.window.modelviewdi
this._message = value;
this._extHostModelViewDialog.updateDialogContent(this);
}
public registerCloseValidator(validator: () => boolean | Thenable<boolean>): void {
this._closeValidator = validator;
}
public validateClose(): Thenable<boolean> {
if (this._closeValidator) {
return Promise.resolve(this._closeValidator());
} else {
return Promise.resolve(true);
}
}
}
class TabImpl extends ModelViewPanelImpl implements sqlops.window.modelviewdialog.DialogTab {
@@ -374,6 +387,11 @@ export class ExtHostModelViewDialog implements ExtHostModelViewDialogShape {
return wizard.validateNavigation(info);
}
public $validateDialogClose(handle: number): Thenable<boolean> {
let dialog = this._objectsByHandle.get(handle) as DialogImpl;
return dialog.validateClose();
}
public openDialog(dialog: sqlops.window.modelviewdialog.Dialog): void {
let handle = this.getHandle(dialog);
this.updateDialogContent(dialog);

View File

@@ -80,6 +80,7 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
dialog.okButton = okButton;
dialog.cancelButton = cancelButton;
dialog.onValidityChanged(valid => this._proxy.$onPanelValidityChanged(handle, valid));
dialog.registerCloseValidator(() => this.validateDialogClose(handle));
this._dialogs.set(handle, dialog);
}
@@ -262,4 +263,8 @@ export class MainThreadModelViewDialog implements MainThreadModelViewDialogShape
private validateNavigation(handle: number, info: sqlops.window.modelviewdialog.WizardPageChangeInfo): Thenable<boolean> {
return this._proxy.$validateNavigation(handle, info);
}
private validateDialogClose(handle: number): Thenable<boolean> {
return this._proxy.$validateDialogClose(handle);
}
}

View File

@@ -563,6 +563,7 @@ export interface ExtHostModelViewDialogShape {
$onWizardPageChanged(handle: number, info: sqlops.window.modelviewdialog.WizardPageChangeInfo): void;
$updateWizardPageInfo(handle: number, pageHandles: number[], currentPageIndex: number): void;
$validateNavigation(handle: number, info: sqlops.window.modelviewdialog.WizardPageChangeInfo): Thenable<boolean>;
$validateDialogClose(handle: number): Thenable<boolean>;
}
export interface MainThreadModelViewDialogShape extends IDisposable {