From fe72ebd055ef0eedd85459ce6b36f504b3c33a3e Mon Sep 17 00:00:00 2001 From: Thijs Louisse Date: Mon, 12 Aug 2019 09:37:48 +0200 Subject: [PATCH] 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); + }); +});