From 9f61972e0ac6d30c64c6ab93f5cfe8029536f51a Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Sat, 7 Apr 2018 08:43:49 +0100
Subject: [PATCH] Issue #2896535 by timmillwood, tedbow: Create a helper trait
 for Forms in ajax dialogs

---
 .../Drupal/Core/Ajax}/AjaxFormHelperTrait.php |  7 +--
 .../Drupal/Core/Ajax}/AjaxHelperTrait.php     | 16 +++---
 .../src/Controller/AddSectionController.php   |  1 +
 .../src/Controller/ChooseBlockController.php  |  1 +
 .../Controller/ChooseSectionController.php    |  1 +
 .../src/Form/ConfigureBlockFormBase.php       |  1 +
 .../src/Form/ConfigureSectionForm.php         |  1 +
 .../src/Form/LayoutRebuildConfirmFormBase.php |  1 +
 .../src/Block/BlockEntitySettingTrayForm.php  | 55 ++++++-------------
 9 files changed, 32 insertions(+), 52 deletions(-)
 rename core/{modules/layout_builder/src/Form => lib/Drupal/Core/Ajax}/AjaxFormHelperTrait.php (86%)
 rename core/{modules/layout_builder/src/Controller => lib/Drupal/Core/Ajax}/AjaxHelperTrait.php (68%)

diff --git a/core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php b/core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php
similarity index 86%
rename from core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php
rename to core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php
index a5a387020f9d..49932df548ac 100644
--- a/core/modules/layout_builder/src/Form/AjaxFormHelperTrait.php
+++ b/core/lib/Drupal/Core/Ajax/AjaxFormHelperTrait.php
@@ -1,18 +1,13 @@
 <?php
 
-namespace Drupal\layout_builder\Form;
+namespace Drupal\Core\Ajax;
 
-use Drupal\Core\Ajax\AjaxResponse;
-use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Form\FormStateInterface;
-use Drupal\layout_builder\Controller\AjaxHelperTrait;
 
 /**
  * Provides a helper to for submitting an AJAX form.
  *
  * @internal
- *
- * @todo Move to \Drupal\Core in https://www.drupal.org/node/2896535.
  */
 trait AjaxFormHelperTrait {
 
diff --git a/core/modules/layout_builder/src/Controller/AjaxHelperTrait.php b/core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php
similarity index 68%
rename from core/modules/layout_builder/src/Controller/AjaxHelperTrait.php
rename to core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php
index 072eccab352e..287abae3212a 100644
--- a/core/modules/layout_builder/src/Controller/AjaxHelperTrait.php
+++ b/core/lib/Drupal/Core/Ajax/AjaxHelperTrait.php
@@ -1,6 +1,6 @@
 <?php
 
-namespace Drupal\layout_builder\Controller;
+namespace Drupal\Core\Ajax;
 
 use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 
@@ -8,8 +8,6 @@
  * Provides a helper to determine if the current request is via AJAX.
  *
  * @internal
- *
- * @todo Move to \Drupal\Core in https://www.drupal.org/node/2896535.
  */
 trait AjaxHelperTrait {
 
@@ -20,12 +18,12 @@ trait AjaxHelperTrait {
    *   TRUE if the current request is via AJAX, FALSE otherwise.
    */
   protected function isAjax() {
-    return in_array($this->getRequestWrapperFormat(), [
-      'drupal_ajax',
-      'drupal_dialog',
-      'drupal_dialog.off_canvas',
-      'drupal_modal',
-    ]);
+    foreach (['drupal_ajax', 'drupal_modal', 'drupal_dialog'] as $wrapper) {
+      if (strpos($this->getRequestWrapperFormat(), $wrapper) !== FALSE) {
+        return TRUE;
+      }
+    }
+    return FALSE;
   }
 
   /**
diff --git a/core/modules/layout_builder/src/Controller/AddSectionController.php b/core/modules/layout_builder/src/Controller/AddSectionController.php
index 947895985cf1..0ea42379a6be 100644
--- a/core/modules/layout_builder/src/Controller/AddSectionController.php
+++ b/core/modules/layout_builder/src/Controller/AddSectionController.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder\Controller;
 
+use Drupal\Core\Ajax\AjaxHelperTrait;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\layout_builder\LayoutTempstoreRepositoryInterface;
diff --git a/core/modules/layout_builder/src/Controller/ChooseBlockController.php b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
index 5287be25fcff..85ea7d83709a 100644
--- a/core/modules/layout_builder/src/Controller/ChooseBlockController.php
+++ b/core/modules/layout_builder/src/Controller/ChooseBlockController.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder\Controller;
 
+use Drupal\Core\Ajax\AjaxHelperTrait;
 use Drupal\Core\Block\BlockManagerInterface;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Url;
diff --git a/core/modules/layout_builder/src/Controller/ChooseSectionController.php b/core/modules/layout_builder/src/Controller/ChooseSectionController.php
index a04cdbb1c116..488480883d57 100644
--- a/core/modules/layout_builder/src/Controller/ChooseSectionController.php
+++ b/core/modules/layout_builder/src/Controller/ChooseSectionController.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder\Controller;
 
+use Drupal\Core\Ajax\AjaxHelperTrait;
 use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Layout\LayoutPluginManagerInterface;
 use Drupal\Core\Plugin\PluginFormInterface;
diff --git a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
index e1103e9e44bb..ccef12287db9 100644
--- a/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
+++ b/core/modules/layout_builder/src/Form/ConfigureBlockFormBase.php
@@ -3,6 +3,7 @@
 namespace Drupal\layout_builder\Form;
 
 use Drupal\Component\Uuid\UuidInterface;
+use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\Block\BlockManagerInterface;
 use Drupal\Core\Block\BlockPluginInterface;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
diff --git a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
index 2bfcdca7c2df..94c2a4eb4c2b 100644
--- a/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
+++ b/core/modules/layout_builder/src/Form/ConfigureSectionForm.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder\Form;
 
+use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Form\FormBase;
 use Drupal\Core\Form\FormStateInterface;
diff --git a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
index 511a11968e3e..2a44a290d0a5 100644
--- a/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
+++ b/core/modules/layout_builder/src/Form/LayoutRebuildConfirmFormBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\layout_builder\Form;
 
+use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Form\ConfirmFormBase;
 use Drupal\Core\Form\FormStateInterface;
diff --git a/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php b/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php
index fd44b0c86aa8..243e907ccd3f 100644
--- a/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php
+++ b/core/modules/settings_tray/src/Block/BlockEntitySettingTrayForm.php
@@ -5,9 +5,9 @@
 use Drupal\block\BlockForm;
 use Drupal\block\BlockInterface;
 use Drupal\Component\Utility\Html;
+use Drupal\Core\Ajax\AjaxFormHelperTrait;
 use Drupal\Core\Ajax\AjaxResponse;
 use Drupal\Core\Ajax\RedirectCommand;
-use Drupal\Core\Ajax\ReplaceCommand;
 use Drupal\Core\Block\BlockPluginInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\PluginWithFormsInterface;
@@ -23,6 +23,8 @@
  */
 class BlockEntitySettingTrayForm extends BlockForm {
 
+  use AjaxFormHelperTrait;
+
   /**
    * Provides a title callback to get the block's admin label.
    *
@@ -122,17 +124,17 @@ protected function getPluginForm(BlockPluginInterface $block) {
   public function buildForm(array $form, FormStateInterface $form_state) {
     $form = parent::buildForm($form, $form_state);
     $form['actions']['submit']['#ajax'] = [
-      'callback' => '::submitFormDialog',
+      'callback' => '::ajaxSubmit',
     ];
     $form['#attached']['library'][] = 'core/drupal.dialog.ajax';
 
-    // static::submitFormDialog() requires data-drupal-selector to be the same
-    // between the various Ajax requests. A bug in
-    // \Drupal\Core\Form\FormBuilder prevents that from happening unless
-    // $form['#id'] is also the same. Normally, #id is set to a unique HTML ID
-    // via Html::getUniqueId(), but here we bypass that in order to work around
-    // the data-drupal-selector bug. This is okay so long as we assume that this
-    // form only ever occurs once on a page.
+    // static::ajaxSubmit() requires data-drupal-selector to be the same between
+    // the various Ajax requests. A bug in \Drupal\Core\Form\FormBuilder
+    // prevents that from happening unless $form['#id'] is also the same.
+    // Normally, #id is set to a unique HTML ID via Html::getUniqueId(), but
+    // here we bypass that in order to work around the data-drupal-selector bug.
+    // This is okay so long as we assume that this form only ever occurs once on
+    // a page.
     // @todo Remove this workaround once https://www.drupal.org/node/2897377 is
     //   fixed.
     $form['#id'] = Html::getId($form_state->getBuildInfo()['form_id']);
@@ -141,38 +143,17 @@ public function buildForm(array $form, FormStateInterface $form_state) {
   }
 
   /**
-   * Submit form dialog #ajax callback.
-   *
-   * @param array $form
-   *   An associative array containing the structure of the form.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The current state of the form.
-   *
-   * @return \Drupal\Core\Ajax\AjaxResponse
-   *   An AJAX response that display validation error messages or redirects
-   *   to a URL
-   *
-   * @todo Repalce this callback with generic trait in
-   *   https://www.drupal.org/node/2896535.
+   * {@inheritdoc}
    */
-  public function submitFormDialog(array &$form, FormStateInterface $form_state) {
-    $response = new AjaxResponse();
-    if ($form_state->hasAnyErrors()) {
-      $form['status_messages'] = [
-        '#type' => 'status_messages',
-        '#weight' => -1000,
-      ];
-      $command = new ReplaceCommand('[data-drupal-selector="' . $form['#attributes']['data-drupal-selector'] . '"]', $form);
+  protected function successfulAjaxSubmit(array $form, FormStateInterface $form_state) {
+    if ($redirect_url = $this->getRedirectUrl()) {
+      $command = new RedirectCommand($redirect_url->setAbsolute()->toString());
     }
     else {
-      if ($redirect_url = $this->getRedirectUrl()) {
-        $command = new RedirectCommand($redirect_url->setAbsolute()->toString());
-      }
-      else {
-        // Settings Tray always provides a destination.
-        throw new \Exception("No destination provided by Settings Tray form");
-      }
+      // Settings Tray always provides a destination.
+      throw new \Exception("No destination provided by Settings Tray form");
     }
+    $response = new AjaxResponse();
     return $response->addCommand($command);
   }
 
-- 
GitLab