ソースを参照

- #807 : Add min and max options to date validator.
- Add test suite for max and min options.

BRAHIM 11 年 前
コミット
c3e6884c38
2 ファイル変更457 行追加4 行削除
  1. 68 2
      src/js/validator/date.js
  2. 389 2
      test/spec/validator/date.js

+ 68 - 2
src/js/validator/date.js

@@ -1,12 +1,17 @@
 (function($) {
     $.fn.bootstrapValidator.i18n.date = $.extend($.fn.bootstrapValidator.i18n.date || {}, {
-        'default': 'Please enter a valid date'
+        'default': 'Please enter a valid date',
+        min  : 'Please enter a date after %s',
+        max  : 'Please enter a date before %s',
+        range : 'Please enter a date in the range %s - %s'
     });
 
     $.fn.bootstrapValidator.validators.date = {
         html5Attributes: {
             message: 'message',
             format: 'format',
+            min: 'min',
+            max: 'max',
             separator: 'separator'
         },
 
@@ -17,6 +22,8 @@
          * @param {jQuery} $field Field element
          * @param {Object} options Can consist of the following keys:
          * - message: The invalid message
+         * - min: the minimum date
+         * - max: the maximum date
          * - separator: Use to separate the date, month, and year.
          * By default, it is /
          * - format: The date format. Default is MM/DD/YYYY
@@ -125,8 +132,67 @@
                 }
             }
 
+            var valid = false, message;
+
             // Validate day, month, and year
-            return $.fn.bootstrapValidator.helpers.date(year, month, day);
+            valid   = $.fn.bootstrapValidator.helpers.date(year, month, day);
+            message = $.fn.bootstrapValidator.i18n.date['default'];
+
+            // declare the date, min and max objects
+            var date = null, min = null, max = null;
+
+            if(options.min) {
+                min = this.parseDate(options.min, dateFormat, separator);
+            }
+
+            if(options.max) {
+                max = this.parseDate(options.max, dateFormat, separator);
+            }
+
+            var date = new Date(year, month, day, hours, minutes, seconds);
+
+            switch(true) {
+                case(options.min && !options.max && valid):
+                    valid   = date.getTime() >= min.getTime();
+                    message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.min, options.min);
+                    break;
+
+                case(options.max && !options.min && valid):
+                    valid   = date.getTime() <= max.getTime();
+                    message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.max, options.max);
+                    break;
+
+                case(options.max && options.min && valid):
+                    valid   = date.getTime() <= max.getTime() && date.getTime() >= min.getTime();
+                    message = options.message || $.fn.bootstrapValidator.helpers.format($.fn.bootstrapValidator.i18n.date.range, [options.min, options.max]);
+                    break;
+            }
+
+            return {
+                valid: valid,
+                message: message
+            };
+        },
+
+        parseDate: function(date, format, separator) {
+            var year = 0, month = 0, day = 0, minutes = 0, hours = 0, seconds = 0,
+                sections    = date.split(' '),
+                dateSection = sections[0],
+                timeSection = (sections.length > 1) ? sections[1] : null;
+
+            dateSection  = dateSection.split(separator);
+            year  = dateSection[$.inArray('YYYY', format)];
+            month = dateSection[$.inArray('MM', format)];
+            day   = dateSection[$.inArray('DD', format)];
+            if(timeSection) {
+                timeSection = timeSection.split(':');
+                hours       = timeSection.length > 0 ? timeSection[0] : null;
+                minutes     = timeSection.length > 1 ? timeSection[1] : null;
+                seconds     = timeSection.length > 2 ? timeSection[2] : null;
+            }
+
+            return new Date(year, month, day, hours, minutes, seconds);
         }
+
     };
 }(window.jQuery));

+ 389 - 2
test/spec/validator/date.js

@@ -6,13 +6,25 @@ describe('date', function() {
                 '<div class="form-group">',
                     '<input type="text" name="date" data-bv-date />',
                 '</div>',
+                '<div class="form-group">',
+                    '<input type="text" name="minDate" data-bv-date data-bv-date-min="" />',
+                '</div>',
+                '<div class="form-group">',
+                    '<input type="text" name="maxDate" data-bv-date data-bv-date-max="" />',
+                '</div>',
+                '<div class="form-group">',
+                    '<input type="text" name="range" data-bv-date data-bv-date-min="" data-bv-date-max="" />',
+                '</div>',
             '</form>'
         ].join('\n')).appendTo('body');
 
         $('#dateForm').bootstrapValidator();
 
-        this.bv    = $('#dateForm').data('bootstrapValidator');
-        this.$date = this.bv.getFieldElements('date');
+        this.bv       = $('#dateForm').data('bootstrapValidator');
+        this.$date    = this.bv.getFieldElements('date');
+        this.$minDate = this.bv.getFieldElements('minDate');
+        this.$maxDate = this.bv.getFieldElements('maxDate');
+        this.$range   = this.bv.getFieldElements('range');
     });
 
     afterEach(function() {
@@ -186,4 +198,379 @@ describe('date', function() {
         this.bv.validate();
         expect(this.bv.isValid()).toBeTruthy();
     });
+
+    // min test suite
+    it('min date format YYYY/MM/DD', function() {
+        this.bv.updateOption('minDate', 'date', 'format', 'YYYY/MM/DD');
+        this.bv.updateOption('minDate', 'date', 'min', '2010/01/01');
+
+        this.$minDate.val('2010/01/02');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2010/01/002'); // day prefexid by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2014/08/17');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2009/12/31');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2000/01/01');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+    });
+
+    it('min date format YYYY-MM-DD', function() {
+        this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD');
+        this.bv.updateOption('minDate', 'date', 'min', '2010-01-01');
+
+        this.$minDate.val('2010-01-02');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2010-001-02'); // month prefexid by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2014-08-17');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2000-01-01');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+    });
+
+    it('min date format DD/MM/YYYY', function() {
+        this.bv.updateOption('minDate', 'date', 'format', 'DD/MM/YYYY');
+        this.bv.updateOption('minDate', 'date', 'min', '01/01/2010');
+
+        this.$minDate.val('02/01/2010');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('17/08/2014');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('02/01/02010'); // year prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('31/12/2009');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('01/01/2000');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+    });
+
+    it('min date format YYYY-MM-DD h:m:s', function() {
+        this.bv.updateOption('minDate', 'date', 'format', 'YYYY-MM-DD h:m:s');
+        this.bv.updateOption('minDate', 'date', 'min', '2010-01-01 01:00:00');
+
+        this.bv.resetForm();
+        this.$minDate.val('2010-01-01 01:00:01');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.$minDate.val('2010-01-02 01:00:01');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2014-08-17 12:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31 00:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31 010:00:00'); // hours prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31 10:001:00'); // minutes prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31 10:01:012'); // seconds prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2009-12-31 00:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$minDate.val('2000-01-01 23:00:12');
+        this.bv.validate();
+        expect(this.bv.isValidField('minDate')).toEqual(false);
+    });
+
+    // max test suite
+    it('max date format YYYY/MM/DD', function() {
+        this.bv.updateOption('maxDate', 'date', 'format', 'YYYY/MM/DD');
+        this.bv.updateOption('maxDate', 'date', 'max', '2014/09/10');
+
+        this.$maxDate.val('2014/09/09');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014/08/17');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('02014/012/031'); // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014/12/31');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2015/01/01');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+    });
+
+    it('max date format YYYY-MM-DD', function() {
+        this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD');
+        this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10');
+
+        this.$maxDate.val('2014-09-09');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014-08-17');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('02014-012-031');  // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014-12-31');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2015-01-01');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+    });
+
+    it('max date format DD/MM/YYYY', function() {
+        this.bv.updateOption('maxDate', 'date', 'format', 'DD/MM/YYYY');
+        this.bv.updateOption('maxDate', 'date', 'max', '10/09/2014');
+
+        this.$maxDate.val('09/09/2014');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('17/08/2014');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('031/012/02014'); // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('31/12/2014');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('01/01/2015');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+    });
+
+    it('max date format YYYY-MM-DD h:m:s', function() {
+        this.bv.updateOption('maxDate', 'date', 'format', 'YYYY-MM-DD h:m:s');
+        this.bv.updateOption('maxDate', 'date', 'max', '2014-09-10 01:00:00');
+
+        this.$maxDate.val('2014-09-09 01:00:01');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014-08-17 12:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014-09-09 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2014-12-31 00:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$maxDate.val('2015-01-01 23:00:12');
+        this.bv.validate();
+        expect(this.bv.isValidField('maxDate')).toEqual(false);
+    });
+
+    // range test suite
+    it('range format YYYY/MM/DD', function() {
+        this.bv.updateOption('range', 'date', 'format', 'YYYY/MM/DD');
+        this.bv.updateOption('range', 'date', 'min', '2010/09/10');
+        this.bv.updateOption('range', 'date', 'max', '2014/09/10');
+
+        this.$range.val('2011/01/01');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('2014/09/09');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('02014/001/031'); // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2010/09/09');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2014/09/11');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+    });
+
+    it('range format YYYY-MM-DD', function() {
+        this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD');
+        this.bv.updateOption('range', 'date', 'min', '2010-09-10');
+        this.bv.updateOption('range', 'date', 'max', '2014-09-10');
+
+        this.$range.val('2012-01-12');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('2014-09-09');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('02014-003-031');  // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2009-12-31');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2015-01-01');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+    });
+
+    it('range format DD/MM/YYYY', function() {
+        this.bv.updateOption('range', 'date', 'format', 'DD/MM/YYYY');
+        this.bv.updateOption('range', 'date', 'min', '10/09/2010');
+        this.bv.updateOption('range', 'date', 'max', '10/09/2014');
+
+        this.$range.val('11/11/2011');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('17/08/2014');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('031/012/02013'); // year, month or day prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('31/01/2010');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('25/03/2015');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+    });
+
+    it('range format YYYY-MM-DD h:m:s', function() {
+        this.bv.updateOption('range', 'date', 'format', 'YYYY-MM-DD h:m:s');
+        this.bv.updateOption('range', 'date', 'min', '2010-05-15 22:00:00');
+        this.bv.updateOption('range', 'date', 'max', '2015-05-15 22:00:00');
+
+        this.$range.val('2012-07-17 01:00:01');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('2013-08-17 12:00:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toBeTruthy();
+
+        this.bv.resetForm();
+        this.$range.val('2011-06-19 001:001:001'); // hours, minutes or seconds prefixed by 0 not allowed
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2008-11-27 23:15:00');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+
+        this.bv.resetForm();
+        this.$range.val('2015-05-15 22:00:01');
+        this.bv.validate();
+        expect(this.bv.isValidField('range')).toEqual(false);
+    });
 });