Skip to content

Commit 79ffcd6

Browse files
committed
Fixed issue limcheekin#2. Pending for testing.
1 parent b56f689 commit 79ffcd6

File tree

4 files changed

+68
-44
lines changed

4 files changed

+68
-44
lines changed

JqueryValidationUiGrailsPlugin.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
*/
2222
class JqueryValidationUiGrailsPlugin {
2323
// the plugin version
24-
def version = "1.1"
24+
def version = "1.1.1"
2525
// the version or versions of Grails the plugin is designed for
2626
def grailsVersion = "1.2.2 > *"
2727
// the other plugins this plugin depends on

grails-app/controllers/org/grails/jquery/validation/ui/JQueryRemoteValidatorController.groovy

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ class JQueryRemoteValidatorController {
3737
constrainedProperty.validate(validatableInstance, params[params.property], errors)
3838
response.setContentType("text/json;charset=UTF-8")
3939
if (errors.getFieldError(params.property)) {
40-
render message(error: errors.getFieldError(params.property))
40+
// if constraint is known then render false (use default message),
41+
// otherwise render custom message.
42+
render params.constraint ? "false" : """{"message":"${message(error: errors.getFieldError(params.property))}"}"""
4143
} else {
4244
render "true"
4345
}

grails-app/taglib/org/grails/jquery/validation/ui/JQueryValidationUiTagLib.groovy

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,9 @@ class JQueryValidationUiTagLib {
4141
inList: "default.not.inlist.message",
4242
blank: "default.blank.message",
4343
notEqual: "default.not.equal.message",
44-
nullable: "default.null.message"
45-
]
46-
static final CONSTRAINTS_NOT_SUPPORTED_BY_MESSAGE = [
47-
"unique",
48-
"validator"
44+
nullable: "default.null.message",
45+
validator: "default.invalid.validator.message",
46+
unique: "default.not.unique.message"
4947
]
5048

5149
static final ERROR_CODE_SUFFIXES = [
@@ -451,7 +449,7 @@ rules: {
451449
namespacedPropertyName = constrainedPropertiesEntry.namespace?"'${constrainedPropertiesEntry.namespace}.${constrainedProperty.propertyName}'":constrainedProperty.propertyName
452450
constraintsMap = getConstraintsMap(constrainedProperty.propertyType)
453451
javaScriptMessages += "${namespacedPropertyName}: {\n"
454-
constraintNames = getConstraintNames(constrainedProperty).findAll { !CONSTRAINTS_NOT_SUPPORTED_BY_MESSAGE.contains(it) }
452+
constraintNames = getConstraintNames(constrainedProperty)
455453
javaScriptMessageCode = null
456454
switch (constrainedProperty.propertyType) {
457455
case Date:
@@ -519,6 +517,12 @@ rules: {
519517
args << range.to
520518
javaScriptMessageCode = "\t${javaScriptConstraint}: function() { return '${getMessage(constrainedPropertiesEntry.validatableClass, constrainedProperty.propertyName, args, constraintName)}'; }"
521519
break
520+
521+
case "unique":
522+
case "validator":
523+
args << "' + \$('#${constrainedProperty.propertyName}').val() + '"
524+
javaScriptMessageCode = "\t${javaScriptConstraint}: function() { return '${getMessage(constrainedPropertiesEntry.validatableClass, constrainedProperty.propertyName, args, constraintName)}'; }"
525+
break
522526
}
523527
} else {
524528
def customConstraintsMap = grailsApplication.config.jqueryValidationUi.CustomConstraintsMap

web-app/js/jquery-validation-ui/grails-validation-methods.js

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -49,53 +49,71 @@ jQuery.validator.addMethod("rangeDate", function(value, element, params) {
4949
return this.optional(element) || dateValue >= params[0] && dateValue <= params[1];
5050
}, jQuery.validator.format('The date must be between {0} and {1}.'));
5151

52-
//http://stackoverflow.com/questions/976384/jquery-validator-addmethod-custom-message
5352
jQuery.validator.addMethod("unique", function(value, element, params) {
54-
var validator = this;
55-
params.data[element.name] = value;
56-
params.data['constraint'] = 'unique';
57-
$.post(params.url, params.data, function(response) {
58-
if (response == 'true'){ return true; }
59-
else {
60-
var errors = {};
61-
errors[element.name] = response;
62-
validator.showErrors(errors);
63-
return false;
64-
}
65-
}, 'text');
53+
return JQueryValidatorUI.remote(this, "unique", value, element, params);
6654
}, '');
6755

6856
jQuery.validator.addMethod("validator", function(value, element, params) {
69-
var validator = this;
70-
params.data[element.name] = value;
71-
params.data['constraint'] = 'validator';
72-
$.post(params.url, params.data, function(response) {
73-
if (response == 'true'){ return true; }
74-
else {
75-
var errors = {};
76-
errors[element.name] = response;
77-
validator.showErrors(errors);
78-
return false;
79-
}
80-
}, 'text');
57+
return JQueryValidatorUI.remote(this, "validator", value, element, params);
8158
}, '');
8259

8360
jQuery.validator.addMethod("custom", function(value, element, params) {
84-
var validator = this;
85-
params.data[element.name] = value;
86-
$.post(params.url, params.data, function(response) {
87-
if (response == 'true'){ return true; }
88-
else {
89-
var errors = {};
90-
errors[element.name] = response;
91-
validator.showErrors(errors);
92-
return false;
93-
}
94-
}, 'text');
61+
return JQueryValidatorUI.remote(this, null, value, element, params); // unknown constraint
9562
}, '');
9663

9764
// http://www.24hourapps.com/2009/02/jquery-international-phone-number.html
9865
jQuery.validator.addMethod("phone", function(value, element, params) {
9966
return this.optional(element) || value.match(/^((\+)?[1-9]{1,2})?([-\s\.])?((\(\d{1,4}\))|\d{1,4})(([-\s\.])?[0-9]{1,12}){1,2}$/);
10067
}, 'Invalid international phone number.');
68+
69+
// amended from existing remote method
70+
JQueryValidatorUI = {
71+
remote: function(validator, constraint, value, element, params) {
72+
if ( validator.optional(element) )
73+
return "dependency-mismatch";
74+
75+
var previous = validator.previousValue(element);
76+
if (!validator.settings.messages[element.name] )
77+
validator.settings.messages[element.name] = {};
78+
previous.originalMessage = validator.settings.messages[element.name].remote;
79+
validator.settings.messages[element.name].remote = previous.message;
80+
81+
if ( previous.old !== value ) {
82+
previous.old = value;
83+
validator.startRequest(element);
84+
params.data[element.name] = value;
85+
if (constraint)
86+
params.data['constraint'] = constraint;
87+
$.ajax($.extend(true, {
88+
url: params.url,
89+
mode: "abort",
90+
port: "validate" + element.name,
91+
dataType: "json",
92+
data: params.data,
93+
success: function(response) {
94+
validator.settings.messages[element.name].remote = previous.originalMessage;
95+
var valid = response === true;
96+
if ( valid ) {
97+
var submitted = validator.formSubmitted;
98+
validator.prepareElement(element);
99+
validator.formSubmitted = submitted;
100+
validator.successList.push(element);
101+
validator.showErrors();
102+
} else {
103+
var errors = {};
104+
var message = (previous.message = response.message || validator.defaultMessage( element, constraint ));
105+
errors[element.name] = $.isFunction(message) ? message(value) : message;
106+
validator.showErrors(errors);
107+
}
108+
previous.valid = valid;
109+
validator.stopRequest(element, valid);
110+
}
111+
}, params.url));
112+
return "pending";
113+
} else if( validator.pending[element.name] ) {
114+
return "pending";
115+
}
116+
return previous.valid;
117+
}
118+
};
101119

0 commit comments

Comments
 (0)