Merge pull request #2808 from colemanw/popups
[civicrm-core.git] / js / crm.ajax.js
index 6808f217cf25d9951f7610164696280b1b309bda..597e77bfc048c04637fa6b4d126336a04efd5561 100644 (file)
             $el.trigger('crmFormSuccess', response);
             // Reset form for e.g. "save and new"
             if (response.userContext && settings.refreshAction && $.inArray(response.buttonName, settings.refreshAction) >= 0) {
-              $el.crmSnippet('option', 'url', response.userContext).crmSnippet('refresh');
+              // Force reset of original url
+              $el.data('civiCrmSnippet')._originalUrl = response.userContext;
+              $el.crmSnippet('resetUrl').crmSnippet('refresh');
             }
             else if ($el.data('uiDialog') && settings.autoClose) {
               $el.dialog('close');
    * Handler for jQuery click event e.g. $('a').click(CRM.popup)
    * @returns {boolean}
    */
-  CRM.popup = function() {
+  CRM.popup = function(e) {
     var $el = $(this).first(),
       url = $el.attr('href'),
       popup = $el.data('popup-type') === 'page' ? CRM.loadPage : CRM.loadForm,
       settings = $el.data('popup-settings') || {},
-      triggers = {dialogclose: 'crmPopupClose', crmLoad: 'crmPopupLoad', crmFormSuccess: 'crmPopupFormSuccess'};
+      formSuccess = false;
     settings.dialog = settings.dialog || {};
-    if (!CRM.config.ajaxPopupsEnabled || !url || $el.is(exclude)) {
+    if (e.isDefaultPrevented() || !CRM.config.ajaxPopupsEnabled || !url || $el.is(exclude)) {
       return;
     }
     // Sized based on css class
     var dialog = popup(url, settings);
     // Trigger events from the dialog on the original link element
     $el.trigger('crmPopupOpen', [dialog]);
-    $.each(triggers, function(event, target) {
-      dialog.on(event, function(e, data) {
-        $el.trigger(target, [dialog, data]);
-      });
+    // Buffer this event so it only fires once
+    dialog.on('crmFormSuccess.crmPopup', function(e, data) {
+      formSuccess = true;
+    });
+    dialog.on('dialogclose.crmPopup', function(e, data) {
+      if (formSuccess) {
+        $el.trigger('crmPopupFormSuccess', [dialog, data]);
+      }
+      $el.trigger('crmPopupClose', [dialog, data]);
     });
-    return false;
+    e.preventDefault();
+  };
+  /**
+   * An event callback for CRM.popup or a standalone function to refresh the content around a popup link
+   * @param e event|selector
+   */
+  CRM.refreshParent = function(e) {
+    // Use e.target if input smells like an event, otherwise assume it's a jQuery selector
+    var $el = (e.stopPropagation && e.target) ? $(e.target) : $(e),
+      $table = $el.closest('.dataTable');
+    // Call native refresh method on ajax datatables
+    if ($table && $.fn.DataTable.fnIsDataTable($table[0]) && $table.dataTable().fnSettings().sAjaxSource) {
+      // Refresh ALL datatables - needed for contact relationship tab
+      $.each($.fn.dataTable.fnTables(), function() {
+        $(this).dataTable().fnSettings().sAjaxSource && $(this).unblock().dataTable().fnDraw();
+      });
+    }
+    // Otherwise refresh the nearest crmSnippet
+    else {
+      $el.closest('.crm-ajax-container, #crm-main-content-wrapper').crmSnippet().crmSnippet('refresh');
+    }
   };
 
   $(function($) {