From 887b75d5d9dd3aa2ced8c4fc5d48e139a8a57b9e Mon Sep 17 00:00:00 2001
From: Antonio De Marco <antonio@nuvole.org>
Date: Wed, 30 Aug 2017 10:18:25 +0200
Subject: [PATCH] #118: Add basic variant form.

---
 .../templates/button/button.ui_patterns.yml       |  4 ++++
 src/Definition/PatternDefinition.php              | 11 +++++++++++
 src/Form/PatternDisplayFormTrait.php              | 15 +++++++++++++++
 3 files changed, 30 insertions(+)

diff --git a/modules/ui_patterns_test/templates/button/button.ui_patterns.yml b/modules/ui_patterns_test/templates/button/button.ui_patterns.yml
index bfcaad116..a3ffdeded 100644
--- a/modules/ui_patterns_test/templates/button/button.ui_patterns.yml
+++ b/modules/ui_patterns_test/templates/button/button.ui_patterns.yml
@@ -1,6 +1,10 @@
 button:
   label: Button
   description: A simple button.
+  variants:
+    default: Default
+    primary: Primary
+    error: Error
   fields:
     title:
       type: text
diff --git a/src/Definition/PatternDefinition.php b/src/Definition/PatternDefinition.php
index 1c5acd6ef..287164325 100644
--- a/src/Definition/PatternDefinition.php
+++ b/src/Definition/PatternDefinition.php
@@ -64,6 +64,7 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin
 
     $this->id = $this->definition['id'];
     $this->setFields($this->definition['fields']);
+    $this->setVariants($this->definition['variants']);
     $this->setThemeHook(self::PATTERN_PREFIX . $this->id());
 
     if (!empty($definition['theme hook'])) {
@@ -225,6 +226,16 @@ class PatternDefinition extends PluginDefinition implements DerivablePluginDefin
     return $this;
   }
 
+  /**
+   * Check whereas pattern has variants.
+   *
+   * @return bool
+   *   Whereas pattern has variants.
+   */
+  public function hasVariants() {
+    return !empty($this->definition['variants']);
+  }
+
   /**
    * Getter.
    *
diff --git a/src/Form/PatternDisplayFormTrait.php b/src/Form/PatternDisplayFormTrait.php
index ce39eb8bd..d43377488 100644
--- a/src/Form/PatternDisplayFormTrait.php
+++ b/src/Form/PatternDisplayFormTrait.php
@@ -40,9 +40,24 @@ trait PatternDisplayFormTrait {
       '#attributes' => ['id' => 'patterns-select'],
     ];
 
+    /** @var \Drupal\ui_patterns\Definition\PatternDefinition $definition */
     foreach ($this->patternsManager->getDefinitions() as $pattern_id => $definition) {
+      if ($definition->hasVariants()) {
+        $form['pattern_variants'] = [
+          '#type' => 'select',
+          '#title' => $this->t('Variants'),
+          '#options' => $definition->getVariantsAsOptions(),
+          '#weight' => 0,
+          '#states' => [
+            'visible' => [
+              'select[id="patterns-select"]' => ['value' => $pattern_id],
+            ],
+          ],
+        ];
+      }
       $form['pattern_mapping'][$pattern_id] = [
         '#type' => 'container',
+        '#weight' => 1,
         '#states' => [
           'visible' => [
             'select[id="patterns-select"]' => ['value' => $pattern_id],
-- 
GitLab