From 4101b898c0b642bd3f9a050705f7f7629eae2b51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Wa=C5=82ek?= Date: Tue, 1 Dec 2015 18:00:26 +0100 Subject: [PATCH] Core: Adding a way to pass method name to remote Closes #1657. This allows reusing remote as custom method via addMethod --- src/core.js | 18 ++++++++++-------- test/index.html | 3 +++ test/test.js | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 8 deletions(-) diff --git a/src/core.js b/src/core.js index 7787a8e..d0dd27d 100644 --- a/src/core.js +++ b/src/core.js @@ -1029,11 +1029,11 @@ $.extend( $.validator, { } }, - previousValue: function( element ) { + previousValue: function( element, method ) { return $.data( element, "previousValue" ) || $.data( element, "previousValue", { old: null, valid: true, - message: this.defaultMessage( element, { method: "remote" } ) + message: this.defaultMessage( element, { method: method } ) } ); }, @@ -1379,19 +1379,21 @@ $.extend( $.validator, { }, // http://jqueryvalidation.org/remote-method/ - remote: function( value, element, param ) { + remote: function( value, element, param, method ) { if ( this.optional( element ) ) { return "dependency-mismatch"; } - var previous = this.previousValue( element ), + method = typeof method === "string" && method || "remote"; + + var previous = this.previousValue( element, method ), validator, data, optionDataString; if ( !this.settings.messages[ element.name ] ) { this.settings.messages[ element.name ] = {}; } - previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ].remote; - this.settings.messages[ element.name ].remote = previous.message; + previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ]; + this.settings.messages[ element.name ][ method ] = previous.message; param = typeof param === "string" && { url: param } || param; optionDataString = $.param( $.extend( { data: value }, param.data ) ); @@ -1414,7 +1416,7 @@ $.extend( $.validator, { var valid = response === true || response === "true", errors, message, submitted; - validator.settings.messages[ element.name ].remote = previous.originalMessage; + validator.settings.messages[ element.name ][ method ] = previous.originalMessage; if ( valid ) { submitted = validator.formSubmitted; validator.prepareElement( element ); @@ -1424,7 +1426,7 @@ $.extend( $.validator, { validator.showErrors(); } else { errors = {}; - message = response || validator.defaultMessage( element, { method: "remote", parameters: value } ); + message = response || validator.defaultMessage( element, { method: method, parameters: value } ); errors[ element.name ] = previous.message = message; validator.invalid[ element.name ] = true; validator.showErrors( errors ); diff --git a/test/index.html b/test/index.html index 140efa4..06c29bd 100644 --- a/test/index.html +++ b/test/index.html @@ -407,6 +407,9 @@ +
+ +
diff --git a/test/test.js b/test/test.js index a9cf59b..c177c8c 100644 --- a/test/test.js +++ b/test/test.js @@ -61,6 +61,16 @@ $.mockjax( { responseTime: 1 } ); +$.mockjax( { + url: "workemail.php", + response: function( data ) { + this.responseStatus = data.data.special === "somevalue" ? 200 : 400; //Requires special param for request + if ( this.responseStatus === 200 ) { //Only if valid request - processing workemail + this.responseText = JSON.stringify( data.data.email === "john.doe@company.com" ); + } + } +} ); + // Asserts that there is a visible error with the given text for the specified element QUnit.assert.hasError = function( element, text, message ) { var errors = $( element ).closest( "form" ).validate().errorsFor( element[ 0 ] ), @@ -2173,3 +2183,35 @@ test( "#1618: Errorlist containing more errors than it should", function() { inputList.valid(); equal( v.errorList.length, 2, "There should be no change in errorList's content" ); } ); + +asyncTest( "addMethod, reusing remote in custom method", function() { + expect( 7 ); + $.validator.addMethod( "workemail", function( value, element, param ) { + return $.validator.methods.remote.call( this, value, element, { + url: "workemail.php", + data: { email: value, special: param } + }, "workemail" ); + }, "work email custom message" ); + + var e = $( "#add-method-username" ), + v = $( "#add-method-remote" ).validate(); + + $( document ).ajaxStop( function() { + $( document ).unbind( "ajaxStop" ); + strictEqual( v.size(), 1, "There must be one error" ); + strictEqual( v.errorList[ 0 ].message, "work email custom message", "john.doe@gmail.com is not work email" ); + + $( document ).ajaxStop( function() { + $( document ).unbind( "ajaxStop" ); + strictEqual( v.size(), 0, "There must be no errors" ); + ok( v.element( e ), "john.doe@company.com is work email ;)" ); + start(); + } ); + e.val( "john.doe@company.com" ); + strictEqual( v.element( e ), true, "new value, new request; dependency-mismatch considered as valid though" ); + } ); + strictEqual( v.element( e ), false, "invalid element, nothing entered yet" ); + e.val( "john.doe@gmail.com" ); + strictEqual( v.element( e ), true, "still invalid, because remote validation must block until it returns; dependency-mismatch considered as valid though" ); +} ); +