CRM-17645 - Convert case autocompletes to use EntityRef
authorColeman Watts <coleman@civicrm.org>
Thu, 14 Jan 2016 02:22:23 +0000 (21:22 -0500)
committerColeman Watts <coleman@civicrm.org>
Thu, 14 Jan 2016 17:48:09 +0000 (12:48 -0500)
13 files changed:
CRM/Activity/Form/Task/FileOnCase.php
CRM/Case/BAO/Case.php
CRM/Case/BAO/CaseContact.php
CRM/Case/Form/Activity/LinkCases.php
CRM/Case/Form/ActivityToCase.php
CRM/Case/Form/CaseView.php
CRM/Case/Page/AJAX.php
CRM/Case/xml/Menu/Case.xml
api/v3/Case.php
templates/CRM/Activity/Form/Task/FileOnCase.tpl
templates/CRM/Case/Form/Activity/LinkCases.tpl
templates/CRM/Case/Form/ActivityToCase.tpl
tests/phpunit/CRM/Case/BAO/CaseTest.php

index 8667562b24ff62a6783c5e0330f95fffb013ded5..01547676302fb6852b4e1cdd31bf2988dbe006d0 100644 (file)
@@ -68,7 +68,7 @@ class CRM_Activity_Form_Task_FileOnCase extends CRM_Activity_Form_Task {
    * Build the form object.
    */
   public function buildQuickForm() {
-    $this->add('text', 'unclosed_case_id', ts('Select Case'), array('class' => 'huge'), TRUE);
+    $this->addEntityRef('unclosed_case_id', ts('Select Case'), array('entity' => 'Case'), TRUE);
     $this->addDefaultButtons(ts('Save'));
   }
 
index 97fd1764ee3ccfdd4f47636209a5d350774ebda4..a4521dbcdebdae61bf268303d711b58c8017bbd1 100644 (file)
@@ -2790,15 +2790,19 @@ WHERE id IN (' . implode(',', $copiedActivityIds) . ')';
     );
 
     if (in_array($operation, $caseActOperations)) {
-      static $unclosedCases;
-      if (!is_array($unclosedCases)) {
-        $unclosedCases = self::getUnclosedCases();
+      static $caseCount;
+      if (!isset($caseCount)) {
+        $caseCount = civicrm_api3('Case', 'getcount', array(
+          'status_id' => array('!=' => 'Closed'),
+          'is_deleted' => 0,
+          'end_date' => array('IS NULL' => 1),
+        ));
       }
       if ($operation == 'File On Case') {
-        $allow = (empty($unclosedCases)) ? FALSE : TRUE;
+        $allow = !empty($caseCount);
       }
       else {
-        $allow = (count($unclosedCases) > 1) ? TRUE : FALSE;
+        $allow = ($caseCount > 1);
       }
     }
 
index 4b4bd06c58fcaf514e553f0617483b9cc3765a2b..3329017ff6723231a03d397ed38bdf5583453d56 100644 (file)
@@ -91,10 +91,10 @@ class CRM_Case_BAO_CaseContact extends CRM_Case_DAO_CaseContact {
     $caseSubclauses = array();
     $caseBao = new CRM_Case_BAO_Case();
     foreach ($caseBao->apiWhereClause() as $field => $fieldClauses) {
-      if ($field == 'id') {
+      if ($field == 'id' && $fieldClauses) {
         $clauses['case_id'] = array_merge($clauses['case_id'], (array) $fieldClauses);
       }
-      else {
+      elseif ($fieldClauses) {
         $caseSubclauses[] = "$field " . implode(" AND $field ", (array) $fieldClauses);
       }
     }
index 25880a8f156652a679e7a74dc857f6691ccf08db..805f3e64aea10c19801dd74eed4384ccacbd2aa9 100644 (file)
@@ -32,7 +32,7 @@
  */
 
 /**
- * This class generates form components for OpenCase Activity.
+ * This class generates form components for LinkCase Activity.
  */
 class CRM_Case_Form_Activity_LinkCases {
   /**
@@ -41,7 +41,7 @@ class CRM_Case_Form_Activity_LinkCases {
    * @throws Exception
    */
   public static function preProcess(&$form) {
-    if (!isset($form->_caseId)) {
+    if (empty($form->_caseId)) {
       CRM_Core_Error::fatal(ts('Case Id not found.'));
     }
     if (count($form->_caseId) != 1) {
@@ -51,6 +51,7 @@ class CRM_Case_Form_Activity_LinkCases {
     $caseId = CRM_Utils_Array::first($form->_caseId);
 
     $form->assign('clientID', $form->_currentlyViewedContactId);
+    $form->assign('sortName', CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $form->_currentlyViewedContactId, 'sort_name'));
     $form->assign('caseTypeLabel', CRM_Case_BAO_Case::getCaseType($caseId));
 
     // get the related cases for given case.
@@ -59,11 +60,6 @@ class CRM_Case_Form_Activity_LinkCases {
       $relatedCases = CRM_Case_BAO_Case::getRelatedCases($caseId, $form->_currentlyViewedContactId);
       $form->set('relatedCases', empty($relatedCases) ? FALSE : $relatedCases);
     }
-    $excludeCaseIds = array($caseId);
-    if (is_array($relatedCases) && !empty($relatedCases)) {
-      $excludeCaseIds = array_merge($excludeCaseIds, array_keys($relatedCases));
-    }
-    $form->assign('excludeCaseIds', implode(',', $excludeCaseIds));
   }
 
   /**
@@ -81,7 +77,21 @@ class CRM_Case_Form_Activity_LinkCases {
    * @param CRM_Core_Form $form
    */
   public static function buildQuickForm(&$form) {
-    $form->add('text', 'link_to_case_id', ts('Link To Case'), array('class' => 'huge'), TRUE);
+    $excludeCaseIds = (array) $form->_caseId;
+    $relatedCases = $form->get('relatedCases');
+    if (is_array($relatedCases) && !empty($relatedCases)) {
+      $excludeCaseIds = array_merge($excludeCaseIds, array_keys($relatedCases));
+    }
+    $form->addEntityRef('link_to_case_id', ts('Link To Case'), array(
+      'entity' => 'Case',
+      'api' => array(
+        'extra' => array('case_id.case_type_id.title', 'contact_id.sort_name'),
+        'params' => array(
+          'case_id' => array('NOT IN' => $excludeCaseIds),
+          'case_id.is_deleted' => 0,
+        ),
+      ),
+    ), TRUE);
   }
 
   /**
index 5ce068eff3903c54f11a6e444c6d9efdfad73eea..3a981f898af4dcdceef40ca2bb3ac7b58d1621b7 100644 (file)
@@ -68,18 +68,20 @@ class CRM_Case_Form_ActivityToCase extends CRM_Core_Form {
     // If this contact has an open case, supply it as a default
     $cid = CRM_Utils_Request::retrieve('cid', 'Integer');
     if ($cid) {
-      $cases = CRM_Case_BAO_Case::getUnclosedCases(array('contact_id' => $cid), $this->_currentCaseId);
-      foreach ($cases as $id => $details) {
-        $defaults['file_on_case_unclosed_case_id'] = $id;
-        $value = array(
-          'label' => $details['sort_name'] . ' - ' . $details['case_type'],
-          'extra' => array('contact_id' => $cid),
-        );
-        $this->updateElementAttr('file_on_case_unclosed_case_id', array('data-value' => json_encode($value)));
+      $cases = civicrm_api3('CaseContact', 'get', array(
+        'contact_id' => $cid,
+        'case_id' => array('!=' => $this->_currentCaseId),
+        'case_id.status_id' => array('!=' => "Closed"),
+        'case_id.is_deleted' => 0,
+        'case_id.end_date' => array('IS NULL' => 1),
+        'options' => array('limit' => 1),
+        'return' => 'case_id',
+      ));
+      foreach ($cases['values'] as $record) {
+        $defaults['file_on_case_unclosed_case_id'] = $record['case_id'];
         break;
       }
     }
-
     return $defaults;
   }
 
@@ -87,7 +89,18 @@ class CRM_Case_Form_ActivityToCase extends CRM_Core_Form {
    * Build the form object.
    */
   public function buildQuickForm() {
-    $this->add('text', 'file_on_case_unclosed_case_id', ts('Select Case'), array('class' => 'huge'), TRUE);
+    $this->addEntityRef('file_on_case_unclosed_case_id', ts('Select Case'), array(
+      'entity' => 'Case',
+      'api' => array(
+        'extra' => array('contact_id'),
+        'params' => array(
+          'case_id' => array('!=' => $this->_currentCaseId),
+          'case_id.is_deleted' => 0,
+          'case_id.status_id' => array('!=' => "Closed"),
+          'case_id.end_date' => array('IS NULL' => 1),
+        ),
+      ),
+    ), TRUE);
     $this->addEntityRef('file_on_case_target_contact_id', ts('With Contact(s)'), array('multiple' => TRUE));
     $this->add('text', 'file_on_case_activity_subject', ts('Subject'), array('size' => 50));
   }
index d9990326cd835f0455b0042f8ea81b8878241061..62a38cf5db6e0235441c8f73960aecde10e47d64 100644 (file)
@@ -240,10 +240,16 @@ class CRM_Case_Form_CaseView extends CRM_Core_Form {
       unset($aTypes[$openActTypeId]);
     }
 
-    //check for link cases.
-    $unclosedCases = CRM_Case_BAO_Case::getUnclosedCases(NULL, array($this->_caseID));
-    if (empty($unclosedCases) && ($linkActTypeId = array_search('Link Cases', $allActTypes))) {
-      unset($aTypes[$linkActTypeId]);
+    // Only show "link cases" activity if other cases exist.
+    $linkActTypeId = array_search('Link Cases', $allActTypes);
+    if ($linkActTypeId) {
+      $count = civicrm_api3('Case', 'getcount', array(
+        'id' => array('!=' => $this->_caseID),
+        'is_deleted' => 0,
+      ));
+      if (!$count) {
+        unset($aTypes[$linkActTypeId]);
+      }
     }
 
     if (!$xmlProcessor->getNaturalActivityTypeSort()) {
index 874c2aa1357163e377502d0ef38ba519f5f7bac4..2e3a999ea267e16d24143b02a76ef9e8031fce5f 100644 (file)
  */
 class CRM_Case_Page_AJAX {
 
-  /**
-   * Retrieve unclosed cases.
-   */
-  public static function unclosedCases() {
-    $params = array(
-      'limit' => Civi::settings()->get('search_autocomplete_count'),
-      'sort_name' => CRM_Utils_Type::escape(CRM_Utils_Array::value('term', $_GET, ''), 'String'),
-    );
-
-    $excludeCaseIds = array();
-    if (!empty($_GET['excludeCaseIds'])) {
-      $excludeCaseIds = explode(',', CRM_Utils_Type::escape($_GET['excludeCaseIds'], 'String'));
-    }
-    $unclosedCases = CRM_Case_BAO_Case::getUnclosedCases($params, $excludeCaseIds, TRUE, TRUE);
-    $results = array();
-    foreach ($unclosedCases as $caseId => $details) {
-      $results[] = array(
-        'id' => $caseId,
-        'label' => $details['sort_name'] . ' - ' . $details['case_type'] . ($details['end_date'] ? ' (' . ts('closed') . ')' : ''),
-        'label_class' => $details['end_date'] ? 'strikethrough' : '',
-        'description' => array("#$caseId: " . $details['case_subject'] . ' (' . $details['case_status'] . ')'),
-        'extra' => $details,
-      );
-    }
-    CRM_Utils_JSON::output($results);
-  }
-
   /**
    * @throws \CRM_Core_Exception
    */
index 25ce7cf1c9134a202fbc268205e175d02399c255..2d270503cc80da0bd7557a030709d61078d5515a 100644 (file)
      <page_callback>CRM_Case_XMLProcessor_Report::printCaseReport</page_callback>
      <access_arguments>access all cases and activities</access_arguments>
   </item>
-  <item>
-     <path>civicrm/case/ajax/unclosed</path>
-     <page_callback>CRM_Case_Page_AJAX::unclosedCases</page_callback>
-  </item>
   <item>
      <path>civicrm/case/ajax/addclient</path>
      <page_callback>CRM_Case_Page_AJAX::addClient</page_callback>
index 722c97c37eacccf8a5be734f6995ccab9c723657..076f001a7346d283b0f0eac3e901873b2c42c3a4 100644 (file)
@@ -250,13 +250,19 @@ function civicrm_api3_case_get($params) {
 
   $foundcases = _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params, TRUE, 'Case', $sql);
 
-  // For historic reasons we return these by default only when fetching a case by id
-  if (!empty($params['id']) && empty($options['return'])) {
-    $options['return'] = array('contacts' => 1, 'activities' => 1, 'contact_id' => 1);
-  }
+  if (empty($options['is_count'])) {
+    // For historic reasons we return these by default only when fetching a case by id
+    if (!empty($params['id']) && empty($options['return'])) {
+      $options['return'] = array(
+        'contacts' => 1,
+        'activities' => 1,
+        'contact_id' => 1,
+      );
+    }
 
-  foreach ($foundcases['values'] as &$case) {
-    _civicrm_api3_case_read($case, $options);
+    foreach ($foundcases['values'] as &$case) {
+      _civicrm_api3_case_read($case, $options);
+    }
   }
 
   return $foundcases;
index 6c5f5a094ee6477bc3f3b2aea1ed4b025923d010..addca927129f4f438c2dfe7b1c3f5155f4d3745a 100644 (file)
 </table>
 <div class="crm-submit-buttons">{include file="CRM/common/formButtons.tpl" location="bottom"}</div>
 </div>
-{literal}
-<script type="text/javascript">
-CRM.$(function($) {
-  var $form = $("form.{/literal}{$form.formClass}{literal}");
-  $('input[name=unclosed_case_id]', $form).crmSelect2({
-    placeholder: {/literal}'{ts escape="js"}- select case -{/ts}'{literal},
-    minimumInputLength: 1,
-    formatResult: CRM.utils.formatSelect2Result,
-    formatSelection: function(row) {
-      return row.label;
-    },
-    ajax: {
-      url: {/literal}"{crmURL p='civicrm/case/ajax/unclosed' h=0}"{literal},
-      data: function(term) {
-        return {term: term};
-      },
-      results: function(response) {
-        return {results: response};
-      }
-    }
-  });
-});
-{/literal}
-</script>
index 2db24f92f20c3557e90e64b08079b4510c225512..5b4b4fe5c4e345b581f90af73b24a998bb01b49a 100644 (file)
 <script type="text/javascript">
   CRM.$(function($) {
     var $form = $("form.{/literal}{$form.formClass}{literal}");
-    $('input[name=link_to_case_id]', $form).crmSelect2({
-      placeholder: {/literal}'{ts escape="js"}- select case -{/ts}'{literal},
-      minimumInputLength: 1,
-      formatResult: CRM.utils.formatSelect2Result,
-      formatSelection: function(row) {
-        return row.label;
-      },
-      ajax: {
-        url: {/literal}"{crmURL p='civicrm/case/ajax/unclosed' h=0}"{literal},
-        data: function(term) {
-          return {term: term, excludeCaseIds: "{/literal}{$excludeCaseIds}{literal}"};
-        },
-        results: function(response) {
-          return {results: response};
-        }
-      }
-    }).change(function() {
+    $('input[name=link_to_case_id]', $form).change(function() {
       if ($(this).val()) {
         var info = $(this).select2('data').extra;
         {/literal}{* Mix in variables and placeholders for clientside substitution *}
-        var subject = "{ts escape=js 1="%1" 2="%2" 3="%3" 4=$client.sort_name 5=$caseTypeLabel 6=$caseID}Create link between %1 - %2 (CaseID: %3) and %4 - %5 (CaseID: %6){/ts}";
+        var subject = "{ts escape=js 1="%1" 2="%2" 3="%3" 4=$sortName 5=$caseTypeLabel 6=$caseID}Create link between %1 - %2 (CaseID: %3) and %4 - %5 (CaseID: %6){/ts}";
         {literal}
-        $('#subject', $form).val(ts(subject, {1: info.sort_name, 2: info.case_type, 3: $(this).val()}));
+        $('#subject', $form).val(ts(subject, {1: info['contact_id.sort_name'], 2: info['case_id.case_type_id.title'], 3: $(this).val()}));
       }
     });
   });
index 6282ab323197a5fc1a8d1930d630db15ddfd41a4..c171f143015389f93d5a4d175babbc2c13e47e5b 100644 (file)
       </tr>
     </table>
   </div>
-{literal}
-  <script type="text/javascript">
-    CRM.$(function($) {
-      var $form = $('form.{/literal}{$form.formClass}{literal}');
-      $('input[name=file_on_case_unclosed_case_id]', $form).crmSelect2({
-        placeholder: {/literal}'{ts escape="js"}- select case -{/ts}'{literal},
-        minimumInputLength: 1,
-        formatResult: CRM.utils.formatSelect2Result,
-        formatSelection: function(row) {
-          return row.label;
-        },
-        initSelection: function($el, callback) {
-          callback($el.data('value'));
-        },
-        ajax: {
-          url: {/literal}"{crmURL p='civicrm/case/ajax/unclosed' h=0}"{literal},
-          data: function(term) {
-            return {term: term, excludeCaseIds: "{/literal}{$currentCaseId}{literal}"};
-          },
-          results: function(response) {
-            return {results: response};
-          }
-        }
-      });
-    });
-  </script>
-{/literal}
 {* main form end *}
 
 {else}
     dataUrl += '&activityId=' + activityID + '&caseId=' + currentCaseId + '&cid=' + {/literal}"{$contactID}"{literal};
 
     function save() {
+      if (!$("#file_on_case_unclosed_case_id").val()) {
+        $("#file_on_case_unclosed_case_id").crmError('{/literal}{ts escape="js"}Please select a case from the list{/ts}{literal}.');
+        return false;
+      }
+
       var $context = $('div.crm-confirm-dialog'),
         selectedCaseId = $('input[name=file_on_case_unclosed_case_id]', $context).val(),
         caseTitle = $('input[name=file_on_case_unclosed_case_id]', $context).select2('data').label,
         subject = $("#file_on_case_activity_subject").val(),
         targetContactId = $("#file_on_case_target_contact_id").val();
 
-      if (!$("#file_on_case_unclosed_case_id").val()) {
-        $("#file_on_case_unclosed_case_id").crmError('{/literal}{ts escape="js"}Please select a case from the list{/ts}{literal}.');
-        return false;
-      }
-
       var postUrl = {/literal}"{crmURL p='civicrm/ajax/activity/convert' h=0 }"{literal};
       $.post( postUrl, { activityID: activityID, caseID: selectedCaseId, contactID: contactId, newSubject: subject, targetContactIds: targetContactId, mode: action, key: {/literal}"{crmKey name='civicrm/ajax/activity/convert'}"{literal} },
         function( values ) {
index 3a2addb01f78f4396370d28058e2d5e2266000c6..1912ea7cc7f999c005f5923f37fd073d096ec81a 100644 (file)
@@ -70,14 +70,6 @@ class CRM_Case_BAO_CaseTest extends CiviUnitTestCase {
     $this->assertEquals(1, $cases['rows']['Housing Support']['Ongoing']['count']);
   }
 
-  public function testGetUnclosedCases() {
-    $params = array(
-      'case_type' => 'ousing Suppor',
-    );
-    $cases = CRM_Case_BAO_Case::getUnclosedCases($params);
-    $this->assertEquals('Housing Support', $cases[1]['case_type']);
-  }
-
   public function testGetContactCases() {
     $cases = CRM_Case_BAO_Case::getContactCases(3);
     $this->assertEquals('Housing Support', $cases[1]['case_type']);