From fe72ebd055ef0eedd85459ce6b36f504b3c33a3e Mon Sep 17 00:00:00 2001 From: Thijs Louisse Date: Mon, 12 Aug 2019 09:37:48 +0200 Subject: [PATCH 1/2] fix(calendar): generated dates are normalized --- packages/calendar/src/LionCalendar.js | 4 +++- .../calendar/src/utils/normalizeDateTime.js | 9 +++++++++ packages/calendar/test/lion-calendar.test.js | 17 +++++++++++++++++ .../test/utils/normalizeDateTime.test.js | 16 ++++++++++++++++ 4 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 packages/calendar/src/utils/normalizeDateTime.js create mode 100644 packages/calendar/test/utils/normalizeDateTime.test.js diff --git a/packages/calendar/src/LionCalendar.js b/packages/calendar/src/LionCalendar.js index 737ddf1c5..f76641009 100644 --- a/packages/calendar/src/LionCalendar.js +++ b/packages/calendar/src/LionCalendar.js @@ -9,6 +9,7 @@ import { isSameDate } from './utils/isSameDate.js'; import { calendarStyle } from './calendarStyle.js'; import './utils/differentKeyNamesShimIE.js'; import { createDay } from './utils/createDay.js'; +import { normalizeDateTime } from './utils/normalizeDateTime.js'; /** * @customElement @@ -152,7 +153,7 @@ export class LionCalendar extends LocalizeMixin(LitElement) { this.disableDates = () => false; this.firstDayOfWeek = 0; this.weekdayHeaderNotation = 'short'; - this.__today = new Date(); + this.__today = normalizeDateTime(new Date()); this.centralDate = this.__today; this.__focusedDate = null; this.__connectedCallbackDone = false; @@ -344,6 +345,7 @@ export class LionCalendar extends LocalizeMixin(LitElement) { if (this.minDate && day.date < this.minDate) { day.disabled = true; } + if (this.maxDate && day.date > this.maxDate) { day.disabled = true; } diff --git a/packages/calendar/src/utils/normalizeDateTime.js b/packages/calendar/src/utils/normalizeDateTime.js new file mode 100644 index 000000000..de7e1d72f --- /dev/null +++ b/packages/calendar/src/utils/normalizeDateTime.js @@ -0,0 +1,9 @@ + +/** + * @desc Makes suitable for date comparisons + * @param {Date} d + * @returns {Date} + */ +export function normalizeDateTime(d) { + return new Date(d.getFullYear(), d.getMonth(), d.getDate()); +} diff --git a/packages/calendar/test/lion-calendar.test.js b/packages/calendar/test/lion-calendar.test.js index 56ea85fe0..e6438165b 100644 --- a/packages/calendar/test/lion-calendar.test.js +++ b/packages/calendar/test/lion-calendar.test.js @@ -338,6 +338,23 @@ describe('', () => { clock.restore(); }); + + describe('Normalization', () => { + it('normalizes all generated dates', async () => { + function isNormalizedDate(d) { + return d.getHours() === 0 && d.getMinutes() === 0 && d.getSeconds() === 0; + } + + const el = await fixture( + html` + + `, + ); + // The central date will be today's date: it's the date all other + // dates in the month view will be derived from. + expect(isNormalizedDate(el.centralDate)).to.be.true; + }); + }); }); }); diff --git a/packages/calendar/test/utils/normalizeDateTime.test.js b/packages/calendar/test/utils/normalizeDateTime.test.js new file mode 100644 index 000000000..f8121df9f --- /dev/null +++ b/packages/calendar/test/utils/normalizeDateTime.test.js @@ -0,0 +1,16 @@ +import { expect } from '@open-wc/testing'; +import { normalizeDateTime } from '../../src/utils/normalizeDateTime.js'; + +describe('normalizeDateTime', () => { + it('returns a date with hours, minutes and seconds set to 0', () => { + const date = normalizeDateTime(new Date('2000-11-29T12:34:56')); + + expect(date.getFullYear()).to.equal(2000); + expect(date.getMonth()).to.equal(10); + expect(date.getDate()).to.equal(29); + // normalized parts + expect(date.getHours()).to.equal(0); + expect(date.getMinutes()).to.equal(0); + expect(date.getSeconds()).to.equal(0); + }); +}); From afddc0ec3c90383a9d8abec8499b5036b8b79f38 Mon Sep 17 00:00:00 2001 From: Thijs Louisse Date: Mon, 12 Aug 2019 09:40:46 +0200 Subject: [PATCH 2/2] fix(calendar): normalize dates for min/max date comparison --- packages/calendar/src/LionCalendar.js | 6 ++--- .../calendar/src/utils/normalizeDateTime.js | 1 - packages/calendar/test/lion-calendar.test.js | 25 +++++++++++++++++++ 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/calendar/src/LionCalendar.js b/packages/calendar/src/LionCalendar.js index f76641009..18771d5de 100644 --- a/packages/calendar/src/LionCalendar.js +++ b/packages/calendar/src/LionCalendar.js @@ -331,7 +331,7 @@ export class LionCalendar extends LocalizeMixin(LitElement) { __coreDayPreprocessor(_day, { currentMonth = false } = {}) { const day = createDay(new Date(_day.date), _day); - const today = new Date(); + const today = normalizeDateTime(new Date()); day.central = isSameDate(day.date, this.centralDate); day.previousMonth = currentMonth && day.date.getMonth() < currentMonth.getMonth(); day.currentMonth = currentMonth && day.date.getMonth() === currentMonth.getMonth(); @@ -342,11 +342,11 @@ export class LionCalendar extends LocalizeMixin(LitElement) { day.future = day.date > today; day.disabled = this.disableDates(day.date); - if (this.minDate && day.date < this.minDate) { + if (this.minDate && normalizeDateTime(day.date) < normalizeDateTime(this.minDate)) { day.disabled = true; } - if (this.maxDate && day.date > this.maxDate) { + if (this.maxDate && normalizeDateTime(day.date) > normalizeDateTime(this.maxDate)) { day.disabled = true; } diff --git a/packages/calendar/src/utils/normalizeDateTime.js b/packages/calendar/src/utils/normalizeDateTime.js index de7e1d72f..290b79df1 100644 --- a/packages/calendar/src/utils/normalizeDateTime.js +++ b/packages/calendar/src/utils/normalizeDateTime.js @@ -1,4 +1,3 @@ - /** * @desc Makes suitable for date comparisons * @param {Date} d diff --git a/packages/calendar/test/lion-calendar.test.js b/packages/calendar/test/lion-calendar.test.js index e6438165b..84c0b02f7 100644 --- a/packages/calendar/test/lion-calendar.test.js +++ b/packages/calendar/test/lion-calendar.test.js @@ -354,6 +354,31 @@ describe('', () => { // dates in the month view will be derived from. expect(isNormalizedDate(el.centralDate)).to.be.true; }); + + it('normalizes dates in date comparisons', async () => { + const selectedDate = new Date('2000-11-04T03:00:00'); + // without normalization, selectedDate > maxDate would wrongfully be disabled + const maxDate = new Date('2000-11-29T02:00:00'); + // without normalization, selectedDate < minDate would wrongfully be disabled + const minDate = new Date('2000-11-02T04:00:00'); + + const el = await fixture( + html` + + `, + ); + const elObj = new CalendarObject(el); + + expect(elObj.getDayObj(29).isDisabled).to.equal(false); + expect(elObj.getDayObj(30).isDisabled).to.equal(true); + + expect(elObj.getDayObj(2).isDisabled).to.equal(false); + expect(elObj.getDayObj(1).isDisabled).to.equal(true); + }); }); }); });