CRM-13992 : QA fixes mentioned in #comment-57745
[civicrm-core.git] / js / Common.js
index 4471d763eb897444467fb2745c95283904710692..e4ccf6112d488579d20e0daa405400ed19ad1807 100644 (file)
@@ -123,7 +123,7 @@ function showHideByValue(trigger_field_id, trigger_value, target_element_id, tar
 
   if (field_type == 'select') {
     var trigger = trigger_value.split("|");
-    var selectedOptionValue = document.getElementById(trigger_field_id).options[document.getElementById(trigger_field_id).selectedIndex].value;
+    var selectedOptionValue = cj('#' + trigger_field_id).val();
 
     var target = target_element_id.split("|");
     for (var j = 0; j < target.length; j++) {
@@ -150,7 +150,7 @@ function showHideByValue(trigger_field_id, trigger_value, target_element_id, tar
     if (field_type == 'radio') {
       var target = target_element_id.split("|");
       for (var j = 0; j < target.length; j++) {
-        if (document.getElementsByName(trigger_field_id)[0].checked) {
+        if (cj('[name="' + trigger_field_id + '"]').is(':checked')) {
           if (invert) {
             cj('#' + target[j]).hide();
           }
@@ -171,22 +171,6 @@ function showHideByValue(trigger_field_id, trigger_value, target_element_id, tar
   }
 }
 
-/**
- * reset all the radio buttons with a given name
- *
- * @param string fieldName
- * @param object form
- * @return null
- */
-function unselectRadio(fieldName, form) {
-  for (i = 0; i < document.forms[form].elements.length; i++) {
-    if (document.forms[form].elements[i].name == fieldName) {
-      document.forms[form].elements[i].checked = false;
-    }
-  }
-  return;
-}
-
 /**
  * Function to change button text and disable one it is clicked
  *
@@ -257,8 +241,6 @@ CRM.validate = CRM.validate || {
 (function ($, undefined) {
   "use strict";
 
-  // Set select2 defaults
-  $.fn.select2.defaults.minimumResultsForSearch = 10;
   // https://github.com/ivaynberg/select2/pull/2090
   $.fn.select2.defaults.width = 'resolve';
 
@@ -285,8 +267,37 @@ CRM.validate = CRM.validate || {
         var selected = ($.inArray(''+option.key, val) > -1) ? 'selected="selected"' : '';
         $elect.append('<option value="' + option.key + '"' + selected + '>' + option.value + '</option>');
       });
-      $elect.trigger('change');
+      $elect.trigger('crmOptionsUpdated').trigger('change');
+    });
+  };
+
+  CRM.utils.formatSelect2Result = function(row) {
+    var markup = '<div class="crm-select2-row">';
+    if (row.image !== undefined) {
+      markup += '<div class="crm-select2-image"><img src="' + row.image + '"/></div>';
+    }
+    else if (row.icon_class) {
+      markup += '<div class="crm-select2-icon"><div class="crm-icon ' + row.icon_class + '-icon"></div></div>';
+    }
+    markup += '<div><div class="crm-select2-row-label">' + row.label + '</div>';
+    markup += '<div class="crm-select2-row-description">';
+    $.each(row.description || [], function(k, text) {
+      markup += '<p>' + text + '</p>';
+    });
+    markup += '</div></div></div>';
+    return markup;
+  };
+  
+  CRM.utils.formatSelect2CreateLinks = function($el) {
+    var markup = '';
+    $.each($el.data('create-links'), function(k, link) {
+      markup += ' <a class="crm-add-entity crm-hover-button" href="' + link.url + '">';
+      if (link.name) {
+        markup += '<span class="icon ' + link.name + '-icon"></span> ';
+      }
+      markup += link.label + '</a>';
     });
+    return markup;
   };
 
   // Initialize widgets
@@ -307,40 +318,82 @@ CRM.validate = CRM.validate || {
       })
       .find('input.select-row:checked').parents('tr').addClass('crm-row-selected');
     $('.crm-select2', e.target).each(function() {
+      var $el = $(this), options = {};
       // quickform doesn't support optgroups so here's a hack :(
       $('option[value^=crm_optgroup]', this).each(function() {
         $(this).nextUntil('option[value^=crm_optgroup]').wrapAll('<optgroup label="' + $(this).text() + '" />');
         $(this).remove();
       });
-      var options = $(this).data('select-params') || {};
-      // Set placeholder from markup if not specified
-      if ($(this).is('select:not([multiple])')) {
-        options.allowClear = options.allowClear !== undefined ? options.allowClear : !($(this).hasClass('required'));
-        if (options.placeHolder === undefined && $('option:first', this).val() === '') {
+      // Defaults for single-selects
+      if ($el.is('select:not([multiple])')) {
+        options.minimumResultsForSearch = 10;
+        options.allowClear = !($el.hasClass('required'));
+        if ($('option:first', this).val() === '') {
           options.placeholderOption = 'first';
         }
       }
-      // Api-based searching
-      if ($(this).data('api-params')) {
-        $(this).addClass('crm-ajax-select')
-        options.query = function(info) {
-          var api = $(info.element).data('api-params');
-          var params = api.params || {};
-          params[api.search] = info.term;
-          CRM.api3(api.entity, api.action, params).done(function(data) {
-            var results = {context: info.context, results: []};
-            if (typeof(data.values) === 'object') {
-              $.each(data.values, function(k, v) {
-                results.results.push({id: v[api.key], text: v[api.label]});
-              });
+      $.extend(options, $el.data('select-params') || {});
+      // Autocomplete using the getlist api
+      if ($el.data('api-entity') && $el.hasClass('crm-form-entityref')) {
+        $el.addClass('crm-ajax-select');
+        var settings = {
+          // Use select2 ajax helper instead of CRM.api because it provides more value
+          ajax: {
+            url: CRM.url('civicrm/ajax/rest'),
+            data: function (input, page_num) {
+              var params = $el.data('api-params') || {};
+              params.input = input;
+              params.page_num = page_num;
+              return {
+                entity: $el.data('api-entity'),
+                action: 'getlist',
+                json: JSON.stringify(params)
+              };
+            },
+            results: function(data) {
+              return {more: data.more_results, results: data.values || []};
             }
-            info.callback(results);
-          });
-        };
-        options.initSelection = function(el, callback) {
-          callback(el.data('entity-value'));
+          },
+          formatResult: CRM.utils.formatSelect2Result,
+          formatSelection: function(row) {
+            return row.label;
+          },
+          escapeMarkup: function (m) {return m;},
+          initSelection: function(el, callback) {
+            callback(el.data('entity-value'));
+          }
         };
+        if ($el.data('create-links')) {
+          options.formatInputTooShort = function() {
+            var txt = $el.data('select-params').formatInputTooShort || $.fn.select2.defaults.formatInputTooShort;
+            return txt + ' ' + ts('or') + '<br />' + CRM.utils.formatSelect2CreateLinks($el);
+          };
+          options.formatNoMatches = function() {
+            var txt = $el.data('select-params').formatNoMatches || $.fn.select2.defaults.formatNoMatches;
+            return txt + '<br />' + CRM.utils.formatSelect2CreateLinks($el);
+          };
+          $el.on('select2-open', function() {
+            var $el = $(this);
+            $('#select2-drop').off('.crmEntity').on('click.crmEntity', 'a.crm-add-entity', function(e) {
+              $el.select2('close');
+              CRM.loadForm($(this).attr('href'), {
+                dialog: {width: 500, height: 'auto'}
+              }).on('crmFormSuccess', function(e, data) {
+                if ($el.select2('container').hasClass('select2-container-multi')) {
+                  var selection = $el.select2('data');
+                  selection.push(data);
+                  $el.select2('data', selection);
+                } else {
+                  $el.select2('data', data);
+                }
+              });
+              return false;
+            });
+          });
+        }
+        options = $.extend(settings, options);
       }
+      options.dropdownCssClass = 'crm-container';
       $(this).select2(options).removeClass('crm-select2');
     });
   });
@@ -547,6 +600,7 @@ CRM.validate = CRM.validate || {
    *  passing in a function instead of an object is a shortcut for a sinlgle button labeled "Continue"
    * @param options {object|void} Override defaults, keys include 'title', 'message',
    *  see jQuery.dialog for full list of available params
+   * @param cancelLabel {string}
    */
   CRM.confirm = function (buttons, options, cancelLabel) {
     var dialog, callbacks = {};
@@ -576,8 +630,9 @@ CRM.validate = CRM.validate || {
     }
     $.each(callbacks, function (label, callback) {
       settings.buttons[label] = function () {
-        callback.call(dialog);
-        dialog.dialog('close');
+        if (callback.call(dialog) !== false) {
+          dialog.dialog('close');
+        }
       };
     });
     dialog = $('<div class="crm-container crm-confirm-dialog"></div>')
@@ -956,17 +1011,30 @@ CRM.validate = CRM.validate || {
         }
       })
 
-      .on('click', 'a.crm-edit-optionvalue-link', function() {
-        var url = $(this).data('option-group-url');
-        CRM.loadForm(CRM.url(url, {reset: 1}))
+      .on('click', 'a.crm-option-edit-link', function() {
+        var link = $(this);
+        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('dialogclose', function() {
-            var $elects = $('select[data-option-group-url="' + url + '"]');
-            CRM.api3($elects.data('api-entity'), 'getoptions', {sequential: 1, field: $elects.data('api-field')})
-              .done(function(data) {
-                CRM.utils.setOptions($elects, data.values);
-              });
+            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;
+      })
+      // Handle clear button for form elements
+      .on('click', 'a.crm-clear-link', function() {
+        $(this).css({visibility: 'hidden'}).siblings('.crm-form-radio:checked').prop('checked', false).change();
+        $(this).siblings('input:text').val('').change();
+        return false;
+      })
+      .on('change', 'input.crm-form-radio:checked', function() {
+        $(this).siblings('.crm-clear-link').css({visibility: ''});
       });
     $().crmtooltip();
   });