Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions packages/demo/src/events/events.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ export default class Example {
onOpen: () => {
this.log('onOpen event fire!\n');
},
onBeforeClose: reason => {
this.log(`onBeforeClose event fire! Reason: "${reason}"\n`);

// - returning false would preventing from closing the drop
// return false;
},
onClose: reason => {
this.log(`onClose event fire! Reason: "${reason}"\n`);
},
Expand Down
26 changes: 14 additions & 12 deletions packages/multiple-select-vanilla/src/MultipleSelectInstance.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1460,21 +1460,23 @@ export class MultipleSelectInstance {
}

close(reason?: CloseReason) {
this._isOpen = false;
this.options.isOpen = false;
this.parentElm.classList.remove('ms-parent-open');
this.choiceElm?.querySelector('div.ms-icon-caret')?.classList.remove('open');
if (this.dropElm) {
this.dropElm.style.display = 'none';
this.dropElm.ariaExpanded = 'false';
if (this.options.onBeforeClose(reason) !== false) {
this._isOpen = false;
this.options.isOpen = false;
this.parentElm.classList.remove('ms-parent-open');
this.choiceElm?.querySelector('div.ms-icon-caret')?.classList.remove('open');
if (this.dropElm) {
this.dropElm.style.display = 'none';
this.dropElm.ariaExpanded = 'false';

if (this.options.container) {
this.parentElm.appendChild(this.dropElm);
this.dropElm.style.top = 'auto';
this.dropElm.style.left = 'auto';
if (this.options.container) {
this.parentElm.appendChild(this.dropElm);
this.dropElm.style.top = 'auto';
this.dropElm.style.left = 'auto';
}
}
this.options.onClose(reason);
}
this.options.onClose(reason);
}

/**
Expand Down
1 change: 1 addition & 0 deletions packages/multiple-select-vanilla/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ const DEFAULTS: Partial<MultipleSelectOption> = {
onBeforeOpen: noopFalse,
onChange: noopFalse,
onOpen: noopFalse,
onBeforeClose: noopTrue,
onClose: noopFalse,
onCheckAll: noopFalse,
onUncheckAll: noopFalse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -303,6 +303,10 @@ export interface MultipleSelectOption extends MultipleSelectLocale {
/** Fires when the filter is cleared. */
onClear: () => void;

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

/** Fires when the dropdown list is close. */
onClose: (reason?: CloseReason) => void;

Expand Down
9 changes: 8 additions & 1 deletion playwright/e2e/events.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
].join('\n'),
);
Expand All @@ -35,6 +36,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBeforeOpen event fire!',
'onBlur event fire!',
Expand All @@ -53,6 +55,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBeforeOpen event fire!',
'onBlur event fire!',
Expand All @@ -73,6 +76,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBeforeOpen event fire!',
'onBlur event fire!',
Expand All @@ -96,6 +100,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBeforeOpen event fire!',
'onBlur event fire!',
Expand All @@ -114,7 +119,7 @@ test.describe('Events Demo', () => {
].join('\n'),
);

const parentLoc = await page.locator('.ms-parent')
const parentLoc = await page.locator('.ms-parent');
await parentLoc.click();
await parentLoc.press('Tab');
await expect(textareaLoc).toHaveText(
Expand All @@ -125,6 +130,7 @@ test.describe('Events Demo', () => {
'onBlur event fire!',
'onOpen event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBeforeOpen event fire!',
'onBlur event fire!',
Expand All @@ -141,6 +147,7 @@ test.describe('Events Demo', () => {
'onFilter event fire! text: ',
'onFilterClear event fire!',
'onFocus event fire!',
'onBeforeClose event fire! Reason: "toggle.close"',
'onClose event fire! Reason: "toggle.close"',
'onBlur event fire!',
].join('\n'),
Expand Down
Loading