ソースを参照

Added yearrange option to the date extensions

Robin Herbots 13 年 前
コミット
7a2dfef8aa
2 ファイル変更47 行追加19 行削除
  1. 6 5
      README.md
  2. 41 14
      js/jquery.inputmask.date.extensions.js

+ 6 - 5
README.md

@@ -5,7 +5,7 @@ jquery.inputmask is a jquery plugin which create an input mask.
 Copyright (c) 2010 - 2012 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
 
-The plugin is based on the idea of the maskedinput plugin of Josh Bush (http://digitalbush.com/projects/masked-input-plugin), but has finer control over the 'mask-definitions' and is fully compatible with the ui-datepicker
+The plugin is based on the idea of the maskedinput plugin of Josh Bush (http://digitalbush.com/projects/masked-input-plugin), but has finer control over the 'mask-definitions'.
 
 A definition can have a cardinality and have multiple prevalidators.
 
@@ -365,16 +365,17 @@ $(document).ready(function(){
    $("#date").inputmask("dd/mm/yyyy");
    $("#date").inputmask("mm/dd/yyyy");
    $("#date").inputmask("date"); // alias for dd/mm/yyyy
+   $("#date").inputmask("date", {yearrange: { minyear: 1900, maxyear: 2099 }}); //specify year range
 });
 ```
 
 The date aliases take leapyears into account.  There is also autocompletion on day, month, year.
 For example:
 
-input:	2/2/2012 		result: 02/02/2012
-input:  352012			result: 03/05/2012
-input:  3530			result: 03/05/2030
-input: <ctrl> rightarrow	result: the date from today
+>input:	2/2/2012 		result: 02/02/2012
+>input:  352012			result: 03/05/2012
+>input:  3/530			result: 03/05/2030
+>input: <ctrl> rightarrow	result: the date from today
 
 ### numeric aliases
 

+ 41 - 14
js/jquery.inputmask.date.extensions.js

@@ -3,7 +3,7 @@ Input Mask plugin extensions
 http://github.com/RobinHerbots/jquery.inputmask
 Copyright (c) 2010 - 2012 Robin Herbots
 Licensed under the MIT license (http://www.opensource.org/licenses/mit-license.php)
-Version: 1.2.1
+Version: 1.2.2
 
 Optional extensions on the jquery.inputmask base
 */
@@ -48,14 +48,24 @@ Optional extensions on the jquery.inputmask base
                 val1pre: new RegExp("[0-3]"), //daypre
                 val1: new RegExp("0[1-9]|[12][0-9]|3[01]"), //day
                 val2pre: function(separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9]|3[01])" + escapedSeparator + "[01])"); }, //monthpre
-                val2: function(separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); },//month
-                yearpre1: new RegExp("[12]"),
-                yearpre2: new RegExp("(19|20)"),
-                yearpre3: new RegExp("(19|20)\\d"),
-                year: new RegExp("(19|20)\\d{2}")
+                val2: function(separator) { var escapedSeparator = $.inputmask.escapeRegex.call(this, separator); return new RegExp("((0[1-9]|[12][0-9])" + escapedSeparator + "(0[1-9]|1[012]))|(30" + escapedSeparator + "(0[13-9]|1[012]))|(31" + escapedSeparator + "(0[13578]|1[02]))"); }//month
             },
             leapday: "29/02/",
             separator: '/',
+            yearrange: { minyear: 1900, maxyear: 2099 },
+            isInYearRange: function(chrs, minyear, maxyear){
+            	var enteredyear = parseInt(chrs.concat(minyear.toString().slice(chrs.length)));
+            	var enteredyear2 = parseInt(chrs.concat(maxyear.toString().slice(chrs.length)));
+            	return (enteredyear != NaN ? minyear <= enteredyear && enteredyear <= maxyear : false) ||
+            		   (enteredyear2 != NaN ? minyear <= enteredyear2 && enteredyear2 <= maxyear : false); 
+            },
+            determinebaseyear: function(minyear, maxyear){
+            	var currentyear = (new Date()).getFullYear();
+            	if(minyear > currentyear) return minyear;
+            	if(maxyear < currentyear) return maxyear;
+            	
+            	return currentyear;
+            },
             onKeyUp: function(e, opts) {
                 var $input = $(this), input = this;
                 if (e.ctrlKey && e.keyCode == opts.keyCode.RIGHT) {
@@ -124,7 +134,7 @@ Optional extensions on the jquery.inputmask base
                         },
                         'y': { //year
                             validator: function(chrs, buffer, pos, strict, opts) {
-                                if (opts.regex.year.test(chrs)) {
+                                if (opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
                                     var dayMonthValue = buffer.join('').substr(0, 6);
                                     if (dayMonthValue != opts.leapday)
                                         return true;
@@ -143,11 +153,18 @@ Optional extensions on the jquery.inputmask base
                             cardinality: 4,
                             prevalidator: [
                         { validator: function(chrs, buffer, pos, strict, opts) {
-                            var isValid = opts.regex.yearpre1.test(chrs);
+                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
                             if (!strict && !isValid) {
-                                var yearPrefix = (new Date()).getFullYear().toString().slice(0, 2);
+                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear).toString().slice(0, 1);
+
+                                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                                if (isValid) {
+                                    buffer[pos++] = yearPrefix[0];
+                                    return { "pos": pos };
+                                }
+                                yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear).toString().slice(0, 2);
 
-                                isValid = opts.regex.yearpre3.test(yearPrefix + chrs);
+                                isValid = opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
                                 if (isValid) {
                                     buffer[pos++] = yearPrefix[0];
                                     buffer[pos++] = yearPrefix[1];
@@ -159,10 +176,18 @@ Optional extensions on the jquery.inputmask base
                             cardinality: 1
                         },
                         { validator: function(chrs, buffer, pos, strict, opts) {
-                            var isValid = opts.regex.yearpre2.test(chrs);
+                            var isValid = opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
                             if (!strict && !isValid) {
-                                var yearPrefix = (new Date()).getFullYear().toString().slice(0, 2);
-                                if (opts.regex.year.test(yearPrefix + chrs)) {
+                                var yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear).toString().slice(0, 2);
+
+                                isValid = opts.isInYearRange(yearPrefix + chrs[1], opts.yearrange.minyear, opts.yearrange.maxyear);
+                                if (isValid) {
+                                    buffer[pos++] = yearPrefix[1];
+                                    return { "pos": pos };
+                                }
+                            
+                                yearPrefix = opts.determinebaseyear(opts.yearrange.minyear, opts.yearrange.maxyear).toString().slice(0, 2);
+                                if (opts.isInYearRange(yearPrefix + chrs, opts.yearrange.minyear, opts.yearrange.maxyear)) {
                                     var dayMonthValue = buffer.join('').substr(0, 6);
                                     if (dayMonthValue != opts.leapday)
                                         isValid = true;
@@ -186,7 +211,9 @@ Optional extensions on the jquery.inputmask base
                             }
                             return isValid;
                         }, cardinality: 2 },
-                        { validator: "(19|20)\\d", cardinality: 3 }
+                        { validator: function(chrs, buffer, pos, strict, opts) {
+                        	return opts.isInYearRange(chrs, opts.yearrange.minyear, opts.yearrange.maxyear);
+                        }, cardinality: 3 }
                         ]
                         }
                     },