Mautic.modalContentXhr = {}; Mautic.activeModal = ''; Mautic.backgroundedModal = ''; /** * Load a modal with ajax content * * @param el * @param event * * @returns {boolean} */ Mautic.ajaxifyModal = function (el, event) { let element = mQuery(el); if (element.hasClass('disabled')) { return false; } mQuery('body').addClass('noscroll'); let target = element.attr('data-target'); let route = element.attr('data-href') ? element.attr('data-href') : element.attr('href'); if (route.indexOf('javascript') >= 0) { return false; } let method = element.attr('data-method') ? element.attr('data-method') : 'GET'; let header = element.attr('data-header'); let footer = element.attr('data-footer'); let modalOpenCallback = element.attr('data-modal-open-callback') ? element.attr('data-modal-open-callback') : null; let modalCloseCallback = element.attr('data-modal-close-callback') ? element.attr('data-modal-close-callback') : null; let preventDismissal = element.attr('data-prevent-dismiss'); if (preventDismissal) { // Reset element.removeAttr('data-prevent-dismiss'); } /* * If we have an onLoadCallback, proxy it through this function so that * we can pass the element to the callback. The callback must exist on * the window.Mautic object. */ let modalOpenCallbackReal = null; if (modalOpenCallback && window["Mautic"].hasOwnProperty(modalOpenCallback)) { modalOpenCallbackReal = function() { Mautic[modalOpenCallback](el); }; } let modalCloseCallbackReal = null; if (modalCloseCallback && window["Mautic"].hasOwnProperty(modalOpenCallback)) { modalCloseCallbackReal = function() { Mautic[modalCloseCallback](el); }; } Mautic.loadAjaxModal(target, route, method, header, footer, preventDismissal, modalOpenCallbackReal, modalCloseCallbackReal); }; /** * Retrieve ajax content for modal * @param target * @param route * @param method * @param header * @param footer * @param preventDismissal * @param modalOpenCallback * @param modalCloseCallback */ Mautic.loadAjaxModal = function (target, route, method, header, footer, preventDismissal, modalOpenCallback, modalCloseCallback) { let element = mQuery(target); if (element.find('.loading-placeholder').length) { element.find('.loading-placeholder').removeClass('hide'); element.find('.modal-body-content').addClass('hide'); if (element.find('.modal-loading-bar').length) { element.find('.modal-loading-bar').addClass('active'); } } if (footer == 'false') { element.find(".modal-footer").addClass('hide'); } //move the modal to the body tag to get around positioned div issues element.one('show.bs.modal', function () { if (header) { element.find(".modal-title").html(header); } if (footer && footer != 'false') { element.find(".modal-footer").html(header); } if (modalOpenCallback) { modalOpenCallback(); } }); //clean slate upon close element.one('hidden.bs.modal', function () { if (typeof Mautic.modalContentXhr[target] != 'undefined') { Mautic.modalContentXhr[target].abort(); delete Mautic.modalContentXhr[target]; } mQuery('body').removeClass('noscroll'); let response = {}; if (Mautic.modalMauticContent) { response.mauticContent = Mautic.modalMauticContent; delete Mautic.modalMauticContent; } if (modalCloseCallback) { modalCloseCallback(); } //unload Mautic.onPageUnload(target, response); Mautic.resetModal(target); }); // Check if dismissal is allowed if (typeof element.data('bs.modal') !== 'undefined' && typeof element.data('bs.modal').options !== 'undefined') { if (preventDismissal) { element.data('bs.modal').options.keyboard = false; element.data('bs.modal').options.backdrop = 'static'; } else { element.data('bs.modal').options.keyboard = true; element.data('bs.modal').options.backdrop = true; } } else { if (preventDismissal) { element.modal({ backdrop: 'static', keyboard: false }); } else { element.modal({ backdrop: true, keyboard: true }); } } Mautic.showModal(target); if (typeof Mautic.modalContentXhr == 'undefined') { Mautic.modalContentXhr = {}; } else if (typeof Mautic.modalContentXhr[target] != 'undefined') { Mautic.modalContentXhr[target].abort(); } Mautic.modalContentXhr[target] = mQuery.ajax({ url: route, type: method, dataType: "json", success: function (response) { if (response) { Mautic.processModalContent(response, target); } Mautic.stopIconSpinPostEvent(); }, error: function (request, textStatus, errorThrown) { Mautic.processAjaxError(request, textStatus, errorThrown); Mautic.stopIconSpinPostEvent(); }, complete: function () { Mautic.stopModalLoadingBar(target); delete Mautic.modalContentXhr[target]; } }); }; /** * Clears content from a shared modal * @param target */ Mautic.resetModal = function (target) { if (mQuery(target).hasClass('in')) { return; } mQuery(target + " .modal-title").html(''); mQuery(target + " .modal-body-content").html(''); if (mQuery(target + " loading-placeholder").length) { mQuery(target + " loading-placeholder").removeClass('hide'); } if (mQuery(target + " .modal-footer").length) { var hasFooterButtons = mQuery(target + " .modal-footer .modal-form-buttons").length; mQuery(target + " .modal-footer").html(''); if (hasFooterButtons) { //add footer buttons mQuery('