From f07136ba8efc63e0316a9b6f4028fad49ef5f7fd Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Sat, 16 Apr 2022 19:09:58 -0400 Subject: [PATCH] SearchKit - Move loadFieldOptions function to searchMeta service for reusability --- ext/search_kit/ang/crmSearchAdmin.module.js | 28 ++++++++- .../crmSearchAdmin.component.js | 60 +++++-------------- 2 files changed, 42 insertions(+), 46 deletions(-) diff --git a/ext/search_kit/ang/crmSearchAdmin.module.js b/ext/search_kit/ang/crmSearchAdmin.module.js index 6e9ea5f3d9..408bfab2fc 100644 --- a/ext/search_kit/ang/crmSearchAdmin.module.js +++ b/ext/search_kit/ang/crmSearchAdmin.module.js @@ -96,7 +96,7 @@ $scope.$ctrl = this; }) - .factory('searchMeta', function($q, formatForSelect2) { + .factory('searchMeta', function($q, crmApi4, formatForSelect2) { function getEntity(entityName) { if (entityName) { return _.find(CRM.crmSearchAdmin.schema, {name: entityName}); @@ -348,6 +348,32 @@ }); }); }, + // Ensure option lists are loaded for all fields with options + // Sets an optionsLoaded property on each entity to avoid duplicate requests + loadFieldOptions: function(entities) { + var entitiesToLoad = _.transform(entities, function(entitiesToLoad, entityName) { + var entity = getEntity(entityName); + if (!('optionsLoaded' in entity)) { + entity.optionsLoaded = false; + entitiesToLoad[entityName] = [entityName, 'getFields', { + loadOptions: ['id', 'name', 'label', 'description', 'color', 'icon'], + where: [['options', '!=', false]], + select: ['options'] + }, {name: 'options'}]; + } + }, {}); + if (!_.isEmpty(entitiesToLoad)) { + crmApi4(entitiesToLoad).then(function(results) { + _.each(results, function(fields, entityName) { + var entity = getEntity(entityName); + _.each(fields, function(options, fieldName) { + _.find(entity.fields, {name: fieldName}).options = options; + }); + entity.optionsLoaded = true; + }); + }); + } + }, pickIcon: function() { var deferred = $q.defer(); $('#crm-search-admin-icon-picker').off('change').siblings('.crm-icon-picker-button').click(); diff --git a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdmin.component.js b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdmin.component.js index 646f494a39..10957d0a80 100644 --- a/ext/search_kit/ang/crmSearchAdmin/crmSearchAdmin.component.js +++ b/ext/search_kit/ang/crmSearchAdmin/crmSearchAdmin.component.js @@ -575,57 +575,27 @@ return _.findIndex(CRM.crmSearchAdmin.pseudoFields, {name: name}) >= 0; }; - /** - * Fetch pseudoconstants for main entity + joined entities - * - * Sets an optionsLoaded property on each entity to avoid duplicate requests - * - * @var string entity - optional additional entity to load - */ + // Ensure options are loaded for main entity + joined entities + // And an optional additional entity function loadFieldOptions(entity) { - var mainEntity = searchMeta.getEntity(ctrl.savedSearch.api_entity), - entities = {}; - - function enqueue(entity) { - entity.optionsLoaded = false; - entities[entity.name] = [entity.name, 'getFields', { - loadOptions: ['id', 'name', 'label', 'description', 'color', 'icon'], - where: [['options', '!=', false]], - select: ['options'] - }, {name: 'options'}]; - } - - if (typeof mainEntity.optionsLoaded === 'undefined') { - enqueue(mainEntity); - } - - // Optional additional entity - if (entity && typeof searchMeta.getEntity(entity).optionsLoaded === 'undefined') { - enqueue(searchMeta.getEntity(entity)); - } + // Main entity + var entitiesToLoad = [ctrl.savedSearch.api_entity]; + // Join entities + bridge entities _.each(ctrl.savedSearch.api_params.join, function(join) { - var joinInfo = searchMeta.getJoin(join[0]), - joinEntity = searchMeta.getEntity(joinInfo.entity), - bridgeEntity = joinInfo.bridge ? searchMeta.getEntity(joinInfo.bridge) : null; - if (typeof joinEntity.optionsLoaded === 'undefined') { - enqueue(joinEntity); - } - if (bridgeEntity && typeof bridgeEntity.optionsLoaded === 'undefined') { - enqueue(bridgeEntity); + var joinInfo = searchMeta.getJoin(join[0]); + entitiesToLoad.push(joinInfo.entity); + if (joinInfo.bridge) { + entitiesToLoad.push(joinInfo.bridge); } }); - if (!_.isEmpty(entities)) { - crmApi4(entities).then(function(results) { - _.each(results, function(fields, entityName) { - var entity = searchMeta.getEntity(entityName); - _.each(fields, function(options, fieldName) { - _.find(entity.fields, {name: fieldName}).options = options; - }); - entity.optionsLoaded = true; - }); - }); + + // Optional additional entity + if (entity) { + entitiesToLoad.push(entity); } + + searchMeta.loadFieldOptions(entitiesToLoad); } // Build a list of all possible links to main entity & join entities -- 2.25.1