Skip to content

Commit f8b953b

Browse files
fix: check if keydown event is prevented before closing overlay (#10360) (#10365)
Co-authored-by: Diego Cardoso <diego@vaadin.com>
1 parent cbf9875 commit f8b953b

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
@@ -1094,10 +1094,8 @@ export const DatePickerMixin = (subclass) =>
10941094
// The input element cannot be readonly as it would conflict with
10951095
// the required attribute. Both are not allowed on an input element.
10961096
// Therefore we prevent default on most keydown events.
1097-
const allowedKeys = [
1098-
9, // Tab
1099-
];
1100-
if (allowedKeys.indexOf(e.keyCode) === -1) {
1097+
const allowedKeys = ['Tab', 'Escape'];
1098+
if (allowedKeys.indexOf(e.key) === -1) {
11011099
e.preventDefault();
11021100
}
11031101
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ export const OverlayMixin = (superClass) =>
468468
* @private
469469
*/
470470
_keydownListener(event) {
471-
if (!this._last) {
471+
if (!this._last || event.defaultPrevented) {
472472
return;
473473
}
474474

packages/overlay/test/interactions.test.js

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

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

6482
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)