Browse Source

Datetime alias 29/02/a valid year does not always allows fix #2286

Robin Herbots 6 years ago
parent
commit
c9a44e06e1

+ 1 - 0
CHANGELOG.md

@@ -11,6 +11,7 @@
 - \<input-mask> enhance attribute handling
 
 ### Fixed
+- Datetime alias 29/02/a valid year does not always allows #2286
 - 'input-mask' has already been defined as a custom element #2285
 - Using min with alias integer not working correctly because of postValidation #2284
 - fix double events when using jQuery.clone function

+ 1 - 1
bower.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "5.0.4-beta.31",
+  "version": "5.0.4-beta.32",
   "main": [
 	  "./index.js",
     "./css/inputmask.css"

+ 1 - 1
composer.json

@@ -1,7 +1,7 @@
 {
   "name": "robinherbots/inputmask",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
-  "version": "5.0.4-beta.31",
+  "version": "5.0.4-beta.32",
   "type": "library",
   "keywords": ["jquery", "plugins", "input", "form", "inputmask", "mask"],
   "homepage": "http://robinherbots.github.io/Inputmask",

+ 21 - 12
dist/inputmask.js

@@ -3,7 +3,7 @@
  * https://github.com/RobinHerbots/Inputmask
  * Copyright (c) 2010 - 2020 Robin Herbots
  * Licensed under the MIT license
- * Version: 5.0.4-beta.31
+ * Version: 5.0.4-beta.32
  */
 !function webpackUniversalModuleDefinition(root, factory) {
     if ("object" == typeof exports && "object" == typeof module) module.exports = factory(); else if ("function" == typeof define && define.amd) define([], factory); else {
@@ -2070,19 +2070,28 @@
         function prefillYear(dateParts, currentResult, opts) {
             if (dateParts.year !== dateParts.rawyear) {
                 var crrntyear = currentYear.toString(), enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""), currentYearPart = crrntyear.slice(0, enteredPart.length), currentYearNextPart = crrntyear.slice(enteredPart.length);
-                2 === enteredPart.length && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime()) && (dateParts.date.setFullYear(crrntyear), 
-                dateParts.year = crrntyear, currentResult.insert = [ {
-                    pos: currentResult.pos + 1,
-                    c: currentYearNextPart[0]
-                }, {
-                    pos: currentResult.pos + 2,
-                    c: currentYearNextPart[1]
-                } ]);
+                if (2 === enteredPart.length && enteredPart === currentYearPart) {
+                    var entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
+                    dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime()) && (dateParts.date.setFullYear(currentYear), 
+                    dateParts.year = crrntyear, currentResult.insert = [ {
+                        pos: currentResult.pos + 1,
+                        c: currentYearNextPart[0]
+                    }, {
+                        pos: currentResult.pos + 2,
+                        c: currentYearNextPart[1]
+                    } ]);
+                }
             }
             return currentResult;
         }
-        function isValidDate(dateParts, currentResult) {
-            return (!isFinite(dateParts.rawday) || "29" == dateParts.day && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) && currentResult;
+        function isValidDate(dateParts, currentResult, opts) {
+            if (!isFinite(dateParts.rawday) || "29" == dateParts.day && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) return currentResult;
+            if ("29" == dateParts.day) {
+                var tokenMatch = getTokenMatch(currentResult.pos, opts);
+                if ("yyyy" === tokenMatch.targetMatch[0] && currentResult.pos - tokenMatch.targetMatchIndex == 2) return currentResult.remove = currentResult.pos + 1, 
+                currentResult;
+            }
+            return !1;
         }
         function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
             if (!result) return result;
@@ -2248,7 +2257,7 @@
                     }
                     var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
                     return result && dateParts.date.getTime() == dateParts.date.getTime() && (result = prefillYear(dateParts, result, opts), 
-                    result = isValidDate(dateParts, result), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)), 
+                    result = isValidDate(dateParts, result, opts), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)), 
                     pos && result && currentResult.pos !== pos ? {
                         buffer: parse(opts.inputFormat, dateParts, opts).split(""),
                         refreshFromBuffer: {

File diff suppressed because it is too large
+ 2 - 2
dist/inputmask.min.js


+ 21 - 12
dist/jquery.inputmask.js

@@ -3,7 +3,7 @@
  * https://github.com/RobinHerbots/Inputmask
  * Copyright (c) 2010 - 2020 Robin Herbots
  * Licensed under the MIT license
- * Version: 5.0.4-beta.31
+ * Version: 5.0.4-beta.32
  */
 !function webpackUniversalModuleDefinition(root, factory) {
     if ("object" == typeof exports && "object" == typeof module) module.exports = factory(require("jquery")); else if ("function" == typeof define && define.amd) define([ "jquery" ], factory); else {
@@ -1945,19 +1945,28 @@
         function prefillYear(dateParts, currentResult, opts) {
             if (dateParts.year !== dateParts.rawyear) {
                 var crrntyear = currentYear.toString(), enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""), currentYearPart = crrntyear.slice(0, enteredPart.length), currentYearNextPart = crrntyear.slice(enteredPart.length);
-                2 === enteredPart.length && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime()) && (dateParts.date.setFullYear(crrntyear), 
-                dateParts.year = crrntyear, currentResult.insert = [ {
-                    pos: currentResult.pos + 1,
-                    c: currentYearNextPart[0]
-                }, {
-                    pos: currentResult.pos + 2,
-                    c: currentYearNextPart[1]
-                } ]);
+                if (2 === enteredPart.length && enteredPart === currentYearPart) {
+                    var entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
+                    dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime()) && (dateParts.date.setFullYear(currentYear), 
+                    dateParts.year = crrntyear, currentResult.insert = [ {
+                        pos: currentResult.pos + 1,
+                        c: currentYearNextPart[0]
+                    }, {
+                        pos: currentResult.pos + 2,
+                        c: currentYearNextPart[1]
+                    } ]);
+                }
             }
             return currentResult;
         }
-        function isValidDate(dateParts, currentResult) {
-            return (!isFinite(dateParts.rawday) || "29" == dateParts.day && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) && currentResult;
+        function isValidDate(dateParts, currentResult, opts) {
+            if (!isFinite(dateParts.rawday) || "29" == dateParts.day && !isFinite(dateParts.rawyear) || new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) return currentResult;
+            if ("29" == dateParts.day) {
+                var tokenMatch = getTokenMatch(currentResult.pos, opts);
+                if ("yyyy" === tokenMatch.targetMatch[0] && currentResult.pos - tokenMatch.targetMatchIndex == 2) return currentResult.remove = currentResult.pos + 1, 
+                currentResult;
+            }
+            return !1;
         }
         function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
             if (!result) return result;
@@ -2123,7 +2132,7 @@
                     }
                     var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
                     return result && dateParts.date.getTime() == dateParts.date.getTime() && (result = prefillYear(dateParts, result, opts), 
-                    result = isValidDate(dateParts, result), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)), 
+                    result = isValidDate(dateParts, result, opts), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)), 
                     pos && result && currentResult.pos !== pos ? {
                         buffer: parse(opts.inputFormat, dateParts, opts).split(""),
                         refreshFromBuffer: {

File diff suppressed because it is too large
+ 2 - 2
dist/jquery.inputmask.min.js


+ 31 - 21
lib/extensions/inputmask.date.extensions.js

@@ -115,37 +115,47 @@ function getTokenizer(opts) {
 }
 
 function prefillYear(dateParts, currentResult, opts) {
-
 	if (dateParts.year !== dateParts.rawyear) {
 		var crrntyear = currentYear.toString(),
 			enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""),
 			currentYearPart = crrntyear.slice(0, enteredPart.length),
 			currentYearNextPart = crrntyear.slice(enteredPart.length);
-		if (enteredPart.length === 2 && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime())) {
-			//update dateParts
-			dateParts.date.setFullYear(crrntyear);
-			dateParts.year = crrntyear;
-			//update result
-			currentResult.insert = [{
-				pos: currentResult.pos + 1,
-				c: currentYearNextPart[0]
-			}, {
-				pos: currentResult.pos + 2,
-				c: currentYearNextPart[1]
-			}];
+		if (enteredPart.length === 2 && enteredPart === currentYearPart) {
+			const entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
+			if (dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime())) {
+				//update dateParts
+				dateParts.date.setFullYear(currentYear);
+				dateParts.year = crrntyear;
+				//update result
+				currentResult.insert = [{
+					pos: currentResult.pos + 1,
+					c: currentYearNextPart[0]
+				}, {
+					pos: currentResult.pos + 2,
+					c: currentYearNextPart[1]
+				}];
+			}
 		}
-
 	}
 
 	return currentResult;
 }
 
-function isValidDate(dateParts, currentResult) {
-	return !isFinite(dateParts.rawday)
-	|| (dateParts.day == "29" && !isFinite(dateParts.rawyear))
-	|| new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day
-		? currentResult
-		: false; //take corrective action if possible
+function isValidDate(dateParts, currentResult, opts) {
+	if (!isFinite(dateParts.rawday)
+		|| (dateParts.day == "29" && !isFinite(dateParts.rawyear))
+		|| new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) {
+		return currentResult;
+	} else { //take corrective action if possible
+		if (dateParts.day == "29") {
+			var tokenMatch = getTokenMatch(currentResult.pos, opts);
+			if (tokenMatch.targetMatch[0] === "yyyy" && currentResult.pos - tokenMatch.targetMatchIndex === 2) {
+				currentResult.remove = currentResult.pos + 1;
+				return currentResult;
+			}
+		}
+		return false;
+	}
 }
 
 function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
@@ -412,7 +422,7 @@ Inputmask.extendAliases({
 			var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
 			if (result && dateParts.date.getTime() === dateParts.date.getTime()) { //check for a valid date ~ an invalid date returns NaN which isn't equal
 				result = prefillYear(dateParts, result, opts);
-				result = isValidDate(dateParts, result);
+				result = isValidDate(dateParts, result, opts);
 				result = isDateInRange(dateParts, result, opts, maskset, fromCheckval);
 			}
 

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "inputmask",
-  "version": "5.0.4-beta.31",
+  "version": "5.0.4-beta.32",
   "description": "Inputmask is a javascript library which creates an input mask.  Inputmask can run against vanilla javascript, jQuery and jqlite.",
   "main": "index.js",
   "files": [

+ 35 - 1
qunit/tests_date.js

@@ -944,4 +944,38 @@ export default function (qunit, Inputmask) {
 
 		assert.equal(testmask.value, "23:59", "Result " + testmask.value);
 	});
-};
+
+	qunit.test("yearfill bug - hoesein - #1966", function (assert) {
+		var $fixture = $("#qunit-fixture");
+		$fixture.append("<input type=\"text\" id=\"testmask\" />");
+		var testmask = document.getElementById("testmask");
+		Inputmask("datetime", {
+			inputFormat : "dd-mm-yyyy",
+			placeholder : "_",
+			clearIncomplete: true,
+			min : "09-09-0999", max : "04-02-2020"
+		}).mask(testmask);
+
+		testmask.focus();
+		$("#testmask").Type("01122019");
+
+		assert.equal(testmask.value, "01-12-2019", "Result " + testmask.value);
+	});
+
+	qunit.test("leapyear bug - #2286", function (assert) {
+		var $fixture = $("#qunit-fixture");
+		$fixture.append("<input type=\"text\" id=\"testmask\" />");
+		var testmask = document.getElementById("testmask");
+		Inputmask("datetime", {
+			"placeholder": "mm/dd/yyyy HH:MM",
+			"inputFormat": "mm/dd/yyyy HH:MM",
+			"min": "01/01/1753 00:00",
+			"max": "03/03/2020 23:59"
+		}).mask(testmask);
+
+		testmask.focus();
+		$("#testmask").Type("02/29/2012 10:25");
+
+		assert.equal(testmask.value, "02/29/2012 10:25", "Result " + testmask.value);
+	});
+}