From 2e8fd2c83bb4c85734acf565a4acadec4f6a2f16 Mon Sep 17 00:00:00 2001
From: Milind Kagdelwar <milind0308@gmail.com>
Date: Tue, 31 Dec 2019 13:04:59 +0530
Subject: [PATCH] Views exposed form double html ids

---
 core/modules/views/js/ajax_view.es6.js                  | 7 +------
 core/modules/views/js/ajax_view.js                      | 4 ++--
 core/modules/views/src/Form/ViewsExposedForm.php        | 5 ++++-
 core/modules/views/tests/src/Kernel/ViewElementTest.php | 2 +-
 core/modules/views/views.module                         | 2 ++
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/core/modules/views/js/ajax_view.es6.js b/core/modules/views/js/ajax_view.es6.js
index 55c85fda18..6c72470fa1 100644
--- a/core/modules/views/js/ajax_view.es6.js
+++ b/core/modules/views/js/ajax_view.es6.js
@@ -99,12 +99,7 @@
     this.settings = settings;
 
     // Add the ajax to exposed forms.
-    this.$exposed_form = $(
-      `form#views-exposed-form-${settings.view_name.replace(
-        /_/g,
-        '-',
-      )}-${settings.view_display_id.replace(/_/g, '-')}`,
-    );
+    this.$exposed_form = $('form#' + settings.view_html_id);
     this.$exposed_form
       .once('exposed-form')
       .each($.proxy(this.attachExposedFormAjax, this));
diff --git a/core/modules/views/js/ajax_view.js b/core/modules/views/js/ajax_view.js
index 95a803d7fe..531a2d9406 100644
--- a/core/modules/views/js/ajax_view.js
+++ b/core/modules/views/js/ajax_view.js
@@ -65,7 +65,7 @@
 
     this.settings = settings;
 
-    this.$exposed_form = $('form#views-exposed-form-' + settings.view_name.replace(/_/g, '-') + '-' + settings.view_display_id.replace(/_/g, '-'));
+    this.$exposed_form = $('form#' + settings.view_html_id);
     this.$exposed_form.once('exposed-form').each($.proxy(this.attachExposedFormAjax, this));
 
     this.$view.filter($.proxy(this.filterNestedViews, this)).once('ajax-pager').each($.proxy(this.attachPagerAjax, this));
@@ -126,4 +126,4 @@
       $(scrollTarget).animate({ scrollTop: offset.top - 10 }, 500);
     }
   };
-})(jQuery, Drupal, drupalSettings);
\ No newline at end of file
+})(jQuery, Drupal, drupalSettings);
diff --git a/core/modules/views/src/Form/ViewsExposedForm.php b/core/modules/views/src/Form/ViewsExposedForm.php
index 7e92378ae3..b4fd06b9ae 100644
--- a/core/modules/views/src/Form/ViewsExposedForm.php
+++ b/core/modules/views/src/Form/ViewsExposedForm.php
@@ -148,7 +148,10 @@ public function buildForm(array $form, FormStateInterface $form_state) {
 
     $form['#action'] = $form_action;
     $form['#theme'] = $view->buildThemeFunctions('views_exposed_form');
-    $form['#id'] = Html::cleanCssIdentifier('views_exposed_form-' . $view->storage->id() . '-' . $display['id']);
+    $clean_form_id = Html::cleanCssIdentifier('views_exposed_form-' . $view->storage->id() . '-' . $display['id']);
+    $form['#attributes']['class'][] = $clean_form_id;
+    // The form can be possibly rendered twice on a page, make the id unique.
+    $form['#id'] = Html::getUniqueId($clean_form_id);
 
     /** @var \Drupal\views\Plugin\views\exposed_form\ExposedFormPluginInterface $exposed_form_plugin */
     $exposed_form_plugin = $view->display_handler->getPlugin('exposed_form');
diff --git a/core/modules/views/tests/src/Kernel/ViewElementTest.php b/core/modules/views/tests/src/Kernel/ViewElementTest.php
index 921fac70b1..8c478938ff 100644
--- a/core/modules/views/tests/src/Kernel/ViewElementTest.php
+++ b/core/modules/views/tests/src/Kernel/ViewElementTest.php
@@ -126,7 +126,7 @@ public function testViewElementEmbed() {
     $this->setRawContent($renderer->renderRoot($render));
 
     // Ensure that the exposed form is rendered.
-    $this->assertEqual(1, count($this->xpath('//form[@class="views-exposed-form"]')));
+    $this->assertEqual(1, count($this->xpath('//form[@class="views-exposed-form views-exposed-form-test-view-embed-embed-2"]')));
   }
 
 }
diff --git a/core/modules/views/views.module b/core/modules/views/views.module
index 13bec4d13e..b87ef858f5 100644
--- a/core/modules/views/views.module
+++ b/core/modules/views/views.module
@@ -52,10 +52,12 @@ function views_help($route_name, RouteMatchInterface $route_match) {
 function views_views_pre_render($view) {
   // If using AJAX, send identifying data about this view.
   if ($view->ajaxEnabled() && empty($view->is_attachment) && empty($view->live_preview)) {
+    $exposed_data = $view->exposed_data;
     $view->element['#attached']['drupalSettings']['views'] = [
       'ajax_path' => Url::fromRoute('views.ajax')->toString(),
       'ajaxViews' => [
         'views_dom_id:' . $view->dom_id => [
+          'view_html_id' => $exposed_data['#id'],
           'view_name' => $view->storage->id(),
           'view_display_id' => $view->current_display,
           'view_args' => Html::escape(implode('/', $view->args)),
-- 
2.19.0

