From 9bfa224a85720f5e5972356a41fd8bc7e6b62fb8 Mon Sep 17 00:00:00 2001 From: catch <catch@35733.no-reply.drupal.org> Date: Tue, 12 Mar 2024 12:21:05 +0000 Subject: [PATCH] Issue #3388913 by simonp98, Rajab Natshah, SoulReceiver, catch, smustgrave: Checkbox for Media library modal missing after search --- .../views/field/MediaLibrarySelectForm.php | 31 ++++++++++++++- .../EmbeddedFormWidgetTest.php | 6 ++- .../FunctionalJavascript/WidgetOEmbedTest.php | 29 ++++++++------ .../FunctionalJavascript/WidgetUploadTest.php | 38 +++++++++++-------- 4 files changed, 73 insertions(+), 31 deletions(-) diff --git a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php index 9e179eef8fab..64218f6345c1 100644 --- a/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php +++ b/core/modules/media_library/src/Plugin/views/field/MediaLibrarySelectForm.php @@ -28,7 +28,34 @@ class MediaLibrarySelectForm extends FieldPluginBase { * {@inheritdoc} */ public function getValue(ResultRow $row, $field = NULL) { - return '<!--form-item-' . $this->options['id'] . '--' . $row->index . '-->'; + return '<!--form-item-' . $this->options['id'] . '--' . $row->mid . '-->'; + } + + /** + * Return the name of a form field. + * + * @see \Drupal\views\Form\ViewsFormMainForm + * + * @return string + * The form field name. + */ + public function form_element_name(): string { + return $this->field; + } + + /** + * Return a media entity ID from a views result row. + * + * @see \Drupal\views\Form\ViewsFormMainForm + * + * @param int $row_id + * The index of a views result row. + * + * @return string + * The ID of a media entity. + */ + public function form_element_row_id(int $row_id): string { + return $this->view->result[$row_id]->mid; } /** @@ -70,7 +97,7 @@ public function viewsForm(array &$form, FormStateInterface $form_state) { $form[$this->options['id']][$row_index] = []; continue; } - $form[$this->options['id']][$row_index] = [ + $form[$this->options['id']][$row->mid] = [ '#type' => 'checkbox', '#title' => $this->t('Select @label', [ '@label' => $entity->label(), diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php index 36e294abb77a..dfe78f741952 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php @@ -7,6 +7,7 @@ use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\FunctionalJavascriptTests\WebDriverTestBase; +use Drupal\media\Entity\Media; use Drupal\Tests\TestFileCreationTrait; /** @@ -136,10 +137,13 @@ public function testInsertionAndReselection($widget) { return $wrapper->hasButton('Add media'); }); // Test reinserting the same selection. + $media_items = Media::loadMultiple(); + $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); $wrapper->pressButton('Add media'); $this->assertNotNull($assert_session->waitForText('Add or select media')); $assert_session->elementExists('xpath', "(//div[contains(@class, 'media-library-item')])[1]")->click(); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); $this->assertNotNull($assert_session->waitForElementVisible('xpath', $first_item_locator)); } diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php index 87d9df666a4b..42cb0595121d 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetOEmbedTest.php @@ -97,14 +97,15 @@ public function testWidgetOEmbed() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($youtube_title); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the created oEmbed video is correctly added to the widget. $this->pressInsertSelected('Added one media item.'); @@ -158,19 +159,20 @@ public function testWidgetOEmbed() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Custom video title'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select Custom video title"); $assert_session->checkboxChecked("Select $youtube_title"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -209,7 +211,7 @@ public function testWidgetOEmbed() { $this->waitForText('The media item has been created but has not yet been saved'); $page->fillField('Name', 'Another video'); $this->pressSaveButton(); - $page->uncheckField('media_library_select_form[1]'); + $page->uncheckField("media_library_select_form[$selected_item_id]"); $this->waitForText('1 item selected'); $this->pressInsertSelected('Added one media item.'); $this->waitForText('Another video'); @@ -283,14 +285,15 @@ public function testWidgetOEmbedAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($youtube_title); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the created oEmbed video is correctly added to the widget. $this->pressInsertSelected('Added one media item.'); @@ -346,19 +349,20 @@ public function testWidgetOEmbedAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Custom video title'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select Custom video title"); $assert_session->checkboxChecked("Select $youtube_title"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -409,10 +413,11 @@ public function testWidgetOEmbedAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); $this->waitForText('1 item selected'); $assert_session->checkboxChecked('Select Another video'); $assert_session->checkboxNotChecked("Select $vimeo_title"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText('Another video'); diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php index 75e378c9a53b..5afbb4f5254d 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetUploadTest.php @@ -121,7 +121,7 @@ public function testWidgetUpload() { $this->waitForText('Alternative text field is required'); $page->fillField('Alternative text', $this->randomString()); $this->pressSaveButton(); - $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[0]\']").is(":focus")'); + $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[1]\']").is(":focus")'); // The file should be permanent now. $files = $file_storage->loadMultiple(); $file = array_pop($files); @@ -129,15 +129,16 @@ public function testWidgetUpload() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($png_image->filename); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->pageTextContains('1 of 2 items selected'); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); // Ensure the created item is added in the widget. $this->pressInsertSelected('Added one media item.'); $this->waitForText($png_image->filename); @@ -179,19 +180,20 @@ public function testWidgetUpload() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Unlimited Cardinality Image'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -259,10 +261,11 @@ public function testWidgetUpload() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); $assert_session->pageTextContains('1 item selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxNotChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText($file_system->basename($png_uri_5)); @@ -461,7 +464,7 @@ public function testWidgetUploadAdvancedUi() { $this->waitForText('Alternative text field is required'); $page->fillField('Alternative text', $this->randomString()); $this->saveAnd('select'); - $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[0]\']").is(":focus")'); + $this->assertJsCondition('jQuery("input[name=\'media_library_select_form[1]\']").is(":focus")'); // The file should be permanent now. $files = $file_storage->loadMultiple(); $file = array_pop($files); @@ -469,15 +472,16 @@ public function testWidgetUploadAdvancedUi() { // Load the created media item. $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains($png_image->filename); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); $assert_session->pageTextContains('1 of 2 items selected'); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); // Ensure the created item is added in the widget. $this->pressInsertSelected('Added one media item.'); $this->waitForText($png_image->filename); @@ -523,19 +527,20 @@ public function testWidgetUploadAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); // Ensure the media item was saved to the library and automatically // selected. The added media items should be in the first position of the // add form. $assert_session->pageTextContains('Add or select media'); $assert_session->pageTextContains('Unlimited Cardinality Image'); - $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); - $assert_session->checkboxChecked('media_library_select_form[0]'); + $assert_session->fieldValueEquals("media_library_select_form[$added_media_id]", $added_media_id); + $assert_session->checkboxChecked("media_library_select_form[$added_media_id]"); // Assert the item that was selected before uploading the file is still // selected. $assert_session->pageTextContains('2 items selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media->id()])); + $assert_session->hiddenFieldValueEquals('current_selection', implode(',', [$selected_item_id, $added_media_id])); $selected_checkboxes = []; foreach ($this->getCheckboxes() as $checkbox) { if ($checkbox->isChecked()) { @@ -634,10 +639,11 @@ public function testWidgetUploadAdvancedUi() { $media_items = Media::loadMultiple(); $added_media = array_pop($media_items); $added_media_name = $added_media->label(); + $added_media_id = $added_media->id(); $assert_session->pageTextContains('1 item selected'); $assert_session->checkboxChecked("Select $added_media_name"); $assert_session->checkboxNotChecked("Select $existing_media_name"); - $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); + $assert_session->hiddenFieldValueEquals('current_selection', $added_media_id); $this->pressInsertSelected('Added one media item.'); $this->waitForText($file_system->basename($png_uri_5)); -- GitLab