Skip to content

Commit a2dad47

Browse files
authored
fix: listen to opened-changed events in custom editors (#9671)
1 parent 4afb7d8 commit a2dad47

File tree

2 files changed

+74
-6
lines changed

2 files changed

+74
-6
lines changed

packages/grid-pro/src/vaadin-grid-pro-edit-column-mixin.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
* See https://vaadin.com/commercial-license-and-service-terms for the full
99
* license.
1010
*/
11+
import { getDeepActiveElement } from '@vaadin/a11y-base/src/focus-utils.js';
1112
import { get, set } from '@vaadin/component-base/src/path-utils.js';
1213

1314
/**
@@ -290,6 +291,16 @@ export const GridProEditColumnMixin = (superClass) =>
290291
} else {
291292
this._focusEditor(editor);
292293
}
294+
295+
if (this.editorType === 'custom') {
296+
editor.addEventListener('opened-changed', (event) => {
297+
const element = event.target;
298+
const activeElement = getDeepActiveElement();
299+
if (!element.opened && !element.contains(activeElement)) {
300+
this._grid._stopEdit();
301+
}
302+
});
303+
}
293304
}
294305

295306
/**

test/integration/grid-pro-custom-editor.test.js

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { expect } from '@vaadin/chai-plugins';
2-
import { resetMouse, sendKeys, sendMouse, sendMouseToElement } from '@vaadin/test-runner-commands';
3-
import { fixtureSync, nextRender } from '@vaadin/testing-helpers';
2+
import { resetMouse, sendKeys, sendMouse, sendMouseToElement, setViewport } from '@vaadin/test-runner-commands';
3+
import { click, fixtureSync, nextRender } from '@vaadin/testing-helpers';
44
import '@vaadin/combo-box/src/vaadin-combo-box.js';
55
import '@vaadin/custom-field/src/vaadin-custom-field.js';
66
import '@vaadin/date-picker/src/vaadin-date-picker.js';
@@ -9,13 +9,13 @@ import '@vaadin/grid-pro/src/vaadin-grid-pro.js';
99
import '@vaadin/grid-pro/src/vaadin-grid-pro-edit-column.js';
1010
import '@vaadin/text-field/src/vaadin-text-field.js';
1111
import '@vaadin/time-picker/src/vaadin-time-picker.js';
12-
import { untilOverlayRendered } from '@vaadin/date-picker/test/helpers.js';
13-
import { flushGrid, getContainerCell } from '@vaadin/grid-pro/test/helpers.js';
12+
import { untilOverlayRendered, untilOverlayScrolled } from '@vaadin/date-picker/test/helpers.js';
13+
import { dblclick, flushGrid, getContainerCell } from '@vaadin/grid-pro/test/helpers.js';
1414

1515
describe('grid-pro custom editor', () => {
1616
let grid, cell;
1717

18-
function createGrid(path) {
18+
function createGrid(path, autoOpen = false) {
1919
grid = fixtureSync(`
2020
<vaadin-grid-pro>
2121
<vaadin-grid-pro-edit-column path="${path}" editor-type="custom"></vaadin-grid-pro-edit-column>
@@ -37,7 +37,7 @@ describe('grid-pro custom editor', () => {
3737
case 'date':
3838
column.editModeRenderer = (root, _, model) => {
3939
root.innerHTML = `
40-
<vaadin-date-picker value="${model.item.date}" auto-open-disabled></vaadin-date-picker>
40+
<vaadin-date-picker value="${model.item.date}" ${!autoOpen ? 'auto-open-disabled' : ''}></vaadin-date-picker>
4141
`;
4242
};
4343
break;
@@ -174,6 +174,63 @@ describe('grid-pro custom editor', () => {
174174
expect(editor).to.be.ok;
175175
expect(editor.value).to.equal('1984-01-12');
176176
});
177+
178+
describe('mobile', () => {
179+
let width, height;
180+
181+
before(() => {
182+
width = window.innerWidth;
183+
height = window.innerHeight;
184+
});
185+
186+
beforeEach(async () => {
187+
await setViewport({ width: 420, height: 1020 });
188+
grid = createGrid('date', true);
189+
await nextRender();
190+
cell = getContainerCell(grid.$.items, 0, 0);
191+
await sendMouse({ type: 'click', position: [10, 10] });
192+
});
193+
194+
after(async () => {
195+
await setViewport({ width, height });
196+
});
197+
198+
it('should open date picker on double click', async () => {
199+
dblclick(cell);
200+
const datePicker = cell._content.querySelector('vaadin-date-picker');
201+
expect(datePicker).to.be.ok;
202+
await untilOverlayRendered(datePicker);
203+
expect(datePicker.opened).to.be.ok;
204+
});
205+
206+
it('should close date picker on selecting a date in the overlay', async () => {
207+
dblclick(cell);
208+
const datePicker = cell._content.querySelector('vaadin-date-picker');
209+
await untilOverlayRendered(datePicker);
210+
211+
const todayButton = datePicker._overlayElement.querySelector('[slot=today-button]');
212+
click(todayButton); // Fist click to scroll to current month
213+
await untilOverlayScrolled(datePicker);
214+
click(todayButton); // Second click to select today's date
215+
216+
await nextRender();
217+
const TODAY_DATE = new Date().toISOString().split('T')[0];
218+
expect(TODAY_DATE).to.be.equal(cell._content.textContent);
219+
});
220+
221+
it('should restore previous cell content if overlay is closed', async () => {
222+
const previousContent = cell._content.textContent;
223+
224+
dblclick(cell);
225+
const datePicker = cell._content.querySelector('vaadin-date-picker');
226+
await untilOverlayRendered(datePicker);
227+
228+
sendMouse({ type: 'click', position: [10, 10] });
229+
await nextRender();
230+
expect(cell._content.querySelector('vaadin-date-picker')).to.not.be.ok;
231+
expect(previousContent).to.be.equal(cell._content.textContent);
232+
});
233+
});
177234
});
178235

179236
describe('combo-box', () => {

0 commit comments

Comments
 (0)