diff --git a/core/modules/media_library/src/Form/AddFormBase.php b/core/modules/media_library/src/Form/AddFormBase.php index b872493a50..b4ef7ad1e0 100644 --- a/core/modules/media_library/src/Form/AddFormBase.php +++ b/core/modules/media_library/src/Form/AddFormBase.php @@ -223,6 +223,10 @@ protected function buildEntityFormElement(MediaInterface $media, array $form, Fo // do not want to set focus to the remove button automatically. // @see ::updateFormCallback() 'tabindex' => '-1', + // Add a data attribute containing the delta to allow us to easily shift + // the focus to a specific media item. + // @see ::updateFormCallback() + 'data-media-library-added-delta' => $delta, ], 'preview' => [ '#type' => 'container', @@ -454,19 +458,18 @@ public function updateFormCallback(array &$form, FormStateInterface $form_state) else { $response->addCommand(new ReplaceCommand("#$wrapper_id", $form)); - // Try to find the sequence number of the next media item for use in the - // nth-child selector by checking if the delta is bigger than the - // removed delta. If there is no item with a bigger delta, we - // automatically use the sequence number of the previous item. + // Find the delta of the next media item. If there is no item with a + // bigger delta, we automatically use the delta of the previous item and + // shift the focus there. $removed_delta = array_slice($triggering_element['#array_parents'], -2, 1)[0]; - $nth_child = 0; + $delta_to_focus = 0; foreach ($added_media as $delta => $media) { - $nth_child++; + $delta_to_focus = $delta; if ($delta > $removed_delta) { break; } } - $response->addCommand(new InvokeCommand(".media-library-add-form__media:nth-child($nth_child)", 'focus')); + $response->addCommand(new InvokeCommand(".media-library-add-form__media[data-media-library-added-delta=$delta_to_focus]", 'focus')); } } // Update the form and shift focus to the added media items. diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php index 312dbb9330..cbba55dc81 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php @@ -856,7 +856,7 @@ public function testWidgetUpload() { // Create a list of new files to upload. $filenames = []; $remote_paths = []; - foreach(range(1, 3) as $i) { + foreach (range(1, 3) as $i) { $path = $file_system->copy($png_image->uri); $filenames[] = $file_system->basename($path); $remote_paths[] = $driver->uploadFileAndGetRemoteFilePath($file_system->realpath($path)); @@ -871,32 +871,34 @@ public function testWidgetUpload() { $assert_session->fieldValueEquals('media[0][fields][name][0][value]', $filenames[0]); $assert_session->fieldValueEquals('media[1][fields][name][0][value]', $filenames[1]); $assert_session->fieldValueEquals('media[2][fields][name][0][value]', $filenames[2]); - // Set alt texts. + // Set alt texts for items 1 and 2, leave the alt text empty for item 3 to + // assert the field validation does not stop users from removing items. $page->fillField('media[0][fields][field_media_test_image][0][alt]', $filenames[0]); $page->fillField('media[1][fields][field_media_test_image][0][alt]', $filenames[1]); - $page->fillField('media[2][fields][field_media_test_image][0][alt]', $filenames[2]); // Remove the second file and assert the focus is shifted to the container // of the next media item and field values are still correct. $page->pressButton('media-1-remove-button'); - $this->assertJsCondition('jQuery(".media-library-add-form__media:nth-child(2)").is(":focus")'); + $this->assertJsCondition('jQuery(".media-library-add-form__media[data-media-library-added-delta=2]").is(":focus")'); $assert_session->pageTextContains('The media item ' . $filenames[1] . ' has been removed.'); - $assert_session->fieldValueEquals('media[0][fields][name][0][value]', $filenames[0]); - $assert_session->fieldValueEquals('media[0][fields][field_media_test_image][0][alt]', $filenames[0]); - $assert_session->fieldNotExists('media[1][fields][name][0][value]'); - $assert_session->fieldNotExists('media[1][fields][field_media_test_image][0][alt]'); - $assert_session->fieldValueEquals('media[2][fields][name][0][value]', $filenames[2]); - $assert_session->fieldValueEquals('media[2][fields][field_media_test_image][0][alt]', $filenames[2]); + // The second media item should be removed (this has the delta 1 since we + // start counting from 0). + $assert_session->elementNotExists('css', '.media-library-add-form__media[data-media-library-added-delta=1]'); + $media_item_one = $assert_session->elementExists('css', '.media-library-add-form__media[data-media-library-added-delta=0]'); + $assert_session->fieldValueEquals('Name', $filenames[0], $media_item_one); + $assert_session->fieldValueEquals('Alternative text', $filenames[0], $media_item_one); + $media_item_three = $assert_session->elementExists('css', '.media-library-add-form__media[data-media-library-added-delta=2]'); + $assert_session->fieldValueEquals('Name', $filenames[2], $media_item_three); + $assert_session->fieldValueEquals('Alternative text', '', $media_item_three); // Remove the last file and assert the focus is shifted to the container // of the first media item and field values are still correct. $page->pressButton('media-2-remove-button'); - $this->assertJsCondition('jQuery(".media-library-add-form__media:nth-child(1)").is(":focus")'); + $this->assertJsCondition('jQuery(".media-library-add-form__media[data-media-library-added-delta=0]").is(":focus")'); $assert_session->pageTextContains('The media item ' . $filenames[2] . ' has been removed.'); - $assert_session->fieldValueEquals('media[0][fields][name][0][value]', $filenames[0]); - $assert_session->fieldValueEquals('media[0][fields][field_media_test_image][0][alt]', $filenames[0]); - $assert_session->fieldNotExists('media[1][fields][name][0][value]'); - $assert_session->fieldNotExists('media[1][fields][field_media_test_image][0][alt]'); - $assert_session->fieldNotExists('media[2][fields][name][0][value]'); - $assert_session->fieldNotExists('media[2][fields][field_media_test_image][0][alt]'); + $assert_session->elementNotExists('css', '.media-library-add-form__media[data-media-library-added-delta=1]'); + $assert_session->elementNotExists('css', '.media-library-add-form__media[data-media-library-added-delta=2]'); + $media_item_one = $assert_session->elementExists('css', '.media-library-add-form__media[data-media-library-added-delta=0]'); + $assert_session->fieldValueEquals('Name', $filenames[0], $media_item_one); + $assert_session->fieldValueEquals('Alternative text', $filenames[0], $media_item_one); } /**