/** * Bind input popups. * * @param {object} options * @param {string} options.classSelector * @param {function()} options.classSelector.onHide Execute when popup becomes hidden * @param {function()} options.classSelector.onVisible Execute when popup becomes visible * @param {function()} options.classSelector.onChanged Execute when input value in form has changed * @param {function()} options.classSelector.onSubmit Execute when input value in form has been submitted * @param {jQuery} options.classSelector.context jQuery object to base dimmer on */ jQuery.fn.inputPopup = function (parameters) { if (parameters === undefined) { parameters = { '': {} }; } $(this).each(function () { let $element = $(this); for (let idClass in parameters) { if ($element.hasClass(idClass) || !idClass) { let $context = Page.getContext(); if (!parameters[idClass].onChanged) { let $tabSegment = $element.parents('.ui.bottom.attached.segment'); if ($tabSegment.exists()) { $context = $tabSegment; } parameters[idClass].onChanged = () => { let $tabMenu = $tabSegment.siblings('.tabular.menu'); if ($tabMenu.exists()) { Core.UI.TabMenu.get($tabSegment.siblings('.tabular.menu').data('name')).refresh(); } else if (Page.activePage) { Page.activePage.refresh(); } }; } $element.popup({ on: 'click', duration: 100, onHide: () => { if ($.isFunction(parameters[idClass].onHide)) { return parameters[idClass].onHide(); } return true; }, onVisible: function () { let $popup = $(this); Core.UI.Bind.get($popup); let $form = $popup.find('form'); let $defaultField = $form.find('input').filter(':visible:first'); $defaultField.focus().select(); $form.rebind('submit', function (e) { if ($form.hasClass('no-auto-save')) { return; } e.preventDefault(); e.stopPropagation(); $element.popup('hide'); Core.UI.Bind.get($form, $context); let triggerChange = true; $form.find('input, textarea').each(function () { $(this).trigger('change', (triggerChange ? parameters[idClass].onChanged : null)); triggerChange = false; }); return false; }); $popup.find('.close.button').rebind('click', function () { $element.popup('hide'); }); $popup.find('.submit.button, .save.button, button[type="submit"]').rebind('click', function () { if ($form.hasClass('no-auto-save')) { $element.popup('hide'); return; } if ($.isFunction(parameters[idClass].onSubmit)) { let formValues = {}; for (let name in $form.form('get values')) { formValues[name] = { value: $form.form('get value', name), input: $form.form('get field', name) }; } parameters[idClass].onSubmit(formValues); } else { let triggerChange = true; for (let name in $form.form('get values')) { $form.form('get field', name).trigger('change', (triggerChange ? parameters[idClass].onChanged : null)); triggerChange = false; } } $element.popup('hide'); }); if ($.isFunction(parameters[idClass].onVisible)) { parameters[idClass].onVisible($popup); } } }); break; } } }); };