From 7a4cf12713cec62bac2324e25c49d152cef648df Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 17 Feb 2021 11:56:56 -0500 Subject: [PATCH] SearchKit - permit selection of current user id for dynamic searches --- ang/api4Explorer/Explorer.js | 2 +- .../crmSearchInput/entityRef.html | 4 +- js/Common.js | 65 ++++++++++++++++--- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/ang/api4Explorer/Explorer.js b/ang/api4Explorer/Explorer.js index 82bce19045..fb9f5c71ce 100644 --- a/ang/api4Explorer/Explorer.js +++ b/ang/api4Explorer/Explorer.js @@ -1157,7 +1157,7 @@ $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')}, diff --git a/ext/search/ang/crmSearchActions/crmSearchInput/entityRef.html b/ext/search/ang/crmSearchActions/crmSearchInput/entityRef.html index b0050d7421..2ad7bc93a7 100644 --- a/ext/search/ang/crmSearchActions/crmSearchInput/entityRef.html +++ b/ext/search/ang/crmSearchActions/crmSearchInput/entityRef.html @@ -1,6 +1,6 @@
- +
- +
diff --git a/js/Common.js b/js/Common.js index 93beb168eb..63db354193 100644 --- a/js/Common.js +++ b/js/Common.js @@ -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 = ''; + 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 = '