From a994acb8444aafab2d368951b4643bc3ae05a83c Mon Sep 17 00:00:00 2001 From: Ronan Giron Date: Thu, 14 Dec 2017 14:38:45 +0100 Subject: [PATCH 1/3] Fix 'step', 'min' & 'max' controls on date/time inputs --- src/core.js | 125 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 106 insertions(+), 19 deletions(-) diff --git a/src/core.js b/src/core.js index f2d986118..e1366bc25 100644 --- a/src/core.js +++ b/src/core.js @@ -1044,6 +1044,28 @@ $.extend( $.validator, { } return value.length; }, + + getDateValue: function( value, type ) { + switch (type) { + case 'date': + value = (new Date(value)).getDate(); + break; + case 'datetime': + case 'datetime-local': + value = (new Date(value)).getTime() / 1000; + break; + case 'month': + value = (new Date(value + '-01')).getMonth() + 1; + break; + case 'time': + value = (new Date('2020-01-01 ' + value)).getTime() / 1000; + break; + default: + value = false; + } + + return value; + }, depend: function( param, element ) { return this.dependTypes[ typeof param ] ? this.dependTypes[ typeof param ]( param, element ) : true; @@ -1424,12 +1446,70 @@ $.extend( $.validator, { // https://jqueryvalidation.org/min-method/ min: function( value, element, param ) { - return this.optional( element ) || value >= param; + var valid = true, + type = $( element ).attr( "type" ); + + switch (type) { + case 'week': + var re = new RegExp("^([0-9]{4})-W([0-9]+)$"); + var mVal = re.exec(value), + mParam = re.exec(value); + + valid = false; + + if (mVal !== null && mParam !== null) { + if (mVal[1] > mParam[1] || (mVal[1] >= mParam[1] && parseInt(mVal[2]) >= parseInt(mParam[2]))) { + valid = true; + } + } + break; + case 'datetime': + case 'datetime-local': + case 'date': + case 'month': + case 'time': + value = this.getDateValue(value, type); + default: + if (value !== false) { + valid = value >= param; + } + } + + return this.optional( element ) || valid; }, // https://jqueryvalidation.org/max-method/ max: function( value, element, param ) { - return this.optional( element ) || value <= param; + var valid = true, + type = $( element ).attr( "type" ); + + switch (type) { + case 'week': + var re = new RegExp("^([0-9]{4})-W([0-9]+)$"); + var mVal = re.exec(value), + mParam = re.exec(value); + + valid = false; + + if (mVal !== null && mParam !== null) { + if (mVal[1] < mParam[1] || (mVal[1] <= mParam[1] && parseInt(mVal[2]) <= parseInt(mParam[2]))) { + valid = true; + } + } + break; + case 'datetime': + case 'datetime-local': + case 'date': + case 'month': + case 'time': + value = this.getDateValue(value, type); + default: + if (value !== false) { + valid = value <= param; + } + } + + return this.optional( element ) || valid; }, // https://jqueryvalidation.org/range-method/ @@ -1440,10 +1520,6 @@ $.extend( $.validator, { // https://jqueryvalidation.org/step-method/ step: function( value, element, param ) { var type = $( element ).attr( "type" ), - errorMessage = "Step attribute on input type " + type + " is not supported.", - supportedTypes = [ "text", "number", "range" ], - re = new RegExp( "\\b" + type + "\\b" ), - notSupported = type && !re.test( supportedTypes.join() ), decimalPlaces = function( num ) { var match = ( "" + num ).match( /(?:\.(\d+))?$/ ); if ( !match ) { @@ -1457,19 +1533,30 @@ $.extend( $.validator, { return Math.round( num * Math.pow( 10, decimals ) ); }, valid = true, - decimals; - - // Works only for text, number and range input types - // TODO find a way to support input types date, datetime, datetime-local, month, time and week - if ( notSupported ) { - throw new Error( errorMessage ); - } - - decimals = decimalPlaces( param ); - - // Value can't have too many decimals - if ( decimalPlaces( value ) > decimals || toInt( value ) % toInt( param ) !== 0 ) { - valid = false; + decimals = 0; + + if (param !== 'any') { + decimals = decimalPlaces(param); + + switch (type) { + case 'week': + var re = new RegExp("^[0-9]{4}-W([0-9]+)$"); + var m = re.exec(value); + + valid = m !== null && toInt(m[1]) % toInt(param) !== 0; + break; + case 'datetime': + case 'datetime-local': + case 'date': + case 'month': + case 'time': + if ((value = this.getDateValue(value, type)) !== false) { + valid = !(toInt(value) % toInt(param) !== 0); + } + break; + default: + valid = !(decimalPlaces(value) > decimals || toInt(value) % toInt(param) !== 0); + } } return this.optional( element ) || valid; From 178257b63c1457e83f160fa50373bde9767fec6e Mon Sep 17 00:00:00 2001 From: Ronan Giron Date: Fri, 15 Dec 2017 01:23:05 +0100 Subject: [PATCH 2/3] Fix min and max controls --- src/core.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index e1366bc25..88224f787 100644 --- a/src/core.js +++ b/src/core.js @@ -1469,9 +1469,12 @@ $.extend( $.validator, { case 'month': case 'time': value = this.getDateValue(value, type); + param = this.getDateValue(param, type); default: - if (value !== false) { + if (value !== false && param !== false) { valid = value >= param; + } else { + valid = false; } } @@ -1503,9 +1506,12 @@ $.extend( $.validator, { case 'month': case 'time': value = this.getDateValue(value, type); + param = this.getDateValue(param, type); default: - if (value !== false) { + if (value !== false && param !== false) { valid = value <= param; + } else { + valid = false; } } From e7406d0fe1f9774b5bb1fe1ee583078ab42bc152 Mon Sep 17 00:00:00 2001 From: Ronan Giron Date: Fri, 15 Mar 2024 09:40:07 +0100 Subject: [PATCH 3/3] Fix control on input type "date" --- src/core.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core.js b/src/core.js index 88224f787..10ce6c923 100644 --- a/src/core.js +++ b/src/core.js @@ -1048,8 +1048,7 @@ $.extend( $.validator, { getDateValue: function( value, type ) { switch (type) { case 'date': - value = (new Date(value)).getDate(); - break; + value = value + ' 00:00:00'; case 'datetime': case 'datetime-local': value = (new Date(value)).getTime() / 1000;