From 24a786ac7b59c38efc915f3494ff043db1dc5616 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Mon, 2 Dec 2019 10:39:24 +0100
Subject: [PATCH] Enhanced relationship field

---
 .../RelationshipsFieldOutputHandler.php       | 54 ++++++++++++++++---
 .../RelationshipsFieldOutputHandler.tpl       | 10 ++++
 2 files changed, 58 insertions(+), 6 deletions(-)

diff --git a/Civi/DataProcessor/FieldOutputHandler/RelationshipsFieldOutputHandler.php b/Civi/DataProcessor/FieldOutputHandler/RelationshipsFieldOutputHandler.php
index c5696b2e..687afeda 100644
--- a/Civi/DataProcessor/FieldOutputHandler/RelationshipsFieldOutputHandler.php
+++ b/Civi/DataProcessor/FieldOutputHandler/RelationshipsFieldOutputHandler.php
@@ -43,6 +43,10 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
 
   protected $show_label = true;
 
+  protected $separator = ', ';
+
+  protected $sort = 'label-name';
+
   /**
    * @return \Civi\DataProcessor\DataSpecification\FieldSpecification
    */
@@ -104,6 +108,12 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
     if (isset($configuration['show_label'])) {
       $this->show_label = $configuration['show_label'];
     }
+    if (isset($configuration['separator'])) {
+      $this->separator = $configuration['separator'];
+    }
+    if (isset($configuration['sort'])) {
+      $this->sort = $configuration['sort'];
+    }
   }
 
   /**
@@ -117,12 +127,12 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
   public function formatField($rawRecord, $formattedRecord) {
     $contactId = $rawRecord[$this->contactIdField->alias];
     $sql['a_b'] = "SELECT c.id, c.display_name, t.label_a_b as label, r.relationship_type_id, c.contact_type, c.contact_sub_type
-            FROM civicrm_contact c 
+            FROM civicrm_contact c
             INNER JOIN civicrm_relationship r ON r.contact_id_b = c.id
             INNER JOIN civicrm_relationship_type t on r.relationship_type_id = t.id
             WHERE c.is_deleted = 0 AND r.is_active = 1 AND r.contact_id_a = %1";
     $sql['b_a'] = "SELECT c.id, c.display_name, t.label_b_a as label, r.relationship_type_id, c.contact_type, c.contact_sub_type
-            FROM civicrm_contact c 
+            FROM civicrm_contact c
             INNER JOIN civicrm_relationship r ON r.contact_id_a = c.id
             INNER JOIN civicrm_relationship_type t on r.relationship_type_id = t.id
             WHERE c.is_deleted = 0 AND r.is_active = 1 AND r.contact_id_b = %1";
@@ -151,7 +161,17 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
     $htmlFormattedValues = [];
     if (count($sql)) {
       $sql = implode(" UNION ", $sql);
-      $sql .= " ORDER BY label, display_name";
+      switch ($this->sort) {
+        case 'birthdate':
+          $sql .= " ORDER BY c.birth_date ASC, display_name ASC";
+          break;
+        case 'name':
+          $sql .= " ORDER BY display_name ASC";
+          break;
+        default:
+          $sql .= " ORDER BY label ASC, display_name ASC";
+          break;
+      }
       $sqlParams[1] = [$contactId, 'Integer'];
       $dao = \CRM_Core_DAO::executeQuery($sql, $sqlParams);
       while ($dao->fetch()) {
@@ -172,7 +192,7 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
       }
     }
     $output = new HTMLFieldOutput($contactId);
-    $output->formattedValue = implode(",", $formattedValues);
+    $output->formattedValue = implode($this->separator, $formattedValues);
     $output->setHtmlOutput(implode("<br>", $htmlFormattedValues));
     return $output;
   }
@@ -201,6 +221,9 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
       $relationshipTypes['a_b_'.$relationship_type['name_a_b']] = $relationship_type['label_a_b'];
       $relationshipTypes['b_a_'.$relationship_type['name_b_a']] = $relationship_type['label_b_a'];
     }
+    $sort['label-name'] = E::ts('Relationship Type, Display Name');
+    $sort['birthdate'] = E::ts('Birth date, Display Name');
+    $sort['name'] = E::ts('Display Name');
 
     $form->add('select', 'contact_id_field', E::ts('Contact ID Field'), $fieldSelect, true, array(
       'style' => 'min-width:250px',
@@ -214,9 +237,14 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
       'multiple' => true,
     ));
     $form->add('checkbox', 'show_label', E::ts('Show relationship type'), false, false);
+    $form->add('text', 'separator', E::ts('Separator'), true);
+    $form->add('select', 'sort', E::ts('Sort'), $sort, false, array(
+      'style' => 'min-width:250px',
+      'class' => 'crm-select2 huge',
+    ));
+    $defaults = array();
     if (isset($field['configuration'])) {
       $configuration = $field['configuration'];
-      $defaults = array();
       if (isset($configuration['field']) && isset($configuration['datasource'])) {
         $defaults['contact_id_field'] = $configuration['datasource'] . '::' . $configuration['field'];
       }
@@ -228,8 +256,20 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
       } elseif (!isset($configuration['show_label'])) {
         $defaults['show_label'] = 1;
       }
-      $form->setDefaults($defaults);
+      if (isset($configuration['separator'])) {
+        $defaults['separator'] = $configuration['separator'];
+      }
+      if (isset($configuration['sort'])) {
+        $defaults['sort'] = $configuration['sort'];
+      }
+    }
+    if (!isset($defaults['separator'])) {
+      $defaults['separator'] = ',';
+    }
+    if (!isset($defaults['sort'])) {
+      $defaults['sort'] = 'label-name';
     }
+    $form->setDefaults($defaults);
   }
 
   /**
@@ -255,6 +295,8 @@ class RelationshipsFieldOutputHandler extends AbstractFieldOutputHandler {
     $configuration['datasource'] = $datasource;
     $configuration['relationship_types'] = isset($submittedValues['relationship_types']) ? $submittedValues['relationship_types'] : array();
     $configuration['show_label'] = isset($submittedValues['show_label']) ? $submittedValues['show_label'] : 0;
+    $configuration['separator'] = $submittedValues['separator'];
+    $configuration['sort'] = $submittedValues['sort'];
     return $configuration;
   }
 
diff --git a/templates/CRM/Dataprocessor/Form/Field/Configuration/RelationshipsFieldOutputHandler.tpl b/templates/CRM/Dataprocessor/Form/Field/Configuration/RelationshipsFieldOutputHandler.tpl
index 84217b68..c76a23ce 100644
--- a/templates/CRM/Dataprocessor/Form/Field/Configuration/RelationshipsFieldOutputHandler.tpl
+++ b/templates/CRM/Dataprocessor/Form/Field/Configuration/RelationshipsFieldOutputHandler.tpl
@@ -9,9 +9,19 @@
         <div class="content">{$form.relationship_types.html}</div>
         <div class="clear"></div>
     </div>
+    <div class="crm-section">
+      <div class="label">{$form.separator.label}</div>
+      <div class="content">{$form.separator.html}</div>
+      <div class="clear"></div>
+    </div>
     <div class="crm-section">
         <div class="label"></div>
         <div class="content">{$form.show_label.html}&nbsp;{$form.show_label.label}</div>
         <div class="clear"></div>
     </div>
+    <div class="crm-section">
+      <div class="label">{$form.sort.label}</div>
+      <div class="content">{$form.sort.html}</div>
+      <div class="clear"></div>
+    </div>
 {/crmScope}
-- 
GitLab