From 6ca540b558573044b7def59889db61ec916b0467 Mon Sep 17 00:00:00 2001 From: "xunhe.lzy" Date: Thu, 19 Jun 2025 20:25:00 +0800 Subject: [PATCH 1/2] feat: support onBeforeButtonClick option in dialog --- src/vs/base/browser/ui/dialog/dialog.ts | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index b569359a06c91..03b13339a72b3 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -62,6 +62,7 @@ export interface IDialogOptions { readonly checkboxStyles: ICheckboxStyles; readonly inputBoxStyles: IInputBoxStyles; readonly dialogStyles: IDialogStyles; + readonly onBeforeButtonClick?: (index: number, values?: string[], checkboxChecked?: boolean) => boolean | Promise; } export interface IDialogResult { @@ -269,11 +270,19 @@ export class Dialog extends Disposable { const buttonBar = this.buttonBar = this._register(new ButtonBar(this.buttonsContainer, { alignment: this.options?.alignment === DialogContentsAlignment.Vertical ? ButtonBarAlignment.Vertical : ButtonBarAlignment.Horizontal })); const buttonMap = this.rearrangeButtons(this.buttons, this.options.cancelId); - const onButtonClick = (index: number) => { + const onButtonClick = async (index: number) => { + const values = this.inputs.length > 0 ? this.inputs.map(input => input.value) : undefined; + const checkboxChecked = this.checkbox ? this.checkbox.checked : undefined; + if (this.options.onBeforeButtonClick) { + const canClose = await this.options.onBeforeButtonClick(index, values, checkboxChecked); + if (!canClose) { + return; + } + } resolve({ button: buttonMap[index].index, - checkboxChecked: this.checkbox ? this.checkbox.checked : undefined, - values: this.inputs.length > 0 ? this.inputs.map(input => input.value) : undefined + checkboxChecked, + values }); }; @@ -294,7 +303,7 @@ export class Dialog extends Disposable { run: async () => { await action.run(); - onButtonClick(index); + await onButtonClick(index); } })) })); @@ -314,12 +323,12 @@ export class Dialog extends Disposable { button.description = buttonOptions?.sublabel; } } - this._register(button.onDidClick(e => { + this._register(button.onDidClick(async e => { if (e) { EventHelper.stop(e); } - onButtonClick(index); + await onButtonClick(index); })); }); From beedc27dae264e8fb7083a8ad8926390188a8ff4 Mon Sep 17 00:00:00 2001 From: "xunhe.lzy" Date: Fri, 20 Jun 2025 10:34:32 +0800 Subject: [PATCH 2/2] fix: use button original index --- src/vs/base/browser/ui/dialog/dialog.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/vs/base/browser/ui/dialog/dialog.ts b/src/vs/base/browser/ui/dialog/dialog.ts index 03b13339a72b3..c69d5755a3d43 100644 --- a/src/vs/base/browser/ui/dialog/dialog.ts +++ b/src/vs/base/browser/ui/dialog/dialog.ts @@ -273,14 +273,15 @@ export class Dialog extends Disposable { const onButtonClick = async (index: number) => { const values = this.inputs.length > 0 ? this.inputs.map(input => input.value) : undefined; const checkboxChecked = this.checkbox ? this.checkbox.checked : undefined; + const button = buttonMap[index].index; if (this.options.onBeforeButtonClick) { - const canClose = await this.options.onBeforeButtonClick(index, values, checkboxChecked); + const canClose = await this.options.onBeforeButtonClick(button, values, checkboxChecked); if (!canClose) { return; } } resolve({ - button: buttonMap[index].index, + button, checkboxChecked, values });