Api explorer join fixes
authorColeman Watts <coleman@civicrm.org>
Tue, 12 Jan 2016 01:13:15 +0000 (20:13 -0500)
committerColeman Watts <coleman@civicrm.org>
Tue, 12 Jan 2016 02:17:17 +0000 (21:17 -0500)
templates/CRM/Admin/Page/APIExplorer.js

index 7f399db878f5b0721354e819303d2456533737e4..128e880242b5440b2f7a8c8c6cce3056162f034d 100644 (file)
@@ -65,8 +65,9 @@
    * @param entity
    * @param action
    * @param prefix
+   * @param required
    */
-  function populateFields(fields, entity, action, prefix) {
+  function populateFields(fields, entity, action, prefix, required) {
     _.each(getFieldsCache[entity+action].values, function(field) {
       var name = prefix + field.name,
         pos = fields.length;
@@ -81,7 +82,7 @@
         fields[pos].children = [];
         populateFields(fields[pos].children, joins[name], 'get', name + '.');
       }
-      if (!prefix && field['api.required'] && field['api.required'] !== '0') {
+      if (!prefix && required && field['api.required'] && field['api.required'] !== '0') {
         required.push(field.name);
       }
     });
     return response;
   }
 
+  /**
+   * TODO: This works given the current code structure but would cause race conditions if called many times per second
+   * @param entity string
+   * @returns $.Deferred
+   */
   function getActions(entity) {
     if (getActionsCache[entity]) {
       return $.Deferred().resolve(getActionsCache[entity]);
   function onChangeEntityOrAction(changedElement) {
     var required = [];
     fields = [];
+    joins = [];
     getFieldData = {};
     // Special case for getfields
     if (action === 'getfields') {
         }, {})
       };
       showFields(['api_action']);
+      renderJoinSelector();
       return;
     }
     getMetadata(entity, action).done(function(data) {
       }
       onChangeAction(action);
       getFieldData = data.values;
-      populateFields(fields, entity, action, '');
+      populateFields(fields, entity, action, '', required);
       showFields(required);
       renderJoinSelector();
       if (_.includes(['get', 'getsingle', 'getvalue', 'getstat'], action)) {