CRM-17225 add button allowing reports to be saved in view mode or criteria mode
authoreileenmcnaugton <eileen@fuzion.co.nz>
Tue, 29 Sep 2015 06:04:59 +0000 (19:04 +1300)
committereileen <emcnaughton@wikimedia.org>
Thu, 15 Oct 2015 00:54:10 +0000 (13:54 +1300)
CRM/Report/BAO/ReportInstance.php
CRM/Report/Form.php
CRM/Report/Form/Instance.php
api/v3/ReportInstance.php
templates/CRM/Report/Form/Tabs/Instance.tpl
tests/phpunit/api/v3/SyntaxConformanceTest.php

index 89dd47a3bb89ce30384ed84b6553d38914775cec..adb089d2ae70f1ab012e7fe046e9560fcef153c7 100644 (file)
@@ -160,6 +160,12 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
       unset($params['is_navigation']);
     }
 
+    $viewMode = !empty($params['view_mode']) ? $params['view_mode'] : FALSE;
+    if ($viewMode) {
+      // Do not save to the DB - it's saved in the url.
+      unset($params['view_mode']);
+    }
+
     // add to dashboard
     $dashletParams = array();
     if (!empty($params['addToDashboard'])) {
@@ -185,7 +191,7 @@ class CRM_Report_BAO_ReportInstance extends CRM_Report_DAO_ReportInstance {
       if (empty($params['id']) && empty($params['instance_id']) && !empty($navigationParams['id'])) {
         unset($navigationParams['id']);
       }
-      $navigationParams['url'] = "civicrm/report/instance/{$instance->id}?reset=1";
+      $navigationParams['url'] = "civicrm/report/instance/{$instance->id}" . ($viewMode == 'view' ? '?reset=1&force=1' : '?reset=1&output=criteria');
       $navigation = CRM_Core_BAO_Navigation::add($navigationParams);
 
       if (!empty($navigationParams['is_active'])) {
index 5d5899a934494bde9462c09e0d34ab715cf8d68a..280392cc3d0a22e9c3f51c245e44b793f9c14ec6 100644 (file)
@@ -513,7 +513,10 @@ class CRM_Report_Form extends CRM_Core_Form {
       }
 
       // lets always do a force if reset is found in the url.
-      if (!empty($_REQUEST['reset'])) {
+      // Hey why not? see CRM-17225 for more about this. The use of reset to be force is historical for reasons stated
+      // in the comment line above these 2.
+      if (!empty($_REQUEST['reset']) && CRM_Utils_Request::retrieve('output', 'String') != 'criteria'
+          && CRM_Utils_Request::retrieve('output', 'String') != 'save') {
         $this->_force = 1;
       }
 
index d09d2d2b3795fad88a05a77eaaacdb56edcf4b1f..f96e20b23e924a1f5fc6a968806c9dd51e3bfa96 100644 (file)
@@ -107,6 +107,11 @@ class CRM_Report_Form_Instance {
       array('onclick' => "return showHideByValue('is_navigation','','navigation_menu','table-row','radio',false);")
     );
 
+    $form->addElement('select', 'view_mode', ts('Configure link to...'), array(
+      'view' => ts('View Results'),
+      'criteria' => ts('Show Criteria'),
+    ));
+
     $form->addElement('checkbox', 'addToDashboard', ts('Available for Dashboard?'), NULL,
       array('onclick' => "return showHideByValue('addToDashboard','','limit_result','table-row','radio',false);"));
     $form->addElement('checkbox', 'is_reserved', ts('Reserved Report?'));
@@ -234,6 +239,21 @@ class CRM_Report_Form_Instance {
 </html>
 ";
 
+    // CRM-17225 view_mode currently supports 'view' or 'criteria'.
+    // Prior to 4.7 'view' meant reset=1 in the url & if not set
+    // then show criteria.
+    // From 4.7 we will pro-actively set 'force=1' but still respect the old behaviour.
+    // we may look to add pdf, print_view, csv & various charts as these could simply
+    // be added to the url allowing us to conceptualise 'view right now' vs saved view
+    // & using a multiselect (option value?) could help here.
+    // Note that accessing reports without reset=1 in the url turns out to be
+    // dangerous as it seems to carry actions like 'delete' from one report to another.
+    $defaults['view_mode'] = 'view';
+    $output = CRM_Utils_Request::retrieve('output', 'String');
+    if ($output == 'criteria') {
+      $defaults['view_mode'] = 'criteria';
+    }
+
     if ($instanceID) {
       // this is already retrieved via Form.php
       $defaults['description'] = CRM_Utils_Array::value('description', $defaults);
@@ -246,10 +266,13 @@ class CRM_Report_Form_Instance {
         CRM_Core_BAO_Navigation::retrieve($params, $navigationDefaults);
         $defaults['is_navigation'] = 1;
         $defaults['parent_id'] = CRM_Utils_Array::value('parent_id', $navigationDefaults);
-
         if (!empty($navigationDefaults['is_active'])) {
           $form->assign('is_navigation', TRUE);
         }
+        // A saved view mode will over-ride any url assumptions.
+        if (strpos($navigationDefaults['url'], 'output=criteria')) {
+          $defaults['view_mode'] = 'criteria';
+        }
 
         if (!empty($navigationDefaults['id'])) {
           $form->_navigation['id'] = $navigationDefaults['id'];
@@ -320,6 +343,7 @@ class CRM_Report_Form_Instance {
     foreach ($unsetFields as $field) {
       unset($formValues[$field]);
     }
+    $view_mode = $formValues['view_mode'];
     // pass form_values as string
     $params['form_values'] = serialize($formValues);
 
@@ -339,7 +363,14 @@ class CRM_Report_Form_Instance {
     CRM_Core_Session::setStatus($statusMsg);
 
     if ($redirect) {
-      CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/report/instance/{$instance->id}", "reset=1"));
+      $urlParams = array('reset' => 1);
+      if ($view_mode == 'view') {
+        $urlParams['force'] = 1;
+      }
+      else {
+        $urlParams['output'] = 'criteria';
+      }
+      CRM_Utils_System::redirect(CRM_Utils_System::url("civicrm/report/instance/{$instance->id}", $urlParams));
     }
   }
 
index 7bbcd68ecabfc30309f409da854decae4a497255..677a5fd908c88b9537490ecdf98a82507477f05a 100644 (file)
@@ -67,6 +67,13 @@ function civicrm_api3_report_instance_create($params) {
 function _civicrm_api3_report_instance_create_spec(&$params) {
   $params['report_id']['api.required'] = 1;
   $params['title']['api.required'] = 1;
+  $params['view_mode']['api.default'] = 'view';
+  $params['view_mode']['title'] = ts('View Mode for Navigation URL');
+  $params['view_mode']['type'] = CRM_Utils_Type::T_STRING;
+  $params['view_mode']['options'] = array(
+    'view' => ts('View'),
+    'criteria' => ts('Show Criteria'),
+  );
 }
 
 /**
index 41cb80feb0549f593efdb3724bdcf4acf36ea09e..fa310c3fc41e54c2bb92cfef18485a684a2d880d 100644 (file)
@@ -66,7 +66,7 @@
   <table class="form-layout">
     <tr class="crm-report-instanceForm-form-block-is_navigation">
       <td class="report-label">{$form.is_navigation.label}</td>
-      <td>{$form.is_navigation.html}<br />
+      <td>{$form.is_navigation.html} {ts}Link to {/ts}  {$form.view_mode.html}<br />
         <span class="description">{ts}All report instances are automatically included in the Report Listing page. Check this box to also add this report to the navigation menu.{/ts}</span>
       </td>
     </tr>
index 9738a9f896b3ad9786852099da98c29257b22c70..0b37dcbeadfe3529f9f318a5e87795d67dd6012b 100644 (file)
@@ -630,6 +630,10 @@ class api_v3_SyntaxConformanceTest extends CiviUnitTestCase {
           'weight', //won't update as there is no 1 in the same price set
         ),
       ),
+      'ReportInstance' => array(
+        // View mode is part of the navigation which is not retrieved by the api.
+        'cant_return' => array('view_mode'),
+      ),
       'SavedSearch' => array(
         // I think the fields below are generated based on form_values.
         'cant_update' => array(