Browse Source

#465: Refactoring id validator

phuoc 11 years ago
parent
commit
494c500865

+ 1 - 1
dist/css/bootstrapValidator.min.css

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.0-dev, built on 2014-07-05 10:32:32 PM
+ * @version     v0.5.0-dev, built on 2014-07-06 8:06:34 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT

+ 29 - 25
dist/js/bootstrapValidator.js

@@ -2,7 +2,7 @@
  * BootstrapValidator (http://bootstrapvalidator.com)
  * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
  *
- * @version     v0.5.0-dev, built on 2014-07-05 10:32:32 PM
+ * @version     v0.5.0-dev, built on 2014-07-06 8:06:34 AM
  * @author      https://twitter.com/nghuuphuoc
  * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
  * @license     MIT
@@ -2948,23 +2948,6 @@
             SK: 'Slovak',
             SM: 'San Marino',
             ZA: 'South African'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country.toLowerCase(),
-                    method  = ['_', country].join('');
-                if ($.fn.bootstrapValidator.validators.id[method] === undefined) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, country);
-                }
-
-                country = country.toUpperCase();
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -2974,6 +2957,11 @@
             country: 'country'
         },
 
+        COUNTRY_CODES: [
+            'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
+            'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'
+        ],
+
         /**
          * Validate identification number in different countries
          *
@@ -2982,8 +2970,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Consist of key:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - One of country code defined in COUNTRY_CODES
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -2991,13 +2983,25 @@
                 return true;
             }
 
-            var country = options.country || value.substr(0, 2),
-                method  = ['_', country.toLowerCase()].join('');
-            if (this[method] && 'function' === typeof this[method]) {
-                return this[method](value);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
             }
 
-            return false;
+            if ($.inArray(country, this.COUNTRY_CODES) === -1) {
+                return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.countryNotSupported, country) };
+            }
+
+            var method  = ['_', country.toLowerCase()].join('');
+            return this[method](value)
+                    ? true
+                    : {
+                        valid: false,
+                        message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.country, $.fn.bootstrapValidator.i18n.id.countries[country.toUpperCase()])
+                    };
         },
 
         /**

File diff suppressed because it is too large
+ 3 - 3
dist/js/bootstrapValidator.min.js


+ 28 - 24
src/js/validator/id.js

@@ -29,23 +29,6 @@
             SK: 'Slovak',
             SM: 'San Marino',
             ZA: 'South African'
-        },
-
-        getMessage: function(options) {
-            if (options.country) {
-                var country = options.country.toLowerCase(),
-                    method  = ['_', country].join('');
-                if ($.fn.bootstrapValidator.validators.id[method] === undefined) {
-                    return $.fn.bootstrapValidator.helpers.format(this.countryNotSupported, country);
-                }
-
-                country = country.toUpperCase();
-                if (this.countries[country]) {
-                    return $.fn.bootstrapValidator.helpers.format(this.country, this.countries[country]);
-                }
-            }
-
-            return this['default'];
         }
     });
 
@@ -55,6 +38,11 @@
             country: 'country'
         },
 
+        COUNTRY_CODES: [
+            'BA', 'BG', 'BR', 'CH', 'CL', 'CZ', 'DK', 'EE', 'ES', 'FI', 'HR', 'IE', 'IS', 'LT', 'LV', 'ME', 'MK', 'NL',
+            'RO', 'RS', 'SE', 'SI', 'SK', 'SM', 'ZA'
+        ],
+
         /**
          * Validate identification number in different countries
          *
@@ -63,8 +51,12 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Consist of key:
          * - message: The invalid message
-         * - country: The ISO 3166-1 country code
-         * @returns {Boolean}
+         * - country: The ISO 3166-1 country code. It can be
+         *      - One of country code defined in COUNTRY_CODES
+         *      - Name of field which its value defines the country code
+         *      - Name of callback function that returns the country code
+         *      - A callback function that returns the country code
+         * @returns {Boolean|Object}
          */
         validate: function(validator, $field, options) {
             var value = $field.val();
@@ -72,13 +64,25 @@
                 return true;
             }
 
-            var country = options.country || value.substr(0, 2),
-                method  = ['_', country.toLowerCase()].join('');
-            if (this[method] && 'function' === typeof this[method]) {
-                return this[method](value);
+            var country = options.country;
+            if (!country) {
+                country = value.substr(0, 2);
+            } else if (typeof country !== 'string' || $.inArray(country.toUpperCase(), this.COUNTRY_CODES) === -1) {
+                // Determine the country code
+                country = validator.getDynamicOption(country, $field);
+            }
+
+            if ($.inArray(country, this.COUNTRY_CODES) === -1) {
+                return { valid: false, message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.countryNotSupported, country) };
             }
 
-            return false;
+            var method  = ['_', country.toLowerCase()].join('');
+            return this[method](value)
+                    ? true
+                    : {
+                        valid: false,
+                        message: $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.id.country, $.fn.bootstrapValidator.i18n.id.countries[country.toUpperCase()])
+                    };
         },
 
         /**

+ 53 - 7
test/spec.js

@@ -2402,28 +2402,74 @@ describe('iban', function() {
 
 describe('id', function() {
     beforeEach(function () {
-        var html = [
+        $([
             '<form class="form-horizontal" id="idForm">',
                 '<div class="form-group">',
-                    '<input type="text" name="id" data-bv-id />',
+                    '<select class="form-control" name="country">',
+                        '<option value="BA">Bosnia and Herzegovina</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="BR">Brazil</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="CL">Chile</option>',
+                        '<option value="CZ">Czech</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IS">Iceland</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="ME">Montenegro</option>',
+                        '<option value="MK">Macedonia</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="SI">Slovenia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SM">San Marino</option>',
+                        '<option value="ZA">South Africa</option>',
+                    '</select>',
                 '</div>',
-            '</form>',
-        ].join('\n');
+                '<div class="form-group">',
+                    '<input class="form-control" type="text" name="id" data-bv-id />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
 
-        $(html).appendTo('body');
         $('#idForm').bootstrapValidator();
 
         /**
          * @type {BootstrapValidator}
          */
-        this.bv  = $('#idForm').data('bootstrapValidator');
-        this.$id = this.bv.getFieldElements('id');
+        this.bv       = $('#idForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$id      = this.bv.getFieldElements('id');
     });
 
     afterEach(function () {
         $('#idForm').bootstrapValidator('destroy').remove();
     });
 
+    it('dynamic country', function() {
+        this.$id.attr('data-bv-id-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#idForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('BG');
+        this.$id.val('7552010005');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BR');
+        this.$id.val('231.002.999-00');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Bulgarian national identification number (EGN)', function() {
         this.bv.updateOption('id', 'id', 'country', 'BG');
 

+ 53 - 7
test/spec/validator/id.js

@@ -1,27 +1,73 @@
 describe('id', function() {
     beforeEach(function () {
-        var html = [
+        $([
             '<form class="form-horizontal" id="idForm">',
                 '<div class="form-group">',
-                    '<input type="text" name="id" data-bv-id />',
+                    '<select class="form-control" name="country">',
+                        '<option value="BA">Bosnia and Herzegovina</option>',
+                        '<option value="BG">Bulgaria</option>',
+                        '<option value="BR">Brazil</option>',
+                        '<option value="CH">Switzerland</option>',
+                        '<option value="CL">Chile</option>',
+                        '<option value="CZ">Czech</option>',
+                        '<option value="DK">Denmark</option>',
+                        '<option value="EE">Estonia</option>',
+                        '<option value="ES">Spain</option>',
+                        '<option value="FI">Finland</option>',
+                        '<option value="HR">Croatia</option>',
+                        '<option value="IE">Ireland</option>',
+                        '<option value="IS">Iceland</option>',
+                        '<option value="LT">Lithuania</option>',
+                        '<option value="LV">Latvia</option>',
+                        '<option value="ME">Montenegro</option>',
+                        '<option value="MK">Macedonia</option>',
+                        '<option value="NL">Netherlands</option>',
+                        '<option value="RO">Romania</option>',
+                        '<option value="RS">Serbia</option>',
+                        '<option value="SE">Sweden</option>',
+                        '<option value="SI">Slovenia</option>',
+                        '<option value="SK">Slovakia</option>',
+                        '<option value="SM">San Marino</option>',
+                        '<option value="ZA">South Africa</option>',
+                    '</select>',
                 '</div>',
-            '</form>',
-        ].join('\n');
+                '<div class="form-group">',
+                    '<input class="form-control" type="text" name="id" data-bv-id />',
+                '</div>',
+            '</form>'
+        ].join('\n')).appendTo('body');
 
-        $(html).appendTo('body');
         $('#idForm').bootstrapValidator();
 
         /**
          * @type {BootstrapValidator}
          */
-        this.bv  = $('#idForm').data('bootstrapValidator');
-        this.$id = this.bv.getFieldElements('id');
+        this.bv       = $('#idForm').data('bootstrapValidator');
+        this.$country = this.bv.getFieldElements('country');
+        this.$id      = this.bv.getFieldElements('id');
     });
 
     afterEach(function () {
         $('#idForm').bootstrapValidator('destroy').remove();
     });
 
+    it('dynamic country', function() {
+        this.$id.attr('data-bv-id-country', 'country');
+        this.bv.destroy();
+        this.bv = $('#idForm').bootstrapValidator().data('bootstrapValidator');
+
+        this.$country.val('BG');
+        this.$id.val('7552010005');
+        this.bv.validate();
+        expect(this.bv.isValid()).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$country.val('BR');
+        this.$id.val('231.002.999-00');
+        this.bv.validate();
+        expect(this.bv.isValid()).toEqual(false);
+    });
+
     it('Bulgarian national identification number (EGN)', function() {
         this.bv.updateOption('id', 'id', 'country', 'BG');