Issue #3060603 by nuez, marcoscano, phenaproxima, alexpott, seanB: Live preview is broken when editing the media_library view
							parent
							
								
									1598f3e599
								
							
						
					
					
						commit
						6e594c260b
					
				| 
						 | 
				
			
			@ -70,7 +70,21 @@ function media_library_views_post_render(ViewExecutable $view, &$output, CachePl
 | 
			
		|||
  if ($view->id() === 'media_library') {
 | 
			
		||||
    $output['#attached']['library'][] = 'media_library/view';
 | 
			
		||||
    if (strpos($view->current_display, 'widget') === 0) {
 | 
			
		||||
      $query = MediaLibraryState::fromRequest($view->getRequest())->all();
 | 
			
		||||
      try {
 | 
			
		||||
        $query = MediaLibraryState::fromRequest($view->getRequest())->all();
 | 
			
		||||
      }
 | 
			
		||||
      catch (InvalidArgumentException $e) {
 | 
			
		||||
        // MediaLibraryState::fromRequest() will throw an exception if the view
 | 
			
		||||
        // is being previewed, since not all required query parameters will be
 | 
			
		||||
        // present. In a preview, however, this can be omitted since we're
 | 
			
		||||
        // merely previewing.
 | 
			
		||||
        // @todo Use the views API for checking for the preview mode when it
 | 
			
		||||
        //   lands. https://www.drupal.org/project/drupal/issues/3060855
 | 
			
		||||
        if (empty($view->preview) && empty($view->live_preview)) {
 | 
			
		||||
          throw $e;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // If the current query contains any parameters we use to contextually
 | 
			
		||||
      // filter the view, ensure they persist across AJAX rebuilds.
 | 
			
		||||
      // The ajax_path is shared for all AJAX views on the page, but our query
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,7 +26,13 @@ class MediaLibraryTest extends WebDriverTestBase {
 | 
			
		|||
  /**
 | 
			
		||||
   * {@inheritdoc}
 | 
			
		||||
   */
 | 
			
		||||
  protected static $modules = ['block', 'media_library_test', 'field_ui'];
 | 
			
		||||
  protected static $modules = [
 | 
			
		||||
    'block',
 | 
			
		||||
    'media_library_test',
 | 
			
		||||
    'field_ui',
 | 
			
		||||
    'views',
 | 
			
		||||
    'views_ui',
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * {@inheritdoc}
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +79,7 @@ class MediaLibraryTest extends WebDriverTestBase {
 | 
			
		|||
      'delete any media',
 | 
			
		||||
      'view media',
 | 
			
		||||
      'administer node form display',
 | 
			
		||||
      'administer views',
 | 
			
		||||
    ]);
 | 
			
		||||
    $this->drupalLogin($user);
 | 
			
		||||
    $this->drupalPlaceBlock('local_tasks_block');
 | 
			
		||||
| 
						 | 
				
			
			@ -272,6 +279,43 @@ class MediaLibraryTest extends WebDriverTestBase {
 | 
			
		|||
    $assert_session->elementNotExists('css', '.media-library-open-button[name^="field_null_types_media"]');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests that the integration with Views works correctly.
 | 
			
		||||
   */
 | 
			
		||||
  public function testViewsAdmin() {
 | 
			
		||||
    $assert_session = $this->assertSession();
 | 
			
		||||
    $page = $this->getSession()->getPage();
 | 
			
		||||
 | 
			
		||||
    // Assert that the widget can be seen and that there are 8 items.
 | 
			
		||||
    $this->drupalGet('/admin/structure/views/view/media_library/edit/widget');
 | 
			
		||||
    $assert_session->assertWaitOnAjaxRequest();
 | 
			
		||||
    $assert_session->elementsCount('css', '.media-library-item', 8);
 | 
			
		||||
 | 
			
		||||
    // Assert that filtering works in live preview.
 | 
			
		||||
    $page->find('css', '.media-library-view .view-filters')->fillField('name', 'snake');
 | 
			
		||||
    $page->find('css', '.media-library-view .view-filters')->pressButton('Apply filters');
 | 
			
		||||
    $assert_session->assertWaitOnAjaxRequest();
 | 
			
		||||
    $assert_session->elementsCount('css', '.media-library-item', 1);
 | 
			
		||||
 | 
			
		||||
    // Test the same routine but in the view for the table wiget.
 | 
			
		||||
    $this->drupalGet('/admin/structure/views/view/media_library/edit/widget_table');
 | 
			
		||||
    $assert_session->assertWaitOnAjaxRequest();
 | 
			
		||||
    $assert_session->elementsCount('css', '.media-library-item', 8);
 | 
			
		||||
 | 
			
		||||
    // Assert that filtering works in live preview.
 | 
			
		||||
    $page->find('css', '.media-library-view .view-filters')->fillField('name', 'snake');
 | 
			
		||||
    $page->find('css', '.media-library-view .view-filters')->pressButton('Apply filters');
 | 
			
		||||
    $assert_session->assertWaitOnAjaxRequest();
 | 
			
		||||
    $assert_session->elementsCount('css', '.media-library-item', 1);
 | 
			
		||||
 | 
			
		||||
    // We cannot test clicking the 'Insert selected' button in either view
 | 
			
		||||
    // because we expect an AJAX error, which would always throw an exception
 | 
			
		||||
    // on ::tearDown even if we try to catch it here. If there is an API for
 | 
			
		||||
    // marking certain elements 'unsuitable for previewing', we could test that
 | 
			
		||||
    // here.
 | 
			
		||||
    // @see https://www.drupal.org/project/drupal/issues/3060852
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Tests that the widget access works as expected.
 | 
			
		||||
   */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue