Skip to content

Commit 4101b89

Browse files
wojwalstaabm
authored andcommitted
Core: Adding a way to pass method name to remote
Closes jquery-validation#1657. This allows reusing remote as custom method via addMethod
1 parent a648fb7 commit 4101b89

File tree

3 files changed

+55
-8
lines changed

3 files changed

+55
-8
lines changed

src/core.js

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,11 +1029,11 @@ $.extend( $.validator, {
10291029
}
10301030
},
10311031

1032-
previousValue: function( element ) {
1032+
previousValue: function( element, method ) {
10331033
return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
10341034
old: null,
10351035
valid: true,
1036-
message: this.defaultMessage( element, { method: "remote" } )
1036+
message: this.defaultMessage( element, { method: method } )
10371037
} );
10381038
},
10391039

@@ -1379,19 +1379,21 @@ $.extend( $.validator, {
13791379
},
13801380

13811381
// http://jqueryvalidation.org/remote-method/
1382-
remote: function( value, element, param ) {
1382+
remote: function( value, element, param, method ) {
13831383
if ( this.optional( element ) ) {
13841384
return "dependency-mismatch";
13851385
}
13861386

1387-
var previous = this.previousValue( element ),
1387+
method = typeof method === "string" && method || "remote";
1388+
1389+
var previous = this.previousValue( element, method ),
13881390
validator, data, optionDataString;
13891391

13901392
if ( !this.settings.messages[ element.name ] ) {
13911393
this.settings.messages[ element.name ] = {};
13921394
}
1393-
previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ].remote;
1394-
this.settings.messages[ element.name ].remote = previous.message;
1395+
previous.originalMessage = previous.originalMessage || this.settings.messages[ element.name ][ method ];
1396+
this.settings.messages[ element.name ][ method ] = previous.message;
13951397

13961398
param = typeof param === "string" && { url: param } || param;
13971399
optionDataString = $.param( $.extend( { data: value }, param.data ) );
@@ -1414,7 +1416,7 @@ $.extend( $.validator, {
14141416
var valid = response === true || response === "true",
14151417
errors, message, submitted;
14161418

1417-
validator.settings.messages[ element.name ].remote = previous.originalMessage;
1419+
validator.settings.messages[ element.name ][ method ] = previous.originalMessage;
14181420
if ( valid ) {
14191421
submitted = validator.formSubmitted;
14201422
validator.prepareElement( element );
@@ -1424,7 +1426,7 @@ $.extend( $.validator, {
14241426
validator.showErrors();
14251427
} else {
14261428
errors = {};
1427-
message = response || validator.defaultMessage( element, { method: "remote", parameters: value } );
1429+
message = response || validator.defaultMessage( element, { method: method, parameters: value } );
14281430
errors[ element.name ] = previous.message = message;
14291431
validator.invalid[ element.name ] = true;
14301432
validator.showErrors( errors );

test/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,9 @@ <h3></h3>
407407
<input id="val2" type="text" name="val2" value="" />
408408
<input id="val3" type="text" name="val3" value="" />
409409
</form>
410+
<form id="add-method-remote">
411+
<input id="add-method-username" type="text" name="username" value="" data-rule-workemail="somevalue" required />
412+
</form>
410413
</div>
411414
</body>
412415
</html>

test/test.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ $.mockjax( {
6161
responseTime: 1
6262
} );
6363

64+
$.mockjax( {
65+
url: "workemail.php",
66+
response: function( data ) {
67+
this.responseStatus = data.data.special === "somevalue" ? 200 : 400; //Requires special param for request
68+
if ( this.responseStatus === 200 ) { //Only if valid request - processing workemail
69+
this.responseText = JSON.stringify( data.data.email === "john.doe@company.com" );
70+
}
71+
}
72+
} );
73+
6474
// Asserts that there is a visible error with the given text for the specified element
6575
QUnit.assert.hasError = function( element, text, message ) {
6676
var errors = $( element ).closest( "form" ).validate().errorsFor( element[ 0 ] ),
@@ -2173,3 +2183,35 @@ test( "#1618: Errorlist containing more errors than it should", function() {
21732183
inputList.valid();
21742184
equal( v.errorList.length, 2, "There should be no change in errorList's content" );
21752185
} );
2186+
2187+
asyncTest( "addMethod, reusing remote in custom method", function() {
2188+
expect( 7 );
2189+
$.validator.addMethod( "workemail", function( value, element, param ) {
2190+
return $.validator.methods.remote.call( this, value, element, {
2191+
url: "workemail.php",
2192+
data: { email: value, special: param }
2193+
}, "workemail" );
2194+
}, "work email custom message" );
2195+
2196+
var e = $( "#add-method-username" ),
2197+
v = $( "#add-method-remote" ).validate();
2198+
2199+
$( document ).ajaxStop( function() {
2200+
$( document ).unbind( "ajaxStop" );
2201+
strictEqual( v.size(), 1, "There must be one error" );
2202+
strictEqual( v.errorList[ 0 ].message, "work email custom message", "john.doe@gmail.com is not work email" );
2203+
2204+
$( document ).ajaxStop( function() {
2205+
$( document ).unbind( "ajaxStop" );
2206+
strictEqual( v.size(), 0, "There must be no errors" );
2207+
ok( v.element( e ), "john.doe@company.com is work email ;)" );
2208+
start();
2209+
} );
2210+
e.val( "john.doe@company.com" );
2211+
strictEqual( v.element( e ), true, "new value, new request; dependency-mismatch considered as valid though" );
2212+
} );
2213+
strictEqual( v.element( e ), false, "invalid element, nothing entered yet" );
2214+
e.val( "john.doe@gmail.com" );
2215+
strictEqual( v.element( e ), true, "still invalid, because remote validation must block until it returns; dependency-mismatch considered as valid though" );
2216+
} );
2217+

0 commit comments

Comments
 (0)