diff --git a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php index 963135acb5..eda90abc5b 100644 --- a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php +++ b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php @@ -46,11 +46,6 @@ */ class MediaLibraryWidget extends WidgetBase implements TrustedCallbackInterface { - /** - * The default media view mode when rendering already-selected media items. - */ - const DEFAULT_VIEW_MODE = 'media_library'; - /** * Entity type manager service. * @@ -206,42 +201,46 @@ public function settingsForm(array $form, FormStateInterface $form_state) { '#required' => TRUE, ]; + // Return $elements early if there aren't at least two types, as otherwise + // there's no selection to be made. $media_type_ids = $this->getAllowedMediaTypeIdsSorted(); - if (count($media_type_ids) > 1) { - $elements['media_types'] = [ - '#type' => 'table', - '#header' => [ - $this->t('Tab order'), - $this->t('Weight'), + if (count($media_type_ids) <= 1) { + return $elements; + } + + $elements['media_types'] = [ + '#type' => 'table', + '#header' => [ + $this->t('Tab order'), + $this->t('Weight'), + ], + '#tabledrag' => [ + [ + 'action' => 'order', + 'relationship' => 'sibling', + 'group' => 'weight', ], - '#tabledrag' => [ - [ - 'action' => 'order', - 'relationship' => 'sibling', - 'group' => 'weight', - ], + ], + '#value_callback' => [static::class, 'setMediaTypesValue'], + ]; + + $media_types = $this->entityTypeManager->getStorage('media_type')->loadMultiple($media_type_ids); + $weight = 0; + foreach ($media_types as $media_type_id => $media_type) { + $label = $media_type->label(); + $elements['media_types'][$media_type_id] = [ + 'label' => ['#markup' => $label], + 'weight' => [ + '#type' => 'weight', + '#title' => $this->t('Weight for @title', ['@title' => $label]), + '#title_display' => 'invisible', + '#default_value' => $weight, + '#attributes' => ['class' => ['weight']], ], - '#value_callback' => [static::class, 'setMediaTypesValue'], + '#weight' => $weight, + '#attributes' => ['class' => ['draggable']], ]; - - $media_types = $this->entityTypeManager->getStorage('media_type')->loadMultiple($media_type_ids); - $weight = 0; - foreach ($media_types as $media_type_id => $media_type) { - $label = $media_type->label(); - $elements['media_types'][$media_type_id] = [ - 'label' => ['#markup' => $label], - 'weight' => [ - '#type' => 'weight', - '#title' => $this->t('Weight for @title', ['@title' => $label]), - '#title_display' => 'invisible', - '#default_value' => $weight, - '#attributes' => ['class' => ['weight']], - ], - '#weight' => $weight, - '#attributes' => ['class' => ['draggable']], - ]; - $weight++; - } + $weight++; } return $elements; @@ -464,7 +463,7 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen '#limit_validation_errors' => $limit_validation_errors, ], // @todo Make the view mode configurable in https://www.drupal.org/project/drupal/issues/2971209 - 'rendered_entity' => $view_builder->view($media_item, self::DEFAULT_VIEW_MODE), + 'rendered_entity' => $view_builder->view($media_item, 'media_library'), 'target_id' => [ '#type' => 'hidden', '#value' => $media_item->id(), diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php index dea5f4e24c..351c12e6f6 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/EmbeddedFormWidgetTest.php @@ -5,6 +5,7 @@ use Drupal\field\Entity\FieldConfig; use Drupal\field\Entity\FieldStorageConfig; use Drupal\FunctionalJavascriptTests\WebDriverTestBase; +use Drupal\media_library\MediaLibraryState; use Drupal\Tests\TestFileCreationTrait; /** @@ -70,7 +71,7 @@ protected function setUp(): void { 'region' => 'content', 'settings' => [ 'media_types' => ['type_three'], - 'form_mode' => 'media_library', + 'form_mode' => MediaLibraryState::DEFAULT_FORM_MODE, ], ]) ->save(); @@ -104,7 +105,7 @@ public function testInsertionAndReselection($widget) { 'region' => 'content', 'settings' => [ 'media_types' => ['type_three'], - 'form_mode' => 'media_library', + 'form_mode' => MediaLibraryState::DEFAULT_FORM_MODE, ], ]) ->save(); diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php index 0f10d0aa8b..4f0d7bd765 100644 --- a/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/WidgetAccessTest.php @@ -59,7 +59,7 @@ public function testWidgetAccess() { $role->save(); // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; // Create a working state. $allowed_types = ['type_one', 'type_two', 'type_three', 'type_four']; @@ -128,9 +128,6 @@ public function testWidgetAccess() { $this->drupalGet('media-library', [ 'query' => array_merge($url_options['query'], ['media_library_selected_type' => 'type_one']), ]); - $this->drupalGet('media-library', [ - 'query' => array_merge($url_options['query'], ['media_library_form_mode' => ' ']), - ]); $assert_session->responseContains('Access denied'); $this->drupalGet('media-library', [ 'query' => array_merge($url_options['query'], ['media_library_remaining' => 3]), diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php index 9ac79c2c14..0046f270ac 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAccessTest.php @@ -109,7 +109,7 @@ public function testFieldWidgetEntityCreateAccess() { $ui_builder = $this->container->get('media_library.ui_builder'); // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; // Create a media library state to test access. $state = MediaLibraryState::create('media_library.opener.field_widget', [ @@ -165,7 +165,7 @@ public function testEditorOpenerAccess($media_embed_enabled, $can_use_format) { } // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; $state = MediaLibraryState::create( 'media_library.opener.editor', @@ -224,7 +224,7 @@ public function testFieldWidgetEntityEditAccess() { $forbidden_entity->save(); // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; // Create a media library state to test access. $state = MediaLibraryState::create( @@ -324,7 +324,7 @@ public function testFieldWidgetEntityFieldAccess(string $field_type) { $account = $this->createUser(['administer entity_test content']); // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; // Test that access is denied even without an entity to work with. $state = MediaLibraryState::create( @@ -371,7 +371,7 @@ public function testViewAccess() { $ui_builder = $this->container->get('media_library.ui_builder'); // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; // Create a media library state to test access. $state = MediaLibraryState::create( @@ -442,7 +442,7 @@ public function testAddFormAccess(): void { ]; // @todo where should this be pulled from? The field widget specifies. - $form_mode = 'media_library'; + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; $account = $this->createUser(['create media']); $this->setCurrentUser($account); diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php index b5a2734ad4..d77510705e 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryAddFormTest.php @@ -35,13 +35,6 @@ class MediaLibraryAddFormTest extends KernelTestBase { 'user', ]; - /** - * The machine name of the form mode to render the Add media forms. - * - * Normally specified using the media library Form widget. - */ - protected $form_mode = 'media_library'; - /** * {@inheritdoc} */ @@ -119,7 +112,10 @@ public function testMediaTypeAddForm() { * The render array for the media library. */ protected function buildLibraryUi($selected_type_id) { - $state = MediaLibraryState::create('test', ['image', 'remote_video'], $selected_type_id, -1, [], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state = MediaLibraryState::create('test', ['image', 'remote_video'], $selected_type_id, -1, [], $form_mode); return \Drupal::service('media_library.ui_builder')->buildUi($state); } @@ -137,7 +133,10 @@ public function testFormStateValidation() { * Tests the validation of the selected type in the media library add form. */ public function testSelectedTypeValidation() { - $state = MediaLibraryState::create('test', ['image', 'remote_video', 'header_image'], 'header_image', -1, [], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state = MediaLibraryState::create('test', ['image', 'remote_video', 'header_image'], 'header_image', -1, [], $form_mode); $form_state = new FormState(); $form_state->set('media_library_state', $state); $this->expectException(\InvalidArgumentException::class); diff --git a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php index bce48dbea2..af0003f3b2 100644 --- a/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php +++ b/core/modules/media_library/tests/src/Kernel/MediaLibraryStateTest.php @@ -76,14 +76,17 @@ public function testMethods() { $selected_media_type_id = 'image'; $remaining_slots = 2; - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, $remaining_slots, [], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, $remaining_slots, [], $form_mode); $this->assertSame($opener_id, $state->getOpenerId()); $this->assertSame($allowed_media_type_ids, $state->getAllowedTypeIds()); $this->assertSame($selected_media_type_id, $state->getSelectedTypeId()); $this->assertSame($remaining_slots, $state->getAvailableSlots()); $this->assertTrue($state->hasSlotsAvailable()); - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, 0, [], $this->form_mode); + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_media_type_id, 0, [], $form_mode); $this->assertFalse($state->hasSlotsAvailable()); } @@ -110,7 +113,10 @@ public function testCreate($opener_id, array $allowed_media_type_ids, $selected_ $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage($exception_message); } - $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_type_id, $remaining_slots, [], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state = MediaLibraryState::create($opener_id, $allowed_media_type_ids, $selected_type_id, $remaining_slots, [], $form_mode); $this->assertInstanceOf(MediaLibraryState::class, $state); // Ensure that the state object carries cache metadata. @@ -284,9 +290,12 @@ public function providerCreate() { * @dataProvider providerFromRequest */ public function testFromRequest(array $query_overrides, $exception_expected) { + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + // Override the query parameters and verify an exception is thrown when // required state parameters are changed. - $query = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $this->form_mode)->all(); + $query = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $form_mode)->all(); $query = array_merge($query, $query_overrides); if ($exception_expected) { $this->expectException(BadRequestHttpException::class); @@ -334,7 +343,7 @@ public function providerFromRequest() { 'media_library_opener_id' => 'test', 'media_library_allowed_types' => ['file', 'image'], 'media_library_selected_type' => 'image', - 'media_library_form_mode' => 'media_library', + 'media_library_form_mode' => MediaLibraryState::DEFAULT_FORM_MODE, 'media_library_remaining' => 2, ], FALSE, @@ -378,7 +387,10 @@ public function providerFromRequest() { * @covers ::getOpenerParameters */ public function testOpenerParameters() { - $state = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz'], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz'], $form_mode); $this->assertSame(['foo' => 'baz'], $state->getOpenerParameters()); } @@ -386,8 +398,11 @@ public function testOpenerParameters() { * Tests that hash is unaffected by allowed media type order. */ public function testHashUnaffectedByMediaTypeOrder() { - $state1 = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $this->form_mode); - $state2 = MediaLibraryState::create('test', ['image', 'file'], 'image', 2, [], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state1 = MediaLibraryState::create('test', ['file', 'image'], 'image', 2, [], $form_mode); + $state2 = MediaLibraryState::create('test', ['image', 'file'], 'image', 2, [], $form_mode); $this->assertSame($state1->getHash(), $state2->getHash()); } @@ -395,8 +410,11 @@ public function testHashUnaffectedByMediaTypeOrder() { * Tests that hash is unaffected by opener parameter order. */ public function testHashUnaffectedByOpenerParamOrder() { - $state1 = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz', 'baz' => 'foo'], $this->form_mode); - $state2 = MediaLibraryState::create('test', ['file'], 'file', -1, ['baz' => 'foo', 'foo' => 'baz'], $this->form_mode); + // @todo where should this be pulled from? The field widget specifies. + $form_mode = MediaLibraryState::DEFAULT_FORM_MODE; + + $state1 = MediaLibraryState::create('test', ['file'], 'file', -1, ['foo' => 'baz', 'baz' => 'foo'], $form_mode); + $state2 = MediaLibraryState::create('test', ['file'], 'file', -1, ['baz' => 'foo', 'foo' => 'baz'], $form_mode); $this->assertSame($state1->getHash(), $state2->getHash()); }