Core: move message processing from formatAndAdd to defaultMessage

Fixes #741. Closes #1644.
This commit is contained in:
Brahim Arkni
2015-11-12 00:40:43 +00:00
committed by Markus Staab
parent 43ffa81180
commit a3cc0c0a70
3 changed files with 37 additions and 17 deletions

View File

@@ -215,6 +215,9 @@ $.validator.format = function( source, params ) {
return $.validator.format.apply( this, args );
};
}
if ( params === undefined ) {
return source;
}
if ( arguments.length > 2 && params.constructor !== Array ) {
params = $.makeArray( arguments ).slice( 1 );
}
@@ -767,26 +770,29 @@ $.extend( $.validator, {
return undefined;
},
defaultMessage: function( element, method ) {
return this.findDefined(
this.customMessage( element.name, method ),
this.customDataMessage( element, method ),
defaultMessage: function( element, rule ) {
var message = this.findDefined(
this.customMessage( element.name, rule.method ),
this.customDataMessage( element, rule.method ),
// 'title' is never undefined, so handle empty string as undefined
!this.settings.ignoreTitle && element.title || undefined,
$.validator.messages[ method ],
"<strong>Warning: No message defined for " + element.name + "</strong>"
);
},
formatAndAdd: function( element, rule ) {
var message = this.defaultMessage( element, rule.method ),
// 'title' is never undefined, so handle empty string as undefined
!this.settings.ignoreTitle && element.title || undefined,
$.validator.messages[ rule.method ],
"<strong>Warning: No message defined for " + element.name + "</strong>"
),
theregex = /\$?\{(\d+)\}/g;
if ( typeof message === "function" ) {
message = message.call( this, rule.parameters, element );
} else if ( theregex.test( message ) ) {
message = $.validator.format( message.replace( theregex, "{$1}" ), rule.parameters );
}
return message;
},
formatAndAdd: function( element, rule ) {
var message = this.defaultMessage( element, rule );
this.errorList.push( {
message: message,
element: element,
@@ -1032,7 +1038,7 @@ $.extend( $.validator, {
return $.data( element, "previousValue" ) || $.data( element, "previousValue", {
old: null,
valid: true,
message: this.defaultMessage( element, "remote" )
message: this.defaultMessage( element, { method: "remote" } )
} );
},
@@ -1421,8 +1427,8 @@ $.extend( $.validator, {
validator.showErrors();
} else {
errors = {};
message = response || validator.defaultMessage( element, "remote" );
errors[ element.name ] = previous.message = $.isFunction( message ) ? message( value ) : message;
message = response || validator.defaultMessage( element, { method: "remote", parameters: value } );
errors[ element.name ] = previous.message = message;
validator.invalid[ element.name ] = true;
validator.showErrors( errors );
}

View File

@@ -387,6 +387,10 @@
<label for="testForm21!#$%&'()*+,./:;<=>?@[\]^`{|}~">Input text</label>
<input type="text" name="testForm21!#$%&'()*+,./:;<=>?@[\]^`{|}~" id="testForm21!#$%&'()*+,./:;<=>?@[\]^`{|}~" required minlength="15">
</form>
<form id="testForm22">
<label for="tF22Input">Input text</label>
<input type="text" name="tF22Input" id="tF22Input" required minlength="5" data-msg-minlength="You should enter at least {0} characters.">
</form>
<form id="contenteditableForm">
<div contenteditable id="contenteditableNumberInvalid" data-rule-number="true" name="field1">ABC</div>
<div contenteditable id="contenteditableNumberValid" data-rule-number="true" name="field2">123</div>

View File

@@ -637,7 +637,17 @@ test( "option: errorClass with multiple classes", function() {
test( "defaultMessage(), empty title is ignored", function() {
var v = $( "#userForm" ).validate();
equal( v.defaultMessage( $( "#username" )[ 0 ], "required" ), "This field is required." );
equal( v.defaultMessage( $( "#username" )[ 0 ], { method: "required", parameters: true } ), "This field is required." );
} );
test( "#741: move message processing from formatAndAdd to defaultMessage", function() {
var v = $( "#testForm22" ).validate();
equal( v.defaultMessage( $( "#tF22Input" )[ 0 ], { method: "minlength", parameters: 5 } ),
"You should enter at least 5 characters.", "defaultMessage() now format the messages" );
$( "#tF22Input" ).val( "abc" );
v.form();
equal( v.errorList[ 0 ].message, "You should enter at least 5 characters." );
} );
test( "formatAndAdd", function() {