SearchKit - permit selection of current user id for dynamic searches
authorColeman Watts <coleman@civicrm.org>
Wed, 17 Feb 2021 16:56:56 +0000 (11:56 -0500)
committerColeman Watts <coleman@civicrm.org>
Wed, 17 Feb 2021 16:56:56 +0000 (11:56 -0500)
ang/api4Explorer/Explorer.js
ext/search/ang/crmSearchActions/crmSearchInput/entityRef.html
js/Common.js

index 82bce1904513f48cc5606e58a8553a8474a51e70..fb9f5c71ce0d03ccc3c7218e65de3734b5492681 100644 (file)
                 $el.removeClass('loading').crmSelect2({data: options, multiple: multi});
               });
             } else if (field.fk_entity) {
-              $el.crmEntityRef({entity: field.fk_entity, select:{multiple: multi}});
+              $el.crmEntityRef({entity: field.fk_entity, select:{multiple: multi}, static: field.fk_entity === 'Contact' ? ['user_contact_id'] : []});
             } else if (dataType === 'Boolean') {
               $el.attr('placeholder', ts('- select -')).crmSelect2({allowClear: false, multiple: multi, placeholder: ts('- select -'), data: [
                 {id: 'true', text: ts('Yes')},
index b0050d7421eee098010424f2a2a63c925a102e9f..2ad7bc93a7bc5f226fc46e95836903fd7555d775 100644 (file)
@@ -1,6 +1,6 @@
 <div class="form-group" ng-if="!$ctrl.multi">
-  <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.field.fk_entity}">
+  <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.field.fk_entity, static: $ctrl.field.fk_entity === 'Contact' ? ['user_contact_id'] : []}">
 </div>
 <div class="form-group" ng-if="$ctrl.multi">
-  <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.field.fk_entity, select: {multiple: true}}" ng-list >
+  <input class="form-control" ng-model="$ctrl.value" crm-entityref="{entity: $ctrl.field.fk_entity, select: {multiple: true}, static: $ctrl.field.fk_entity === 'Contact' ? ['user_contact_id'] : []}" ng-list >
 </div>
index 93beb168eb569a957e784842554783ca3b07ab55..63db35419386429c233873a266a33656c1ca280a 100644 (file)
@@ -501,7 +501,14 @@ if (!CRM.vars) CRM.vars = {};
       var
         $el = $(this).off('.crmEntity'),
         entity = options.entity || $el.data('api-entity') || 'Contact',
-        selectParams = {};
+        selectParams = {},
+        staticPresets = {
+          user_contact_id: {
+            id: 'user_contact_id',
+            label: ts('Select Current User'),
+            icon: 'fa-user-circle-o'
+          }
+        };
       // Legacy: fix entity name if passed in as snake case
       if (entity.charAt(0).toUpperCase() !== entity.charAt(0)) {
         entity = _.capitalize(_.camelCase(entity));
@@ -510,6 +517,27 @@ if (!CRM.vars) CRM.vars = {};
       $el.data('select-params', $.extend({}, $el.data('select-params') || {}, options.select));
       $el.data('api-params', $.extend(true, {}, $el.data('api-params') || {}, options.api));
       $el.data('create-links', options.create || $el.data('create-links'));
+      var staticItems = options.static || $el.data('static') || [];
+      _.each(staticItems, function(option, i) {
+        if (_.isString(option)) {
+          staticItems[i] = staticPresets[option];
+        }
+      });
+
+      function staticItemMarkup() {
+        if (!staticItems.length) {
+          return '';
+        }
+        var markup = '<div class="crm-entityref-links crm-entityref-links-static">';
+        _.each(staticItems, function(link) {
+          markup += ' <a class="crm-hover-button" href="#' + link.id + '">' +
+            '<i class="crm-i ' + link.icon + '" aria-hidden="true"></i> ' +
+            _.escape(link.label) + '</a>';
+        });
+        markup += '</div>';
+        return markup;
+      }
+
       $el.addClass('crm-form-entityref crm-' + _.kebabCase(entity) + '-ref');
       var settings = {
         // Use select2 ajax helper instead of CRM.api3 because it provides more value
@@ -538,17 +566,21 @@ if (!CRM.vars) CRM.vars = {};
           var
             multiple = !!$el.data('select-params').multiple,
             val = $el.val(),
-            stored = $el.data('entity-value') || [];
+            stored = ($el.data('entity-value') || []).concat(staticItems);
           if (val === '') {
             return;
           }
+          var idsNeeded = _.difference(val.split(','), _.pluck(stored, 'id'));
+          var existing = _.remove(stored, function(item) {
+            return _.includes(val.split(','), item.id);
+          });
           // If we already have this data, just return it
-          if (!_.xor(val.split(','), _.pluck(stored, 'id')).length) {
-            callback(multiple ? stored : stored[0]);
+          if (!idsNeeded.length) {
+            callback(multiple ? existing : existing[0]);
           } else {
-            var params = $.extend({}, $el.data('api-params') || {}, {id: val});
+            var params = $.extend({}, $el.data('api-params') || {}, {id: idsNeeded.join(',')});
             CRM.api3($el.data('api-entity'), 'getlist', params).done(function(result) {
-              callback(multiple ? result.values : result.values[0]);
+              callback(multiple ? result.values.concat(existing) : result.values[0]);
               // Trigger change (store data to avoid an infinite loop of lookups)
               $el.data('entity-value', result.values).trigger('change');
             });
@@ -589,7 +621,7 @@ if (!CRM.vars) CRM.vars = {};
       else {
         selectParams.formatInputTooShort = function() {
           var txt = $el.data('select-params').formatInputTooShort || $.fn.select2.defaults.formatInputTooShort.call(this);
-          txt += entityRefFiltersMarkup($el) + renderEntityRefCreateLinks($el);
+          txt += entityRefFiltersMarkup($el) + staticItemMarkup() + renderEntityRefCreateLinks($el);
           return txt;
         };
         selectParams.formatNoMatches = function() {
@@ -624,6 +656,21 @@ if (!CRM.vars) CRM.vars = {};
               });
               return false;
             })
+            .on('click.crmEntity', '.crm-entityref-links-static a', function(e) {
+              var id = $(this).attr('href').substr(1),
+                item = _.findWhere(staticItems, {id: id});
+              $el.select2('close');
+              if ($el.select2('container').hasClass('select2-container-multi')) {
+                var selection = $el.select2('data');
+                if (!_.findWhere(selection, {id: id})) {
+                  selection.push(item);
+                  $el.select2('data', selection, true);
+                }
+              } else {
+                $el.select2('data', item, true);
+              }
+              return false;
+            })
             .on('change.crmEntity', '.crm-entityref-filter-value', function() {
               var filter = $el.data('user-filter') || {};
               filter.value = $(this).val();
@@ -634,7 +681,7 @@ if (!CRM.vars) CRM.vars = {};
                 $el.select2('close');
                 $el.select2('open');
               } else {
-                $('.crm-entityref-links', '#select2-drop').replaceWith(renderEntityRefCreateLinks($el));
+                $('.crm-entityref-links-create', '#select2-drop').replaceWith(renderEntityRefCreateLinks($el));
               }
             })
             .on('change.crmEntity', 'select.crm-entityref-filter-key', function() {
@@ -714,7 +761,7 @@ if (!CRM.vars) CRM.vars = {};
       createLinks = $el.data('create-links'),
       params = getEntityRefApiParams($el).params,
       entity = $el.data('api-entity'),
-      markup = '<div class="crm-entityref-links">';
+      markup = '<div class="crm-entityref-links crm-entityref-links-create">';
     if (!createLinks || (createLinks === true && !CRM.config.entityRef.links[entity])) {
       return '';
     }