diff -u b/core/modules/media_library/src/Form/AddFormBase.php b/core/modules/media_library/src/Form/AddFormBase.php --- b/core/modules/media_library/src/Form/AddFormBase.php +++ b/core/modules/media_library/src/Form/AddFormBase.php @@ -126,6 +126,8 @@ ]; $form['#attributes']['class'][] = 'media-library-add-form'; + $form['#attributes']['class'][] = 'js-media-library-add-form'; + $added_media = $form_state->get('media'); if (empty($added_media)) { $form['#attributes']['class'][] = 'media-library-add-form--without-input'; @@ -142,8 +144,22 @@ $form['media'][$delta] = $this->buildEntityFormElement($media, $form, $form_state, $delta); } + $form['selection'] = $this->buildSelection($form, $form_state); $form['actions'] = $this->buildActions($form, $form_state); } + + // Allow the current selection to be set in a hidden field so the selection + // can be passed between different states of the form. + $form['current_selection'] = [ + '#type' => 'hidden', + '#default_value' => '', + '#attributes' => [ + 'class' => [ + 'js-media-library-add-form-current-selection', + ], + ], + ]; + return $form; } @@ -252,4 +268,65 @@ /** + * Returns a render array containing the current selection. + * + * @param array $form + * The complete form. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The current form state. + * + * @return array + * A render array containing the current selection. + */ + protected function buildSelection(array $form, FormStateInterface $form_state) { + $media_ids = array_filter(explode(',', $form_state->getValue('current_selection'))); + + if (!$media_ids) { + return []; + } + + $media_items = $this->entityTypeManager->getStorage('media')->loadMultiple($media_ids); + $view_builder = $this->entityTypeManager->getViewBuilder('media'); + + $selection = [ + '#type' => 'container', + '#attributes' => [ + 'class' => [ + 'media-library-add-form-selection', + ], + ], + ]; + + foreach ($media_items as $media_id => $media) { + $selection[$media_id] = [ + '#type' => 'container', + '#attributes' => [ + 'class' => [ + 'media-library-item', + 'js-media-library-item', + 'js-click-to-select', + ], + ], + 'select' => [ + '#type' => 'container', + '#attributes' => [ + 'class' => [ + 'js-click-to-select-checkbox', + ], + ], + 'select_checkbox' => [ + '#type' => 'checkbox', + '#title' => $this->t('Select @name', ['@name' => $media->label()]), + '#title_display' => 'invisible', + '#return_value' => $media_id, + ], + ], + 'rendered_entity' => $view_builder->view($media, 'media_library'), + ]; + } + + return $selection; + } + + /** * Returns an array of supported actions for the form. * @@ -458,10 +535,13 @@ return $form; } + // Merge added and selected media. + $selected_media_ids = array_filter(explode(',', $form_state->getValue('current_selection'))); $added_media = $form_state->get('media') ?: []; - $media_ids = array_map(function (MediaInterface $media) { + $added_media_ids = array_map(function (MediaInterface $media) { return $media->id(); }, $added_media); + $media_ids = array_merge($selected_media_ids, $added_media_ids); // Pass the selection to the field widget based on the current widget ID. $opener_id = MediaLibraryState::fromRequest($this->getRequest())->getOpenerId(); diff -u b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php --- b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php +++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php @@ -593,10 +593,8 @@ $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]')->click(); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextContains('Media library'); - // Assert the default tab for media type one does not have an upload form. $assert_session->fieldNotExists('files[upload][]'); - // Assert we can upload a file to media type three. $page->clickLink('Type Three'); $assert_session->assertWaitOnAjaxRequest(); @@ -606,17 +604,15 @@ $assert_session->assertWaitOnAjaxRequest(); $assert_session->elementExists('css', '.media-library-add-form--with-input'); $assert_session->elementNotExists('css', '.media-library-add-form--without-input'); - + $assert_session->elementNotExists('css', '.media-library-add-form-selection'); // Files are temporary until the form is saved. $files = $file_storage->loadMultiple(); $file = array_pop($files); $this->assertSame('public://type-three-dir', $file_system->dirname($file->getFileUri())); $this->assertTrue($file->isTemporary()); - // Assert the revision_log_message field is not shown. $upload_form = $assert_session->elementExists('css', '.media-library-add-form'); $assert_session->fieldNotExists('Revision log message', $upload_form); - // Assert the name field contains the filename and the alt text is required. $this->assertSame($assert_session->fieldExists('Name')->getValue(), $png_image->filename); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select'); @@ -625,17 +621,14 @@ $page->fillField('Alternative text', $this->randomString()); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select'); $assert_session->assertWaitOnAjaxRequest(); - // The file should be permanent now. $files = $file_storage->loadMultiple(); $file = array_pop($files); $this->assertFalse($file->isTemporary()); - // Load the created media item. $media_storage = $this->container->get('entity_type.manager')->getStorage('media'); $media_items = $media_storage->loadMultiple(); $added_media = array_pop($media_items); - // 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. @@ -644,7 +637,7 @@ $assert_session->fieldValueEquals('media_library_select_form[0]', $added_media->id()); $assert_session->checkboxChecked('media_library_select_form[0]'); $assert_session->pageTextContains('1 of 2 items selected'); - + $assert_session->hiddenFieldValueEquals('current_selection', $added_media->id()); // Ensure the created item is added in the widget. $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); $assert_session->assertWaitOnAjaxRequest(); @@ -662,43 +655,46 @@ $assert_session->pageTextContains('Media library'); $page->clickLink('Type Three'); $assert_session->assertWaitOnAjaxRequest(); - $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_image->uri)); + $png_uri_2 = file_unmanaged_copy($png_image->uri); + $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_2)); $assert_session->assertWaitOnAjaxRequest(); $page->fillField('Alternative text', $this->randomString()); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and insert'); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextNotContains('Media library'); - $assert_session->pageTextContains($png_image->filename); + $assert_session->pageTextContains($file_system->basename($png_uri_2)); // Also make sure that we can upload to the unlimited cardinality field. $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click(); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextContains('Media library'); - - // Navigate to the media type three tab first. $page->clickLink('Type Three'); $assert_session->assertWaitOnAjaxRequest(); - - // Select a media item. - $page->find('css', '.media-library-view .js-click-to-select-checkbox input')->click(); + // Select a media item to check if the selection is persisted when adding + // new items. + $existing_media_name = $file_system->basename($png_uri_2); + $checkbox = $page->findField("Select $existing_media_name"); + $selected_item_id = $checkbox->getAttribute('value'); + $checkbox->click(); $assert_session->pageTextContains('1 item selected'); - + $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id); // Multiple uploads should be allowed. // @todo Add test when https://github.com/minkphp/Mink/issues/358 is closed $this->assertTrue($assert_session->fieldExists('Add files')->hasAttribute('multiple')); - - $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_image->uri)); + $png_uri_3 = file_unmanaged_copy($png_image->uri); + $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_3)); $assert_session->assertWaitOnAjaxRequest(); + $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection'); + $assert_session->checkboxChecked("Select $existing_media_name", $selection_area); $page->fillField('Name', 'Unlimited Cardinality Image'); $page->fillField('Alternative text', $this->randomString()); $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select'); $assert_session->assertWaitOnAjaxRequest(); - // Load the created media item. $media_storage = $this->container->get('entity_type.manager')->getStorage('media'); $media_items = $media_storage->loadMultiple(); $added_media = array_pop($media_items); - + $added_media_name = $added_media->label(); // 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. @@ -706,69 +702,101 @@ $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 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()])); $checkboxes = $page->findAll('css', '.media-library-view .js-click-to-select-checkbox input'); $selected_checkboxes = []; foreach ($checkboxes as $checkbox) { if ($checkbox->isChecked()) { - $selected_checkboxes[] = $checkbox->getValue(); + $selected_checkboxes[] = $checkbox->getAttribute('value'); } } $this->assertCount(2, $selected_checkboxes); - // Ensure the created item is added in the widget. $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextNotContains('Media library'); $assert_session->pageTextContains('Unlimited Cardinality Image'); - // Verify we can only upload the files allowed by the media type. + // Assert we can now only upload one more media item. $assert_session->elementExists('css', '.media-library-open-button[href*="field_twin_media"]')->click(); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextContains('Media library'); $page->clickLink('Type Four'); $assert_session->assertWaitOnAjaxRequest(); - - // Assert we can now only upload one more media item. $this->assertFalse($assert_session->fieldExists('Add file')->hasAttribute('multiple')); $assert_session->pageTextContains('One file only.'); // Assert media type four should only allow jpg files by trying a png file // first. - $page->attachFileToField('Add file', $file_system->realpath($png_image->uri)); + $png_uri_4 = file_unmanaged_copy($png_image->uri); + $page->attachFileToField('Add file', $file_system->realpath($png_uri_4)); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextContains('Only files with the following extensions are allowed'); - // Assert that jpg files are accepted by type four. - $page->attachFileToField('Add file', $file_system->realpath($jpg_image->uri)); + $jpg_uri_2 = file_unmanaged_copy($jpg_image->uri); + $page->attachFileToField('Add file', $file_system->realpath($jpg_uri_2)); $assert_session->assertWaitOnAjaxRequest(); $page->fillField('Alternative text', $this->randomString()); - // The type_four media type has another optional image field. $assert_session->pageTextContains('Extra Image'); - $page->attachFileToField('Extra Image', $this->container->get('file_system')->realpath($jpg_image->uri)); + $jpg_uri_3 = file_unmanaged_copy($jpg_image->uri); + $page->attachFileToField('Extra Image', $this->container->get('file_system')->realpath($jpg_uri_3)); $assert_session->assertWaitOnAjaxRequest(); // Ensure that the extra image was uploaded to the correct directory. $files = $file_storage->loadMultiple(); $file = array_pop($files); $this->assertSame('public://type-four-extra-dir', $file_system->dirname($file->getFileUri())); - $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select'); $assert_session->assertWaitOnAjaxRequest(); - // Ensure the media item was saved to the library and automatically // selected. $assert_session->pageTextContains('Media library'); - $assert_session->pageTextContains($jpg_image->filename); - + $assert_session->pageTextContains($file_system->basename($jpg_uri_2)); // Ensure the created item is added in the widget. $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); $assert_session->assertWaitOnAjaxRequest(); $assert_session->pageTextNotContains('Media library'); - $assert_session->pageTextContains($jpg_image->filename); + $assert_session->pageTextContains($file_system->basename($jpg_uri_2)); + + // Assert we can also remove selected items from the selection area in the + // upload form. + $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]')->click(); + $assert_session->assertWaitOnAjaxRequest(); + $assert_session->pageTextContains('Media library'); + $page->clickLink('Type Three'); + $assert_session->assertWaitOnAjaxRequest(); + $checkbox = $page->findField("Select $existing_media_name"); + $selected_item_id = $checkbox->getAttribute('value'); + $checkbox->click(); + $assert_session->hiddenFieldValueEquals('current_selection', $selected_item_id); + $this->assertTrue($assert_session->fieldExists('Add files')->hasAttribute('multiple')); + $png_uri_5 = file_unmanaged_copy($png_image->uri); + $page->attachFileToField('Add files', $this->container->get('file_system')->realpath($png_uri_5)); + $assert_session->assertWaitOnAjaxRequest(); + $selection_area = $assert_session->elementExists('css', '.media-library-add-form-selection'); + $assert_session->checkboxChecked("Select $existing_media_name", $selection_area); + $page->uncheckField("Select $existing_media_name"); + $page->fillField('Alternative text', $this->randomString()); + $assert_session->hiddenFieldValueEquals('current_selection', ''); + $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Save and select'); + $assert_session->assertWaitOnAjaxRequest(); + $media_storage = $this->container->get('entity_type.manager')->getStorage('media'); + $media_items = $media_storage->loadMultiple(); + $added_media = array_pop($media_items); + $added_media_name = $added_media->label(); + $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->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Insert selected'); + $assert_session->assertWaitOnAjaxRequest(); + $assert_session->pageTextNotContains('Media library'); + $assert_session->pageTextContains($file_system->basename($png_uri_5)); } } only in patch2: unchanged: --- a/core/modules/media_library/css/media_library.module.css +++ b/core/modules/media_library/css/media_library.module.css @@ -24,6 +24,7 @@ .media-library-views-form, .media-library-selection, +.media-library-add-form-selection, .media-library-views-form__bulk_form, .media-library-view .form--inline { display: flex; @@ -81,7 +82,8 @@ /* @todo Remove or re-work in https://www.drupal.org/node/2985168 */ .media-library-widget .media-library-item__name a, -.media-library-view.view-display-id-widget .media-library-item__name a { +.media-library-view.view-display-id-widget .media-library-item__name a, +.media-library-add-form-selection .media-library-item__name a { pointer-events: none; } only in patch2: unchanged: --- a/core/modules/media_library/css/media_library.theme.css +++ b/core/modules/media_library/css/media_library.theme.css @@ -96,6 +96,11 @@ margin: 8px 0 0; } +.media-library-add-form-selection { + margin-top: 1em; + border-top: 1px solid #c0c0c0; +} + .media-library-views-form__header .form-item { margin-right: 8px; } @@ -303,8 +308,8 @@ /* Do not show the bottom border and padding for the last item. */ .media-library-add-form__media:last-child { - border-bottom: 0; padding-bottom: 0; + border-bottom: 0; } /* @todo Remove in https://www.drupal.org/project/drupal/issues/2987921 */ @@ -331,7 +336,8 @@ /* @todo Remove or re-work in https://www.drupal.org/node/2985168 */ .media-library-widget .media-library-item__name a, -.media-library-view.view-display-id-widget .media-library-item__name a { +.media-library-view.view-display-id-widget .media-library-item__name a, +.media-library-add-form-selection .media-library-item__name a { text-decoration: none; color: black; } only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.click_to_select.es6.js +++ b/core/modules/media_library/js/media_library.click_to_select.es6.js @@ -33,4 +33,44 @@ }); }, }; + + /** + * Adds hover effect to media items. + * + * @type {Drupal~behavior} + * + * @prop {Drupal~behaviorAttach} attach + * Attaches behavior to add a class when hovering over media items. + */ + Drupal.behaviors.ClickToSelectHover = { + attach(context) { + $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context) + .once('media-library-item-hover') + .on('mouseover mouseout', ({ currentTarget, type }) => { + $(currentTarget) + .closest('.media-library-item') + .toggleClass('is-hover', type === 'mouseover'); + }); + }, + }; + + /** + * Adds focus effect to media items. + * + * @type {Drupal~behavior} + * + * @prop {Drupal~behaviorAttach} attach + * Attaches behavior to add a focus effect to media items. + */ + Drupal.behaviors.ClickToSelectFocus = { + attach(context) { + $('.js-click-to-select-checkbox input', context) + .once('media-library-item-focus') + .on('focus blur', ({ currentTarget, type }) => { + $(currentTarget) + .closest('.media-library-item') + .toggleClass('is-focus', type === 'focus'); + }); + }, + }; })(jQuery, Drupal); only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.click_to_select.js +++ b/core/modules/media_library/js/media_library.click_to_select.js @@ -21,4 +21,26 @@ }); } }; + + Drupal.behaviors.ClickToSelectHover = { + attach: function attach(context) { + $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context).once('media-library-item-hover').on('mouseover mouseout', function (_ref2) { + var currentTarget = _ref2.currentTarget, + type = _ref2.type; + + $(currentTarget).closest('.media-library-item').toggleClass('is-hover', type === 'mouseover'); + }); + } + }; + + Drupal.behaviors.ClickToSelectFocus = { + attach: function attach(context) { + $('.js-click-to-select-checkbox input', context).once('media-library-item-focus').on('focus blur', function (_ref3) { + var currentTarget = _ref3.currentTarget, + type = _ref3.type; + + $(currentTarget).closest('.media-library-item').toggleClass('is-focus', type === 'focus'); + }); + } + }; })(jQuery, Drupal); \ No newline at end of file only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.ui.es6.js +++ b/core/modules/media_library/js/media_library.ui.es6.js @@ -150,7 +150,10 @@ */ Drupal.behaviors.MediaLibraryItemSelection = { attach(context, settings) { - const $form = $('.js-media-library-views-form', context); + const $form = $( + '.js-media-library-views-form, .js-media-library-add-form', + context, + ); const currentSelection = Drupal.MediaLibrary.currentSelection; if (!$form.length) { @@ -162,30 +165,6 @@ $form, ); - // Update the selection array and the hidden form field when a media item - // is selected. - $mediaItems.once('media-item-change').on('change', e => { - const id = e.currentTarget.value; - - // Update the selection. - const position = currentSelection.indexOf(id); - if (e.currentTarget.checked) { - // Check if the ID is not already in the selection and add if needed. - if (position === -1) { - currentSelection.push(id); - } - } else if (position !== -1) { - // Remove the ID when it is in the current selection. - currentSelection.splice(position, 1); - } - - // Set the selection in the hidden form element. - $form - .find('#media-library-modal-selection') - .val(currentSelection.join()) - .trigger('change'); - }); - /** * Disable media items. * @@ -242,23 +221,49 @@ } } - // The hidden selection form field changes when the selection is updated. - $('#media-library-modal-selection', $form) - .once('media-library-selection-change') - .on('change', e => { - updateSelectionInfo(settings.media_library.selection_remaining); + // Update the selection array and the hidden form field when a media item + // is selected. + $mediaItems.once('media-item-change').on('change', e => { + const id = e.currentTarget.value; - // Prevent users from selecting more items than allowed. - if ( - currentSelection.length === - settings.media_library.selection_remaining - ) { - disableItems($mediaItems.not(':checked')); - enableItems($mediaItems.filter(':checked')); - } else { - enableItems($mediaItems); + // Update the selection. + const position = currentSelection.indexOf(id); + if (e.currentTarget.checked) { + // Check if the ID is not already in the selection and add if needed. + if (position === -1) { + currentSelection.push(id); } - }); + } else if (position !== -1) { + // Remove the ID when it is in the current selection. + currentSelection.splice(position, 1); + } + + // Set the selection in the hidden form element. + $form + .find('#media-library-modal-selection') + .val(currentSelection.join()) + .trigger('change'); + + // Set the selection in the media library add form. Since the form is + // not necessarily loaded within the same context, we can't use the + // context here. + $('.js-media-library-add-form-current-selection').val( + currentSelection.join(), + ); + + // Update the number of selected items in the button pane. + updateSelectionInfo(settings.media_library.selection_remaining); + + // Prevent users from selecting more items than allowed. + if ( + currentSelection.length === settings.media_library.selection_remaining + ) { + disableItems($mediaItems.not(':checked')); + enableItems($mediaItems.filter(':checked')); + } else { + enableItems($mediaItems); + } + }); // Apply the current selection to the media library view. Changing the // checkbox values triggers the change event for the media items. The only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.ui.js +++ b/core/modules/media_library/js/media_library.ui.js @@ -77,7 +77,7 @@ Drupal.behaviors.MediaLibraryItemSelection = { attach: function attach(context, settings) { - var $form = $('.js-media-library-views-form', context); + var $form = $('.js-media-library-views-form, .js-media-library-add-form', context); var currentSelection = Drupal.MediaLibrary.currentSelection; if (!$form.length) { @@ -86,21 +86,6 @@ var $mediaItems = $('.js-media-library-item input[type="checkbox"]', $form); - $mediaItems.once('media-item-change').on('change', function (e) { - var id = e.currentTarget.value; - - var position = currentSelection.indexOf(id); - if (e.currentTarget.checked) { - if (position === -1) { - currentSelection.push(id); - } - } else if (position !== -1) { - currentSelection.splice(position, 1); - } - - $form.find('#media-library-modal-selection').val(currentSelection.join()).trigger('change'); - }); - function disableItems($items) { $items.prop('disabled', true).closest('.js-media-library-item').addClass('media-library-item--disabled'); } @@ -124,7 +109,22 @@ } } - $('#media-library-modal-selection', $form).once('media-library-selection-change').on('change', function (e) { + $mediaItems.once('media-item-change').on('change', function (e) { + var id = e.currentTarget.value; + + var position = currentSelection.indexOf(id); + if (e.currentTarget.checked) { + if (position === -1) { + currentSelection.push(id); + } + } else if (position !== -1) { + currentSelection.splice(position, 1); + } + + $form.find('#media-library-modal-selection').val(currentSelection.join()).trigger('change'); + + $('.js-media-library-add-form-current-selection').val(currentSelection.join()); + updateSelectionInfo(settings.media_library.selection_remaining); if (currentSelection.length === settings.media_library.selection_remaining) { only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.view.es6.js +++ b/core/modules/media_library/js/media_library.view.es6.js @@ -2,46 +2,6 @@ * @file media_library.view.es6.js */ (($, Drupal) => { - /** - * Adds hover effect to media items. - * - * @type {Drupal~behavior} - * - * @prop {Drupal~behaviorAttach} attach - * Attaches behavior to add a class when hovering over media items. - */ - Drupal.behaviors.MediaLibraryHover = { - attach(context) { - $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context) - .once('media-library-item-hover') - .on('mouseover mouseout', ({ currentTarget, type }) => { - $(currentTarget) - .closest('.media-library-item') - .toggleClass('is-hover', type === 'mouseover'); - }); - }, - }; - - /** - * Adds focus effect to media items. - * - * @type {Drupal~behavior} - * - * @prop {Drupal~behaviorAttach} attach - * Attaches behavior to add a focus effect to media items. - */ - Drupal.behaviors.MediaLibraryFocus = { - attach(context) { - $('.js-click-to-select-checkbox input', context) - .once('media-library-item-focus') - .on('focus blur', ({ currentTarget, type }) => { - $(currentTarget) - .closest('.media-library-item') - .toggleClass('is-focus', type === 'focus'); - }); - }, - }; - /** * Adds checkbox to select all items in the library. * only in patch2: unchanged: --- a/core/modules/media_library/js/media_library.view.js +++ b/core/modules/media_library/js/media_library.view.js @@ -6,34 +6,12 @@ **/ (function ($, Drupal) { - Drupal.behaviors.MediaLibraryHover = { - attach: function attach(context) { - $('.js-click-to-select-trigger, .js-click-to-select-checkbox', context).once('media-library-item-hover').on('mouseover mouseout', function (_ref) { - var currentTarget = _ref.currentTarget, - type = _ref.type; - - $(currentTarget).closest('.media-library-item').toggleClass('is-hover', type === 'mouseover'); - }); - } - }; - - Drupal.behaviors.MediaLibraryFocus = { - attach: function attach(context) { - $('.js-click-to-select-checkbox input', context).once('media-library-item-focus').on('focus blur', function (_ref2) { - var currentTarget = _ref2.currentTarget, - type = _ref2.type; - - $(currentTarget).closest('.media-library-item').toggleClass('is-focus', type === 'focus'); - }); - } - }; - Drupal.behaviors.MediaLibrarySelectAll = { attach: function attach(context) { var $view = $('.js-media-library-view', context).once('media-library-select-all'); if ($view.length && $view.find('.media-library-item').length) { - var $checkbox = $('').on('click', function (_ref3) { - var currentTarget = _ref3.currentTarget; + var $checkbox = $('').on('click', function (_ref) { + var currentTarget = _ref.currentTarget; var $checkboxes = $(currentTarget).closest('.media-library-view').find('.media-library-item input[type="checkbox"]'); $checkboxes.prop('checked', $(currentTarget).prop('checked')).trigger('change'); only in patch2: unchanged: --- a/core/modules/media_library/src/Form/FileUploadForm.php +++ b/core/modules/media_library/src/Form/FileUploadForm.php @@ -176,6 +176,7 @@ public function validateUploadElement(array $element, FormStateInterface $form_s */ public function processUploadElement(array $element, FormStateInterface $form_state) { $element['upload_button']['#submit'] = ['::uploadButtonSubmit']; + $element['upload_button']['#limit_validation_errors'] = FALSE; $element['upload_button']['#ajax'] = [ 'callback' => '::updateFormCallback', 'wrapper' => 'media-library-wrapper',