Commit 5bb2fc6b authored by catch's avatar catch
Browse files

Issue #3372261 by lauriii: "Set default value" incorrect default state when using Media Library

(cherry picked from commit ce9cd795)
parent 575a5342
Loading
Loading
Loading
Loading
+1 −24
Original line number Diff line number Diff line
@@ -136,7 +136,7 @@ public function form(array $form, FormStateInterface $form_state) {
      ]);

      if (!$has_required) {
        $has_default_value = $this->hasAnyElementDefaultValue($element);
        $has_default_value = count($this->entity->getDefaultValue($form['#entity'])) > 0;
        $element['#states'] = [
          'invisible' => [
            ':input[name="set_default_value"]' => ['checked' => FALSE],
@@ -180,29 +180,6 @@ private function hasAnyRequired(array $element) {
    return $has_required;
  }

  /**
   * A function to check if element contains elements with #default_value.
   *
   * @param array $element
   *   An element to check.
   *
   * @return bool
   */
  private function hasAnyElementDefaultValue(array $element) {
    $has_default_value = FALSE;
    foreach (Element::children($element) as $child) {
      if (isset($element[$child]['#default_value']) && $element[$child]['#default_value']) {
        $has_default_value = TRUE;
        break;
      }
      if (Element::children($element[$child])) {
        return $this->hasAnyElementDefaultValue($element[$child]);
      }
    }

    return $has_default_value;
  }

  /**
   * {@inheritdoc}
   */
+0 −34
Original line number Diff line number Diff line
@@ -71,38 +71,4 @@ public function providerRequired(): \Generator {
    ];
  }

  /**
   * @covers ::hasAnyElementDefaultValue
   *
   * @dataProvider providerDefaultValue
   */
  public function testHasAnyElementDefaultValueRecursive(array $element, bool $result) {
    $reflection = new \ReflectionClass('\Drupal\field_ui\Form\FieldConfigEditForm');
    $method = $reflection->getMethod('hasAnyElementDefaultValue');
    $method->setAccessible(TRUE);
    $this->assertEquals($result, $method->invoke($this->fieldConfigEditForm, $element));
  }

  /**
   * Provides test cases for detecting default values in a render array.
   */
  public function providerDefaultValue(): \Generator {
    yield 'includes default value' => [
      [['#default_value' => '🐈']],
      TRUE,
    ];
    yield 'no default value' => [
      [[]],
      FALSE,
    ];
    yield 'includes default value deep' => [
      [[[['#default_value' => '🐈']]]],
      TRUE,
    ];
    yield 'includes default value and no default value' => [
      [['#default_value' => '🐈'], []],
      TRUE,
    ];
  }

}
+30 −0
Original line number Diff line number Diff line
@@ -9,6 +9,11 @@
 */
class FieldUiIntegrationTest extends MediaLibraryTestBase {

  /**
   * {@inheritdoc}
   */
  protected $strictConfigSchema = FALSE;

  /**
   * {@inheritdoc}
   */
@@ -35,6 +40,14 @@ protected function setUp(): void {
    $this->drupalLogin($user);
    $this->drupalCreateContentType(['type' => 'article']);
    $this->drupalCreateContentType(['type' => 'page']);
    $this->createMediaItems([
      'type_one' => [
        'Horse',
        'Bear',
        'Cat',
        'Dog',
      ],
    ]);
  }

  /**
@@ -47,6 +60,8 @@ public function testFieldUiIntegration() {
      'access administration pages',
      'administer node fields',
      'administer node form display',
      'view media',
      'bypass node access',
    ]);
    $this->drupalLogin($user);

@@ -67,6 +82,21 @@ public function testFieldUiIntegration() {
    $page->pressButton('Save settings');
    $assert_session->pageTextContains('Saved Shatner configuration.');

    $this->drupalGet('/admin/structure/types/manage/article/fields/node.article.field_shatner');
    $assert_session->checkboxNotChecked('set_default_value');
    $page->checkField('set_default_value');
    $this->assertElementExistsAfterWait('css', "#field_shatner-media-library-wrapper-default_value_input")
      ->pressButton('Add media');
    $this->waitForText('Add or select media');
    $this->selectMediaItem(0);
    $this->pressInsertSelected();

    $page->pressButton('Save settings');
    $assert_session->pageTextContains('Saved Shatner configuration.');

    $this->drupalGet('/admin/structure/types/manage/article/fields/node.article.field_shatner');
    $assert_session->checkboxChecked('set_default_value');

    // Create a new instance of an existing field storage and assert that it
    // automatically uses the media library.
    $this->drupalGet('/admin/structure/types/manage/page/fields/reuse');