webpack-bootstrap-ui-kit/src/js/_components/_ui.form.basics.js

136 lines
3.0 KiB
JavaScript
Raw Normal View History

2019-06-08 17:20:51 +02:00
import $ from 'jquery';
2019-08-12 11:23:24 +02:00
//import 'bootstrap-select/dist/js/bootstrap-select';
//$.fn.selectpicker.Constructor.BootstrapVersion = '4';
import 'select2/dist/js/select2.js';
2019-07-10 20:59:57 +02:00
2019-08-12 11:23:24 +02:00
import select2 from 'jquery.inputmask/dist/jquery.inputmask.bundle';
2019-06-08 17:20:51 +02:00
import Events from "../_events";
import SpinnerUI from './_ui.spinner';
import FormFieldUI from './_ui.form.fields';
const FormBasics = (($) => {
// Constants
const NAME = 'jsFormBasics';
const DATA_KEY = NAME;
const $Html = $('html, body');
2019-07-10 20:59:57 +02:00
const W = window;
const D = document;
2019-06-08 17:20:51 +02:00
class FormBasics {
2019-11-27 06:29:20 +01:00
constructor(el) {
2019-06-08 17:20:51 +02:00
const ui = this;
2019-11-27 06:29:20 +01:00
const $el = $(el);
2019-06-08 17:20:51 +02:00
2019-11-27 06:29:20 +01:00
ui._el = el;
$el.data(DATA_KEY, this);
2019-06-08 17:20:51 +02:00
$('[data-inputmask]').inputmask();
2019-11-27 06:29:20 +01:00
const $fields = $el.find(Events.FORM_FIELDS);
2019-06-08 17:20:51 +02:00
// init fields ui
$fields.each((i, el) => {
2019-07-10 20:59:57 +02:00
// skip some fields here
2019-06-08 17:20:51 +02:00
new FormFieldUI(el);
});
2019-11-27 06:29:20 +01:00
const $selectFields = $el.find('select:not([readonly])');
const $radioOptions = $el.find('input[type="radio"]');
2019-06-08 17:20:51 +02:00
2019-08-12 11:23:24 +02:00
$selectFields.each((i, el) => {
2019-11-27 06:29:20 +01:00
$(el).select2();
2019-08-12 11:23:24 +02:00
});
2019-06-08 17:20:51 +02:00
$fields.each((e, el) => {
const $el = $(el);
if ($el.hasClass('required') || $el.attr('aria-required')) {
$el.closest('.field').addClass('required');
}
});
$radioOptions.each((e, el) => {
const $el = $(el);
if ($el.is(':checked')) {
$el.parents('.radio').addClass('checked');
}
});
$radioOptions.on('change', (e) => {
const $el = $(e.currentTarget);
const $parent = $el.parents('.radio');
2019-07-10 20:59:57 +02:00
$parent.siblings('.radio').each((i, el) => {
const $el = $(el);
if (!$el.find('input').is(':checked')) {
$el.removeClass('checked');
}
});
2019-06-08 17:20:51 +02:00
if ($el.is(':checked')) {
$parent.addClass('checked');
}
});
2019-11-27 06:29:20 +01:00
$el.on('submit', (e) => {
2019-06-08 17:20:51 +02:00
SpinnerUI.show();
});
2019-11-27 06:29:20 +01:00
$el.addClass(`${NAME}-active`);
$el.trigger(Events.FORM_INIT_BASICS);
2019-06-08 17:20:51 +02:00
}
// Public methods
dispose() {
2019-11-27 06:29:20 +01:00
const $el = $(this._el);
2019-06-08 17:20:51 +02:00
2019-12-17 21:36:38 +01:00
const $selectFields = $el.find('select:not([readonly])');
$selectFields.each((i, el) => {
$(el).select2('destroy');
});
2019-11-27 06:29:20 +01:00
$el.removeClass(`${NAME}-active`);
$.removeData(this._el, DATA_KEY);
this._el = null;
2019-06-08 17:20:51 +02:00
}
static _jQueryInterface() {
2019-07-10 20:59:57 +02:00
return this.each(() => {
2019-11-27 06:29:20 +01:00
// attach functionality to el
const $el = $(this);
let data = $el.data(DATA_KEY);
2019-06-08 17:20:51 +02:00
if (!data) {
data = new FormBasics(this);
2019-11-27 06:29:20 +01:00
$el.data(DATA_KEY, data);
2019-06-08 17:20:51 +02:00
}
});
}
}
// jQuery interface
$.fn[NAME] = FormBasics._jQueryInterface;
$.fn[NAME].Constructor = FormBasics;
$.fn[NAME].noConflict = function() {
$.fn[NAME] = JQUERY_NO_CONFLICT;
return FormBasics._jQueryInterface;
};
2019-07-10 20:59:57 +02:00
const init = () => {
$('form').jsFormBasics();
};
2019-06-08 17:20:51 +02:00
2019-07-10 20:59:57 +02:00
// auto-apply
$(W).on(`${Events.AJAX} ${Events.LOADED}`, () => {
init();
2019-06-08 17:20:51 +02:00
});
return FormBasics;
})($);
export default FormBasics;