dev/core#628 - Make Quicksearch options sortable
authorColeman Watts <coleman@civicrm.org>
Wed, 5 Jun 2019 21:47:10 +0000 (17:47 -0400)
committerColeman Watts <coleman@civicrm.org>
Thu, 6 Jun 2019 00:33:38 +0000 (20:33 -0400)
CRM/Admin/Form/SettingTrait.php
CRM/Admin/Page/AJAX.php
css/civicrm.css
js/Common.js
js/crm.menubar.js
settings/Search.setting.php

index a211b33f9e46ebed0a24b82e6d5b8608d2f8941c..672aa0d175ccc8025b17cc062c952e140d6a7c70 100644 (file)
@@ -208,12 +208,13 @@ trait CRM_Admin_Form_SettingTrait {
           $this->addCheckBox($setting, '', $options, NULL, CRM_Utils_Array::value('html_attributes', $props), NULL, NULL, ['&nbsp;&nbsp;']);
         }
         elseif ($add == 'addCheckBoxes') {
-          $options = array_flip($options);
-          $newOptions = [];
-          foreach ($options as $key => $val) {
-            $newOptions[$key] = $val;
+          $newOptions = array_flip($options);
+          $classes = 'crm-checkbox-list';
+          if (!empty($props['sortable'])) {
+            $classes .= ' crm-sortable-list';
+            $newOptions = array_flip(self::reorderSortableOptions($setting, $options));
           }
-          $settingMetaData[$setting]['wrapper_element'] = ['<ul class="crm-checkbox-list"><li>', '</li></ul>'];
+          $settingMetaData[$setting]['wrapper_element'] = ['<ul class="' . $classes . '"><li>', '</li></ul>'];
           $this->addCheckBox($setting,
             $props['title'],
             $newOptions,
@@ -332,10 +333,14 @@ trait CRM_Admin_Form_SettingTrait {
   protected function saveMetadataDefinedSettings($params) {
     $settings = $this->getSettingsToSetByMetadata($params);
     foreach ($settings as $setting => $settingValue) {
-      if ($this->getQuickFormType($this->getSettingMetadata($setting)) === 'CheckBoxes') {
+      $settingMetaData = $this->getSettingMetadata($setting);
+      if (!empty($settingMetaData['sortable'])) {
+        $settings[$setting] = $this->getReorderedSettingData($setting, $settingValue);
+      }
+      elseif ($this->getQuickFormType($settingMetaData) === 'CheckBoxes') {
         $settings[$setting] = array_keys($settingValue);
       }
-      if ($this->getQuickFormType($this->getSettingMetadata($setting)) === 'CheckBox') {
+      elseif ($this->getQuickFormType($settingMetaData) === 'CheckBox') {
         // This will be an array with one value.
         $settings[$setting] = (int) reset($settings[$setting]);
       }
@@ -343,4 +348,30 @@ trait CRM_Admin_Form_SettingTrait {
     civicrm_api3('setting', 'create', $settings);
   }
 
+  /**
+   * Display options in correct order on the form
+   *
+   * @param $setting
+   * @param $options
+   * @return array
+   */
+  public static function reorderSortableOptions($setting, $options) {
+    return array_merge(array_flip(Civi::settings()->get($setting)), $options);
+  }
+
+  /**
+   * @param string $setting
+   * @param array $settingValue
+   *
+   * @return array
+   */
+  private function getReorderedSettingData($setting, $settingValue) {
+    // Get order from $_POST as $_POST maintains the order the sorted setting
+    // options were sent. You can simply assign data from $_POST directly to
+    // $settings[] but preference has to be given to data from Quickform.
+    $order = array_keys(\CRM_Utils_Request::retrieve($setting, 'String'));
+    $settingValueKeys = array_keys($settingValue);
+    return array_intersect($order, $settingValueKeys);
+  }
+
 }
index f782de942853bb77ff41c31af62a3aeb297324eb..109307216c7d49d7be3f48b17782f8b7b4e7654f 100644 (file)
@@ -95,7 +95,7 @@ class CRM_Admin_Page_AJAX {
   }
 
   public static function getSearchOptions() {
-    $searchOptions = array_merge(['sort_name'], Civi::settings()->get('quicksearch_options'));
+    $searchOptions = Civi::settings()->get('quicksearch_options');
     $labels = CRM_Core_SelectValues::quicksearchOptions();
     $result = [];
     foreach ($searchOptions as $key) {
index 3be9444c585b421337010654911a4b00741880fa..fe2864a6ebefd2653c3b802fdd22511e1566f521 100644 (file)
@@ -3266,6 +3266,27 @@ span.crm-select-item-color {
   background-color: #fffdb2
 }
 
+.crm-container ul.crm-sortable-list li label {
+  padding-left: 40px;
+  cursor: move;
+}
+.crm-container ul.crm-sortable-list li label:after {
+  display: block;
+  font-family: "FontAwesome";
+  content: "\f047";
+  position: absolute;
+  left: 4px;
+  top: 2px;
+  font-size: 10px;
+  color: grey;
+}
+.crm-container ul.crm-sortable-list li:hover label:after {
+  color: inherit;
+}
+.crm-container ul.crm-checkbox-list.crm-sortable-list li input {
+  left: 23px;
+}
+
 /* classes related to batch entry operation */
 .crm-container span.batch-edit,
 .crm-container span.batch-valid,
index 1dee5a526a7798292b3c9968c26ea618d98c299f..9b5f835ed37921d563d4b7e401cd07fe3bc55600 100644 (file)
@@ -879,6 +879,7 @@ if (!CRM.vars) CRM.vars = {};
           }
         })
         .find('input.select-row:checked').parents('tr').addClass('crm-row-selected');
+      $('.crm-sortable-list', e.target).sortable();
       $('table.crm-sortable', e.target).DataTable();
       $('table.crm-ajax-table', e.target).each(function() {
         var
index f3b98afc7267d426c29c2783e9e8ea5a1fedbb3c..ed5eb920ee600ff5fea5c225bf2c26016f2a4d05 100644 (file)
           $('#crm-qsearch-input').focus().autocomplete("search");
         }, 1);
       });
-      $('.crm-quickSearchField input[value="' + CRM.cache.get('quickSearchField', 'sort_name') + '"]').prop('checked', true);
+      var savedDefault = CRM.cache.get('quickSearchField');
+      if (savedDefault) {
+        $('.crm-quickSearchField input[value="' + savedDefault + '"]').prop('checked', true);
+      } else {
+        $('.crm-quickSearchField:first input').prop('checked', true);
+      }
       setQuickSearchValue();
       $('#civicrm-menu').on('activate.smapi', function(e, item) {
         return !$('ul.crm-quickSearch-results').is(':visible:not(.ui-state-disabled)');
index 48f8943e169a94172d02483ff314d9cc7c1303f8..4d5e198b07a422e7d07cad9e91fe2fa18ca2125b 100644 (file)
@@ -235,6 +235,7 @@ return [
     'type' => 'string',
     'serialize' => CRM_Core_DAO::SERIALIZE_SEPARATOR_BOOKEND,
     'html_type' => 'checkboxes',
+    'sortable' => TRUE,
     'pseudoconstant' => [
       'callback' => 'CRM_Core_SelectValues::quicksearchOptions',
     ],