diff --git a/dist/simple-form.bootstrap4.esm.js b/dist/simple-form.bootstrap4.esm.js index 5ab3ec9..4b28055 100644 --- a/dist/simple-form.bootstrap4.esm.js +++ b/dist/simple-form.bootstrap4.esm.js @@ -23,6 +23,7 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = { wrappers: { "default": { add: function add(element, settings, message) { + alert('bla'); var wrapperElement = element.parent(); var errorElement = wrapperElement.find(settings.error_tag + '.invalid-feedback'); diff --git a/dist/simple-form.bootstrap4.js b/dist/simple-form.bootstrap4.js index 431ad3c..feaf840 100644 --- a/dist/simple-form.bootstrap4.js +++ b/dist/simple-form.bootstrap4.js @@ -29,6 +29,7 @@ wrappers: { "default": { add: function add(element, settings, message) { + alert('bla'); var wrapperElement = element.parent(); var errorElement = wrapperElement.find(settings.error_tag + '.invalid-feedback'); diff --git a/dist/simple-form.esm.js b/dist/simple-form.esm.js index 79ee074..8a1365d 100644 --- a/dist/simple-form.esm.js +++ b/dist/simple-form.esm.js @@ -23,6 +23,12 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = { wrappers: { "default": { add: function add(element, settings, message) { + console.log(this); + + if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) { + console.log(this); + } + var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')); var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.')); @@ -44,15 +50,6 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = { return errorElement.remove(); } }, - - get horizontal_multi_select() { - return this.multi_select; - }, - - get vertical_multi_select() { - return this.multi_select; - }, - multi_select: { add: function add(element, settings, message) { var wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')); diff --git a/dist/simple-form.js b/dist/simple-form.js index 980273e..42ad6b1 100644 --- a/dist/simple-form.js +++ b/dist/simple-form.js @@ -29,6 +29,12 @@ wrappers: { "default": { add: function add(element, settings, message) { + console.log(this); + + if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) { + console.log(this); + } + var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')); var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.')); @@ -50,15 +56,6 @@ return errorElement.remove(); } }, - - get horizontal_multi_select() { - return this.multi_select; - }, - - get vertical_multi_select() { - return this.multi_select; - }, - multi_select: { add: function add(element, settings, message) { var wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')); diff --git a/src/main.js b/src/main.js index 832f12e..8249555 100644 --- a/src/main.js +++ b/src/main.js @@ -18,6 +18,10 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = { wrappers: { default: { add (element, settings, message) { + if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) { + console.log(this.wrappers.multi_select.add(element, settings, message)) + } + const wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')) var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.')) @@ -38,12 +42,6 @@ ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = { return errorElement.remove() } }, - get horizontal_multi_select () { - return this.multi_select - }, - get vertical_multi_select () { - return this.multi_select - }, multi_select: { add (element, settings, message) { const wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')) diff --git a/test/javascript/public/test/form_builders/validateSimpleForm.js b/test/javascript/public/test/form_builders/validateSimpleForm.js index 3643175..4a324c8 100644 --- a/test/javascript/public/test/form_builders/validateSimpleForm.js +++ b/test/javascript/public/test/form_builders/validateSimpleForm.js @@ -12,7 +12,7 @@ QUnit.module('Validate SimpleForm', { dataCsv = { html_settings: { type: 'SimpleForm::FormBuilder', - error_class: 'error small', + error_class: 'error', error_tag: 'span', wrapper_error_class: 'field_with_errors', wrapper_tag: 'div', diff --git a/test/javascript/public/test/form_builders/validateSimpleFormBootstrap4Datetime.js b/test/javascript/public/test/form_builders/validateSimpleFormBootstrap4Datetime.js new file mode 100644 index 0000000..29b8cfa --- /dev/null +++ b/test/javascript/public/test/form_builders/validateSimpleFormBootstrap4Datetime.js @@ -0,0 +1,170 @@ +QUnit.module('Validate SimpleForm Bootstrap 4 Datetime Fields/Wrappers', { + before: function () { + currentFormBuilder = window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] + window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = BS4_FORM_BUILDER + }, + + after: function () { + window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = currentFormBuilder + }, + + beforeEach: function () { + dataCsv = { + html_settings: { + type: 'SimpleForm::FormBuilder', + error_class: null, + error_tag: 'div', + wrapper_error_class: 'form-group-invalid', + wrapper_tag: 'div', + wrapper_class: 'form-group' + }, + validators: { + 'user[date_of_birth]': { presence: [{ message: 'must be present' }] }, + 'user[time_of_birth]': { presence: [{ message: 'must be present' }] } + } + } + + $('#qunit-fixture') + .append( + $('
', { + action: '/users', + 'data-client-side-validations': JSON.stringify(dataCsv), + method: 'post', + id: 'new_user' + }) + .append($('
', { + class:'form-group date required user_date_of_birth' + }) + .append($('')) + .append($('
', { + class: 'd-flex flex-row justify-content-between align-items-center' + }) + .append($('', { + id: 'user_date_of_birth_2i', + name: 'user[date_of_birth(2i)]', + class: 'form-control mx-1 date required', + 'data-client-side-validations-wrapper': 'vertical_multi_select' + }) + .append($('')) + .append($('')) + .append($(''))) + .append($('') + .append('') + .append('') + .append($('', { + id: 'user_time_of_birth_5i', + name: 'user[time_of_birth(5i)]', + class: 'form-control mx-1 is-invalid time required', + 'data-client-side-validations-wrapper': 'vertical_multi_select' + }) + .append($('')) + .append($('')) + .append($('')) + ) + ) + .append('
Time of birth must be present.
') + .append('Hint: At what time you were born?') + ) + ) + + $('form#new_user').validate() + } +}) + +//I don think this multiple wrapper names makes sense here, because in SimpleForm different wrapper would have different DOM +//but here DOM ($('#qunit-fixture')) is same for all tests. +var wrappers = ['vertical_form'] + +for (var i = 0; i < wrappers.length; i++) { + var wrapper = wrappers[i] + + QUnit.test(wrapper + ' - Validate date input', function (assert) { + const form = $('form#new_user'); + const select_year = form.find('select#user_date_of_birth_1i') + const select_month = form.find('select#user_date_of_birth_2i') + const select_day = form.find('select#user_date_of_birth_3i') + + form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper + + select_year.trigger('focusout') + select_day.trigger('focusout') + + assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_month.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_year.val(2025).trigger('change').trigger('focusout') + + assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_month.val(1).trigger('change').trigger('focusout') + select_day.val(1).trigger('change').trigger('focusout') + + assert.notOk(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 0) + }) + + QUnit.test(wrapper + ' - Validate time input reusing server message', function (assert) { + const form = $('form#new_user'); + const select_hour = form.find('select#user_time_of_birth_4i') + const select_minute = form.find('select#user_time_of_birth_5i') + + form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper + + assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_hour.val(23).trigger('change').trigger('focusout') + + assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_minute.val(55).trigger('change').trigger('focusout') + + assert.notOk(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 0) + }) +} diff --git a/test/javascript/public/test/form_builders/validateSimpleFormDateTime.js b/test/javascript/public/test/form_builders/validateSimpleFormDateTime.js new file mode 100644 index 0000000..f172069 --- /dev/null +++ b/test/javascript/public/test/form_builders/validateSimpleFormDateTime.js @@ -0,0 +1,152 @@ +QUnit.module('Validate SimpleForm DateTime', { + before: function () { + currentFormBuilder = window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] + window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = DEFAULT_FORM_BUILDER + }, + + after: function () { + window.ClientSideValidations.formBuilders['SimpleForm::FormBuilder'] = currentFormBuilder + }, + + beforeEach: function () { + dataCsv = { + html_settings: { + type: 'SimpleForm::FormBuilder', + error_class: 'error', + error_tag: 'span', + wrapper_error_class: 'field_with_errors', + wrapper_tag: 'div', + wrapper_class: 'input', + wrapper: 'default' + }, + validators: { + 'user[date_of_birth]': { presence: [{ message: 'must be present' }] }, + 'user[time_of_birth]': { presence: [{ message: 'must be present' }] } + } + } + + $('#qunit-fixture') + .append( + $('', { + action: '/users', + 'data-client-side-validations': JSON.stringify(dataCsv), + method: 'post', + id: 'new_user' + }) + .append($('
', { + class:'input date required user_date_of_birth field_with_hint' + }) + .append($('')) + .append($('', { + id: 'user_date_of_birth_2i', + name: 'user[date_of_birth(2i)]', + class: 'date required', + }) + .append($('')) + .append($('')) + .append($(''))) + .append($('') + .append('') + .append('') + .append($('', { + id: 'user_time_of_birth_5i', + name: 'user[time_of_birth(5i)]', + class: 'time required', + 'aria-invalid': true + }) + .append($('')) + .append($('')) + .append($('')) + ) + .append('Hint: At what time you were born?') + .append('Time of birth must be present.') + ) + ) + + $('form#new_user').validate() + } + }) + + QUnit.test('Validate date input', function (assert) { + const form = $('form#new_user'); + const select_year = form.find('select#user_date_of_birth_1i') + const select_month = form.find('select#user_date_of_birth_2i') + const select_day = form.find('select#user_date_of_birth_3i') + + form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper + + select_year.trigger('focusout') + select_day.trigger('focusout') + + assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_month.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_year.val(2025).trigger('change').trigger('focusout') + + assert.ok(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_month.val(1).trigger('change').trigger('focusout') + select_day.val(1).trigger('change').trigger('focusout') + + assert.notOk(select_year.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_year.closest('.form-group').find('div.invalid-feedback').length === 0) + }) + + QUnit.test('Validate time input reusing server message', function (assert) { + const form = $('form#new_user'); + const select_hour = form.find('select#user_time_of_birth_4i') + const select_minute = form.find('select#user_time_of_birth_5i') + + form[0].ClientSideValidations.settings.html_settings.wrapper = wrapper + + assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_hour.val(23).trigger('change').trigger('focusout') + + assert.ok(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_minute.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 1) + + select_minute.val(55).trigger('change').trigger('focusout') + + assert.notOk(select_hour.closest('.form-group').hasClass('form-group-invalid')) + assert.ok(select_hour.closest('.form-group').find('div.invalid-feedback').length === 0) + }) diff --git a/vendor/assets/javascripts/rails.validations.simple_form.bootstrap4.js b/vendor/assets/javascripts/rails.validations.simple_form.bootstrap4.js index 431ad3c..feaf840 100644 --- a/vendor/assets/javascripts/rails.validations.simple_form.bootstrap4.js +++ b/vendor/assets/javascripts/rails.validations.simple_form.bootstrap4.js @@ -29,6 +29,7 @@ wrappers: { "default": { add: function add(element, settings, message) { + alert('bla'); var wrapperElement = element.parent(); var errorElement = wrapperElement.find(settings.error_tag + '.invalid-feedback'); diff --git a/vendor/assets/javascripts/rails.validations.simple_form.js b/vendor/assets/javascripts/rails.validations.simple_form.js index 980273e..42ad6b1 100644 --- a/vendor/assets/javascripts/rails.validations.simple_form.js +++ b/vendor/assets/javascripts/rails.validations.simple_form.js @@ -29,6 +29,12 @@ wrappers: { "default": { add: function add(element, settings, message) { + console.log(this); + + if (element.is('select') && (element.hasClass('date') || element.hasClass('time'))) { + console.log(this); + } + var wrapper = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.')); var errorElement = wrapper.find(settings.error_tag + '.' + settings.error_class.replace(/ /g, '.')); @@ -50,15 +56,6 @@ return errorElement.remove(); } }, - - get horizontal_multi_select() { - return this.multi_select; - }, - - get vertical_multi_select() { - return this.multi_select; - }, - multi_select: { add: function add(element, settings, message) { var wrapperElement = element.closest(settings.wrapper_tag + '.' + settings.wrapper_class.replace(/ /g, '.'));