From 45890184107e045de21510888f3ba90f02733c23 Mon Sep 17 00:00:00 2001
From: Brian Canini <canini.16@osu.edu>
Date: Wed, 7 Jul 2021 12:23:14 -0400
Subject: [PATCH] Upgrading drupal/better_exposed_filters (5.0.0-beta1 =>
 5.0.0-beta2)

---
 composer.json                                 |  2 +-
 composer.lock                                 | 22 +++----
 vendor/composer/InstalledVersions.php         | 10 +--
 vendor/composer/installed.json                | 22 +++----
 vendor/composer/installed.php                 | 10 +--
 web/modules/better_exposed_filters/README.txt | 36 +++++++---
 .../better_exposed_filters.info.yml           |  6 +-
 .../better_exposed_filters.install            | 66 ++++++++++++++++++-
 .../better_exposed_filters.module             |  8 ++-
 .../better_exposed_filters/composer.json      |  6 +-
 ...er_exposed_filters.exposed_form.schema.yml |  6 ++
 .../better_exposed_filters.filter.schema.yml  |  3 +
 .../includes/better_exposed_filters.theme.inc | 19 +++---
 .../better_exposed_filters/js/auto_submit.js  |  2 +-
 .../better_exposed_filters/js/bef_sliders.js  |  2 +-
 .../src/BetterExposedFiltersHelper.php        |  3 +
 .../filter/DatePickers.php                    | 14 +++-
 .../filter/DefaultWidget.php                  |  2 -
 .../filter/FilterWidgetBase.php               | 24 ++++---
 .../better_exposed_filters/filter/Hidden.php  | 13 ++++
 .../better_exposed_filters/filter/Sliders.php |  9 ++-
 .../exposed_form/BetterExposedFilters.php     | 21 +++---
 .../templates/bef-checkboxes.html.twig        |  1 +
 .../templates/bef-links.html.twig             |  8 ++-
 .../tests/modules/bef_test/bef_test.info.yml  |  6 +-
 .../Kernel/BetterExposedFiltersKernelTest.php |  1 -
 .../Plugin/filter/FilterWidgetKernelTest.php  | 10 ++-
 27 files changed, 243 insertions(+), 89 deletions(-)

diff --git a/composer.json b/composer.json
index e1a200c8aa..f0b2f7e95d 100644
--- a/composer.json
+++ b/composer.json
@@ -91,7 +91,7 @@
         "drupal/administerusersbyrole": "3.0",
         "drupal/allowed_formats": "1.3",
         "drupal/anchor_link": "1.7",
-        "drupal/better_exposed_filters": "5.0-beta1",
+        "drupal/better_exposed_filters": "5.0-beta2",
         "drupal/block_field": "1.0.0-rc1",
         "drupal/block_permissions": "1.2",
         "drupal/block_region_permissions": "1.4",
diff --git a/composer.lock b/composer.lock
index a48debceca..6dd2e6af66 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
         "This file is @generated automatically"
     ],
-    "content-hash": "4769f121a35bbe822b91a30abb372c25",
+    "content-hash": "f2a6ef914a574f2e3ed55407faceac1c",
     "packages": [
         {
             "name": "alchemy/zippy",
@@ -1936,17 +1936,17 @@
         },
         {
             "name": "drupal/better_exposed_filters",
-            "version": "5.0.0-beta1",
+            "version": "5.0.0-beta2",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/better_exposed_filters.git",
-                "reference": "8.x-5.0-beta1"
+                "reference": "8.x-5.0-beta2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-5.0-beta1.zip",
-                "reference": "8.x-5.0-beta1",
-                "shasum": "bc5ce873fa699ee584fdeb2fd28ad6c5cb456b03"
+                "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-5.0-beta2.zip",
+                "reference": "8.x-5.0-beta2",
+                "shasum": "3899191ee3fa383abe0162cc6701ddba86bae252"
             },
             "require": {
                 "drupal/core": "^8.8 || ^9",
@@ -1958,8 +1958,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-5.0-beta1",
-                    "datestamp": "1624553088",
+                    "version": "8.x-5.0-beta2",
+                    "datestamp": "1624554686",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "Beta releases are not covered by Drupal security advisories."
@@ -1968,7 +1968,7 @@
             },
             "notification-url": "https://packages.drupal.org/8/downloads",
             "license": [
-                "GPL-2.0+"
+                "GPL-2.0-or-later"
             ],
             "authors": [
                 {
@@ -1980,8 +1980,8 @@
                     "homepage": "https://www.drupal.org/u/etroid"
                 },
                 {
-                    "name": "chr.fritsch",
-                    "homepage": "https://www.drupal.org/user/2103716"
+                    "name": "Neslee Canil Pinto",
+                    "homepage": "https://www.drupal.org/u/neslee-canil-pinto"
                 },
                 {
                     "name": "jkopel",
diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php
index a2e9ffe52b..0534046ac7 100644
--- a/vendor/composer/InstalledVersions.php
+++ b/vendor/composer/InstalledVersions.php
@@ -30,7 +30,7 @@ class InstalledVersions
     'aliases' => 
     array (
     ),
-    'reference' => 'ccf8add7cba58c07d804fe59bdd5aed97698ea68',
+    'reference' => 'a89ed315c5f4d36ea9513b4dfeef27d25a4975ea',
     'name' => 'osu-asc-webservices/d8-upstream',
   ),
   'versions' => 
@@ -383,12 +383,12 @@ class InstalledVersions
     ),
     'drupal/better_exposed_filters' => 
     array (
-      'pretty_version' => '5.0.0-beta1',
-      'version' => '5.0.0.0-beta1',
+      'pretty_version' => '5.0.0-beta2',
+      'version' => '5.0.0.0-beta2',
       'aliases' => 
       array (
       ),
-      'reference' => '8.x-5.0-beta1',
+      'reference' => '8.x-5.0-beta2',
     ),
     'drupal/big_pipe' => 
     array (
@@ -2226,7 +2226,7 @@ class InstalledVersions
       'aliases' => 
       array (
       ),
-      'reference' => 'ccf8add7cba58c07d804fe59bdd5aed97698ea68',
+      'reference' => 'a89ed315c5f4d36ea9513b4dfeef27d25a4975ea',
     ),
     'pantheon-systems/quicksilver-pushback' => 
     array (
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 562fed260f..9855477e4a 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1988,18 +1988,18 @@
         },
         {
             "name": "drupal/better_exposed_filters",
-            "version": "5.0.0-beta1",
-            "version_normalized": "5.0.0.0-beta1",
+            "version": "5.0.0-beta2",
+            "version_normalized": "5.0.0.0-beta2",
             "source": {
                 "type": "git",
                 "url": "https://git.drupalcode.org/project/better_exposed_filters.git",
-                "reference": "8.x-5.0-beta1"
+                "reference": "8.x-5.0-beta2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-5.0-beta1.zip",
-                "reference": "8.x-5.0-beta1",
-                "shasum": "bc5ce873fa699ee584fdeb2fd28ad6c5cb456b03"
+                "url": "https://ftp.drupal.org/files/projects/better_exposed_filters-8.x-5.0-beta2.zip",
+                "reference": "8.x-5.0-beta2",
+                "shasum": "3899191ee3fa383abe0162cc6701ddba86bae252"
             },
             "require": {
                 "drupal/core": "^8.8 || ^9",
@@ -2011,8 +2011,8 @@
             "type": "drupal-module",
             "extra": {
                 "drupal": {
-                    "version": "8.x-5.0-beta1",
-                    "datestamp": "1594141892",
+                    "version": "8.x-5.0-beta2",
+                    "datestamp": "1624554686",
                     "security-coverage": {
                         "status": "not-covered",
                         "message": "Beta releases are not covered by Drupal security advisories."
@@ -2022,7 +2022,7 @@
             "installation-source": "dist",
             "notification-url": "https://packages.drupal.org/8/downloads",
             "license": [
-                "GPL-2.0+"
+                "GPL-2.0-or-later"
             ],
             "authors": [
                 {
@@ -2034,8 +2034,8 @@
                     "homepage": "https://www.drupal.org/u/etroid"
                 },
                 {
-                    "name": "chr.fritsch",
-                    "homepage": "https://www.drupal.org/user/2103716"
+                    "name": "Neslee Canil Pinto",
+                    "homepage": "https://www.drupal.org/u/neslee-canil-pinto"
                 },
                 {
                     "name": "jkopel",
diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php
index f75868ed00..f6678a4ac3 100644
--- a/vendor/composer/installed.php
+++ b/vendor/composer/installed.php
@@ -6,7 +6,7 @@
     'aliases' => 
     array (
     ),
-    'reference' => 'ccf8add7cba58c07d804fe59bdd5aed97698ea68',
+    'reference' => 'a89ed315c5f4d36ea9513b4dfeef27d25a4975ea',
     'name' => 'osu-asc-webservices/d8-upstream',
   ),
   'versions' => 
@@ -359,12 +359,12 @@
     ),
     'drupal/better_exposed_filters' => 
     array (
-      'pretty_version' => '5.0.0-beta1',
-      'version' => '5.0.0.0-beta1',
+      'pretty_version' => '5.0.0-beta2',
+      'version' => '5.0.0.0-beta2',
       'aliases' => 
       array (
       ),
-      'reference' => '8.x-5.0-beta1',
+      'reference' => '8.x-5.0-beta2',
     ),
     'drupal/big_pipe' => 
     array (
@@ -2202,7 +2202,7 @@
       'aliases' => 
       array (
       ),
-      'reference' => 'ccf8add7cba58c07d804fe59bdd5aed97698ea68',
+      'reference' => 'a89ed315c5f4d36ea9513b4dfeef27d25a4975ea',
     ),
     'pantheon-systems/quicksilver-pushback' => 
     array (
diff --git a/web/modules/better_exposed_filters/README.txt b/web/modules/better_exposed_filters/README.txt
index 88d7e13979..4a7cee4b07 100644
--- a/web/modules/better_exposed_filters/README.txt
+++ b/web/modules/better_exposed_filters/README.txt
@@ -1,5 +1,15 @@
--- SUMMARY --
+CONTENTS OF THIS FILE
+---------------------
 
+ * Introduction
+ * Requirements
+ * Installation
+ * Configuration
+ * Maintainers
+
+
+INTRODUCTION
+------------
 The Better Exposed Filters module replaces the Views' default single-  or
 multi-select boxes with more advanced options such as radio buttons, checkboxes,
 toggle links or jQueryUI widgets.
@@ -19,16 +29,26 @@ Documentation:
 To submit bug reports and feature suggestions, or to track changes:
   https://drupal.org/project/issues/better_exposed_filters
 
--- INSTALLATION --
 
-Install as usual, see http://drupal.org/node/70151 for further instructions.
+REQUIREMENTS
+------------
+This module requires jquery_ui, jquery_ui_slider, jquery_ui_touch_punch,
+jquery_ui_datepicker and drupal core views.
+
+
+INSTALLATION
+------------
+Install as you would normally install a contributed Drupal module.
+Visit https://www.drupal.org/node/1897420 for further information.
 
--- CONFIGURATION --
 
+CONFIGURATION
+-------------
 See the documentation on Drupal.org.
 
--- CONTACT --
 
-The maintainer for this project is Mike Keran (https://www.drupal.org/u/mikeker)
-He can be contacted through his personal web site (http://MikeKeran.com) for
-work on this module or other custom projects.
+MAINTAINERS
+-----------
+ * Mike Keran - https://www.drupal.org/u/mikeker
+ * Martin Keereman - https://www.drupal.org/u/etroid
+ * Neslee Canil Pinto - https://www.drupal.org/u/neslee-canil-pinto
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 f3cb90cb9a..d18294a3e8 100644
--- a/web/modules/better_exposed_filters/better_exposed_filters.info.yml
+++ b/web/modules/better_exposed_filters/better_exposed_filters.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - jquery_ui_touch_punch:jquery_ui_touch_punch
   - jquery_ui_datepicker:jquery_ui_datepicker
 
-# Information added by Drupal.org packaging script on 2020-07-07
-version: '8.x-5.0-beta1'
+# Information added by Drupal.org packaging script on 2021-06-24
+version: '8.x-5.0-beta2'
 project: 'better_exposed_filters'
-datestamp: 1594141894
+datestamp: 1624554649
diff --git a/web/modules/better_exposed_filters/better_exposed_filters.install b/web/modules/better_exposed_filters/better_exposed_filters.install
index b3fa54ad90..4dede0b9c2 100644
--- a/web/modules/better_exposed_filters/better_exposed_filters.install
+++ b/web/modules/better_exposed_filters/better_exposed_filters.install
@@ -91,7 +91,12 @@ function better_exposed_filters_update_8001() {
               }
 
               // Sliders.
-              if ($option['bef_format'] === 'bef_sliders') {
+              if ($option['bef_format'] === 'bef_slider') {
+                // Update plugin name to 'bef_sliders'.
+                $bef_settings['filter'][$field_name] = [
+                  'plugin_id' => 'bef_sliders',
+                ];
+
                 // Animate option is now split into two separate options.
                 $animate = $option['slider_options']['bef_slider_animate'];
                 $animate_ms = 0;
@@ -136,3 +141,62 @@ function better_exposed_filters_update_8001() {
     $config->save(TRUE);
   }
 }
+
+/**
+ * Renames bef_slider plugin to bef_sliders to be compatible with 8.x-4.x.
+ */
+function better_exposed_filters_update_8002() {
+  $config_factory = \Drupal::configFactory();
+  foreach ($config_factory->listAll('views.view.') as $config_name) {
+    $config = $config_factory->getEditable($config_name);
+
+    // Go through each display on each view.
+    $displays = $config->get('display');
+    foreach ($displays as $display_name => $display) {
+      if (!empty($display['display_options']['exposed_form'])) {
+        $exposed_form = $display['display_options']['exposed_form'];
+        // Find BEF exposed forms.
+        if (isset($exposed_form['type']) && $exposed_form['type'] === 'bef') {
+          $bef_settings = [];
+          foreach ($exposed_form['options']['bef'] as $type => $option) {
+            if ($type === 'filter') {
+              $field_name = $type;
+              // Sliders.
+              if ($option['bef_format'] === 'bef_slider') {
+                // Update plugin name to 'bef_sliders'.
+                $bef_settings['filter'][$field_name] = [
+                  'plugin_id' => 'bef_sliders',
+                ];
+
+                // Animate option is now split into two separate options.
+                $animate = $option['slider_options']['bef_slider_animate'];
+                $animate_ms = 0;
+                if (empty($animate)) {
+                  $animate = 'none';
+                }
+                elseif (is_int($animate)) {
+                  $animate = 'custom';
+                  $animate_ms = $animate;
+                }
+
+                $bef_settings['filter'][$field_name] = array_merge($bef_settings['filter'][$field_name], [
+                  'min' => $option['slider_options']['bef_slider_min'] ?? 0,
+                  'max' => $option['slider_options']['bef_slider_max'] ?? 99999,
+                  'step' => $option['slider_options']['bef_slider_step'] ?? 1,
+                  'animate' => $animate,
+                  'animate_ms' => $animate_ms,
+                  'orientation' => $option['slider_options']['bef_slider_orientation'] ?? 'horizontal',
+                ]);
+              }
+            }
+          }
+
+          // Update BEF settings.
+          $config->set("display.$display_name.display_options.exposed_form.options.bef", $bef_settings);
+        }
+      }
+    }
+
+    $config->save(TRUE);
+  }
+}
diff --git a/web/modules/better_exposed_filters/better_exposed_filters.module b/web/modules/better_exposed_filters/better_exposed_filters.module
index 7980f0fefe..5b1f6e62fd 100644
--- a/web/modules/better_exposed_filters/better_exposed_filters.module
+++ b/web/modules/better_exposed_filters/better_exposed_filters.module
@@ -25,7 +25,13 @@ function better_exposed_filters_help($route_name, RouteMatchInterface $route_mat
       $output .= '<p>' . t('Better Exposed Filters (BEF) modifies the use of Views by replacing the \'single\'  or \'multi\' <em>select boxes</em> with <em>radio buttons or checkboxes</em>. Views offers the ability to expose filters to the end user. When you expose a filter, you allow the user to interact with the view making it easy to build an advanced search.  Better Exposed Filters gives you greater control over the rendering of exposed filters. For more information, see the <a href=":online">online documentation for the Better Exposed Filters module</a>.', [':online' => 'https://www.drupal.org/node/766974']) . '</p>';
       $output .= '<h3>' . t('Uses') . '</h3>';
       $output .= '<dt>' . t('Editing or Creating Views') . '</dt>';
-      $output .= '<dd>' . t('Better Exposed Filters is used on <a href=":views">Views</a> that use an exposed filter.  Views filters are used to reduce the result set of a View to a manageable amount of data. BEF only operates on fields that have a limited number of options such as <a href=":node">Node</a>:Type or <a href=":taxonomy">Taxonomy</a>:TermID.', [':views' => Url::fromRoute('help.page', ['name' => 'views'])->toString(), ':node' => Url::fromRoute('help.page', ['name' => 'node'])->toString(), ':taxonomy' => (\Drupal::moduleHandler()->moduleExists('taxonomy')) ? Url::fromRoute('help.page', ['name' => 'taxonomy'])->toString() : '#']) . '</dd>';
+      $output .= '<dd>' . t('Better Exposed Filters is used on <a href=":views">Views</a> that use an exposed filter.  Views filters are used to reduce the result set of a View to a manageable amount of data. BEF only operates on fields that have a limited number of options such as <a href=":node">Node</a>:Type or <a href=":taxonomy">Taxonomy</a>:TermID.',
+          [
+            ':views' => Url::fromRoute('help.page',
+              ['name' => 'views'])->toString(), ':node' => Url::fromRoute('help.page',
+            ['name' => 'node'])->toString(), ':taxonomy' => (\Drupal::moduleHandler()->moduleExists('taxonomy')) ? Url::fromRoute('help.page',
+            ['name' => 'taxonomy'])->toString() : '#',
+          ]) . '</dd>';
       $output .= '<dt>' . t('Styling Better Exposed Filters') . '</dt>';
       $output .= '<dd>' . t('BEF provides some additional HTML structure to help you style your exposed filters. For some common examples see the <a href=":doco">online documentation</a>.', [':doco' => 'https://www.drupal.org/node/766974']) . '</dd>';
       return $output;
diff --git a/web/modules/better_exposed_filters/composer.json b/web/modules/better_exposed_filters/composer.json
index e568c7e3ef..ecb7f75960 100644
--- a/web/modules/better_exposed_filters/composer.json
+++ b/web/modules/better_exposed_filters/composer.json
@@ -11,13 +11,17 @@
     {
       "name": "Martin Keereman",
       "homepage": "https://www.drupal.org/u/etroid"
+    },
+    {
+      "name": "Neslee Canil Pinto",
+      "homepage": "https://www.drupal.org/u/neslee-canil-pinto"
     }
   ],
   "support": {
     "issues": "https://www.drupal.org/project/issues/better_exposed_filters",
     "source": "https://git.drupalcode.org/project/better_exposed_filters"
   },
-  "license": "GPL-2.0+",
+  "license": "GPL-2.0-or-later",
   "repositories": [
     {
       "type": "composer",
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 2b24fdabb0..55bcead7de 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
@@ -63,3 +63,9 @@ better_exposed_filters.general:
     secondary_open:
       type: boolean
       label: 'Secondary options is open'
+    text_input_required:
+      type: text
+      label: 'Text shown if a filter option has not been selected'
+    text_input_required_format:
+      type: text
+      label: 'Text format for the text_input_required field'
diff --git a/web/modules/better_exposed_filters/config/schema/better_exposed_filters.filter.schema.yml b/web/modules/better_exposed_filters/config/schema/better_exposed_filters.filter.schema.yml
index dca60c0254..6561984059 100644
--- a/web/modules/better_exposed_filters/config/schema/better_exposed_filters.filter.schema.yml
+++ b/web/modules/better_exposed_filters/config/schema/better_exposed_filters.filter.schema.yml
@@ -49,6 +49,9 @@ better_exposed_filters.filter.bef:
     select_all_none_nested:
       type: boolean
       label: 'Add select all/none links to hierarchical lists'
+    display_inline:
+      type: boolean
+      label: 'Display checkbox/radio options inline'
 
 better_exposed_filters.filter.bef_links:
   label: 'Links'
diff --git a/web/modules/better_exposed_filters/includes/better_exposed_filters.theme.inc b/web/modules/better_exposed_filters/includes/better_exposed_filters.theme.inc
index aaa1e096be..8a8dffadd6 100644
--- a/web/modules/better_exposed_filters/includes/better_exposed_filters.theme.inc
+++ b/web/modules/better_exposed_filters/includes/better_exposed_filters.theme.inc
@@ -75,7 +75,7 @@ function better_exposed_filters_preprocess_views_exposed_form(array &$variables)
 
 /******************************************************************************
  * Preprocess functions for BEF themed elements.
- ******************************************************************************/
+ */
 
 /**
  * Prepares variables for bef-checkboxes template.
@@ -159,15 +159,15 @@ function template_preprocess_bef_hidden(array &$variables) {
     ];
   }
 
-  // @todo:
+  // @todo
   // Check for optgroups.  Put subelements in the $element_set array and add a
   // group heading. Otherwise, just add the element to the set.
   // $element_set = array();
   // if (is_array($elem)) {
-  //  $element_set = $elem;
+  // $element_set = $elem;
   // }
   // else {
-  //  $element_set[$option] = $elem;
+  // $element_set[$option] = $elem;
   // }
 }
 
@@ -215,7 +215,7 @@ function template_preprocess_bef_links(array &$variables) {
     // with the entire options array and remove items from it as needed.
     $urlOptions = $url->getOptions();
 
-    if ($element['#multiple']) {
+    if (isset($element['#multiple']) && $element['#multiple']) {
       $newQuery = isset($existing_query[$name]) ? $existing_query[$name] : [];
       if (in_array($optionValue, $selectedValues)) {
         // Allow users to toggle an option using the same link.
@@ -234,7 +234,7 @@ function template_preprocess_bef_links(array &$variables) {
       }
     }
     else {
-      if ($optionValue == $element['#value']) {
+      if (strval($optionValue) === $element['#value']) {
         // Allow toggle link functionality -- click the same link to turn an
         // option on or off.
         $newQuery = $existing_query;
@@ -270,7 +270,10 @@ function template_preprocess_bef_links(array &$variables) {
       '#url' => $url,
     ];
 
-    if (in_array($optionValue, $selectedValues)) {
+    /*
+     * @see https://stackoverflow.com/questions/13846769/php-in-array-0-value
+     */
+    if (in_array(strval($optionValue), $selectedValues)) {
       $variables['links'][$optionValue]['#attributes']['class'][] = 'bef-link--selected';
     }
   }
@@ -286,7 +289,7 @@ function template_preprocess_bef_links(array &$variables) {
 
 /******************************************************************************
  * Utility functions for BEF themed elements.
- ******************************************************************************/
+ */
 
 /**
  * Internal function to handled nested form elements.
diff --git a/web/modules/better_exposed_filters/js/auto_submit.js b/web/modules/better_exposed_filters/js/auto_submit.js
index f4cf09f3ca..431e3780c8 100644
--- a/web/modules/better_exposed_filters/js/auto_submit.js
+++ b/web/modules/better_exposed_filters/js/auto_submit.js
@@ -100,7 +100,7 @@
         var $submit = $target.closest('form').find('[data-bef-auto-submit-click]');
 
         // Don't submit on changes to excluded elements or a submit element.
-        if ($target.is('[data-bef-auto-submit-exclude], :submit')) {
+        if ($target.is('[data-bef-auto-submit-exclude], :submit') || $target.attr('autocomplete') == 'off') {
           return true;
         }
 
diff --git a/web/modules/better_exposed_filters/js/bef_sliders.js b/web/modules/better_exposed_filters/js/bef_sliders.js
index 33dfdec706..8f857ca641 100644
--- a/web/modules/better_exposed_filters/js/bef_sliders.js
+++ b/web/modules/better_exposed_filters/js/bef_sliders.js
@@ -99,7 +99,7 @@
               // Attach stop listeners.
               stop: function (event, ui) {
                 // Click the auto submit button.
-                $(this).parents('form').find('.ctools-auto-submit-click').click();
+                $(this).parents('form').find('[data-bef-auto-submit-click]').click();
               }
             });
 
diff --git a/web/modules/better_exposed_filters/src/BetterExposedFiltersHelper.php b/web/modules/better_exposed_filters/src/BetterExposedFiltersHelper.php
index 048a5c6560..178e88b13d 100644
--- a/web/modules/better_exposed_filters/src/BetterExposedFiltersHelper.php
+++ b/web/modules/better_exposed_filters/src/BetterExposedFiltersHelper.php
@@ -79,6 +79,9 @@ public static function rewriteOptions(array $options, $rewrite_settings, $reorde
         $key = key($choice->option);
         $value = &$choice->option[$key];
       }
+      elseif (is_array($choice) && array_key_exists('name', $choice)) {
+        $value = &$choice['name'];
+      }
       else {
         $choice = (string) $choice;
         $value = &$choice;
diff --git a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DatePickers.php b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DatePickers.php
index 7633a73f26..ccd8f41f65 100644
--- a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DatePickers.php
+++ b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DatePickers.php
@@ -52,16 +52,23 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
       && 'date_text' == $form[$field_id]['min']['#type']
       && 'date_text' == $form[$field_id]['max']['#type'];
 
+    // @todo lots of repetition of code. Let's re-organize and clean up.
     if ($is_single_date || $is_double_date) {
       if (isset($form[$field_id]['value'])) {
         $format = $form[$field_id]['value']['#date_format'];
         $form[$field_id]['value']['#attributes']['class'][] = 'bef-datepicker';
+        $form[$field_id]['value']['#attributes']['type'] = 'date';
+        $form[$field_id]['value']['#attributes']['autocomplete'] = 'off';
       }
       else {
         // Both min and max share the same format.
         $format = $form[$field_id]['min']['#date_format'];
         $form[$field_id]['min']['#attributes']['class'][] = 'bef-datepicker';
         $form[$field_id]['max']['#attributes']['class'][] = 'bef-datepicker';
+        $form[$field_id]['min']['#attributes']['type'] = 'date';
+        $form[$field_id]['max']['#attributes']['type'] = 'date';
+        $form[$field_id]['min']['#attributes']['autocomplete'] = 'off';
+        $form[$field_id]['max']['#attributes']['autocomplete'] = 'off';
       }
 
       // Convert Date API format to jQuery UI date format.
@@ -77,14 +84,19 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
        */
       $fields = ['min', 'max', 'value'];
       if (count(array_intersect($fields, array_keys($form[$field_id])))) {
+        $form[$field_id]['#type'] = 'container';
         foreach ($fields as $field) {
           if (isset($form[$field_id][$field])) {
             $form[$field_id][$field]['#attributes']['class'][] = 'bef-datepicker';
+            $form[$field_id][$field]['#attributes']['type'] = 'date';
+            $form[$field_id][$field]['#attributes']['autocomplete'] = 'off';
           }
         }
       }
       else {
         $form[$field_id]['#attributes']['class'][] = 'bef-datepicker';
+        $form[$field_id]['#attributes']['type'] = 'date';
+        $form[$field_id]['#attributes']['autocomplete'] = 'off';
       }
     }
   }
@@ -92,7 +104,7 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
   /**
    * Convert Date API formatting to jQuery formatDate formatting.
    *
-   * @TODO: To be honest, I'm not sure this is needed.  Can you set a
+   * @todo To be honest, I'm not sure this is needed.  Can you set a
    * Date API field to accept anything other than Y-m-d? Well, better
    * safe than sorry...
    *
diff --git a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DefaultWidget.php b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DefaultWidget.php
index 2a5ec2a7b3..7c23f7c186 100644
--- a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DefaultWidget.php
+++ b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/DefaultWidget.php
@@ -2,8 +2,6 @@
 
 namespace Drupal\better_exposed_filters\Plugin\better_exposed_filters\filter;
 
-use Drupal\Core\Form\FormStateInterface;
-
 /**
  * Default widget implementation.
  *
diff --git a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/FilterWidgetBase.php b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/FilterWidgetBase.php
index 460532e5e8..6f21a9a0b2 100644
--- a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/FilterWidgetBase.php
+++ b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/FilterWidgetBase.php
@@ -31,7 +31,7 @@ public static function isApplicable($filter = NULL, array $filter_options = [])
     }
 
     // Check various filter types and determine what options are available.
-    if (is_a($filter, 'Drupal\views\Plugin\views\filter\String') || is_a($filter, 'Drupal\views\Plugin\views\filter\InOperator')) {
+    if (is_a($filter, 'Drupal\views\Plugin\views\filter\StringFilter') || is_a($filter, 'Drupal\views\Plugin\views\filter\InOperator')) {
       if (in_array($filter->operator, ['in', 'or', 'and', 'not'])) {
         $is_applicable = TRUE;
       }
@@ -57,6 +57,10 @@ public static function isApplicable($filter = NULL, array $filter_options = [])
       $is_applicable = TRUE;
     }
 
+    if (is_a($filter, 'Drupal\search_api\Plugin\views\filter\SearchApiFulltext')) {
+      $is_applicable = TRUE;
+    }
+
     return $is_applicable;
   }
 
@@ -109,14 +113,14 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
         '#type' => 'textfield',
         '#title' => $this->t('Placeholder text'),
         '#description' => $this->t('Text to be shown in the text field until it is edited. Leave blank for no placeholder to be set.'),
-        '#default_value' => $this->configuration['advanced']['placeholder_text'],
+        '#default_value' => $this->t($this->configuration['advanced']['placeholder_text']),
       ];
     }
 
     // Allow rewriting of filter options for any filter. String and numeric
     // filters allow unlimited filter options via textfields, so we can't
     // offer rewriting for those.
-    // @TODO: check other core filter types
+    // @todo check other core filter types
     if ((!$filter instanceof StringFilter && !$filter instanceof NumericFilter) || $filter->isAGroup()) {
       $form['advanced']['rewrite']['filter_rewrite_values'] = [
         '#type' => 'textarea',
@@ -177,15 +181,17 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
 
     // Check for placeholder text.
     if (!empty($this->configuration['advanced']['placeholder_text'])) {
-      // @todo: Add token replacement for placeholder text.
-      $form[$field_id]['#placeholder'] = $this->configuration['advanced']['placeholder_text'];
+      // @todo Add token replacement for placeholder text.
+      $form[$field_id]['#placeholder'] = $this->t($this->configuration['advanced']['placeholder_text']);
     }
 
     // Handle filter value rewrites.
     if ($this->configuration['advanced']['rewrite']['filter_rewrite_values']) {
-      $form[$field_id]['#options'] = BetterExposedFiltersHelper::rewriteOptions($form[$field_id]['#options'], $this->configuration['advanced']['rewrite']['filter_rewrite_values']);
+      // Reorder options based on rewrite values, if sort options is disabled.
+      $form[$field_id]['#options'] = BetterExposedFiltersHelper::rewriteOptions($form[$field_id]['#options'], $this->configuration['advanced']['rewrite']['filter_rewrite_values'], !$this->configuration['advanced']['sort_options']);
       // @todo what is $selected?
-      // if (isset($selected) && !isset($form[$field_id]['#options'][$selected])) {
+      // if (isset($selected) &&
+      // !isset($form[$field_id]['#options'][$selected])) {
       // Avoid "Illegal choice" errors.
       // $form[$field_id]['#default_value'] = NULL;
       // }
@@ -208,11 +214,12 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
       $form[$field_id . '_collapsible'] = [
         '#type' => 'details',
         '#title' => $exposed_label,
+        '#description' => $exposed_description,
       ];
 
       if ($is_secondary) {
         // Move secondary elements.
-        $form[$field_id . '_collapsible']['#group'] = 'secondary';
+        $this->addElementToGroup($form, $form_state, $field_id . '_collapsible', 'secondary');
       }
     }
 
@@ -323,6 +330,7 @@ protected function getExposedFilterWidgetType() {
     $form_state->set('exposed', TRUE);
     /** @var \Drupal\views\Plugin\views\filter\FilterPluginBase $filter */
     $filter = $this->handler;
+    $filter->buildExposedForm($form, $form_state);
     $filter_id = $filter->options['expose']['identifier'];
 
     return $form[$filter_id]['#type'] ?? $form[$filter_id]['value']['#type'] ?? '';
diff --git a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Hidden.php b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Hidden.php
index 892c933fc3..df55b998e2 100644
--- a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Hidden.php
+++ b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Hidden.php
@@ -37,4 +37,17 @@ public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public static function isApplicable($filter = NULL, array $filter_options = []) {
+    $is_applicable = parent::isApplicable($filter, $filter_options);
+
+    if ((is_a($filter, 'Drupal\views\Plugin\views\filter\Date') || !empty($filter->date_handler)) && !$filter->isAGroup()) {
+      $is_applicable = TRUE;
+    }
+
+    return $is_applicable;
+  }
+
 }
diff --git a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Sliders.php b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Sliders.php
index fbf0455c9b..a6935c3aef 100644
--- a/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Sliders.php
+++ b/web/modules/better_exposed_filters/src/Plugin/better_exposed_filters/filter/Sliders.php
@@ -68,14 +68,19 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
 
     $form = parent::buildConfigurationForm($form, $form_state);
 
-    $form['min'] = [
+    $form['wrapper'] = [
+      '#type' => 'container',
+      '#attributes' => ['class' => ['']],
+    ];
+
+    $form['wrapper']['min'] = [
       '#type' => 'number',
       '#title' => $this->t('Range minimum'),
       '#default_value' => $this->configuration['min'],
       '#description' => $this->t('The minimum allowed value for the jQuery range slider. It can be positive, negative, or zero and have up to 11 decimal places.'),
     ];
 
-    $form['max'] = [
+    $form['wrapper']['max'] = [
       '#type' => 'number',
       '#title' => $this->t('Range maximum'),
       '#default_value' => $this->configuration['max'],
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 710e43a8f9..bde76e1d53 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
@@ -120,7 +120,7 @@ protected function defineOptions() {
     // Initialize options if any sort is exposed.
     // Iterate over each sort and determine if any sorts are exposed.
     $is_sort_exposed = FALSE;
-    /* @var \Drupal\views\Plugin\views\HandlerBase $sort */
+    /** @var \Drupal\views\Plugin\views\HandlerBase $sort */
     foreach ($this->view->display_handler->getHandlers('sort') as $sort) {
       if ($sort->isExposed()) {
         $is_sort_exposed = TRUE;
@@ -138,7 +138,7 @@ protected function defineOptions() {
     }
 
     // Go through each exposed filter and set default format.
-    /* @var \Drupal\views\Plugin\views\HandlerBase $filter */
+    /** @var \Drupal\views\Plugin\views\HandlerBase $filter */
     foreach ($this->view->display_handler->getHandlers('filter') as $filter_id => $filter) {
       if (!$filter->isExposed()) {
         continue;
@@ -323,7 +323,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
 
     // Iterate over each sort and determine if any sorts are exposed.
     $is_sort_exposed = FALSE;
-    /* @var \Drupal\views\Plugin\views\HandlerBase $sort */
+    /** @var \Drupal\views\Plugin\views\HandlerBase $sort */
     foreach ($this->view->display_handler->getHandlers('sort') as $sort) {
       if ($sort->isExposed()) {
         $is_sort_exposed = TRUE;
@@ -465,7 +465,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
     ];
 
     // Iterate over each filter and add BEF filter options.
-    /* @var \Drupal\views\Plugin\views\HandlerBase $filter */
+    /** @var \Drupal\views\Plugin\views\HandlerBase $filter */
     foreach ($this->view->display_handler->getHandlers('filter') as $filter_id => $filter) {
       if (!$filter->isExposed()) {
         continue;
@@ -479,7 +479,7 @@ public function buildOptionsForm(&$form, FormStateInterface $form_state) {
       }
 
       // Alter the list of available widgets for this filter.
-     $this->moduleHandler->alter('better_exposed_filters_display_options', $options, $filter);
+      $this->moduleHandler->alter('better_exposed_filters_display_options', $options, $filter);
 
       // Get a descriptive label for the filter.
       $label = $this->t('Exposed filter @filter', [
@@ -575,7 +575,7 @@ public function validateOptionsForm(&$form, FormStateInterface $form_state) {
     }
 
     // Shorthand for all filter handlers in this view.
-    /* @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
+    /** @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
     $filters = $this->view->display_handler->handlers['filter'];
 
     // Iterate over all filter, sort and pager plugins.
@@ -639,7 +639,7 @@ public function submitOptionsForm(&$form, FormStateInterface $form_state) {
     $bef_options = &$options['bef'];
 
     // Shorthand for all filter handlers in this view.
-    /* @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
+    /** @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
     $filters = $this->view->display_handler->handlers['filter'];
 
     parent::submitOptionsForm($form, $form_state);
@@ -794,7 +794,7 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) {
      */
 
     // Shorthand for all filter handlers in this view.
-    /* @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
+    /** @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
     $filters = $this->view->display_handler->handlers['filter'];
 
     // Iterate over all exposed filters.
@@ -819,7 +819,10 @@ public function exposedFormAlter(&$form, FormStateInterface $form_state) {
     // If our form has no visible filters, hide the submit button.
     $has_visible_filters = !empty(Element::getVisibleChildren($form)) ?: FALSE;
     $form['actions']['submit']['#access'] = $has_visible_filters;
-    $form['actions']['reset']['#access'] = $has_visible_filters;
+    // Never enable a reset button that has already been disabled.
+    if (!isset($form['actions']['reset']['#access']) || $form['actions']['reset']['#access'] === TRUE) {
+      $form['actions']['reset']['#access'] = $has_visible_filters;
+    }
 
     // Ensure default process/pre_render callbacks are included when a BEF
     // widget has added their own.
diff --git a/web/modules/better_exposed_filters/templates/bef-checkboxes.html.twig b/web/modules/better_exposed_filters/templates/bef-checkboxes.html.twig
index db1cf0dbeb..19bbd1f714 100644
--- a/web/modules/better_exposed_filters/templates/bef-checkboxes.html.twig
+++ b/web/modules/better_exposed_filters/templates/bef-checkboxes.html.twig
@@ -12,6 +12,7 @@
 #}
 {% set classes = [
   'form-checkboxes',
+  'bef-checkboxes',
   is_nested ? 'bef-nested',
   show_select_all_none ? 'bef-select-all-none',
   show_select_all_none_nested ? 'bef-select-all-none-nested',
diff --git a/web/modules/better_exposed_filters/templates/bef-links.html.twig b/web/modules/better_exposed_filters/templates/bef-links.html.twig
index feeae01bc8..b160c032af 100644
--- a/web/modules/better_exposed_filters/templates/bef-links.html.twig
+++ b/web/modules/better_exposed_filters/templates/bef-links.html.twig
@@ -4,13 +4,15 @@
     is_nested ? 'bef-nested'
   ]
 %}
-{%
-  set is_nested = true
-%}
+{% set is_nested = true %}
 <div{{ attributes.addClass(classes) }}>
   {% set current_nesting_level = 0 %}
   {% for child in children %}
     {% set item = attribute(element, child) %}
+    {% if child in selected %}
+      {% set new_nesting_level = attribute(depth, child) %}
+      {% set item = item|merge({'#attributes': {'class': 'bef-link-active'}}) %}
+    {% endif %}
     {% set new_nesting_level = attribute(depth, child) %}
     {% include '@better_exposed_filters/bef-nested-elements.html.twig' %}
     {% set current_nesting_level = new_nesting_level %}
diff --git a/web/modules/better_exposed_filters/tests/modules/bef_test/bef_test.info.yml b/web/modules/better_exposed_filters/tests/modules/bef_test/bef_test.info.yml
index 8e2798ca12..deeea18476 100644
--- a/web/modules/better_exposed_filters/tests/modules/bef_test/bef_test.info.yml
+++ b/web/modules/better_exposed_filters/tests/modules/bef_test/bef_test.info.yml
@@ -10,7 +10,7 @@ dependencies:
   - drupal:options
   - drupal:user
 
-# Information added by Drupal.org packaging script on 2020-07-07
-version: '8.x-5.0-beta1'
+# Information added by Drupal.org packaging script on 2021-06-24
+version: '8.x-5.0-beta2'
 project: 'better_exposed_filters'
-datestamp: 1594141894
+datestamp: 1624554649
diff --git a/web/modules/better_exposed_filters/tests/src/Kernel/BetterExposedFiltersKernelTest.php b/web/modules/better_exposed_filters/tests/src/Kernel/BetterExposedFiltersKernelTest.php
index 3bae009601..b79e3b63e9 100644
--- a/web/modules/better_exposed_filters/tests/src/Kernel/BetterExposedFiltersKernelTest.php
+++ b/web/modules/better_exposed_filters/tests/src/Kernel/BetterExposedFiltersKernelTest.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\Tests\better_exposed_filters\Kernel;
 
-use Drupal\Tests\better_exposed_filters\Kernel\BetterExposedFiltersKernelTestBase;
 use Drupal\views\Views;
 
 /**
diff --git a/web/modules/better_exposed_filters/tests/src/Kernel/Plugin/filter/FilterWidgetKernelTest.php b/web/modules/better_exposed_filters/tests/src/Kernel/Plugin/filter/FilterWidgetKernelTest.php
index 0e528590a9..45f3f9a49c 100644
--- a/web/modules/better_exposed_filters/tests/src/Kernel/Plugin/filter/FilterWidgetKernelTest.php
+++ b/web/modules/better_exposed_filters/tests/src/Kernel/Plugin/filter/FilterWidgetKernelTest.php
@@ -33,8 +33,10 @@ class FilterWidgetKernelTest extends BetterExposedFiltersKernelTestBase {
   $display = &$view->storage->getDisplay('default');
 
   // Ensure our filter "field_bef_boolean_value" is grouped.
-  $display['display_options']['filters']['field_bef_boolean_value']['is_grouped'] = TRUE;
-  $display['display_options']['filters']['field_bef_boolean_value']['group_info'] = [
+  $display['display_options']['filters']['field_bef_boolean_value']
+  ['is_grouped'] = TRUE;
+  $display['display_options']['filters']['field_bef_boolean_value']
+  ['group_info'] = [
   'plugin_id' => 'boolean',
   'label' => 'bef_boolean (field_bef_boolean)',
   'description' => '',
@@ -64,7 +66,9 @@ class FilterWidgetKernelTest extends BetterExposedFiltersKernelTestBase {
 
   // Check our "FIELD_BEF_BOOLEAN" filter is rendered with id
   // "field_bef_boolean_value2".
-  $this->assertTrue(isset($output['field_bef_boolean_value2']), 'Exposed filter "FIELD_BEF_BOOLEAN" is exposed with id "field_bef_boolean_value2".');
+  $this->assertTrue(isset($output['field_bef_boolean_value2']),
+  'Exposed filter "FIELD_BEF_BOOLEAN" is exposed with id
+  "field_bef_boolean_value2".');
 
   $view->destroy();
   }*/
-- 
GitLab