From 0bd7975f581a86cdc8d079ed50f1be6cf1b7d74d Mon Sep 17 00:00:00 2001
From: Jaap Jansma <jaap.jansma@civicoop.org>
Date: Tue, 2 Apr 2019 14:26:49 +0200
Subject: [PATCH] required filters and import functionality

---
 CRM/Dataprocessor/Form/Import.php             | 41 ++++++++++++++++++
 .../Form/AbstractSearch.php                   | 43 ++++++++++++-------
 .../CRM/Dataprocessor/Form/DataProcessor.tpl  |  2 +-
 templates/CRM/Dataprocessor/Form/Import.tpl   | 12 ++++++
 .../Form/Search/DataProcessorCriteria.tpl     |  8 ++++
 xml/Menu/dataprocessor.xml                    |  7 +++
 6 files changed, 97 insertions(+), 16 deletions(-)
 create mode 100644 CRM/Dataprocessor/Form/Import.php
 create mode 100644 templates/CRM/Dataprocessor/Form/Import.tpl

diff --git a/CRM/Dataprocessor/Form/Import.php b/CRM/Dataprocessor/Form/Import.php
new file mode 100644
index 00000000..039c4d50
--- /dev/null
+++ b/CRM/Dataprocessor/Form/Import.php
@@ -0,0 +1,41 @@
+<?php
+
+use CRM_Dataprocessor_ExtensionUtil as E;
+
+/**
+ * @author Jaap Jansma <jaap.jansma@civicoop.org>
+ * @license AGPL-3.0
+ */
+
+class CRM_Dataprocessor_Form_Import extends CRM_Core_Form {
+
+  /**
+   * Function to perform processing before displaying form (overrides parent function)
+   *
+   * @access public
+   */
+  function preProcess() {
+    parent::preProcess();
+  }
+
+  public function buildQuickForm() {
+    $this->add('textarea', 'code', E::ts('Import code'), 'rows=30 style="width:100%"', true);
+    $this->addButtons(array(
+      array('type' => 'next', 'name' => E::ts('Import'), 'isDefault' => TRUE,),
+      array('type' => 'cancel', 'name' => E::ts('Cancel'))
+    ));
+  }
+
+  public function postProcess() {
+    $values = $this->exportValues();
+    $importCode = json_decode($values['code'], true);
+    $importResult = CRM_Dataprocessor_Utils_Importer::import($importCode, '');
+
+    CRM_Core_Session::setStatus(E::ts('Imported data processor'), '', 'success');
+
+    $redirectUrl = CRM_Utils_System::url('civicrm/dataprocessor/form/edit', array('reset' => 1, 'action' => 'update', 'id' => $importResult['new_id']));
+    CRM_Utils_System::redirect($redirectUrl);
+  }
+
+
+}
\ No newline at end of file
diff --git a/CRM/DataprocessorSearch/Form/AbstractSearch.php b/CRM/DataprocessorSearch/Form/AbstractSearch.php
index b4bac817..cf31e54a 100644
--- a/CRM/DataprocessorSearch/Form/AbstractSearch.php
+++ b/CRM/DataprocessorSearch/Form/AbstractSearch.php
@@ -48,11 +48,6 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
    */
   protected $sort;
 
-  /**
-   * @var bool
-   */
-  protected $formHasRequiredFilters = FALSE;
-
   /**
    * Checks whether the output has a valid configuration
    *
@@ -147,6 +142,13 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
   public function preProcess() {
     parent::preProcess();
 
+    if (!empty($_POST) && !$this->controller->isModal()) {
+      $this->_formValues = $this->controller->exportValues($this->_name);
+    }
+    else {
+      $this->_formValues = $this->getSubmitValues();
+    }
+
     $this->findDataProcessor();
 
     $this->_searchButtonName = $this->getButtonName('refresh');
@@ -162,13 +164,8 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
     $this->set('context', $this->_context);
     $this->assign("context", $this->_context);
     $this->assign('debug', $this->_debug);
-    if (!empty($_POST) && !$this->controller->isModal()) {
-      $this->_formValues = $this->controller->exportValues($this->_name);
-    }
-    else {
-      $this->_formValues = $this->get('formValues');
-    }
-    if (!$this->formHasRequiredFilters || !empty($this->_formValues)) {
+
+    if (!$this->hasRequiredFilters() || !empty($this->_formValues)) {
       $limit = CRM_Utils_Request::retrieve('crmRowCount', 'Positive', $this, FALSE, CRM_Utils_Pager::ROWCOUNT);
       $pageId = CRM_Utils_Request::retrieve('crmPID', 'Positive', $this, FALSE, 1);
 
@@ -328,6 +325,22 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
     return FALSE;
   }
 
+  /**
+   * Returns whether the search has required filters.
+   *
+   * @return bool
+   */
+  protected function hasRequiredFilters() {
+    if ($this->dataProcessor->getFilterHandlers()) {
+      foreach ($this->dataProcessor->getFilterHandlers() as $filter) {
+        if ($filter->isRequired()) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
   protected function setFilters() {
     if ($this->dataProcessor->getFilterHandlers()) {
       foreach ($this->dataProcessor->getFilterHandlers() as $filter) {
@@ -476,6 +489,9 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
           continue;
         }
         $filter['title'] = $fieldSpec->title;
+        if ($filterHandler->isRequired()) {
+          $filter['title'] .= ' <span class="crm-marker">*</span>';
+        }
         $filter['type'] = $fieldSpec->type;
         $operations = $this->getOperatorOptions($fieldSpec);
         if ($fieldSpec->getOptions()) {
@@ -509,9 +525,6 @@ abstract class CRM_DataprocessorSearch_Form_AbstractSearch extends CRM_Core_Form
               break;
           }
         }
-        if ($filterHandler->isRequired()) {
-          $this->formHasRequiredFilters = TRUE;
-        }
         $filterElements[$fieldSpec->alias] = $filter;
       }
       $this->assign('filters', $filterElements);
diff --git a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
index 4d72c2c1..783e46ba 100644
--- a/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
+++ b/templates/CRM/Dataprocessor/Form/DataProcessor.tpl
@@ -14,7 +14,7 @@
   <h3>{ts}Export Data Processor{/ts}</h3>
   <div class="crm-block crm-form-block crm-data-processor_label-block">
     <div class="crm-section">
-      <pre>{$export}</pre>
+      <textarea style="width:100%;">{$export}</textarea>
     </div>
   </div>
 {else}
diff --git a/templates/CRM/Dataprocessor/Form/Import.tpl b/templates/CRM/Dataprocessor/Form/Import.tpl
new file mode 100644
index 00000000..19bd5d42
--- /dev/null
+++ b/templates/CRM/Dataprocessor/Form/Import.tpl
@@ -0,0 +1,12 @@
+{crmScope extensionKey='dataprocessor'}
+    {* block for rule data *}
+    <h3>{ts}Import data processor{/ts}</h3>
+    <div class="crm-block crm-form-block crm-data-processor_source-block">
+            <h3>{ts}Code{/ts}</h3>
+            {$form.code.html}
+    </div>
+
+    <div class="crm-submit-buttons">
+        {include file="CRM/common/formButtons.tpl" location="bottom"}
+    </div>
+{/crmScope}
\ No newline at end of file
diff --git a/templates/CRM/Dataprocessor/Form/Search/DataProcessorCriteria.tpl b/templates/CRM/Dataprocessor/Form/Search/DataProcessorCriteria.tpl
index 3d49a76a..ab15a2e2 100644
--- a/templates/CRM/Dataprocessor/Form/Search/DataProcessorCriteria.tpl
+++ b/templates/CRM/Dataprocessor/Form/Search/DataProcessorCriteria.tpl
@@ -50,6 +50,14 @@
             </div><!- /.crm-accordion-body -->
         </div><!-- /.crm-accordion-wrapper -->
     </div><!-- /.crm-form-block -->
+
+    <br />
+    <div class="crm-block">
+        <div class="action-link">
+            <a class="button" href="{crmURL p="civicrm/dataprocessor/form/edit" q="reset=1&action=add" }">{ts}Add dataprocessor{/ts}</a>
+            <a class="button" href="{crmURL p="civicrm/dataprocessor/form/import" q="reset=1&action=add" }">{ts}Import data processor{/ts}</a>
+        </div>
+    </div>
 {/strip}
 {/crmScope}
 
diff --git a/xml/Menu/dataprocessor.xml b/xml/Menu/dataprocessor.xml
index 8fc48933..a99d0c1a 100644
--- a/xml/Menu/dataprocessor.xml
+++ b/xml/Menu/dataprocessor.xml
@@ -7,6 +7,13 @@
     <access_arguments>access CiviCRM</access_arguments>
     <access_arguments>administer CiviCRM</access_arguments>
   </item>
+  <item>
+    <path>civicrm/dataprocessor/form/import</path>
+    <page_callback>CRM_Dataprocessor_Form_Import</page_callback>
+    <title>Import DataProcessor</title>
+    <access_arguments>access CiviCRM</access_arguments>
+    <access_arguments>administer CiviCRM</access_arguments>
+  </item>
   <item>
     <path>civicrm/dataprocessor/form/source</path>
     <page_callback>CRM_Dataprocessor_Form_Source</page_callback>
-- 
GitLab