'use strict'; import $ from 'jquery'; import select2 from 'select2/dist/js/select2.js'; import Events from '../_events'; const FormSelect2 = (($) => { // Constants const NAME = 'jsFormSelect2'; const DATA_KEY = NAME; const $Html = $('html, body'); const W = window; const D = document; class FormSelect2 { constructor(el) { const ui = this; const $el = $(el); ui._el = el; ui.dispose(); console.log(`${NAME}: init`); $el.data(DATA_KEY, this); const $fields = $el.find(Events.FORM_FIELDS); const $selectFields = $el .find('select:not([readonly])') .not('.no-select2'); $selectFields.each((i, el) => { $(el).select2(); }); $el.addClass(`${NAME}-active`); $el.trigger(Events.FORM_INIT_BASICS); } // Public methods dispose() { console.log(`${NAME}: dispose`); const ui = this; const $el = $(ui._el); const $selectFields = $el .find('select:not([readonly])') .not('.no-select2'); $selectFields.each((i, el) => { const $el = $(el); if ($el.hasClass('select2-hidden-accessible')) { $el.select2('destroy'); } }); $.removeData(ui._el, DATA_KEY); ui._el = null; $el.removeClass(`${NAME}-active`); } static _jQueryInterface() { return this.each(() => { // attach functionality to el const $el = $(this); let data = $el.data(DATA_KEY); if (!data) { data = new FormSelect2(this); $el.data(DATA_KEY, data); } }); } } // jQuery interface $.fn[NAME] = FormSelect2._jQueryInterface; $.fn[NAME].Constructor = FormSelect2; $.fn[NAME].noConflict = function () { $.fn[NAME] = JQUERY_NO_CONFLICT; return FormSelect2._jQueryInterface; }; const init = () => { $('form').jsFormSelect2(); }; // auto-apply $(W).on(`${NAME}.init ${Events.AJAX} ${Events.LOADED}`, () => { init(); }); return FormSelect2; })($); export default FormSelect2;