Issue #3067041 by seanB, dhirendra.mishra, Al Munnings, handspiker, phenaproxima, DannyBoing: Media library pagination is broken due to invalid entity_id parameter

merge-requests/55/head
webchick 2019-08-02 10:07:27 -07:00
parent d42181848c
commit dfbde86986
2 changed files with 127 additions and 65 deletions

View File

@ -464,15 +464,19 @@ class MediaLibraryWidget extends WidgetBase implements ContainerFactoryPluginInt
// attribute is the same as $field_widget_id. The entity ID, entity type ID,
// bundle, field name are used for access checking.
$entity = $items->getEntity();
$state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_media_type_ids, $selected_type_id, $remaining, [
$opener_parameters = [
'field_widget_id' => $field_widget_id,
'entity_type_id' => $entity->getEntityTypeId(),
'bundle' => $entity->bundle(),
'field_name' => $field_name,
// The entity ID needs to be a string to ensure that the media library
// state generates its tamper-proof hash in a consistent way.
'entity_id' => (string) $entity->id(),
]);
];
// Only add the entity ID when we actually have one. The entity ID needs to
// be a string to ensure that the media library state generates its
// tamper-proof hash in a consistent way.
if (!$entity->isNew()) {
$opener_parameters['entity_id'] = (string) $entity->id();
}
$state = MediaLibraryState::create('media_library.opener.field_widget', $allowed_media_type_ids, $selected_type_id, $remaining, $opener_parameters);
// Add a button that will load the Media library in a modal using AJAX.
$element['media_library_open_button'] = [

View File

@ -563,66 +563,6 @@ class MediaLibraryTest extends WebDriverTestBase {
$assert_session->pageTextContains('Bear');
$assert_session->elementExists('css', '.ui-dialog-titlebar-close')->click();
// Assert the media library contains header links to switch between the grid
// and table display.
$assert_session->elementExists('css', '.media-library-open-button[name^="field_unlimited_media"]')->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->elementExists('css', '.media-library-view .media-library-item--grid');
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--table');
// Assert the 'Apply filter' button is not moved to the button pane.
$button_pane = $assert_session->elementExists('css', '.ui-dialog-buttonpane');
$assert_session->buttonExists('Insert selected', $button_pane);
$assert_session->buttonNotExists('Apply filters', $button_pane);
$assert_session->linkExists('Grid');
$page->clickLink('Table');
// Assert the display change is correctly announced for screen readers.
$this->assertNotEmpty($assert_session->waitForText('Loading table view.'));
$this->assertNotEmpty($assert_session->waitForText('Changed to table view.'));
$this->assertNotEmpty($assert_session->waitForElementVisible('css', '.media-library-view .media-library-item--table'));
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--grid');
// Assert the 'Apply filter' button is not moved to the button pane.
$assert_session->buttonExists('Insert selected', $button_pane);
$assert_session->buttonNotExists('Apply filters', $button_pane);
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextNotContains('Turtle');
// Assert the exposed filters can be applied.
$page->fillField('Name', 'Dog');
$page->pressButton('Apply filters');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
$page->checkField('Select Dog');
$assert_session->linkExists('Table');
$page->clickLink('Grid');
// Assert the display change is correctly announced for screen readers.
$this->assertNotEmpty($assert_session->waitForText('Loading grid view.'));
$this->assertNotEmpty($assert_session->waitForText('Changed to grid view.'));
$this->assertNotEmpty($assert_session->waitForElementVisible('css', '.media-library-view .media-library-item--grid'));
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--table');
// Assert the exposed filters are persisted when changing display.
$this->assertSame('Dog', $page->findField('Name')->getValue());
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
$assert_session->linkExists('Grid');
$assert_session->linkExists('Table');
// Select the item.
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
$this->assertNotEmpty($assert_session->waitForText('Added one media item.'));
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the selection completed successfully.
$assert_session->pageTextNotContains('Add or select media');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
// Clear the selection.
$assert_session->elementAttributeContains('css', '.media-library-item__remove', 'aria-label', 'Remove Dog');
$assert_session->elementExists('css', '.media-library-item__remove')->click();
$this->assertNotEmpty($assert_session->waitForText('Removed Dog.'));
$assert_session->assertWaitOnAjaxRequest();
// Assert adding a single media item and removing it.
$assert_session->elementExists('css', '.media-library-open-button[name^="field_twin_media"]')->click();
$assert_session->assertWaitOnAjaxRequest();
@ -877,6 +817,124 @@ class MediaLibraryTest extends WebDriverTestBase {
$assert_session->pageTextNotContains('Snake');
}
/**
* Tests that the views in the Media library's widget work as expected.
*/
public function testWidgetViews() {
$assert_session = $this->assertSession();
$page = $this->getSession()->getPage();
// Create more media items for use in selection. We want to have more than
// 24 items to trigger a pager in the widget view.
$media_names = [
'Goat',
'Sheep',
'Pig',
'Cow',
'Chicken',
'Duck',
'Donkey',
'Llama',
'Mouse',
'Goldfish',
'Rabbit',
'Turkey',
'Dove',
'Giraffe',
'Tiger',
'Hamster',
'Parrot',
'Monkey',
'Koala',
'Panda',
'Kangaroo',
];
$time = time();
foreach ($media_names as $name) {
$entity = Media::create(['name' => $name, 'bundle' => 'type_one']);
$entity->setCreatedTime(++$time);
$entity->set('field_media_test', $name);
$entity->save();
}
$this->drupalGet('node/add/basic_page');
// Assert the media library contains header links to switch between the grid
// and table display.
$assert_session->elementExists('css', '.media-library-open-button[name^="field_unlimited_media"]')->click();
$assert_session->assertWaitOnAjaxRequest();
$assert_session->elementExists('css', '.media-library-view .media-library-item--grid');
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--table');
$assert_session->linkExists('Grid');
$assert_session->linkExists('Table');
// Assert the 'Apply filter' button is not moved to the button pane.
$button_pane = $assert_session->elementExists('css', '.ui-dialog-buttonpane');
$assert_session->buttonExists('Insert selected', $button_pane);
$assert_session->buttonNotExists('Apply filters', $button_pane);
// Assert the pager works as expected.
$assert_session->elementTextContains('css', '.media-library-view .pager__item.is-active', 'Page 1');
$assert_session->elementsCount('css', '.media-library-view .js-click-to-select-checkbox input', 24);
$page->clickLink('Next page');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->elementTextContains('css', '.media-library-view .pager__item.is-active', 'Page 2');
$assert_session->elementsCount('css', '.media-library-view .js-click-to-select-checkbox input', 1);
$page->clickLink('Previous page');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->elementTextContains('css', '.media-library-view .pager__item.is-active', 'Page 1');
$assert_session->elementsCount('css', '.media-library-view .js-click-to-select-checkbox input', 24);
// Assert the display change is correctly announced for screen readers.
$page->clickLink('Table');
$this->assertNotEmpty($assert_session->waitForText('Loading table view.'));
$this->assertNotEmpty($assert_session->waitForText('Changed to table view.'));
$this->assertNotEmpty($assert_session->waitForElementVisible('css', '.media-library-view .media-library-item--table'));
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--grid');
// Assert the 'Apply filter' button is not moved to the button pane.
$assert_session->buttonExists('Insert selected', $button_pane);
$assert_session->buttonNotExists('Apply filters', $button_pane);
$assert_session->pageTextContains('Dog');
$assert_session->pageTextContains('Bear');
$assert_session->pageTextNotContains('Turtle');
// Assert the exposed filters can be applied.
$page->fillField('Name', 'Dog');
$page->pressButton('Apply filters');
$assert_session->assertWaitOnAjaxRequest();
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
$page->checkField('Select Dog');
$assert_session->linkExists('Table');
$page->clickLink('Grid');
// Assert the display change is correctly announced for screen readers.
$this->assertNotEmpty($assert_session->waitForText('Loading grid view.'));
$this->assertNotEmpty($assert_session->waitForText('Changed to grid view.'));
$this->assertNotEmpty($assert_session->waitForElementVisible('css', '.media-library-view .media-library-item--grid'));
$assert_session->elementNotExists('css', '.media-library-view .media-library-item--table');
// Assert the exposed filters are persisted when changing display.
$this->assertSame('Dog', $page->findField('Name')->getValue());
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
$assert_session->linkExists('Grid');
$assert_session->linkExists('Table');
// Select the item.
$assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected');
$this->assertNotEmpty($assert_session->waitForText('Added one media item.'));
$assert_session->assertWaitOnAjaxRequest();
// Ensure that the selection completed successfully.
$assert_session->pageTextNotContains('Add or select media');
$assert_session->pageTextContains('Dog');
$assert_session->pageTextNotContains('Bear');
$assert_session->pageTextNotContains('Turtle');
}
/**
* Tests that the widget works as expected for anonymous users.
*/