test fixes, I feel it's caching issue
[civicrm-core.git] / js / Common.js
index e026fe8e4ad2acd7bad67ba838578e0159975daf..70b02c2c8390eb6c2bf78dd137af9ee14327a146 100644 (file)
@@ -235,11 +235,11 @@ CRM.validate = CRM.validate || {
         val = [val];
       }
       $elect.find('option' + opts).remove();
-      $.each(options, function(key, option) {
+      _.each(options, function(option) {
         var selected = ($.inArray(''+option.key, val) > -1) ? 'selected="selected"' : '';
         $elect.append('<option value="' + option.key + '"' + selected + '>' + option.value + '</option>');
       });
-      $elect.trigger('crmOptionsUpdated').trigger('change');
+      $elect.trigger('crmOptionsUpdated', $.extend({}, options)).trigger('change');
     });
   };
 
@@ -321,8 +321,7 @@ CRM.validate = CRM.validate || {
           if (!_.xor(val.split(','), _.pluck(stored, 'id')).length) {
             callback(multiple ? stored : stored[0]);
           } else {
-            var params = $el.data('api-params') || {};
-            params.id = val;
+            var params = $.extend({}, $el.data('api-params') || {}, {id: val});
             CRM.api3($el.data('api-entity'), 'getlist', params).done(function(result) {
               callback(multiple ? result.values : result.values[0])
             });
@@ -403,25 +402,38 @@ CRM.validate = CRM.validate || {
   }
 
   // Initialize widgets
-  $(document).on('crmLoad', function(e) {
-    $('table.row-highlight', e.target)
-      .off('.rowHighlight')
-      .on('change.rowHighlight', 'input.select-row, input.select-rows', function () {
-        var target, table = $(this).closest('table');
-        if ($(this).hasClass('select-rows')) {
-          target = $('tbody tr', table);
-          $('input.select-row', table).prop('checked', $(this).prop('checked'));
-        }
-        else {
-          target = $(this).closest('tr');
-          $('input.select-rows', table).prop('checked', $(".select-row:not(':checked')", table).length < 1);
-        }
-        target.toggleClass('crm-row-selected', $(this).is(':checked'));
-      })
-      .find('input.select-row:checked').parents('tr').addClass('crm-row-selected');
-    $('.crm-select2:not(.select2-offscreen)', e.target).crmSelect2();
-    $('.crm-form-entityref:not(.select2-offscreen)', e.target).crmEntityRef();
-  });
+  $(document)
+    .on('crmLoad', function(e) {
+      $('table.row-highlight', e.target)
+        .off('.rowHighlight')
+        .on('change.rowHighlight', 'input.select-row, input.select-rows', function () {
+          var target, table = $(this).closest('table');
+          if ($(this).hasClass('select-rows')) {
+            target = $('tbody tr', table);
+            $('input.select-row', table).prop('checked', $(this).prop('checked'));
+          }
+          else {
+            target = $(this).closest('tr');
+            $('input.select-rows', table).prop('checked', $(".select-row:not(':checked')", table).length < 1);
+          }
+          target.toggleClass('crm-row-selected', $(this).is(':checked'));
+        })
+        .find('input.select-row:checked').parents('tr').addClass('crm-row-selected');
+      $('.crm-select2:not(.select2-offscreen)', e.target).crmSelect2();
+      $('.crm-form-entityref:not(.select2-offscreen)', e.target).crmEntityRef();
+    })
+    // Modal dialogs should disable scrollbars
+    .on('dialogopen', function(e) {
+      if ($(e.target).dialog('option', 'modal')) {
+        $(e.target).addClass('modal-dialog');
+        $('body').css({overflow: 'hidden'});
+      }
+    })
+    .on('dialogclose', function(e) {
+      if ($('.ui-dialog .modal-dialog').not(e.target).length < 1) {
+        $('body').css({overflow: ''});
+      }
+    });
 
   /**
    * Function to make multiselect boxes behave as fields in small screens
@@ -857,10 +869,7 @@ CRM.validate = CRM.validate || {
       settings.dialog = {
         modal: true,
         width: '65%',
-        height: parseInt($(window).height() * .75),
-        close: function() {
-          $(this).dialog('destroy').remove();
-        }
+        height: parseInt($(window).height() * .75)
       };
     }
     options && $.extend(true, settings, options);
@@ -868,6 +877,9 @@ CRM.validate = CRM.validate || {
     // Create new dialog
     if (settings.dialog) {
       $('<div id="'+ settings.target.substring(1) +'"><div class="crm-loading-element">' + ts('Loading') + '...</div></div>').dialog(settings.dialog);
+      $(settings.target).on('dialogclose', function() {
+        $(this).dialog('destroy').remove();
+      });
     }
     if (settings.dialog && !settings.dialog.title) {
       $(settings.target).on('crmLoad', function(e, data) {
@@ -1041,17 +1053,23 @@ CRM.validate = CRM.validate || {
       })
 
       .on('click', 'a.crm-option-edit-link', function() {
-        var link = $(this);
+        var
+          link = $(this),
+          optionsChanged = false;
         CRM.loadForm(this.href, {openInline: 'a:not("[href=#], .no-popup")'})
-          // Lots of things can happen once the form opens, this is the only event we can really rely on
+          .on('crmFormSuccess', function() {
+            optionsChanged = true;
+          })
           .on('dialogclose', function() {
-            link.trigger('crmOptionsEdited');
-            var $elects = $('select[data-option-edit-path="' + link.data('option-edit-path') + '"]');
-            if ($elects.data('api-entity') && $elects.data('api-field')) {
-              CRM.api3($elects.data('api-entity'), 'getoptions', {sequential: 1, field: $elects.data('api-field')})
-                .done(function(data) {
-                  CRM.utils.setOptions($elects, data.values);
-                });
+            if (optionsChanged) {
+              link.trigger('crmOptionsEdited');
+              var $elects = $('select[data-option-edit-path="' + link.data('option-edit-path') + '"]');
+              if ($elects.data('api-entity') && $elects.data('api-field')) {
+                CRM.api3($elects.data('api-entity'), 'getoptions', {sequential: 1, field: $elects.data('api-field')})
+                  .done(function (data) {
+                    CRM.utils.setOptions($elects, data.values);
+                  });
+              }
             }
           });
         return false;