dev/core#4937 - Fix js error in formBuilder autocompletes
authorcolemanw <coleman@civicrm.org>
Fri, 26 Jan 2024 15:11:43 +0000 (10:11 -0500)
committercolemanw <coleman@civicrm.org>
Fri, 26 Jan 2024 15:11:43 +0000 (10:11 -0500)
Due to 5071a76 this field was fetching form values during every digest cycle and in some
cases this was causing an infinite loop. Updated the field to only fetch values when needed.

ext/afform/core/ang/af/afField.component.js
ext/afform/core/ang/af/fields/EntityRef.html
js/Common.js

index c8c56c6e72148d6eb537551fcad79404be07b4ba..80d1d1ed050e6ac6b9558cdafb132ddce112de39 100644 (file)
         };
       };
 
-      ctrl.getAutocompleteFieldName = function() {
-        return ctrl.afFieldset.modelName + (ctrl.afJoin ? ('+' + ctrl.afJoin.entity) : '') + ':' + ctrl.fieldName;
+      ctrl.getAutocompleteParams = function() {
+        return {
+          formName: 'afform:' + ctrl.afFieldset.getFormName(),
+          fieldName: ctrl.afFieldset.getName() + ':' + ctrl.fieldName,
+          values: $scope.dataProvider.getFieldData()
+        };
       };
 
       $scope.getOptions = function () {
index 28bd70cf829121b0053eca8167b4abde99b79938..57b830dc694754796a377e39198a36fa3c44a16c 100644 (file)
@@ -5,7 +5,7 @@
        ng-model="getSetSelect"
        ng-model-options="{getterSetter: true}"
        crm-autocomplete="$ctrl.defn.fk_entity"
-       crm-autocomplete-params="{formName: 'afform:' + $ctrl.afFieldset.getFormName(), fieldName: $ctrl.afFieldset.getName() + ':' + $ctrl.fieldName, values: dataProvider.getFieldData()}"
+       crm-autocomplete-params="$ctrl.getAutocompleteParams"
        multi="$ctrl.defn.input_attrs.multiple"
        auto-open="$ctrl.defn.input_attrs.autoOpen"
        quick-add="$ctrl.defn.input_attrs.quickAdd"
index 1b5c08f9d1a661150cf293996e30e30982c496cf..dd084d11e1ec30aabb4942ed1b5ddc209a90999c 100644 (file)
@@ -570,6 +570,12 @@ if (!CRM.vars) CRM.vars = {};
 
   // Autocomplete based on APIv4 and Select2.
   $.fn.crmAutocomplete = function(entityName, apiParams, select2Options) {
+    function getApiParams() {
+      if (typeof apiParams === 'function') {
+        return apiParams();
+      }
+      return apiParams || {};
+    }
     if (entityName === 'destroy') {
       return $(this).off('.crmEntity').crmSelect2('destroy');
     }
@@ -578,8 +584,7 @@ if (!CRM.vars) CRM.vars = {};
       const $el = $(this).off('.crmEntity');
       let staticItems = getStaticOptions(select2Options.static),
         quickAddLinks = select2Options.quickAdd,
-        multiple = !!select2Options.multiple,
-        key = apiParams.key || 'id';
+        multiple = !!select2Options.multiple;
 
       $el.crmSelect2(_.extend({
         ajax: {
@@ -589,7 +594,7 @@ if (!CRM.vars) CRM.vars = {};
             return {params: JSON.stringify(_.assign({
               input: input,
               page: pageNum || 1
-            }, apiParams))};
+            }, getApiParams()))};
           },
           results: function(data) {
             return {
@@ -615,7 +620,7 @@ if (!CRM.vars) CRM.vars = {};
           if (!idsNeeded.length) {
             callback(multiple ? existing : existing[0]);
           } else {
-            var params = $.extend({}, apiParams || {}, {ids: idsNeeded});
+            var params = $.extend({}, getApiParams(), {ids: idsNeeded});
             CRM.api4(entityName, 'autocomplete', params).then(function (result) {
               callback(multiple ? result.concat(existing) : result[0]);
             });
@@ -663,6 +668,7 @@ if (!CRM.vars) CRM.vars = {};
               const response = data.submissionResponse && data.submissionResponse[0];
               let createdId;
               if (typeof response === 'object') {
+                let key = getApiParams().key || 'id';
                 // Loop through entities created by the afform (there should be only one)
                 Object.keys(response).forEach((entity) => {
                   if (Array.isArray(response[entity]) && response[entity][0] && response[entity][0][key]) {