Skip to content

Commit b514373

Browse files
authored
fix: check if keydown event is prevented before closing overlay (#10360)
1 parent e8de02b commit b514373

File tree

4 files changed

+71
-5
lines changed

4 files changed

+71
-5
lines changed

packages/date-picker/src/vaadin-date-picker-mixin.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1077,10 +1077,8 @@ export const DatePickerMixin = (subclass) =>
10771077
// The input element cannot be readonly as it would conflict with
10781078
// the required attribute. Both are not allowed on an input element.
10791079
// Therefore we prevent default on most keydown events.
1080-
const allowedKeys = [
1081-
9, // Tab
1082-
];
1083-
if (allowedKeys.indexOf(e.keyCode) === -1) {
1080+
const allowedKeys = ['Tab', 'Escape'];
1081+
if (allowedKeys.indexOf(e.key) === -1) {
10841082
e.preventDefault();
10851083
}
10861084
}

packages/overlay/src/vaadin-overlay-mixin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -552,7 +552,7 @@ export const OverlayMixin = (superClass) =>
552552
* @private
553553
*/
554554
_keydownListener(event) {
555-
if (!this._last) {
555+
if (!this._last || event.defaultPrevented) {
556556
return;
557557
}
558558

packages/overlay/test/interactions.test.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,24 @@ describe('interactions', () => {
6060

6161
expect(overlay.opened).to.be.true;
6262
});
63+
64+
it('should not close on Esc if the keydown event was prevented', () => {
65+
overlay.addEventListener('keydown', (e) => e.preventDefault());
66+
67+
escKeyDown(overlay);
68+
69+
expect(overlay.opened).to.be.true;
70+
});
71+
72+
it('should not fire the vaadin-overlay-escape-press event if keydown was prevented', () => {
73+
const spy = sinon.spy();
74+
overlay.addEventListener('vaadin-overlay-escape-press', spy);
75+
overlay.addEventListener('keydown', (e) => e.preventDefault());
76+
77+
enterKeyDown(overlay);
78+
79+
expect(spy.called).to.be.false;
80+
});
6381
});
6482

6583
describe('click', () => {
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { expect } from '@vaadin/chai-plugins';
2+
import { sendKeys } from '@vaadin/test-runner-commands';
3+
import { fixtureSync, nextFrame, oneEvent } from '@vaadin/testing-helpers';
4+
import './not-animated-styles.js';
5+
import '@vaadin/grid';
6+
import '@vaadin/dialog';
7+
8+
describe('grid in dialog', () => {
9+
let dialog;
10+
11+
beforeEach(async () => {
12+
dialog = fixtureSync('<vaadin-dialog></vaadin-dialog>');
13+
dialog.renderer = (root) => {
14+
root.innerHTML = '<vaadin-grid><vaadin-grid-column></vaadin-grid-column></vaadin-grid>';
15+
const grid = root.firstElementChild;
16+
grid.items = ['one', 'two'];
17+
const column = grid.firstElementChild;
18+
column.renderer = (root, _, model) => {
19+
if (root.firstElementChild) {
20+
return;
21+
}
22+
root.innerHTML = `<button>Button ${model.item}</button>`;
23+
};
24+
};
25+
dialog.opened = true;
26+
await oneEvent(dialog.$.overlay, 'vaadin-overlay-open');
27+
});
28+
29+
afterEach(async () => {
30+
dialog.opened = false;
31+
await nextFrame();
32+
});
33+
34+
describe('interaction', () => {
35+
it('should not close on Esc if focus is on interactive element', async () => {
36+
await sendKeys({ press: 'Tab' });
37+
await sendKeys({ press: 'Enter' });
38+
await sendKeys({ press: 'Escape' });
39+
expect(dialog.opened).to.be.true;
40+
});
41+
42+
it('should close on Esc if focus is back to grid cell', async () => {
43+
await sendKeys({ press: 'Tab' });
44+
await sendKeys({ press: 'Enter' });
45+
await sendKeys({ press: 'Escape' });
46+
await sendKeys({ press: 'Escape' });
47+
expect(dialog.opened).to.be.false;
48+
});
49+
});
50+
});

0 commit comments

Comments
 (0)