diff --git a/packages/grid/src/vaadin-grid-sorter.js b/packages/grid/src/vaadin-grid-sorter.js index 3df0493ce6c..b6e53c0d7a6 100644 --- a/packages/grid/src/vaadin-grid-sorter.js +++ b/packages/grid/src/vaadin-grid-sorter.js @@ -224,6 +224,11 @@ class GridSorter extends ThemableMixin(DirMixin(PolymerElement)) { /** @private */ _onClick(e) { + if (e.defaultPrevented) { + // Something else has already handled the click event, do nothing. + return; + } + const activeElement = this.getRootNode().activeElement; if (this !== activeElement && this.contains(activeElement)) { // Some focusable content inside the sorter was clicked, do nothing. diff --git a/packages/grid/test/sorting.test.js b/packages/grid/test/sorting.test.js index 3d604bcace8..e375d782e38 100644 --- a/packages/grid/test/sorting.test.js +++ b/packages/grid/test/sorting.test.js @@ -18,7 +18,7 @@ import { describe('sorting', () => { describe('sorter', () => { - let sorter, button, orderIndicator; + let sorter, title, button, orderIndicator; beforeEach(() => { sorter = fixtureSync(` @@ -27,6 +27,7 @@ describe('sorting', () => { `); button = sorter.querySelector('button'); + title = sorter.querySelector('.title'); orderIndicator = sorter.shadowRoot.querySelector('[part="order"]'); }); @@ -49,6 +50,12 @@ describe('sorting', () => { expect(sorter.direction).to.equal(null); }); + it('should not toggle if click event is already consumed', () => { + title.addEventListener('click', (e) => e.preventDefault()); + click(title); + expect(sorter.direction).to.equal(null); + }); + it('should fire a sorter-changed event', () => { const spy = sinon.spy(); sorter.addEventListener('sorter-changed', spy);