From 0ed5b7531ae73bc23f66749588a6ba9a5e5f6edc Mon Sep 17 00:00:00 2001 From: bcweaver <brianweaver@gmail.com> Date: Wed, 24 Oct 2018 13:33:14 -0400 Subject: [PATCH] Update 'better_exposed_filters' module: 8.x-3.0-alpha3 --> 8.x-3.0-alpha4 --- composer.json | 2 +- composer.lock | 14 +-- vendor/composer/installed.json | 14 +-- .../better_exposed_filters.info.yml | 8 +- .../better_exposed_filters.module | 5 +- .../better_exposed_filters.theme | 9 +- ...er_exposed_filters.exposed_form.schema.yml | 3 + .../js/bef_select_all_none.js | 2 +- .../exposed_form/BetterExposedFilters.php | 103 +++++++++++++++--- .../tests/bef_test/bef_test.info.yml | 6 +- .../tests/bef_test/bef_test.install | 2 +- .../src/Unit/BetterExposedFiltersTest.php | 5 - 12 files changed, 124 insertions(+), 49 deletions(-) diff --git a/composer.json b/composer.json index 34ab0a2569..131a640f06 100644 --- a/composer.json +++ b/composer.json @@ -74,7 +74,7 @@ "drupal/admin_toolbar": "1.24", "drupal/administerusersbyrole": "2.0-alpha6", "drupal/allowed_formats": "1.1", - "drupal/better_exposed_filters": "3.0-alpha3", + "drupal/better_exposed_filters": "3.0-alpha4", "drupal/block_permissions": "^1.0", "drupal/block_region_permissions": "^1.2", "drupal/bootstrap": "3.5", diff --git a/composer.lock b/composer.lock index 911cd135cc..97231667f6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "60e47e19de7071bb94ff15a24b7a3cfd", + "content-hash": "5708485abce6f91ba4060cba02b1f1db", "packages": [ { "name": "alchemy/zippy", @@ -1564,17 +1564,17 @@ }, { "name": "drupal/better_exposed_filters", - "version": "3.0.0-alpha3", + "version": "3.0.0-alpha4", "source": { "type": "git", "url": "https://git.drupal.org/project/better_exposed_filters", - "reference": "8.x-3.0-alpha3" + "reference": "8.x-3.0-alpha4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-3.0-alpha3.zip", - "reference": "8.x-3.0-alpha3", - "shasum": "0268a42ea5a4ab170c8f4aefecd26b6f3c7448d2" + "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-3.0-alpha4.zip", + "reference": "8.x-3.0-alpha4", + "shasum": "f42013d1fc36d45212d582e18afc59bc2c364719" }, "require": { "drupal/core": "*" @@ -1585,7 +1585,7 @@ "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-3.0-alpha3", + "version": "8.x-3.0-alpha4", "datestamp": "1525044484", "security-coverage": { "status": "not-covered", diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index d1bb9bb8e0..9ec806fba6 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -1615,18 +1615,18 @@ }, { "name": "drupal/better_exposed_filters", - "version": "3.0.0-alpha3", - "version_normalized": "3.0.0.0-alpha3", + "version": "3.0.0-alpha4", + "version_normalized": "3.0.0.0-alpha4", "source": { "type": "git", "url": "https://git.drupal.org/project/better_exposed_filters", - "reference": "8.x-3.0-alpha3" + "reference": "8.x-3.0-alpha4" }, "dist": { "type": "zip", - "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-3.0-alpha3.zip", - "reference": "8.x-3.0-alpha3", - "shasum": "0268a42ea5a4ab170c8f4aefecd26b6f3c7448d2" + "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-3.0-alpha4.zip", + "reference": "8.x-3.0-alpha4", + "shasum": "f42013d1fc36d45212d582e18afc59bc2c364719" }, "require": { "drupal/core": "*" @@ -1637,7 +1637,7 @@ "dev-3.x": "3.x-dev" }, "drupal": { - "version": "8.x-3.0-alpha3", + "version": "8.x-3.0-alpha4", "datestamp": "1525044484", "security-coverage": { "status": "not-covered", diff --git a/web/modules/better_exposed_filters/better_exposed_filters.info.yml b/web/modules/better_exposed_filters/better_exposed_filters.info.yml index f2d1d3e77d..b5e40eb0a9 100644 --- a/web/modules/better_exposed_filters/better_exposed_filters.info.yml +++ b/web/modules/better_exposed_filters/better_exposed_filters.info.yml @@ -4,10 +4,10 @@ description: Provides advanced options (such as links, checkboxes, or jQueryUI w type: module package: Views dependencies: - - views + - drupal:views -# Information added by Drupal.org packaging script on 2017-07-28 -version: '8.x-3.0-alpha3' +# Information added by Drupal.org packaging script on 2018-04-29 +version: '8.x-3.0-alpha4' core: '8.x' project: 'better_exposed_filters' -datestamp: 1501274345 +datestamp: 1525044488 diff --git a/web/modules/better_exposed_filters/better_exposed_filters.module b/web/modules/better_exposed_filters/better_exposed_filters.module index ee7648c1e6..bf29b7869f 100644 --- a/web/modules/better_exposed_filters/better_exposed_filters.module +++ b/web/modules/better_exposed_filters/better_exposed_filters.module @@ -296,8 +296,9 @@ function _bef_preprocess_nested_elements(array &$variables) { */ function bef_sort_combine_submit($form, FormStateInterface $form_state) { $sortBy = $sortOrder = ''; - if ($form_state->hasValue('sort_bef_combine')) { - list($sortBy, $sortOrder) = explode(' ', $form_state->getValue('sort_bef_combine')); + $combined = $form_state->getValue('sort_bef_combine'); + if (!empty($combined)) { + list($sortBy, $sortOrder) = explode(' ', $combined); } $form_state->setValue('sort_by', $sortBy); $form_state->setValue('sort_order', $sortOrder); diff --git a/web/modules/better_exposed_filters/better_exposed_filters.theme b/web/modules/better_exposed_filters/better_exposed_filters.theme index 8d3f4426f9..d51a79d5b9 100644 --- a/web/modules/better_exposed_filters/better_exposed_filters.theme +++ b/web/modules/better_exposed_filters/better_exposed_filters.theme @@ -87,7 +87,8 @@ function theme_select_as_hidden($vars) { // Check for Taxonomy-based filters. if (is_object($elem)) { $slice = array_slice($elem->option, 0, 1, TRUE); - list($option, $elem) = each($slice); + $option = key($slice); + $elem = current($slice); } // Check for optgroups. Put subelements in the $element_set array and add a @@ -212,7 +213,8 @@ function theme_select_as_tree($vars) { // Check for Taxonomy-based filters. if (is_object($option_label)) { $slice = array_slice($option_label->option, 0, 1, TRUE); - list($option_value, $option_label) = each($slice); + $option_value = key($slice); + $option_label = current($slice); } // Check for optgroups -- which is basically a two-level deep tree. @@ -391,7 +393,8 @@ function theme_select_as_links($vars) { // Check for Taxonomy-based filters. if (is_object($elem)) { $slice = array_slice($elem->option, 0, 1, TRUE); - list($option, $elem) = each($slice); + $option = key($slice); + $elem = current($slice); } // Check for optgroups. Put subelements in the $element_set array and add diff --git a/web/modules/better_exposed_filters/config/schema/better_exposed_filters.exposed_form.schema.yml b/web/modules/better_exposed_filters/config/schema/better_exposed_filters.exposed_form.schema.yml index 167f9d8e39..2bc504662f 100644 --- a/web/modules/better_exposed_filters/config/schema/better_exposed_filters.exposed_form.schema.yml +++ b/web/modules/better_exposed_filters/config/schema/better_exposed_filters.exposed_form.schema.yml @@ -12,6 +12,9 @@ better_exposed_filters.general: autosubmit: type: boolean label: 'Autosubmit' + autosubmit_exclude_textfield: + type: boolean + label: 'Exclude Textfield' autosubmit_hide: type: boolean label: 'Hide submit button' diff --git a/web/modules/better_exposed_filters/js/bef_select_all_none.js b/web/modules/better_exposed_filters/js/bef_select_all_none.js index f855042a3e..30d6313c20 100644 --- a/web/modules/better_exposed_filters/js/bef_select_all_none.js +++ b/web/modules/better_exposed_filters/js/bef_select_all_none.js @@ -68,7 +68,7 @@ // If all checkboxes are already checked by default then switch to Select None if ($('input:checkbox:checked', this).length == $('input:checkbox', this).length) { - newLink.click(); + newLink.text(selNone); } }) ; diff --git a/web/modules/better_exposed_filters/src/Plugin/views/exposed_form/BetterExposedFilters.php b/web/modules/better_exposed_filters/src/Plugin/views/exposed_form/BetterExposedFilters.php index 72348d0c25..9e52626a7e 100644 --- a/web/modules/better_exposed_filters/src/Plugin/views/exposed_form/BetterExposedFilters.php +++ b/web/modules/better_exposed_filters/src/Plugin/views/exposed_form/BetterExposedFilters.php @@ -88,6 +88,18 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) { '#default_value' => $existing['general']['autosubmit'], ); + $bef_options['general']['autosubmit_exclude_textfield'] = array( + '#type' => 'checkbox', + '#title' => $this->t('Exclude Textfield'), + '#description' => $this->t('Exclude Textfield from autosubmit. User will have to press enter key or click submit.'), + '#default_value' => $existing['general']['autosubmit_exclude_textfield'], + '#states' => array( + 'visible' => array( + ':input[name="exposed_form_options[bef][general][autosubmit]"]' => array('checked' => TRUE), + ), + ), + ); + $bef_options['general']['autosubmit_hide'] = array( '#type' => 'checkbox', '#title' => $this->t('Hide submit button'), @@ -644,6 +656,14 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { $form['actions']['submit']['#attributes']['data-bef-auto-submit-click'] = ''; $form['#attached']['library'][] = 'better_exposed_filters/auto_submit'; + if (!empty($settings['general']['autosubmit_exclude_textfield'])) { + foreach ($form as &$element) { + if (isset($element['#type']) && $element['#type'] == 'textfield') { + $element['#attributes'] = ['data-bef-auto-submit-exclude' => '']; + } + } + } + if (!empty($settings['general']['autosubmit_hide'])) { $form['actions']['submit']['#attributes']['class'][] = 'js-hide'; } @@ -719,7 +739,7 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // the view results appear on. This can cause problems with // select_as_links options as they will use the wrong path. We // provide a hint for theme functions to correct this. - $form['sort_bef_combine']['#bef_path'] = $this->displayHandler->getUrl(); + $form['sort_bef_combine']['#bef_path'] = $this->getExposedFormActionUrl(); break; case 'default': @@ -747,12 +767,14 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // Leave sort_by and sort_order as separate elements. if ('bef' == $settings['sort']['bef_format']) { foreach (['sort_by', 'sort_order'] as $field) { - $form[$field]['#theme'] = 'bef_radios'; - $form[$field]['#type'] = 'radios'; - if (empty($form[$field]['#process'])) { - $form[$field]['#process'] = array(); + if (!empty($form[$field])) { + $form[$field]['#theme'] = 'bef_radios'; + $form[$field]['#type'] = 'radios'; + if (empty($form[$field]['#process'])) { + $form[$field]['#process'] = array(); + } + $form[$field]['#process'][] = ['\Drupal\Core\Render\Element\Radios', 'processRadios']; } - $form[$field]['#process'][] = ['\Drupal\Core\Render\Element\Radios', 'processRadios']; } } elseif ('bef_links' == $settings['sort']['bef_format']) { @@ -765,9 +787,9 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // view results appear on. This can cause problems with // select_as_links options as they will use the wrong path. We provide // a hint for theme functions to correct this. - $form['sort_by']['#bef_path'] = $this->displayHandler->getUrl(); + $form['sort_by']['#bef_path'] = $this->getExposedFormActionUrl(); if(!empty($form['sort_order'])) { - $form['sort_order']['#bef_path'] = $this->displayHandler->getUrl(); + $form['sort_order']['#bef_path'] = $this->getExposedFormActionUrl(); } } @@ -834,7 +856,7 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // the view results appear on. This can cause problems with // select_as_links options as they will use the wrong path. We // provide a hint for theme functions to correct this. - $form['items_per_page']['#bef_path'] = $this->displayHandler->getUrl(); + $form['items_per_page']['#bef_path'] = $this->getExposedFormActionUrl(); } break; } @@ -1082,7 +1104,7 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // the view results appear on. This can cause problems with // select_as_links options as they will use the wrong path. We provide // a hint for theme functions to correct this. - $form[$field_id]['#bef_path'] = $this->displayHandler->getUrl(); + $form[$field_id]['#bef_path'] = $this->getExposedFormActionUrl(); break; case 'bef_single': @@ -1090,8 +1112,36 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { // Use filter label as checkbox label. $form[$field_id]['#title'] = $filters[$label]->options['expose']['label']; - $form[$field_id]['#return_value'] = 1; $form[$field_id]['#type'] = 'checkbox'; + // Views populates missing values in $form_state['input'] with the + // defaults and a checkbox does not appear in $_GET (or $_POST) so it + // will appear to be missing when a user submits a form. Because of + // this, instead of unchecking the checkbox value will revert to the + // default. More, the default value for select values is reused which + // results in the checkbox always checked. So we need to add a form + // element to see whether the form is submitted or not and then we + // need to look at $_GET directly to see whether the checkbox is + // there. For security reasons, we must not copy the $_GET value. + + // First, let's figure out a short name for the signal element and + // then add it. + if (empty($signal)) { + for ($signal = 'a'; isset($form[$signal]); $signal++); + // This is all the signal element needs. + $form[$signal]['#type'] = 'hidden'; + } + $input = $form_state->getUserInput(); + $value = \Drupal::request()->query->get($field_id); + $checked = isset($input[$signal]) ? isset($value) : $form[$field_id]['#default_value']; + // For security, we check if value is valid and exist. + if ($checked) { + if (!in_array($value, array_keys($form[$field_id]['#options']))) { + $checked = FALSE; + } + } + // Now we know whether the checkbox is checked or not, set #value + // accordingly. + $form[$field_id]['#value'] = $checked ? $value : 0; break; case 'bef': @@ -1167,9 +1217,11 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) { $form['#info']["filter-$label"]['description'] = ''; // Check if the operator is exposed for this filter. - if ($this->view->getHandlers('filter')[$field_id]['expose']['use_operator']) { + if (isset($this->view->getHandlers('filter')[$label]) + && $this->view->getHandlers('filter')[$label]['expose']['use_operator'] + ) { // Include the exposed operator with the filter. - $operator_id = $this->view->getHandlers('filter')[$field_id]['expose']['operator_id']; + $operator_id = $this->view->getHandlers('filter')[$label]['expose']['operator_id']; $form[$field_id][$operator_id] = $form[$operator_id]; unset($form[$operator_id]); } @@ -1322,7 +1374,8 @@ protected function rewriteOptions(array $options, $rewriteSettings, $reorder = F } else { if ($return[$index] instanceof \stdClass) { - list($tid, $text) = each($return[$index]->option); + $tid = key($return[$index]->option); + $text = current($return[$index]->option); $return[$index]->option[$tid] = $rewrites[$text]; } else { @@ -1357,7 +1410,8 @@ protected function cleanOptions(array $options) { // need to be converted to text. if (is_object($value) && !is_a($value, 'Drupal\Core\StringTranslation\TranslatableMarkup')) { reset($value->option); - list($key, $val) = each($value->option); + $key = key($value->option); + $val = current($value->option); $clean[$key] = $val; } else { @@ -1471,6 +1525,7 @@ protected function getSettings() { 'allow_secondary' => FALSE, 'secondary_label' => $this->t('Advanced options'), 'autosubmit' => FALSE, + 'autosubmit_exclude_textfield' => FALSE, 'autosubmit_hide' => FALSE, ), 'sort' => array( @@ -1542,4 +1597,22 @@ protected function getSettings() { return $settings; } + /** + * Returns exposed form action URL object. + * + * @return \Drupal\Core\Url + * Url object. + */ + protected function getExposedFormActionUrl() { + if ($this->displayHandler->getRoutedDisplay()) { + return $this->displayHandler->getUrl(); + } + + $request = \Drupal::request(); + $url = Url::createFromRequest($request); + $url->setAbsolute(); + + return $url; + } + } diff --git a/web/modules/better_exposed_filters/tests/bef_test/bef_test.info.yml b/web/modules/better_exposed_filters/tests/bef_test/bef_test.info.yml index 8eefb0ca9e..0005b22879 100644 --- a/web/modules/better_exposed_filters/tests/bef_test/bef_test.info.yml +++ b/web/modules/better_exposed_filters/tests/bef_test/bef_test.info.yml @@ -10,8 +10,8 @@ dependencies: - options - user -# Information added by Drupal.org packaging script on 2017-07-28 -version: '8.x-3.0-alpha3' +# Information added by Drupal.org packaging script on 2018-04-29 +version: '8.x-3.0-alpha4' core: '8.x' project: 'better_exposed_filters' -datestamp: 1501274345 +datestamp: 1525044488 diff --git a/web/modules/better_exposed_filters/tests/bef_test/bef_test.install b/web/modules/better_exposed_filters/tests/bef_test/bef_test.install index e4b21ff30a..e43bc07da7 100644 --- a/web/modules/better_exposed_filters/tests/bef_test/bef_test.install +++ b/web/modules/better_exposed_filters/tests/bef_test/bef_test.install @@ -69,7 +69,7 @@ function bef_test_install() { * TID of the newly created term. */ function _bef_test_add_term($name, $parent = 0) { - $term = \Drupal::entityManager()->getStorage('taxonomy_term')->create([ + $term = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->create([ 'vid' => 'bef_test_location', 'name' => $name, 'parent' => [$parent], diff --git a/web/modules/better_exposed_filters/tests/src/Unit/BetterExposedFiltersTest.php b/web/modules/better_exposed_filters/tests/src/Unit/BetterExposedFiltersTest.php index 244ce73386..cade986a7b 100644 --- a/web/modules/better_exposed_filters/tests/src/Unit/BetterExposedFiltersTest.php +++ b/web/modules/better_exposed_filters/tests/src/Unit/BetterExposedFiltersTest.php @@ -1,10 +1,5 @@ <?php -/** - * @file - * Contains \Drupal\better_exposed_filters\Tests\BetterExposedFiltersTest. - */ - namespace Drupal\better_exposed_filters\Tests; use Drupal\better_exposed_filters\Plugin\views\exposed_form\BetterExposedFilters; -- GitLab