CRM-16353 - Case DataTables refactoring
authorJoseph Lacey <joseph@palantetech.coop>
Thu, 30 Apr 2015 02:39:19 +0000 (20:39 -0600)
committerJoseph Lacey <joseph@palantetech.coop>
Thu, 30 Apr 2015 02:39:19 +0000 (20:39 -0600)
----------------------------------------
* CRM-16353: Upgrade datatables integration to use v2 api
  https://issues.civicrm.org/jira/browse/CRM-16353

CRM/Activity/BAO/Activity.php
CRM/Activity/Page/AJAX.php
CRM/Case/BAO/Case.php
templates/CRM/Case/Form/ActivityTab.tpl
templates/CRM/Case/Form/CaseView.js
templates/CRM/Case/Form/CaseView.tpl

index 41be25ada335022ca98ddc87d1141fb2e57eaeff..a6cb989faa9aebf5d13140b37cb4a411acf9fcc5 100644 (file)
@@ -2514,6 +2514,8 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
 
         $activity['activity_type'] = $values['activity_type'];
         $activity['subject'] = $values['subject'];
+
+        $activity['source_contact_name'] = '';
         if ($params['contact_id'] == $values['source_contact_id']) {
           $activity['source_contact_name'] = $values['source_contact_name'];
         }
@@ -2525,6 +2527,7 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
           $activity['source_contact_name'] = '<em>n/a</em>';
         }
 
+        $activity['target_contact_name'] = '';
         if (isset($values['mailingId']) && !empty($values['mailingId'])) {
           $activity['target_contact'] = CRM_Utils_System::href($values['recipients'],
             'civicrm/mailing/report/event',
@@ -2548,6 +2551,7 @@ INNER JOIN  civicrm_option_group grp ON ( grp.id = val.option_group_id AND grp.n
           $activity['target_contact_name'] = '<em>n/a</em>';
         }
 
+        $activity['assignee_contact_name'] = '';
         if (empty($values['assignee_contact_name'])) {
           $activity['assignee_contact_name'] = '<em>n/a</em>';
         }
index 9f6c7ee94fc9e90576909a7e1e436e2619b0cdba..5e69a054cdf7f7e54e53d2076e3a9695b1b53236 100644 (file)
@@ -42,25 +42,19 @@ class CRM_Activity_Page_AJAX {
     $userID = CRM_Utils_Type::escape($_GET['userID'], 'Integer');
     $context = CRM_Utils_Type::escape(CRM_Utils_Array::value('context', $_GET), 'String');
 
-    $sortMapper = array(
-      0 => 'display_date',
-      1 => 'ca.subject',
-      2 => 'ca.activity_type_id',
-      3 => 'acc.sort_name',
-      4 => 'cc.sort_name',
-      5 => 'ca.status_id',
-    );
+    $sortMapper = array();
+    foreach ($_GET['columns'] as $key => $value) {
+      $sortMapper[$key] = $value['data'];
+    };
 
-    $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer');
-    $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0;
-    $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25;
-    $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : NULL;
-    $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc';
+    $offset = isset($_GET['start']) ? CRM_Utils_Type::escape($_GET['start'], 'Integer') : 0;
+    $rowCount = isset($_GET['length']) ? CRM_Utils_Type::escape($_GET['length'], 'Integer') : 25;
+    $sort = isset($_GET['order'][0]['column']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_GET['order'][0]['column'], 'Integer'), $sortMapper) : NULL;
+    $sortOrder = isset($_GET['order'][0]['dir']) ? CRM_Utils_Type::escape($_GET['order'][0]['dir'], 'String') : 'asc';
 
-    $params = $_POST;
+    $params = $_GET;
     if ($sort && $sortOrder) {
-      $params['sortname'] = $sort;
-      $params['sortorder'] = $sortOrder;
+      $params['sortBy'] = $sort . ' ' . $sortOrder;
     }
     $params['page'] = ($offset / $rowCount) + 1;
     $params['rp'] = $rowCount;
@@ -68,37 +62,22 @@ class CRM_Activity_Page_AJAX {
     // get the activities related to given case
     $activities = CRM_Case_BAO_Case::getCaseActivity($caseID, $params, $contactID, $context, $userID);
 
-    $iFilteredTotal = $iTotal = $params['total'];
-    $selectorElements = array(
-      'display_date',
-      'subject',
-      'type',
-      'with_contacts',
-      'reporter',
-      'status',
-      'links',
-      'class',
-    );
-
-    header('Content-Type: application/json');
-    echo CRM_Utils_JSON::encodeDataTableSelector($activities, $sEcho, $iTotal, $iFilteredTotal, $selectorElements);
-    CRM_Utils_System::civiExit();
+    CRM_Utils_JSON::output($activities);
   }
 
   public static function getCaseGlobalRelationships() {
-    $sortMapper = array(
-      0 => 'sort_name',
-      1 => 'phone',
-      2 => 'email',
-    );
+    $sortMapper = array();
+    foreach ($_GET['columns'] as $key => $value) {
+      $sortMapper[$key] = $value['data'];
+    };
 
-    $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer');
-    $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0;
-    $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25;
-    $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : NULL;
-    $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc';
+    $offset = isset($_GET['start']) ? CRM_Utils_Type::escape($_GET['start'], 'Integer') : 0;
+    $rowCount = isset($_GET['length']) ? CRM_Utils_Type::escape($_GET['length'], 'Integer') : 25;
+    $sort = isset($_GET['order'][0]['column']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_GET['order'][0]['column'], 'Integer'), $sortMapper) : NULL;
+    $sortOrder = isset($_GET['order'][0]['dir']) ? CRM_Utils_Type::escape($_GET['order'][0]['dir'], 'String') : 'asc';
+
+    $params = $_GET;
 
-    $params = $_POST;
     //CRM-14466 initialize variable to avoid php notice
     $sortSQL = "";
     if ($sort && $sortOrder) {
@@ -113,35 +92,42 @@ class CRM_Activity_Page_AJAX {
     // limit the rows
     $relGlobal = CRM_Case_BAO_Case::getGlobalContacts($globalGroupInfo, $sortSQL, $showLinks = TRUE, FALSE, $offset, $rowCount);
 
-    $iFilteredTotal = $iTotal = $relGlobalTotalCount;
-    $selectorElements = array('sort_name', 'phone', 'email');
+    $relationships = array();
+    // after sort we can update username fields to be a url
+    foreach ($relGlobal as $key => $value) {
+      $relationship = array();
+      $relationship['sort_name'] = $value['sort_name'];
+      $relationship['phone'] = $value['phone'];
+      $relationship['email'] = $value['email'];
+
+      array_push($relationships, $relationship);
+    }
 
-    header('Content-Type: application/json');
-    echo CRM_Utils_JSON::encodeDataTableSelector($relGlobal, $sEcho, $iTotal, $iFilteredTotal, $selectorElements);
-    CRM_Utils_System::civiExit();
+    $params['total'] = count($relationships);
+
+    $globalRelationshipsDT = array();
+    $globalRelationshipsDT['data'] = $relationships;
+    $globalRelationshipsDT['recordsTotal'] = $params['total'];
+    $globalRelationshipsDT['recordsFiltered'] = $params['total'];
+    
+    CRM_Utils_JSON::output($globalRelationshipsDT);
   }
 
   public static function getCaseClientRelationships() {
     $caseID = CRM_Utils_Type::escape($_GET['caseID'], 'Integer');
     $contactID = CRM_Utils_Type::escape($_GET['cid'], 'Integer');
 
-    $sortMapper = array(
-      0 => 'relation',
-      1 => 'name',
-      2 => 'phone',
-      3 => 'email',
-    );
+    $sortMapper = array();
+    foreach ($_GET['columns'] as $key => $value) {
+      $sortMapper[$key] = $value['data'];
+    };
 
-    $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer');
-    $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0;
-    $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25;
-    $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : 'relation';
-    $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc';
+    $offset = isset($_GET['start']) ? CRM_Utils_Type::escape($_GET['start'], 'Integer') : 0;
+    $rowCount = isset($_GET['length']) ? CRM_Utils_Type::escape($_GET['length'], 'Integer') : 25;
+    $sort = isset($_GET['order'][0]['column']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_GET['order'][0]['column'], 'Integer'), $sortMapper) : NULL;
+    $sortOrder = isset($_GET['order'][0]['dir']) ? CRM_Utils_Type::escape($_GET['order'][0]['dir'], 'String') : 'asc';
 
-    $params = $_POST;
-    if ($sort && $sortOrder) {
-      $sortSQL = $sort . ' ' . $sortOrder;
-    }
+    $params = $_GET;
 
     // Retrieve ALL client relationships
     $relClient = CRM_Contact_BAO_Relationship::getRelationship($contactID,
@@ -167,22 +153,27 @@ class CRM_Activity_Page_AJAX {
     $sort_type = "SORT_" . strtoupper($sortOrder);
     array_multisort($sortArray, constant($sort_type), $clientRelationships);
 
-    //limit the rows
-    $allClientRelationships = $clientRelationships;
-    $clientRelationships = array_slice($allClientRelationships, $offset, $rowCount, TRUE);
-
+    $relationships = array();
     // after sort we can update username fields to be a url
     foreach ($clientRelationships as $key => $value) {
-      $clientRelationships[$key]['name'] = '<a href=' . CRM_Utils_System::url('civicrm/contact/view',
+      $relationship = array();
+      $relationship['relation'] = $value['relation'];
+      $relationship['name'] = '<a href=' . CRM_Utils_System::url('civicrm/contact/view',
           'action=view&reset=1&cid=' . $clientRelationships[$key]['cid']) . '>' . $clientRelationships[$key]['name'] . '</a>';
+      $relationship['phone'] = $value['phone'];
+      $relationship['email'] = $value['email'];
+
+      array_push($relationships, $relationship);
     }
 
-    $iFilteredTotal = $iTotal = $params['total'] = count($allClientRelationships);
-    $selectorElements = array('relation', 'name', 'phone', 'email');
+    $params['total'] = count($relationships);
 
-    header('Content-Type: application/json');
-    echo CRM_Utils_JSON::encodeDataTableSelector($clientRelationships, $sEcho, $iTotal, $iFilteredTotal, $selectorElements);
-    CRM_Utils_System::civiExit();
+    $clientRelationshipsDT = array();
+    $clientRelationshipsDT['data'] = $relationships;
+    $clientRelationshipsDT['recordsTotal'] = $params['total'];
+    $clientRelationshipsDT['recordsFiltered'] = $params['total'];
+    
+    CRM_Utils_JSON::output($clientRelationshipsDT);
   }
 
 
@@ -190,24 +181,17 @@ class CRM_Activity_Page_AJAX {
     $caseID = CRM_Utils_Type::escape($_GET['caseID'], 'Integer');
     $contactID = CRM_Utils_Type::escape($_GET['cid'], 'Integer');
 
-    $sortMapper = array(
-      0 => 'relation',
-      1 => 'name',
-      2 => 'phone',
-      3 => 'email',
-      4 => 'actions',
-    );
+    $sortMapper = array();
+    foreach ($_GET['columns'] as $key => $value) {
+      $sortMapper[$key] = $value['data'];
+    };
 
-    $sEcho = CRM_Utils_Type::escape($_REQUEST['sEcho'], 'Integer');
-    $offset = isset($_REQUEST['iDisplayStart']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayStart'], 'Integer') : 0;
-    $rowCount = isset($_REQUEST['iDisplayLength']) ? CRM_Utils_Type::escape($_REQUEST['iDisplayLength'], 'Integer') : 25;
-    $sort = isset($_REQUEST['iSortCol_0']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_REQUEST['iSortCol_0'], 'Integer'), $sortMapper) : 'relation';
-    $sortOrder = isset($_REQUEST['sSortDir_0']) ? CRM_Utils_Type::escape($_REQUEST['sSortDir_0'], 'String') : 'asc';
+    $offset = isset($_GET['start']) ? CRM_Utils_Type::escape($_GET['start'], 'Integer') : 0;
+    $rowCount = isset($_GET['length']) ? CRM_Utils_Type::escape($_GET['length'], 'Integer') : 25;
+    $sort = isset($_GET['order'][0]['column']) ? CRM_Utils_Array::value(CRM_Utils_Type::escape($_GET['order'][0]['column'], 'Integer'), $sortMapper) : NULL;
+    $sortOrder = isset($_GET['order'][0]['dir']) ? CRM_Utils_Type::escape($_GET['order'][0]['dir'], 'String') : 'asc';
 
-    $params = $_POST;
-    if ($sort && $sortOrder) {
-      $sortSQL = $sort . ' ' . $sortOrder;
-    }
+    $params = $_GET;
 
     $caseRelationships = CRM_Case_BAO_Case::getCaseRoles($contactID, $caseID);
     $caseTypeName = CRM_Case_BAO_Case::getCaseType($caseID, 'name');
@@ -221,6 +205,8 @@ class CRM_Activity_Page_AJAX {
       $caseRoles[$managerRoleId] = $caseRoles[$managerRoleId] . '<br />' . '(' . ts('Case Manager') . ')';
     }
 
+    $relationships = array();
+
     foreach ($caseRelationships as $key => $value) {
       //calculate roles that don't have relationships
       if (!empty($caseRoles[$value['relation_type']])) {
@@ -266,18 +252,13 @@ class CRM_Activity_Page_AJAX {
     foreach ($caseRelationships as $key => $row) {
       $sortArray[$key] = $row[$sort];
     }
-
     $sort_type = "SORT_" . strtoupper($sortOrder);
     array_multisort($sortArray, constant($sort_type), $caseRelationships);
 
-    //limit rows display
-    $allCaseRelationships = $caseRelationships;
-    $caseRelationships = array_slice($allCaseRelationships, $offset, $rowCount, TRUE);
+    $relationships = array();
 
     // set user name, email and edit columns links
-    // idx will count number of current row / needed by edit links
-    $idx = 1;
-    foreach ($caseRelationships as &$row) {
+    foreach ($caseRelationships as $key => &$row) {
       // Get rid of the "<br />(Case Manager)" from label
       list($typeLabel) = explode('<', $row['relation']);
       // view user links
@@ -296,8 +277,7 @@ class CRM_Activity_Page_AJAX {
         $contactType = $contactType == 'Contact' ? '' : $contactType;
         switch ($row['source']) {
           case 'caseRel':
-            $row['actions']
-              = '<a href="#editCaseRoleDialog" title="' . ts('Reassign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-rel_id="' . $row['rel_id'] . '"data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' .
+            $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Reassign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-rel_id="' . $row['rel_id'] . '"data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' .
               '<span class="icon ui-icon-pencil"></span>' .
               '</a>' .
               '<a href="#deleteCaseRoleDialog" title="' . ts('Remove %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/delcaserole') . '">' .
@@ -306,21 +286,28 @@ class CRM_Activity_Page_AJAX {
             break;
 
           case 'caseRoles':
-            $row['actions']
-              = '<a href="#editCaseRoleDialog" title="' . ts('Assign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' .
+            $row['actions'] = '<a href="#editCaseRoleDialog" title="' . ts('Assign %1', array(1 => $typeLabel)) . '" class="crm-hover-button case-miniform" data-contact_type="' . $contactType . '" data-rel_type="' . $row['relation_type'] . '" data-key="' . CRM_Core_Key::get('civicrm/ajax/relation') . '">' .
               '<span class="icon ui-icon-pencil"></span>' .
               '</a>';
             break;
         }
       }
-      $idx++;
+      unset($row['cid']);
+      unset($row['relation_type']);
+      unset($row['rel_id']);
+      unset($row['client_id']);
+      unset($row['source']);
+      array_push($relationships, $row);
     }
-    $iFilteredTotal = $iTotal = $params['total'] = count($allCaseRelationships);
-    $selectorElements = array('relation', 'name', 'phone', 'email', 'actions');
+    $params['total'] = count($relationships);
+
+    $caseRelationshipsDT = array();
+    $caseRelationshipsDT['data'] = $relationships;
+    $caseRelationshipsDT['recordsTotal'] = $params['total'];
+    $caseRelationshipsDT['recordsFiltered'] = $params['total'];
+
+    CRM_Utils_JSON::output($caseRelationshipsDT);
 
-    header('Content-Type: application/json');
-    echo CRM_Utils_JSON::encodeDataTableSelector($caseRelationships, $sEcho, $iTotal, $iFilteredTotal, $selectorElements);
-    CRM_Utils_System::civiExit();
   }
 
   public static function convertToCaseActivity() {
index 3b53743b30463349b130f5574f08838a9c7978d7..05030a9860b11a8da70f4e143af589d3d8da0930 100644 (file)
@@ -1043,132 +1043,142 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
 
     // CRM-5081 - formatting the dates to omit seconds.
     // Note the 00 in the date format string is needed otherwise later on it thinks scheduled ones are overdue.
-    $select = "SELECT count(ca.id) as ismultiple, ca.id as id,
-                          ca.activity_type_id as type,
-                          ca.activity_type_id as activity_type_id,
-                          cc.sort_name as reporter,
-                          cc.id as reporter_id,
-                          acc.sort_name AS assignee,
-                          acc.id AS assignee_id,
-                          DATE_FORMAT(IF(ca.activity_date_time < NOW() AND ca.status_id=ov.value,
-                            ca.activity_date_time,
-                            DATE_ADD(NOW(), INTERVAL 1 YEAR)
-                          ), '%Y%m%d%H%i00') as overdue_date,
-                          DATE_FORMAT(ca.activity_date_time, '%Y%m%d%H%i00') as display_date,
-                          ca.status_id as status,
-                          ca.subject as subject,
-                          ca.is_deleted as deleted,
-                          ca.priority_id as priority,
-                          ca.weight as weight,
-                          GROUP_CONCAT(ef.file_id) as attachment_ids ";
+    $select = "
+           SELECT COUNT(ca.id) AS ismultiple,
+                  ca.id AS id,
+                  ca.activity_type_id AS type,
+                  ca.activity_type_id AS activity_type_id,
+                  tcc.sort_name AS target_contact_name,
+                  tcc.id AS target_contact_id,
+                  scc.sort_name AS source_contact_name,
+                  scc.id AS source_contact_id,
+                  acc.sort_name AS assignee_contact_name,
+                  acc.id AS assignee_contact_id,
+                  DATE_FORMAT(
+                    IF(ca.activity_date_time < NOW() AND ca.status_id=ov.value,
+                      ca.activity_date_time,
+                      DATE_ADD(NOW(), INTERVAL 1 YEAR)
+                    ), '%Y%m%d%H%i00') AS overdue_date,
+                  DATE_FORMAT(ca.activity_date_time, '%Y%m%d%H%i00') AS display_date,
+                  ca.status_id AS status,
+                  ca.subject AS subject,
+                  ca.is_deleted AS deleted,
+                  ca.priority_id AS priority,
+                  ca.weight AS weight,
+                  GROUP_CONCAT(ef.file_id) AS attachment_ids ";
 
     $from = "
-      FROM civicrm_case_activity cca
-                  INNER JOIN civicrm_activity ca ON ca.id = cca.activity_id
-                  INNER JOIN civicrm_activity_contact cac ON cac.activity_id = ca.id AND cac.record_type_id = {$sourceID}
-                  INNER JOIN civicrm_contact cc ON cc.id = cac.contact_id
-                  INNER JOIN civicrm_option_group cog ON cog.name = 'activity_type'
-                  INNER JOIN civicrm_option_value cov ON cov.option_group_id = cog.id
-                         AND cov.value = ca.activity_type_id AND cov.is_active = 1
-                  LEFT JOIN civicrm_entity_file ef on ef.entity_table = 'civicrm_activity'  AND ef.entity_id = ca.id
-                  LEFT OUTER JOIN civicrm_option_group og ON og.name = 'activity_status'
-                  LEFT OUTER JOIN civicrm_option_value ov ON ov.option_group_id=og.id AND ov.name = 'Scheduled'
-                  LEFT JOIN civicrm_activity_contact caa
-                                ON caa.activity_id = ca.id AND caa.record_type_id = {$assigneeID}
-                  LEFT JOIN civicrm_contact acc ON acc.id = caa.contact_id  ";
-
-    $where = 'WHERE cca.case_id= %1
-                    AND ca.is_current_revision = 1';
-
-    if (!empty($params['reporter_id'])) {
-      $where .= " AND cac.contact_id = " . CRM_Utils_Type::escape($params['reporter_id'], 'Integer');
+             FROM civicrm_case_activity cca
+       INNER JOIN civicrm_activity ca
+               ON ca.id = cca.activity_id
+       INNER JOIN civicrm_activity_contact cas
+               ON cas.activity_id = ca.id
+              AND cas.record_type_id = {$sourceID}
+       INNER JOIN civicrm_contact scc
+               ON scc.id = cas.contact_id
+        LEFT JOIN civicrm_activity_contact caa
+               ON caa.activity_id = ca.id
+              AND caa.record_type_id = {$assigneeID}
+        LEFT JOIN civicrm_contact acc
+               ON acc.id = caa.contact_id
+        LEFT JOIN civicrm_activity_contact cat
+               ON cat.activity_id = ca.id
+              AND cat.record_type_id = {$targetID}
+        LEFT JOIN civicrm_contact tcc
+               ON tcc.id = cat.contact_id
+       INNER JOIN civicrm_option_group cog
+               ON cog.name = 'activity_type'
+       INNER JOIN civicrm_option_value cov
+               ON cov.option_group_id = cog.id
+              AND cov.value = ca.activity_type_id
+              AND cov.is_active = 1
+        LEFT JOIN civicrm_entity_file ef
+               ON ef.entity_table = 'civicrm_activity'
+              AND ef.entity_id = ca.id
+  LEFT OUTER JOIN civicrm_option_group og
+               ON og.name = 'activity_status'
+  LEFT OUTER JOIN civicrm_option_value ov
+               ON ov.option_group_id=og.id
+              AND ov.name = 'Scheduled'";
+
+    $where = '
+            WHERE cca.case_id= %1
+              AND ca.is_current_revision = 1';
+
+    if (!empty($params['source_contact_id'])) {
+      $where .= "
+              AND cas.contact_id = " . CRM_Utils_Type::escape($params['source_contact_id'], 'Integer');
     }
 
     if (!empty($params['status_id'])) {
-      $where .= " AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer');
+      $where .= "
+              AND ca.status_id = " . CRM_Utils_Type::escape($params['status_id'], 'Integer');
     }
 
     if (!empty($params['activity_deleted'])) {
-      $where .= " AND ca.is_deleted = 1";
+      $where .= "
+              AND ca.is_deleted = 1";
     }
     else {
-      $where .= " AND ca.is_deleted = 0";
+      $where .= "
+              AND ca.is_deleted = 0";
     }
 
     if (!empty($params['activity_type_id'])) {
-      $where .= " AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer');
+      $where .= "
+              AND ca.activity_type_id = " . CRM_Utils_Type::escape($params['activity_type_id'], 'Integer');
     }
 
     if (!empty($params['activity_date_low'])) {
       $fromActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_low']), 'Date');
     }
+    if (!empty($fromActivityDate)) {
+      $where .= "
+              AND ca.activity_date_time >= '{$fromActivityDate}'";
+    }
+
     if (!empty($params['activity_date_high'])) {
       $toActivityDate = CRM_Utils_Type::escape(CRM_Utils_Date::processDate($params['activity_date_high']), 'Date');
       $toActivityDate = $toActivityDate ? $toActivityDate + 235959 : NULL;
     }
-
-    if (!empty($fromActivityDate)) {
-      $where .= " AND ca.activity_date_time >= '{$fromActivityDate}'";
-    }
-
     if (!empty($toActivityDate)) {
-      $where .= " AND ca.activity_date_time <= '{$toActivityDate}'";
-    }
-
-    // hack to handle to allow initial sorting to be done by query
-    if (CRM_Utils_Array::value('sortname', $params) == 'undefined') {
-      $params['sortname'] = NULL;
-    }
-
-    if (CRM_Utils_Array::value('sortorder', $params) == 'undefined') {
-      $params['sortorder'] = NULL;
+      $where .= "
+              AND ca.activity_date_time <= '{$toActivityDate}'";
     }
 
-    $sortname = CRM_Utils_Array::value('sortname', $params);
-    $sortorder = CRM_Utils_Array::value('sortorder', $params);
-
-    $groupBy = " GROUP BY ca.id ";
+    $groupBy = "
+         GROUP BY ca.id ";
 
-    if (!$sortname AND !$sortorder) {
+    $sortBy = CRM_Utils_Array::value('sortBy', $params);
+    if (!$sortBy) {
       // CRM-5081 - added id to act like creation date
-      $orderBy = " ORDER BY overdue_date ASC, display_date DESC, weight DESC";
+      $orderBy = "
+         ORDER BY overdue_date ASC, display_date DESC, weight DESC";
     }
     else {
-      $sort = "{$sortname} {$sortorder}";
-      $sort = CRM_Utils_Type::escape($sort, 'String');
-      $orderBy = " ORDER BY $sort ";
-      if ($sortname != 'display_date') {
-        $orderBy .= ', display_date DESC';
-      }
+      $sortBy = CRM_Utils_Type::escape($sortBy, 'String');
+      $orderBy = " ORDER BY $sortBy ";
     }
 
-    $page = CRM_Utils_Array::value('page', $params);
-    $rp = CRM_Utils_Array::value('rp', $params);
-
     if (!$page) {
       $page = 1;
     }
     if (!$rp) {
       $rp = 10;
     }
-
     $start = (($page - 1) * $rp);
-    $query = $select . $from . $where . $groupBy . $orderBy;
+    $limit = " LIMIT $start, $rp";
 
+    $query = $select . $from . $where . $groupBy . $orderBy . $limit;
     $params = array(1 => array($caseID, 'Integer'));
-    $dao = CRM_Core_DAO::executeQuery($query, $params);
-    $params['total'] = $dao->N;
 
-    //FIXME: need to optimize/cache these queries
-    $limit = " LIMIT $start, $rp";
-    $query .= $limit;
-
-    //EXIT;
     $dao = CRM_Core_DAO::executeQuery($query, $params);
 
+    $page = CRM_Utils_Array::value('page', $params);
+    $rp = CRM_Utils_Array::value('rp', $params);
+
     $activityTypes = CRM_Case_PseudoConstant::caseActivityType(FALSE, TRUE);
-    $activityStatus = CRM_Core_PseudoConstant::activityStatus();
-    $activityPriority = CRM_Core_PseudoConstant::get('CRM_Activity_DAO_Activity', 'priority_id');
+    $activityStatuses = CRM_Core_PseudoConstant::activityStatus();
 
     $url = CRM_Utils_System::url("civicrm/case/activity",
       "reset=1&cid={$contactID}&caseid={$caseID}", FALSE, NULL, FALSE
@@ -1214,9 +1224,8 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
     foreach ($compStatusNames as $name) {
       $compStatusValues[] = CRM_Core_OptionGroup::getValue('activity_status', $name, 'name');
     }
-    $contactViewUrl = CRM_Utils_System::url("civicrm/contact/view",
-      "reset=1&cid=", FALSE, NULL, FALSE
-    );
+
+    $contactViewUrl = CRM_Utils_System::url("civicrm/contact/view", "reset=1&cid=", FALSE, NULL, FALSE);
     $hasViewContact = CRM_Core_Permission::giveMeAllACLs();
     $clientIds = self::retrieveContactIdsByCaseId($caseID);
 
@@ -1225,11 +1234,15 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
       $userID = $session->get('userID');
     }
 
+    $caseActivities = array();
+
     while ($dao->fetch()) {
+      $caseActivity = array();
+      $caseActivityId = $dao->id;
 
-      $allowView = self::checkPermission($dao->id, 'view', $dao->activity_type_id, $userID);
-      $allowEdit = self::checkPermission($dao->id, 'edit', $dao->activity_type_id, $userID);
-      $allowDelete = self::checkPermission($dao->id, 'delete', $dao->activity_type_id, $userID);
+      $allowView = self::checkPermission($caseActivityId, 'view', $dao->activity_type_id, $userID);
+      $allowEdit = self::checkPermission($caseActivityId, 'edit', $dao->activity_type_id, $userID);
+      $allowDelete = self::checkPermission($caseActivityId, 'delete', $dao->activity_type_id, $userID);
 
       //do not have sufficient permission
       //to access given case activity record.
@@ -1237,56 +1250,82 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
         continue;
       }
 
-      $values[$dao->id]['id'] = $dao->id;
-      $values[$dao->id]['type'] = $activityTypes[$dao->type]['label'];
+      //Add classes to the row, via DataTables syntax
+      $caseActivity['DT_RowClass'] = "crm-entity";
 
-      $reporterName = $dao->reporter;
-      if ($hasViewContact) {
-        $reporterName = '<a href="' . $contactViewUrl . $dao->reporter_id . '">' . $dao->reporter . '</a>';
-      }
-      $values[$dao->id]['reporter'] = $reporterName;
-      $targetNames = CRM_Activity_BAO_ActivityContact::getNames($dao->id, $targetID);
-      $targetContactUrls = $withContacts = array();
-      foreach ($targetNames as $targetId => $targetName) {
-        if (!in_array($targetId, $clientIds)) {
-          $withContacts[$targetId] = $targetName;
+      if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) {
+        $caseActivity['DT_RowClass'] .= " status-completed";
+      }
+      else {
+        if (CRM_Utils_Date::overdue($dao->display_date)) {
+          $caseActivity['DT_RowClass'] .= " status-overdue";
+        }
+        else {
+          $caseActivity['DT_RowClass'] .= " status-scheduled";
         }
       }
-      foreach ($withContacts as $cid => $name) {
-        if ($hasViewContact) {
-          $name = '<a href="' . $contactViewUrl . $cid . '">' . $name . '</a>';
+
+      if (!empty($dao->priority)) {
+        if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) {
+          $caseActivity['DT_RowClass'] .= " priority-urgent ";
+        }
+        elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) {
+          $caseActivity['DT_RowClass'] .= " priority-low ";
         }
-        $targetContactUrls[] = $name;
       }
-      $values[$dao->id]['with_contacts'] = implode('; ', $targetContactUrls);
 
-      $values[$dao->id]['display_date'] = CRM_Utils_Date::customFormat($dao->display_date);
-      $values[$dao->id]['status'] = $activityStatus[$dao->status];
+      //Add data to the row for inline editing, via DataTable syntax
+      $caseActivity['DT_RowData'] = array();
+      $caseActivity['DT_RowData']['entity'] = 'activity';
+      $caseActivity['DT_RowData']['id'] = $caseActivityId;
 
-      //check for view activity.
-      $subject = (empty($dao->subject)) ? '(' . ts('no subject') . ')' : $dao->subject;
-      if ($allowView) {
-        $url = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $dao->id));
-        $subject = '<a class="crm-popup medium-popup" href="' . $url . '" title="' . $viewTitle . '">' . $subject . '</a>';
-      }
-      $values[$dao->id]['subject'] = $subject;
+      //Activity Date and Time
+      $caseActivity['activity_date_time'] = CRM_Utils_Date::customFormat($dao->display_date);
 
-      // add activity assignee to activity selector. CRM-4485.
-      if (isset($dao->assignee)) {
-        if ($dao->ismultiple == 1) {
-          if ($dao->reporter_id != $dao->assignee_id) {
-            $values[$dao->id]['reporter'] .= ($hasViewContact) ? ' / ' . "<a href='{$contactViewUrl}{$dao->assignee_id}'>$dao->assignee</a>" : ' / ' . $dao->assignee;
-          }
-          $values[$dao->id]['assignee'] = $dao->assignee;
+      //Activity Subject
+      $caseActivity['subject'] = $dao->subject;
+
+      //Activity Type
+      $caseActivity['type'] = $activityTypes[$dao->type]['label'];
+
+      //Activity Target (With)
+      $targetContact = '';
+      if (isset($dao->target_contact_id)) {
+        $targetContact = $dao->target_contact_name;
+        if ($hasViewContact) {
+          $targetContact = '<a href="' . $contactViewUrl . $dao->target_contact_id . '">' . $dao->target_contact_name . '</a>';
         }
-        else {
-          $values[$dao->id]['reporter'] .= ' / ' . ts('(multiple)');
+      }
+      $caseActivity['target_contact_name'] = $targetContact;
+
+      //Activity Source Contact (Reporter)
+      $sourceContact = $dao->source_contact_name;
+      if ($hasViewContact) {
+        $sourceContact = '<a href="' . $contactViewUrl . $dao->source_contact_id . '">' . $dao->source_contact_name . '</a>';
+      }
+      $caseActivity['source_contact_name'] = $sourceContact;
+
+      //Activity Assignee. CRM-4485.
+      $assigneeContact = '';
+      if (isset($dao->assignee_contact_id)) {
+        $assigneeContact = $dao->assignee_contact_name;
+        if ($hasViewContact) {
+          $assigneeContact = '<a href="' . $contactViewUrl . $dao->assignee_contact_id . '">' . $dao->assignee_contact_name . '</a>';
         }
       }
+      $caseActivity['assignee_contact_name'] = $assigneeContact;
+
+      //Activity Status
+      $caseActivity['status_id'] = $activityStatuses[$dao->status];
+
       // FIXME: Why are we not using CRM_Core_Action for these links? This is too much manual work and likely to get out-of-sync with core markup.
       $url = "";
       $css = 'class="action-item crm-hover-button"';
-      $additionalUrl = "&id={$dao->id}";
+      if ($allowView) {
+        $url = CRM_Utils_System::url('civicrm/case/activity/view', array('cid' => $contactID, 'aid' => $caseActivityId));
+        //$subject = '<a class="crm-popup medium-popup" href="' . $url . '" title="' . $viewTitle . '">' . $subject . '</a>';
+      }
+      $additionalUrl = "&id={$caseActivityId}";
       if (!$dao->deleted) {
         //hide edit link of activity type email.CRM-4530.
         if (!in_array($dao->type, $emailActivityTypeIDs)) {
@@ -1301,25 +1340,25 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
       }
       elseif (!$caseDeleted) {
         $url = ' <a ' . $css . ' href="' . $restoreUrl . $additionalUrl . '">' . ts('Restore') . '</a>';
-        $values[$dao->id]['status'] = $values[$dao->id]['status'] . '<br /> (deleted)';
+        $caseActivity['status_id'] = $caseActivity['status_id'] . '<br /> (deleted)';
       }
 
       //check for operations.
-      if (self::checkPermission($dao->id, 'Move To Case', $dao->activity_type_id)) {
-        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $dao->id . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> ';
+      if (self::checkPermission($caseActivityId, 'Move To Case', $dao->activity_type_id)) {
+        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'move\',' . $caseActivityId . ', ' . $caseID . ', this ); return false;">' . ts('Move To Case') . '</a> ';
       }
-      if (self::checkPermission($dao->id, 'Copy To Case', $dao->activity_type_id)) {
-        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $dao->id . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> ';
+      if (self::checkPermission($caseActivityId, 'Copy To Case', $dao->activity_type_id)) {
+        $url .= ' <a ' . $css . ' href="#" onClick="Javascript:fileOnCase( \'copy\',' . $caseActivityId . ',' . $caseID . ', this ); return false;">' . ts('Copy To Case') . '</a> ';
       }
       // if there are file attachments we will return how many and, if only one, add a link to it
       if (!empty($dao->attachment_ids)) {
         $attachmentIDs = explode(',', $dao->attachment_ids);
-        $values[$dao->id]['no_attachments'] = count($attachmentIDs);
-        if ($values[$dao->id]['no_attachments'] == 1) {
+        $caseActivity['no_attachments'] = count($attachmentIDs);
+        if ($caseActivity['no_attachments'] == 1) {
           // if there is only one it's easy to do a link - otherwise just flag it
           $attachmentViewUrl = CRM_Utils_System::url(
             "civicrm/file",
-            "reset=1&eid=" . $dao->id . "&id=" . $dao->attachment_ids,
+            "reset=1&eid=" . $caseActivityId . "&id=" . $dao->attachment_ids,
             FALSE,
             NULL,
             FALSE
@@ -1328,37 +1367,18 @@ SELECT case_status.label AS case_status, status_id, civicrm_case_type.title AS c
         }
       }
 
-      $values[$dao->id]['links'] = $url;
-      $values[$dao->id]['class'] = "";
+      $caseActivity['links'] = $url;
 
-      if (!empty($dao->priority)) {
-        if ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Urgent', 'name')) {
-          $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-urgent ";
-        }
-        elseif ($dao->priority == CRM_Core_OptionGroup::getValue('priority', 'Low', 'name')) {
-          $values[$dao->id]['class'] = $values[$dao->id]['class'] . "priority-low ";
-        }
-      }
-
-      if (CRM_Utils_Array::crmInArray($dao->status, $compStatusValues)) {
-        $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-completed";
-      }
-      else {
-        if (CRM_Utils_Date::overdue($dao->display_date)) {
-          $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-overdue";
-        }
-        else {
-          $values[$dao->id]['class'] = $values[$dao->id]['class'] . " status-scheduled";
-        }
-      }
-
-      if ($allowEdit) {
-        $values[$dao->id]['status'] = '<div class="crmf-status_id crm-activity-status-' . $dao->id . ' ' . $values[$dao->id]['class'] . ' crm-editable" data-type="select" data-action="create" data-refresh="true">' . $values[$dao->id]['status'] . '</div>';
-      }
+      array_push($caseActivities, $caseActivity);
     }
     $dao->free();
 
-    return $values;
+    $caseActivitiesDT = array();
+    $caseActivitiesDT['data'] = $caseActivities;
+    $caseActivitiesDT['recordsTotal'] = $params['total'];
+    $caseActivitiesDT['recordsFiltered'] = $params['total'];
+
+    return $caseActivitiesDT;
   }
 
   /**
index 11664160294b7837736ede9e25d642dc47449e6c..d7a0da2a3623f037d248ec346c3205eb205f0d30 100644 (file)
@@ -24,6 +24,7 @@
  +--------------------------------------------------------------------+
 *}
 {*this template is used for activity accordion*}
+{assign var=caseid value=$caseID}
 <div class="crm-accordion-wrapper crm-case_activities-accordion  crm-case-activities-block">
   <div class="crm-accordion-header">
     {ts}Activities{/ts}
             <td class="crm-case-caseview-form-block-status_id"><label for="status_id">{$form.status_id.label}</label><br />
               {$form.status_id.html}
             </td>
-            <td style="vertical-align: bottom;">
-              {assign var=caseid value=$caseID}
-              <span class="crm-button crm-icon-button">
-                <span class="crm-button-icon ui-icon-check"></span>
-                <input class="crm-form-submit default" name="_qf_Basic_refresh" value="{ts}Search{/ts}" type="button" data-case-id="{$caseid}" />
-              </span>
-            </td>
           </tr>
           <tr>
             <td class="crm-case-caseview-form-block-activity_date_low">
-        {assign var=activitylow  value=activity_date_low_$caseID}
+              {assign var=activitylow  value=activity_date_low_$caseID}
               {$form.$activitylow.label}<br />
-            {include file="CRM/common/jcalendar.tpl" elementName=$activitylow}
+              {include file="CRM/common/jcalendar.tpl" elementName=$activitylow}
             </td>
             <td class="crm-case-caseview-form-block-activity_date_high">
-        {assign var=activityhigh  value=activity_date_high_$caseID}
+              {assign var=activityhigh  value=activity_date_high_$caseID}
               {$form.$activityhigh.label}<br />
-            {include file="CRM/common/jcalendar.tpl" elementName=$activityhigh}
+              {include file="CRM/common/jcalendar.tpl" elementName=$activityhigh}
             </td>
             <td class="crm-case-caseview-form-block-activity_type_filter_id">
               {$form.activity_type_filter_id.label}<br />
       </div><!-- /.crm-accordion-body -->
     </div><!-- /.crm-accordion-wrapper -->
 
-    <table id=case_id_{$caseid}  class="nestedActivitySelector">
+    <table id="case_id_{$caseid}"  class="nestedActivitySelector crm-ajax-table" data-order='[[0,"desc"]]' data-page-length="10">
       <thead><tr>
-        <th class='crm-case-activities-date'>{ts}Date{/ts}</th>
-        <th class='crm-case-activities-subject'>{ts}Subject{/ts}</th>
-        <th class='crm-case-activities-type'>{ts}Type{/ts}</th>
-        <th class='crm-case-activities-with'>{ts}With{/ts}</th>
-        <th class='crm-case-activities-assignee'>{ts}Reporter / Assignee{/ts}</th>
-        <th class='crm-case-activities-status'>{ts}Status{/ts}</th>
-        <th class='crm-case-activities-status' id="nosort">&nbsp;</th>
-        <th class='hiddenElement'>&nbsp;</th>
+        <th data-data="activity_date_time" class="crm-case-activities-date">{ts}Date{/ts}</th>
+        <th data-data="subject" cell-class="crmf-subject crm-editable" class="crm-case-activities-subject">{ts}Subject{/ts}</th>
+        <th data-data="type" class="crm-case-activities-type">{ts}Type{/ts}</th>
+        <th data-data="target_contact_name" class="crm-case-activities-with">{ts}With{/ts}</th>
+        <th data-data="source_contact_name" class="crm-case-activities-assignee">{ts}Reporter{/ts}</th>
+        <th data-data="assignee_contact_name" class="crm-case-activities-assignee">{ts}Assignee{/ts}</th>
+        <th data-data="status_id" cell-class="crmf-status_id crm-editable" cell-data-type="select" class="crm-case-activities-status">{ts}Status{/ts}</th>
+        <th data-data="links" data-orderable="false" class="crm-case-activities-status">&nbsp;</th>
       </tr></thead>
     </table>
+  {literal}
+    <script type="text/javascript">
+      (function($) {
+        var caseId = {/literal}{$caseID}{literal};
+        CRM.$('table#case_id_' + caseId).data({
+          "ajax": {
+            "url": {/literal}'{crmURL p="civicrm/ajax/activity" h=0 q="snippet=4&caseID=$caseId&cid=$contactID&userID=$userID"}'{literal},
+            "data": function (d) {
+              d.status_id = $("select#status_id_" + caseId).val(),
+              d.reporter_id = $("select#reporter_id_" + caseId).val(),
+              d.activity_type_id = $("select#activity_type_filter_id_" + caseId).val(),
+              d.activity_date_low = $("#activity_date_low_" + caseId).val(),
+              d.activity_date_high = $("#activity_date_high_" + caseId).val()
+              d.activity_deleted = ($("#activity_deleted_1").prop('checked')) ? 1 : 0; 
+            }
+          }
+        });
+        $(function($) {
+          $('#searchOptions :input').change(function(){
+            CRM.$('table#case_id_' + caseId).DataTable().draw();
+          });
+        });
+      })(CRM.$);
+    </script>
+  {/literal}
 
   </div><!-- /.crm-accordion-body -->
 </div><!-- /.crm-accordion-wrapper -->
-
-{literal}
-<script type="text/javascript">
-CRM.$(function($) {
-  var CaseId = {/literal}{$caseID}{literal};
-  buildCaseActivities(false);
-  $('input.crm-form-submit[data-case-id=' + CaseId + ']').click(buildCaseActivities);
-
-  function buildCaseActivities(filterSearch) {
-    if (filterSearch) {
-      oTable.fnDestroy();
-    }
-    var count = 0;
-    var columns = '';
-    var sourceUrl = {/literal}"{crmURL p='civicrm/ajax/activity' h=0 q='snippet=4&caseID='}"{literal}+CaseId;
-    sourceUrl = sourceUrl + '&cid={/literal}{$contactID}{literal}';
-    sourceUrl = sourceUrl + '&userID={/literal}{$userID}{literal}';
-
-    $('#case_id_'+CaseId+' th').each(function( ) {
-      if ($(this).attr('id') != 'nosort') {
-        columns += '{"sClass": "' + $(this).attr('class') +'"},';
-      }
-      else {
-        columns += '{ "bSortable": false },';
-      }
-      count++;
-    });
-
-    columns = columns.substring(0, columns.length - 1 );
-    eval('columns =[' + columns + ']');
-
-    oTable = $('#case_id_'+CaseId).dataTable({
-      "bFilter"    : false,
-      "bAutoWidth" : false,
-      "aaSorting"  : [],
-      "aoColumns"  : columns,
-      "bProcessing": true,
-      "bJQueryUI": true,
-      "asStripClasses" : [ "odd-row", "even-row" ],
-      "sPaginationType": "full_numbers",
-      "sDom"       : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
-      "bServerSide": true,
-      "sAjaxSource": sourceUrl,
-      "iDisplayLength": 10,
-      "bDestroy": true,
-      "fnDrawCallback": function() {
-        setSelectorClass();
-        setRowIds();
-        // FIXME: trigger crmLoad and crmEditable would happen automatically
-        $('.crm-editable', '#case_id_'+CaseId).crmEditable();
-      },
-      "fnServerData": function ( sSource, aoData, fnCallback ) {
-
-        if ( filterSearch ) {
-          var activity_deleted = 0;
-          if ( $("#activity_deleted_"+CaseId+":checked").val() == 1 ) {
-            activity_deleted = 1;
-          }
-          aoData.push(
-            {name:'status_id', value: $("select#status_id_"+CaseId).val()},
-            {name:'reporter_id', value: $("select#reporter_id_"+CaseId).val()},
-            {name:'activity_type_id', value: $("select#activity_type_filter_id_"+CaseId).val()},
-            {name:'activity_date_low', value: $("#activity_date_low_"+CaseId).val()},
-            {name:'activity_date_high', value: $("#activity_date_high_"+CaseId).val() },
-            {name:'activity_deleted', value: activity_deleted }
-          );
-        }
-        $.ajax( {
-          "dataType": 'json',
-          "type": "POST",
-          "url": sSource,
-          "data": aoData,
-          "success": fnCallback
-        } );
-      }
-    });
-  }
-
-  function setRowIds() {
-    $("#case_id_"+CaseId+" tbody tr").each(function() {
-      var link, id;
-      link = $('a.action-item', this).attr('href');
-      if (link) {
-        id = link.match(/&id=(\d+)/);
-      }
-      if (id) {
-        $(this)
-          .addClass('crm-entity')
-          .data('entity', 'activity')
-          .data('id', id[1]);
-      }
-    });
-  }
-
-  function setSelectorClass() {
-    $("#case_id_"+CaseId+" td:last-child").each(function() {
-      $(this).parent().addClass($(this).text());
-    });
-  }
-});
-</script>
-{/literal}
index eed398cd85499ad5b1c44ac12bcd3e40131f3990..57e1576d9ba20b657b05f635b49094cf370b5b3d 100644 (file)
@@ -2,11 +2,7 @@
 (function($, CRM) {
 
   function refresh(table) {
-    if (table) {
-      $(table).dataTable().fnDraw();
-    } else {
-      $('#crm-main-content-wrapper').crmSnippet('refresh');
-    }
+    $('#crm-main-content-wrapper').crmSnippet('refresh');
   }
 
   function open(url, options, table) {
index 56929a6eb4111e90a308e6388828e57fa2e52a14..3273107be7c339112809c3834b52edefcc9965d5 100644 (file)
 
 <div class="crm-block crm-form-block crm-case-caseview-form-block">
 
-{* here we are showing related cases w/ jquery dialog *}
-{if $showRelatedCases}
-  {include file="CRM/Case/Form/ViewRelatedCases.tpl"}
-
-{* Main case view *}
-{else}
-
-<h3>{ts}Summary{/ts}</h3>
-<table class="report crm-entity case-summary" data-entity="case" data-id="{$caseID}" data-cid="{$contactID}">
-  {if $multiClient}
-    <tr class="crm-case-caseview-client">
-      <td colspan="5" class="label">
-        {ts}Clients:{/ts}
-        {foreach from=$caseRoles.client item=client name=clients}
-          <a href="{crmURL p='civicrm/contact/view' q="action=view&reset=1&cid=`$client.contact_id`"}" title="{ts}View contact record{/ts}">{$client.display_name}</a>{if not $smarty.foreach.clients.last}, &nbsp; {/if}
-        {/foreach}
-        <a href="#addClientDialog" class="crm-hover-button case-miniform" title="{ts}Add Client{/ts}" data-key="{crmKey name='civicrm/case/ajax/addclient'}">
-          <span class="icon ui-icon-circle-plus"></span>
-        </a>
-        <div id="addClientDialog" class="hiddenElement">
-          <input name="add_client_id" placeholder="{ts}- select contact -{/ts}" class="huge" />
-        </div>
-        {if $hasRelatedCases}
-          <div class="crm-block relatedCases-link"><a class="crm-hover-button crm-popup medium-popup" href="{$relatedCaseUrl}">{$relatedCaseLabel}</a></div>
-        {/if}
-      </td>
-    </tr>
-  {/if}
-  <tr>
-    {if not $multiClient}
-      <td>
-        <table class="form-layout-compressed">
-          {foreach from=$caseRoles.client item=client}
-            <tr class="crm-case-caseview-display_name">
-              <td class="label-left bold" style="padding: 0px; border: none;">{$client.display_name}</td>
-            </tr>
-            {if $client.phone}
-              <tr class="crm-case-caseview-phone">
-                <td class="label-left description" style="padding: 1px">{$client.phone}</td>
-              </tr>
-            {/if}
-            {if $client.birth_date}
-              <tr class="crm-case-caseview-birth_date">
-                <td class="label-left description" style="padding: 1px">{ts}DOB{/ts}: {$client.birth_date|crmDate}</td>
-              </tr>
-            {/if}
+  {* here we are showing related cases w/ jquery dialog *}
+  {if $showRelatedCases}
+    {include file="CRM/Case/Form/ViewRelatedCases.tpl"}
+  {* Main case view *}
+  {else}
+  
+  <h3>{ts}Summary{/ts}</h3>
+  <table class="report crm-entity case-summary" data-entity="case" data-id="{$caseID}" data-cid="{$contactID}">
+    {if $multiClient}
+      <tr class="crm-case-caseview-client">
+        <td colspan="5" class="label">
+          {ts}Clients:{/ts}
+          {foreach from=$caseRoles.client item=client name=clients}
+            <a href="{crmURL p='civicrm/contact/view' q="action=view&reset=1&cid=`$client.contact_id`"}" title="{ts}View contact record{/ts}">{$client.display_name}</a>{if not $smarty.foreach.clients.last}, &nbsp; {/if}
           {/foreach}
-        </table>
-        {if $hasRelatedCases}
-          <div class="crm-block relatedCases-link"><a class="crm-hover-button crm-popup medium-popup" href="{$relatedCaseUrl}">{$relatedCaseLabel}</a></div>
-        {/if}
-      </td>
+          <a href="#addClientDialog" class="crm-hover-button case-miniform" title="{ts}Add Client{/ts}" data-key="{crmKey name='civicrm/case/ajax/addclient'}">
+            <span class="icon ui-icon-circle-plus"></span>
+          </a>
+          <div id="addClientDialog" class="hiddenElement">
+            <input name="add_client_id" placeholder="{ts}- select contact -{/ts}" class="huge" />
+          </div>
+          {if $hasRelatedCases}
+            <div class="crm-block relatedCases-link"><a class="crm-hover-button crm-popup medium-popup" href="{$relatedCaseUrl}">{$relatedCaseLabel}</a></div>
+          {/if}
+        </td>
+      </tr>
     {/if}
-    <td class="crm-case-caseview-case_subject label">
-      <span class="crm-case-summary-label">{ts}Subject{/ts}:</span>&nbsp;{$caseDetails.case_subject}
-    </td>
-    <td class="crm-case-caseview-case_type label">
-      <span class="crm-case-summary-label">{ts}Type{/ts}:</span>&nbsp;{$caseDetails.case_type}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseTypeId`"}" title="{ts}Change case type (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
-    </td>
-    <td class="crm-case-caseview-case_status label">
-      <span class="crm-case-summary-label">{ts}Status{/ts}:</span>&nbsp;{$caseDetails.case_status}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseStatusId`"}" title="{ts}Change case status (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
-    </td>
-    <td class="crm-case-caseview-case_start_date label">
-      <span class="crm-case-summary-label">{ts}Open Date{/ts}:</span>&nbsp;{$caseDetails.case_start_date|crmDate}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseStartDateId`"}" title="{ts}Change case start date (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
-    </td>
-    <td class="crm-case-caseview-{$caseID} label">
-      <span class="crm-case-summary-label">{ts}ID{/ts}:</span>&nbsp;{$caseID}
-    </td>
-  </tr>
-</table>
+    <tr>
+      {if not $multiClient}
+        <td>
+          <table class="form-layout-compressed">
+            {foreach from=$caseRoles.client item=client}
+              <tr class="crm-case-caseview-display_name">
+                <td class="label-left bold" style="padding: 0px; border: none;">{$client.display_name}</td>
+              </tr>
+              {if $client.phone}
+                <tr class="crm-case-caseview-phone">
+                  <td class="label-left description" style="padding: 1px">{$client.phone}</td>
+                </tr>
+              {/if}
+              {if $client.birth_date}
+                <tr class="crm-case-caseview-birth_date">
+                  <td class="label-left description" style="padding: 1px">{ts}DOB{/ts}: {$client.birth_date|crmDate}</td>
+                </tr>
+              {/if}
+            {/foreach}
+          </table>
+          {if $hasRelatedCases}
+            <div class="crm-block relatedCases-link"><a class="crm-hover-button crm-popup medium-popup" href="{$relatedCaseUrl}">{$relatedCaseLabel}</a></div>
+          {/if}
+        </td>
+      {/if}
+      <td class="crm-case-caseview-case_subject label">
+        <span class="crm-case-summary-label">{ts}Subject{/ts}:</span>&nbsp;{$caseDetails.case_subject}
+      </td>
+      <td class="crm-case-caseview-case_type label">
+        <span class="crm-case-summary-label">{ts}Type{/ts}:</span>&nbsp;{$caseDetails.case_type}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseTypeId`"}" title="{ts}Change case type (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
+      </td>
+      <td class="crm-case-caseview-case_status label">
+        <span class="crm-case-summary-label">{ts}Status{/ts}:</span>&nbsp;{$caseDetails.case_status}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseStatusId`"}" title="{ts}Change case status (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
+      </td>
+      <td class="crm-case-caseview-case_start_date label">
+        <span class="crm-case-summary-label">{ts}Open Date{/ts}:</span>&nbsp;{$caseDetails.case_start_date|crmDate}&nbsp;<a class="crm-hover-button crm-popup"  href="{crmURL p='civicrm/case/activity' q="action=add&reset=1&cid=`$contactId`&caseid=`$caseId`&selectedChild=activity&atype=`$changeCaseStartDateId`"}" title="{ts}Change case start date (creates activity record){/ts}"><span class="icon ui-icon-pencil"></span></a>
+      </td>
+      <td class="crm-case-caseview-{$caseID} label">
+        <span class="crm-case-summary-label">{ts}ID{/ts}:</span>&nbsp;{$caseID}
+      </td>
+    </tr>
+  </table>
   {if $hookCaseSummary}
-  <div id="caseSummary">
-    {foreach from=$hookCaseSummary item=val key=div_id}
-      <div id="{$div_id}"><label>{$val.label}</label><div class="value">{$val.value}</div></div>
-    {/foreach}
-  </div>
+    <div id="caseSummary">
+      {foreach from=$hookCaseSummary item=val key=div_id}
+        <div id="{$div_id}"><label>{$val.label}</label><div class="value">{$val.value}</div></div>
+      {/foreach}
+    </div>
   {/if}
 
-<div class="case-control-panel">
-  <div>
-    <p>
-      {$form.add_activity_type_id.html}
-      {if $hasAccessToAllCases} &nbsp;
-        {$form.timeline_id.html}{$form._qf_CaseView_next.html} &nbsp;
-        {$form.report_id.html}
-      {/if}
-    </p>
+  <div class="case-control-panel">
+    <div>
+      <p>
+        {$form.add_activity_type_id.html}
+        {if $hasAccessToAllCases} &nbsp;
+          {$form.timeline_id.html}{$form._qf_CaseView_next.html} &nbsp;
+          {$form.report_id.html}
+        {/if}
+      </p>
+    </div>
+    <div>
+      <p>
+        {if $hasAccessToAllCases}
+          <a class="crm-hover-button action-item no-popup" href="{crmURL p='civicrm/case/report/print' q="all=1&redact=0&cid=$contactID&caseID=$caseId&asn=standard_timeline"}"><span class="icon ui-icon-print"></span> {ts}Print Report{/ts}</a>
+        {/if}
+  
+        {if $mergeCases}
+          <a href="#mergeCasesDialog" class="action-item no-popup crm-hover-button case-miniform"><span class="icon ui-icon-copy"></span>{ts}Merge Case{/ts}</a>
+          {$form._qf_CaseView_next_merge_case.html}
+          <span id="mergeCasesDialog" class="hiddenElement">
+            {$form.merge_case_id.html}
+          </span>
+        {/if}
+  
+        {if call_user_func(array('CRM_Core_Permission','giveMeAllACLs'))}
+          <a class="action-item crm-hover-button medium-popup" href="{crmURL p='civicrm/contact/view/case/editClient' h=1 q="reset=1&action=update&id=$caseID&cid=$contactID"}"><span class="icon ui-icon-person"></span> {ts}Assign to Another Client{/ts}</a>
+        {/if}
+      </p>
+    </div>
   </div>
-  <div>
-    <p>
-      {if $hasAccessToAllCases}
-        <a class="crm-hover-button action-item no-popup" href="{crmURL p='civicrm/case/report/print' q="all=1&redact=0&cid=$contactID&caseID=$caseId&asn=standard_timeline"}"><span class="icon ui-icon-print"></span> {ts}Print Report{/ts}</a>
-      {/if}
 
-      {if $mergeCases}
-        <a href="#mergeCasesDialog" class="action-item no-popup crm-hover-button case-miniform"><span class="icon ui-icon-copy"></span>{ts}Merge Case{/ts}</a>
-        {$form._qf_CaseView_next_merge_case.html}
-        <span id="mergeCasesDialog" class="hiddenElement">
-          {$form.merge_case_id.html}
-        </span>
-      {/if}
+  <div class="clear"></div>
+  {include file="CRM/Case/Page/CustomDataView.tpl"}
 
-      {if call_user_func(array('CRM_Core_Permission','giveMeAllACLs'))}
-        <a class="action-item crm-hover-button medium-popup" href="{crmURL p='civicrm/contact/view/case/editClient' h=1 q="reset=1&action=update&id=$caseID&cid=$contactID"}"><span class="icon ui-icon-person"></span> {ts}Assign to Another Client{/ts}</a>
+  <div class="crm-accordion-wrapper collapsed crm-case-roles-block">
+    <div class="crm-accordion-header">
+      {ts}Roles{/ts}
+    </div><!-- /.crm-accordion-header -->
+    <div class="crm-accordion-body">
+  
+      {if $hasAccessToAllCases}
+        <div class="crm-submit-buttons">
+          <a class="button case-miniform" href="#addCaseRoleDialog" data-key="{crmKey name='civicrm/ajax/relation'}" rel="#caseRoles-selector-{$caseID}"><div class="icon ui-icon-circle-plus"></div>{ts}Add new role{/ts}</a>
+        </div>
+        <div id="addCaseRoleDialog" class="hiddenElement">
+          <div>{$form.role_type.label}</div>
+          <div>{$form.role_type.html}</div><br />
+          <div><label for="add_role_contact_id">{ts}Assign To{/ts}:</label></div>
+          <div><input name="add_role_contact_id" placeholder="{ts}- select contact -{/ts}" class="huge" /></div>
+        </div>
       {/if}
-    </p>
-  </div>
-</div>
-
-<div class="clear"></div>
-{include file="CRM/Case/Page/CustomDataView.tpl"}
-
-<div class="crm-accordion-wrapper collapsed crm-case-roles-block">
-  <div class="crm-accordion-header">
-    {ts}Roles{/ts}
-  </div><!-- /.crm-accordion-header -->
-  <div class="crm-accordion-body">
-
-    {if $hasAccessToAllCases}
-      <div class="crm-submit-buttons">
-        <a class="button case-miniform" href="#addCaseRoleDialog" data-key="{crmKey name='civicrm/ajax/relation'}" rel="#caseRoles-selector-{$caseID}"><div class="icon ui-icon-circle-plus"></div>{ts}Add new role{/ts}</a>
+  
+      <div id="editCaseRoleDialog" class="hiddenElement">
+        <div><label for="edit_role_contact_id">{ts}Change To{/ts}:</label></div>
+        <div><input name="edit_role_contact_id" placeholder="{ts}- select contact -{/ts}" class="huge" /></div>
       </div>
-      <div id="addCaseRoleDialog" class="hiddenElement">
-        <div>{$form.role_type.label}</div>
-        <div>{$form.role_type.html}</div><br />
-        <div><label for="add_role_contact_id">{ts}Assign To{/ts}:</label></div>
-        <div><input name="add_role_contact_id" placeholder="{ts}- select contact -{/ts}" class="huge" /></div>
+  
+      <table id="caseRoles-selector-{$caseID}"  class="report-layout crm-ajax-table" data-page-length="10">
+        <thead>
+          <tr>
+            <th data-data="relation">{ts}Case Role{/ts}</th>
+            <th data-data="name">{ts}Name{/ts}</th>
+            <th data-data="phone">{ts}Phone{/ts}</th>
+            <th data-data="email">{ts}Email{/ts}</th>
+            {if $relId neq 'client' and $hasAccessToAllCases}
+              <th data-data="actions" data-orderable="false">{ts}Actions{/ts}</th>
+            {/if}
+          </tr>
+        </thead>
+      </table>
+      {literal}
+        <script type="text/javascript">
+          (function($) {
+            var caseId = {/literal}{$caseID}{literal};
+            CRM.$('table#caseRoles-selector-' + caseId).data({
+              "ajax": {
+                "url": {/literal}'{crmURL p="civicrm/ajax/caseroles" h=0 q="snippet=4&caseID=$caseId&cid=$contactID&userID=$userID"}'{literal}
+              }
+            });
+          })(CRM.$);
+        </script>
+      {/literal}
+  
+      <div id="deleteCaseRoleDialog" class="hiddenElement">
+        {ts}Are you sure you want to delete this case role?{/ts}
       </div>
-    {/if}
-
-    <div id="editCaseRoleDialog" class="hiddenElement">
-      <div><label for="edit_role_contact_id">{ts}Change To{/ts}:</label></div>
-      <div><input name="edit_role_contact_id" placeholder="{ts}- select contact -{/ts}" class="huge" /></div>
-    </div>
-
-    <table id="caseRoles-selector-{$caseID}"  class="report-layout">
-      <thead><tr>
-        <th>{ts}Case Role{/ts}</th>
-        <th>{ts}Name{/ts}</th>
-        <th>{ts}Phone{/ts}</th>
-        <th>{ts}Email{/ts}</th>
-        {if $relId neq 'client' and $hasAccessToAllCases}
-          <th id="nosort">{ts}Actions{/ts}</th>
-        {/if}
-      </tr></thead>
-    </table>
-
-    <div id="deleteCaseRoleDialog" class="hiddenElement">
-     {ts}Are you sure you want to delete this case role?{/ts}
-    </div>
-
-  {literal}
-  <script type="text/javascript">
-  var oTable;
-
-  CRM.$(function($) {
-    buildCaseRoles(false);
-    function buildCaseRoles(filterSearch) {
-      if(filterSearch) {
-        oTable.fnDestroy();
-      }
-      var count   = 0;
-      var columns = '';
-      var sourceUrl = {/literal}"{crmURL p='civicrm/ajax/caseroles' h=0 q='snippet=4&caseID='}{$caseID}"{literal};
-      sourceUrl = sourceUrl + '&cid={/literal}{$contactID}{literal}';
-      sourceUrl = sourceUrl + '&userID={/literal}{$userID}{literal}';
-
-      $('#caseRoles-selector-{/literal}{$caseID}{literal} th').each( function( ) {
-        if ( $(this).attr('id') != 'nosort' ) {
-          columns += '{"sClass": "' + $(this).attr('class') +'"},';
-        }
-        else {
-          columns += '{ "bSortable": false },';
-        }
-        count++;
-      });
-
-      columns    = columns.substring(0, columns.length - 1 );
-      eval('columns =[' + columns + ']');
-
-      oTable = $('#caseRoles-selector-{/literal}{$caseID}{literal}').dataTable({
-        "bFilter"    : false,
-        "bAutoWidth" : false,
-        "aaSorting"  : [],
-        "aoColumns"  : columns,
-        "bProcessing": true,
-        "bJQueryUI": true,
-        "asStripClasses" : [ "odd-row", "even-row" ],
-        "sPaginationType": "full_numbers",
-        "sDom"       : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
-        "bServerSide": true,
-        "sAjaxSource": sourceUrl,
-        "iDisplayLength": 10,
-        "fnDrawCallback": function() { setCaseRolesSelectorClass(); },
-        "fnServerData": function ( sSource, aoData, fnCallback ) {
-          $.ajax({
-            "dataType": 'json',
-            "type": "POST",
-            "url": sSource,
-            "data": aoData,
-            "success": fnCallback
-          });
-        }
-      });
-    }
-
-    function setCaseRolesSelectorClass( ) {
-      $("#caseRoles-selector-{/literal}{$caseID}{literal} td:last-child").each( function( ) {
-        $(this).parent().addClass($(this).text() );
-      });
-    }
-  });
-</script>
-{/literal}
- </div><!-- /.crm-accordion-body -->
-</div><!-- /.crm-accordion-wrapper -->
+  
+   </div><!-- /.crm-accordion-body -->
+  </div><!-- /.crm-accordion-wrapper -->
 
   {if $hasAccessToAllCases}
   <div class="crm-accordion-wrapper collapsed crm-case-other-relationships-block">
       <div class="crm-submit-buttons">
         {crmButton p='civicrm/contact/view/rel' q="action=add&reset=1&cid=`$contactId`&caseID=`$caseID`" icon="circle-plus"}{ts}Add client relationship{/ts}{/crmButton}
       </div>
-      {if $clientRelationships}
-        <table id="clientRelationships-selector-{$caseID}"  class="report-layout">
-          <thead><tr>
-            <th>{ts}Client Relationship{/ts}</th>
-            <th>{ts}Name{/ts}</th>
-            <th>{ts}Phone{/ts}</th>
-            <th>{ts}Email{/ts}</th>
-          </tr></thead>
-        </table>
-        {else}
-        <div class="messages status no-popup">
-          <div class="icon inform-icon"></div>
-          {ts}None found.{/ts}
-        </div>
-      {/if}
- {literal}
- <script type="text/javascript">
-   CRM.$(function($) {
-   buildCaseClientRelationships(false);
-   function buildCaseClientRelationships(filterSearch) {
-     if (filterSearch) {
-       oTable.fnDestroy();
-     }
-     var count   = 0;
-     var columns = '';
-     var sourceUrl = {/literal}"{crmURL p='civicrm/ajax/clientrelationships' h=0 q='snippet=4&caseID='}{$caseID}"{literal};
-     sourceUrl = sourceUrl + '&cid={/literal}{$contactID}{literal}';
-     sourceUrl = sourceUrl + '&userID={/literal}{$userID}{literal}';
-
-     $('#clientRelationships-selector-{/literal}{$caseID}{literal} th').each( function( ) {
-       if ( $(this).attr('id') != 'nosort' ) {
-         columns += '{"sClass": "' + $(this).attr('class') +'"},';
-       }
-       else {
-         columns += '{ "bSortable": false },';
-       }
-       count++;
-     });
-
-     columns    = columns.substring(0, columns.length - 1 );
-     eval('columns =[' + columns + ']');
-
-     oTable = $('#clientRelationships-selector-{/literal}{$caseID}{literal}').dataTable({
-       "bFilter"    : false,
-       "bAutoWidth" : false,
-       "aaSorting"  : [],
-       "aoColumns"  : columns,
-       "bProcessing": true,
-       "bJQueryUI": true,
-       "asStripClasses" : [ "odd-row", "even-row" ],
-       "sPaginationType": "full_numbers",
-       "sDom"       : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
-       "bServerSide": true,
-       "sAjaxSource": sourceUrl,
-       "iDisplayLength": 10,
-       "fnDrawCallback": function() { setClientRelationshipsSelectorClass(); },
-       "fnServerData": function (sSource, aoData, fnCallback) {
-         $.ajax( {
-           "dataType": 'json',
-           "type": "POST",
-           "url": sSource,
-           "data": aoData,
-           "success": fnCallback
-         });
-       }
-     });
-   }
-
-   function setClientRelationshipsSelectorClass( ) {
-     $("#clientRelationships-selector-{/literal}{$caseID}{literal} td:last-child").each(function() {
-       $(this).parent().addClass($(this).text());
-      });
-    }
-  });
- </script>
- {/literal}
+      <table id="clientRelationships-selector-{$caseID}"  class="report-layout crm-ajax-table" data-page-length="10">
+        <thead>
+          <tr>
+            <th data-data="relation">{ts}Client Relationship{/ts}</th>
+            <th data-data="name">{ts}Name{/ts}</th>
+            <th data-data="phone">{ts}Phone{/ts}</th>
+            <th data-data="email">{ts}Email{/ts}</th>
+          </tr>
+        </thead>
+      </table>
+      {literal}
+        <script type="text/javascript">
+          (function($) {
+            var caseId = {/literal}{$caseID}{literal};
+            CRM.$('table#clientRelationships-selector-' + caseId).data({
+              "ajax": {
+                "url": {/literal}'{crmURL p="civicrm/ajax/clientrelationships" h=0 q="snippet=4&caseID=$caseId&cid=$contactID&userID=$userID"}'{literal}
+              }
+            });
+          })(CRM.$);
+        </script>
+      {/literal}
   <br />
   {if !empty($globalGroupInfo.id)}
     <div class="crm-submit-buttons">
     <div id="addMembersToGroupDialog" class="hiddenElement">
       <input name="add_member_to_group_contact_id" placeholder="{ts}- select contacts -{/ts}" class="huge" />
     </div>
-    <table id="globalRelationships-selector-{$caseId}"  class="report-layout">
-      <thead><tr>
-        <th>{$globalGroupInfo.title}</th>
-        <th>{ts}Phone{/ts}</th>
-        <th>{ts}Email{/ts}</th>
-      </tr></thead>
+    <table id="globalRelationships-selector-{$caseId}"  class="report-layout crm-ajax-table" data-page-length="10">
+      <thead>
+        <tr>
+          <th data-data="sort_name">{$globalGroupInfo.title}</th>
+          <th data-data="phone">{ts}Phone{/ts}</th>
+          <th data-data="email">{ts}Email{/ts}</th>
+        </tr>
+      </thead>
     </table>
+    {literal}
+      <script type="text/javascript">
+        (function($) {
+          var caseId = {/literal}{$caseID}{literal};
+          CRM.$('table#globalRelationships-selector-' + caseId).data({
+            "ajax": {
+              "url": {/literal}'{crmURL p="civicrm/ajax/globalrelationships" h=0 q="snippet=4&caseID=$caseId&cid=$contactID&userID=$userID"}'{literal}
+            }
+          });
+        })(CRM.$);
+      </script>
+    {/literal}
   {/if}
 
- {literal}
- <script type="text/javascript">
-   CRM.$(function($) {
-     buildCaseGlobalRelationships(false);
-     function buildCaseGlobalRelationships(filterSearch) {
-       if (filterSearch) {
-         oTable.fnDestroy();
-       }
-       var count   = 0;
-       var columns = '';
-       var sourceUrl = {/literal}"{crmURL p='civicrm/ajax/globalrelationships' h=0 q='snippet=4&caseID='}{$caseID}"{literal};
-       sourceUrl = sourceUrl + '&cid={/literal}{$contactID}{literal}';
-       sourceUrl = sourceUrl + '&userID={/literal}{$userID}{literal}';
-
-       $('#globalRelationships-selector-{/literal}{$caseID}{literal} th').each( function( ) {
-         if ($(this).attr('id') != 'nosort') {
-           columns += '{"sClass": "' + $(this).attr('class') +'"},';
-         }
-         else {
-           columns += '{ "bSortable": false },';
-         }
-         count++;
-       });
-
-       columns    = columns.substring(0, columns.length - 1 );
-       eval('columns =[' + columns + ']');
-
-       oTable = $('#globalRelationships-selector-{/literal}{$caseID}{literal}').dataTable({
-         "bFilter"    : false,
-         "bAutoWidth" : false,
-         "aaSorting"  : [],
-         "aoColumns"  : columns,
-         "bProcessing": true,
-         "bJQueryUI": true,
-         "asStripClasses" : [ "odd-row", "even-row" ],
-         "sPaginationType": "full_numbers",
-         "sDom"       : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
-         "bServerSide": true,
-         "sAjaxSource": sourceUrl,
-         "iDisplayLength": 10,
-         "fnDrawCallback": function() { setGlobalRelationshipsSelectorClass(); },
-         "oLanguage": {
-           "sEmptyTable": {/literal}'{ts escape='js' 1=$globalGroupInfo.title}The group %1 has no members.{/ts}'{literal}
-         },
-         "fnServerData": function ( sSource, aoData, fnCallback ) {
-           $.ajax( {
-             "dataType": 'json',
-             "type": "POST",
-             "url": sSource,
-             "data": aoData,
-             "success": fnCallback
-           });
-         }
-       });
-     }
-
-     function setGlobalRelationshipsSelectorClass( ) {
-       $("#globalRelationships-selector-{/literal}{$caseID}{literal} td:last-child").each( function( ) {
-         $(this).parent().addClass($(this).text() );
-       });
-     }
-   });
- </script>
- {/literal}
- </div><!-- /.crm-accordion-body -->
+  </div><!-- /.crm-accordion-body -->
 </div><!-- /.crm-accordion-wrapper -->
 
 {/if} {* other relationship section ends *}