'use strict' import $ from 'jquery' import Events from '../_events' const FormFieldUI = (($) => { // Constants const NAME = 'jsFormFieldUI' const DATA_KEY = NAME const $Html = $('html, body') class FormFieldUI { constructor (el) { const ui = this ui.$el = $(el) ui.shown = true ui.$el.data(DATA_KEY, ui) // ui.$actions = ui.$el.parents('form').children('.btn-toolbar,.form-actions'); ui.vals = { val: ui.$el.val(), checked: ui.$el.is(':checked'), } // bootstrap collapse integration ui.$el.parents('.optionset').not('.field').removeClass('collapse') ui.$collapse = ui.$el .parents('.field.collapse') .not('.composite') .first() if (ui.$collapse.length) { ui.$el.removeClass('collapse') ui.$collapse.on('show.bs.collapse', (e) => { ui.show() }) ui.$collapse.on('hidden.bs.collapse', (e) => { ui.hide() }) } ui.$el.addClass(`${NAME}-active`) return ui } // Public methods dispose () { const ui = this const $el = ui.$el $el.removeClass(`${NAME}-active`) $.removeData($el[0], DATA_KEY) } show () { const ui = this const $el = ui.$el ui.restore() ui.shown = true /* if (ui.$collapse.length) { ui.$collapse.collapse('show'); } if ($el.hasClass('collapse')) { $el.collapse('show'); } */ $el.trigger(`shown.${NAME}`) } hide () { const ui = this const $el = ui.$el ui.wipe() ui.shown = false /* if (ui.$collapse.length) { ui.$collapse.collapse('hide'); } if ($el.hasClass('collapse')) { $el.collapse('hide'); } $el.trigger('change'); */ $el.trigger(`hidden.${NAME}`) } wipe () { const ui = this const $el = ui.$el ui.vals = { name: $el.attr('name'), val: $el.val(), checked: $el.is(':checked'), } $el.val('') $el.prop('checked', false) } restore () { const ui = this const $el = ui.$el const checked = ui.vals.checked $el.val(ui.vals.val) $el.prop('checked', checked) } addMessage (msg, type = null, scrollTo = true) { const ui = this const $field = ui.$el.closest('.field') $field.addClass('has-message') if (msg) { $field.append(`
${msg}
`) } if (scrollTo) { const pos = $field.offset().top $field.focus() $Html.scrollTop(pos - 100) } } removeMessages () { const ui = this const $field = ui.$el.closest('.field') $field.removeClass('has-message') $field.find('.message').remove() } static _jQueryInterface () { return this.each(function () { // attach functionality to el const $el = $(this) let data = $el.data(DATA_KEY) if (!data) { data = new FormFieldUI(this) $el.data(DATA_KEY, data) } }) } } // jQuery interface $.fn[NAME] = FormFieldUI._jQueryInterface $.fn[NAME].Constructor = FormFieldUI $.fn[NAME].noConflict = function () { $.fn[NAME] = JQUERY_NO_CONFLICT return FormFieldUI._jQueryInterface } return FormFieldUI })($) export default FormFieldUI