From c6e6709878839e0639d73d7c1e4420a8008e8a33 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Thu, 9 Aug 2018 11:13:36 +0100
Subject: [PATCH] Issue #2988622 by samuel.mortenson, bkosborne, phenaproxima,
 chr.fritsch: Media library field widget loses pre-existing selection when
 editing entity to add another selection

---
 .../Field/FieldWidget/MediaLibraryWidget.php  |  7 +++++-
 .../FunctionalJavascript/MediaLibraryTest.php | 24 +++++++++++++++++++
 2 files changed, 30 insertions(+), 1 deletion(-)

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 e9362a07047f..22ac3ecb7a5e 100644
--- a/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php
+++ b/core/modules/media_library/src/Plugin/Field/FieldWidget/MediaLibraryWidget.php
@@ -509,8 +509,13 @@ protected static function getNewMediaItems(array $element, FormStateInterface $f
    *     - weight: (int) A weight for the selection.
    */
   protected static function getFieldState(array $element, FormStateInterface $form_state) {
+    // Default to using the current selection if the form is new.
+    $path = $element['#parents'];
+    $values = NestedArray::getValue($form_state->getValues(), $path);
+    $selection = isset($values['selection']) ? $values['selection'] : [];
+
     $widget_state = static::getWidgetState($element['#field_parents'], $element['#field_name'], $form_state);
-    $widget_state['items'] = isset($widget_state['items']) ? $widget_state['items'] : [];
+    $widget_state['items'] = isset($widget_state['items']) ? $widget_state['items'] : $selection;
     return $widget_state;
   }
 
diff --git a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
index 9ae45c3a88c3..da4ebeb16a39 100644
--- a/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
+++ b/core/modules/media_library/tests/src/FunctionalJavascript/MediaLibraryTest.php
@@ -235,6 +235,30 @@ public function testWidget() {
     $assert_session->pageTextContains('Bear');
     $assert_session->pageTextContains('Horse');
     $assert_session->pageTextContains('Turtle');
+
+    // Re-edit the content and make a new selection.
+    $this->drupalGet('node/1/edit');
+    $assert_session->pageTextNotContains('Dog');
+    $assert_session->pageTextContains('Cat');
+    $assert_session->pageTextContains('Bear');
+    $assert_session->pageTextContains('Horse');
+    $assert_session->pageTextContains('Turtle');
+    $unlimited_button = $assert_session->elementExists('css', '.media-library-open-button[href*="field_unlimited_media"]');
+    $unlimited_button->click();
+    $assert_session->assertWaitOnAjaxRequest();
+    $assert_session->pageTextContains('Media library');
+    // Select the first media items (should be Dog, again).
+    $checkbox_selector = '.media-library-view .js-click-to-select-checkbox input';
+    $checkboxes = $page->findAll('css', $checkbox_selector);
+    $checkboxes[0]->click();
+    $assert_session->elementExists('css', '.ui-dialog-buttonpane')->pressButton('Select media');
+    $assert_session->assertWaitOnAjaxRequest();
+    // "Dog" and the existing selection should still exist.
+    $assert_session->pageTextContains('Dog');
+    $assert_session->pageTextContains('Cat');
+    $assert_session->pageTextContains('Bear');
+    $assert_session->pageTextContains('Horse');
+    $assert_session->pageTextContains('Turtle');
   }
 
   /**
-- 
GitLab