From 4e086328c1800e61db606f30e0ce2e015612d6c7 Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Wed, 5 Jun 2019 17:47:10 -0400 Subject: [PATCH] dev/core#628 - Make Quicksearch options sortable --- CRM/Admin/Form/SettingTrait.php | 45 ++++++++++++++++++++++++++++----- CRM/Admin/Page/AJAX.php | 2 +- css/civicrm.css | 21 +++++++++++++++ js/Common.js | 1 + js/crm.menubar.js | 7 ++++- settings/Search.setting.php | 1 + 6 files changed, 68 insertions(+), 9 deletions(-) diff --git a/CRM/Admin/Form/SettingTrait.php b/CRM/Admin/Form/SettingTrait.php index a211b33f9e..672aa0d175 100644 --- a/CRM/Admin/Form/SettingTrait.php +++ b/CRM/Admin/Form/SettingTrait.php @@ -208,12 +208,13 @@ trait CRM_Admin_Form_SettingTrait { $this->addCheckBox($setting, '', $options, NULL, CRM_Utils_Array::value('html_attributes', $props), NULL, NULL, ['  ']); } 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'] = ['']; + $settingMetaData[$setting]['wrapper_element'] = ['']; $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); + } + } diff --git a/CRM/Admin/Page/AJAX.php b/CRM/Admin/Page/AJAX.php index f782de9428..109307216c 100644 --- a/CRM/Admin/Page/AJAX.php +++ b/CRM/Admin/Page/AJAX.php @@ -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) { diff --git a/css/civicrm.css b/css/civicrm.css index 3be9444c58..fe2864a6eb 100644 --- a/css/civicrm.css +++ b/css/civicrm.css @@ -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, diff --git a/js/Common.js b/js/Common.js index 1dee5a526a..9b5f835ed3 100644 --- a/js/Common.js +++ b/js/Common.js @@ -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 diff --git a/js/crm.menubar.js b/js/crm.menubar.js index f3b98afc72..ed5eb920ee 100644 --- a/js/crm.menubar.js +++ b/js/crm.menubar.js @@ -365,7 +365,12 @@ $('#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)'); diff --git a/settings/Search.setting.php b/settings/Search.setting.php index 48f8943e16..4d5e198b07 100644 --- a/settings/Search.setting.php +++ b/settings/Search.setting.php @@ -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', ], -- 2.25.1