diff --git a/src/datepicker/datepicker.js b/src/datepicker/datepicker.js index 05784947d0..a6fdd9026d 100644 --- a/src/datepicker/datepicker.js +++ b/src/datepicker/datepicker.js @@ -427,7 +427,8 @@ angular.module('ui.bootstrap.datepicker', ['ui.bootstrap.dateparser', 'ui.bootst closeText: 'Done', closeOnDateSelection: true, appendToBody: false, - showButtonBar: true + showButtonBar: true, + parseStrict: false }) .directive('datepickerPopup', ['$compile', '$parse', '$document', '$position', 'dateFilter', 'dateParser', 'datepickerPopupConfig', @@ -448,6 +449,7 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi appendToBody = angular.isDefined(attrs.datepickerAppendToBody) ? scope.$parent.$eval(attrs.datepickerAppendToBody) : datepickerPopupConfig.appendToBody; scope.showButtonBar = angular.isDefined(attrs.showButtonBar) ? scope.$parent.$eval(attrs.showButtonBar) : datepickerPopupConfig.showButtonBar; + scope.parseStrict = angular.isDefined(attrs.parseStrict) ? scope.$parent.$eval(attrs.parseStrict) : datepickerPopupConfig.parseStrict; scope.getText = function( key ) { return scope[key + 'Text'] || datepickerPopupConfig[key + 'Text']; @@ -509,7 +511,8 @@ function ($compile, $parse, $document, $position, dateFilter, dateParser, datepi ngModel.$setValidity('date', true); return viewValue; } else if (angular.isString(viewValue)) { - var date = dateParser.parse(viewValue, dateFormat) || new Date(viewValue); + var date = dateParser.parse(viewValue, dateFormat) || + ((!scope.parseStrict) ? new Date(viewValue) : undefined); if (isNaN(date)) { ngModel.$setValidity('date', false); return undefined; diff --git a/src/datepicker/test/datepicker.spec.js b/src/datepicker/test/datepicker.spec.js index b673d162da..552115f94a 100644 --- a/src/datepicker/test/datepicker.spec.js +++ b/src/datepicker/test/datepicker.spec.js @@ -1171,7 +1171,7 @@ describe('datepicker directive', function () { }); it('updates the model & calendar when input value changes', function() { - changeInputValueTo(inputEl, 'March 5, 1980'); + changeInputValueTo(inputEl, '1980-03-05'); expect($rootScope.date.getFullYear()).toEqual(1980); expect($rootScope.date.getMonth()).toEqual(2); @@ -1272,6 +1272,37 @@ describe('datepicker directive', function () { }); }); + describe('attribute `parse-strict`', function () { + beforeEach(function() { + $rootScope.parseStrict = true; + var wrapElement = $compile('
')($rootScope); + $rootScope.$digest(); + assignElements(wrapElement); + }); + + it('true and input with invalid date creating undefined model value', function() { + changeInputValueTo(inputEl, '1'); + + expect($rootScope.date).toEqual(undefined); + }); + + }); + + describe('attribute `parse-strict`', function () { + beforeEach(function() { + $rootScope.parseStrict = false; + var wrapElement = $compile('
')($rootScope); + $rootScope.$digest(); + assignElements(wrapElement); + }); + + it('false and input with invalid date creating undefined model value', function() { + changeInputValueTo(inputEl, '1'); + + expect($rootScope.date).toEqual(new Date('January 01, 2001')); + }); + }); + describe('toggles programatically by `open` attribute', function () { beforeEach(inject(function() { $rootScope.open = true;