From 2840a0352d739a5d22357905f29f4ca6a13c7057 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 12 Mar 2014 22:00:15 -0400 Subject: [PATCH] CRM-13863 - Update dependent tabs and blocks --- CRM/Contact/Form/Relationship.php | 4 +++ CRM/Event/Page/Tab.php | 3 ++ CRM/Member/Page/Tab.php | 3 ++ templates/CRM/Contact/Page/View/Summary.js | 30 ++++++++++++-------- templates/CRM/common/TabHeader.js | 33 +++++++++++++++++++++- 5 files changed, 60 insertions(+), 13 deletions(-) diff --git a/CRM/Contact/Form/Relationship.php b/CRM/Contact/Form/Relationship.php index ff9125ac1e..ed669fde84 100644 --- a/CRM/Contact/Form/Relationship.php +++ b/CRM/Contact/Form/Relationship.php @@ -431,6 +431,8 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form { $relChanged = $relationshipTypeId != $this->_values['relationship_type_id']; if (!$params['is_active'] || !$params['is_current_employer'] || $relChanged) { CRM_Contact_BAO_Contact_Utils::clearCurrentEmployer($this->_values['contact_id_a']); + // Refresh contact summary if in ajax mode + $this->ajaxResponse['reloadBlocks'] = array('#crm-contactinfo-content'); } } } @@ -523,6 +525,8 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form { $employerParams[$rel->contact_id_a] = $rel->contact_id_b; } CRM_Contact_BAO_Contact_Utils::setCurrentEmployer($employerParams); + // Refresh contact summary if in ajax mode + $this->ajaxResponse['reloadBlocks'] = array('#crm-contactinfo-content'); } } diff --git a/CRM/Event/Page/Tab.php b/CRM/Event/Page/Tab.php index be4637fd38..35bbcad3e6 100644 --- a/CRM/Event/Page/Tab.php +++ b/CRM/Event/Page/Tab.php @@ -60,6 +60,9 @@ class CRM_Event_Page_Tab extends CRM_Core_Page { $displayName = CRM_Contact_BAO_Contact::displayName($this->_contactId); $this->assign('displayName', $displayName); $this->ajaxResponse['tabCount'] = CRM_Contact_BAO_Contact::getCountComponent('participant', $this->_contactId); + $this->ajaxResponse['updateTabs'] = array( + '#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 c5ba428bd0..729b7004c6 100644 --- a/CRM/Member/Page/Tab.php +++ b/CRM/Member/Page/Tab.php @@ -206,6 +206,9 @@ class CRM_Member_Page_Tab extends CRM_Core_Page { $displayName = CRM_Contact_BAO_Contact::displayName($this->_contactId); $this->assign('displayName', $displayName); $this->ajaxResponse['tabCount'] = CRM_Contact_BAO_Contact::getCountComponent('membership', $this->_contactId); + $this->ajaxResponse['updateTabs'] = array( + '#tab_contribute' => CRM_Contact_BAO_Contact::getCountComponent('contribution', $this->_contactId), + ); } } diff --git a/templates/CRM/Contact/Page/View/Summary.js b/templates/CRM/Contact/Page/View/Summary.js index 30560f3775..bc2e7854b4 100644 --- a/templates/CRM/Contact/Page/View/Summary.js +++ b/templates/CRM/Contact/Page/View/Summary.js @@ -39,7 +39,17 @@ o.trigger('crmLoad').trigger('crmFormLoad'); }); } - }; + } + + function reloadBlock(el) { + return $(el).each(function() { + var data = $(this).data('edit-params'); + data.snippet = data.reset = 1; + data.class_name = data.class_name.replace('Form', 'Page'); + data.type = 'page'; + $(this).closest('.crm-summary-block').load(CRM.url('civicrm/ajax/inline', data), function() {$(this).trigger('crmLoad');}); + }); + } function requestHandler(response) { var o = $('div.crm-inline-edit.form'); @@ -77,15 +87,7 @@ else { // Reload this block plus all dependent blocks var update = $.merge([o], dependent); - for (var i in update) { - $(update[i]).each(function() { - var data = $(this).data('edit-params'); - data.snippet = data.reset = 1; - data.class_name = data.class_name.replace('Form', 'Page'); - data.type = 'page'; - $(this).closest('.crm-summary-block').load(CRM.url('civicrm/ajax/inline', data), function() {$(this).trigger('load');}); - }); - } + _.each(update, reloadBlock); CRM.alert('', ts('Saved'), 'success'); } // Update changelog tab and contact footer @@ -320,9 +322,13 @@ } $('#crm-contact-actions-list').hide(); }) - // Reload changelog whenever an inline or popup form submits - .on('crmFormSuccess', function(e) { + .on('crmFormSuccess', function(e, data) { + // Reload changelog whenever an inline or popup form submits CRM.reloadChangeLogTab && CRM.reloadChangeLogTab(); + // Refresh dependent blocks + if (data && data.reloadBlocks) { + _.each(data.reloadBlocks, reloadBlock); + } }); $().crmAccordions(); }); diff --git a/templates/CRM/common/TabHeader.js b/templates/CRM/common/TabHeader.js index 42722d90f2..46e4b08703 100644 --- a/templates/CRM/common/TabHeader.js +++ b/templates/CRM/common/TabHeader.js @@ -54,6 +54,10 @@ cj(function($) { if (typeof(data.tabCount) !== 'undefined') { CRM.tabHeader.updateCount(ui.tab, data.tabCount); } + if ($.isPlainObject(data.updateTabs)) { + $.each(data.updateTabs, CRM.tabHeader.updateCount); + $.each(data.updateTabs, CRM.tabHeader.resetTab); + } if (typeof(data.tabValid) !== 'undefined') { var method = data.tabValid ? 'removeClass' : 'addClass'; ui.tab[method]('disabled'); @@ -69,6 +73,20 @@ cj(function($) { (function($) { // Utility functions CRM.tabHeader = CRM.tabHeader || {}; + + /** + * @param tab jQuery selector + * @returns panel jQuery object + */ + CRM.tabHeader.getTabPanel = function(tab) { + return $('#' + $(tab).attr('aria-controls')); + }; + + /** + * 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 +95,18 @@ cj(function($) { $(tab) .addClass('crm-count-' + count) .find('a em').html('' + count); - } + }; + + /** + * 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'); + } + }; })(cj); -- 2.25.1