From cd3fc8c5249c1531c60a8e5c5c4e3ff11e8a203c Mon Sep 17 00:00:00 2001 From: sergicollado Date: Wed, 17 Dec 2014 10:22:50 +0100 Subject: [PATCH 01/12] added range validation --- src/angular-input-date.js | 62 ++++++++++++++++++++++++++++----------- 1 file changed, 45 insertions(+), 17 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 31786ad..07dbfb1 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -43,6 +43,14 @@ dateTime.getUTCDate() ); } + function validationRange(selectedDate,scope){ + var minLimitError = (angular.isDefined(scope.minLimit) && selectedDate < scope.minLimit); + var maxLimitError = (angular.isDefined(scope.maxLimit) && selectedDate > scope.maxLimit); + if(!selectedDate || minLimitError || maxLimitError){ + return false; + } + return true; + } angular.module('ngInputDate', ['ng']) .factory('inputDate', function() { @@ -50,27 +58,47 @@ ExtractDate: ExtractDate }; }) - .directive('input', ['dateFilter', function(dateFilter) { + .directive('dateOptions',function(){ + return { - restrict: 'E', + restrict: 'A', + priority:2, + scope:{ + minLimit: '=', + maxLimit: '=' + }, require: '?ngModel', link: function(scope, element, attrs, ngModel) { - if ( - 'undefined' !== typeof attrs.type - && 'date' === attrs.type - && ngModel - ) { - ngModel.$formatters.push(function(modelValue) { - return dateFilter(modelValue, inputDateFormat); - }); + ngModel.$formatters.push(function(modelValue) { + ngModel.$setValidity('range', validationRange(modelValue, scope)); + return modelValue; + }); + ngModel.$parsers.push(function(viewValue) { + ngModel.$setValidity('range', validationRange(viewValue, scope)); + return viewValue; + }); - ngModel.$parsers.push(function(viewValue) { - return parseDateString(viewValue); - }); + } + }; + }) + .directive('input', ['dateFilter','inputDate', function(dateFilter, inputDate) { + return { + restrict: 'E', + require: '?ngModel', + link: function(scope, element, attrs, ngModel) { + if (angular.isUndefined(attrs.type) || + 'date' !== attrs.type || !ngModel || !inputDate.enabled) { + return; } + ngModel.$formatters.push(function(modelValue) { + return dateFilter(modelValue, inputDateFormat); + }); + + ngModel.$parsers.push(function(viewValue) { + return parseDateString(viewValue); + }); } - } - }]) - ; + }; + }]) ; -})(window, angular); \ No newline at end of file +})(window, angular); From aec33437c640548c6ca92c0ae520441fc03e6cc3 Mon Sep 17 00:00:00 2001 From: sergicollado Date: Fri, 9 Jan 2015 12:50:49 +0100 Subject: [PATCH 02/12] fix string parse range --- src/angular-input-date.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 07dbfb1..01cfce1 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -44,9 +44,13 @@ ); } function validationRange(selectedDate,scope){ - var minLimitError = (angular.isDefined(scope.minLimit) && selectedDate < scope.minLimit); - var maxLimitError = (angular.isDefined(scope.maxLimit) && selectedDate > scope.maxLimit); - if(!selectedDate || minLimitError || maxLimitError){ + var dateToCompare = selectedDate; + if(!(selectedDate instanceof Date) && angular.isDefined(selectedDate)){ + dateToCompare = new Date(selectedDate); + } + var minLimitError = (angular.isDefined(scope.minLimit) && dateToCompare < scope.minLimit); + var maxLimitError = (angular.isDefined(scope.maxLimit) && dateToCompare > scope.maxLimit); + if(!dateToCompare || minLimitError || maxLimitError){ return false; } return true; @@ -62,7 +66,7 @@ return { restrict: 'A', - priority:2, + priority:1, scope:{ minLimit: '=', maxLimit: '=' @@ -73,7 +77,7 @@ ngModel.$setValidity('range', validationRange(modelValue, scope)); return modelValue; }); - ngModel.$parsers.push(function(viewValue) { + ngModel.$parsers.unshift(function(viewValue) { ngModel.$setValidity('range', validationRange(viewValue, scope)); return viewValue; }); From 4ee6d6d0a6a4ab9c31a1e36a889754a4ff672b74 Mon Sep 17 00:00:00 2001 From: sergicollado Date: Fri, 9 Jan 2015 15:37:57 +0100 Subject: [PATCH 03/12] added required --- bower.json | 9 +++++---- src/angular-input-date.js | 25 ++++++++++++++++++------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/bower.json b/bower.json index 9105e0f..fe7295a 100644 --- a/bower.json +++ b/bower.json @@ -1,11 +1,12 @@ { - "name": "angular-input-date", - "description": "AngularJS directive to enable support for input[type=\"date\"]", - "version": "1.0.4", + "name": "angular-input-date-extended rangeValidation", + "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation", + "version": "1.0.5", "main": "src/angular-input-date.js", + "homepage":'https://github.com/sergicollado/angular-input-date', "dependencies": { "angular": "~1.2.26" }, "devDependencies": { } -} \ No newline at end of file +} diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 01cfce1..0ee7c4e 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -43,13 +43,21 @@ dateTime.getUTCDate() ); } - function validationRange(selectedDate,scope){ + + + /** + * Valide selected date is between range * + * I.e. truncates time part. + * @param selectedDate,minLimit,maxLimit + * @constructor + */ + function validationRange(selectedDate,minLimit, maxLimit){ var dateToCompare = selectedDate; if(!(selectedDate instanceof Date) && angular.isDefined(selectedDate)){ dateToCompare = new Date(selectedDate); } - var minLimitError = (angular.isDefined(scope.minLimit) && dateToCompare < scope.minLimit); - var maxLimitError = (angular.isDefined(scope.maxLimit) && dateToCompare > scope.maxLimit); + var minLimitError = (angular.isDefined(minLimit) && dateToCompare < minLimit); + var maxLimitError = (angular.isDefined(maxLimit) && dateToCompare > maxLimit); if(!dateToCompare || minLimitError || maxLimitError){ return false; } @@ -66,19 +74,22 @@ return { restrict: 'A', - priority:1, scope:{ minLimit: '=', maxLimit: '=' }, require: '?ngModel', link: function(scope, element, attrs, ngModel) { + ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$formatters.push(function(modelValue) { - ngModel.$setValidity('range', validationRange(modelValue, scope)); + ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$setValidity('range', validationRange(modelValue, scope.minLimit, scope.maxLimit)); return modelValue; }); - ngModel.$parsers.unshift(function(viewValue) { - ngModel.$setValidity('range', validationRange(viewValue, scope)); + ngModel.$parsers.push(function(viewValue) { + ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$setValidity('range', validationRange(viewValue, scope.minLimit, scope.maxLimit)); return viewValue; }); From f6e50c04c8781609cf8ca27773159972e36b90ef Mon Sep 17 00:00:00 2001 From: sergicollado Date: Tue, 13 Jan 2015 09:58:15 +0100 Subject: [PATCH 04/12] ready to bower --- .gitignore | 1 + bower.json | 2 +- readme.md | 23 ++++++++++++++--------- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 452f454..4e96676 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /.bower.json +*.swp diff --git a/bower.json b/bower.json index fe7295a..5d6fd4f 100644 --- a/bower.json +++ b/bower.json @@ -1,6 +1,6 @@ { "name": "angular-input-date-extended rangeValidation", - "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation", + "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation, fork of betsol/angular-input-date", "version": "1.0.5", "main": "src/angular-input-date.js", "homepage":'https://github.com/sergicollado/angular-input-date', diff --git a/readme.md b/readme.md index e80adae..48d4252 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,4 @@ -# angular-input-date 1.0.4 +# angular-input-date 1.0.5 This module provides a very simple directive to enable support for `input[type="date"]` with the latest stable version of AngularJS (`~1.2.26`). @@ -84,16 +84,21 @@ application.controller('AppCtrl', function($scope, someExistingDate, inputDate) You have to inject our service called `inputDate` and invoke it's `ExtractDate` method. It will return proper timeless `Date` object. -## Feedback +## Ranges validation -If you have found a bug - please create an issue in this GitHub repository. - -If you have a question - file it with [StackOverflow][so-ask] and send me a -link to [s.fomin@betsol.ru][email]. +``` html + +``` -Have any ideas or propositions? Feel free to contact me by the same [E-Mail address][email]. +You can specify scope value in your controller like this: -Cheers! +``` javascript +application.controller('AppCtrl', function($scope) { + $scope.myDateObject = new Date(2014, 3, 19); + $scope.startDate = new Date(2014, 3, 16); + $scope.endDate = new Date(2014, 3, 23); +}); +``` ## License @@ -122,4 +127,4 @@ THE SOFTWARE. [mdn-date]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date [demo]: http://jsfiddle.net/slavafomin/F2LcY/4/ [so-ask]: http://stackoverflow.com/questions/ask?tags=angularjs,javascript -[email]: mailto:s.fomin@betsol.ru \ No newline at end of file +[email]: mailto:s.fomin@betsol.ru From d90fb1185aa2007a96b23a023d396576927e1429 Mon Sep 17 00:00:00 2001 From: sergicollado Date: Tue, 13 Jan 2015 10:14:24 +0100 Subject: [PATCH 05/12] fix bwer.json --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 5d6fd4f..7f05fad 100644 --- a/bower.json +++ b/bower.json @@ -3,7 +3,7 @@ "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation, fork of betsol/angular-input-date", "version": "1.0.5", "main": "src/angular-input-date.js", - "homepage":'https://github.com/sergicollado/angular-input-date', + "homepage":"https://github.com/sergicollado/angular-input-date", "dependencies": { "angular": "~1.2.26" }, From dd9af7277a14e57a595819c9b3b1064f3ec1dee8 Mon Sep 17 00:00:00 2001 From: sergi collado Date: Fri, 20 Feb 2015 13:55:03 +0100 Subject: [PATCH 06/12] Update angular-input-date.js --- src/angular-input-date.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 0ee7c4e..809c5de 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -83,12 +83,12 @@ ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); ngModel.$formatters.push(function(modelValue) { - ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$viewValue)) ); ngModel.$setValidity('range', validationRange(modelValue, scope.minLimit, scope.maxLimit)); return modelValue; }); ngModel.$parsers.push(function(viewValue) { - ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(ngModel.$viewValue)) ); ngModel.$setValidity('range', validationRange(viewValue, scope.minLimit, scope.maxLimit)); return viewValue; }); From eb28c43a616d2c7e5b8ca28cd54c012827c17c5c Mon Sep 17 00:00:00 2001 From: Sergi Date: Fri, 20 Feb 2015 13:56:18 +0100 Subject: [PATCH 07/12] update version --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 7f05fad..8b4a58f 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-input-date-extended rangeValidation", "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation, fork of betsol/angular-input-date", - "version": "1.0.5", + "version": "1.0.6", "main": "src/angular-input-date.js", "homepage":"https://github.com/sergicollado/angular-input-date", "dependencies": { From 4b6df6e57b01acd23fc7a4bf6d7874ef70ce5c3b Mon Sep 17 00:00:00 2001 From: Sergi Date: Mon, 4 May 2015 17:47:50 +0200 Subject: [PATCH 08/12] fix bug validation range --- src/angular-input-date.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 809c5de..b7d0f41 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -83,12 +83,12 @@ ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); ngModel.$formatters.push(function(modelValue) { - ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$viewValue)) ); + ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(modelValue)) ); ngModel.$setValidity('range', validationRange(modelValue, scope.minLimit, scope.maxLimit)); return modelValue; }); ngModel.$parsers.push(function(viewValue) { - ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(ngModel.$viewValue)) ); + ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(viewValue)) ); ngModel.$setValidity('range', validationRange(viewValue, scope.minLimit, scope.maxLimit)); return viewValue; }); From e40426fe2537a1cccc5538a5a545572df2df266e Mon Sep 17 00:00:00 2001 From: Sergi Date: Mon, 4 May 2015 17:48:18 +0200 Subject: [PATCH 09/12] update version --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 8b4a58f..3085bd9 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-input-date-extended rangeValidation", "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation, fork of betsol/angular-input-date", - "version": "1.0.6", + "version": "1.0.7", "main": "src/angular-input-date.js", "homepage":"https://github.com/sergicollado/angular-input-date", "dependencies": { From 35c2b2f4a58ed17c4f11ef23483af6c4aa559159 Mon Sep 17 00:00:00 2001 From: Jacobo Segovia Date: Tue, 26 May 2015 17:23:25 +0200 Subject: [PATCH 10/12] add function to check variables undefined/empty/null and fix function validation range --- src/angular-input-date.js | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index b7d0f41..5245eee 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -3,6 +3,14 @@ var inputDateFormat = 'yyyy-MM-dd'; + /** + * Check varible or object to 'is undefined', 'is empty' or 'is null' + * @param obj + */ + angular.isUndefinedOrNullOrEmpty = function (obj) { + return angular.isUndefined(obj) || obj === null || obj.length === 0 || typeof obj === 'object' && Object.keys(obj).length === 0; + }; + /** * Converts string representation of date to a Date object. * @@ -52,12 +60,22 @@ * @constructor */ function validationRange(selectedDate,minLimit, maxLimit){ + if(angular.isUndefined(selectedDate)) { + return true; + } var dateToCompare = selectedDate; - if(!(selectedDate instanceof Date) && angular.isDefined(selectedDate)){ + if(!(selectedDate instanceof Date)){ dateToCompare = new Date(selectedDate); } - var minLimitError = (angular.isDefined(minLimit) && dateToCompare < minLimit); - var maxLimitError = (angular.isDefined(maxLimit) && dateToCompare > maxLimit); + if(!(selectedDate instanceof Date) && angular.isDefined(minLimit)){ + minLimit = new Date(minLimit); + } + if(!(selectedDate instanceof Date) && angular.isDefined(maxLimit)){ + maxLimit = new Date(maxLimit); + } + var minLimitError = (angular.isDefined(minLimit) && minLimit && dateToCompare < minLimit); + var maxLimitError = (angular.isDefined(maxLimit) && maxLimit && dateToCompare > maxLimit); + if(!dateToCompare || minLimitError || maxLimitError){ return false; } From dff7d19bcac8ac5cf972b91aebfbd0d4d72b1775 Mon Sep 17 00:00:00 2001 From: Jacobo Segovia Date: Tue, 26 May 2015 17:50:51 +0200 Subject: [PATCH 11/12] refactor parser date string and defined --- src/angular-input-date.js | 50 +++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/src/angular-input-date.js b/src/angular-input-date.js index 5245eee..cd41cea 100644 --- a/src/angular-input-date.js +++ b/src/angular-input-date.js @@ -52,6 +52,17 @@ ); } + /** + * Check variable is instace of Date and return Date obj * + * @param date + * @constructor + */ + var formatDate = function(date){ + if(!(date instanceof Date) && angular.isDefined(date)){ + date = new Date(date); + } + return date; + }; /** * Valide selected date is between range * @@ -60,19 +71,15 @@ * @constructor */ function validationRange(selectedDate,minLimit, maxLimit){ - if(angular.isUndefined(selectedDate)) { - return true; - } var dateToCompare = selectedDate; - if(!(selectedDate instanceof Date)){ - dateToCompare = new Date(selectedDate); - } - if(!(selectedDate instanceof Date) && angular.isDefined(minLimit)){ - minLimit = new Date(minLimit); - } - if(!(selectedDate instanceof Date) && angular.isDefined(maxLimit)){ - maxLimit = new Date(maxLimit); + if(angular.isUndefined(dateToCompare)) { + return true; } + + dateToCompare = formatDate(selectedDate); + minLimit = formatDate(minLimit); + maxLimit = formatDate(maxLimit); + var minLimitError = (angular.isDefined(minLimit) && minLimit && dateToCompare < minLimit); var maxLimitError = (angular.isDefined(maxLimit) && maxLimit && dateToCompare > maxLimit); @@ -82,6 +89,18 @@ return true; } + /** + * Valide selected date required + * @param selectedDate,isRequired + * @constructor + */ + function validationRequired(selectedDate, isRequired) { + if(!isRequired || angular.isUndefined(isRequired)){ + return true; + } + return !(angular.isUndefinedOrNullOrEmpty(selectedDate)); + } + angular.module('ngInputDate', ['ng']) .factory('inputDate', function() { return { @@ -93,20 +112,21 @@ return { restrict: 'A', scope:{ + isRequired: '=?ngRequired', minLimit: '=', maxLimit: '=' }, require: '?ngModel', link: function(scope, element, attrs, ngModel) { - ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(ngModel.$modelValue)) ); + ngModel.$setValidity('required',validationRequired(ngModel.$modelValue, scope.isRequired)); ngModel.$formatters.push(function(modelValue) { - ngModel.$setValidity('required',!( angular.isUndefinedOrNullOrEmpty(modelValue)) ); + ngModel.$setValidity('required',validationRequired(modelValue, scope.isRequired)); ngModel.$setValidity('range', validationRange(modelValue, scope.minLimit, scope.maxLimit)); return modelValue; }); - ngModel.$parsers.push(function(viewValue) { - ngModel.$setValidity('required',!(angular.isUndefinedOrNullOrEmpty(viewValue)) ); + ngModel.$parsers.push(function(viewValue) { + ngModel.$setValidity('required',validationRequired(viewValue, scope.isRequired)); ngModel.$setValidity('range', validationRange(viewValue, scope.minLimit, scope.maxLimit)); return viewValue; }); From df5bc3d8b7594d6e0c586d69828f6e9c48d55612 Mon Sep 17 00:00:00 2001 From: Sergi Date: Wed, 27 May 2015 10:04:31 +0200 Subject: [PATCH 12/12] Update version with new fixes --- bower.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bower.json b/bower.json index 3085bd9..0edc18a 100644 --- a/bower.json +++ b/bower.json @@ -1,7 +1,7 @@ { "name": "angular-input-date-extended rangeValidation", "description": "AngularJS directive to enable support for input[type=\"date\"] added range validation, fork of betsol/angular-input-date", - "version": "1.0.7", + "version": "1.0.8", "main": "src/angular-input-date.js", "homepage":"https://github.com/sergicollado/angular-input-date", "dependencies": {