bootstrap-validator-rails 0.5.2 → 0.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/bootstrap-validator-rails/version.rb +2 -2
- data/vendor/assets/javascripts/bootstrapValidator.js +539 -124
- data/vendor/assets/javascripts/bootstrapValidator.min.js +7 -6
- data/vendor/assets/javascripts/language/ar_MA.js +16 -3
- data/vendor/assets/javascripts/language/be_FR.js +370 -0
- data/vendor/assets/javascripts/language/be_NL.js +14 -1
- data/vendor/assets/javascripts/language/bg_BG.js +14 -1
- data/vendor/assets/javascripts/language/cs_CZ.js +15 -2
- data/vendor/assets/javascripts/language/da_DK.js +15 -2
- data/vendor/assets/javascripts/language/de_DE.js +15 -2
- data/vendor/assets/javascripts/language/en_US.js +15 -2
- data/vendor/assets/javascripts/language/es_CL.js +15 -2
- data/vendor/assets/javascripts/language/es_ES.js +14 -1
- data/vendor/assets/javascripts/language/fa_IR.js +370 -0
- data/vendor/assets/javascripts/language/fr_FR.js +17 -4
- data/vendor/assets/javascripts/language/gr_EL.js +16 -3
- data/vendor/assets/javascripts/language/hu_HU.js +190 -177
- data/vendor/assets/javascripts/language/id_ID.js +370 -0
- data/vendor/assets/javascripts/language/it_IT.js +15 -2
- data/vendor/assets/javascripts/language/ja_JP.js +370 -0
- data/vendor/assets/javascripts/language/nl_NL.js +14 -1
- data/vendor/assets/javascripts/language/no_NO.js +370 -0
- data/vendor/assets/javascripts/language/pl_PL.js +14 -1
- data/vendor/assets/javascripts/language/pt_BR.js +17 -4
- data/vendor/assets/javascripts/language/ro_RO.js +370 -0
- data/vendor/assets/javascripts/language/ru_RU.js +370 -0
- data/vendor/assets/javascripts/language/sr_RS.js +370 -0
- data/vendor/assets/javascripts/language/sv_SE.js +370 -0
- data/vendor/assets/javascripts/language/th_TH.js +370 -0
- data/vendor/assets/javascripts/language/tr_TR.js +15 -2
- data/vendor/assets/javascripts/language/ua_UA.js +370 -0
- data/vendor/assets/javascripts/language/vi_VN.js +14 -1
- data/vendor/assets/javascripts/language/zh_CN.js +14 -1
- data/vendor/assets/javascripts/language/zh_TW.js +14 -1
- data/vendor/assets/stylesheets/bootstrapValidator.css +2 -1
- data/vendor/assets/stylesheets/bootstrapValidator.min.css +3 -2
- metadata +13 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf2acca332fdc5b9ec005f09b2a0240bedc4613d
|
4
|
+
data.tar.gz: b4c44a5da71c12ab78e814e0d984a31969ab1159
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c922b884ca534ea0685d4af36724da3f53c8ead9ba393f0fbc13d077d891f827dd6a157ba9f424f17a972c135b9ccf15cc45c64900641624e4945a536482f9f0
|
7
|
+
data.tar.gz: 4c6c8e98647989ff14ecef5ed6ddf5c9952346db1c799bc06043bf2db5b190422158c588b649e006209905e32db9e246b1fe094e2c2fceac127dd589338d5a5f
|
data/README.md
CHANGED
@@ -2,15 +2,23 @@
|
|
2
2
|
* BootstrapValidator (http://bootstrapvalidator.com)
|
3
3
|
* The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
|
4
4
|
*
|
5
|
-
* @version v0.5.
|
5
|
+
* @version v0.5.3, built on 2014-11-05 9:14:18 PM
|
6
6
|
* @author https://twitter.com/nghuuphuoc
|
7
7
|
* @copyright (c) 2013 - 2014 Nguyen Huu Phuoc
|
8
|
-
* @license
|
8
|
+
* @license Commercial: http://bootstrapvalidator.com/license/
|
9
|
+
* Non-commercial: http://creativecommons.org/licenses/by-nc-nd/3.0/
|
9
10
|
*/
|
10
11
|
if (typeof jQuery === 'undefined') {
|
11
|
-
throw new Error('BootstrapValidator
|
12
|
+
throw new Error('BootstrapValidator requires jQuery');
|
12
13
|
}
|
13
14
|
|
15
|
+
(function($) {
|
16
|
+
var version = $.fn.jquery.split(' ')[0].split('.');
|
17
|
+
if ((+version[0] < 2 && +version[1] < 9) || (+version[0] === 1 && +version[1] === 9 && +version[2] < 1)) {
|
18
|
+
throw new Error('BootstrapValidator requires jQuery version 1.9.1 or higher');
|
19
|
+
}
|
20
|
+
}(window.jQuery));
|
21
|
+
|
14
22
|
(function($) {
|
15
23
|
var BootstrapValidator = function(form, options) {
|
16
24
|
this.$form = $(form);
|
@@ -58,6 +66,7 @@ if (typeof jQuery === 'undefined') {
|
|
58
66
|
_init: function() {
|
59
67
|
var that = this,
|
60
68
|
options = {
|
69
|
+
autoFocus: this.$form.attr('data-bv-autofocus'),
|
61
70
|
container: this.$form.attr('data-bv-container'),
|
62
71
|
events: {
|
63
72
|
formInit: this.$form.attr('data-bv-events-form-init'),
|
@@ -176,19 +185,22 @@ if (typeof jQuery === 'undefined') {
|
|
176
185
|
validators = {},
|
177
186
|
validator,
|
178
187
|
v, // Validator name
|
188
|
+
attrName,
|
179
189
|
enabled,
|
180
190
|
optionName,
|
191
|
+
optionAttrName,
|
181
192
|
optionValue,
|
182
193
|
html5AttrName,
|
183
194
|
html5AttrMap;
|
184
195
|
|
185
196
|
for (v in $.fn.bootstrapValidator.validators) {
|
186
197
|
validator = $.fn.bootstrapValidator.validators[v];
|
187
|
-
|
198
|
+
attrName = 'data-bv-' + v.toLowerCase(),
|
199
|
+
enabled = $field.attr(attrName) + '';
|
188
200
|
html5AttrMap = ('function' === typeof validator.enableByHtml5) ? validator.enableByHtml5($field) : null;
|
189
201
|
|
190
202
|
if ((html5AttrMap && enabled !== 'false')
|
191
|
-
|| (html5AttrMap !== true && ('' === enabled || 'true' === enabled)))
|
203
|
+
|| (html5AttrMap !== true && ('' === enabled || 'true' === enabled || attrName === enabled.toLowerCase())))
|
192
204
|
{
|
193
205
|
// Try to parse the options via attributes
|
194
206
|
validator.html5Attributes = $.extend({}, { message: 'message', onerror: 'onError', onsuccess: 'onSuccess' }, validator.html5Attributes);
|
@@ -196,9 +208,10 @@ if (typeof jQuery === 'undefined') {
|
|
196
208
|
|
197
209
|
for (html5AttrName in validator.html5Attributes) {
|
198
210
|
optionName = validator.html5Attributes[html5AttrName];
|
199
|
-
|
211
|
+
optionAttrName = 'data-bv-' + v.toLowerCase() + '-' + html5AttrName,
|
212
|
+
optionValue = $field.attr(optionAttrName);
|
200
213
|
if (optionValue) {
|
201
|
-
if ('true' === optionValue) {
|
214
|
+
if ('true' === optionValue || optionAttrName === optionValue.toLowerCase()) {
|
202
215
|
optionValue = true;
|
203
216
|
} else if ('false' === optionValue) {
|
204
217
|
optionValue = false;
|
@@ -210,6 +223,7 @@ if (typeof jQuery === 'undefined') {
|
|
210
223
|
}
|
211
224
|
|
212
225
|
var opts = {
|
226
|
+
autoFocus: $field.attr('data-bv-autofocus'),
|
213
227
|
container: $field.attr('data-bv-container'),
|
214
228
|
excluded: $field.attr('data-bv-excluded'),
|
215
229
|
feedbackIcons: $field.attr('data-bv-feedbackicons'),
|
@@ -364,32 +378,40 @@ if (typeof jQuery === 'undefined') {
|
|
364
378
|
$icon.addClass('bv-icon-input-group')
|
365
379
|
.insertAfter($parent.find('.input-group').eq(0));
|
366
380
|
}
|
381
|
+
|
382
|
+
// Store the icon as a data of field element
|
383
|
+
if (!updateAll) {
|
384
|
+
$field.data('bv.icon', $icon);
|
385
|
+
} else if (i === total - 1) {
|
386
|
+
// All fields with the same name have the same icon
|
387
|
+
fields.data('bv.icon', $icon);
|
388
|
+
}
|
367
389
|
|
368
390
|
if (container) {
|
369
391
|
$field
|
370
392
|
// Show tooltip/popover message when field gets focus
|
371
|
-
.off('focus.bv')
|
372
|
-
.on('focus.bv', function() {
|
393
|
+
.off('focus.container.bv')
|
394
|
+
.on('focus.container.bv', function() {
|
373
395
|
switch (container) {
|
374
396
|
case 'tooltip':
|
375
|
-
$icon.tooltip('show');
|
397
|
+
$(this).data('bv.icon').tooltip('show');
|
376
398
|
break;
|
377
399
|
case 'popover':
|
378
|
-
$icon.popover('show');
|
400
|
+
$(this).data('bv.icon').popover('show');
|
379
401
|
break;
|
380
402
|
default:
|
381
403
|
break;
|
382
404
|
}
|
383
405
|
})
|
384
406
|
// and hide them when losing focus
|
385
|
-
.off('blur.bv')
|
386
|
-
.on('blur.bv', function() {
|
407
|
+
.off('blur.container.bv')
|
408
|
+
.on('blur.container.bv', function() {
|
387
409
|
switch (container) {
|
388
410
|
case 'tooltip':
|
389
|
-
$icon.tooltip('hide');
|
411
|
+
$(this).data('bv.icon').tooltip('hide');
|
390
412
|
break;
|
391
413
|
case 'popover':
|
392
|
-
$icon.popover('hide');
|
414
|
+
$(this).data('bv.icon').popover('hide');
|
393
415
|
break;
|
394
416
|
default:
|
395
417
|
break;
|
@@ -634,16 +656,21 @@ if (typeof jQuery === 'undefined') {
|
|
634
656
|
}
|
635
657
|
}
|
636
658
|
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
if (
|
642
|
-
|
643
|
-
|
659
|
+
// Determined the first invalid field which will be focused on automatically
|
660
|
+
for (var i = 0; i < this.$invalidFields.length; i++) {
|
661
|
+
var $field = this.$invalidFields.eq(i),
|
662
|
+
autoFocus = this._isOptionEnabled($field.attr('data-bv-field'), 'autoFocus');
|
663
|
+
if (autoFocus) {
|
664
|
+
// Activate the tab containing the field if exists
|
665
|
+
var $tabPane = $field.parents('.tab-pane'), tabId;
|
666
|
+
if ($tabPane && (tabId = $tabPane.attr('id'))) {
|
667
|
+
$('a[href="#' + tabId + '"][data-toggle="tab"]').tab('show');
|
668
|
+
}
|
644
669
|
|
645
|
-
|
646
|
-
|
670
|
+
// Focus the field
|
671
|
+
$field.focus();
|
672
|
+
break;
|
673
|
+
}
|
647
674
|
}
|
648
675
|
},
|
649
676
|
|
@@ -719,7 +746,7 @@ if (typeof jQuery === 'undefined') {
|
|
719
746
|
$field.trigger($.Event(this.options.events.fieldSuccess), data);
|
720
747
|
}
|
721
748
|
// If all validators are completed and there is at least one validator which doesn't pass
|
722
|
-
else if (counter[this.STATUS_NOT_VALIDATED] === 0 && counter[this.STATUS_VALIDATING] === 0 && counter[this.STATUS_INVALID] > 0) {
|
749
|
+
else if ((counter[this.STATUS_NOT_VALIDATED] === 0 || !this._isOptionEnabled(field, 'verbose')) && counter[this.STATUS_VALIDATING] === 0 && counter[this.STATUS_INVALID] > 0) {
|
723
750
|
// Add to the list of invalid fields
|
724
751
|
this.$invalidFields = this.$invalidFields.add($field);
|
725
752
|
|
@@ -727,6 +754,23 @@ if (typeof jQuery === 'undefined') {
|
|
727
754
|
}
|
728
755
|
},
|
729
756
|
|
757
|
+
/**
|
758
|
+
* Check whether or not a field option is enabled
|
759
|
+
*
|
760
|
+
* @param {String} field The field name
|
761
|
+
* @param {String} option The option name, "verbose", "autoFocus", for example
|
762
|
+
* @returns {Boolean}
|
763
|
+
*/
|
764
|
+
_isOptionEnabled: function(field, option) {
|
765
|
+
if (this.options.fields[field] && (this.options.fields[field][option] === 'true' || this.options.fields[field][option] === true)) {
|
766
|
+
return true;
|
767
|
+
}
|
768
|
+
if (this.options.fields[field] && (this.options.fields[field][option] === 'false' || this.options.fields[field][option] === false)) {
|
769
|
+
return false;
|
770
|
+
}
|
771
|
+
return this.options[option] === 'true' || this.options[option] === true;
|
772
|
+
},
|
773
|
+
|
730
774
|
// ---
|
731
775
|
// Public methods
|
732
776
|
// ---
|
@@ -757,7 +801,7 @@ if (typeof jQuery === 'undefined') {
|
|
757
801
|
*/
|
758
802
|
getOptions: function(field, validator, option) {
|
759
803
|
if (!field) {
|
760
|
-
return this.options;
|
804
|
+
return option ? this.options[option] : this.options;
|
761
805
|
}
|
762
806
|
if ('object' === typeof field) {
|
763
807
|
field = field.attr('data-bv-field');
|
@@ -777,7 +821,6 @@ if (typeof jQuery === 'undefined') {
|
|
777
821
|
return option ? options.validators[validator][option] : options.validators[validator];
|
778
822
|
},
|
779
823
|
|
780
|
-
|
781
824
|
/**
|
782
825
|
* Disable/enable submit buttons
|
783
826
|
*
|
@@ -806,11 +849,13 @@ if (typeof jQuery === 'undefined') {
|
|
806
849
|
}
|
807
850
|
this.disableSubmitButtons(true);
|
808
851
|
|
852
|
+
this._submitIfValid = false;
|
809
853
|
for (var field in this.options.fields) {
|
810
854
|
this.validateField(field);
|
811
855
|
}
|
812
856
|
|
813
857
|
this._submit();
|
858
|
+
this._submitIfValid = true;
|
814
859
|
|
815
860
|
return this;
|
816
861
|
},
|
@@ -835,7 +880,7 @@ if (typeof jQuery === 'undefined') {
|
|
835
880
|
break;
|
836
881
|
}
|
837
882
|
|
838
|
-
if (fields.length === 0 ||
|
883
|
+
if (fields.length === 0 || !this.options.fields[field] || this.options.fields[field].enabled === false) {
|
839
884
|
return this;
|
840
885
|
}
|
841
886
|
|
@@ -844,7 +889,7 @@ if (typeof jQuery === 'undefined') {
|
|
844
889
|
total = ('radio' === type || 'checkbox' === type) ? 1 : fields.length,
|
845
890
|
updateAll = ('radio' === type || 'checkbox' === type),
|
846
891
|
validators = this.options.fields[field].validators,
|
847
|
-
verbose = this.
|
892
|
+
verbose = this._isOptionEnabled(field, 'verbose'),
|
848
893
|
validatorName,
|
849
894
|
validateResult;
|
850
895
|
|
@@ -972,6 +1017,7 @@ if (typeof jQuery === 'undefined') {
|
|
972
1017
|
|
973
1018
|
if (status === this.STATUS_NOT_VALIDATED) {
|
974
1019
|
// Reset the flag
|
1020
|
+
// To prevent the form from doing submit when a deferred validator returns true while typing
|
975
1021
|
this._submitIfValid = false;
|
976
1022
|
}
|
977
1023
|
|
@@ -990,7 +1036,7 @@ if (typeof jQuery === 'undefined') {
|
|
990
1036
|
$message = $field.data('bv.messages'),
|
991
1037
|
$allErrors = $message.find('.help-block[data-bv-validator][data-bv-for="' + field + '"]'),
|
992
1038
|
$errors = validatorName ? $allErrors.filter('[data-bv-validator="' + validatorName + '"]') : $allErrors,
|
993
|
-
$icon = $
|
1039
|
+
$icon = $field.data('bv.icon'),
|
994
1040
|
container = ('function' === typeof (this.options.fields[field].container || this.options.container)) ? (this.options.fields[field].container || this.options.container).call(this, $field, this) : (this.options.fields[field].container || this.options.container),
|
995
1041
|
isValidField = null;
|
996
1042
|
|
@@ -1081,10 +1127,10 @@ if (typeof jQuery === 'undefined') {
|
|
1081
1127
|
? $icon.css('cursor', 'pointer').tooltip('destroy').tooltip({
|
1082
1128
|
container: 'body',
|
1083
1129
|
html: true,
|
1084
|
-
placement: 'top',
|
1130
|
+
placement: 'auto top',
|
1085
1131
|
title: $allErrors.filter('[data-bv-result="' + that.STATUS_INVALID + '"]').eq(0).html()
|
1086
1132
|
})
|
1087
|
-
: $icon.tooltip('
|
1133
|
+
: $icon.css('cursor', '').tooltip('destroy');
|
1088
1134
|
break;
|
1089
1135
|
// ... or popover
|
1090
1136
|
case ($icon && 'popover' === container):
|
@@ -1093,10 +1139,10 @@ if (typeof jQuery === 'undefined') {
|
|
1093
1139
|
container: 'body',
|
1094
1140
|
content: $allErrors.filter('[data-bv-result="' + that.STATUS_INVALID + '"]').eq(0).html(),
|
1095
1141
|
html: true,
|
1096
|
-
placement: 'top',
|
1142
|
+
placement: 'auto top',
|
1097
1143
|
trigger: 'hover click'
|
1098
1144
|
})
|
1099
|
-
: $icon.popover('
|
1145
|
+
: $icon.css('cursor', '').popover('destroy');
|
1100
1146
|
break;
|
1101
1147
|
default:
|
1102
1148
|
(status === this.STATUS_INVALID) ? $errors.show() : $errors.hide();
|
@@ -1150,7 +1196,7 @@ if (typeof jQuery === 'undefined') {
|
|
1150
1196
|
default:
|
1151
1197
|
break;
|
1152
1198
|
}
|
1153
|
-
if (fields.length === 0 || this.options.fields[field]
|
1199
|
+
if (fields.length === 0 || !this.options.fields[field] || this.options.fields[field].enabled === false) {
|
1154
1200
|
return true;
|
1155
1201
|
}
|
1156
1202
|
|
@@ -1609,7 +1655,7 @@ if (typeof jQuery === 'undefined') {
|
|
1609
1655
|
.removeAttr('data-bv-field');
|
1610
1656
|
|
1611
1657
|
// Remove feedback icons, tooltip/popover container
|
1612
|
-
$icon = $field.
|
1658
|
+
$icon = $field.data('bv.icon');
|
1613
1659
|
if ($icon) {
|
1614
1660
|
var container = ('function' === typeof (this.options.fields[field].container || this.options.container)) ? (this.options.fields[field].container || this.options.container).call(this, $field, this) : (this.options.fields[field].container || this.options.container);
|
1615
1661
|
switch (container) {
|
@@ -1624,6 +1670,7 @@ if (typeof jQuery === 'undefined') {
|
|
1624
1670
|
break;
|
1625
1671
|
}
|
1626
1672
|
}
|
1673
|
+
$field.removeData('bv.icon');
|
1627
1674
|
|
1628
1675
|
for (validator in this.options.fields[field].validators) {
|
1629
1676
|
if ($field.data('bv.dfs.' + validator)) {
|
@@ -1674,17 +1721,10 @@ if (typeof jQuery === 'undefined') {
|
|
1674
1721
|
};
|
1675
1722
|
|
1676
1723
|
// The default options
|
1724
|
+
// Sorted in alphabetical order
|
1677
1725
|
$.fn.bootstrapValidator.DEFAULT_OPTIONS = {
|
1678
|
-
// The
|
1679
|
-
|
1680
|
-
|
1681
|
-
// Default invalid message
|
1682
|
-
message: 'This value is not valid',
|
1683
|
-
|
1684
|
-
// The CSS selector for indicating the element consists the field
|
1685
|
-
// By default, each field is placed inside the <div class="form-group"></div>
|
1686
|
-
// You should adjust this option if your form group consists of many fields which not all of them need to be validated
|
1687
|
-
group: '.form-group',
|
1726
|
+
// The first invalid field will be focused automatically
|
1727
|
+
autoFocus: true,
|
1688
1728
|
|
1689
1729
|
//The error messages container. It can be:
|
1690
1730
|
// - 'tooltip' if you want to use Bootstrap tooltip to show error messages
|
@@ -1694,8 +1734,24 @@ if (typeof jQuery === 'undefined') {
|
|
1694
1734
|
// You also can define the message container for particular field
|
1695
1735
|
container: null,
|
1696
1736
|
|
1697
|
-
// The
|
1698
|
-
|
1737
|
+
// The form CSS class
|
1738
|
+
elementClass: 'bv-form',
|
1739
|
+
|
1740
|
+
// Use custom event name to avoid window.onerror being invoked by jQuery
|
1741
|
+
// See https://github.com/nghuuphuoc/bootstrapvalidator/issues/630
|
1742
|
+
events: {
|
1743
|
+
formInit: 'init.form.bv',
|
1744
|
+
formError: 'error.form.bv',
|
1745
|
+
formSuccess: 'success.form.bv',
|
1746
|
+
fieldAdded: 'added.field.bv',
|
1747
|
+
fieldRemoved: 'removed.field.bv',
|
1748
|
+
fieldInit: 'init.field.bv',
|
1749
|
+
fieldError: 'error.field.bv',
|
1750
|
+
fieldSuccess: 'success.field.bv',
|
1751
|
+
fieldStatus: 'status.field.bv',
|
1752
|
+
validatorError: 'error.validator.bv',
|
1753
|
+
validatorSuccess: 'success.validator.bv'
|
1754
|
+
},
|
1699
1755
|
|
1700
1756
|
// Indicate fields which won't be validated
|
1701
1757
|
// By default, the plugin will not validate the following kind of fields:
|
@@ -1746,9 +1802,13 @@ if (typeof jQuery === 'undefined') {
|
|
1746
1802
|
validating: null
|
1747
1803
|
},
|
1748
1804
|
|
1749
|
-
//
|
1750
|
-
|
1751
|
-
|
1805
|
+
// Map the field name with validator rules
|
1806
|
+
fields: null,
|
1807
|
+
|
1808
|
+
// The CSS selector for indicating the element consists the field
|
1809
|
+
// By default, each field is placed inside the <div class="form-group"></div>
|
1810
|
+
// You should adjust this option if your form group consists of many fields which not all of them need to be validated
|
1811
|
+
group: '.form-group',
|
1752
1812
|
|
1753
1813
|
// Live validating option
|
1754
1814
|
// Can be one of 3 values:
|
@@ -1757,25 +1817,16 @@ if (typeof jQuery === 'undefined') {
|
|
1757
1817
|
// - submitted: The live validating is enabled after the form is submitted
|
1758
1818
|
live: 'enabled',
|
1759
1819
|
|
1760
|
-
//
|
1761
|
-
|
1820
|
+
// Default invalid message
|
1821
|
+
message: 'This value is not valid',
|
1822
|
+
|
1823
|
+
// The submit buttons selector
|
1824
|
+
// These buttons will be disabled to prevent the valid form from multiple submissions
|
1825
|
+
submitButtons: '[type="submit"]',
|
1826
|
+
|
1827
|
+
// The field will not be live validated if its length is less than this number of characters
|
1828
|
+
threshold: null,
|
1762
1829
|
|
1763
|
-
// Use custom event name to avoid window.onerror being invoked by jQuery
|
1764
|
-
// See https://github.com/nghuuphuoc/bootstrapvalidator/issues/630
|
1765
|
-
events: {
|
1766
|
-
formInit: 'init.form.bv',
|
1767
|
-
formError: 'error.form.bv',
|
1768
|
-
formSuccess: 'success.form.bv',
|
1769
|
-
fieldAdded: 'added.field.bv',
|
1770
|
-
fieldRemoved: 'removed.field.bv',
|
1771
|
-
fieldInit: 'init.field.bv',
|
1772
|
-
fieldError: 'error.field.bv',
|
1773
|
-
fieldSuccess: 'success.field.bv',
|
1774
|
-
fieldStatus: 'status.field.bv',
|
1775
|
-
validatorError: 'error.validator.bv',
|
1776
|
-
validatorSuccess: 'success.validator.bv'
|
1777
|
-
},
|
1778
|
-
|
1779
1830
|
// Whether to be verbose when validating a field or not.
|
1780
1831
|
// Possible values:
|
1781
1832
|
// - true: when a field has multiple validators, all of them will be checked, and respectively - if errors occur in
|
@@ -2024,22 +2075,31 @@ if (typeof jQuery === 'undefined') {
|
|
2024
2075
|
if (value === '') {
|
2025
2076
|
return true;
|
2026
2077
|
}
|
2078
|
+
|
2079
|
+
value = this._format(value);
|
2027
2080
|
if (!$.isNumeric(value)) {
|
2028
2081
|
return false;
|
2029
2082
|
}
|
2030
2083
|
|
2031
|
-
var min
|
2032
|
-
max
|
2084
|
+
var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
|
2085
|
+
max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),
|
2086
|
+
minValue = this._format(min),
|
2087
|
+
maxValue = this._format(max);
|
2088
|
+
|
2033
2089
|
value = parseFloat(value);
|
2034
2090
|
return (options.inclusive === true || options.inclusive === undefined)
|
2035
2091
|
? {
|
2036
|
-
valid: value >=
|
2092
|
+
valid: value >= minValue && value <= maxValue,
|
2037
2093
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between['default'], [min, max])
|
2038
2094
|
}
|
2039
2095
|
: {
|
2040
|
-
valid: value >
|
2096
|
+
valid: value > minValue && value < maxValue,
|
2041
2097
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.between.notInclusive, [min, max])
|
2042
2098
|
};
|
2099
|
+
},
|
2100
|
+
|
2101
|
+
_format: function(value) {
|
2102
|
+
return (value + '').replace(',', '.');
|
2043
2103
|
}
|
2044
2104
|
};
|
2045
2105
|
}(window.jQuery));
|
@@ -2181,6 +2241,135 @@ if (typeof jQuery === 'undefined') {
|
|
2181
2241
|
}
|
2182
2242
|
};
|
2183
2243
|
}(window.jQuery));
|
2244
|
+
;(function($) {
|
2245
|
+
$.fn.bootstrapValidator.i18n.color = $.extend($.fn.bootstrapValidator.i18n.color || {}, {
|
2246
|
+
'default': 'Please enter a valid color'
|
2247
|
+
});
|
2248
|
+
|
2249
|
+
$.fn.bootstrapValidator.validators.color = {
|
2250
|
+
SUPPORTED_TYPES: [
|
2251
|
+
'hex', 'rgb', 'rgba', 'hsl', 'hsla', 'keyword'
|
2252
|
+
],
|
2253
|
+
|
2254
|
+
KEYWORD_COLORS: [
|
2255
|
+
// Colors start with A
|
2256
|
+
'aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure',
|
2257
|
+
// B
|
2258
|
+
'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood',
|
2259
|
+
// C
|
2260
|
+
'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan',
|
2261
|
+
// D
|
2262
|
+
'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta',
|
2263
|
+
'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue',
|
2264
|
+
'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray',
|
2265
|
+
'dimgrey', 'dodgerblue',
|
2266
|
+
// F
|
2267
|
+
'firebrick', 'floralwhite', 'forestgreen', 'fuchsia',
|
2268
|
+
// G
|
2269
|
+
'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'greenyellow', 'grey',
|
2270
|
+
// H
|
2271
|
+
'honeydew', 'hotpink',
|
2272
|
+
// I
|
2273
|
+
'indianred', 'indigo', 'ivory',
|
2274
|
+
// K
|
2275
|
+
'khaki',
|
2276
|
+
// L
|
2277
|
+
'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan',
|
2278
|
+
'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen',
|
2279
|
+
'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen',
|
2280
|
+
'linen',
|
2281
|
+
// M
|
2282
|
+
'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen',
|
2283
|
+
'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream',
|
2284
|
+
'mistyrose', 'moccasin',
|
2285
|
+
// N
|
2286
|
+
'navajowhite', 'navy',
|
2287
|
+
// O
|
2288
|
+
'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid',
|
2289
|
+
// P
|
2290
|
+
'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink',
|
2291
|
+
'plum', 'powderblue', 'purple',
|
2292
|
+
// R
|
2293
|
+
'red', 'rosybrown', 'royalblue',
|
2294
|
+
// S
|
2295
|
+
'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue',
|
2296
|
+
'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue',
|
2297
|
+
// T
|
2298
|
+
'tan', 'teal', 'thistle', 'tomato', 'transparent', 'turquoise',
|
2299
|
+
// V
|
2300
|
+
'violet',
|
2301
|
+
// W
|
2302
|
+
'wheat', 'white', 'whitesmoke',
|
2303
|
+
// Y
|
2304
|
+
'yellow', 'yellowgreen'
|
2305
|
+
],
|
2306
|
+
|
2307
|
+
/**
|
2308
|
+
* Return true if the input value is a valid color
|
2309
|
+
*
|
2310
|
+
* @param {BootstrapValidator} validator The validator plugin instance
|
2311
|
+
* @param {jQuery} $field Field element
|
2312
|
+
* @param {Object} options Can consist of the following keys:
|
2313
|
+
* - message: The invalid message
|
2314
|
+
* - type: The array of valid color types
|
2315
|
+
* @returns {Boolean}
|
2316
|
+
*/
|
2317
|
+
validate: function(validator, $field, options) {
|
2318
|
+
var value = $field.val();
|
2319
|
+
if (value === '') {
|
2320
|
+
return true;
|
2321
|
+
}
|
2322
|
+
|
2323
|
+
var types = options.type || this.SUPPORTED_TYPES;
|
2324
|
+
if (!$.isArray(types)) {
|
2325
|
+
types = types.replace(/s/g, '').split(',');
|
2326
|
+
}
|
2327
|
+
|
2328
|
+
var method,
|
2329
|
+
type,
|
2330
|
+
isValid = false;
|
2331
|
+
|
2332
|
+
for (var i = 0; i < types.length; i++) {
|
2333
|
+
type = types[i];
|
2334
|
+
method = '_' + type.toLowerCase();
|
2335
|
+
isValid = isValid || this[method](value);
|
2336
|
+
if (isValid) {
|
2337
|
+
return true;
|
2338
|
+
}
|
2339
|
+
}
|
2340
|
+
|
2341
|
+
return false;
|
2342
|
+
},
|
2343
|
+
|
2344
|
+
_hex: function(value) {
|
2345
|
+
return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);
|
2346
|
+
},
|
2347
|
+
|
2348
|
+
_hsl: function(value) {
|
2349
|
+
return /^hsl\((\s*(-?\d+)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*)\)$/.test(value);
|
2350
|
+
},
|
2351
|
+
|
2352
|
+
_hsla: function(value) {
|
2353
|
+
return /^hsla\((\s*(-?\d+)\s*,)(\s*(\b(0?\d{1,2}|100)\b%)\s*,){2}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/.test(value);
|
2354
|
+
},
|
2355
|
+
|
2356
|
+
_keyword: function(value) {
|
2357
|
+
return $.inArray(value, this.KEYWORD_COLORS) >= 0;
|
2358
|
+
},
|
2359
|
+
|
2360
|
+
_rgb: function(value) {
|
2361
|
+
var regexInteger = /^rgb\((\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*,){2}(\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*)\)$/,
|
2362
|
+
regexPercent = /^rgb\((\s*(\b(0?\d{1,2}|100)\b%)\s*,){2}(\s*(\b(0?\d{1,2}|100)\b%)\s*)\)$/;
|
2363
|
+
return regexInteger.test(value) || regexPercent.test(value);
|
2364
|
+
},
|
2365
|
+
|
2366
|
+
_rgba: function(value) {
|
2367
|
+
var regexInteger = /^rgba\((\s*(\b([01]?\d{1,2}|2[0-4]\d|25[0-5])\b)\s*,){3}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/,
|
2368
|
+
regexPercent = /^rgba\((\s*(\b(0?\d{1,2}|100)\b%)\s*,){3}(\s*(0?(\.\d+)?|1(\.0+)?)\s*)\)$/;
|
2369
|
+
return regexInteger.test(value) || regexPercent.test(value);
|
2370
|
+
}
|
2371
|
+
};
|
2372
|
+
}(window.jQuery));
|
2184
2373
|
;(function($) {
|
2185
2374
|
$.fn.bootstrapValidator.i18n.creditCard = $.extend($.fn.bootstrapValidator.i18n.creditCard || {}, {
|
2186
2375
|
'default': 'Please enter a valid credit card number'
|
@@ -2457,13 +2646,18 @@ if (typeof jQuery === 'undefined') {
|
|
2457
2646
|
}(window.jQuery));
|
2458
2647
|
;(function($) {
|
2459
2648
|
$.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {
|
2460
|
-
'default': 'Please enter a valid date'
|
2649
|
+
'default': 'Please enter a valid date',
|
2650
|
+
min: 'Please enter a date after %s',
|
2651
|
+
max: 'Please enter a date before %s',
|
2652
|
+
range: 'Please enter a date in the range %s - %s'
|
2461
2653
|
});
|
2462
2654
|
|
2463
2655
|
$.fn.bootstrapValidator.validators.date = {
|
2464
2656
|
html5Attributes: {
|
2465
2657
|
message: 'message',
|
2466
2658
|
format: 'format',
|
2659
|
+
min: 'min',
|
2660
|
+
max: 'max',
|
2467
2661
|
separator: 'separator'
|
2468
2662
|
},
|
2469
2663
|
|
@@ -2474,6 +2668,8 @@ if (typeof jQuery === 'undefined') {
|
|
2474
2668
|
* @param {jQuery} $field Field element
|
2475
2669
|
* @param {Object} options Can consist of the following keys:
|
2476
2670
|
* - message: The invalid message
|
2671
|
+
* - min: the minimum date
|
2672
|
+
* - max: the maximum date
|
2477
2673
|
* - separator: Use to separate the date, month, and year.
|
2478
2674
|
* By default, it is /
|
2479
2675
|
* - format: The date format. Default is MM/DD/YYYY
|
@@ -2483,7 +2679,7 @@ if (typeof jQuery === 'undefined') {
|
|
2483
2679
|
* ii) date and time:
|
2484
2680
|
* The time can consist of h, m, s parts which are separated by :
|
2485
2681
|
* ii) date, time and A (indicating AM or PM)
|
2486
|
-
* @returns {Boolean}
|
2682
|
+
* @returns {Boolean|Object}
|
2487
2683
|
*/
|
2488
2684
|
validate: function(validator, $field, options) {
|
2489
2685
|
var value = $field.val();
|
@@ -2507,7 +2703,10 @@ if (typeof jQuery === 'undefined') {
|
|
2507
2703
|
time = (sections.length > 1) ? sections[1] : null;
|
2508
2704
|
|
2509
2705
|
if (formats.length !== sections.length) {
|
2510
|
-
return
|
2706
|
+
return {
|
2707
|
+
valid: false,
|
2708
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2709
|
+
};
|
2511
2710
|
}
|
2512
2711
|
|
2513
2712
|
// Determine the separator
|
@@ -2516,14 +2715,20 @@ if (typeof jQuery === 'undefined') {
|
|
2516
2715
|
separator = (date.indexOf('/') !== -1) ? '/' : ((date.indexOf('-') !== -1) ? '-' : null);
|
2517
2716
|
}
|
2518
2717
|
if (separator === null || date.indexOf(separator) === -1) {
|
2519
|
-
return
|
2718
|
+
return {
|
2719
|
+
valid: false,
|
2720
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2721
|
+
};
|
2520
2722
|
}
|
2521
2723
|
|
2522
2724
|
// Determine the date
|
2523
2725
|
date = date.split(separator);
|
2524
2726
|
dateFormat = dateFormat.split(separator);
|
2525
2727
|
if (date.length !== dateFormat.length) {
|
2526
|
-
return
|
2728
|
+
return {
|
2729
|
+
valid: false,
|
2730
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2731
|
+
};
|
2527
2732
|
}
|
2528
2733
|
|
2529
2734
|
var year = date[$.inArray('YYYY', dateFormat)],
|
@@ -2531,7 +2736,10 @@ if (typeof jQuery === 'undefined') {
|
|
2531
2736
|
day = date[$.inArray('DD', dateFormat)];
|
2532
2737
|
|
2533
2738
|
if (!year || !month || !day || year.length !== 4) {
|
2534
|
-
return
|
2739
|
+
return {
|
2740
|
+
valid: false,
|
2741
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2742
|
+
};
|
2535
2743
|
}
|
2536
2744
|
|
2537
2745
|
// Determine the time
|
@@ -2541,7 +2749,10 @@ if (typeof jQuery === 'undefined') {
|
|
2541
2749
|
time = time.split(':');
|
2542
2750
|
|
2543
2751
|
if (timeFormat.length !== time.length) {
|
2544
|
-
return
|
2752
|
+
return {
|
2753
|
+
valid: false,
|
2754
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2755
|
+
};
|
2545
2756
|
}
|
2546
2757
|
|
2547
2758
|
hours = time.length > 0 ? time[0] : null;
|
@@ -2551,39 +2762,137 @@ if (typeof jQuery === 'undefined') {
|
|
2551
2762
|
// Validate seconds
|
2552
2763
|
if (seconds) {
|
2553
2764
|
if (isNaN(seconds) || seconds.length > 2) {
|
2554
|
-
return
|
2765
|
+
return {
|
2766
|
+
valid: false,
|
2767
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2768
|
+
};
|
2555
2769
|
}
|
2556
2770
|
seconds = parseInt(seconds, 10);
|
2557
2771
|
if (seconds < 0 || seconds > 60) {
|
2558
|
-
return
|
2772
|
+
return {
|
2773
|
+
valid: false,
|
2774
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2775
|
+
};
|
2559
2776
|
}
|
2560
2777
|
}
|
2561
2778
|
|
2562
2779
|
// Validate hours
|
2563
2780
|
if (hours) {
|
2564
2781
|
if (isNaN(hours) || hours.length > 2) {
|
2565
|
-
return
|
2782
|
+
return {
|
2783
|
+
valid: false,
|
2784
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2785
|
+
};
|
2566
2786
|
}
|
2567
2787
|
hours = parseInt(hours, 10);
|
2568
2788
|
if (hours < 0 || hours >= 24 || (amOrPm && hours > 12)) {
|
2569
|
-
return
|
2789
|
+
return {
|
2790
|
+
valid: false,
|
2791
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2792
|
+
};
|
2570
2793
|
}
|
2571
2794
|
}
|
2572
2795
|
|
2573
2796
|
// Validate minutes
|
2574
2797
|
if (minutes) {
|
2575
2798
|
if (isNaN(minutes) || minutes.length > 2) {
|
2576
|
-
return
|
2799
|
+
return {
|
2800
|
+
valid: false,
|
2801
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2802
|
+
};
|
2577
2803
|
}
|
2578
2804
|
minutes = parseInt(minutes, 10);
|
2579
2805
|
if (minutes < 0 || minutes > 59) {
|
2580
|
-
return
|
2806
|
+
return {
|
2807
|
+
valid: false,
|
2808
|
+
message: options.message || $.fn.bootstrapValidator.i18n.date['default']
|
2809
|
+
};
|
2581
2810
|
}
|
2582
2811
|
}
|
2583
2812
|
}
|
2584
2813
|
|
2585
2814
|
// Validate day, month, and year
|
2586
|
-
|
2815
|
+
var valid = $.fn.bootstrapValidator.helpers.date(year, month, day),
|
2816
|
+
message = options.message || $.fn.bootstrapValidator.i18n.date['default'];
|
2817
|
+
|
2818
|
+
// declare the date, min and max objects
|
2819
|
+
var min = null,
|
2820
|
+
max = null,
|
2821
|
+
minOption = options.min,
|
2822
|
+
maxOption = options.max;
|
2823
|
+
|
2824
|
+
if (minOption) {
|
2825
|
+
if (isNaN(Date.parse(minOption))) {
|
2826
|
+
minOption = validator.getDynamicOption($field, minOption);
|
2827
|
+
}
|
2828
|
+
min = this._parseDate(minOption, dateFormat, separator);
|
2829
|
+
}
|
2830
|
+
|
2831
|
+
if (maxOption) {
|
2832
|
+
if (isNaN(Date.parse(maxOption))) {
|
2833
|
+
maxOption = validator.getDynamicOption($field, maxOption);
|
2834
|
+
}
|
2835
|
+
max = this._parseDate(maxOption, dateFormat, separator);
|
2836
|
+
}
|
2837
|
+
|
2838
|
+
date = new Date(year, month, day, hours, minutes, seconds);
|
2839
|
+
|
2840
|
+
switch (true) {
|
2841
|
+
case (minOption && !maxOption && valid):
|
2842
|
+
valid = date.getTime() >= min.getTime();
|
2843
|
+
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.min, minOption);
|
2844
|
+
break;
|
2845
|
+
|
2846
|
+
case (maxOption && !minOption && valid):
|
2847
|
+
valid = date.getTime() <= max.getTime();
|
2848
|
+
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.max, maxOption);
|
2849
|
+
break;
|
2850
|
+
|
2851
|
+
case (maxOption && minOption && valid):
|
2852
|
+
valid = date.getTime() <= max.getTime() && date.getTime() >= min.getTime();
|
2853
|
+
message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.range, [minOption, maxOption]);
|
2854
|
+
break;
|
2855
|
+
|
2856
|
+
default:
|
2857
|
+
break;
|
2858
|
+
}
|
2859
|
+
|
2860
|
+
return {
|
2861
|
+
valid: valid,
|
2862
|
+
message: message
|
2863
|
+
};
|
2864
|
+
},
|
2865
|
+
|
2866
|
+
/**
|
2867
|
+
* Return a date object after parsing the date string
|
2868
|
+
*
|
2869
|
+
* @param {String} date The date string to parse
|
2870
|
+
* @param {String} format The date format
|
2871
|
+
* The format can be:
|
2872
|
+
* - date: Consist of DD, MM, YYYY parts which are separated by the separator option
|
2873
|
+
* - date and time:
|
2874
|
+
* The time can consist of h, m, s parts which are separated by :
|
2875
|
+
* @param {String} separator The separator used to separate the date, month, and year
|
2876
|
+
* @returns {Date}
|
2877
|
+
*/
|
2878
|
+
_parseDate: function(date, format, separator) {
|
2879
|
+
var minutes = 0, hours = 0, seconds = 0,
|
2880
|
+
sections = date.split(' '),
|
2881
|
+
dateSection = sections[0],
|
2882
|
+
timeSection = (sections.length > 1) ? sections[1] : null;
|
2883
|
+
|
2884
|
+
dateSection = dateSection.split(separator);
|
2885
|
+
var year = dateSection[$.inArray('YYYY', format)],
|
2886
|
+
month = dateSection[$.inArray('MM', format)],
|
2887
|
+
day = dateSection[$.inArray('DD', format)];
|
2888
|
+
if (timeSection) {
|
2889
|
+
timeSection = timeSection.split(':');
|
2890
|
+
hours = timeSection.length > 0 ? timeSection[0] : null;
|
2891
|
+
minutes = timeSection.length > 1 ? timeSection[1] : null;
|
2892
|
+
seconds = timeSection.length > 2 ? timeSection[2] : null;
|
2893
|
+
}
|
2894
|
+
|
2895
|
+
return new Date(year, month, day, hours, minutes, seconds);
|
2587
2896
|
}
|
2588
2897
|
};
|
2589
2898
|
}(window.jQuery));
|
@@ -2794,8 +3103,12 @@ if (typeof jQuery === 'undefined') {
|
|
2794
3103
|
$.fn.bootstrapValidator.validators.file = {
|
2795
3104
|
html5Attributes: {
|
2796
3105
|
extension: 'extension',
|
3106
|
+
maxfiles: 'maxFiles',
|
3107
|
+
minfiles: 'minFiles',
|
2797
3108
|
maxsize: 'maxSize',
|
2798
3109
|
minsize: 'minSize',
|
3110
|
+
maxtotalsize: 'maxTotalSize',
|
3111
|
+
mintotalsize: 'minTotalSize',
|
2799
3112
|
message: 'message',
|
2800
3113
|
type: 'type'
|
2801
3114
|
},
|
@@ -2807,8 +3120,12 @@ if (typeof jQuery === 'undefined') {
|
|
2807
3120
|
* @param {jQuery} $field Field element
|
2808
3121
|
* @param {Object} options Can consist of the following keys:
|
2809
3122
|
* - extension: The allowed extensions, separated by a comma
|
3123
|
+
* - maxFiles: The maximum number of files
|
3124
|
+
* - minFiles: The minimum number of files
|
2810
3125
|
* - maxSize: The maximum size in bytes
|
2811
|
-
* - minSize:
|
3126
|
+
* - minSize: The minimum size in bytes
|
3127
|
+
* - maxTotalSize: The maximum size in bytes for all files
|
3128
|
+
* - minTotalSize: The minimum size in bytes for all files
|
2812
3129
|
* - message: The invalid message
|
2813
3130
|
* - type: The allowed MIME type, separated by a comma
|
2814
3131
|
* @returns {Boolean}
|
@@ -2826,29 +3143,33 @@ if (typeof jQuery === 'undefined') {
|
|
2826
3143
|
|
2827
3144
|
if (html5) {
|
2828
3145
|
// Get FileList instance
|
2829
|
-
var files
|
2830
|
-
total
|
3146
|
+
var files = $field.get(0).files,
|
3147
|
+
total = files.length,
|
3148
|
+
totalSize = 0;
|
3149
|
+
|
3150
|
+
if ((options.maxFiles && total > parseInt(options.maxFiles, 10)) // Check the maxFiles
|
3151
|
+
|| (options.minFiles && total < parseInt(options.minFiles, 10))) // Check the minFiles
|
3152
|
+
{
|
3153
|
+
return false;
|
3154
|
+
}
|
3155
|
+
|
2831
3156
|
for (var i = 0; i < total; i++) {
|
2832
|
-
|
2833
|
-
|
2834
|
-
return false;
|
2835
|
-
}
|
2836
|
-
|
2837
|
-
// Check the maxSize
|
2838
|
-
if (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) {
|
2839
|
-
return false;
|
2840
|
-
}
|
3157
|
+
totalSize += files[i].size;
|
3158
|
+
ext = files[i].name.substr(files[i].name.lastIndexOf('.') + 1);
|
2841
3159
|
|
2842
|
-
// Check
|
2843
|
-
|
2844
|
-
|
3160
|
+
if ((options.minSize && files[i].size < parseInt(options.minSize, 10)) // Check the minSize
|
3161
|
+
|| (options.maxSize && files[i].size > parseInt(options.maxSize, 10)) // Check the maxSize
|
3162
|
+
|| (extensions && $.inArray(ext.toLowerCase(), extensions) === -1) // Check file extension
|
3163
|
+
|| (files[i].type && types && $.inArray(files[i].type.toLowerCase(), types) === -1)) // Check file type
|
3164
|
+
{
|
2845
3165
|
return false;
|
2846
3166
|
}
|
3167
|
+
}
|
2847
3168
|
|
2848
|
-
|
2849
|
-
|
2850
|
-
|
2851
|
-
|
3169
|
+
if ((options.maxTotalSize && totalSize > parseInt(options.maxTotalSize, 10)) // Check the maxTotalSize
|
3170
|
+
|| (options.minTotalSize && totalSize < parseInt(options.minTotalSize, 10))) // Check the minTotalSize
|
3171
|
+
{
|
3172
|
+
return false;
|
2852
3173
|
}
|
2853
3174
|
} else {
|
2854
3175
|
// Check file extension
|
@@ -2908,21 +3229,29 @@ if (typeof jQuery === 'undefined') {
|
|
2908
3229
|
if (value === '') {
|
2909
3230
|
return true;
|
2910
3231
|
}
|
3232
|
+
|
3233
|
+
value = this._format(value);
|
2911
3234
|
if (!$.isNumeric(value)) {
|
2912
3235
|
return false;
|
2913
3236
|
}
|
2914
3237
|
|
2915
|
-
var compareTo
|
3238
|
+
var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value),
|
3239
|
+
compareToValue = this._format(compareTo);
|
3240
|
+
|
2916
3241
|
value = parseFloat(value);
|
2917
3242
|
return (options.inclusive === true || options.inclusive === undefined)
|
2918
3243
|
? {
|
2919
|
-
valid: value >=
|
3244
|
+
valid: value >= compareToValue,
|
2920
3245
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan['default'], compareTo)
|
2921
3246
|
}
|
2922
3247
|
: {
|
2923
|
-
valid: value >
|
3248
|
+
valid: value > compareToValue,
|
2924
3249
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.greaterThan.notInclusive, compareTo)
|
2925
3250
|
};
|
3251
|
+
},
|
3252
|
+
|
3253
|
+
_format: function(value) {
|
3254
|
+
return (value + '').replace(',', '.');
|
2926
3255
|
}
|
2927
3256
|
};
|
2928
3257
|
}(window.jQuery));
|
@@ -3012,7 +3341,12 @@ if (typeof jQuery === 'undefined') {
|
|
3012
3341
|
if (value === '') {
|
3013
3342
|
return true;
|
3014
3343
|
}
|
3015
|
-
|
3344
|
+
|
3345
|
+
return ('color' === $field.attr('type'))
|
3346
|
+
// Only accept 6 hex character values due to the HTML 5 spec
|
3347
|
+
// See http://www.w3.org/TR/html-markup/input.color.html#input.color.attrs.value
|
3348
|
+
? /^#[0-9A-F]{6}$/i.test(value)
|
3349
|
+
: /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(value);
|
3016
3350
|
}
|
3017
3351
|
};
|
3018
3352
|
}(window.jQuery));
|
@@ -3045,7 +3379,7 @@ if (typeof jQuery === 'undefined') {
|
|
3045
3379
|
CZ: 'Czech Republic',
|
3046
3380
|
DE: 'Germany',
|
3047
3381
|
DK: 'Denmark',
|
3048
|
-
DO: '
|
3382
|
+
DO: 'Dominican Republic',
|
3049
3383
|
DZ: 'Algeria',
|
3050
3384
|
EE: 'Estonia',
|
3051
3385
|
ES: 'Spain',
|
@@ -5157,21 +5491,29 @@ if (typeof jQuery === 'undefined') {
|
|
5157
5491
|
if (value === '') {
|
5158
5492
|
return true;
|
5159
5493
|
}
|
5494
|
+
|
5495
|
+
value = this._format(value);
|
5160
5496
|
if (!$.isNumeric(value)) {
|
5161
5497
|
return false;
|
5162
5498
|
}
|
5163
5499
|
|
5164
|
-
var compareTo
|
5500
|
+
var compareTo = $.isNumeric(options.value) ? options.value : validator.getDynamicOption($field, options.value),
|
5501
|
+
compareToValue = this._format(compareTo);
|
5502
|
+
|
5165
5503
|
value = parseFloat(value);
|
5166
5504
|
return (options.inclusive === true || options.inclusive === undefined)
|
5167
5505
|
? {
|
5168
|
-
valid: value <=
|
5506
|
+
valid: value <= compareToValue,
|
5169
5507
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan['default'], compareTo)
|
5170
5508
|
}
|
5171
5509
|
: {
|
5172
|
-
valid: value <
|
5510
|
+
valid: value < compareToValue,
|
5173
5511
|
message: $.fn.bootstrapValidator.helpers.format(options.message || $.fn.bootstrapValidator.i18n.lessThan.notInclusive, compareTo)
|
5174
5512
|
};
|
5513
|
+
},
|
5514
|
+
|
5515
|
+
_format: function(value) {
|
5516
|
+
return (value + '').replace(',', '.');
|
5175
5517
|
}
|
5176
5518
|
};
|
5177
5519
|
}(window.jQuery));
|
@@ -5371,6 +5713,7 @@ if (typeof jQuery === 'undefined') {
|
|
5371
5713
|
BR: 'Brazil',
|
5372
5714
|
CN: 'China',
|
5373
5715
|
CZ: 'Czech Republic',
|
5716
|
+
DE: 'Germany',
|
5374
5717
|
DK: 'Denmark',
|
5375
5718
|
ES: 'Spain',
|
5376
5719
|
FR: 'France',
|
@@ -5393,7 +5736,7 @@ if (typeof jQuery === 'undefined') {
|
|
5393
5736
|
},
|
5394
5737
|
|
5395
5738
|
// The supported countries
|
5396
|
-
COUNTRY_CODES: ['BR', 'CN', 'CZ', 'DK', 'ES', 'FR', 'GB', 'MA', 'PK', 'RO', 'RU', 'SK', 'TH', 'US', 'VE'],
|
5739
|
+
COUNTRY_CODES: ['BR', 'CN', 'CZ', 'DE', 'DK', 'ES', 'FR', 'GB', 'MA', 'PK', 'RO', 'RU', 'SK', 'TH', 'US', 'VE'],
|
5397
5740
|
|
5398
5741
|
/**
|
5399
5742
|
* Return true if the input value contains a valid phone number for the country
|
@@ -5449,6 +5792,12 @@ if (typeof jQuery === 'undefined') {
|
|
5449
5792
|
isValid = /^(((00)([- ]?)|\+)(420)([- ]?))?((\d{3})([- ]?)){2}(\d{3})$/.test(value);
|
5450
5793
|
break;
|
5451
5794
|
|
5795
|
+
case 'DE':
|
5796
|
+
// Test: http://regexr.com/39pkg
|
5797
|
+
value = $.trim(value);
|
5798
|
+
isValid = (/^(((((((00|\+)49[ \-/]?)|0)[1-9][0-9]{1,4})[ \-/]?)|((((00|\+)49\()|\(0)[1-9][0-9]{1,4}\)[ \-/]?))[0-9]{1,7}([ \-/]?[0-9]{1,5})?)$/).test(value);
|
5799
|
+
break;
|
5800
|
+
|
5452
5801
|
case 'DK':
|
5453
5802
|
// Mathing DK phone numbers with country code in 1 of 3 formats and an
|
5454
5803
|
// 8 digit phone number not starting with a 0 or 1. Can have 1 space
|
@@ -5589,6 +5938,7 @@ if (typeof jQuery === 'undefined') {
|
|
5589
5938
|
name: 'name',
|
5590
5939
|
type: 'type',
|
5591
5940
|
url: 'url',
|
5941
|
+
data: 'data',
|
5592
5942
|
delay: 'delay'
|
5593
5943
|
},
|
5594
5944
|
|
@@ -5639,6 +5989,11 @@ if (typeof jQuery === 'undefined') {
|
|
5639
5989
|
data = data.call(this, validator);
|
5640
5990
|
}
|
5641
5991
|
|
5992
|
+
// Parse string data from HTML5 attribute
|
5993
|
+
if ('string' === typeof data) {
|
5994
|
+
data = JSON.parse(data);
|
5995
|
+
}
|
5996
|
+
|
5642
5997
|
// Support dynamic url
|
5643
5998
|
if ('function' === typeof url) {
|
5644
5999
|
url = url.call(this, validator);
|
@@ -5936,7 +6291,9 @@ if (typeof jQuery === 'undefined') {
|
|
5936
6291
|
html5Attributes: {
|
5937
6292
|
message: 'message',
|
5938
6293
|
min: 'min',
|
5939
|
-
max: 'max'
|
6294
|
+
max: 'max',
|
6295
|
+
trim: 'trim',
|
6296
|
+
utf8bytes: 'utf8Bytes'
|
5940
6297
|
},
|
5941
6298
|
|
5942
6299
|
enableByHtml5: function($field) {
|
@@ -5969,19 +6326,41 @@ if (typeof jQuery === 'undefined') {
|
|
5969
6326
|
* - A callback function that returns the number
|
5970
6327
|
*
|
5971
6328
|
* - message: The invalid message
|
6329
|
+
* - trim: Indicate the length will be calculated after trimming the value or not. It is false, by default
|
6330
|
+
* - utf8bytes: Evaluate string length in UTF-8 bytes, default to false
|
5972
6331
|
* @returns {Object}
|
5973
6332
|
*/
|
5974
6333
|
validate: function(validator, $field, options) {
|
5975
6334
|
var value = $field.val();
|
6335
|
+
if (options.trim === true || options.trim === 'true') {
|
6336
|
+
value = $.trim(value);
|
6337
|
+
}
|
6338
|
+
|
5976
6339
|
if (value === '') {
|
5977
6340
|
return true;
|
5978
6341
|
}
|
5979
6342
|
|
5980
|
-
var min
|
5981
|
-
max
|
5982
|
-
|
5983
|
-
|
5984
|
-
|
6343
|
+
var min = $.isNumeric(options.min) ? options.min : validator.getDynamicOption($field, options.min),
|
6344
|
+
max = $.isNumeric(options.max) ? options.max : validator.getDynamicOption($field, options.max),
|
6345
|
+
// Credit to http://stackoverflow.com/a/23329386 (@lovasoa) for UTF-8 byte length code
|
6346
|
+
utf8Length = function(str) {
|
6347
|
+
var s = str.length;
|
6348
|
+
for (var i = str.length - 1; i >= 0; i--) {
|
6349
|
+
var code = str.charCodeAt(i);
|
6350
|
+
if (code > 0x7f && code <= 0x7ff) {
|
6351
|
+
s++;
|
6352
|
+
} else if (code > 0x7ff && code <= 0xffff) {
|
6353
|
+
s += 2;
|
6354
|
+
}
|
6355
|
+
if (code >= 0xDC00 && code <= 0xDFFF) {
|
6356
|
+
i--;
|
6357
|
+
}
|
6358
|
+
}
|
6359
|
+
return s;
|
6360
|
+
},
|
6361
|
+
length = options.utf8Bytes ? utf8Length(value) : value.length,
|
6362
|
+
isValid = true,
|
6363
|
+
message = options.message || $.fn.bootstrapValidator.i18n.stringLength['default'];
|
5985
6364
|
|
5986
6365
|
if ((min && length < parseInt(min, 10)) || (max && length > parseInt(max, 10))) {
|
5987
6366
|
isValid = false;
|
@@ -7635,14 +8014,20 @@ if (typeof jQuery === 'undefined') {
|
|
7635
8014
|
countryNotSupported: 'The country code %s is not supported',
|
7636
8015
|
country: 'Please enter a valid postal code in %s',
|
7637
8016
|
countries: {
|
8017
|
+
AT: 'Austria',
|
7638
8018
|
BR: 'Brazil',
|
7639
8019
|
CA: 'Canada',
|
8020
|
+
CH: 'Switzerland',
|
7640
8021
|
CZ: 'Czech Republic',
|
8022
|
+
DE: 'Germany',
|
7641
8023
|
DK: 'Denmark',
|
8024
|
+
FR: 'France',
|
7642
8025
|
GB: 'United Kingdom',
|
8026
|
+
IE: 'Ireland',
|
7643
8027
|
IT: 'Italy',
|
7644
8028
|
MA: 'Morocco',
|
7645
8029
|
NL: 'Netherlands',
|
8030
|
+
PT: 'Portugal',
|
7646
8031
|
RO: 'Romania',
|
7647
8032
|
RU: 'Russia',
|
7648
8033
|
SE: 'Sweden',
|
@@ -7658,7 +8043,7 @@ if (typeof jQuery === 'undefined') {
|
|
7658
8043
|
country: 'country'
|
7659
8044
|
},
|
7660
8045
|
|
7661
|
-
COUNTRY_CODES: ['BR', 'CA', 'CZ', 'DK', 'GB', 'IT', 'MA', 'NL', 'RO', 'RU', 'SE', 'SG', 'SK', 'US'],
|
8046
|
+
COUNTRY_CODES: [ 'AT', 'BR', 'CA', 'CH', 'CZ', 'DE', 'DK', 'FR', 'GB', 'IE', 'IT', 'MA', 'NL', 'PT', 'RO', 'RU', 'SE', 'SG', 'SK', 'US'],
|
7662
8047
|
|
7663
8048
|
/**
|
7664
8049
|
* Return true if and only if the input value is a valid country zip code
|
@@ -7702,6 +8087,11 @@ if (typeof jQuery === 'undefined') {
|
|
7702
8087
|
var isValid = false;
|
7703
8088
|
country = country.toUpperCase();
|
7704
8089
|
switch (country) {
|
8090
|
+
// http://en.wikipedia.org/wiki/List_of_postal_codes_in_Austria
|
8091
|
+
case 'AT':
|
8092
|
+
isValid = /^([1-9]{1})(\d{3})$/.test(value);
|
8093
|
+
break;
|
8094
|
+
|
7705
8095
|
case 'BR':
|
7706
8096
|
isValid = /^(\d{2})([\.]?)(\d{3})([\-]?)(\d{3})$/.test(value);
|
7707
8097
|
break;
|
@@ -7710,19 +8100,39 @@ if (typeof jQuery === 'undefined') {
|
|
7710
8100
|
isValid = /^(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|X|Y){1}[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}\s?[0-9]{1}(?:A|B|C|E|G|H|J|K|L|M|N|P|R|S|T|V|W|X|Y|Z){1}[0-9]{1}$/i.test(value);
|
7711
8101
|
break;
|
7712
8102
|
|
8103
|
+
case 'CH':
|
8104
|
+
isValid = /^([1-9]{1})(\d{3})$/.test(value);
|
8105
|
+
break;
|
8106
|
+
|
7713
8107
|
case 'CZ':
|
7714
8108
|
// Test: http://regexr.com/39hhr
|
7715
8109
|
isValid = /^(\d{3})([ ]?)(\d{2})$/.test(value);
|
7716
8110
|
break;
|
7717
8111
|
|
8112
|
+
// http://stackoverflow.com/questions/7926687/regular-expression-german-zip-codes
|
8113
|
+
case 'DE':
|
8114
|
+
isValid = /^(?!01000|99999)(0[1-9]\d{3}|[1-9]\d{4})$/.test(value);
|
8115
|
+
break;
|
8116
|
+
|
7718
8117
|
case 'DK':
|
7719
8118
|
isValid = /^(DK(-|\s)?)?\d{4}$/i.test(value);
|
7720
8119
|
break;
|
7721
8120
|
|
8121
|
+
// http://en.wikipedia.org/wiki/Postal_codes_in_France
|
8122
|
+
case 'FR':
|
8123
|
+
isValid = /^[0-9]{5}$/i.test(value);
|
8124
|
+
break;
|
8125
|
+
|
7722
8126
|
case 'GB':
|
7723
8127
|
isValid = this._gb(value);
|
7724
8128
|
break;
|
7725
8129
|
|
8130
|
+
// http://www.eircode.ie/docs/default-source/Common/prepare-your-business-for-eircode---published-v2.pdf?sfvrsn=2
|
8131
|
+
// Test: http://refiddle.com/1kpl
|
8132
|
+
case 'IE':
|
8133
|
+
isValid = /^(D6W|[ACDEFHKNPRTVWXY]\d{2})\s[0-9ACDEFHKNPRTVWXY]{4}$/.test(value);
|
8134
|
+
break;
|
8135
|
+
|
7726
8136
|
// http://en.wikipedia.org/wiki/List_of_postal_codes_in_Italy
|
7727
8137
|
case 'IT':
|
7728
8138
|
isValid = /^(I-|IT-)?\d{5}$/i.test(value);
|
@@ -7737,7 +8147,12 @@ if (typeof jQuery === 'undefined') {
|
|
7737
8147
|
case 'NL':
|
7738
8148
|
isValid = /^[1-9][0-9]{3} ?(?!sa|sd|ss)[a-z]{2}$/i.test(value);
|
7739
8149
|
break;
|
7740
|
-
|
8150
|
+
|
8151
|
+
// Test: http://refiddle.com/1l2t
|
8152
|
+
case 'PT':
|
8153
|
+
isValid = /^[1-9]\d{3}-\d{3}$/.test(value);
|
8154
|
+
break;
|
8155
|
+
|
7741
8156
|
case 'RO':
|
7742
8157
|
isValid = /^(0[1-8]{1}|[1-9]{1}[0-5]{1})?[0-9]{4}$/i.test(value);
|
7743
8158
|
break;
|
@@ -7752,7 +8167,7 @@ if (typeof jQuery === 'undefined') {
|
|
7752
8167
|
|
7753
8168
|
case 'SG':
|
7754
8169
|
isValid = /^([0][1-9]|[1-6][0-9]|[7]([0-3]|[5-9])|[8][0-2])(\d{4})$/i.test(value);
|
7755
|
-
break;
|
8170
|
+
break;
|
7756
8171
|
|
7757
8172
|
case 'SK':
|
7758
8173
|
// Test: http://regexr.com/39hhr
|