parsley-rails 1.1.14.0 → 1.1.15.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,5 @@
1
1
  module Parsley
2
2
  module Rails
3
- VERSION = "1.1.14.0"
3
+ VERSION = "1.1.15.0"
4
4
  end
5
5
  end
@@ -0,0 +1,47 @@
1
+ /**
2
+ * /!\ This file is just an example template to create/update your own language file /!\
3
+ */
4
+
5
+ window.ParsleyConfig = window.ParsleyConfig || {};
6
+
7
+ (function ($) {
8
+ window.ParsleyConfig = $.extend( true, {}, window.ParsleyConfig, {
9
+ messages: {
10
+ // parsley //////////////////////////////////////
11
+ defaultMessage: "This value seems to be invalid."
12
+ , type: {
13
+ email: "This value should be a valid email."
14
+ , url: "This value should be a valid url."
15
+ , urlstrict: "This value should be a valid url."
16
+ , number: "This value should be a valid number."
17
+ , digits: "This value should be digits."
18
+ , dateIso: "This value should be a valid date (YYYY-MM-DD)."
19
+ , alphanum: "This value should be alphanumeric."
20
+ , phone: "This value should be a valid phone number."
21
+ }
22
+ , notnull: "This value should not be null."
23
+ , notblank: "This value should not be blank."
24
+ , required: "This value is required."
25
+ , regexp: "This value seems to be invalid."
26
+ , min: "This value should be greater than %s."
27
+ , max: "This value should be lower than %s."
28
+ , range: "This value should be between %s and %s."
29
+ , minlength: "This value is too short. It should have %s characters or more."
30
+ , maxlength: "This value is too long. It should have %s characters or less."
31
+ , rangelength: "This value length is invalid. It should be between %s and %s characters long."
32
+ , mincheck: "You must select at least %s choices."
33
+ , maxcheck: "You must select %s choices or less."
34
+ , rangecheck: "You must select between %s and %s choices."
35
+ , equalto: "This value should be the same."
36
+
37
+ // parsley.extend ///////////////////////////////
38
+ , minwords: "This value should have %s words at least."
39
+ , maxwords: "This value should have %s words maximum."
40
+ , rangewords: "This value should have between %s and %s words."
41
+ , greaterthan: "This value should be greater than %s."
42
+ , lessthan: "This value should be less than %s."
43
+ , beforedate: "This date should be before %s."
44
+ , afterdate: "This date should be after %s."
45
+ }
46
+ });
47
+ }(window.jQuery || window.Zepto));
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Estonian i18n
3
+ */
4
+
5
+ window.ParsleyConfig = window.ParsleyConfig || {};
6
+
7
+ (function ($) {
8
+ window.ParsleyConfig = $.extend( true, {}, window.ParsleyConfig, {
9
+ messages: {
10
+ // parsley //////////////////////////////////////
11
+ defaultMessage: "Palun kontrolli välja väärtust."
12
+ , type: {
13
+ email: "Välja väärtus peaks olema korrektne e-mail."
14
+ , url: "Välja väärtus peaks olema korrektne internetiaadress."
15
+ , urlstrict: "Välja väärtus peaks olema korrektne internetiaadress."
16
+ , number: "Välja väärtus peaks olema korrektne number."
17
+ , digits: "Välja väärtus peaks olema korrektne täisarv."
18
+ , dateIso: "Välja väärtus peaks olema korrektne kuupäev (YYYY-MM-DD)."
19
+ , alphanum: "Välja väärtus peaks sisaldama ainult tähti ja numbreid."
20
+ }
21
+ , notnull: "Väli väärtus ei tohiks olla tühi."
22
+ , notblank: "Välja väärtus peaks olema täidetud."
23
+ , required: "See väli peaks olema täidetud."
24
+ , regexp: "Vigane väärtus."
25
+ , min: "Välja väärtus peaks olema suurem kui %s."
26
+ , max: "Välja väärtus peaks olema väiksem kui %s."
27
+ , range: "Välja väärtus peaks olema %s ja %s vahel."
28
+ , minlength: "Väärtus on liiga lühike, pikkus peaks olema %s või rohkem märki."
29
+ , maxlength: "Väärtus on liiga pikk, pikkus peaks olema %s või vähem märki."
30
+ , rangelength: "Välja pikkus peaks olema %s ja %s tähemärgi vahel."
31
+ , mincheck: "Pead valima minimaalselt %s valikut."
32
+ , maxcheck: "Pead valima maksimaalselt %s valikut."
33
+ , rangecheck: "Pead valima %s kuni %s valikut."
34
+ , equalto: "Välja väärtus peaks kattuma."
35
+
36
+ // parsley.extend ///////////////////////////////
37
+ , minwords: "Välja väärtus peaks sisaldama vähemalt %s sõna."
38
+ , maxwords: "Välja väärtus ei tohi ületada %s sõna."
39
+ , rangewords: "Välja väärtus peaks olema %s kuni %s sõna."
40
+ , greaterthan: "Välja väärtus peaks olema suurem kui %s."
41
+ , lessthan: "Välja väärtus peaks olema väiksem kui %s."
42
+ , beforedate: "Kuupäev peaks olema varasem kui %s."
43
+ , afterdate: "Kuupäev peaks olema hilisem kui %s."
44
+ }
45
+ });
46
+ }(window.jQuery || window.Zepto));
@@ -0,0 +1,40 @@
1
+ window.ParsleyConfig = window.ParsleyConfig || {};
2
+
3
+ (function ($) {
4
+ window.ParsleyConfig = $.extend( true, {}, window.ParsleyConfig, {
5
+ messages: {
6
+ // parsley //////////////////////////////////////
7
+ defaultMessage: "Questo valore sembra essere non valido."
8
+ , type: {
9
+ email: "Questo valore deve essere un indirizzo email valido."
10
+ , url: "Questo valore deve essere un URL valido."
11
+ , urlstrict: "Questo valore deve essere un URL valido."
12
+ , number: "Questo valore deve essere un numero valido."
13
+ , digits: "Questo valore deve essere di tipo numerico."
14
+ , dateIso: "Questo valore deve essere una data valida (YYYY-MM-DD)."
15
+ , alphanum: "Questo valore deve essere di tipo alfanumerico."
16
+ }
17
+ , notnull: "Questo valore non deve essere nullo."
18
+ , notblank: "Questo valore non deve essere vuoto."
19
+ , required: "Questo valore è richiesto."
20
+ , regexp: "Questo valore non è corretto."
21
+ , min: "Questo valore deve essere maggiore di %s."
22
+ , max: "Questo valore deve essere minore di %s."
23
+ , range: "Questo valore deve essere compreso tra %s e %s."
24
+ , minlength: "Questo valore è troppo corto. La lunghezza minima è di %s caratteri."
25
+ , maxlength: "Questo valore è troppo lungo. La lunghezza massima è di %s caratteri."
26
+ , rangelength: "La lunghezza di questo valore deve essere compresa fra %s e %s caratteri."
27
+ , equalto: "Questo valore deve essere identico."
28
+
29
+ // parsley.extend ///////////////////////////////
30
+ , minwords: "Questo valore deve contenere almeno %s parole."
31
+ , maxwords: "Questo valore non deve superare le %s parole."
32
+ , rangewords: "Questo valore deve contenere tra %s e %s parole."
33
+ , greaterthan: "Questo valore deve essere maggiore di %s."
34
+ , lessthan: "Questo valore deve essere minore di %s."
35
+ , beforedate: "Questa data deve essere anteriore al %s."
36
+ , afterdate: "Questa data deve essere posteriore al %s."
37
+ , luhn: "Questo valore deve superare il test di Luhn."
38
+ }
39
+ });
40
+ }(window.jQuery || window.Zepto));
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Swedish i18n.
3
+ */
4
+ window.ParsleyConfig = window.ParsleyConfig || {};
5
+
6
+ (function ($) {
7
+ window.ParsleyConfig = $.extend( true, {}, window.ParsleyConfig, {
8
+ messages: {
9
+ // parsley //////////////////////////////////////
10
+ defaultMessage: "Ogiltigt värde."
11
+ , type: {
12
+ email: "Värdet måste vara en giltig e-postadress."
13
+ , url: "Värdet måste vara en giltig URL."
14
+ , urlstrict: "Värdet måste vara en giltig URL."
15
+ , number: "Värdet måste vara ett giltigt nummer."
16
+ , digits: "Värdet får enbart innehålla siffror."
17
+ , dateIso: "Värdet måste vara ett giltigt datum (YYYY-MM-DD)."
18
+ , alphanum: "Värdet får bara innehålla bokstäver och siffror."
19
+ }
20
+ , notnull: "Värdet får inte vara null."
21
+ , notblank: "Fältet får inte vara tomt."
22
+ , required: "Måste fyllas i."
23
+ , regexp: "Värdet verkar inte vara giltigt."
24
+ , min: "Värdet måste vara större än %s."
25
+ , max: "Värdet måste vara mindre än %s."
26
+ , range: "Värdet måste vara mellan %s och %s."
27
+ , minlength: "Värdet är för kort. Det måste innehålla minst %s tecken."
28
+ , maxlength: "Värdet är för långt. Det får maximalt innehålla %s tecken."
29
+ , rangelength: "Värdets längd är felaktig. Det måste innehålla mellan %s och %s tecken."
30
+ , mincheck: "Minst %s värden måste väljas."
31
+ , maxcheck: "Maximalt %s värden får väljas."
32
+ , rangecheck: "Du måste göra minst %s och maximalt %s val."
33
+ , equalto: "Värdet måste vara lika."
34
+
35
+ // parsley.extend ///////////////////////////////
36
+ , minwords: "Fältet måste innehålla minst %s ord."
37
+ , maxwords: "Fältet får maximalt innehålla %s ord."
38
+ , rangewords: "Fältet ska innehålla mellan %s och %s ord."
39
+ , greaterthan: "Värdet måste vara större än %s."
40
+ , lessthan: "Värdet måste vara mindre än %s."
41
+ , beforedate: "Datumet måste vara före %s."
42
+ , afterdate: "Datumet måste vara efter %s."
43
+ }
44
+ });
45
+ }(window.jQuery || window.Zepto));
@@ -0,0 +1,46 @@
1
+ /**
2
+ * /!\ This file is just an example template to create/update your own language file /!\
3
+ */
4
+
5
+ window.ParsleyConfig = window.ParsleyConfig || {};
6
+
7
+ (function ($) {
8
+ window.ParsleyConfig = $.extend( true, {}, window.ParsleyConfig, {
9
+ messages: {
10
+ // parsley //////////////////////////////////////
11
+ defaultMessage: "不正确的值"
12
+ , type: {
13
+ email: "字段值应该是一个正确的电子邮件地址"
14
+ , url: "字段值应该是一个正确的URL地址"
15
+ , urlstrict: "字段值应该是一个正确的URL地址"
16
+ , number: "字段值应该是一个合法的数字"
17
+ , digits: "字段值应该是一个单独的数字"
18
+ , dateIso: "字段值应该是一个正确的日期描述(YYYY-MM-DD)."
19
+ , alphanum: "字段值应该是只包含字母和数字"
20
+ }
21
+ , notnull: "字段值不可为null"
22
+ , notblank: "字段值不可为空"
23
+ , required: "字段值是必填的"
24
+ , regexp: "字段值不合法"
25
+ , min: "字段值应该大于 %s"
26
+ , max: "字段值应该小于 %s."
27
+ , range: "字段值应该大于 %s 并小于 %s."
28
+ , minlength: "字段值太短了,长度应该大于等于 %s 个字符"
29
+ , maxlength: "字段值太长了,长度应该小于等于 %s 个字符"
30
+ , rangelength: "字段值长度错醋,长度应该在 %s 和 %s 个字符之间"
31
+ , mincheck: "你至少要选择 %s 个选项"
32
+ , maxcheck: "你最多只能选择 %s 个选项"
33
+ , rangecheck: "你只能选择 %s 到 %s 个选项"
34
+ , equalto: "字段值应该和给定的值一样"
35
+
36
+ // parsley.extend ///////////////////////////////
37
+ , minwords: "字段值应该至少有 %s 个词"
38
+ , maxwords: "字段值最多只能有 %s 个词"
39
+ , rangewords: "字段值应该有 %s 到 %s 个词"
40
+ , greaterthan: "字段值应该大于 %s"
41
+ , lessthan: "字段值应该小于 %s"
42
+ , beforedate: "字段值所表示的日期应该早于 %s."
43
+ , afterdate: "字段值所表示的日期应该晚于 %s."
44
+ }
45
+ });
46
+ }(window.jQuery || window.Zepto));
@@ -32,6 +32,7 @@
32
32
  , digits: "This value should be digits."
33
33
  , dateIso: "This value should be a valid date (YYYY-MM-DD)."
34
34
  , alphanum: "This value should be alphanumeric."
35
+ , phone: "This value should be a valid phone number."
35
36
  }
36
37
  , notnull: "This value should not be null."
37
38
  , notblank: "This value should not be blank."
@@ -113,6 +114,9 @@
113
114
  case 'dateIso':
114
115
  regExp = /^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])$/;
115
116
  break;
117
+ case 'phone':
118
+ regExp = /^((\+\d{1,3}(-| )?\(?\d\)?(-| )?\d{1,5})|(\(?\d{2,6}\)?))(-| )?(\d{3,4})(-| )?(\d{4})(( x| ext)\d{1,5}){0,1}$/;
119
+ break;
116
120
  default:
117
121
  return false;
118
122
  }
@@ -121,8 +125,8 @@
121
125
  return '' !== val ? regExp.test( val ) : false;
122
126
  }
123
127
 
124
- , regexp: function ( val, regExp ) {
125
- return new RegExp( regExp, 'i' ).test( val );
128
+ , regexp: function ( val, regExp, self ) {
129
+ return new RegExp( regExp, self.options.regexpFlag || '' ).test( val );
126
130
  }
127
131
 
128
132
  , minlength: function ( val, min ) {
@@ -167,10 +171,12 @@
167
171
  }
168
172
 
169
173
  var manage = function ( isConstraintValid, message ) {
170
- // remove error message because ajax response message could change depending on the sent value !
171
- self.removeError( 'remote' );
174
+ // remove error message if we got a server message, different from previous message
175
+ if ( 'undefined' !== typeof message && 'undefined' !== typeof self.Validator.messages.remote && message !== self.Validator.messages.remote ) {
176
+ $( self.ulError + ' .remote' ).remove();
177
+ }
172
178
 
173
- self.updtConstraint( { name: 'remote', isValid: isConstraintValid }, message );
179
+ self.updtConstraint( { name: 'remote', valid: isConstraintValid }, message );
174
180
  self.manageValidationResult();
175
181
  };
176
182
 
@@ -194,7 +200,6 @@
194
200
  $.ajax( $.extend( {}, {
195
201
  url: url
196
202
  , data: data
197
- , async: self.async
198
203
  , type: self.options.remoteMethod || 'GET'
199
204
  , success: function ( response ) {
200
205
  response = handleResponse( response );
@@ -207,10 +212,6 @@
207
212
  }
208
213
  }, dataType ) );
209
214
 
210
- if ( self.async ) {
211
- manage( result );
212
- }
213
-
214
215
  return result;
215
216
  }
216
217
 
@@ -339,13 +340,13 @@
339
340
  */
340
341
  , init: function ( element, type ) {
341
342
  this.type = type;
342
- this.isValid = true;
343
+ this.valid = true;
343
344
  this.element = element;
344
345
  this.validatedOnce = false;
345
346
  this.$element = $( element );
346
347
  this.val = this.$element.val();
347
348
  this.isRequired = false;
348
- this.constraints = [];
349
+ this.constraints = {};
349
350
 
350
351
  // overriden by ParsleyItemMultiple if radio or checkbox input
351
352
  if ( 'undefined' === typeof this.isRadioOrCheckbox ) {
@@ -364,7 +365,7 @@
364
365
  this.addConstraints();
365
366
 
366
367
  // bind parsley events if validators have been registered
367
- if ( this.constraints.length ) {
368
+ if ( this.hasConstraints() ) {
368
369
  this.bindValidationEvents();
369
370
  }
370
371
  }
@@ -439,11 +440,11 @@
439
440
  name = name.toLowerCase();
440
441
 
441
442
  if ( 'function' === typeof this.Validator.validators[ name ] ) {
442
- this.constraints.push( {
443
+ this.constraints[ name ] = {
443
444
  name: name
444
445
  , requirements: constraint[ name ]
445
- , isValid: null
446
- } );
446
+ , valid: null
447
+ }
447
448
 
448
449
  if ( name === 'required' ) {
449
450
  this.isRequired = true;
@@ -468,25 +469,22 @@
468
469
  */
469
470
  , updateConstraint: function ( constraint, message ) {
470
471
  for ( var name in constraint ) {
471
- this.updtConstraint( { name: name, requirements: constraint[ name ], isValid: null }, message );
472
+ this.updtConstraint( { name: name, requirements: constraint[ name ], valid: null }, message );
472
473
  }
473
474
  }
474
475
 
475
476
  /**
476
477
  * Dynamically update an existing constraint to a field.
477
- * Complex API: { name: name, requirements: requirements, isValid: boolean }
478
+ * Complex API: { name: name, requirements: requirements, valid: boolean }
478
479
  *
479
480
  * @method updtConstraint
480
481
  * @param {Object} constraint
481
482
  */
482
483
  , updtConstraint: function ( constraint, message ) {
483
- for ( var i in this.constraints ) {
484
- if ( this.constraints[ i ].name === constraint.name ) {
485
- this.constraints[ i ] = $.extend( true, this.constraints[ i ], constraint );
486
- if ( 'string' === typeof message ) {
487
- this.Validator.messages[ this.constraints[ i ].name ] = message ;
488
- }
489
- }
484
+ this.constraints[ constraint.name ] = $.extend( true, this.constraints[ constraint.name ], constraint );
485
+
486
+ if ( 'string' === typeof message ) {
487
+ this.Validator.messages[ constraint.name ] = message ;
490
488
  }
491
489
 
492
490
  // force field validation next check and reset validation events
@@ -500,23 +498,16 @@
500
498
  * @param {String} constraintName
501
499
  */
502
500
  , removeConstraint: function ( constraintName ) {
503
- var constraintName = constraintName.toLowerCase()
504
- , updatedConstraints = [];
501
+ var constraintName = constraintName.toLowerCase();
505
502
 
506
- for ( var constraint in this.constraints ) {
507
- if ( this.constraints[ constraint ].name !== constraintName ) {
508
- updatedConstraints.push( this.constraints[ constraint ] );
509
- }
510
- }
503
+ delete this.constraints[ constraintName ];
511
504
 
512
505
  if ( constraintName === 'required' ) {
513
506
  this.isRequired = false;
514
507
  }
515
508
 
516
- this.constraints = updatedConstraints;
517
-
518
509
  // if there are no more constraint, destroy parsley instance for this field
519
- if ( updatedConstraints.length === 0 ) {
510
+ if ( !this.hasConstraints() ) {
520
511
  // in a form context, remove item from parent
521
512
  if ( 'ParsleyForm' === typeof this.getParent() ) {
522
513
  this.getParent().removeItem( this.$element );
@@ -556,7 +547,7 @@
556
547
  */
557
548
  , bindValidationEvents: function () {
558
549
  // this field has validation events, that means it has to be validated
559
- this.isValid = null;
550
+ this.valid = null;
560
551
  this.$element.addClass( 'parsley-validated' );
561
552
 
562
553
  // remove eventually already binded events
@@ -638,7 +629,7 @@
638
629
  return true;
639
630
  }
640
631
 
641
- this.validate( true, false );
632
+ this.validate( true );
642
633
  }
643
634
 
644
635
  /**
@@ -647,24 +638,37 @@
647
638
  * @method isValid
648
639
  * @return {Boolean} Is field valid or not
649
640
  */
650
- , isFieldValid: function () {
651
- return this.validate( false, false );
641
+ , isValid: function () {
642
+ return this.validate( false );
643
+ }
644
+
645
+ /**
646
+ * Return if field has constraints
647
+ *
648
+ * @method hasConstraints
649
+ * @return {Boolean} Is field has constraints or not
650
+ */
651
+ , hasConstraints: function () {
652
+ for ( var constraint in this.constraints ) {
653
+ return true;
654
+ }
655
+
656
+ return false;
652
657
  }
653
658
 
654
659
  /**
655
660
  * Validate a field & display errors
656
661
  *
657
662
  * @method validate
658
- * @param {Boolean} errorBubbling set to false if you just want isValid boolean without error bubbling next to fields
659
- * @param {Boolean} async if false, wait ajax calls returns
663
+ * @param {Boolean} errorBubbling set to false if you just want valid boolean without error bubbling next to fields
660
664
  * @return {Boolean} Is field valid or not
661
665
  */
662
- , validate: function ( errorBubbling, async ) {
666
+ , validate: function ( errorBubbling ) {
663
667
  var val = this.getVal()
664
- , isValid = null;
668
+ , valid = null;
665
669
 
666
670
  // do not even bother trying validating a field w/o constraints
667
- if ( this.constraints.length === 0 ) {
671
+ if ( !this.hasConstraints() ) {
668
672
  return null;
669
673
  }
670
674
 
@@ -676,19 +680,18 @@
676
680
 
677
681
  // do not validate a field already validated and unchanged !
678
682
  if ( !this.needsValidation( val ) ) {
679
- return this.isValid;
683
+ return this.valid;
680
684
  }
681
685
 
682
686
  this.errorBubbling = 'undefined' !== typeof errorBubbling ? errorBubbling : true;
683
- this.async = 'undefined' !== typeof async ? async : true;
684
687
 
685
- isValid = this.applyValidators();
688
+ valid = this.applyValidators();
686
689
 
687
690
  if ( this.errorBubbling ) {
688
691
  this.manageValidationResult();
689
692
  }
690
693
 
691
- return isValid;
694
+ return valid;
692
695
  }
693
696
 
694
697
  /**
@@ -699,7 +702,7 @@
699
702
  * @return {Boolean}
700
703
  */
701
704
  , needsValidation: function ( val ) {
702
- if ( !this.options.validateIfUnchanged && this.isValid !== null && this.val === val && this.validatedOnce ) {
705
+ if ( !this.options.validateIfUnchanged && this.valid !== null && this.val === val && this.validatedOnce ) {
703
706
  return false;
704
707
  }
705
708
 
@@ -715,21 +718,21 @@
715
718
  * @return {Mixed} {Boolean} If field valid or not, null if not validated
716
719
  */
717
720
  , applyValidators: function () {
718
- var isValid = null;
721
+ var valid = null;
719
722
 
720
- for ( var constraint = 0; constraint < this.constraints.length; constraint++ ) {
723
+ for ( var constraint in this.constraints ) {
721
724
  var result = this.Validator.validators[ this.constraints[ constraint ].name ]( this.val, this.constraints[ constraint ].requirements, this );
722
725
 
723
726
  if ( false === result ) {
724
- isValid = false;
725
- this.constraints[ constraint ].isValid = isValid;
727
+ valid = false;
728
+ this.constraints[ constraint ].valid = valid;
726
729
  } else if ( true === result ) {
727
- this.constraints[ constraint ].isValid = true;
728
- isValid = false !== isValid;
730
+ this.constraints[ constraint ].valid = true;
731
+ valid = false !== valid;
729
732
  }
730
733
  }
731
734
 
732
- return isValid;
735
+ return valid;
733
736
  }
734
737
 
735
738
  /**
@@ -742,32 +745,32 @@
742
745
  * @return {Boolean} Is field valid or not
743
746
  */
744
747
  , manageValidationResult: function () {
745
- var isValid = null;
748
+ var valid = null;
746
749
 
747
- for ( var constraint = 0; constraint < this.constraints.length; constraint++ ) {
748
- if ( false === this.constraints[ constraint ].isValid ) {
750
+ for ( var constraint in this.constraints ) {
751
+ if ( false === this.constraints[ constraint ].valid ) {
749
752
  this.manageError( this.constraints[ constraint ] );
750
- isValid = false;
751
- } else if ( true === this.constraints[ constraint ].isValid ) {
753
+ valid = false;
754
+ } else if ( true === this.constraints[ constraint ].valid ) {
752
755
  this.removeError( this.constraints[ constraint ].name );
753
- isValid = false !== isValid;
756
+ valid = false !== valid;
754
757
  }
755
758
  }
756
759
 
757
- this.isValid = isValid;
760
+ this.valid = valid;
758
761
 
759
- if ( true === this.isValid ) {
762
+ if ( true === this.valid ) {
760
763
  this.removeErrors();
761
764
  this.errorClassHandler.removeClass( this.options.errorClass ).addClass( this.options.successClass );
762
765
  this.options.listeners.onFieldSuccess( this.element, this.constraints, this );
763
766
  return true;
764
- } else if ( false === this.isValid ) {
767
+ } else if ( false === this.valid ) {
765
768
  this.errorClassHandler.removeClass( this.options.successClass ).addClass( this.options.errorClass );
766
769
  this.options.listeners.onFieldError( this.element, this.constraints, this );
767
770
  return false;
768
771
  }
769
772
 
770
- return isValid;
773
+ return valid;
771
774
  }
772
775
 
773
776
  /**
@@ -827,11 +830,15 @@
827
830
  * @method reset
828
831
  */
829
832
  , reset: function () {
830
- this.isValid = null;
833
+ this.valid = null;
831
834
  this.removeErrors();
832
835
  this.validatedOnce = false;
833
836
  this.errorClassHandler.removeClass( this.options.successClass ).removeClass( this.options.errorClass );
834
837
 
838
+ for ( var constraint in this.constraints ) {
839
+ this.constraints[ constraint ].valid = null;
840
+ }
841
+
835
842
  return this;
836
843
  }
837
844
 
@@ -847,6 +854,15 @@
847
854
  this.manageErrorContainer();
848
855
  }
849
856
 
857
+ // TODO: refacto properly
858
+ // if required constraint but field is not null, do not display
859
+ if ( 'required' === constraint.name && null !== this.getVal() && this.getVal().length > 0 ) {
860
+ return;
861
+ // if empty required field and non required constraint fails, do not display
862
+ } else if ( this.isRequired && 'required' !== constraint.name && ( null === this.getVal() || 0 === this.getVal().length ) ) {
863
+ return;
864
+ }
865
+
850
866
  // TODO: refacto error name w/ proper & readable function
851
867
  var constraintName = constraint.name
852
868
  , liClass = false !== this.options.errorMessage ? 'custom-error-message' : constraintName
@@ -882,7 +898,7 @@
882
898
  /**
883
899
  * Add custom listeners
884
900
  *
885
- * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( isValid, event, focus ) { ... } }
901
+ * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( valid, event, focus ) { ... } }
886
902
  */
887
903
  , addListener: function ( object ) {
888
904
  for ( var listener in object ) {
@@ -1008,7 +1024,7 @@
1008
1024
  */
1009
1025
  , bindValidationEvents: function () {
1010
1026
  // this field has validation events, that means it has to be validated
1011
- this.isValid = null;
1027
+ this.valid = null;
1012
1028
  this.$element.addClass( 'parsley-validated' );
1013
1029
 
1014
1030
  // remove eventually already binded events
@@ -1062,7 +1078,7 @@
1062
1078
  /**
1063
1079
  * Add custom listeners
1064
1080
  *
1065
- * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( isValid, event, focus ) { ... } }
1081
+ * @param {Object} { listener: function () {} }, eg { onFormSubmit: function ( valid, event, focus ) { ... } }
1066
1082
  */
1067
1083
  , addListener: function ( object ) {
1068
1084
  for ( var listener in object ) {
@@ -1124,12 +1140,12 @@
1124
1140
  * @return {Boolean} Is form valid or not
1125
1141
  */
1126
1142
  , validate: function ( event ) {
1127
- var isValid = true;
1143
+ var valid = true;
1128
1144
  this.focusedField = false;
1129
1145
 
1130
1146
  for ( var item = 0; item < this.items.length; item++ ) {
1131
1147
  if ( 'undefined' !== typeof this.items[ item ] && false === this.items[ item ].validate() ) {
1132
- isValid = false;
1148
+ valid = false;
1133
1149
 
1134
1150
  if ( !this.focusedField && 'first' === this.options.focus || 'last' === this.options.focus ) {
1135
1151
  this.focusedField = this.items[ item ].$element;
@@ -1138,18 +1154,18 @@
1138
1154
  }
1139
1155
 
1140
1156
  // form is invalid, focus an error field depending on focus policy
1141
- if ( this.focusedField && !isValid ) {
1157
+ if ( this.focusedField && !valid ) {
1142
1158
  this.focusedField.focus();
1143
1159
  }
1144
1160
 
1145
- this.options.listeners.onFormSubmit( isValid, event, this );
1161
+ this.options.listeners.onFormSubmit( valid, event, this );
1146
1162
 
1147
- return isValid;
1163
+ return valid;
1148
1164
  }
1149
1165
 
1150
1166
  , isValid: function () {
1151
1167
  for ( var item = 0; item < this.items.length; item++ ) {
1152
- if ( false === this.items[ item ].isFieldValid() ) {
1168
+ if ( false === this.items[ item ].isValid() ) {
1153
1169
  return false;
1154
1170
  }
1155
1171
  }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parsley-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.14.0
4
+ version: 1.1.15.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-07 00:00:00.000000000 Z
12
+ date: 2013-04-23 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Parsley.js bundled for Rails Asset Pipeline
15
15
  email:
@@ -32,19 +32,24 @@ files:
32
32
  - vendor/assets/javascripts/parsley.i18n.cs.js
33
33
  - vendor/assets/javascripts/parsley.i18n.cy.js
34
34
  - vendor/assets/javascripts/parsley.i18n.de.js
35
+ - vendor/assets/javascripts/parsley.i18n.en.js
35
36
  - vendor/assets/javascripts/parsley.i18n.es.js
37
+ - vendor/assets/javascripts/parsley.i18n.et.js
36
38
  - vendor/assets/javascripts/parsley.i18n.fa.js
37
39
  - vendor/assets/javascripts/parsley.i18n.fi.js
38
40
  - vendor/assets/javascripts/parsley.i18n.fr.js
39
41
  - vendor/assets/javascripts/parsley.i18n.id.js
40
42
  - vendor/assets/javascripts/parsley.i18n.is.js
43
+ - vendor/assets/javascripts/parsley.i18n.it.js
41
44
  - vendor/assets/javascripts/parsley.i18n.lt.js
42
45
  - vendor/assets/javascripts/parsley.i18n.nl.js
43
46
  - vendor/assets/javascripts/parsley.i18n.no.js
44
47
  - vendor/assets/javascripts/parsley.i18n.pl.js
45
48
  - vendor/assets/javascripts/parsley.i18n.pt_br.js
46
49
  - vendor/assets/javascripts/parsley.i18n.ru.js
50
+ - vendor/assets/javascripts/parsley.i18n.sv.js
47
51
  - vendor/assets/javascripts/parsley.i18n.vn.js
52
+ - vendor/assets/javascripts/parsley.i18n.zh_cn.js
48
53
  - vendor/assets/javascripts/parsley.js
49
54
  homepage: https://github.com/mekishizufu/parsley-rails
50
55
  licenses: []