Commit 9479e664 authored by catch's avatar catch
Browse files

Issue #2048309 by mondrake: Fixed Views UI Preview - navigation is broken.

parent 4343ef88
......@@ -156,8 +156,8 @@
return true;
}
element_settings.wrapper = 'views-live-preview';
element_settings.method = 'html';
element_settings.wrapper = 'views-preview-wrapper';
element_settings.method = 'replaceWith';
var base = $(this).attr('id');
Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
});
......@@ -179,8 +179,8 @@
return true;
}
element_settings.wrapper = 'views-live-preview';
element_settings.method = 'html';
element_settings.wrapper = 'views-preview-wrapper';
element_settings.method = 'replaceWith';
element_settings.event = 'click';
var base = $(this).attr('id');
......
......@@ -114,6 +114,39 @@ public function testPreviewWithPagersUI() {
$this->assertClass($elements[4], 'pager-last', "Element for last page has .pager-last class.");
$this->assertTrue($elements[4]->a, "Link to last page found.");
// Navigate to next page.
$elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager-next'));
$this->clickPreviewLinkAJAX($elements[0]['href'], 5);
// Test that the pager is present and rendered.
$elements = $this->xpath('//ul[@class = "pager"]/li');
$this->assertTrue(!empty($elements), 'Full pager found.');
// Verify elements and links to pages.
// We expect to find 7 elements: links to '<< first' and '< previous'
// pages, link to page 1, current page == 2, link to page 3 and links
// to 'next >' and 'last >>' pages.
$this->assertClass($elements[0], 'pager-first', "Element for next page has .pager-first class.");
$this->assertTrue($elements[0]->a, "Link to first page found.");
$this->assertClass($elements[1], 'pager-previous', "Element for previous page has .pager-previous class.");
$this->assertTrue($elements[1]->a, "Link to previous page found.");
$this->assertClass($elements[2], 'pager-item', "Element for page 1 has .pager-item class.");
$this->assertTrue($elements[2]->a, "Link to page 1 found.");
$this->assertClass($elements[3], 'pager-current', 'Element for current page has .pager-current class.');
$this->assertFalse(isset($elements[3]->a), 'Element for current page has no link.');
$this->assertClass($elements[4], 'pager-item', "Element for page 3 has .pager-item class.");
$this->assertTrue($elements[4]->a, "Link to page 3 found.");
$this->assertClass($elements[5], 'pager-next', "Element for next page has .pager-next class.");
$this->assertTrue($elements[5]->a, "Link to next page found.");
$this->assertClass($elements[6], 'pager-last', "Element for last page has .pager-last class.");
$this->assertTrue($elements[6]->a, "Link to last page found.");
// Test Mini Pager.
$this->getPreviewAJAX('test_mini_pager', 'default', 3);
......@@ -132,6 +165,26 @@ public function testPreviewWithPagersUI() {
$this->assertClass($elements[2], 'pager-next', "Element for next page has .pager-next class.");
$this->assertTrue($elements[2]->a, "Link to next page found.");
// Navigate to next page.
$elements = $this->xpath('//li[contains(@class, :class)]/a', array(':class' => 'pager-next'));
$this->clickPreviewLinkAJAX($elements[0]['href'], 3);
// Test that the pager is present and rendered.
$elements = $this->xpath('//ul[@class = "pager"]/li');
$this->assertTrue(!empty($elements), 'Mini pager found.');
// Verify elements and links to pages.
// We expect to find 3 elements: previous page with a link, current
// page with no link, and next page with a link.
$this->assertClass($elements[0], 'pager-previous', 'Element for previous page has .pager-previous class.');
$this->assertTrue($elements[0]->a, "Link to previous page found.");
$this->assertClass($elements[1], 'pager-current', 'Element for current page has .pager-current class.');
$this->assertFalse(isset($elements[1]->a), 'Element for current page has no link.');
$this->assertClass($elements[2], 'pager-next', "Element for next page has .pager-next class.");
$this->assertTrue($elements[2]->a, "Link to next page found.");
}
/**
......@@ -147,7 +200,36 @@ public function testPreviewWithPagersUI() {
protected function getPreviewAJAX($view_name, $panel_id, $row_count) {
$this->drupalGet('admin/structure/views/view/' . $view_name . '/preview/' . $panel_id);
$result = $this->drupalPostAJAX(NULL, array(), array('op' => t('Update preview')));
$this->assertPreviewAJAX($result, $row_count);
}
/**
* Mimic clicking on a preview link.
*
* @param string $url
* The url to navigate to.
* @param int $row_count
* The expected number of rows in the preview.
*/
protected function clickPreviewLinkAJAX($url, $row_count) {
$ajax_settings = array(
'url' => $url,
'wrapper' => 'views-preview-wrapper',
'method' => 'replaceWith',
);
$result = $this->drupalPostAJAX(NULL, array(), NULL, NULL, array(), array(), NULL, $ajax_settings);
$this->assertPreviewAJAX($result, $row_count);
}
/**
* Assert that the AJAX response contains expected data.
*
* @param array $result
* An array of AJAX commands.
* @param int $row_count
* The expected number of rows in the preview.
*/
protected function assertPreviewAJAX($result, $row_count) {
// Has AJAX callback replied with an insert command? If so, we can
// assume that the page content was updated with AJAX returned data.
$result_commands = array();
......
......@@ -89,7 +89,7 @@ public function form(array $form, array &$form_state) {
$args = explode('/', $form_state['values']['view_args']);
}
if (!empty($form_state['show_preview'])) {
if (!empty($form_state['show_preview']) || !empty($form_state['input']['js'])) {
$form['preview'] = array(
'#weight' => 110,
'#theme_wrappers' => array('container'),
......@@ -122,7 +122,7 @@ protected function actions(array $form, array &$form_state) {
'wrapper' => 'views-preview-wrapper',
'event' => 'click',
'progress' => array('type' => 'throbber'),
'method' => 'replace',
'method' => 'replaceWith',
),
),
);
......
......@@ -541,17 +541,17 @@ public function renderPreview($display_id, $args = array()) {
$this->executable->live_preview = TRUE;
$this->views_ui_context = TRUE;
// AJAX happens via $_POST but everything expects exposed data to
// AJAX happens via HTTP POST but everything expects exposed data to
// be in GET. Copy stuff but remove ajax-framework specific keys.
// If we're clicking on links in a preview, though, we could actually
// still have some in $_GET, so we use $_REQUEST to ensure we get it all.
$exposed_input = \Drupal::request()->request->all();
// have some input in the query parameters, so we merge request() and
// query() to ensure we get it all.
$exposed_input = array_merge(\Drupal::request()->request->all(), \Drupal::request()->query->all());
foreach (array('view_name', 'view_display_id', 'view_args', 'view_path', 'view_dom_id', 'pager_element', 'view_base_path', 'ajax_html_ids', 'ajax_page_state', 'form_id', 'form_build_id', 'form_token') as $key) {
if (isset($exposed_input[$key])) {
unset($exposed_input[$key]);
}
}
$this->executable->setExposedInput($exposed_input);
if (!$this->executable->setDisplay($display_id)) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment