From cd2c6725d8e47596fc5476454d1a3e3049a118cf Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Wed, 11 May 2022 05:21:01 +0000
Subject: [PATCH 01/16] Add handling inline_entity_form subforms

---
 conditional_fields.module                   |  4 ++
 src/ConditionalFieldsElementAlterHelper.php | 57 +++++++++++++++++++--
 2 files changed, 57 insertions(+), 4 deletions(-)

diff --git a/conditional_fields.module b/conditional_fields.module
index 3594f7f..71d38eb 100644
--- a/conditional_fields.module
+++ b/conditional_fields.module
@@ -186,3 +186,7 @@ function conditional_fields_form_alter(&$form, &$form_state, $form_id) {
 function conditional_fields_form_after_build($form, &$form_state) {
   return \Drupal::service('conditional_fields.form_helper')->afterBuild($form, $form_state);
 }
+
+function conditional_fields_inline_entity_form_entity_form_alter(&$entity_form, &$form_state) {
+  $entity_form['#after_build'][] = 'conditional_fields_form_after_build';
+}
\ No newline at end of file
diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 1cebd40..ffb5eeb 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -2,6 +2,7 @@

 namespace Drupal\conditional_fields;

+use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Form\FormStateInterface;

@@ -50,6 +51,53 @@ class ConditionalFieldsElementAlterHelper {
     // in entities within entities they might not correspond,
     // and their dependencies will not be loaded.
     $build_info = $form_state->getBuildInfo();
+
+    // Detecting if this element is located inside inline_entity_form.
+    if(in_array('inline_entity_form', $field['#array_parents'])) {
+      $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents']);
+      $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);
+
+      $inline_form = NestedArray::getValue($form, $inline_entity_form_path);
+
+      $bundle = $inline_form['#bundle'];
+      $entity_type = $inline_form['#entity_type'];
+
+      $dependencies = $this->loadDependencies($entity_type, $bundle);
+
+      // $inline_entity_form_path_string = implode('.', $inline_entity_form_path);
+      $field_name = $field['#array_parents'][$inline_entity_form_level + 1];
+      $inline_field = $inline_form[$field_name]['widget'];
+      if(isset($inline_field['#parents'])) {
+        $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_form_level);
+        $inline_field['#array_parents'] = array_slice($inline_field['#array_parents'], $inline_entity_form_level + 1);
+      }
+      if(isset($inline_field['#field_parents'])) {
+        $inline_field['#field_parents'] = array_slice($inline_field['#field_parents'], $inline_entity_form_level);
+      }
+
+      // $field_path_string = $inline_entity_form_path_string . '.' . $field_name;
+
+      // Attach dependent.
+      if (isset($dependencies['dependents'][$field_name])) {
+        foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
+          if (!isset($inline_form['#conditional_fields'][$field_name]['dependees'][$id]) || $this->isPriorityField($inline_field)) {
+            $this->attachDependency($inline_form, $form_state, ['#field_name' => $dependency['dependee']], $inline_field, $dependency['options'], $id);
+          }
+        }
+      }
+
+      if (isset($dependencies['dependees'][$field_name])) {
+        foreach ($dependencies['dependees'][$field_name] as $id => $dependency) {
+          if (!isset($inline_form['#conditional_fields'][$field_name]['dependents'][$id]) || $this->isPriorityField($inline_field)) {
+            $this->attachDependency($inline_form, $form_state, $inline_field, ['#field_name' => $dependency['dependent']], $dependency['options'], $id);
+          }
+        }
+      }
+
+      // Copying inline_entity_form changes to parent form.
+      NestedArray::setValue($form, $inline_entity_form_path, $inline_form);
+    }
+
     if (method_exists($build_info['callback_object'], 'getEntity')) {
       $entity = $build_info['callback_object']->getEntity();
       if ($entity instanceof EntityInterface) {
@@ -97,11 +145,12 @@ class ConditionalFieldsElementAlterHelper {
    * Loads all dependencies from the database for a given bundle.
    */
   public function loadDependencies($entity_type, $bundle) {
-    static $dependency_helper;
-    if (!isset($dependency_helper)) {
-      $dependency_helper = new DependencyHelper($entity_type, $bundle);
+    static $dependency_helpers;
+    $bundle_key = $entity_type . '.' . $bundle;
+    if (!isset($dependency_helpers[$bundle_key])) {
+      $dependency_helpers[$bundle_key] = new DependencyHelper($entity_type, $bundle);
     }
-    return $dependency_helper->getBundleDependencies();
+    return $dependency_helpers[$bundle_key]->getBundleDependencies();
   }

   /**
--
GitLab


From ec5b3595a2475b26d13dc042f9a3173c07158d40 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Wed, 11 May 2022 06:37:05 +0000
Subject: [PATCH 02/16] Temporary trick for entity edit forms

---
 src/ConditionalFieldsElementAlterHelper.php | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index ffb5eeb..afaf0d1 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -256,6 +256,14 @@ class ConditionalFieldsElementAlterHelper {
       }
     }

+    /** @todo This is a trick for entity edit forms, needs rework */
+    if(($dependent['#parents'][0] ?? FALSE) === 'form') {
+      array_shift($dependent['#parents']);
+    }
+    if(($dependee['#parents'][0] ?? FALSE) === 'form') {
+      array_shift($dependee['#parents']);
+    }
+
     // Attach dependee.
     // Use the #array_parents property of the dependee instead of #field_parents
     // since we will need access to the full structure of the widget.
--
GitLab


From 3c6d82fd9c5c86e633b6ea84d43e502eb9909443 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Wed, 11 May 2022 15:15:56 +0000
Subject: [PATCH 03/16] A workaround for non-working "from widget" conditions
 Previous code works well for "AND/OR/other" condition types, but for some
 reason doesn't work for "Insert value from widget..." condition mode.

---
 .../conditional_fields/handler/DefaultStateHandler.php   | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
index a478390..d362611 100644
--- a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
+++ b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
@@ -25,7 +25,14 @@ class DefaultStateHandler extends ConditionalFieldsHandlerBase {

     switch ($values_set) {
       case ConditionalFieldsInterface::CONDITIONAL_FIELDS_DEPENDENCY_VALUES_WIDGET:
-        $values[$options['condition']] = $options['value_form'];
+        /** @todo This is called on my tests only for fields inside
+         * inline_entity_form, which is raw fields (not the complex widgets),
+         * so we must pass there the raw array, not the array with sub-arrays.
+         * And replacing 'value_form' to 'values' fixes the issue with broken
+         * states configuration on jQuery side.
+         * But this workaround needs re-testing with other field types. */
+        // $values[$options['condition']] = $options['value_form'];
+        $values[$options['condition']] = $options['values'];
         break;

       case ConditionalFieldsInterface::CONDITIONAL_FIELDS_DEPENDENCY_VALUES_REGEX:
--
GitLab


From abf3dc3767f31fa4ba4c9dbf06a62894f885e334 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Wed, 11 May 2022 16:28:21 +0000
Subject: [PATCH 04/16] Strict search to avoid '0' matches

---
 src/ConditionalFieldsElementAlterHelper.php | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index afaf0d1..8361646 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -53,8 +53,9 @@ class ConditionalFieldsElementAlterHelper {
     $build_info = $form_state->getBuildInfo();

     // Detecting if this element is located inside inline_entity_form.
-    if(in_array('inline_entity_form', $field['#array_parents'])) {
-      $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents']);
+    if(in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
+      /** @todo Make a search from the end to catch the deepest form */
+      $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents'], TRUE);
       $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);

       $inline_form = NestedArray::getValue($form, $inline_entity_form_path);
--
GitLab


From 4e5b81007ac60a200e0ad21fa3e7975b071e6703 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Thu, 12 May 2022 12:19:38 +0000
Subject: [PATCH 05/16] Rework fix for value_form conditions

---
 .../handler/DefaultStateHandler.php                 | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
index d362611..d8415ee 100644
--- a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
+++ b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
@@ -25,14 +25,13 @@ class DefaultStateHandler extends ConditionalFieldsHandlerBase {

     switch ($values_set) {
       case ConditionalFieldsInterface::CONDITIONAL_FIELDS_DEPENDENCY_VALUES_WIDGET:
-        /** @todo This is called on my tests only for fields inside
-         * inline_entity_form, which is raw fields (not the complex widgets),
-         * so we must pass there the raw array, not the array with sub-arrays.
-         * And replacing 'value_form' to 'values' fixes the issue with broken
-         * states configuration on jQuery side.
-         * But this workaround needs re-testing with other field types. */
+        /** @todo This change fixes problem within inline_entity_form fields.
+         * `[$options['condition']]` is removed because 'value_form' already
+         * contain condition name as key.
+         * But this need to be retested on not breaking any previous functional.
+         */
         // $values[$options['condition']] = $options['value_form'];
-        $values[$options['condition']] = $options['values'];
+        $values = $options['value_form'];
         break;

       case ConditionalFieldsInterface::CONDITIONAL_FIELDS_DEPENDENCY_VALUES_REGEX:
--
GitLab


From a819a82a10cd8ff2cbe943f5386fe5296593ae82 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Thu, 12 May 2022 13:05:43 +0000
Subject: [PATCH 06/16] Add support for nested inline_entity_form forms

---
 src/ConditionalFieldsElementAlterHelper.php | 29 +++++++++++++--------
 1 file changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 8361646..677e14d 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -53,31 +53,38 @@ class ConditionalFieldsElementAlterHelper {
     $build_info = $form_state->getBuildInfo();

     // Detecting if this element is located inside inline_entity_form.
-    if(in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
-      /** @todo Make a search from the end to catch the deepest form */
-      $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents'], TRUE);
+    if (in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
+      // We need to find last embedded inline_entity_form, but array_search can search only first.
+      $inline_entity_form_level = count($field['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($field['#array_parents']), TRUE);
+      // $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents'], TRUE);
       $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);

       $inline_form = NestedArray::getValue($form, $inline_entity_form_path);

       $bundle = $inline_form['#bundle'];
       $entity_type = $inline_form['#entity_type'];
+      /** @todo Can here be empty $bundle for entity types without bundles? */
+      if($bundle && $entity_type) {
+        $dependencies = $this->loadDependencies($entity_type, $bundle);
+      } else {
+        $dependencies = [];
+      }

-      $dependencies = $this->loadDependencies($entity_type, $bundle);
-
-      // $inline_entity_form_path_string = implode('.', $inline_entity_form_path);
       $field_name = $field['#array_parents'][$inline_entity_form_level + 1];
       $inline_field = $inline_form[$field_name]['widget'];
-      if(isset($inline_field['#parents'])) {
-        $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_form_level);
+
+      // Removing outer forms from field parents arrays.
+      $inline_entity_field_parents_level = count($inline_form['#parents']);
+      if (isset($inline_field['#parents'])) {
+        $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_field_parents_level);
+      }
+      if (isset($inline_field['#array_parents'])) {
         $inline_field['#array_parents'] = array_slice($inline_field['#array_parents'], $inline_entity_form_level + 1);
       }
-      if(isset($inline_field['#field_parents'])) {
+      if (isset($inline_field['#field_parents'])) {
         $inline_field['#field_parents'] = array_slice($inline_field['#field_parents'], $inline_entity_form_level);
       }

-      // $field_path_string = $inline_entity_form_path_string . '.' . $field_name;
-
       // Attach dependent.
       if (isset($dependencies['dependents'][$field_name])) {
         foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
--
GitLab


From 92d7398deb351d9678b376235aef2bd8e3aca0bb Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Thu, 12 May 2022 13:26:28 +0000
Subject: [PATCH 07/16] Fix notices

---
 src/ConditionalFieldsElementAlterHelper.php | 66 ++++++++++-----------
 1 file changed, 33 insertions(+), 33 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 677e14d..86168c7 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -61,49 +61,49 @@ class ConditionalFieldsElementAlterHelper {

       $inline_form = NestedArray::getValue($form, $inline_entity_form_path);

-      $bundle = $inline_form['#bundle'];
-      $entity_type = $inline_form['#entity_type'];
-      /** @todo Can here be empty $bundle for entity types without bundles? */
-      if($bundle && $entity_type) {
+      $field_name = $field['#array_parents'][$inline_entity_form_level + 1] ?? FALSE;
+      $bundle = $inline_form['#bundle'] ?? FALSE;
+      $entity_type = $inline_form['#entity_type'] ?? FALSE;
+
+      if ($field_name && $bundle && $entity_type) {
         $dependencies = $this->loadDependencies($entity_type, $bundle);
-      } else {
-        $dependencies = [];
-      }

-      $field_name = $field['#array_parents'][$inline_entity_form_level + 1];
-      $inline_field = $inline_form[$field_name]['widget'];
+        $inline_field = $inline_form[$field_name]['widget'] ?? $inline_form[$field_name];

-      // Removing outer forms from field parents arrays.
-      $inline_entity_field_parents_level = count($inline_form['#parents']);
-      if (isset($inline_field['#parents'])) {
-        $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_field_parents_level);
-      }
-      if (isset($inline_field['#array_parents'])) {
-        $inline_field['#array_parents'] = array_slice($inline_field['#array_parents'], $inline_entity_form_level + 1);
-      }
-      if (isset($inline_field['#field_parents'])) {
-        $inline_field['#field_parents'] = array_slice($inline_field['#field_parents'], $inline_entity_form_level);
-      }
+        // Removing outer forms from field parents arrays.
+        $inline_entity_form_field_parents_level = count($inline_form['#parents']);
+        if (isset($inline_field['#parents'])) {
+          $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_form_field_parents_level);
+        }
+        if (isset($inline_field['#array_parents'])) {
+          $inline_field['#array_parents'] = array_slice($inline_field['#array_parents'], $inline_entity_form_level + 1);
+        }
+        if (isset($inline_field['#field_parents'])) {
+          $inline_field['#field_parents'] = array_slice($inline_field['#field_parents'], $inline_entity_form_level);
+        }

-      // Attach dependent.
-      if (isset($dependencies['dependents'][$field_name])) {
-        foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
-          if (!isset($inline_form['#conditional_fields'][$field_name]['dependees'][$id]) || $this->isPriorityField($inline_field)) {
-            $this->attachDependency($inline_form, $form_state, ['#field_name' => $dependency['dependee']], $inline_field, $dependency['options'], $id);
+        // Attach dependent.
+        if (isset($dependencies['dependents'][$field_name])) {
+          foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
+            if (!isset($inline_form['#conditional_fields'][$field_name]['dependees'][$id]) || $this->isPriorityField($inline_field)) {
+              $this->attachDependency($inline_form, $form_state, ['#field_name' => $dependency['dependee']], $inline_field, $dependency['options'], $id);
+            }
           }
         }
-      }

-      if (isset($dependencies['dependees'][$field_name])) {
-        foreach ($dependencies['dependees'][$field_name] as $id => $dependency) {
-          if (!isset($inline_form['#conditional_fields'][$field_name]['dependents'][$id]) || $this->isPriorityField($inline_field)) {
-            $this->attachDependency($inline_form, $form_state, $inline_field, ['#field_name' => $dependency['dependent']], $dependency['options'], $id);
+        if (isset($dependencies['dependees'][$field_name])) {
+          foreach ($dependencies['dependees'][$field_name] as $id => $dependency) {
+            if (!isset($inline_form['#conditional_fields'][$field_name]['dependents'][$id]) || $this->isPriorityField($inline_field)) {
+              $this->attachDependency($inline_form, $form_state, $inline_field, ['#field_name' => $dependency['dependent']], $dependency['options'], $id);
+            }
           }
         }
-      }

-      // Copying inline_entity_form changes to parent form.
-      NestedArray::setValue($form, $inline_entity_form_path, $inline_form);
+        // Copying inline_entity_form changes to parent form.
+        if (isset($inline_form['#conditional_fields'])) {
+          NestedArray::setValue($form, $inline_entity_form_path, $inline_form);
+        }
+      }
     }

     if (method_exists($build_info['callback_object'], 'getEntity')) {
--
GitLab


From 5b00310c4ed3f6f778a2426b5e20981150fdf5f4 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Thu, 12 May 2022 13:29:44 +0000
Subject: [PATCH 08/16] Add phpdocs to inline entity form hook

---
 conditional_fields.module | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/conditional_fields.module b/conditional_fields.module
index 71d38eb..e390f54 100644
--- a/conditional_fields.module
+++ b/conditional_fields.module
@@ -170,6 +170,20 @@ function conditional_fields_form_alter(&$form, &$form_state, $form_id) {
   $form['#after_build'][] = 'conditional_fields_form_after_build';
 }

+/**
+ * Implements hook_inline_entity_form_entity_form_alter().
+ *
+ * Hook_inline_entity_form_entity_form_alter() that attaches an 'afterbuild' function to the form.
+ *
+ * @param array $entity_form
+ *   Nested array of form elements that comprise the entity form.
+ * @param \Drupal\Core\Form\FormStateInterface $form_state
+ *   The form state of the parent form.
+ */
+function conditional_fields_inline_entity_form_entity_form_alter(&$entity_form, &$form_state) {
+  $entity_form['#after_build'][] = 'conditional_fields_form_after_build';
+}
+
 /**
  * Runs the 'afterbuild' validation of a form with dependencies.
  *
@@ -187,6 +201,3 @@ function conditional_fields_form_after_build($form, &$form_state) {
   return \Drupal::service('conditional_fields.form_helper')->afterBuild($form, $form_state);
 }

-function conditional_fields_inline_entity_form_entity_form_alter(&$entity_form, &$form_state) {
-  $entity_form['#after_build'][] = 'conditional_fields_form_after_build';
-}
\ No newline at end of file
--
GitLab


From 912360d1b8e7f15b7e584c4e3c47da973f19457d Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Fri, 13 May 2022 08:05:13 +0000
Subject: [PATCH 09/16] Rework code to more reuse of original logic

---
 src/ConditionalFieldsElementAlterHelper.php | 124 +++++++++-----------
 1 file changed, 58 insertions(+), 66 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 86168c7..8888614 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -39,12 +39,10 @@ class ConditionalFieldsElementAlterHelper {
     $first_parent = reset($field['#parents']);

     // No parents, so bail out.
-    if (!isset($first_parent) || (isset($field['#type']) && $field['#type'] == 'value') ) {
+    if (!isset($first_parent) || (isset($field['#type']) && $field['#type'] == 'value')) {
       return $element;
     }

-    $form = &$form_state->getCompleteForm();
-
     // Some fields do not have entity type and bundle properties.
     // In this case we try to use the properties from the form.
     // This is not an optimal solution, since in case of fields
@@ -52,72 +50,60 @@ class ConditionalFieldsElementAlterHelper {
     // and their dependencies will not be loaded.
     $build_info = $form_state->getBuildInfo();

-    // Detecting if this element is located inside inline_entity_form.
-    if (in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
-      // We need to find last embedded inline_entity_form, but array_search can search only first.
-      $inline_entity_form_level = count($field['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($field['#array_parents']), TRUE);
-      // $inline_entity_form_level = array_search('inline_entity_form', $field['#array_parents'], TRUE);
-      $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);
+    if (method_exists($build_info['callback_object'], 'getEntity')) {

-      $inline_form = NestedArray::getValue($form, $inline_entity_form_path);
+      $entity = $build_info['callback_object']->getEntity();

-      $field_name = $field['#array_parents'][$inline_entity_form_level + 1] ?? FALSE;
-      $bundle = $inline_form['#bundle'] ?? FALSE;
-      $entity_type = $inline_form['#entity_type'] ?? FALSE;
+      $inline_entity_form_mode = FALSE;

-      if ($field_name && $bundle && $entity_type) {
-        $dependencies = $this->loadDependencies($entity_type, $bundle);
+      if ($entity instanceof EntityInterface) {

-        $inline_field = $inline_form[$field_name]['widget'] ?? $inline_form[$field_name];
+        // Detect if this element is located inside inline_entity_form.
+        if (in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
+          $inline_entity_form_mode = TRUE;
+          // We need to find last embedded inline_entity_form, but array_search can search only first.
+          $inline_entity_form_level = count($field['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($field['#array_parents']), TRUE);
+          $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);

-        // Removing outer forms from field parents arrays.
-        $inline_entity_form_field_parents_level = count($inline_form['#parents']);
-        if (isset($inline_field['#parents'])) {
-          $inline_field['#parents'] = array_slice($inline_field['#parents'], $inline_entity_form_field_parents_level);
-        }
-        if (isset($inline_field['#array_parents'])) {
-          $inline_field['#array_parents'] = array_slice($inline_field['#array_parents'], $inline_entity_form_level + 1);
-        }
-        if (isset($inline_field['#field_parents'])) {
-          $inline_field['#field_parents'] = array_slice($inline_field['#field_parents'], $inline_entity_form_level);
-        }
+          $main_form = &$form_state->getCompleteForm();

-        // Attach dependent.
-        if (isset($dependencies['dependents'][$field_name])) {
-          foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
-            if (!isset($inline_form['#conditional_fields'][$field_name]['dependees'][$id]) || $this->isPriorityField($inline_field)) {
-              $this->attachDependency($inline_form, $form_state, ['#field_name' => $dependency['dependee']], $inline_field, $dependency['options'], $id);
-            }
-          }
-        }
+          $form = NestedArray::getValue($main_form, $inline_entity_form_path);

-        if (isset($dependencies['dependees'][$field_name])) {
-          foreach ($dependencies['dependees'][$field_name] as $id => $dependency) {
-            if (!isset($inline_form['#conditional_fields'][$field_name]['dependents'][$id]) || $this->isPriorityField($inline_field)) {
-              $this->attachDependency($inline_form, $form_state, $inline_field, ['#field_name' => $dependency['dependent']], $dependency['options'], $id);
-            }
+          $field_name = $field['#array_parents'][$inline_entity_form_level + 1] ?? FALSE;
+
+          $bundle = $form['#bundle'] ?? FALSE;
+          $entity_type = $form['#entity_type'] ?? FALSE;
+
+          $field = $form[$field_name]['widget'] ?? $form[$field_name];
+
+          // Remove outer forms from field parents arrays.
+          $inline_entity_form_field_parents_level = count($form['#parents']);
+          if (isset($field['#parents'])) {
+            $field['#parents'] = array_slice($field['#parents'], $inline_entity_form_field_parents_level);
+          }
+          if (isset($field['#array_parents'])) {
+            $field['#array_parents'] = array_slice($field['#array_parents'], $inline_entity_form_level + 1);
+          }
+          if (isset($field['#field_parents'])) {
+            $field['#field_parents'] = array_slice($field['#field_parents'], $inline_entity_form_level);
           }
         }

-        // Copying inline_entity_form changes to parent form.
-        if (isset($inline_form['#conditional_fields'])) {
-          NestedArray::setValue($form, $inline_entity_form_path, $inline_form);
-        }
-      }
-    }
+        else {
+          $form = &$form_state->getCompleteForm();

-    if (method_exists($build_info['callback_object'], 'getEntity')) {
-      $entity = $build_info['callback_object']->getEntity();
-      if ($entity instanceof EntityInterface) {
-        $bundle = $entity->bundle();
-        $entity_type = $entity->getEntityTypeId();
-
-        /**
-         * @deprecated Not actual from Drupal 8.7.0.
-         * Media entity returns the actual bundle object, rather than id
-         */
-        if (is_object($bundle) && method_exists($bundle, 'getPluginId')) {
-          $bundle = $bundle->getPluginId();
+          $field_name = reset($field['#array_parents']);
+
+          $bundle = $entity->bundle();
+          $entity_type = $entity->getEntityTypeId();
+
+          /**
+           * @deprecated Not actual from Drupal 8.7.0.
+           * Media entity returns the actual bundle object, rather than id
+           */
+          if (is_object($bundle) && method_exists($bundle, 'getPluginId')) {
+            $bundle = $bundle->getPluginId();
+          }
         }

         $dependencies = $this->loadDependencies($entity_type, $bundle);
@@ -126,7 +112,6 @@ class ConditionalFieldsElementAlterHelper {
           return $element;
         }

-        $field_name = reset($field['#array_parents']);
         // Attach dependent.
         if (isset($dependencies['dependents'][$field_name])) {
           foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
@@ -143,6 +128,12 @@ class ConditionalFieldsElementAlterHelper {
             }
           }
         }
+
+        if ($inline_entity_form_mode && isset($form['#conditional_fields'])) {
+          // Copy inline_entity_form changes to parent form.
+          NestedArray::setValue($main_form, $inline_entity_form_path, $form);
+        }
+
       }
     }

@@ -154,11 +145,11 @@ class ConditionalFieldsElementAlterHelper {
    */
   public function loadDependencies($entity_type, $bundle) {
     static $dependency_helpers;
-    $bundle_key = $entity_type . '.' . $bundle;
-    if (!isset($dependency_helpers[$bundle_key])) {
-      $dependency_helpers[$bundle_key] = new DependencyHelper($entity_type, $bundle);
+    $dependency_key = $entity_type . '.' . $bundle;
+    if (!isset($dependency_helpers[$dependency_key])) {
+      $dependency_helpers[$dependency_key] = new DependencyHelper($entity_type, $bundle);
     }
-    return $dependency_helpers[$bundle_key]->getBundleDependencies();
+    return $dependency_helpers[$dependency_key]->getBundleDependencies();
   }

   /**
@@ -264,11 +255,12 @@ class ConditionalFieldsElementAlterHelper {
       }
     }

-    /** @todo This is a trick for entity edit forms, needs rework */
-    if(($dependent['#parents'][0] ?? FALSE) === 'form') {
+    /** @todo This is required for inline_entity_form forms to make conditions
+     * work in edit entity forms, maybe a better solution can be found? */
+    if (($dependent['#parents'][0] ?? FALSE) === 'form') {
       array_shift($dependent['#parents']);
     }
-    if(($dependee['#parents'][0] ?? FALSE) === 'form') {
+    if (($dependee['#parents'][0] ?? FALSE) === 'form') {
       array_shift($dependee['#parents']);
     }

--
GitLab


From b9a66632b90486204c51f2560b771c612eca3f28 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Fri, 13 May 2022 10:23:33 +0000
Subject: [PATCH 10/16] Replace post-copying the final array to reference

---
 src/ConditionalFieldsElementAlterHelper.php | 9 +--------
 1 file changed, 1 insertion(+), 8 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 8888614..6f621a9 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -60,14 +60,13 @@ class ConditionalFieldsElementAlterHelper {

         // Detect if this element is located inside inline_entity_form.
         if (in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
-          $inline_entity_form_mode = TRUE;
           // We need to find last embedded inline_entity_form, but array_search can search only first.
           $inline_entity_form_level = count($field['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($field['#array_parents']), TRUE);
           $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);

           $main_form = &$form_state->getCompleteForm();

-          $form = NestedArray::getValue($main_form, $inline_entity_form_path);
+          $form = &NestedArray::getValue($main_form, $inline_entity_form_path);

           $field_name = $field['#array_parents'][$inline_entity_form_level + 1] ?? FALSE;

@@ -128,12 +127,6 @@ class ConditionalFieldsElementAlterHelper {
             }
           }
         }
-
-        if ($inline_entity_form_mode && isset($form['#conditional_fields'])) {
-          // Copy inline_entity_form changes to parent form.
-          NestedArray::setValue($main_form, $inline_entity_form_path, $form);
-        }
-
       }
     }

--
GitLab


From b7acdeb4cc162720dae2d6fe3d60fc842fde8d95 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Fri, 13 May 2022 12:37:58 +0000
Subject: [PATCH 11/16] Fix some notices

---
 src/ConditionalFieldsElementAlterHelper.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index 6f621a9..e2de3ba 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -73,7 +73,7 @@ class ConditionalFieldsElementAlterHelper {
           $bundle = $form['#bundle'] ?? FALSE;
           $entity_type = $form['#entity_type'] ?? FALSE;

-          $field = $form[$field_name]['widget'] ?? $form[$field_name];
+          $field = $form[$field_name]['widget'] ?? $form[$field_name] ?? FALSE;

           // Remove outer forms from field parents arrays.
           $inline_entity_form_field_parents_level = count($form['#parents']);
@@ -273,7 +273,7 @@ class ConditionalFieldsElementAlterHelper {
       $dependent_parents = $dependent['#parents'];
       // If the field type is Date, we need to remove the last "date" parent key,
       // since it is not part of the $form_state value when we validate it.
-      if ($dependent['#type'] == 'date') {
+      if (($dependent['#type'] ?? FALSE) == 'date') {
         array_pop($dependent_parents);
       }
     }
--
GitLab


From 141a7489564f39fe7fcb2901c7a956a3c961fca4 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Mon, 16 May 2022 07:03:09 +0000
Subject: [PATCH 12/16] Cleanup redundant actions

---
 src/ConditionalFieldsElementAlterHelper.php | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index e2de3ba..a696baa 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -54,8 +54,6 @@ class ConditionalFieldsElementAlterHelper {

       $entity = $build_info['callback_object']->getEntity();

-      $inline_entity_form_mode = FALSE;
-
       if ($entity instanceof EntityInterface) {

         // Detect if this element is located inside inline_entity_form.
@@ -73,8 +71,6 @@ class ConditionalFieldsElementAlterHelper {
           $bundle = $form['#bundle'] ?? FALSE;
           $entity_type = $form['#entity_type'] ?? FALSE;

-          $field = $form[$field_name]['widget'] ?? $form[$field_name] ?? FALSE;
-
           // Remove outer forms from field parents arrays.
           $inline_entity_form_field_parents_level = count($form['#parents']);
           if (isset($field['#parents'])) {
--
GitLab


From 3c37f020808be778f29d9c19828e5e912d87b8ff Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Thu, 19 May 2022 06:26:40 +0000
Subject: [PATCH 13/16] Added server side validation to inline entity forms

---
 conditional_fields.module                     |   1 -
 src/ConditionalFieldsElementAlterHelper.php   |  48 ++------
 src/ConditionalFieldsFormHelper.php           | 114 ++++++++++++++++--
 .../handler/DefaultStateHandler.php           |   2 +-
 4 files changed, 116 insertions(+), 49 deletions(-)

diff --git a/conditional_fields.module b/conditional_fields.module
index e390f54..f2ccb4e 100644
--- a/conditional_fields.module
+++ b/conditional_fields.module
@@ -200,4 +200,3 @@ function conditional_fields_inline_entity_form_entity_form_alter(&$entity_form,
 function conditional_fields_form_after_build($form, &$form_state) {
   return \Drupal::service('conditional_fields.form_helper')->afterBuild($form, $form_state);
 }
-
diff --git a/src/ConditionalFieldsElementAlterHelper.php b/src/ConditionalFieldsElementAlterHelper.php
index a696baa..418468c 100644
--- a/src/ConditionalFieldsElementAlterHelper.php
+++ b/src/ConditionalFieldsElementAlterHelper.php
@@ -43,52 +43,30 @@ class ConditionalFieldsElementAlterHelper {
       return $element;
     }

+    $full_form = &$form_state->getCompleteForm();
+
     // Some fields do not have entity type and bundle properties.
     // In this case we try to use the properties from the form.
     // This is not an optimal solution, since in case of fields
     // in entities within entities they might not correspond,
     // and their dependencies will not be loaded.
     $build_info = $form_state->getBuildInfo();
-
     if (method_exists($build_info['callback_object'], 'getEntity')) {
-
       $entity = $build_info['callback_object']->getEntity();
-
       if ($entity instanceof EntityInterface) {
-
         // Detect if this element is located inside inline_entity_form.
-        if (in_array('inline_entity_form', $field['#array_parents'], TRUE)) {
-          // We need to find last embedded inline_entity_form, but array_search can search only first.
-          $inline_entity_form_level = count($field['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($field['#array_parents']), TRUE);
-          $inline_entity_form_path = array_slice($field['#array_parents'], 0, $inline_entity_form_level + 1);
+        if ($inline_entity_form_parents = ConditionalFieldsFormHelper::findInlineEntityFormParentsForElement($full_form, $field)) {
+          $form = &NestedArray::getValue($full_form, $inline_entity_form_parents['element_parents']);

-          $main_form = &$form_state->getCompleteForm();
-
-          $form = &NestedArray::getValue($main_form, $inline_entity_form_path);
-
-          $field_name = $field['#array_parents'][$inline_entity_form_level + 1] ?? FALSE;
+          // Remove outer forms from field parents arrays.
+          $field = ConditionalFieldsFormHelper::fieldRemoveInlineEntityFormParents($field, $inline_entity_form_parents);

           $bundle = $form['#bundle'] ?? FALSE;
           $entity_type = $form['#entity_type'] ?? FALSE;
-
-          // Remove outer forms from field parents arrays.
-          $inline_entity_form_field_parents_level = count($form['#parents']);
-          if (isset($field['#parents'])) {
-            $field['#parents'] = array_slice($field['#parents'], $inline_entity_form_field_parents_level);
-          }
-          if (isset($field['#array_parents'])) {
-            $field['#array_parents'] = array_slice($field['#array_parents'], $inline_entity_form_level + 1);
-          }
-          if (isset($field['#field_parents'])) {
-            $field['#field_parents'] = array_slice($field['#field_parents'], $inline_entity_form_level);
-          }
         }

         else {
-          $form = &$form_state->getCompleteForm();
-
-          $field_name = reset($field['#array_parents']);
-
+          $form = &$full_form;
           $bundle = $entity->bundle();
           $entity_type = $entity->getEntityTypeId();

@@ -107,6 +85,7 @@ class ConditionalFieldsElementAlterHelper {
           return $element;
         }

+        $field_name = reset($field['#array_parents']);
         // Attach dependent.
         if (isset($dependencies['dependents'][$field_name])) {
           foreach ($dependencies['dependents'][$field_name] as $id => $dependency) {
@@ -244,15 +223,6 @@ class ConditionalFieldsElementAlterHelper {
       }
     }

-    /** @todo This is required for inline_entity_form forms to make conditions
-     * work in edit entity forms, maybe a better solution can be found? */
-    if (($dependent['#parents'][0] ?? FALSE) === 'form') {
-      array_shift($dependent['#parents']);
-    }
-    if (($dependee['#parents'][0] ?? FALSE) === 'form') {
-      array_shift($dependee['#parents']);
-    }
-
     // Attach dependee.
     // Use the #array_parents property of the dependee instead of #field_parents
     // since we will need access to the full structure of the widget.
@@ -269,7 +239,7 @@ class ConditionalFieldsElementAlterHelper {
       $dependent_parents = $dependent['#parents'];
       // If the field type is Date, we need to remove the last "date" parent key,
       // since it is not part of the $form_state value when we validate it.
-      if (($dependent['#type'] ?? FALSE) == 'date') {
+      if ($dependent['#type'] == 'date') {
         array_pop($dependent_parents);
       }
     }
diff --git a/src/ConditionalFieldsFormHelper.php b/src/ConditionalFieldsFormHelper.php
index 5452a5c..5a50fec 100644
--- a/src/ConditionalFieldsFormHelper.php
+++ b/src/ConditionalFieldsFormHelper.php
@@ -395,18 +395,29 @@ class ConditionalFieldsFormHelper {
    * @see \Drupal\conditional_fields\ConditionalFieldsFormHelper::formValidate()
    */
   public static function dependentValidate($element, FormStateInterface &$form_state, $form) {
+    $inline_entity_form_parents = self::findInlineEntityFormParentsForElement($form, $element);
+    if ($inline_entity_form_parents) {
+      $form = NestedArray::getValue($form, $inline_entity_form_parents['element_parents']);
+    }
+
     if (!isset($form['#conditional_fields'])) {
       return;
     }

-    $dependent = $form['#conditional_fields'][reset($element['#array_parents'])];
+    if ($inline_entity_form_parents) {
+      $ief_element = self::fieldRemoveInlineEntityFormParents($element, $inline_entity_form_parents);
+      $dependent = $form['#conditional_fields'][reset($ief_element['#array_parents'])];
+    }
+    else {
+      $dependent = $form['#conditional_fields'][reset($element['#array_parents'])];
+    }

     // Check if this field's dependencies were triggered.
-    $triggered = self::evaluateDependencies($dependent, $form, $form_state);
+    $triggered = self::evaluateDependencies($dependent, $form, $form_state, TRUE, $inline_entity_form_parents);
     $return = FALSE;

     // @todo Refactor this!
-    if ($evaluated_dependencies = self::evaluateDependencies($dependent, $form, $form_state, FALSE)) {
+    if ($evaluated_dependencies = self::evaluateDependencies($dependent, $form, $form_state, FALSE, $inline_entity_form_parents)) {
       foreach ($evaluated_dependencies[reset($dependent['field_parents'])] as $operator) {
         foreach ($operator as $state => $result) {
           if (($result && $state == 'visible' && $triggered) || (!$result && $state == '!visible' && !$triggered)) {
@@ -415,7 +426,8 @@ class ConditionalFieldsFormHelper {
           if (($result && $state == 'required' && $triggered) || (!$result && $state == '!required' && !$triggered)) {
             $return = TRUE;
             $key_exists = NULL;
-            $input_state = NestedArray::getValue($form_state->getValues(), $dependent['field_parents'], $key_exists);
+            $form_state_values = self::getFormStateValuesByPath($form_state, $inline_entity_form_parents['form_parents'] ?? NULL);
+            $input_state = NestedArray::getValue($form_state_values, $dependent['field_parents'], $key_exists);
             if ($key_exists && !is_object($input_state) && isset($input_state['add_more'])) {
               // Remove the 'value' of the 'add more' button.
               unset($input_state['add_more']);
@@ -506,7 +518,7 @@ class ConditionalFieldsFormHelper {
    * @return array|bool
    *   Evaluated dependencies array.
    */
-  protected static function evaluateDependencies(array $dependent, array $form, FormStateInterface $form_state, $grouping = TRUE) {
+  protected static function evaluateDependencies(array $dependent, array $form, FormStateInterface $form_state, $grouping = TRUE, $inline_entity_form_parents = NULL) {
     $dependencies = $form['#conditional_fields'][reset($dependent['field_parents'])]['dependees'];
     $evaluated_dependees = [];

@@ -527,7 +539,7 @@ class ConditionalFieldsFormHelper {
       // structure and use the parents only up to that depth.
       $dependee_parents_keys = array_flip($dependee_parents);
       $dependee_parent = NestedArray::getValue($form, array_slice($dependee_parents, 0, $dependee_parents_keys[$dependee]));
-      $values = self::formFieldGetValues($dependee_parent[$dependee], $form_state);
+      $values = self::formFieldGetValues($dependee_parent[$dependee], $form_state, $inline_entity_form_parents);
       if (isset($values['value']) && is_numeric($values['value'])) {
         $values = $values['value'];
       }
@@ -659,10 +671,14 @@ class ConditionalFieldsFormHelper {
    *   The requested field values parent. Actual field vales are stored under
    *   the key $element['#field_name'].
    */
-  protected static function formFieldGetValues($element, FormStateInterface $form_state) {
+  protected static function formFieldGetValues($element, FormStateInterface $form_state, $paths = NULL) {
     // Fall back to #parents to support custom dependencies.
     $parents = !empty($element['#array_parents']) ? $element['#array_parents'] : $element['#parents'];
-    return NestedArray::getValue($form_state->getValues(), $parents);
+    $form_state_values = self::getFormStateValuesByPath($form_state, $paths['form_parents']);
+    if ($paths) {
+      $parents = array_slice($parents, count($paths['element_parents']));
+    }
+    return NestedArray::getValue($form_state_values, $parents);
   }

   /**
@@ -919,4 +935,86 @@ class ConditionalFieldsFormHelper {
     return conditional_fields_field_selector($field);
   }

+  /**
+   * Finds and returns a deepest inline entity form path for the element.
+   *
+   * This is a helper function to search inline_entity_form subform in complex
+   * forms with one or several nested inline entity forms, where the element is
+   * directly located, and return path to that subform.
+   *
+   * @param array $form
+   *   A full form to search inline_entity_form subforms.
+   * @param array $element
+   *   An element of the form to search the direct form of which.
+   *
+   * @return false|array
+   *   The array containing the necessary params.
+   *   $result = [
+   *    'form_parents' => (array) The array of form parents.
+   *    'element_parents' => (array) The array element parents fot the subform.
+   *   ]
+   */
+  public static function findInlineEntityFormParentsForElement($form, $element) {
+    if (!in_array('inline_entity_form', $element['#array_parents'], TRUE)) {
+      return FALSE;
+    }
+
+    // We need to find last embedded inline_entity_form, but array_search can search only first.
+    $inline_entity_form_level = count($element['#array_parents']) - 1 - array_search('inline_entity_form', array_reverse($element['#array_parents']), TRUE);
+    $result['element_parents'] = array_slice($element['#array_parents'], 0, $inline_entity_form_level + 1);
+
+    $inline_entity_form = &NestedArray::getValue($form, $result['element_parents']);
+    $result['form_parents'] = $inline_entity_form['#parents'];
+
+    return $result;
+  }
+
+  /**
+   * Removes the parents form elements in nested inline_entity_form forms.
+   *
+   * This is a helper function to search inline_entity_form subform in complex
+   * forms with one or several nested inline entity forms, where the element is
+   * directly located, and return path to that subform.
+   *
+   * @param array $element
+   *   An element of a form.
+   * @param array $inline_entity_form_parents
+   *   Paths of the inline_entity_form, the result of the function
+   *   findInlineEntityFormParentsForElement()
+   *
+   * @return array
+   *   The element with removed parents of outer forms.
+   */
+  public static function fieldRemoveInlineEntityFormParents(array $element, array $inline_entity_form_parents) {
+    if (isset($element['#parents'])) {
+      $element['#parents'] = array_slice($element['#parents'], count($inline_entity_form_parents['form_parents']));
+    }
+    if (isset($element['#array_parents'])) {
+      $element['#array_parents'] = array_slice($element['#array_parents'], count($inline_entity_form_parents['element_parents']));
+    }
+    if (isset($element['#field_parents'])) {
+      $element['#field_parents'] = array_slice($element['#field_parents'], count($inline_entity_form_parents['element_parents']));
+    }
+    return $element;
+  }
+
+  /**
+   * Returns the nested form state values by array of parents.
+   *
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The FormState object.
+   * @param array $parents
+   *   The array of parent elements for the form.
+   *
+   * @return array
+   *   The values of the form by path.
+   */
+  public static function getFormStateValuesByPath(FormStateInterface $form_state, $parents = NULL) {
+    $form_state_values = $form_state->getValues();
+    if (is_array($parents)) {
+      $form_state_values = NestedArray::getValue($form_state_values, $parents);
+    }
+    return $form_state_values;
+  }
+
 }
diff --git a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
index d8415ee..39d2290 100644
--- a/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
+++ b/src/Plugin/conditional_fields/handler/DefaultStateHandler.php
@@ -28,7 +28,7 @@ class DefaultStateHandler extends ConditionalFieldsHandlerBase {
         /** @todo This change fixes problem within inline_entity_form fields.
          * `[$options['condition']]` is removed because 'value_form' already
          * contain condition name as key.
-         * But this need to be retested on not breaking any previous functional.
+         * But this need to be retested not to break any previous functionality.
          */
         // $values[$options['condition']] = $options['value_form'];
         $values = $options['value_form'];
--
GitLab


From e2b13145d3999001a2ea8af5908896b85d9d1024 Mon Sep 17 00:00:00 2001
From: Alexey Murz Korepov <MurzNN@gmail.com>
Date: Fri, 20 May 2022 06:10:22 +0000
Subject: [PATCH 14/16] Remove some notices

---
 src/ConditionalFieldsFormHelper.php | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/ConditionalFieldsFormHelper.php b/src/ConditionalFieldsFormHelper.php
index 5a50fec..9432038 100644
--- a/src/ConditionalFieldsFormHelper.php
+++ b/src/ConditionalFieldsFormHelper.php
@@ -603,6 +603,9 @@ class ConditionalFieldsFormHelper {
     foreach ($form_state->getValue('conditional_fields_untriggered_dependents') as $field) {
       $parent = [$field['parents'][0]];
       $dependent = NestedArray::getValue($form, $parent);
+      if (!$dependent) {
+        continue;
+      }
       $field_values_location = self::formFieldGetValues($dependent, $form_state);

       $dependent_field_name = reset($dependent['#array_parents']);
@@ -674,7 +677,7 @@ class ConditionalFieldsFormHelper {
   protected static function formFieldGetValues($element, FormStateInterface $form_state, $paths = NULL) {
     // Fall back to #parents to support custom dependencies.
     $parents = !empty($element['#array_parents']) ? $element['#array_parents'] : $element['#parents'];
-    $form_state_values = self::getFormStateValuesByPath($form_state, $paths['form_parents']);
+    $form_state_values = self::getFormStateValuesByPath($form_state, $paths['form_parents'] ?? []);
     if ($paths) {
       $parents = array_slice($parents, count($paths['element_parents']));
     }
--
GitLab


From cde1df81fa4c6766dd2208539396e5ec68526c88 Mon Sep 17 00:00:00 2001
From: lexsoft <lex.soft.0.0@gmail.com>
Date: Wed, 29 Jun 2022 11:15:07 +0100
Subject: [PATCH 15/16] Pass widget ID from ief display form mode

---
 conditional_fields.services.yml     |  2 +-
 src/ConditionalFieldsFormHelper.php | 24 +++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/conditional_fields.services.yml b/conditional_fields.services.yml
index 5f56636..c732cff 100644
--- a/conditional_fields.services.yml
+++ b/conditional_fields.services.yml
@@ -10,7 +10,7 @@ services:
     arguments: ['@entity_type.manager', '@form_builder', '@entity_type.bundle.info', '@entity_field.manager']
   conditional_fields.form_helper:
     class: Drupal\conditional_fields\ConditionalFieldsFormHelper
-    arguments: ['@plugin.manager.element_info', '@plugin.manager.conditional_fields_handlers']
+    arguments: ['@plugin.manager.element_info', '@plugin.manager.conditional_fields_handlers', '@entity_display.repository']
   conditional_fields.element_alter_helper:
     class: Drupal\conditional_fields\ConditionalFieldsElementAlterHelper
     arguments: []
diff --git a/src/ConditionalFieldsFormHelper.php b/src/ConditionalFieldsFormHelper.php
index 9432038..d75325a 100644
--- a/src/ConditionalFieldsFormHelper.php
+++ b/src/ConditionalFieldsFormHelper.php
@@ -4,6 +4,7 @@ namespace Drupal\conditional_fields;

 use Drupal\Component\Render\MarkupInterface;
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
 use Drupal\Core\Field\WidgetBase;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\field\Entity\FieldStorageConfig;
@@ -49,6 +50,13 @@ class ConditionalFieldsFormHelper {
    */
   protected $type;

+  /**
+   * The entity display repository.
+   *
+   * @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface
+   */
+  protected $entityDisplayRepository;
+
   /**
    * ConditionalFieldsFormHelper constructor.
    *
@@ -56,10 +64,13 @@ class ConditionalFieldsFormHelper {
    *   A form element information manager.
    * @param \Drupal\conditional_fields\ConditionalFieldsHandlersManager $type
    *   A manager for conditional fields handlers.
+   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
+   *   The entity display repository.
    */
-  public function __construct(ElementInfoManager $element_info, ConditionalFieldsHandlersManager $type) {
+  public function __construct(ElementInfoManager $element_info, ConditionalFieldsHandlersManager $type, EntityDisplayRepositoryInterface $entity_display_repository) {
     $this->elementInfo = $element_info;
     $this->type = $type;
+    $this->entityDisplayRepository = $entity_display_repository;
   }

   /**
@@ -265,6 +276,17 @@ class ConditionalFieldsFormHelper {
         $widget_id = $dependee_display['type'];
       }

+      // If inline entity form is used, pass the form mode for getFormDisplay
+      // and get the widget ID from field.
+      if(!isset($widget_id) && isset($dependee_form_field['#field_parents']) && in_array('inline_entity_form', $dependee_form_field['#field_parents'])){
+        $ief = $form_display->getComponent($dependee_form_field['#field_parents'][0]);
+        $ief_form_display = $this->entityDisplayRepository->getFormDisplay($dependee_form_field['#entity_type'], $dependee_form_field['#bundle'], $ief['settings']['form_mode']);
+        $ief_dependee_display =  $ief_form_display->getComponent($dependee);
+        if (is_array($ief_dependee_display) && array_key_exists('type', $ief_dependee_display)) {
+          $widget_id = $ief_dependee_display['type'];
+        }
+      }
+
       // @todo Use field cardinality instead of number of values that was
       // selected on manage dependency tab. As temporary solution put
       // cardinality in $options. Format of #states depend on field widget and
--
GitLab


From b01a12b33f02d8e356881f52383b86491b019be4 Mon Sep 17 00:00:00 2001
From: lexsoft <lex.soft.0.0@gmail.com>
Date: Wed, 29 Jun 2022 14:11:26 +0100
Subject: [PATCH 16/16] Fix - phpunit tests

---
 src/ConditionalFieldsFormHelper.php           |  2 +-
 .../Unit/ConditionalFieldsFormHelperTest.php  | 19 +++++++++++++------
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/src/ConditionalFieldsFormHelper.php b/src/ConditionalFieldsFormHelper.php
index d75325a..517d677 100644
--- a/src/ConditionalFieldsFormHelper.php
+++ b/src/ConditionalFieldsFormHelper.php
@@ -281,7 +281,7 @@ class ConditionalFieldsFormHelper {
       if(!isset($widget_id) && in_array('inline_entity_form', $dependee_form_field['#field_parents'])){
         $ief = $form_display->getComponent($dependee_form_field['#field_parents'][0]);
         $ief_form_display = $this->entityDisplayRepository->getFormDisplay($dependee_form_field['#entity_type'], $dependee_form_field['#bundle'], $ief['settings']['form_mode']);
-        $ief_dependee_display =  $ief_form_display->getComponent($dependee);
+        $ief_dependee_display = $ief_form_display->getComponent($dependee);
         if (is_array($ief_dependee_display) && array_key_exists('type', $ief_dependee_display)) {
           $widget_id = $ief_dependee_display['type'];
         }
diff --git a/tests/src/Unit/ConditionalFieldsFormHelperTest.php b/tests/src/Unit/ConditionalFieldsFormHelperTest.php
index cbacd99..4ab8594 100644
--- a/tests/src/Unit/ConditionalFieldsFormHelperTest.php
+++ b/tests/src/Unit/ConditionalFieldsFormHelperTest.php
@@ -4,6 +4,7 @@ namespace Drupal\Tests\conditional_fields\Unit;

 use Drupal\conditional_fields\ConditionalFieldsFormHelper;
 use Drupal\conditional_fields\ConditionalFieldsHandlersManager;
+use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Render\ElementInfoManager;
 use Drupal\node\NodeForm;
@@ -25,7 +26,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $sutClass->effects = [];
@@ -49,7 +51,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $sutClass->effects = ['some_effect'];
@@ -76,7 +79,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $formState = $this->createMock(FormState::class);
@@ -168,7 +172,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $sutClass->form = ['#conditional_fields' => []];
@@ -193,7 +198,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $sutClass->form = ['#conditional_fields' => ['test' => 'test']];
@@ -219,7 +225,8 @@ class ConditionalFieldsFormHelperTest extends UnitTestCase {
     // Create an instance of the class we are testing.
     $elementInfo = $this->createMock(ElementInfoManager::class);
     $cfHandlersManager = $this->createMock(ConditionalFieldsHandlersManager::class);
-    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager);
+    $entityDisplayRepository = $this->createMock(EntityDisplayRepositoryInterface::class);
+    $sutClass = new ConditionalFieldsFormHelper($elementInfo, $cfHandlersManager, $entityDisplayRepository);

     // Set up fixtures.
     $sutClass->form = ['#conditional_fields' => ['test' => 'test']];
--
GitLab
