Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit e1c07ec

Browse files
ademurijelbourn
authored andcommitted
fix(datepicker): change mdDateUtil.isDateWithinRange to ignore the time component of the date
Previously, mdDateUtil.isDateWithinRange did a simple comparison on the given dates. Since this component is used for dates (and not times or datetimes), this leads to inconsistent behavior. Fixes #6887 Closes #6888
1 parent 4d5e0ed commit e1c07ec

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

src/components/datepicker/dateUtil.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,9 @@
204204
* Creates a date with the time set to midnight.
205205
* Drop-in replacement for two forms of the Date constructor:
206206
* 1. No argument for Date representing now.
207-
* 2. Single-argument value representing number of seconds since Unix Epoch.
208-
* @param {number=} opt_value
207+
* 2. Single-argument value representing number of seconds since Unix Epoch
208+
* or a Date object.
209+
* @param {number|Date=} opt_value
209210
* @return {Date} New date with time set to midnight.
210211
*/
211212
function createDateAtMidnight(opt_value) {
@@ -220,15 +221,18 @@
220221
}
221222

222223
/**
223-
* Checks if a date is within a min and max range.
224+
* Checks if a date is within a min and max range, ignoring the time component.
224225
* If minDate or maxDate are not dates, they are ignored.
225226
* @param {Date} date
226227
* @param {Date} minDate
227228
* @param {Date} maxDate
228229
*/
229230
function isDateWithinRange(date, minDate, maxDate) {
230-
return (!angular.isDate(minDate) || minDate <= date) &&
231-
(!angular.isDate(maxDate) || maxDate >= date);
231+
var dateAtMidnight = createDateAtMidnight(date);
232+
var minDateAtMidnight = isValidDate(minDate) ? createDateAtMidnight(minDate) : null;
233+
var maxDateAtMidnight = isValidDate(maxDate) ? createDateAtMidnight(maxDate) : null;
234+
return (!minDateAtMidnight || minDateAtMidnight <= dateAtMidnight) &&
235+
(!maxDateAtMidnight || maxDateAtMidnight >= dateAtMidnight);
232236
}
233237
});
234238
})();

src/components/datepicker/dateUtil.spec.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,4 +324,53 @@ describe('$$mdDateUtil', function() {
324324

325325
expect(dateUtil.isValidDate(new Date())).toBe(true);
326326
});
327+
328+
it('should return true when a date is in range', function() {
329+
var date = new Date('2015-05-02');
330+
var minDate = new Date('2015-05-01');
331+
var maxDate = new Date('2015-05-03');
332+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeTruthy();
333+
});
334+
335+
it('should return false when a date is before the range', function() {
336+
var date = new Date('2015-04-29');
337+
var minDate = new Date('2015-05-01');
338+
var maxDate = new Date('2015-05-03');
339+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeFalsy();
340+
});
341+
342+
it('should return false when a date is after the range', function() {
343+
var date = new Date('2015-05-05');
344+
var minDate = new Date('2015-05-01');
345+
var maxDate = new Date('2015-05-03');
346+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeFalsy();
347+
});
348+
349+
it('should set the time to midnight before checking the min date', function() {
350+
var date = new Date('2015-05-01T11:00:00');
351+
var minDate = new Date('2015-05-01T12:00:00');
352+
var maxDate = new Date('2015-05-03');
353+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeTruthy();
354+
});
355+
356+
it('should set the time to midnight before checking the max date', function() {
357+
var date = new Date('2015-05-03T13:00:00');
358+
var minDate = new Date('2015-05-01');
359+
var maxDate = new Date('2015-05-03T12:00:00');
360+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeTruthy();
361+
});
362+
363+
it('should ignore an invalid minDate when checking if the date is in range', function() {
364+
var date = new Date('2015-05-02');
365+
var minDate = null;
366+
var maxDate = new Date('2015-05-03');
367+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeTruthy();
368+
});
369+
370+
it('should ignore an invalid maxDate when checking if the date is in range', function() {
371+
var date = new Date('2015-05-02');
372+
var minDate = new Date('2015-05-01');
373+
var maxDate = null;
374+
expect(dateUtil.isDateWithinRange(date, minDate, maxDate)).toBeTruthy();
375+
});
327376
});

0 commit comments

Comments
 (0)