Loading core/modules/views/js/base.js +7 −3 Original line number Diff line number Diff line Loading @@ -29,9 +29,13 @@ for (let i = 0; i < pairs.length; i++) { pair = pairs[i].split('='); // Ignore the 'q' path argument, if present. if (pair[0] !== 'q' && pair[1]) { if (pair[0] !== 'q') { if (pair[1]) { args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); } else { args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = ''; } } } return args; Loading core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php +108 −6 Original line number Diff line number Diff line Loading @@ -46,7 +46,11 @@ protected function setUp(): void { // Create a Content type and eleven test nodes. $this->createContentType(['type' => 'page']); for ($i = 1; $i <= 11; $i++) { $this->createNode(['title' => 'Node ' . $i . ' content', 'changed' => $i * 1000]); $fields = [ 'title' => $i > 6 ? 'Node ' . $i . ' content' : 'Node ' . $i . ' content default_value', 'changed' => $i * 1000, ]; $this->createNode($fields); } // Create a user privileged enough to view content. Loading Loading @@ -90,18 +94,18 @@ public function testBasicPagination() { /** @var \Behat\Mink\Element\NodeElement[] $rows */ $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 3'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&langcode=All&items_per_page=5&order=changed&sort=asc&page=2', $link->getAttribute('href')); $this->assertEquals('?status=All&type=All&title=&langcode=All&items_per_page=5&order=changed&sort=asc&page=2', $link->getAttribute('href')); $this->clickLink('Go to page 3'); $session_assert->assertWaitOnAjaxRequest(); Loading @@ -114,14 +118,14 @@ public function testBasicPagination() { $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); // Navigate using the 'next' link. $this->clickLink('Go to next page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); // Navigate using the 'last' link. $this->clickLink('Go to last page'); Loading @@ -135,6 +139,104 @@ public function testBasicPagination() { $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); } /** * Tests if pagination via AJAX works for the filter with default value. */ public function testDefaultFilterPagination() { // Add default value to the title filter. $view = \Drupal::configFactory()->getEditable('views.view.test_content_ajax'); $display = $view->get('display'); $display['default']['display_options']['filters']['title']['value'] = 'default_value'; $view->set('display', $display); $view->save(); // Visit the content page. $this->drupalGet('test-content-ajax'); $session_assert = $this->assertSession(); $page = $this->getSession()->getPage(); $settings = $this->getDrupalSettings(); // Make sure that the view_path is set correctly. $expected_view_path = '/test-content-ajax'; $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); // Set the number of items displayed per page to 5 using the exposed pager. $page->selectFieldOption('edit-items-per-page', 5); $page->pressButton('Filter'); $session_assert->assertWaitOnAjaxRequest(); // Change 'Updated' sorting from descending to ascending. $page->clickLink('Updated'); $session_assert->assertWaitOnAjaxRequest(); // Use the pager by clicking on the links and test if we see the expected // number of rows on each page. For easy targeting the titles of the pager // links are used. /** @var \Behat\Mink\Element\NodeElement[] $rows */ $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 1'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&title=default_value&langcode=All&items_per_page=5&order=changed&sort=asc&page=0', $link->getAttribute('href')); // Set the title filter to empty string using the exposed pager. $page->fillField('title', ''); $page->pressButton('Filter'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 11 content', $rows[0]->getHtml()); // Navigate to the second page. $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 1'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&title=&langcode=All&items_per_page=5&page=0', $link->getAttribute('href')); // Navigate back to the first page. $this->clickLink('Go to first page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 11 content', $rows[0]->getHtml()); // Navigate using the 'next' link. $this->clickLink('Go to next page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); // Navigate using the 'last' link. $this->clickLink('Go to last page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); // Make sure the AJAX calls don't change the view_path. $settings = $this->getDrupalSettings(); $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); } /** * Assert that assets are not loaded twice on a page. * Loading Loading
core/modules/views/js/base.js +7 −3 Original line number Diff line number Diff line Loading @@ -29,9 +29,13 @@ for (let i = 0; i < pairs.length; i++) { pair = pairs[i].split('='); // Ignore the 'q' path argument, if present. if (pair[0] !== 'q' && pair[1]) { if (pair[0] !== 'q') { if (pair[1]) { args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = decodeURIComponent(pair[1].replace(/\+/g, ' ')); } else { args[decodeURIComponent(pair[0].replace(/\+/g, ' '))] = ''; } } } return args; Loading
core/modules/views/tests/src/FunctionalJavascript/PaginationAJAXTest.php +108 −6 Original line number Diff line number Diff line Loading @@ -46,7 +46,11 @@ protected function setUp(): void { // Create a Content type and eleven test nodes. $this->createContentType(['type' => 'page']); for ($i = 1; $i <= 11; $i++) { $this->createNode(['title' => 'Node ' . $i . ' content', 'changed' => $i * 1000]); $fields = [ 'title' => $i > 6 ? 'Node ' . $i . ' content' : 'Node ' . $i . ' content default_value', 'changed' => $i * 1000, ]; $this->createNode($fields); } // Create a user privileged enough to view content. Loading Loading @@ -90,18 +94,18 @@ public function testBasicPagination() { /** @var \Behat\Mink\Element\NodeElement[] $rows */ $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 3'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&langcode=All&items_per_page=5&order=changed&sort=asc&page=2', $link->getAttribute('href')); $this->assertEquals('?status=All&type=All&title=&langcode=All&items_per_page=5&order=changed&sort=asc&page=2', $link->getAttribute('href')); $this->clickLink('Go to page 3'); $session_assert->assertWaitOnAjaxRequest(); Loading @@ -114,14 +118,14 @@ public function testBasicPagination() { $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); // Navigate using the 'next' link. $this->clickLink('Go to next page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content', $rows[0]->getHtml()); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); // Navigate using the 'last' link. $this->clickLink('Go to last page'); Loading @@ -135,6 +139,104 @@ public function testBasicPagination() { $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); } /** * Tests if pagination via AJAX works for the filter with default value. */ public function testDefaultFilterPagination() { // Add default value to the title filter. $view = \Drupal::configFactory()->getEditable('views.view.test_content_ajax'); $display = $view->get('display'); $display['default']['display_options']['filters']['title']['value'] = 'default_value'; $view->set('display', $display); $view->save(); // Visit the content page. $this->drupalGet('test-content-ajax'); $session_assert = $this->assertSession(); $page = $this->getSession()->getPage(); $settings = $this->getDrupalSettings(); // Make sure that the view_path is set correctly. $expected_view_path = '/test-content-ajax'; $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); // Set the number of items displayed per page to 5 using the exposed pager. $page->selectFieldOption('edit-items-per-page', 5); $page->pressButton('Filter'); $session_assert->assertWaitOnAjaxRequest(); // Change 'Updated' sorting from descending to ascending. $page->clickLink('Updated'); $session_assert->assertWaitOnAjaxRequest(); // Use the pager by clicking on the links and test if we see the expected // number of rows on each page. For easy targeting the titles of the pager // links are used. /** @var \Behat\Mink\Element\NodeElement[] $rows */ $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 1'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&title=default_value&langcode=All&items_per_page=5&order=changed&sort=asc&page=0', $link->getAttribute('href')); // Set the title filter to empty string using the exposed pager. $page->fillField('title', ''); $page->pressButton('Filter'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 11 content', $rows[0]->getHtml()); // Navigate to the second page. $this->clickLink('Go to page 2'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); $link = $page->findLink('Go to page 1'); $this->assertNoDuplicateAssetsOnPage(); // Test that no unwanted parameters are added to the URL. $this->assertEquals('?status=All&type=All&title=&langcode=All&items_per_page=5&page=0', $link->getAttribute('href')); // Navigate back to the first page. $this->clickLink('Go to first page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 11 content', $rows[0]->getHtml()); // Navigate using the 'next' link. $this->clickLink('Go to next page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(5, $rows); $this->assertStringContainsString('Node 6 content default_value', $rows[0]->getHtml()); // Navigate using the 'last' link. $this->clickLink('Go to last page'); $session_assert->assertWaitOnAjaxRequest(); $rows = $page->findAll('css', 'tbody tr'); $this->assertCount(1, $rows); $this->assertStringContainsString('Node 1 content default_value', $rows[0]->getHtml()); // Make sure the AJAX calls don't change the view_path. $settings = $this->getDrupalSettings(); $this->assertEquals($expected_view_path, current($settings['views']['ajaxViews'])['view_path']); } /** * Assert that assets are not loaded twice on a page. * Loading