From 78cea9a2e1efe2b6bf09e805a85bf0f28d5cb94c Mon Sep 17 00:00:00 2001
From: Justin Toupin <justin@atendesigngroup.com>
Date: Wed, 17 Feb 2021 10:56:57 -0700
Subject: [PATCH] added append method. improved layout select css. adding
 layout plugin form.

---
 css/layout-select.css                         | 20 +++++-----
 src/LayoutParagraphsLayout.php                | 13 +++++++
 .../Behavior/LayoutParagraphsBehavior.php     | 37 ++++++++++++++++++-
 3 files changed, 60 insertions(+), 10 deletions(-)

diff --git a/css/layout-select.css b/css/layout-select.css
index 0db8be5a..7d1b2363 100644
--- a/css/layout-select.css
+++ b/css/layout-select.css
@@ -3,21 +3,23 @@
   flex-wrap: wrap;
   justify-content: flex-start;
 }
-.layout-select__item label {
-  display: flex;
-  flex: 1 0 21%;
+.layout-select__item {
+  flex: 0 1 150px;
+  margin-right: 10px;
 }
-.layout-select__item input[type=radio] {
-  position: absolute;
-  opacity: 0;
+.layout-select__item label.option {
+  display: flex;
+  padding: 10px;
+  outline: 1px solid #ccc;
 }
 .layout-select__item input:checked + label {
-  outline: 1px solid blue;
-  padding: 10px;
+  outline: 2px solid blue;
+  transition: .1s all;
+  font-weight: bold;
 }
 .layout-select__item-icon {
   margin-right: 10px;
 }
-.layout-select__item-icon svg {
+.layout-select .layout-select__item-icon svg {
   display: block;
 }
\ No newline at end of file
diff --git a/src/LayoutParagraphsLayout.php b/src/LayoutParagraphsLayout.php
index 4b3514ca..2c238471 100644
--- a/src/LayoutParagraphsLayout.php
+++ b/src/LayoutParagraphsLayout.php
@@ -333,6 +333,19 @@ class LayoutParagraphsLayout {
     return $this;
   }
 
+  /**
+   * Append a new component.
+   *
+   * @param \Drupal\paragraphs\Entity\Paragraph $new_paragraph
+   *   The paragraph component to append.
+   *
+   * @return $this
+   */
+  public function appendComponent(Paragraph $new_paragraph) {
+    $this->entity->{$this->fieldName}->appendItem(['entity' => $new_paragraph]);
+    return $this;
+  }
+
   /**
    * Delete a component.
    *
diff --git a/src/Plugin/paragraphs/Behavior/LayoutParagraphsBehavior.php b/src/Plugin/paragraphs/Behavior/LayoutParagraphsBehavior.php
index 0e45c3c0..e613bcce 100644
--- a/src/Plugin/paragraphs/Behavior/LayoutParagraphsBehavior.php
+++ b/src/Plugin/paragraphs/Behavior/LayoutParagraphsBehavior.php
@@ -13,6 +13,9 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\layout_paragraphs\LayoutParagraphsSection;
 use Drupal\layout_paragraphs\LayoutParagraphsService;
+use Drupal\Core\Layout\LayoutInterface;
+use Drupal\Core\Plugin\PluginWithFormsInterface;
+use Drupal\Core\Plugin\PluginFormInterface;
 
 /**
  * Provides a way to define grid based layouts.
@@ -112,14 +115,20 @@ class LayoutParagraphsBehavior extends ParagraphsBehaviorBase {
   ) {
 
     $layout_paragraphs_section = new LayoutParagraphsSection($paragraph);
+    $layout_settings = $layout_paragraphs_section->getSettings();
     $available_layouts = $this->configuration['available_layouts'];
+    $layout_id = $layout_paragraphs_section->getLayoutId();
+    $default_value = $layout_id ? $layout_id : key($available_layouts);
+    $plugin_instance = $this->layoutPluginManager->createInstance($default_value, $layout_settings);
+    $plugin_form = $this->getLayoutPluginForm($plugin_instance);
 
     $form['layout'] = [
       '#title' => $this->t('Choose a layout:'),
       '#type' => 'layout_select',
       '#options' => $available_layouts,
-      '#default_value' => $layout_paragraphs_section->getLayoutId(),
+      '#default_value' => $default_value,
     ];
+
     return $form;
   }
 
@@ -187,4 +196,30 @@ class LayoutParagraphsBehavior extends ParagraphsBehaviorBase {
     }
   }
 
+  /**
+   * Retrieves the plugin form for a given layout.
+   *
+   * @param \Drupal\Core\Layout\LayoutInterface $layout
+   *   The layout plugin.
+   *
+   * @return \Drupal\Core\Plugin\PluginFormInterface|null
+   *   The plugin form for the layout.
+   */
+  protected function getLayoutPluginForm(LayoutInterface $layout) {
+    if ($layout instanceof PluginWithFormsInterface) {
+      try {
+        return $this->pluginFormFactory->createInstance($layout, 'configure');
+      }
+      catch (\Exception $e) {
+        $this->loggerFactory->get('layout_paragraphs')->error('Erl, Layout Configuration', $e);
+      }
+    }
+
+    if ($layout instanceof PluginFormInterface) {
+      return $layout;
+    }
+
+    return NULL;
+  }
+
 }
-- 
GitLab