Skip to content

Commit c9a44e0

Browse files
committed
Datetime alias 29/02/a valid year does not always allows fix RobinHerbots#2286
1 parent d38cc2a commit c9a44e0

10 files changed

+116
-53
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- \<input-mask> enhance attribute handling
1212

1313
### Fixed
14+
- Datetime alias 29/02/a valid year does not always allows #2286
1415
- 'input-mask' has already been defined as a custom element #2285
1516
- Using min with alias integer not working correctly because of postValidation #2284
1617
- fix double events when using jQuery.clone function

Diff for: bower.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "inputmask",
3-
"version": "5.0.4-beta.31",
3+
"version": "5.0.4-beta.32",
44
"main": [
55
"./index.js",
66
"./css/inputmask.css"

Diff for: composer.json

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

Diff for: dist/inputmask.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* https://github.com/RobinHerbots/Inputmask
44
* Copyright (c) 2010 - 2020 Robin Herbots
55
* Licensed under the MIT license
6-
* Version: 5.0.4-beta.31
6+
* Version: 5.0.4-beta.32
77
*/
88
!function webpackUniversalModuleDefinition(root, factory) {
99
if ("object" == typeof exports && "object" == typeof module) module.exports = factory(); else if ("function" == typeof define && define.amd) define([], factory); else {
@@ -2070,19 +2070,28 @@
20702070
function prefillYear(dateParts, currentResult, opts) {
20712071
if (dateParts.year !== dateParts.rawyear) {
20722072
var crrntyear = currentYear.toString(), enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""), currentYearPart = crrntyear.slice(0, enteredPart.length), currentYearNextPart = crrntyear.slice(enteredPart.length);
2073-
2 === enteredPart.length && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime()) && (dateParts.date.setFullYear(crrntyear),
2074-
dateParts.year = crrntyear, currentResult.insert = [ {
2075-
pos: currentResult.pos + 1,
2076-
c: currentYearNextPart[0]
2077-
}, {
2078-
pos: currentResult.pos + 2,
2079-
c: currentYearNextPart[1]
2080-
} ]);
2073+
if (2 === enteredPart.length && enteredPart === currentYearPart) {
2074+
var entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
2075+
dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime()) && (dateParts.date.setFullYear(currentYear),
2076+
dateParts.year = crrntyear, currentResult.insert = [ {
2077+
pos: currentResult.pos + 1,
2078+
c: currentYearNextPart[0]
2079+
}, {
2080+
pos: currentResult.pos + 2,
2081+
c: currentYearNextPart[1]
2082+
} ]);
2083+
}
20812084
}
20822085
return currentResult;
20832086
}
2084-
function isValidDate(dateParts, currentResult) {
2085-
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;
2087+
function isValidDate(dateParts, currentResult, opts) {
2088+
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;
2089+
if ("29" == dateParts.day) {
2090+
var tokenMatch = getTokenMatch(currentResult.pos, opts);
2091+
if ("yyyy" === tokenMatch.targetMatch[0] && currentResult.pos - tokenMatch.targetMatchIndex == 2) return currentResult.remove = currentResult.pos + 1,
2092+
currentResult;
2093+
}
2094+
return !1;
20862095
}
20872096
function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
20882097
if (!result) return result;
@@ -2248,7 +2257,7 @@
22482257
}
22492258
var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
22502259
return result && dateParts.date.getTime() == dateParts.date.getTime() && (result = prefillYear(dateParts, result, opts),
2251-
result = isValidDate(dateParts, result), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)),
2260+
result = isValidDate(dateParts, result, opts), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)),
22522261
pos && result && currentResult.pos !== pos ? {
22532262
buffer: parse(opts.inputFormat, dateParts, opts).split(""),
22542263
refreshFromBuffer: {

Diff for: dist/inputmask.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: dist/jquery.inputmask.js

+21-12
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* https://github.com/RobinHerbots/Inputmask
44
* Copyright (c) 2010 - 2020 Robin Herbots
55
* Licensed under the MIT license
6-
* Version: 5.0.4-beta.31
6+
* Version: 5.0.4-beta.32
77
*/
88
!function webpackUniversalModuleDefinition(root, factory) {
99
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 @@
19451945
function prefillYear(dateParts, currentResult, opts) {
19461946
if (dateParts.year !== dateParts.rawyear) {
19471947
var crrntyear = currentYear.toString(), enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""), currentYearPart = crrntyear.slice(0, enteredPart.length), currentYearNextPart = crrntyear.slice(enteredPart.length);
1948-
2 === enteredPart.length && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime()) && (dateParts.date.setFullYear(crrntyear),
1949-
dateParts.year = crrntyear, currentResult.insert = [ {
1950-
pos: currentResult.pos + 1,
1951-
c: currentYearNextPart[0]
1952-
}, {
1953-
pos: currentResult.pos + 2,
1954-
c: currentYearNextPart[1]
1955-
} ]);
1948+
if (2 === enteredPart.length && enteredPart === currentYearPart) {
1949+
var entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
1950+
dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime()) && (dateParts.date.setFullYear(currentYear),
1951+
dateParts.year = crrntyear, currentResult.insert = [ {
1952+
pos: currentResult.pos + 1,
1953+
c: currentYearNextPart[0]
1954+
}, {
1955+
pos: currentResult.pos + 2,
1956+
c: currentYearNextPart[1]
1957+
} ]);
1958+
}
19561959
}
19571960
return currentResult;
19581961
}
1959-
function isValidDate(dateParts, currentResult) {
1960-
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;
1962+
function isValidDate(dateParts, currentResult, opts) {
1963+
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;
1964+
if ("29" == dateParts.day) {
1965+
var tokenMatch = getTokenMatch(currentResult.pos, opts);
1966+
if ("yyyy" === tokenMatch.targetMatch[0] && currentResult.pos - tokenMatch.targetMatchIndex == 2) return currentResult.remove = currentResult.pos + 1,
1967+
currentResult;
1968+
}
1969+
return !1;
19611970
}
19621971
function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
19631972
if (!result) return result;
@@ -2123,7 +2132,7 @@
21232132
}
21242133
var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
21252134
return result && dateParts.date.getTime() == dateParts.date.getTime() && (result = prefillYear(dateParts, result, opts),
2126-
result = isValidDate(dateParts, result), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)),
2135+
result = isValidDate(dateParts, result, opts), result = isDateInRange(dateParts, result, opts, maskset, fromCheckval)),
21272136
pos && result && currentResult.pos !== pos ? {
21282137
buffer: parse(opts.inputFormat, dateParts, opts).split(""),
21292138
refreshFromBuffer: {

Diff for: dist/jquery.inputmask.min.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: lib/extensions/inputmask.date.extensions.js

+31-21
Original file line numberDiff line numberDiff line change
@@ -115,37 +115,47 @@ function getTokenizer(opts) {
115115
}
116116

117117
function prefillYear(dateParts, currentResult, opts) {
118-
119118
if (dateParts.year !== dateParts.rawyear) {
120119
var crrntyear = currentYear.toString(),
121120
enteredPart = dateParts.rawyear.replace(/[^0-9]/g, ""),
122121
currentYearPart = crrntyear.slice(0, enteredPart.length),
123122
currentYearNextPart = crrntyear.slice(enteredPart.length);
124-
if (enteredPart.length === 2 && enteredPart === currentYearPart && (!opts.max || opts.max.date.getTime() >= new Date(crrntyear, dateParts.month - 1, dateParts.day).getTime())) {
125-
//update dateParts
126-
dateParts.date.setFullYear(crrntyear);
127-
dateParts.year = crrntyear;
128-
//update result
129-
currentResult.insert = [{
130-
pos: currentResult.pos + 1,
131-
c: currentYearNextPart[0]
132-
}, {
133-
pos: currentResult.pos + 2,
134-
c: currentYearNextPart[1]
135-
}];
123+
if (enteredPart.length === 2 && enteredPart === currentYearPart) {
124+
const entryCurrentYear = new Date(currentYear, dateParts.month - 1, dateParts.day);
125+
if (dateParts.day === entryCurrentYear.getDay() && (!opts.max || opts.max.date.getTime() >= entryCurrentYear.getTime())) {
126+
//update dateParts
127+
dateParts.date.setFullYear(currentYear);
128+
dateParts.year = crrntyear;
129+
//update result
130+
currentResult.insert = [{
131+
pos: currentResult.pos + 1,
132+
c: currentYearNextPart[0]
133+
}, {
134+
pos: currentResult.pos + 2,
135+
c: currentYearNextPart[1]
136+
}];
137+
}
136138
}
137-
138139
}
139140

140141
return currentResult;
141142
}
142143

143-
function isValidDate(dateParts, currentResult) {
144-
return !isFinite(dateParts.rawday)
145-
|| (dateParts.day == "29" && !isFinite(dateParts.rawyear))
146-
|| new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day
147-
? currentResult
148-
: false; //take corrective action if possible
144+
function isValidDate(dateParts, currentResult, opts) {
145+
if (!isFinite(dateParts.rawday)
146+
|| (dateParts.day == "29" && !isFinite(dateParts.rawyear))
147+
|| new Date(dateParts.date.getFullYear(), isFinite(dateParts.rawmonth) ? dateParts.month : dateParts.date.getMonth() + 1, 0).getDate() >= dateParts.day) {
148+
return currentResult;
149+
} else { //take corrective action if possible
150+
if (dateParts.day == "29") {
151+
var tokenMatch = getTokenMatch(currentResult.pos, opts);
152+
if (tokenMatch.targetMatch[0] === "yyyy" && currentResult.pos - tokenMatch.targetMatchIndex === 2) {
153+
currentResult.remove = currentResult.pos + 1;
154+
return currentResult;
155+
}
156+
}
157+
return false;
158+
}
149159
}
150160

151161
function isDateInRange(dateParts, result, opts, maskset, fromCheckval) {
@@ -412,7 +422,7 @@ Inputmask.extendAliases({
412422
var result = currentResult, dateParts = analyseMask(buffer.join(""), opts.inputFormat, opts);
413423
if (result && dateParts.date.getTime() === dateParts.date.getTime()) { //check for a valid date ~ an invalid date returns NaN which isn't equal
414424
result = prefillYear(dateParts, result, opts);
415-
result = isValidDate(dateParts, result);
425+
result = isValidDate(dateParts, result, opts);
416426
result = isDateInRange(dateParts, result, opts, maskset, fromCheckval);
417427
}
418428

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "inputmask",
3-
"version": "5.0.4-beta.31",
3+
"version": "5.0.4-beta.32",
44
"description": "Inputmask is a javascript library which creates an input mask. Inputmask can run against vanilla javascript, jQuery and jqlite.",
55
"main": "index.js",
66
"files": [

Diff for: qunit/tests_date.js

+35-1
Original file line numberDiff line numberDiff line change
@@ -944,4 +944,38 @@ export default function (qunit, Inputmask) {
944944

945945
assert.equal(testmask.value, "23:59", "Result " + testmask.value);
946946
});
947-
};
947+
948+
qunit.test("yearfill bug - hoesein - #1966", function (assert) {
949+
var $fixture = $("#qunit-fixture");
950+
$fixture.append("<input type=\"text\" id=\"testmask\" />");
951+
var testmask = document.getElementById("testmask");
952+
Inputmask("datetime", {
953+
inputFormat : "dd-mm-yyyy",
954+
placeholder : "_",
955+
clearIncomplete: true,
956+
min : "09-09-0999", max : "04-02-2020"
957+
}).mask(testmask);
958+
959+
testmask.focus();
960+
$("#testmask").Type("01122019");
961+
962+
assert.equal(testmask.value, "01-12-2019", "Result " + testmask.value);
963+
});
964+
965+
qunit.test("leapyear bug - #2286", function (assert) {
966+
var $fixture = $("#qunit-fixture");
967+
$fixture.append("<input type=\"text\" id=\"testmask\" />");
968+
var testmask = document.getElementById("testmask");
969+
Inputmask("datetime", {
970+
"placeholder": "mm/dd/yyyy HH:MM",
971+
"inputFormat": "mm/dd/yyyy HH:MM",
972+
"min": "01/01/1753 00:00",
973+
"max": "03/03/2020 23:59"
974+
}).mask(testmask);
975+
976+
testmask.focus();
977+
$("#testmask").Type("02/29/2012 10:25");
978+
979+
assert.equal(testmask.value, "02/29/2012 10:25", "Result " + testmask.value);
980+
});
981+
}

0 commit comments

Comments
 (0)