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',