X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=templates%2FCRM%2Fcommon%2FTabHeader.js;h=82c19815e039c202bb7e671862d2df45570e7fa1;hb=cf7754d71abb04c50f7501894881da003baa7f59;hp=42722d90f2d8bacb1ebc400484fc7dfcbbd6b201;hpb=9a84e4f8afedf897fc4627018ef99997aea76959;p=civicrm-core.git diff --git a/templates/CRM/common/TabHeader.js b/templates/CRM/common/TabHeader.js index 42722d90f2..82c19815e0 100644 --- a/templates/CRM/common/TabHeader.js +++ b/templates/CRM/common/TabHeader.js @@ -4,15 +4,14 @@ * Tabs with class 'ajaxForm' will use CRM.loadForm instead, suitable for most forms * Tabs with class 'livePage' will get popup action links, suitable for crud tables */ -cj(function($) { +CRM.$(function($) { var tabSettings = CRM.tabSettings || {}; tabSettings.active = tabSettings.active ? $('#tab_' + tabSettings.active).prevAll().length : 0; $("#mainTabContainer") .on('tabsbeforeactivate', function(e, ui) { - // Warn of unsaved changes - requires formNavigate.tpl to be included in each tab - if (!global_formNavigate) { + // CRM-14353 - Warn of unsaved changes for all forms except those which have opted out + if (CRM.utils.initialValueChanged($('form:not([data-warn-changes=false])', ui.oldPanel))) { CRM.alert(ts('Your changes in the %1 tab have not been saved.', {1: ui.oldTab.text()}), ts('Unsaved Changes'), 'warning'); - global_formNavigate = true; } }) .on('tabsbeforeload', function(e, ui) { @@ -29,23 +28,11 @@ cj(function($) { }) }); } - if (ui.tab.hasClass('livePage')) { + if (ui.tab.hasClass('livePage') && CRM.config.ajaxPopupsEnabled) { ui.panel .off('click.crmLivePage') - .on('click.crmLivePage', 'a.button, a.action-item', function() { - var url = $(this).attr('href'); - // only follow real links not javascript buttons - if (url === '#' || $(this).attr('onclick') || $(this).hasClass('no-popup')) { - return; - } - CRM.loadForm(url, { - openInline: 'a:not("[href=#], .no-popup")' - }).on('crmFormSuccess', function(e, data) { - // Refresh when form completes - ui.panel.crmSnippet('refresh'); - }); - return false; - }); + .on('click.crmLivePage', 'a.button, a.action-item', CRM.popup) + .on('crmPopupFormSuccess.crmLivePage', 'a.button, a.action-item', CRM.refreshParent); } ui.panel .off('.tabInfo') @@ -65,10 +52,50 @@ cj(function($) { e.preventDefault(); }) .tabs(tabSettings); + // Any load/submit event could potentially call for tabs to refresh. + $(document).on('crmLoad.tabInfo crmFormSuccess.tabInfo', function(e, data) { + if (data && $.isPlainObject(data.updateTabs)) { + $.each(data.updateTabs, CRM.tabHeader.updateCount); + $.each(data.updateTabs, CRM.tabHeader.resetTab); + } + }); }); (function($) { // Utility functions CRM.tabHeader = CRM.tabHeader || {}; + + /** + * Return active tab + */ + CRM.tabHeader.getActiveTab = function() { + return $('.ui-tabs-active', '#mainTabContainer'); + } + + /** + * Make a given tab the active one + * @param tab jQuery selector + */ + CRM.tabHeader.focus = function(tab) { + $('#mainTabContainer').tabs('option', 'active', $(tab).prevAll().length); + }; + + /** + * @param tab jQuery selector + * @returns panel jQuery object + */ + CRM.tabHeader.getTabPanel = function(tab) { + return $('#' + $(tab).attr('aria-controls')); + }; + + CRM.tabHeader.getCount = function(tab) { + return parseInt($(tab).find('a em').text(), 10); + } + + /** + * Update the counter in a tab + * @param tab jQuery selector + * @param count number + */ CRM.tabHeader.updateCount = function(tab, count) { var oldClass = $(tab).attr('class').match(/(crm-count-\d+)/); if (oldClass) { @@ -77,5 +104,18 @@ cj(function($) { $(tab) .addClass('crm-count-' + count) .find('a em').html('' + count); - } -})(cj); + }; + + /** + * Clears tab content so that it will be refreshed next time the user clicks on it + * @param tab + */ + CRM.tabHeader.resetTab = function(tab) { + var $panel = CRM.tabHeader.getTabPanel(tab); + if ($(tab).hasClass('ui-tabs-active')) { + $panel.crmSnippet('refresh'); + } else { + $panel.data("civiCrmSnippet") && $panel.crmSnippet('destroy'); + } + }; +})(CRM.$);