From: Coleman Watts Date: Tue, 14 Oct 2014 21:35:22 +0000 (-0400) Subject: CRM-15456 - Add safety checks to avoid errors when updating tabs X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=c312052ee090c968119ffea720c303fff5e137f2;p=civicrm-core.git CRM-15456 - Add safety checks to avoid errors when updating tabs --- diff --git a/CRM/Contact/Form/Inline/ContactInfo.php b/CRM/Contact/Form/Inline/ContactInfo.php index e906cd326a..fd54e84871 100644 --- a/CRM/Contact/Form/Inline/ContactInfo.php +++ b/CRM/Contact/Form/Inline/ContactInfo.php @@ -84,9 +84,13 @@ class CRM_Contact_Form_Inline_ContactInfo extends CRM_Contact_Form_Inline { // Saving current employer affects relationship tab, and possibly related memberships and contributions $this->ajaxResponse['updateTabs'] = array( '#tab_rel' => CRM_Contact_BAO_Contact::getCountComponent('rel', $this->_contactId), - '#tab_contribute' => CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId), - '#tab_member' => CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId), ); + if (CRM_Core_Permission::access('CiviContribute')) { + $this->ajaxResponse['updateTabs']['#tab_contribute'] = CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId); + } + if (CRM_Core_Permission::access('CiviMember')) { + $this->ajaxResponse['updateTabs']['#tab_member'] = CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId); + } $this->response(); } diff --git a/CRM/Event/Page/Tab.php b/CRM/Event/Page/Tab.php index 8a8ab7bb7a..72d857e725 100644 --- a/CRM/Event/Page/Tab.php +++ b/CRM/Event/Page/Tab.php @@ -62,9 +62,11 @@ class CRM_Event_Page_Tab extends CRM_Core_Page { $this->ajaxResponse['tabCount'] = CRM_Contact_BAO_Contact::getCountComponent('participant', $this->_contactId); // Refresh other tabs with related data $this->ajaxResponse['updateTabs'] = array( - '#tab_contribute' => CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId), '#tab_activity' => CRM_Contact_BAO_Contact::getCountComponent('activity', $this->_contactId), ); + if (CRM_Core_Permission::access('CiviContribute')) { + $this->ajaxResponse['updateTabs']['#tab_contribute'] = CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId); + } } } diff --git a/CRM/Member/Page/Tab.php b/CRM/Member/Page/Tab.php index e451396b50..bc798afb6a 100644 --- a/CRM/Member/Page/Tab.php +++ b/CRM/Member/Page/Tab.php @@ -208,10 +208,12 @@ class CRM_Member_Page_Tab extends CRM_Core_Page { $this->ajaxResponse['tabCount'] = CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId); // Refresh other tabs with related data $this->ajaxResponse['updateTabs'] = array( - '#tab_contribute' => CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId), '#tab_activity' => CRM_Contact_BAO_Contact::getCountComponent('activity', $this->_contactId), '#tab_rel' => CRM_Contact_BAO_Contact::getCountComponent('rel', $this->_contactId), ); + if (CRM_Core_Permission::access('CiviContribute')) { + $this->ajaxResponse['updateTabs']['#tab_contribute'] = CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId); + } } } diff --git a/templates/CRM/common/TabHeader.js b/templates/CRM/common/TabHeader.js index f45929ff93..429ec7660f 100644 --- a/templates/CRM/common/TabHeader.js +++ b/templates/CRM/common/TabHeader.js @@ -69,7 +69,7 @@ CRM.$(function($) { */ CRM.tabHeader.getActiveTab = function() { return $('.ui-tabs-active', '#mainTabContainer'); - } + }; /** * Make a given tab the active one @@ -84,22 +84,39 @@ CRM.$(function($) { * @returns panel jQuery object */ CRM.tabHeader.getTabPanel = function(tab) { - return $('#' + $(tab).attr('aria-controls')); + var selector = $(tab).attr('aria-controls'); + return selector ? $('#' + selector) : $(); }; - CRM.tabHeader.getCount = function(tab) { - return parseInt($(tab).find('a em').text(), 10); + /** + * @param tab jQuery selector + * @returns {string|null} + */ + function getCountClass(tab) { + var $tab = $(tab), + css = $tab.attr('class') || '', + val = css.match(/(crm-count-\d+)/); + return val && val.length ? val[0] : null; } + /** + * @param tab jQuery selector + * @returns {Number|null} + */ + CRM.tabHeader.getCount = function(tab) { + var cssClass = getCountClass(tab); + return cssClass ? parseInt(cssClass.slice(10), 10) : null; + }; + /** * Update the counter in a tab * @param tab jQuery selector - * @param count number + * @param count {Number} */ CRM.tabHeader.updateCount = function(tab, count) { - var oldClass = $(tab).attr('class').match(/(crm-count-\d+)/); + var oldClass = getCountClass(tab); if (oldClass) { - $(tab).removeClass(oldClass[0]); + $(tab).removeClass(oldClass); } $(tab) .addClass('crm-count-' + count) @@ -107,15 +124,16 @@ CRM.$(function($) { }; /** - * Clears tab content so that it will be refreshed next time the user clicks on it + * Refresh tab immediately if it is active, otherwise ensure 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'); + } + else if ($panel.data("civiCrmSnippet")) { + $panel.crmSnippet('destroy'); } }; })(CRM.$);