Skip to content

Commit 8871974

Browse files
committed
netteForms.js: validator 'float' converts value to float, 'url' prepends 'http://' [Closes nette/nette#1430][Closes nette/nette#1462]
1 parent 5c47a9e commit 8871974

File tree

2 files changed

+33
-22
lines changed

2 files changed

+33
-22
lines changed

src/assets/netteForms.js

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -101,9 +101,10 @@ Nette.getEffectiveValue = function(elem) {
101101
/**
102102
* Validates form element against given rules.
103103
*/
104-
Nette.validateControl = function(elem, rules, onlyCheck) {
104+
Nette.validateControl = function(elem, rules, onlyCheck, value) {
105105
elem = elem.tagName ? elem : elem[0]; // RadioNodeList
106106
rules = rules || Nette.parseJSON(elem.getAttribute('data-nette-rules'));
107+
value = value === undefined ? {value: Nette.getEffectiveValue(elem)} : value;
107108

108109
for (var id = 0, len = rules.length; id < len; id++) {
109110
var rule = rules[id],
@@ -115,15 +116,17 @@ Nette.validateControl = function(elem, rules, onlyCheck) {
115116
rule.condition = !!rule.rules;
116117
curElem = curElem.tagName ? curElem : curElem[0]; // RadioNodeList
117118

118-
var success = Nette.validateRule(curElem, rule.op, rule.arg);
119+
var curValue = elem === curElem ? value : {value: Nette.getEffectiveValue(curElem)},
120+
success = Nette.validateRule(curElem, rule.op, rule.arg, curValue);
121+
119122
if (success === null) {
120123
continue;
121124
} else if (rule.neg) {
122125
success = !success;
123126
}
124127

125128
if (rule.condition && success) {
126-
if (!Nette.validateControl(elem, rule.rules, onlyCheck)) {
129+
if (!Nette.validateControl(elem, rule.rules, onlyCheck, value)) {
127130
return false;
128131
}
129132
} else if (!rule.condition && !success) {
@@ -231,8 +234,8 @@ Nette.expandRuleArgument = function(form, arg) {
231234
/**
232235
* Validates single rule.
233236
*/
234-
Nette.validateRule = function(elem, op, arg) {
235-
var val = Nette.getEffectiveValue(elem);
237+
Nette.validateRule = function(elem, op, arg, value) {
238+
value = value === undefined ? {value: Nette.getEffectiveValue(elem)} : value;
236239

237240
if (op.charAt(0) === ':') {
238241
op = op.substr(1);
@@ -245,7 +248,7 @@ Nette.validateRule = function(elem, op, arg) {
245248
arr[i] = Nette.expandRuleArgument(elem.form, arr[i]);
246249
}
247250
return Nette.validators[op]
248-
? Nette.validators[op](elem, Nette.isArray(arg) ? arr : arr[0], val)
251+
? Nette.validators[op](elem, Nette.isArray(arg) ? arr : arr[0], value.value, value)
249252
: null;
250253
};
251254

@@ -305,8 +308,15 @@ Nette.validators = {
305308
return (/^("([ !\x23-\x5B\x5D-\x7E]*|\\[ -~])+"|[-a-z0-9!#$%&'*+\/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+\/=?^_`{|}~]+)*)@([0-9a-z\u00C0-\u02FF\u0370-\u1EFF]([-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,61}[0-9a-z\u00C0-\u02FF\u0370-\u1EFF])?\.)+[a-z\u00C0-\u02FF\u0370-\u1EFF][-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,17}[a-z\u00C0-\u02FF\u0370-\u1EFF]$/i).test(val);
306309
},
307310

308-
url: function(elem, arg, val) {
309-
return (/^(https?:\/\/|(?=.*\.))([0-9a-z\u00C0-\u02FF\u0370-\u1EFF](([-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,61}[0-9a-z\u00C0-\u02FF\u0370-\u1EFF])?\.)*[a-z\u00C0-\u02FF\u0370-\u1EFF][-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,17}[a-z\u00C0-\u02FF\u0370-\u1EFF]|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[[0-9a-f:]{3,39}\])(:\d{1,5})?(\/\S*)?$/i).test(val);
311+
url: function(elem, arg, val, value) {
312+
if (!(/^[a-z\d+.-]+:/).test(val)) {
313+
val = 'http://' + val;
314+
}
315+
if ((/^https?:\/\/([0-9a-z\u00C0-\u02FF\u0370-\u1EFF](([-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,61}[0-9a-z\u00C0-\u02FF\u0370-\u1EFF])?\.)*[a-z\u00C0-\u02FF\u0370-\u1EFF][-0-9a-z\u00C0-\u02FF\u0370-\u1EFF]{0,17}[a-z\u00C0-\u02FF\u0370-\u1EFF]|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\[[0-9a-f:]{3,39}\])(:\d{1,5})?(\/\S*)?$/i).test(val)) {
316+
value.value = val;
317+
return true;
318+
}
319+
return false;
310320
},
311321

312322
regexp: function(elem, arg, val) {
@@ -326,8 +336,13 @@ Nette.validators = {
326336
return (/^-?[0-9]+$/).test(val);
327337
},
328338

329-
'float': function(elem, arg, val) {
330-
return (/^-?[0-9]*[.,]?[0-9]+$/).test(val);
339+
'float': function(elem, arg, val, value) {
340+
val = val.replace(' ', '').replace(',', '.');
341+
if ((/^-?[0-9]*[.,]?[0-9]+$/).test(val)) {
342+
value.value = val;
343+
return true;
344+
}
345+
return false;
331346
},
332347

333348
min: function(elem, arg, val) {
@@ -393,11 +408,11 @@ Nette.toggleForm = function(form, elem) {
393408
/**
394409
* Process toggles on form element.
395410
*/
396-
Nette.toggleControl = function(elem, rules, topSuccess, firsttime) {
411+
Nette.toggleControl = function(elem, rules, success, firsttime, value) {
397412
rules = rules || Nette.parseJSON(elem.getAttribute('data-nette-rules'));
413+
value = value === undefined ? {value: Nette.getEffectiveValue(elem)} : value;
398414

399415
var has = false,
400-
success = topSuccess,
401416
handled = [],
402417
handler = function () {
403418
Nette.toggleForm(elem.form, elem);
@@ -408,22 +423,18 @@ Nette.toggleControl = function(elem, rules, topSuccess, firsttime) {
408423
op = rule.op.match(/(~)?([^?]+)/),
409424
curElem = rule.control ? elem.form.elements[rule.control] : elem;
410425

411-
if (!rule.rules) {
412-
continue;
413-
}
414-
415426
if (success !== false) {
416427
rule.neg = op[1];
417428
rule.op = op[2];
418-
success = Nette.validateRule(curElem, rule.op, rule.arg);
419-
if (success === null) {
429+
var curValue = elem === curElem ? value : {value: Nette.getEffectiveValue(curElem)},
430+
res = Nette.validateRule(curElem, rule.op, rule.arg, curValue);
431+
if (res === null) {
420432
continue;
421-
} else if (rule.neg) {
422-
success = !success;
423433
}
434+
success = rule.neg ? !res : res;
424435
}
425436

426-
if (Nette.toggleControl(elem, rule.rules, success, firsttime) || rule.toggle) {
437+
if ((rule.rules && Nette.toggleControl(elem, rule.rules, success, firsttime, value)) || rule.toggle) {
427438
has = true;
428439
if (firsttime) {
429440
var oldIE = !document.addEventListener, // IE < 9

tests/netteForms/spec/Nette.validateRuleSpec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ describe('Nette.getValue & validateRule', function() {
3737
expect(Nette.validateRule(el, 'length', [1, 6])).toBe(true);
3838
expect(Nette.validateRule(el, 'length', [3, 4])).toBe(false);
3939
expect(Nette.validateRule(el, 'email')).toBe(false);
40-
expect(Nette.validateRule(el, 'url')).toBe(false);
40+
expect(Nette.validateRule(el, 'url')).toBe(true);
4141
expect(Nette.validateRule(el, 'regexp', '/\\d+/')).toBe(false);
4242
expect(Nette.validateRule(el, 'regexp', '/\\w+/')).toBe(true);
4343
expect(Nette.validateRule(el, 'pattern', '\\d+')).toBe(false);

0 commit comments

Comments
 (0)