From 7814e3de878eb1cc728291a5c9fb0a8d6bb73e18 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Fri, 24 Dec 2021 12:04:31 +0300 Subject: [PATCH 1/8] fix: prevent focus from going beyond visible calendar --- .../src/vaadin-date-picker-overlay-content.js | 9 +++++---- .../src/vaadin-infinite-scroller.js | 19 ++++++++++++++----- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/date-picker/src/vaadin-date-picker-overlay-content.js b/packages/date-picker/src/vaadin-date-picker-overlay-content.js index 6671f580fa..e2e3d7e89d 100644 --- a/packages/date-picker/src/vaadin-date-picker-overlay-content.js +++ b/packages/date-picker/src/vaadin-date-picker-overlay-content.js @@ -404,11 +404,12 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(PolymerElement)) { */ revealDate(date) { if (date) { - var diff = this._differenceInMonths(date, this._originDate); - var scrolledAboveViewport = this.$.monthScroller.position > diff; + const diff = this._differenceInMonths(date, this._originDate); + const scrolledAboveViewport = this.$.monthScroller.position > diff; - var visibleItems = this.$.monthScroller.clientHeight / this.$.monthScroller.itemHeight; - var scrolledBelowViewport = this.$.monthScroller.position + visibleItems - 1 < diff; + const visibleItems = + (this.$.monthScroller.clientHeight - this.$.monthScroller.bufferOffset * 2) / this.$.monthScroller.itemHeight; + const scrolledBelowViewport = this.$.monthScroller.position + visibleItems - 1 < diff; if (scrolledAboveViewport) { this._scrollToPosition(diff, true); diff --git a/packages/date-picker/src/vaadin-infinite-scroller.js b/packages/date-picker/src/vaadin-infinite-scroller.js index 84e8d1645e..b89ec8d62b 100644 --- a/packages/date-picker/src/vaadin-infinite-scroller.js +++ b/packages/date-picker/src/vaadin-infinite-scroller.js @@ -186,9 +186,8 @@ class InfiniteScroller extends PolymerElement { } // Check if we scrolled enough to translate the buffer positions. - const bufferOffset = this.root.querySelector('.buffer').offsetTop; - const upperThresholdReached = scrollTop > this._buffers[1].translateY + this.itemHeight + bufferOffset; - const lowerThresholdReached = scrollTop < this._buffers[0].translateY + this.itemHeight + bufferOffset; + const upperThresholdReached = scrollTop > this._buffers[1].translateY + this.itemHeight + this.bufferOffset; + const lowerThresholdReached = scrollTop < this._buffers[0].translateY + this.itemHeight + this.bufferOffset; if (upperThresholdReached || lowerThresholdReached) { this._translateBuffer(lowerThresholdReached); @@ -210,7 +209,14 @@ class InfiniteScroller extends PolymerElement { } /** - * @private + * @return {number} + */ + get bufferOffset() { + return this.root.querySelector('.buffer').offsetTop; + } + + /** + * @return {number} */ get position() { return (this.$.scroller.scrollTop - this._buffers[0].translateY) / this.itemHeight + this._firstIndex; @@ -219,7 +225,7 @@ class InfiniteScroller extends PolymerElement { /** * Current scroller position as index. Can be a fractional number. * - * @type {Number} + * @type {number} */ set position(index) { this._preventScrollEvent = true; @@ -245,6 +251,9 @@ class InfiniteScroller extends PolymerElement { } } + /** + * @return {number} + */ get itemHeight() { if (!this._itemHeightVal) { const itemHeight = getComputedStyle(this).getPropertyValue('--vaadin-infinite-scroller-item-height'); From 8723ff10fa12b387b56ce45b119a3f8d9f03d012 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Wed, 5 Jan 2022 20:23:51 +0300 Subject: [PATCH 2/8] test: re-organize overlay unit tests --- packages/date-picker/test/overlay.test.js | 471 +++++++++++----------- 1 file changed, 241 insertions(+), 230 deletions(-) diff --git a/packages/date-picker/test/overlay.test.js b/packages/date-picker/test/overlay.test.js index 15f2a62da6..aad80e8604 100644 --- a/packages/date-picker/test/overlay.test.js +++ b/packages/date-picker/test/overlay.test.js @@ -1,5 +1,5 @@ import { expect } from '@esm-bundle/chai'; -import { click, fixtureSync, listenOnce, tap } from '@vaadin/testing-helpers'; +import { click, fixtureSync, listenOnce, nextRender, tap } from '@vaadin/testing-helpers'; import sinon from 'sinon'; import '../src/vaadin-date-picker-overlay-content.js'; import { afterNextRender } from '@polymer/polymer/lib/utils/render-status.js'; @@ -17,303 +17,314 @@ function waitUntilScrolledTo(overlay, date, callback) { } } -describe('vaadin-date-picker-overlay', () => { +describe('overlay', () => { let overlay; - beforeEach((done) => { - overlay = fixtureSync(` - `); - overlay.i18n = getDefaultI18n(); - overlay.$.monthScroller.bufferSize = 1; - overlay.$.yearScroller.bufferSize = 1; - overlay.initialPosition = new Date(); - afterNextRender(overlay.$.monthScroller, () => waitUntilScrolledTo(overlay, new Date(), done)); - }); - - it('should stop tap events from bubbling outside the overlay', () => { - const tapSpy = sinon.spy(); - document.addEventListener('tap', tapSpy); - overlay.$.monthScroller.dispatchEvent(new CustomEvent('tap', { bubbles: true })); - document.removeEventListener('tap', tapSpy); - expect(tapSpy.called).to.be.false; - }); - - it('should return correct month', () => { - overlay._originDate = new Date(2016, 2, 31); - expect(overlay._dateAfterXMonths(11).getMonth()).to.equal(1); - }); - - it('should reflect the year of currently visible month on the toolbar', (done) => { - const date = new Date(2000, 1, 1); - overlay.scrollToDate(date); - waitUntilScrolledTo(overlay, date, () => { - expect(parseInt(overlay.root.querySelector('[part="years-toggle-button"]').textContent)).to.equal(2000); - done(); + describe('basic', () => { + beforeEach((done) => { + overlay = fixtureSync(` + `); + overlay.i18n = getDefaultI18n(); + overlay.$.monthScroller.bufferSize = 1; + overlay.$.yearScroller.bufferSize = 1; + overlay.initialPosition = new Date(); + afterNextRender(overlay.$.monthScroller, () => waitUntilScrolledTo(overlay, new Date(), done)); }); - }); - it('should scroll to the given date', (done) => { - const date = new Date(2000, 1, 1); - overlay.scrollToDate(date); - waitUntilScrolledTo(overlay, date, () => { - expect(monthsEqual(getFirstVisibleItem(overlay.$.monthScroller, 0).firstElementChild.month, date)).to.be.true; - done(); + it('should stop tap events from bubbling outside the overlay', () => { + const tapSpy = sinon.spy(); + document.addEventListener('tap', tapSpy); + overlay.$.monthScroller.dispatchEvent(new CustomEvent('tap', { bubbles: true })); + document.removeEventListener('tap', tapSpy); + expect(tapSpy.called).to.be.false; }); - }); - it('should scroll to the given year', (done) => { - const date = new Date(2000, 1, 1); - overlay.scrollToDate(date); - waitUntilScrolledTo(overlay, date, () => { - var offset = overlay.$.yearScroller.clientHeight / 2; - overlay.$.yearScroller._debouncerUpdateClones.flush(); - expect(getFirstVisibleItem(overlay.$.yearScroller, offset).firstElementChild.textContent).to.contain('2000'); - done(); + it('should return correct month', () => { + overlay._originDate = new Date(2016, 2, 31); + expect(overlay._dateAfterXMonths(11).getMonth()).to.equal(1); }); - }); - it('should mark current year', () => { - const yearScroller = overlay.$.yearScroller; + it('should mark current year', () => { + const yearScroller = overlay.$.yearScroller; - yearScroller._buffers.forEach((buffer) => { - Array.from(buffer.children).forEach((insertionPoint) => { - const year = insertionPoint._itemWrapper.firstElementChild; - const isCurrent = year.textContent.indexOf(new Date().getFullYear()) > -1; - expect(year.hasAttribute('current')).to.equal(isCurrent); + yearScroller._buffers.forEach((buffer) => { + Array.from(buffer.children).forEach((insertionPoint) => { + const year = insertionPoint._itemWrapper.firstElementChild; + const isCurrent = year.textContent.indexOf(new Date().getFullYear()) > -1; + expect(year.hasAttribute('current')).to.equal(isCurrent); + }); }); }); - }); - it('should mark selected year', () => { - const yearScroller = overlay.$.yearScroller; - overlay.selectedDate = new Date(); + it('should mark selected year', () => { + const yearScroller = overlay.$.yearScroller; + overlay.selectedDate = new Date(); - yearScroller._buffers.forEach((buffer) => { - Array.from(buffer.children).forEach((insertionPoint) => { - const year = insertionPoint._itemWrapper.firstElementChild; - const isCurrent = year.textContent.indexOf(new Date().getFullYear()) > -1; - expect(year.hasAttribute('selected')).to.equal(isCurrent); + yearScroller._buffers.forEach((buffer) => { + Array.from(buffer.children).forEach((insertionPoint) => { + const year = insertionPoint._itemWrapper.firstElementChild; + const isCurrent = year.textContent.indexOf(new Date().getFullYear()) > -1; + expect(year.hasAttribute('selected')).to.equal(isCurrent); + }); }); }); - }); - describe('taps', () => { - beforeEach((done) => { - // Wait for ignoreTaps to settle after initial scroll event - listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => setTimeout(done, 350)); + describe('taps', () => { + beforeEach((done) => { + // Wait for ignoreTaps to settle after initial scroll event + listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => setTimeout(done, 350)); - overlay.$.monthScroller.$.scroller.scrollTop += 1; - }); + overlay.$.monthScroller.$.scroller.scrollTop += 1; + }); - it('should set ignoreTaps to calendar on scroll', (done) => { - listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { - expect(overlay.$.monthScroller.querySelector('vaadin-month-calendar').ignoreTaps).to.be.true; - done(); + it('should set ignoreTaps to calendar on scroll', (done) => { + listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { + expect(overlay.$.monthScroller.querySelector('vaadin-month-calendar').ignoreTaps).to.be.true; + done(); + }); + + overlay.$.monthScroller.$.scroller.scrollTop += 1; }); - overlay.$.monthScroller.$.scroller.scrollTop += 1; - }); + it('should not react to year tap after scroll', (done) => { + const spy = sinon.spy(overlay, '_scrollToPosition'); - it('should not react to year tap after scroll', (done) => { - const spy = sinon.spy(overlay, '_scrollToPosition'); + listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { + tap(overlay.$.yearScroller); + expect(spy.called).to.be.false; + done(); + }); - listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { - tap(overlay.$.yearScroller); - expect(spy.called).to.be.false; - done(); + overlay.$.monthScroller.$.scroller.scrollTop += 1; }); - overlay.$.monthScroller.$.scroller.scrollTop += 1; - }); + it('should react to year tap after 300ms elapsed after scroll', (done) => { + const spy = sinon.spy(overlay, '_scrollToPosition'); + + listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { + setTimeout(() => { + tap(overlay.$.yearScroller); + expect(spy.called).to.be.true; + done(); + }, 350); + }); - it('should react to year tap after 300ms elapsed after scroll', (done) => { - const spy = sinon.spy(overlay, '_scrollToPosition'); + overlay.$.monthScroller.$.scroller.scrollTop += 1; + }); + + it('should not react if the tap takes more than 300ms', (done) => { + const spy = sinon.spy(overlay, '_scrollToPosition'); + overlay._onYearScrollTouchStart(); - listenOnce(overlay.$.monthScroller.$.scroller, 'scroll', () => { setTimeout(() => { tap(overlay.$.yearScroller); - expect(spy.called).to.be.true; + expect(spy.called).to.be.false; done(); }, 350); }); - - overlay.$.monthScroller.$.scroller.scrollTop += 1; }); - it('should not react if the tap takes more than 300ms', (done) => { - const spy = sinon.spy(overlay, '_scrollToPosition'); - overlay._onYearScrollTouchStart(); + describe('header', () => { + let header, clearButton; - setTimeout(() => { - tap(overlay.$.yearScroller); - expect(spy.called).to.be.false; - done(); - }, 350); - }); - }); + beforeEach(() => { + header = overlay.shadowRoot.querySelector('[part="overlay-header"]'); + clearButton = overlay.shadowRoot.querySelector('[part="clear-button"]'); + }); - describe('header', () => { - let header, clearButton; + it('should be visible', () => { + overlay.setAttribute('fullscreen', ''); + expect(window.getComputedStyle(header).display).to.equal('flex'); + }); - beforeEach(() => { - header = overlay.shadowRoot.querySelector('[part="overlay-header"]'); - clearButton = overlay.shadowRoot.querySelector('[part="clear-button"]'); - }); + it('should be invisible', () => { + expect(window.getComputedStyle(header).display).to.equal('none'); + }); - it('should be visible', () => { - overlay.setAttribute('fullscreen', ''); - expect(window.getComputedStyle(header).display).to.equal('flex'); - }); + it('should reflect value in label', () => { + overlay.i18n.formatDate = (date) => date.month + 1 + '/' + date.day + '/' + date.year; + overlay.selectedDate = new Date(2000, 1, 1); + expect(overlay.root.querySelector('[part="label"]').textContent.trim()).to.equal('2/1/2000'); + }); - it('should be invisible', () => { - expect(window.getComputedStyle(header).display).to.equal('none'); - }); + it('should not show clear button if not value is set', () => { + expect(window.getComputedStyle(clearButton).display).to.equal('none'); + }); - it('should reflect value in label', () => { - overlay.i18n.formatDate = (date) => date.month + 1 + '/' + date.day + '/' + date.year; - overlay.selectedDate = new Date(2000, 1, 1); - expect(overlay.root.querySelector('[part="label"]').textContent.trim()).to.equal('2/1/2000'); - }); + it('should show clear button if value is set', () => { + overlay.selectedDate = new Date(); + expect(window.getComputedStyle(clearButton).display).to.not.equal('none'); + }); - it('should not show clear button if not value is set', () => { - expect(window.getComputedStyle(clearButton).display).to.equal('none'); + it('should clear the value', () => { + overlay.selectedDate = new Date(); + click(clearButton); + expect(overlay.selectedDate).to.equal(''); + }); }); - it('should show clear button if value is set', () => { - overlay.selectedDate = new Date(); - expect(window.getComputedStyle(clearButton).display).to.not.equal('none'); - }); + describe('footer', () => { + it('should fire close on cancel click', () => { + const spy = sinon.spy(); + overlay.addEventListener('close', spy); + tap(overlay.$.cancelButton); + expect(spy.calledOnce).to.be.true; + }); - it('should clear the value', () => { - overlay.selectedDate = new Date(); - click(clearButton); - expect(overlay.selectedDate).to.equal(''); - }); - }); + describe('today button', () => { + it('should scroll to current date', (done) => { + const date = new Date(2000, 1, 1); + overlay.scrollToDate(date); + waitUntilScrolledTo(overlay, date, () => { + tap(overlay.$.todayButton); + waitUntilScrolledTo(overlay, new Date(), () => { + done(); + }); + }); + }); - describe('footer', () => { - it('should fire close on cancel click', () => { - const spy = sinon.spy(); - overlay.addEventListener('close', spy); - tap(overlay.$.cancelButton); - expect(spy.calledOnce).to.be.true; - }); + it('should close the overlay and select today if on current month', (done) => { + const today = new Date(); + overlay.scrollToDate(today); + const spy = sinon.spy(); + overlay.addEventListener('close', spy); + + waitUntilScrolledTo(overlay, today, () => { + tap(overlay.$.todayButton); - describe('today button', () => { - it('should scroll to current date', (done) => { - const date = new Date(2000, 1, 1); - overlay.scrollToDate(date); - waitUntilScrolledTo(overlay, date, () => { - tap(overlay.$.todayButton); - waitUntilScrolledTo(overlay, new Date(), () => { + expect(overlay.selectedDate.getFullYear()).to.equal(today.getFullYear()); + expect(overlay.selectedDate.getMonth()).to.equal(today.getMonth()); + expect(overlay.selectedDate.getDate()).to.equal(today.getDate()); + expect(spy.calledOnce).to.be.true; done(); }); }); - }); - it('should close the overlay and select today if on current month', (done) => { - const today = new Date(); - overlay.scrollToDate(today); - const spy = sinon.spy(); - overlay.addEventListener('close', spy); + it('should not close the overlay and not select today if not on current month', (done) => { + const today = new Date(); + overlay.scrollToDate(today); + const spy = sinon.spy(); + overlay.addEventListener('close', spy); - waitUntilScrolledTo(overlay, today, () => { - tap(overlay.$.todayButton); + waitUntilScrolledTo(overlay, today, () => { + overlay.$.monthScroller.$.scroller.scrollTop -= 1; + tap(overlay.$.todayButton); - expect(overlay.selectedDate.getFullYear()).to.equal(today.getFullYear()); - expect(overlay.selectedDate.getMonth()).to.equal(today.getMonth()); - expect(overlay.selectedDate.getDate()).to.equal(today.getDate()); - expect(spy.calledOnce).to.be.true; - done(); + expect(overlay.selectedDate).to.be.undefined; + expect(spy.called).to.be.false; + done(); + }); }); - }); - it('should not close the overlay and not select today if not on current month', (done) => { - const today = new Date(); - overlay.scrollToDate(today); - const spy = sinon.spy(); - overlay.addEventListener('close', spy); + it('should do nothing if disabled', (done) => { + var initialDate = new Date(2000, 1, 1); + overlay.scrollToDate(initialDate); + var closeSpy = sinon.spy(); + overlay.addEventListener('close', closeSpy); + // const scrollSpy = sinon.spy(overlay, 'scrollToDate'); - waitUntilScrolledTo(overlay, today, () => { - overlay.$.monthScroller.$.scroller.scrollTop -= 1; - tap(overlay.$.todayButton); + overlay.$.todayButton.disabled = true; - expect(overlay.selectedDate).to.be.undefined; - expect(spy.called).to.be.false; - done(); - }); - }); + waitUntilScrolledTo(overlay, initialDate, () => { + const lastScrollPos = overlay.$.monthScroller.position; + tap(overlay.$.todayButton); - it('should do nothing if disabled', (done) => { - var initialDate = new Date(2000, 1, 1); - overlay.scrollToDate(initialDate); - var closeSpy = sinon.spy(); - overlay.addEventListener('close', closeSpy); - // const scrollSpy = sinon.spy(overlay, 'scrollToDate'); + expect(overlay.$.monthScroller.position).to.equal(lastScrollPos); + // FIXME: fails in FF + Polymer 1.x + // expect(scrollSpy.called).to.be.false; + expect(closeSpy.called).to.be.false; + done(); + }); + }); - overlay.$.todayButton.disabled = true; + describe('date limits', () => { + let todayMidnight, yesterdayMidnight, tomorrowMidnight; + + beforeEach(() => { + const today = new Date(); + todayMidnight = new Date(0, 0); + todayMidnight.setFullYear(today.getFullYear()); + todayMidnight.setMonth(today.getMonth()); + todayMidnight.setDate(today.getDate()); + yesterdayMidnight = new Date(todayMidnight.getTime()); + yesterdayMidnight.setDate(todayMidnight.getDate() - 1); + tomorrowMidnight = new Date(todayMidnight.getTime()); + tomorrowMidnight.setDate(todayMidnight.getDate() + 1); + overlay.minDate = null; + overlay.maxDate = null; + }); - waitUntilScrolledTo(overlay, initialDate, () => { - const lastScrollPos = overlay.$.monthScroller.position; - tap(overlay.$.todayButton); + it('should not be disabled by default', () => { + expect(overlay.$.todayButton.disabled).to.be.false; + }); - expect(overlay.$.monthScroller.position).to.equal(lastScrollPos); - // FIXME: fails in FF + Polymer 1.x - // expect(scrollSpy.called).to.be.false; - expect(closeSpy.called).to.be.false; - done(); - }); - }); + it('should not be disabled if today is inside the limits', () => { + overlay.minDate = yesterdayMidnight; + overlay.maxDate = tomorrowMidnight; + expect(overlay.$.todayButton.disabled).to.be.false; + }); - describe('date limits', () => { - let todayMidnight, yesterdayMidnight, tomorrowMidnight; + it('should not be disabled if today is min', () => { + overlay.minDate = todayMidnight; + expect(overlay.$.todayButton.disabled).to.be.false; + }); - beforeEach(() => { - const today = new Date(); - todayMidnight = new Date(0, 0); - todayMidnight.setFullYear(today.getFullYear()); - todayMidnight.setMonth(today.getMonth()); - todayMidnight.setDate(today.getDate()); - yesterdayMidnight = new Date(todayMidnight.getTime()); - yesterdayMidnight.setDate(todayMidnight.getDate() - 1); - tomorrowMidnight = new Date(todayMidnight.getTime()); - tomorrowMidnight.setDate(todayMidnight.getDate() + 1); - overlay.minDate = null; - overlay.maxDate = null; - }); + it('should not be disabled if today is max', () => { + overlay.maxDate = todayMidnight; + expect(overlay.$.todayButton.disabled).to.be.false; + }); - it('should not be disabled by default', () => { - expect(overlay.$.todayButton.disabled).to.be.false; - }); + it('should be disabled if the limits are in past', () => { + overlay.maxDate = yesterdayMidnight; + expect(overlay.$.todayButton.disabled).to.be.true; + }); - it('should not be disabled if today is inside the limits', () => { - overlay.minDate = yesterdayMidnight; - overlay.maxDate = tomorrowMidnight; - expect(overlay.$.todayButton.disabled).to.be.false; + it('should be disabled if the limits are in future', () => { + overlay.minDate = tomorrowMidnight; + expect(overlay.$.todayButton.disabled).to.be.true; + }); }); + }); + }); + }); - it('should not be disabled if today is min', () => { - overlay.minDate = todayMidnight; - expect(overlay.$.todayButton.disabled).to.be.false; - }); + describe('scrollToDate', () => { + beforeEach(async () => { + overlay = fixtureSync(` + + `); + overlay.i18n = getDefaultI18n(); + overlay.$.monthScroller.bufferSize = 1; + overlay.$.yearScroller.bufferSize = 1; + overlay.initialPosition = new Date(); + await nextRender(); + }); - it('should not be disabled if today is max', () => { - overlay.maxDate = todayMidnight; - expect(overlay.$.todayButton.disabled).to.be.false; - }); + it('should reflect the year of currently visible month on the toolbar', async () => { + const date = new Date(2000, 1, 1); + overlay.scrollToDate(date); + await nextRender(); + expect(parseInt(overlay.root.querySelector('[part="years-toggle-button"]').textContent)).to.equal(2000); + }); - it('should be disabled if the limits are in past', () => { - overlay.maxDate = yesterdayMidnight; - expect(overlay.$.todayButton.disabled).to.be.true; - }); + it('should scroll to the given date', async () => { + const date = new Date(2000, 1, 1); + overlay.scrollToDate(date); + await nextRender(); + expect(monthsEqual(getFirstVisibleItem(overlay.$.monthScroller, 0).firstElementChild.month, date)).to.be.true; + }); - it('should be disabled if the limits are in future', () => { - overlay.minDate = tomorrowMidnight; - expect(overlay.$.todayButton.disabled).to.be.true; - }); - }); + it('should scroll to the given year', async () => { + const date = new Date(2000, 1, 1); + overlay.scrollToDate(date); + await nextRender(); + var offset = overlay.$.yearScroller.clientHeight / 2; + overlay.$.yearScroller._debouncerUpdateClones.flush(); + expect(getFirstVisibleItem(overlay.$.yearScroller, offset).firstElementChild.textContent).to.contain('2000'); }); }); }); From fdf2bdd825b324474a1fc652e80345ff686439db Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Wed, 5 Jan 2022 20:24:15 +0300 Subject: [PATCH 3/8] test: add unit tests for revealDate() --- packages/date-picker/test/overlay.test.js | 82 ++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/packages/date-picker/test/overlay.test.js b/packages/date-picker/test/overlay.test.js index aad80e8604..25c0611155 100644 --- a/packages/date-picker/test/overlay.test.js +++ b/packages/date-picker/test/overlay.test.js @@ -1,5 +1,5 @@ import { expect } from '@esm-bundle/chai'; -import { click, fixtureSync, listenOnce, nextRender, tap } from '@vaadin/testing-helpers'; +import { click, fixtureSync, listenOnce, nextRender, oneEvent, tap } from '@vaadin/testing-helpers'; import sinon from 'sinon'; import '../src/vaadin-date-picker-overlay-content.js'; import { afterNextRender } from '@polymer/polymer/lib/utils/render-status.js'; @@ -327,4 +327,84 @@ describe('overlay', () => { expect(getFirstVisibleItem(overlay.$.yearScroller, offset).firstElementChild.textContent).to.contain('2000'); }); }); + + describe('revealDate', () => { + let overlay, monthScroller; + + async function fixtureOverlayContent({ monthScrollerItems, monthScrollerOffset }) { + overlay = fixtureSync(` + + `); + monthScroller = overlay.$.monthScroller; + monthScroller.style.setProperty('--vaadin-infinite-scroller-buffer-offset', monthScrollerOffset); + monthScroller.style.height = `calc(var(--vaadin-infinite-scroller-item-height) * ${monthScrollerItems})`; + overlay.i18n = getDefaultI18n(); + overlay.$.monthScroller.bufferSize = 3; + overlay.$.yearScroller.bufferSize = 3; + overlay.initialPosition = new Date(2021, 1, 1); + await nextRender(); + } + + describe('default', () => { + beforeEach(async () => { + await fixtureOverlayContent({ + monthScrollerItems: 2, + monthScrollerOffset: 0 + }); + }); + + it('should scroll to the date above when it is not visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 0, 1)); + await oneEvent(overlay, 'scroll-animation-finished'); + expect(overlay.$.monthScroller.position).to.equal(position - 1); + }); + + it('should not scroll to the date when it is fully visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 2, 1)); + await nextRender(); + expect(overlay.$.monthScroller.position).to.equal(position); + }); + + it('should scroll to the date below when it is not visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 3, 1)); + await oneEvent(overlay, 'scroll-animation-finished'); + expect(overlay.$.monthScroller.position).to.equal(position + 1); + }); + }); + + describe('offset', () => { + beforeEach(async () => { + await fixtureOverlayContent({ + monthScrollerItems: 3, + monthScrollerOffset: '20%' + }); + }); + + it('should scroll to the date above when it is not visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 0, 1)); + await oneEvent(overlay, 'scroll-animation-finished'); + expect(overlay.$.monthScroller.position).to.equal(position - 1 /* 20% is ensured by CSS */); + }); + + it('should not scroll to the date when it is fully visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 2, 1)); + await nextRender(); + expect(overlay.$.monthScroller.position).to.equal(position); + }); + + it('should scroll to the date below when it is not visible', async () => { + const position = overlay.$.monthScroller.position; + overlay.revealDate(new Date(2021, 3, 1)); + await oneEvent(overlay, 'scroll-animation-finished'); + expect(overlay.$.monthScroller.position).to.equal(position + 1 + 0.2 /* 20% is ensured by JS */); + }); + }); + }); }); From 91f51bfa84782ce1eacb2b05124d999aecf300f4 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Thu, 6 Jan 2022 11:10:50 +0300 Subject: [PATCH 4/8] test: correct test names --- packages/date-picker/test/overlay.test.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/date-picker/test/overlay.test.js b/packages/date-picker/test/overlay.test.js index 25c0611155..2753f83657 100644 --- a/packages/date-picker/test/overlay.test.js +++ b/packages/date-picker/test/overlay.test.js @@ -355,21 +355,21 @@ describe('overlay', () => { }); }); - it('should scroll to the date above when it is not visible', async () => { + it('should scroll to the month above when it is not visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 0, 1)); await oneEvent(overlay, 'scroll-animation-finished'); expect(overlay.$.monthScroller.position).to.equal(position - 1); }); - it('should not scroll to the date when it is fully visible', async () => { + it('should not scroll to the month when it is fully visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 2, 1)); await nextRender(); expect(overlay.$.monthScroller.position).to.equal(position); }); - it('should scroll to the date below when it is not visible', async () => { + it('should scroll to the month below when it is not visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 3, 1)); await oneEvent(overlay, 'scroll-animation-finished'); @@ -385,21 +385,21 @@ describe('overlay', () => { }); }); - it('should scroll to the date above when it is not visible', async () => { + it('should scroll to the month above when it is not visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 0, 1)); await oneEvent(overlay, 'scroll-animation-finished'); expect(overlay.$.monthScroller.position).to.equal(position - 1 /* 20% is ensured by CSS */); }); - it('should not scroll to the date when it is fully visible', async () => { + it('should not scroll to the month when it is fully visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 2, 1)); await nextRender(); expect(overlay.$.monthScroller.position).to.equal(position); }); - it('should scroll to the date below when it is not visible', async () => { + it('should scroll to the month below when it is not visible', async () => { const position = overlay.$.monthScroller.position; overlay.revealDate(new Date(2021, 3, 1)); await oneEvent(overlay, 'scroll-animation-finished'); From 529777010b0f810a1baaa7b27f5eb7c9d7e357b7 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Thu, 6 Jan 2022 18:34:39 +0300 Subject: [PATCH 5/8] refactor: apply code review suggestions --- packages/date-picker/src/vaadin-infinite-scroller.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/date-picker/src/vaadin-infinite-scroller.js b/packages/date-picker/src/vaadin-infinite-scroller.js index b89ec8d62b..45d52da115 100644 --- a/packages/date-picker/src/vaadin-infinite-scroller.js +++ b/packages/date-picker/src/vaadin-infinite-scroller.js @@ -186,8 +186,9 @@ class InfiniteScroller extends PolymerElement { } // Check if we scrolled enough to translate the buffer positions. - const upperThresholdReached = scrollTop > this._buffers[1].translateY + this.itemHeight + this.bufferOffset; - const lowerThresholdReached = scrollTop < this._buffers[0].translateY + this.itemHeight + this.bufferOffset; + const offset = this.itemHeight + this.bufferOffset; + const upperThresholdReached = scrollTop > this._buffers[1].translateY + offset; + const lowerThresholdReached = scrollTop < this._buffers[0].translateY + offset; if (upperThresholdReached || lowerThresholdReached) { this._translateBuffer(lowerThresholdReached); @@ -212,7 +213,7 @@ class InfiniteScroller extends PolymerElement { * @return {number} */ get bufferOffset() { - return this.root.querySelector('.buffer').offsetTop; + return this._buffers[0].offsetTop; } /** From 9e2f4adaad4436ff3f7fd07f6fccc55e8b3803ad Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Thu, 6 Jan 2022 18:35:05 +0300 Subject: [PATCH 6/8] fix: cover the case when height(visible area) < height(item) --- .../src/vaadin-date-picker-overlay-content.js | 13 ++- packages/date-picker/test/overlay.test.js | 91 +++++++++++-------- 2 files changed, 63 insertions(+), 41 deletions(-) diff --git a/packages/date-picker/src/vaadin-date-picker-overlay-content.js b/packages/date-picker/src/vaadin-date-picker-overlay-content.js index e2e3d7e89d..a39f457872 100644 --- a/packages/date-picker/src/vaadin-date-picker-overlay-content.js +++ b/packages/date-picker/src/vaadin-date-picker-overlay-content.js @@ -402,19 +402,22 @@ class DatePickerOverlayContent extends ThemableMixin(DirMixin(PolymerElement)) { /** * Scrolls the month and year scrollers enough to reveal the given date. */ - revealDate(date) { + revealDate(date, animate = true) { if (date) { const diff = this._differenceInMonths(date, this._originDate); const scrolledAboveViewport = this.$.monthScroller.position > diff; - const visibleItems = - (this.$.monthScroller.clientHeight - this.$.monthScroller.bufferOffset * 2) / this.$.monthScroller.itemHeight; + const visibleArea = Math.max( + this.$.monthScroller.itemHeight, + this.$.monthScroller.clientHeight - this.$.monthScroller.bufferOffset * 2 + ); + const visibleItems = visibleArea / this.$.monthScroller.itemHeight; const scrolledBelowViewport = this.$.monthScroller.position + visibleItems - 1 < diff; if (scrolledAboveViewport) { - this._scrollToPosition(diff, true); + this._scrollToPosition(diff, animate); } else if (scrolledBelowViewport) { - this._scrollToPosition(diff - visibleItems + 1, true); + this._scrollToPosition(diff - visibleItems + 1, animate); } } } diff --git a/packages/date-picker/test/overlay.test.js b/packages/date-picker/test/overlay.test.js index 2753f83657..14a8bd64af 100644 --- a/packages/date-picker/test/overlay.test.js +++ b/packages/date-picker/test/overlay.test.js @@ -1,5 +1,5 @@ import { expect } from '@esm-bundle/chai'; -import { click, fixtureSync, listenOnce, nextRender, oneEvent, tap } from '@vaadin/testing-helpers'; +import { click, fixtureSync, listenOnce, nextRender, tap } from '@vaadin/testing-helpers'; import sinon from 'sinon'; import '../src/vaadin-date-picker-overlay-content.js'; import { afterNextRender } from '@polymer/polymer/lib/utils/render-status.js'; @@ -333,9 +333,7 @@ describe('overlay', () => { async function fixtureOverlayContent({ monthScrollerItems, monthScrollerOffset }) { overlay = fixtureSync(` - + `); monthScroller = overlay.$.monthScroller; monthScroller.style.setProperty('--vaadin-infinite-scroller-buffer-offset', monthScrollerOffset); @@ -347,7 +345,34 @@ describe('overlay', () => { await nextRender(); } - describe('default', () => { + describe('height(visible area) < height(item)', () => { + beforeEach(async () => { + await fixtureOverlayContent({ + monthScrollerItems: 0.5, + monthScrollerOffset: 0 + }); + }); + + it('should scroll when the month is above the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 0, 1), false); + expect(monthScroller.position).to.equal(position - 1); + }); + + it('should not scroll when the month is the same', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 1, 10), false); + expect(monthScroller.position).to.equal(position); + }); + + it('should scroll when the month is below the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 2, 1), false); + expect(monthScroller.position).to.equal(position + 1); + }); + }); + + describe('height(visible area) > height(item)', () => { beforeEach(async () => { await fixtureOverlayContent({ monthScrollerItems: 2, @@ -355,25 +380,22 @@ describe('overlay', () => { }); }); - it('should scroll to the month above when it is not visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 0, 1)); - await oneEvent(overlay, 'scroll-animation-finished'); - expect(overlay.$.monthScroller.position).to.equal(position - 1); + it('should scroll when the month is above the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 0, 1), false); + expect(monthScroller.position).to.equal(position - 1); }); - it('should not scroll to the month when it is fully visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 2, 1)); - await nextRender(); - expect(overlay.$.monthScroller.position).to.equal(position); + it('should not scroll when the month is within the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 2, 1), false); + expect(monthScroller.position).to.equal(position); }); - it('should scroll to the month below when it is not visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 3, 1)); - await oneEvent(overlay, 'scroll-animation-finished'); - expect(overlay.$.monthScroller.position).to.equal(position + 1); + it('should scroll when the month is below the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 3, 1), false); + expect(monthScroller.position).to.equal(position + 1); }); }); @@ -381,29 +403,26 @@ describe('overlay', () => { beforeEach(async () => { await fixtureOverlayContent({ monthScrollerItems: 3, - monthScrollerOffset: '20%' + monthScrollerOffset: '10%' }); }); - it('should scroll to the month above when it is not visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 0, 1)); - await oneEvent(overlay, 'scroll-animation-finished'); - expect(overlay.$.monthScroller.position).to.equal(position - 1 /* 20% is ensured by CSS */); + it('should scroll when the month is above the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 0, 1), false); + expect(monthScroller.position).to.equal(position - 1 /* The top 10% offset is ensured by CSS */); }); - it('should not scroll to the month when it is fully visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 2, 1)); - await nextRender(); - expect(overlay.$.monthScroller.position).to.equal(position); + it('should not scroll when the month is within the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 2, 1), false); + expect(monthScroller.position).to.equal(position); }); - it('should scroll to the month below when it is not visible', async () => { - const position = overlay.$.monthScroller.position; - overlay.revealDate(new Date(2021, 3, 1)); - await oneEvent(overlay, 'scroll-animation-finished'); - expect(overlay.$.monthScroller.position).to.equal(position + 1 + 0.2 /* 20% is ensured by JS */); + it('should scroll when the month is below the visible area', async () => { + const position = monthScroller.position; + overlay.revealDate(new Date(2021, 3, 1), false); + expect(monthScroller.position).to.equal(position + 0.6 /* The bottom 10% offset is ensured by JS */); }); }); }); From 1532c894cbcd0b38936a9ba8571517a0ec406be9 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Fri, 7 Jan 2022 13:05:52 +0300 Subject: [PATCH 7/8] refactor: apply code review suggestions --- packages/date-picker/test/overlay.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/date-picker/test/overlay.test.js b/packages/date-picker/test/overlay.test.js index 14a8bd64af..6d981a919b 100644 --- a/packages/date-picker/test/overlay.test.js +++ b/packages/date-picker/test/overlay.test.js @@ -29,8 +29,8 @@ describe('overlay', () => { overlay.i18n = getDefaultI18n(); overlay.$.monthScroller.bufferSize = 1; overlay.$.yearScroller.bufferSize = 1; - overlay.initialPosition = new Date(); - afterNextRender(overlay.$.monthScroller, () => waitUntilScrolledTo(overlay, new Date(), done)); + overlay.initialPosition = new Date(2021, 1, 1); + afterNextRender(overlay.$.monthScroller, () => waitUntilScrolledTo(overlay, overlay.initialPosition, done)); }); it('should stop tap events from bubbling outside the overlay', () => { @@ -300,7 +300,7 @@ describe('overlay', () => { overlay.i18n = getDefaultI18n(); overlay.$.monthScroller.bufferSize = 1; overlay.$.yearScroller.bufferSize = 1; - overlay.initialPosition = new Date(); + overlay.initialPosition = new Date(2021, 1, 1); await nextRender(); }); @@ -322,7 +322,7 @@ describe('overlay', () => { const date = new Date(2000, 1, 1); overlay.scrollToDate(date); await nextRender(); - var offset = overlay.$.yearScroller.clientHeight / 2; + const offset = overlay.$.yearScroller.clientHeight / 2; overlay.$.yearScroller._debouncerUpdateClones.flush(); expect(getFirstVisibleItem(overlay.$.yearScroller, offset).firstElementChild.textContent).to.contain('2000'); }); From 4ffdc314389b9f21341a9e880674c472cec878e0 Mon Sep 17 00:00:00 2001 From: Sergey Vinogradov Date: Fri, 7 Jan 2022 14:20:13 +0300 Subject: [PATCH 8/8] fix: increase item height in material theme --- .../date-picker/baseline/ltr-dropdown.png | Bin 33950 -> 33907 bytes .../date-picker/baseline/rtl-dropdown.png | Bin 34289 -> 34260 bytes ...adin-date-picker-overlay-content-styles.js | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/date-picker/test/visual/material/screenshots/date-picker/baseline/ltr-dropdown.png b/packages/date-picker/test/visual/material/screenshots/date-picker/baseline/ltr-dropdown.png index 233f4c4f29a668d70cec56be053aac4dcc48adbe..5b93aff0bd8ebaab2a4a1df3736a11cea23e32e0 100644 GIT binary patch delta 15976 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 E1$-`smH+?% diff --git a/packages/date-picker/test/visual/material/screenshots/date-picker/baseline/rtl-dropdown.png b/packages/date-picker/test/visual/material/screenshots/date-picker/baseline/rtl-dropdown.png index e7747b4369f58e48a464104280532534c7683ce4..38b4a98add3649bcb2cbda1ba058d0d8935788ea 100644 GIT binary patch delta 17136 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