import $ from 'jquery' import Events from '../_events' import FormBasics from './_ui.form.basics' import FormValidateField from './_ui.form.validate.field' // import SpinnerUI from "./_ui.spinner"; const FormValidate = (($) => { // Constants const NAME = 'jsFormValidate' const DATA_KEY = NAME const $Html = $('html, body') class FormValidate { constructor (element) { const ui = this const $element = $(element) const $fields = $element.find('input,textarea,select') ui._element = element ui.$element = $element $element.data(DATA_KEY, this) ui._fields = $fields ui._stepped_form = $element.data('jsSteppedForm') // prevent browsers checks (will do it using JS) $element.attr('novalidate', 'novalidate') $element.on(Events.FORM_INIT_STEPPED, () => { ui._stepped_form = $element.data('jsSteppedForm') }) // init fields validation $fields.each((i, el) => { // skip some fields here if ($(el).attr('role') === 'combobox') { return } new FormValidateField(el) }) // check form $element.on('submit', (e) => { ui.validate(true, () => { e.preventDefault() // switch to step if (ui._stepped_form) { const $el = $element.find('.error').first() if ($el.length) { ui._stepped_form.step($el.parents('.step')) } } $element.trigger(Events.FORM_VALIDATION_FAILED) }) }) $element.addClass(`${NAME}-active`) $element.trigger(Events.FORM_INIT_VALIDATE) } // Public methods dispose () { const $element = $(this._element) $element.removeClass(`${NAME}-active`) $.removeData(this._element, DATA_KEY) this._element = null } validate (scrollTo = true, badCallback = false) { console.log(`${NAME}: checking the form ...`) const ui = this let valid = true ui._fields.filter(':visible').each((i, el) => { const $el = $(el) const fieldUI = $el.data('jsFormValidateField') if (fieldUI && !fieldUI.validate()) { // SpinnerUI.hide(); ui.$element.addClass('error') if (badCallback) { badCallback() } valid = false return false } }) return valid } static _jQueryInterface () { return this.each(function () { // attach functionality to element const $element = $(this) let data = $element.data(DATA_KEY) if (!data) { data = new FormValidate(this) $element.data(DATA_KEY, data) } }) } } // jQuery interface $.fn[NAME] = FormValidate._jQueryInterface $.fn[NAME].Constructor = FormValidate $.fn[NAME].noConflict = function () { $.fn[NAME] = JQUERY_NO_CONFLICT return FormValidate._jQueryInterface } // auto-apply $(window).on(`${NAME}.init ${Events.AJAX} ${Events.LOADED}`, () => { $('form').each((i, el) => { const $el = $(el) // skip some forms if ($el.hasClass('no-validation')) { return true } $el.jsFormValidate() }) }) return FormValidate })($) export default FormValidate