From b02bce4af00a4a0dba4a72eda684d93c09765c03 Mon Sep 17 00:00:00 2001 From: nod_ <nod_@598310.no-reply.drupal.org> Date: Thu, 13 Jun 2024 22:03:32 +0200 Subject: [PATCH] Issue #3386191 by phthlaap, sukr_s, Ozle, brunoalmeida, smustgrave, Ashley George, shiv_yadav, larowlan: #states not working correctly when built from a logical combination of multliple fields (cherry picked from commit 5e2806f1b530c033701c434490bf697bc994aeaa) --- core/misc/states.js | 9 +++---- .../src/Form/JavascriptStatesForm.php | 24 +++++++++++++++++++ .../Core/Form/JavascriptStatesTest.php | 9 +++++++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/core/misc/states.js b/core/misc/states.js index 3109e1f1bdb0..6db3494cd7b4 100644 --- a/core/misc/states.js +++ b/core/misc/states.js @@ -93,15 +93,16 @@ */ Drupal.behaviors.states = { attach(context, settings) { - const $states = $(context).find('[data-drupal-states]'); - const il = $states.length; + // Uses once to avoid duplicates if attach is called multiple times. + const elements = once('states', '[data-drupal-states]', context); + const il = elements.length; for (let i = 0; i < il; i++) { const config = JSON.parse( - $states[i].getAttribute('data-drupal-states'), + elements[i].getAttribute('data-drupal-states'), ); Object.keys(config || {}).forEach((state) => { new states.Dependent({ - element: $($states[i]), + element: $(elements[i]), state: states.State.sanitize(state), constraints: config[state], }); diff --git a/core/modules/system/tests/modules/form_test/src/Form/JavascriptStatesForm.php b/core/modules/system/tests/modules/form_test/src/Form/JavascriptStatesForm.php index 0677df3bd06e..9da19f417659 100644 --- a/core/modules/system/tests/modules/form_test/src/Form/JavascriptStatesForm.php +++ b/core/modules/system/tests/modules/form_test/src/Form/JavascriptStatesForm.php @@ -730,6 +730,30 @@ public function buildForm(array $form, FormStateInterface $form_state) { '#title' => 'Enable textarea', ]; + $form['test_select_visible_dependence']['select_visible_1'] = [ + '#type' => 'select', + '#title' => 'Select visible 1', + '#options' => [0 => 0, 1 => 1], + '#default_value' => 0, + ]; + $form['test_select_visible_dependence']['select_visible_2'] = [ + '#type' => 'select', + '#title' => 'Select visible 2', + '#options' => [0 => 0, 1 => 1], + '#default_value' => 0, + ]; + $form['test_select_visible_dependence']['select_visible_3'] = [ + '#type' => 'select', + '#title' => 'Select should show when 0 and 1 are selected', + '#options' => [0 => 0, 1 => 1], + '#states' => [ + 'visible' => [ + ':input[name="select_visible_1"]' => ['value' => 0], + ':input[name="select_visible_2"]' => ['value' => 1], + ], + ], + ]; + return $form; } diff --git a/core/tests/Drupal/FunctionalJavascriptTests/Core/Form/JavascriptStatesTest.php b/core/tests/Drupal/FunctionalJavascriptTests/Core/Form/JavascriptStatesTest.php index b5c0d9178906..3fb9f8feac87 100644 --- a/core/tests/Drupal/FunctionalJavascriptTests/Core/Form/JavascriptStatesTest.php +++ b/core/tests/Drupal/FunctionalJavascriptTests/Core/Form/JavascriptStatesTest.php @@ -443,6 +443,15 @@ protected function doSelectTriggerTests() { $this->assertFalse($item_visible_value2->isVisible()); $this->assertTrue($textfield_visible_value3->isVisible()); $this->assertTrue($textfield_visible_value2_or_value3->isVisible()); + + $this->container->get('module_installer')->install(['big_pipe']); + $this->drupalGet('form-test/javascript-states-form'); + $select_visible_2 = $this->assertSession()->elementExists('css', 'select[name="select_visible_2"]'); + $select_visible_3 = $this->assertSession()->elementExists('css', 'select[name="select_visible_3"]'); + $this->assertFalse($select_visible_3->isVisible()); + + $select_visible_2->setValue('1'); + $this->assertTrue($select_visible_3->isVisible()); } /** -- GitLab