Api Explorer - add support for chaining
authorColeman Watts <coleman@civicrm.org>
Mon, 21 Apr 2014 21:45:10 +0000 (14:45 -0700)
committerColeman Watts <coleman@civicrm.org>
Mon, 21 Apr 2014 21:45:51 +0000 (14:45 -0700)
CRM/Admin/Page/APIExplorer.php
templates/CRM/Admin/Page/APIExplorer.js
templates/CRM/Admin/Page/APIExplorer.tpl

index 912425ca337e93db94b676266ab3be7ef4d7de9e..3ea21f5d65e973976849bbe456d8e59ddf12e10f 100644 (file)
@@ -42,6 +42,18 @@ class CRM_Admin_Page_APIExplorer extends CRM_Core_Page {
     CRM_Utils_System::setTitle(ts('API explorer and generator'));
     CRM_Core_Resources::singleton()->addScriptFile('civicrm', 'templates/CRM/Admin/Page/APIExplorer.js');
     $this->assign('operators', CRM_Core_DAO::acceptedSQLOperators());
+    $this->assign('actions', array(
+      'get',
+      'create',
+      'delete',
+      'getfields',
+      'getactions',
+      'getcount',
+      'getsingle',
+      'getvalue',
+      'getoptions',
+      'getlist',
+    ));
     return parent::run();
   }
 
index 5a066f5dbfb30329ce5b14173c2c0ed960384f90..a800d45c33cf76e8e6971466e55d530480131e0c 100644 (file)
@@ -5,12 +5,23 @@
     fields = [],
     options = {},
     params = {},
-    fieldTpl = _.template($('#api-param-tpl').html());
+    fieldTpl = _.template($('#api-param-tpl').html()),
+    chainTpl = _.template($('#api-chain-tpl').html());
 
   function addField(name) {
     $('#api-params').append($(fieldTpl({name: name || ''})));
     var $row = $('tr:last-child', '#api-params');
-    $('.api-param-name', $row).select2({data: fields}).change();
+    $('.api-param-name', $row).crmSelect2({data: fields}).change();
+  }
+
+  function addChainField() {
+    $('#api-params').append($(chainTpl({})));
+    var $row = $('tr:last-child', '#api-params');
+    $('.api-chain-entity', $row).crmSelect2({
+      formatSelection: function(item) {
+        return '<span class="icon ui-icon-link"></span> API ' + item.text;
+      }
+    });
   }
 
   function getFields() {
@@ -58,7 +69,7 @@
       text: ts('Other') + '...'
     });
     $('#api-params').empty();
-    $('#api-params-add').show();
+    $('#api-param-buttons').show();
     if (required.length) {
       _.each(required, addField);
     } else {
       var $row = $(this).closest('tr'),
         val = evaluate($(this).val(), $(this).is('.select2-offscreen')),
         name = $('input.api-param-name', $row).val(),
-        op = $('select.api-param-op', $row).val();
+        op = $('select.api-param-op', $row).val() || '=';
+      // Special syntax for api chaining
+      if (!name && $('select.api-chain-entity', $row).val()) {
+        name = 'api.' + $('select.api-chain-entity', $row).val() + '.' + $('select.api-chain-action', $row).val();
+      }
       if (name && val !== undefined) {
         params[name] = op === '=' ? val : {};
         if (op !== '=') {
           buildParams();
         } else {
           $('#api-params, #api-generated pre').empty();
-          $('#api-params-add, #api-params-table thead').hide();
+          $('#api-param-buttons, #api-params-table thead').hide();
         }
       })
-      .on('change keyup', 'input.api-param-checkbox, input.api-param-value, input.api-param-name, select.api-param-op', buildParams)
+      .on('change keyup', 'input.api-param-checkbox, input.api-param-value, input.api-param-name, #api-params select', buildParams)
       .on('submit', submit);
     $('#api-params')
       .on('change', '.api-param-name', toggleOptions)
         buildParams();
       });
     $('#api-params-add').on('click', function(e) {
+      e.preventDefault();
       addField();
+    });
+    $('#api-chain-add').on('click', function(e) {
       e.preventDefault();
+      addChainField();
     });
     $('#api-entity').change();
   });
index 2e50b551cb5cb1d127fdbe74e45434b58ee5f72f..38484f6dd1125a061a6610611580081729d69703 100644 (file)
   #api-result {
     overflow: auto;
   }
+  .select2-choice .icon {
+    margin-top: .2em;
+    background-image: url("{/literal}{$config->resourceBase}{literal}/i/icons/jquery-ui-2786C2.png");
+  }
   {/literal}
 </style>
 
   &nbsp;&nbsp;
   <label for="api-action">{ts}Action{/ts}:</label>
   <select class="crm-form-select crm-select2" id="api-action" name="action">
-    <option value="get" selected="selected">get</option>
-    <option value="create" title="used to update as well, if id is set">create</option>
-    <option value="delete">delete</option>
-    <option value="getfields">getfields</option>
-    <option value="getactions">getactions</option>
-    <option value="getcount">getcount</option>
-    <option value="getsingle">getsingle</option>
-    <option value="getvalue">getvalue</option>
-    <option value="getoptions">getoptions</option>
-    <option value="getlist">getlist</option>
+    {foreach from=$actions item='act'}
+      <option value="{$act}">{$act}</option>
+    {/foreach}
   </select>
   &nbsp;&nbsp;
 
     </thead>
     <tbody id="api-params"></tbody>
   </table>
-  <div>
-    <a href="#" class="crm-hover-button" id="api-params-add" style="display: none;"><span class="icon ui-icon-plus"></span>{ts}Add Parameter{/ts}</a>
+  <div id="api-param-buttons" style="display: none;">
+    <a href="#" class="crm-hover-button" id="api-params-add"><span class="icon ui-icon-plus"></span>{ts}Add Parameter{/ts}</a>
+    <a href="#" class="crm-hover-button" id="api-chain-add"><span class="icon ui-icon-link"></span>{ts}Chain API Call{/ts}</a>
   </div>
   <div id="api-generated-wraper">
     <table id="api-generated" border=1>
     </td>
   </tr>
 </script>
+
+<script type="text/template" id="api-chain-tpl">
+  <tr class="api-chain-row">
+    <td>
+      <select style="width: 100%;" class="crm-form-select api-chain-entity" placeholder="{ts}Entity{/ts}">
+        <option value=""></option>
+        {foreach from=$entities.values item=entity}
+          <option value="{$entity}">{$entity}</option>
+        {/foreach}
+      </select>
+    </td>
+    <td>
+      <select class="crm-form-select api-chain-action">
+        {foreach from=$actions item='act'}
+          <option value="{$act}">{$act}</option>
+        {/foreach}
+    </select>
+    </td>
+    <td>
+      <input style="width: 85%;" class="crm-form-text api-param-value" value="{ldelim}{rdelim}" placeholder="{ts}Api Params{/ts}"/>
+      <a class="crm-hover-button api-param-remove" href="#"><span class="icon ui-icon-close"></span></a>
+    </td>
+  </tr>
+</script>
 {/strip}