From 1b1a901c68c56c4b151ee3374d4994624daf9e90 Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Tue, 2 Jul 2019 07:00:57 +0200
Subject: [PATCH] refactored contact search so export action also works

---
 .../DataProcessorContactSearch.php}           |  2 +-
 .../DataProcessorContactSearch.php}           |  6 +-
 .../Form/DataProcessorContactSearch.php}      |  2 +-
 .../DataProcessorContactSearch.php            |  2 +-
 .../Form/AbstractSearch.php                   |  9 +-
 .../StateMachine/ContactSearch.php            | 92 -------------------
 .../Utils/PrevNextCache.php                   |  2 +-
 Civi/DataProcessor/Factory.php                |  2 +-
 .../Form/DataProcessorContactSearch.tpl}      |  0
 .../DataProcessorContactSearch.tpl}           |  0
 10 files changed, 15 insertions(+), 102 deletions(-)
 rename CRM/{DataprocessorSearch/Controller/ContactSearch.php => Contact/Controller/DataProcessorContactSearch.php} (96%)
 rename CRM/{DataprocessorSearch/ContactSearch.php => Contact/DataProcessorContactSearch.php} (96%)
 rename CRM/{DataprocessorSearch/Form/ContactSearch.php => Contact/Form/DataProcessorContactSearch.php} (96%)
 delete mode 100644 CRM/DataprocessorSearch/StateMachine/ContactSearch.php
 rename templates/CRM/{DataprocessorSearch/Form/ContactSearch.tpl => Contact/Form/DataProcessorContactSearch.tpl} (100%)
 rename templates/CRM/{DataprocessorSearch/Form/OutputConfiguration/ContactSearch.tpl => Contact/Form/OutputConfiguration/DataProcessorContactSearch.tpl} (100%)

diff --git a/CRM/DataprocessorSearch/Controller/ContactSearch.php b/CRM/Contact/Controller/DataProcessorContactSearch.php
similarity index 96%
rename from CRM/DataprocessorSearch/Controller/ContactSearch.php
rename to CRM/Contact/Controller/DataProcessorContactSearch.php
index 15095c80..9c66193c 100644
--- a/CRM/DataprocessorSearch/Controller/ContactSearch.php
+++ b/CRM/Contact/Controller/DataProcessorContactSearch.php
@@ -14,7 +14,7 @@
  *
  * The second form is used to process search results with the associated actions.
  */
-class CRM_DataprocessorSearch_Controller_ContactSearch extends CRM_Core_Controller {
+class CRM_Contact_Controller_DataProcessorContactSearch extends CRM_Core_Controller {
 
   protected $dataProcessor;
 
diff --git a/CRM/DataprocessorSearch/ContactSearch.php b/CRM/Contact/DataProcessorContactSearch.php
similarity index 96%
rename from CRM/DataprocessorSearch/ContactSearch.php
rename to CRM/Contact/DataProcessorContactSearch.php
index 7e34a5da..b5dd908b 100644
--- a/CRM/DataprocessorSearch/ContactSearch.php
+++ b/CRM/Contact/DataProcessorContactSearch.php
@@ -7,7 +7,7 @@
 use Civi\DataProcessor\Output\UIOutputInterface;
 use CRM_Dataprocessor_ExtensionUtil as E;
 
-class CRM_DataprocessorSearch_ContactSearch implements UIOutputInterface {
+class CRM_Contact_DataProcessorContactSearch implements UIOutputInterface {
 
   /**
    * Returns true when this filter has additional configuration
@@ -98,7 +98,7 @@ class CRM_DataprocessorSearch_ContactSearch implements UIOutputInterface {
    * @return false|string
    */
   public function getConfigurationTemplateFileName() {
-    return "CRM/DataprocessorSearch/Form/OutputConfiguration/ContactSearch.tpl";
+    return "CRM/Contact/Form/OutputConfiguration/DataProcessorContactSearch.tpl";
   }
 
 
@@ -158,7 +158,7 @@ class CRM_DataprocessorSearch_ContactSearch implements UIOutputInterface {
    * @return string
    */
   public function getCallbackForUi() {
-    return 'CRM_DataprocessorSearch_Controller_ContactSearch';
+    return 'CRM_Contact_Controller_DataProcessorContactSearch';
   }
 
   /**
diff --git a/CRM/DataprocessorSearch/Form/ContactSearch.php b/CRM/Contact/Form/DataProcessorContactSearch.php
similarity index 96%
rename from CRM/DataprocessorSearch/Form/ContactSearch.php
rename to CRM/Contact/Form/DataProcessorContactSearch.php
index 21cb622b..1bd01d49 100644
--- a/CRM/DataprocessorSearch/Form/ContactSearch.php
+++ b/CRM/Contact/Form/DataProcessorContactSearch.php
@@ -6,7 +6,7 @@
 
 use CRM_Dataprocessor_ExtensionUtil as E;
 
-class CRM_DataprocessorSearch_Form_ContactSearch extends CRM_DataprocessorSearch_Form_AbstractSearch {
+class CRM_Contact_Form_DataProcessorContactSearch extends CRM_DataprocessorSearch_Form_AbstractSearch {
 
 
   /**
diff --git a/CRM/Contact/StateMachine/DataProcessorContactSearch.php b/CRM/Contact/StateMachine/DataProcessorContactSearch.php
index 8aac209b..bc1b6794 100644
--- a/CRM/Contact/StateMachine/DataProcessorContactSearch.php
+++ b/CRM/Contact/StateMachine/DataProcessorContactSearch.php
@@ -24,7 +24,7 @@ class CRM_Contact_StateMachine_DataProcessorContactSearch extends CRM_Core_State
 
     $this->_pages = array();
     $this->_pages['Basic'] = array(
-      'className' => 'CRM_DataprocessorSearch_Form_ContactSearch',
+      'className' => 'CRM_Contact_Form_DataProcessorContactSearch',
     );
     list($task, $result) = $this->taskName($controller);
     $this->_task = $task;
diff --git a/CRM/DataprocessorSearch/Form/AbstractSearch.php b/CRM/DataprocessorSearch/Form/AbstractSearch.php
index efbf0139..d9b78440 100644
--- a/CRM/DataprocessorSearch/Form/AbstractSearch.php
+++ b/CRM/DataprocessorSearch/Form/AbstractSearch.php
@@ -355,16 +355,21 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Dataproce
 
     $this->buildCriteriaForm();
 
-    $selectedIds = array();
+    $selectedIds = [];
     $qfKeyParam = CRM_Utils_Array::value('qfKey', $this->_formValues);
+    if (empty($qfKeyParam) && $this->controller->_key) {
+      $qfKeyParam = $this->controller->_key;
+    }
     // We use ajax to handle selections only if the search results component_mode is set to "contacts"
-    if ($qfKeyParam && $this->usePrevNextCache()) {
+    if ($this->usePrevNextCache()) {
       $this->addClass('crm-ajax-selection-form');
+      if ($qfKeyParam) {
         $qfKeyParam = "civicrm search {$qfKeyParam}";
         $selectedIdsArr = CRM_DataprocessorSearch_Utils_PrevNextCache::getSelection($qfKeyParam);
         if (isset($selectedIdsArr[$qfKeyParam]) && is_array($selectedIdsArr[$qfKeyParam])) {
           $selectedIds = array_keys($selectedIdsArr[$qfKeyParam]);
         }
+      }
     }
 
     $this->assign_by_ref('selectedIds', $selectedIds);
diff --git a/CRM/DataprocessorSearch/StateMachine/ContactSearch.php b/CRM/DataprocessorSearch/StateMachine/ContactSearch.php
deleted file mode 100644
index 4b7d7127..00000000
--- a/CRM/DataprocessorSearch/StateMachine/ContactSearch.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * @author Jaap Jansma <jaap.jansma@civicoop.org>
- * @license AGPL-3.0
- */
-
-class CRM_DataprocessorSearch_StateMachine_ContactSearch extends CRM_Core_StateMachine {
-
-  /**
-   * The task that the wizard is currently processing
-   *
-   * @var string
-   */
-  protected $_task;
-
-  /**
-   * Class constructor.
-   *
-   * @param object $controller
-   * @param \const|int $action
-   */
-  public function __construct($controller, $action = CRM_Core_Action::NONE) {
-    parent::__construct($controller, $action);
-
-    $this->_pages = array();
-    $this->_pages['Basic'] = array(
-      'className' => 'CRM_DataprocessorSearch_Form_ContactSearch',
-    );
-    list($task, $result) = $this->taskName($controller);
-    $this->_task = $task;
-    if (is_array($task)) {
-      foreach ($task as $t) {
-        $this->_pages[$t] = NULL;
-      }
-    }
-    else {
-      $this->_pages[$task] = NULL;
-    }
-
-    if ($result) {
-      $this->_pages['CRM_Contact_Form_Task_Result'] = NULL;
-    }
-
-    $this->addSequentialPages($this->_pages, $action);
-  }
-
-  /**
-   * Determine the form name based on the action. This allows us
-   * to avoid using  conditional state machine, much more efficient
-   * and simpler
-   *
-   * @param CRM_Core_Controller $controller
-   *   The controller object.
-   *
-   * @return array
-   *   the name of the form that will handle the task
-   */
-  public function taskName($controller) {
-    // total hack, check POST vars and then session to determine stuff
-    $value = CRM_Utils_Array::value('task', $_POST);
-    if (!isset($value)) {
-      $value = $controller->get('task');
-    }
-    $this->_controller->set('task', $value);
-
-    return CRM_Contact_Task::getTask($value);
-  }
-
-  /**
-   * Return the form name of the task.
-   *
-   * @return string
-   */
-  public function getTaskFormName() {
-    if (is_array($this->_task)) {
-      // return first page
-      return CRM_Utils_String::getClassName($this->_task[0]);
-    }
-    else {
-      return CRM_Utils_String::getClassName($this->_task);
-    }
-  }
-
-  /**
-   * Since this is a state machine for search and we want to come back to the same state
-   * we dont want to issue a reset of the state session when we are done processing a task
-   */
-  public function shouldReset() {
-    return FALSE;
-  }
-
-}
diff --git a/CRM/DataprocessorSearch/Utils/PrevNextCache.php b/CRM/DataprocessorSearch/Utils/PrevNextCache.php
index 5cf0bee4..2c27335b 100644
--- a/CRM/DataprocessorSearch/Utils/PrevNextCache.php
+++ b/CRM/DataprocessorSearch/Utils/PrevNextCache.php
@@ -75,7 +75,7 @@ class CRM_DataprocessorSearch_Utils_PrevNextCache {
    */
   public function getSelection($cacheKey, $action = 'get') {
     if (Civi::container()->has('prevnext')) {
-      Civi::service('prevnext')->getSelection($cacheKey, $action);
+      return Civi::service('prevnext')->getSelection($cacheKey, $action);
     } else {
       // Backwards compatibility
       if (!$cacheKey) {
diff --git a/Civi/DataProcessor/Factory.php b/Civi/DataProcessor/Factory.php
index e60f1cc7..b6759357 100644
--- a/Civi/DataProcessor/Factory.php
+++ b/Civi/DataProcessor/Factory.php
@@ -119,7 +119,7 @@ class Factory {
     $this->addDataSource('membership_status', 'Civi\DataProcessor\Source\Member\MembershipStatusSource', E::ts('Membership Status'));
     $this->addDataSource('csv', 'Civi\DataProcessor\Source\CSV', E::ts('CSV File'));
     $this->addOutput('api', 'Civi\DataProcessor\Output\Api', E::ts('API'));
-    $this->addOutput('contact_search', 'CRM_DataprocessorSearch_ContactSearch', E::ts('Contact Search'));
+    $this->addOutput('contact_search', 'CRM_Contact_DataProcessorContactSearch', E::ts('Contact Search'));
     $this->addOutput('activity_search', 'CRM_DataprocessorSearch_ActivitySearch', E::ts('Activity Search'));
     $this->addOutput('case_search', 'CRM_DataprocessorSearch_CaseSearch', E::ts('Case Search'));
     $this->addOutput('participant_search', 'CRM_DataprocessorSearch_ParticipantSearch', E::ts('Participant Search'));
diff --git a/templates/CRM/DataprocessorSearch/Form/ContactSearch.tpl b/templates/CRM/Contact/Form/DataProcessorContactSearch.tpl
similarity index 100%
rename from templates/CRM/DataprocessorSearch/Form/ContactSearch.tpl
rename to templates/CRM/Contact/Form/DataProcessorContactSearch.tpl
diff --git a/templates/CRM/DataprocessorSearch/Form/OutputConfiguration/ContactSearch.tpl b/templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSearch.tpl
similarity index 100%
rename from templates/CRM/DataprocessorSearch/Form/OutputConfiguration/ContactSearch.tpl
rename to templates/CRM/Contact/Form/OutputConfiguration/DataProcessorContactSearch.tpl
-- 
GitLab