Skip to content

Commit 7eed2f2

Browse files
committed
feat: add onBeforeClose event with option to cancel closing
1 parent 4421718 commit 7eed2f2

File tree

5 files changed

+23
-1
lines changed

5 files changed

+23
-1
lines changed

packages/demo/src/events/events.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,12 @@ export default class Example {
1515
onOpen: () => {
1616
this.log('onOpen event fire!\n');
1717
},
18+
onBeforeClose: reason => {
19+
this.log(`onBeforeClose event fire! Reason: "${reason}"\n`);
20+
21+
// - returning false would preventing from closing the drop
22+
// return false;
23+
},
1824
onClose: reason => {
1925
this.log(`onClose event fire! Reason: "${reason}"\n`);
2026
},

packages/multiple-select-vanilla/src/MultipleSelectInstance.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,10 @@ export class MultipleSelectInstance {
14601460
}
14611461

14621462
close(reason?: CloseReason) {
1463+
if (this.options.onBeforeClose(reason) === false) {
1464+
return;
1465+
}
1466+
14631467
this._isOpen = false;
14641468
this.options.isOpen = false;
14651469
this.parentElm.classList.remove('ms-parent-open');

packages/multiple-select-vanilla/src/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ const DEFAULTS: Partial<MultipleSelectOption> = {
6969
onBeforeOpen: noopFalse,
7070
onChange: noopFalse,
7171
onOpen: noopFalse,
72+
onBeforeClose: noopTrue,
7273
onClose: noopFalse,
7374
onCheckAll: noopFalse,
7475
onUncheckAll: noopFalse,

packages/multiple-select-vanilla/src/models/multipleSelectOption.interface.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,10 @@ export interface MultipleSelectOption extends MultipleSelectLocale {
303303
/** Fires when the filter is cleared. */
304304
onClear: () => void;
305305

306+
/** Fires just before the close event is called. You can return `false` to prevent the drop from closing. */
307+
// biome-ignore lint/suspicious/noConfusingVoidType: could return a boolean or not return anything
308+
onBeforeClose: (reason?: CloseReason, e?: Event) => boolean | void;
309+
306310
/** Fires when the dropdown list is close. */
307311
onClose: (reason?: CloseReason) => void;
308312

playwright/e2e/events.spec.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ test.describe('Events Demo', () => {
2020
'onBlur event fire!',
2121
'onOpen event fire!',
2222
'onFocus event fire!',
23+
'onBeforeClose event fire! Reason: "toggle.close"',
2324
'onClose event fire! Reason: "toggle.close"',
2425
].join('\n'),
2526
);
@@ -35,6 +36,7 @@ test.describe('Events Demo', () => {
3536
'onBlur event fire!',
3637
'onOpen event fire!',
3738
'onFocus event fire!',
39+
'onBeforeClose event fire! Reason: "toggle.close"',
3840
'onClose event fire! Reason: "toggle.close"',
3941
'onBeforeOpen event fire!',
4042
'onBlur event fire!',
@@ -53,6 +55,7 @@ test.describe('Events Demo', () => {
5355
'onBlur event fire!',
5456
'onOpen event fire!',
5557
'onFocus event fire!',
58+
'onBeforeClose event fire! Reason: "toggle.close"',
5659
'onClose event fire! Reason: "toggle.close"',
5760
'onBeforeOpen event fire!',
5861
'onBlur event fire!',
@@ -73,6 +76,7 @@ test.describe('Events Demo', () => {
7376
'onBlur event fire!',
7477
'onOpen event fire!',
7578
'onFocus event fire!',
79+
'onBeforeClose event fire! Reason: "toggle.close"',
7680
'onClose event fire! Reason: "toggle.close"',
7781
'onBeforeOpen event fire!',
7882
'onBlur event fire!',
@@ -96,6 +100,7 @@ test.describe('Events Demo', () => {
96100
'onBlur event fire!',
97101
'onOpen event fire!',
98102
'onFocus event fire!',
103+
'onBeforeClose event fire! Reason: "toggle.close"',
99104
'onClose event fire! Reason: "toggle.close"',
100105
'onBeforeOpen event fire!',
101106
'onBlur event fire!',
@@ -114,7 +119,7 @@ test.describe('Events Demo', () => {
114119
].join('\n'),
115120
);
116121

117-
const parentLoc = await page.locator('.ms-parent')
122+
const parentLoc = await page.locator('.ms-parent');
118123
await parentLoc.click();
119124
await parentLoc.press('Tab');
120125
await expect(textareaLoc).toHaveText(
@@ -125,6 +130,7 @@ test.describe('Events Demo', () => {
125130
'onBlur event fire!',
126131
'onOpen event fire!',
127132
'onFocus event fire!',
133+
'onBeforeClose event fire! Reason: "toggle.close"',
128134
'onClose event fire! Reason: "toggle.close"',
129135
'onBeforeOpen event fire!',
130136
'onBlur event fire!',
@@ -141,6 +147,7 @@ test.describe('Events Demo', () => {
141147
'onFilter event fire! text: ',
142148
'onFilterClear event fire!',
143149
'onFocus event fire!',
150+
'onBeforeClose event fire! Reason: "toggle.close"',
144151
'onClose event fire! Reason: "toggle.close"',
145152
'onBlur event fire!',
146153
].join('\n'),

0 commit comments

Comments
 (0)