Verified Commit 710ae1c8 authored by Lauri Timmanee's avatar Lauri Timmanee
Browse files

Issue #3384583 by srishtiiee, viren18febS, smustgrave: Default value widget is...

Issue #3384583 by srishtiiee, viren18febS, smustgrave: Default value widget is not updated on field config change
parent 5ed165d5
Loading
Loading
Loading
Loading
Loading
+5 −12
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@

use Drupal\Component\Render\FormattableMarkup;
use Drupal\Component\Utility\Html;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Entity\ContentEntityStorageInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Component\Plugin\Exception\PluginNotFoundException;
@@ -483,6 +482,7 @@ public function fieldSettingsForm(array $form, FormStateInterface $form_state) {
    ];
    $form['handler']['handler_submit'] = [
      '#type' => 'submit',
      '#name' => 'handler_settings_submit',
      '#value' => $this->t('Change handler'),
      '#limit_validation_errors' => [],
      '#attributes' => [
@@ -705,8 +705,8 @@ public static function fieldSettingsAjaxProcess($form, FormStateInterface $form_
  public static function fieldSettingsAjaxProcessElement(&$element, $main_form) {
    if (!empty($element['#ajax'])) {
      $element['#ajax'] = [
        'callback' => [static::class, 'settingsAjax'],
        'wrapper' => $main_form['#id'],
        'trigger_as' => ['name' => 'handler_settings_submit'],
        'wrapper' => 'field-combined',
        'element' => $main_form['#array_parents'],
      ];
    }
@@ -731,21 +731,14 @@ public static function formProcessMergeParent($element) {
    return $element;
  }

  /**
   * Ajax callback for the handler settings form.
   *
   * @see static::fieldSettingsForm()
   */
  public static function settingsAjax($form, FormStateInterface $form_state) {
    return NestedArray::getValue($form, $form_state->getTriggeringElement()['#ajax']['element']);
  }

  /**
   * Submit handler for the non-JS case.
   *
   * @see static::fieldSettingsForm()
   */
  public static function settingsAjaxSubmit($form, FormStateInterface $form_state) {
    $form_storage = &$form_state->getStorage();
    unset($form_storage['default_value_widget']);
    $form_state->setRebuild();
  }

+5 −1
Original line number Diff line number Diff line
@@ -97,8 +97,12 @@ public function formElement(FieldItemListInterface $items, $delta, array $elemen
    $entity = $items->getEntity();
    $referenced_entities = $items->referencedEntities();

    $selection_settings = [];
    // Append the match operation to the selection settings.
    $selection_settings = $this->getFieldSetting('handler_settings') + [
    if ($this->getFieldSetting('handler_settings') !== NULL) {
      $selection_settings = $this->getFieldSetting('handler_settings');
    }
    $selection_settings += [
      'match_operator' => $this->getSetting('match_operator'),
      'match_limit' => $this->getSetting('match_limit'),
    ];
+16 −0
Original line number Diff line number Diff line
@@ -209,6 +209,21 @@ public function testFieldAdminHandler() {
      'field_storage[subform][cardinality]' => -1,
    ];
    $this->submitForm($edit, 'Update settings');

    // Assert that the target bundle handler setting is initially set.
    $this->assertSession()->checkboxChecked('settings[handler_settings][target_bundles][tags]');
    // Change the handler to 'views'.
    $this->submitForm([
      'settings[handler]' => 'views',
    ], 'Change handler');
    $this->assertSession()->fieldValueEquals('settings[handler]', 'views');
    // Change handler back to 'default'.
    $this->submitForm([
      'settings[handler]' => 'default:taxonomy_term',
    ], 'Change handler');
    // Assert that changing the handler resets the handler settings.
    $this->assertSession()->checkboxNotChecked('settings[handler_settings][target_bundles][tags]');

    $term_name = $this->randomString();
    $result = \Drupal::entityQuery('taxonomy_term')
      ->condition('name', $term_name)
@@ -217,6 +232,7 @@ public function testFieldAdminHandler() {
      ->execute();
    $this->assertCount(0, $result, "No taxonomy terms exist with the name '$term_name'.");
    $edit = [
      'settings[handler_settings][target_bundles][tags]' => TRUE,
      // This must be set before new entities will be auto-created.
      'settings[handler_settings][auto_create]' => 1,
    ];
+84 −0
Original line number Diff line number Diff line
<?php

namespace Drupal\Tests\field_ui\FunctionalJavascript;

use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
use Drupal\Tests\field_ui\Traits\FieldUiJSTestTrait;
use Drupal\Tests\taxonomy\Traits\TaxonomyTestTrait;

/**
 * Tests the default value widget in Field UI.
 *
 * @group field_ui
 */
class DefaultValueWidgetTest extends WebDriverTestBase {

  use TaxonomyTestTrait;
  use FieldUiJSTestTrait;

  /**
   * {@inheritdoc}
   */
  protected static $modules = [
    'node',
    'field_ui',
    'taxonomy',
  ];

  /**
   * {@inheritdoc}
   */
  protected $defaultTheme = 'stark';

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    // Create a Content type and two test nodes.
    $this->createContentType(['type' => 'test_content']);

    $user = $this->drupalCreateUser([
      'access content',
      'administer content types',
      'administer node fields',
    ]);
    $this->drupalLogin($user);
  }

  /**
   * Tests default value options on field config change.
   */
  public function testDefaultValueOptionsForChangingBundles() {
    $vocab_1 = $this->createVocabulary(['name' => 'Colors']);
    $this->createTerm($vocab_1, ['name' => 'red']);
    $this->createTerm($vocab_1, ['name' => 'green']);

    $vocab_2 = $this->createVocabulary(['name' => 'Tags']);
    $this->createTerm($vocab_2, ['name' => 'random tag 1']);
    $this->createTerm($vocab_2, ['name' => 'random tag 2']);

    $field_name = 'test_field';
    $this->fieldUIAddNewFieldJS('admin/structure/types/manage/test_content', $field_name, $field_name, 'entity_reference', FALSE);
    $page = $this->getSession()->getPage();
    $page->findField('field_storage[subform][settings][target_type]')->selectOption('taxonomy_term');
    $this->assertSession()->assertWaitOnAjaxRequest();

    $page->findField('settings[handler_settings][target_bundles][' . $vocab_1->id() . ']')->check();
    $this->assertSession()->assertWaitOnAjaxRequest();
    $page->findField('set_default_value')->check();

    $default_value_field = $page->findField('default_value_input[field_' . $field_name . '][0][target_id]');
    $default_value_field->setValue('r');
    $this->getSession()->getDriver()->keyDown($default_value_field->getXpath(), ' ');
    $this->assertSession()->waitOnAutocomplete();

    // Check the autocomplete results.
    $results = $page->findAll('css', '.ui-autocomplete li');
    $this->assertCount(2, $results);
    $this->assertSession()->elementTextNotContains('css', '.ui-autocomplete li', 'random tag 1');
    $this->assertSession()->elementTextContains('css', '.ui-autocomplete li', 'green');
  }

}