From 78b25a35f7661db66306f9b7e1258ce4eb25b387 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 24 Nov 2019 19:16:14 +0100 Subject: [PATCH 01/11] Add allow binding property. --- src/Definition/PatternDefinitionSetting.php | 26 +++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Definition/PatternDefinitionSetting.php b/src/Definition/PatternDefinitionSetting.php index 0921257..420a895 100644 --- a/src/Definition/PatternDefinitionSetting.php +++ b/src/Definition/PatternDefinitionSetting.php @@ -28,6 +28,7 @@ class PatternDefinitionSetting implements \ArrayAccess { 'forced_value' => NULL, 'options' => NULL, 'form_visible' => TRUE, + 'allow_binding' => FALSE, ]; /** @@ -39,6 +40,7 @@ public function __construct($name, $value) { $this->definition['label'] = $value; $this->definition['type'] = 'textfield'; $this->definition['preview'] = NULL; + $this->definition['allow_binding'] = FALSE; } else { $this->definition['name'] = !isset($value['name']) ? $name : $value['name']; @@ -47,6 +49,7 @@ public function __construct($name, $value) { $this->definition['default_value'] = isset($value['default_value']) ? $value['default_value'] : NULL; $this->definition['preview'] = isset($value['preview']) ? $value['preview'] : NULL; $this->definition['options'] = isset($value['options']) ? $value['options'] : NULL; + $this->definition['allow_binding'] = isset($value['allow_binding']) ? $value['allow_binding'] : FALSE; $this->definition = $value + $this->definition; } } @@ -91,6 +94,16 @@ public function getRequired() { return $this->definition['required']; } + /** + * Get allow binding property. + * + * @return bool + * Property value. + */ + public function getAllowBinding() { + return $this->definition['allow_binding']; + } + /** * Get options array. * @@ -122,6 +135,19 @@ public function setDefaultValue($defaultValue) { return $this; } + /** + * Set allow binding value property. + * + * @param bool $allow_binding + * Property value. + * + * @return $this + */ + public function setAllowBinding($allow_binding) { + $this->definition['allow_binding'] = $allow_binding; + return $this; + } + /** * Get default value property. * From 67fe17995637125004dbc760680f1b23ec4b0b85 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Fri, 29 Nov 2019 16:26:01 +0100 Subject: [PATCH 02/11] Add initial token support. --- src/Form/SettingsFormBuilder.php | 7 ++- src/Plugin/PatternSettingTypeBase.php | 51 +++++++++++++++++++++- src/Plugin/PatternSettingTypeInterface.php | 4 +- 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 1b2d22e..d292d08 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -36,9 +36,14 @@ public static function layoutForm(array &$form, PatternDefinition $definition, a '#title' => t('Settings'), ]; } +<<<<<<< HEAD $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : NULL; +======= + $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : ""; + $binding_value = isset($configuration['pattern']['settings'][$key . "_binding"]) ? $configuration['pattern']['settings'][$key . "_binding"] : ""; +>>>>>>> Add initial token support. $settingType = UiPatternsSettings::createSettingType($setting); - $form['settings'] += $settingType->buildConfigurationForm([], $setting_value); + $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $binding_value); } SettingsFormBuilder::buildVariantsForm(".ui-patterns-variant-selector-" . $definition->id(), $form['settings'], $definition); } diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 7d7eef7..b0e9910 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -3,6 +3,7 @@ namespace Drupal\ui_patterns_settings\Plugin; use Drupal\Component\Plugin\ConfigurableInterface; +use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Plugin\PluginBase; use Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -12,6 +13,15 @@ */ abstract class PatternSettingTypeBase extends PluginBase implements ConfigurableInterface, PatternSettingTypeInterface { + /** + * Returns a list of all entity tokens. + * + * @var \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting + */ + protected function getTokens() { + + } + /** * Return pattern definitions for setting . * @@ -131,6 +141,44 @@ public function settingsPreprocess($value, array $context, PatternDefinitionSett return $value; } + /** + * Returns the bind form field. + * + * @param array $form + * The form definition array for the settings configuration form. + * @param string $value + * The stored default value. + * @param \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting $def + * The pattern definition. + * + * @return array + * The form. + */ + protected function bindForm(array $form, $value, PatternDefinitionSetting $def) { + $form[$def->getName() . "_binding"] = [ + '#type' => 'textfield', + '#title' => "Binding", + '#description' => $this->t("Binding for %label", ['%label' => $def->getLabel()]), + '#default_value' => $this->getValue($value), + '#required' => $def->getRequired(), + ]; + $entity_type_definations = \Drupal::entityTypeManager()->getDefinitions(); + /* @var $definition EntityTypeInterface */ + foreach ($entity_type_definations as $definition) { + if ($definition instanceof ContentEntityType) { + $content_entity_types[] = $definition->id(); + } + } + $form[$def->getName() . '_token'] = [ + '#theme' => 'token_tree_link', + '#token_types' => $content_entity_types, + '#show_restricted' => TRUE, + '#default_value' => $value, + '#weight' => 90, + ]; + return $form; + } + /** * {@inheritdoc} * @@ -142,9 +190,10 @@ public function settingsPreprocess($value, array $context, PatternDefinitionSett * * @see \Drupal\Core\Block\BlockBase::blockForm() */ - public function buildConfigurationForm(array $form, $value) { + public function buildConfigurationForm(array $form, $value, $binding_value) { $def = $this->getPatternSettingDefinition(); $form = $this->settingsForm($form, $value, $def); + $form = $this->bindForm($form, $binding_value, $def); return $form; } diff --git a/src/Plugin/PatternSettingTypeInterface.php b/src/Plugin/PatternSettingTypeInterface.php index 18d37b8..466e3cf 100644 --- a/src/Plugin/PatternSettingTypeInterface.php +++ b/src/Plugin/PatternSettingTypeInterface.php @@ -62,7 +62,9 @@ public function preprocess($value, array $context); * The form definition array for the settings configuration form. * @param string $value * The stored default value. + * @param string $binding_value + * The stored binding value. */ - public function buildConfigurationForm(array $form, $value); + public function buildConfigurationForm(array $form, $value, $binding_value); } From c103ac0b1bc8198b80d6e0c26e5db358644c6d6e Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 1 Dec 2019 00:40:41 +0100 Subject: [PATCH 03/11] Rename js variables from binding to token. --- js/ui_pattern_settings.toggle_token.js | 66 ++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 js/ui_pattern_settings.toggle_token.js diff --git a/js/ui_pattern_settings.toggle_token.js b/js/ui_pattern_settings.toggle_token.js new file mode 100644 index 0000000..453e328 --- /dev/null +++ b/js/ui_pattern_settings.toggle_token.js @@ -0,0 +1,66 @@ +/** + * @file + * JavaScript file for the UI Pattern settings module. + */ + +(function ($, Drupal, drupalSettings, DrupalCoffee) { + + 'use strict'; + + /** + * Attaches ui patterns settings module behaviors. + * + * Handles enable/disable bind input element. + * + * @type {Drupal~behavior} + * + * @prop {Drupal~behaviorAttach} attach + * Attach ui patterns settings toggle functionality to the page. + * + * @todo get most of it out of the behavior in dedicated functions. + */ + Drupal.behaviors.ups_toggle_token = { + attach: function () { + var disableClass = 'ui-pattern-settings-disable'; + + $('.ui-pattern-settings-token-wrapper').once().each(function () { + if ($(this).hasClass('ui-pattern-settings-token-has-value')) { + $(this).prev().addClass(disableClass); + } + else { + $(this).addClass(disableClass); + } + }); + + + $('.js-ui-patterns-settings-token').once().each(function () { + $(this).click(function () { + var tokenWrapper = $(this).closest('.ui-pattern-settings-token-wrapper'); + var tokenInput = tokenWrapper.find('input'); + var inputWrapper = tokenWrapper.prev(); + var initValue = tokenInput.val(); + + tokenWrapper.addClass(disableClass); + tokenInput.attr('data-init-val', initValue); + tokenInput.val(''); + inputWrapper.removeClass(disableClass); + }); + }); + + $('.js-ui-patterns-settings-input').once().each(function () { + $(this).click(function () { + var inputWrapper = $(this).closest('.js-form-item'); + var tokenWrapper = inputWrapper.next(); + inputWrapper.addClass(disableClass); + tokenWrapper.removeClass(disableClass); + var tokenInput = tokenWrapper.find('input'); + var restoreVal = tokenInput.attr('data-init-val'); + if (restoreVal != '') { + tokenInput.val(restoreVal); + } + }); + }) + } + }; + +})(jQuery, Drupal, drupalSettings); From 4295c5b3f85bcf91585e792bd156fb596fab8c1e Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sat, 19 Sep 2020 10:36:59 +0200 Subject: [PATCH 04/11] Rename allowBinding to allowToken. --- src/Definition/PatternDefinitionSetting.php | 16 ++++++++-------- src/Form/SettingsFormBuilder.php | 4 ---- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/Definition/PatternDefinitionSetting.php b/src/Definition/PatternDefinitionSetting.php index 420a895..0847246 100644 --- a/src/Definition/PatternDefinitionSetting.php +++ b/src/Definition/PatternDefinitionSetting.php @@ -28,7 +28,7 @@ class PatternDefinitionSetting implements \ArrayAccess { 'forced_value' => NULL, 'options' => NULL, 'form_visible' => TRUE, - 'allow_binding' => FALSE, + 'allow_token' => FALSE, ]; /** @@ -40,7 +40,7 @@ public function __construct($name, $value) { $this->definition['label'] = $value; $this->definition['type'] = 'textfield'; $this->definition['preview'] = NULL; - $this->definition['allow_binding'] = FALSE; + $this->definition['allow_token'] = FALSE; } else { $this->definition['name'] = !isset($value['name']) ? $name : $value['name']; @@ -49,7 +49,7 @@ public function __construct($name, $value) { $this->definition['default_value'] = isset($value['default_value']) ? $value['default_value'] : NULL; $this->definition['preview'] = isset($value['preview']) ? $value['preview'] : NULL; $this->definition['options'] = isset($value['options']) ? $value['options'] : NULL; - $this->definition['allow_binding'] = isset($value['allow_binding']) ? $value['allow_binding'] : FALSE; + $this->definition['allow_token'] = isset($value['allow_token']) ? $value['allow_token'] : FALSE; $this->definition = $value + $this->definition; } } @@ -100,8 +100,8 @@ public function getRequired() { * @return bool * Property value. */ - public function getAllowBinding() { - return $this->definition['allow_binding']; + public function getToken() { + return $this->definition['allow_token']; } /** @@ -138,13 +138,13 @@ public function setDefaultValue($defaultValue) { /** * Set allow binding value property. * - * @param bool $allow_binding + * @param bool $allow_token * Property value. * * @return $this */ - public function setAllowBinding($allow_binding) { - $this->definition['allow_binding'] = $allow_binding; + public function setAllowToken($allow_token) { + $this->definition['allow_token'] = $allow_token; return $this; } diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index d292d08..96a2a54 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -36,12 +36,8 @@ public static function layoutForm(array &$form, PatternDefinition $definition, a '#title' => t('Settings'), ]; } -<<<<<<< HEAD $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : NULL; -======= - $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : ""; $binding_value = isset($configuration['pattern']['settings'][$key . "_binding"]) ? $configuration['pattern']['settings'][$key . "_binding"] : ""; ->>>>>>> Add initial token support. $settingType = UiPatternsSettings::createSettingType($setting); $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $binding_value); } From 549dae697c396f35a03f671dc324f93f0c78fc0b Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sat, 19 Sep 2020 11:07:08 +0200 Subject: [PATCH 05/11] Rename binding to token. --- src/Definition/PatternDefinitionSetting.php | 4 ++-- src/Form/SettingsFormBuilder.php | 4 ++-- src/Plugin/PatternSettingTypeBase.php | 12 ++++++------ src/Plugin/PatternSettingTypeInterface.php | 6 +++--- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Definition/PatternDefinitionSetting.php b/src/Definition/PatternDefinitionSetting.php index 0847246..dc8a9f8 100644 --- a/src/Definition/PatternDefinitionSetting.php +++ b/src/Definition/PatternDefinitionSetting.php @@ -95,7 +95,7 @@ public function getRequired() { } /** - * Get allow binding property. + * Get allow token property. * * @return bool * Property value. @@ -136,7 +136,7 @@ public function setDefaultValue($defaultValue) { } /** - * Set allow binding value property. + * Set allow token value property. * * @param bool $allow_token * Property value. diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 96a2a54..e7a99dd 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -37,9 +37,9 @@ public static function layoutForm(array &$form, PatternDefinition $definition, a ]; } $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : NULL; - $binding_value = isset($configuration['pattern']['settings'][$key . "_binding"]) ? $configuration['pattern']['settings'][$key . "_binding"] : ""; + $token_value = isset($configuration['pattern']['settings'][$key . "_token"]) ? $configuration['pattern']['settings'][$key . "_token"] : ""; $settingType = UiPatternsSettings::createSettingType($setting); - $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $binding_value); + $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $token_value); } SettingsFormBuilder::buildVariantsForm(".ui-patterns-variant-selector-" . $definition->id(), $form['settings'], $definition); } diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index b0e9910..3a29e28 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -155,10 +155,10 @@ public function settingsPreprocess($value, array $context, PatternDefinitionSett * The form. */ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) { - $form[$def->getName() . "_binding"] = [ + $form[$def->getName() . "_token"] = [ '#type' => 'textfield', - '#title' => "Binding", - '#description' => $this->t("Binding for %label", ['%label' => $def->getLabel()]), + '#title' => "Token", + '#description' => $this->t("Token for %label", ['%label' => $def->getLabel()]), '#default_value' => $this->getValue($value), '#required' => $def->getRequired(), ]; @@ -169,7 +169,7 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) $content_entity_types[] = $definition->id(); } } - $form[$def->getName() . '_token'] = [ + $form[$def->getName() . '_token_link'] = [ '#theme' => 'token_tree_link', '#token_types' => $content_entity_types, '#show_restricted' => TRUE, @@ -190,10 +190,10 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) * * @see \Drupal\Core\Block\BlockBase::blockForm() */ - public function buildConfigurationForm(array $form, $value, $binding_value) { + public function buildConfigurationForm(array $form, $value, $token_value) { $def = $this->getPatternSettingDefinition(); $form = $this->settingsForm($form, $value, $def); - $form = $this->bindForm($form, $binding_value, $def); + $form = $this->bindForm($form, $token_value, $def); return $form; } diff --git a/src/Plugin/PatternSettingTypeInterface.php b/src/Plugin/PatternSettingTypeInterface.php index 466e3cf..837f7f2 100644 --- a/src/Plugin/PatternSettingTypeInterface.php +++ b/src/Plugin/PatternSettingTypeInterface.php @@ -62,9 +62,9 @@ public function preprocess($value, array $context); * The form definition array for the settings configuration form. * @param string $value * The stored default value. - * @param string $binding_value - * The stored binding value. + * @param string $token_value + * The stored token value. */ - public function buildConfigurationForm(array $form, $value, $binding_value); + public function buildConfigurationForm(array $form, $value, $token_value); } From ed487348da083d7873fd2163a4edee74d5676b92 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sat, 19 Sep 2020 12:46:45 +0200 Subject: [PATCH 06/11] Add inital toggle support. --- css/ui_patterns_settings.css | 0 js/ui_pattern_settings.toggle_token.js | 8 ++++---- runner.yml.dist | 3 +++ src/Definition/PatternDefinitionSetting.php | 2 +- src/Form/SettingsFormBuilder.php | 2 ++ src/Plugin/PatternSettingTypeBase.php | 17 ++++++++++++++--- .../templates/settings.ui_patterns.yml | 2 ++ ui_patterns_settings.libraries.yml | 12 ++++++++++++ 8 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 css/ui_patterns_settings.css create mode 100644 ui_patterns_settings.libraries.yml diff --git a/css/ui_patterns_settings.css b/css/ui_patterns_settings.css new file mode 100644 index 0000000..e69de29 diff --git a/js/ui_pattern_settings.toggle_token.js b/js/ui_pattern_settings.toggle_token.js index 453e328..2f8e832 100644 --- a/js/ui_pattern_settings.toggle_token.js +++ b/js/ui_pattern_settings.toggle_token.js @@ -21,10 +21,10 @@ */ Drupal.behaviors.ups_toggle_token = { attach: function () { - var disableClass = 'ui-pattern-settings-disable'; + var disableClass = 'ui-pattern-settings--disable'; - $('.ui-pattern-settings-token-wrapper').once().each(function () { - if ($(this).hasClass('ui-pattern-settings-token-has-value')) { + $('.ui-pattern-settings__token-wrapper').once().each(function () { + if ($(this).hasClass('ui-pattern-settings--token-has-value')) { $(this).prev().addClass(disableClass); } else { @@ -35,7 +35,7 @@ $('.js-ui-patterns-settings-token').once().each(function () { $(this).click(function () { - var tokenWrapper = $(this).closest('.ui-pattern-settings-token-wrapper'); + var tokenWrapper = $(this).closest('.ui-pattern-settings__token-wrapper'); var tokenInput = tokenWrapper.find('input'); var inputWrapper = tokenWrapper.prev(); var initValue = tokenInput.val(); diff --git a/runner.yml.dist b/runner.yml.dist index 2311f81..1b96879 100644 --- a/runner.yml.dist +++ b/runner.yml.dist @@ -32,7 +32,10 @@ selenium: commands: drupal:site-setup: - { task: "symlink", from: "../../../../src", to: "${drupal.root}/modules/custom/ui_patterns_settings/src" } + - { task: "symlink", from: "../../../../js", to: "${drupal.root}/modules/custom/ui_patterns_settings/js" } + - { task: "symlink", from: "../../../../css", to: "${drupal.root}/modules/custom/ui_patterns_settings/css" } - { task: "symlink", from: "../../../../tests", to: "${drupal.root}/modules/custom/ui_patterns_settings/tests" } + - { task: "symlink", from: "../../../../ui_patterns_settings.libraries.yml", to: "${drupal.root}/modules/custom/ui_patterns_settings/ui_patterns_settings.libraries.yml" } - { task: "symlink", from: "../../../../ui_patterns_settings.info.yml", to: "${drupal.root}/modules/custom/ui_patterns_settings/ui_patterns_settings.info.yml" } - { task: "symlink", from: "../../../../ui_patterns_settings.module", to: "${drupal.root}/modules/custom/ui_patterns_settings/ui_patterns_settings.module" } - { task: "symlink", from: "../../../../ui_patterns_settings.services.yml", to: "${drupal.root}/modules/custom/ui_patterns_settings/ui_patterns_settings.services.yml" } diff --git a/src/Definition/PatternDefinitionSetting.php b/src/Definition/PatternDefinitionSetting.php index dc8a9f8..4a3ed6f 100644 --- a/src/Definition/PatternDefinitionSetting.php +++ b/src/Definition/PatternDefinitionSetting.php @@ -100,7 +100,7 @@ public function getRequired() { * @return bool * Property value. */ - public function getToken() { + public function getAllowToken() { return $this->definition['allow_token']; } diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index e7a99dd..263074e 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -23,6 +23,7 @@ class SettingsFormBuilder { */ public static function layoutForm(array &$form, PatternDefinition $definition, array $configuration) { $settings = UiPatternsSettings::getPatternDefinitionSettings($definition); + $form['#attached']['library'][] = 'ui_patterns_settings/widget'; $form['variant']['#attributes']['class'][] = 'ui-patterns-variant-selector-' . $definition->id(); if (!empty($settings)) { foreach ($settings as $key => $setting) { @@ -54,6 +55,7 @@ public static function layoutForm(array &$form, PatternDefinition $definition, a * Configurations array. */ public static function displayForm(array &$form, array $configuration) { + $form['#attached']['library'][] = 'ui_patterns_settings/widget'; foreach (UiPatterns::getPatternDefinitions() as $pattern_id => $definition) { $settings = UiPatternsSettings::getPatternDefinitionSettings($definition); $form['variants'][$pattern_id]['#attributes']['class'][] = 'ui-patterns-variant-selector-' . $pattern_id; diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 3a29e28..ea74619 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -160,7 +160,6 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) '#title' => "Token", '#description' => $this->t("Token for %label", ['%label' => $def->getLabel()]), '#default_value' => $this->getValue($value), - '#required' => $def->getRequired(), ]; $entity_type_definations = \Drupal::entityTypeManager()->getDefinitions(); /* @var $definition EntityTypeInterface */ @@ -174,7 +173,6 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) '#token_types' => $content_entity_types, '#show_restricted' => TRUE, '#default_value' => $value, - '#weight' => 90, ]; return $form; } @@ -193,7 +191,20 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) public function buildConfigurationForm(array $form, $value, $token_value) { $def = $this->getPatternSettingDefinition(); $form = $this->settingsForm($form, $value, $def); - $form = $this->bindForm($form, $token_value, $def); + $classes = 'ui-pattern-settings-token-wrapper'; + if ($def->getAllowToken() && !empty($token_value)) { + $classes .= ' ui-pattern-settings--token-has-value'; + } + $form[$def->getName()]['#prefix'] = '
'; + + if ($def->getAllowToken()) { + $form = $this->bindForm($form, $token_value, $def); + $form[$def->getName() . '_token_link']['#suffix'] = '
'; + } + else { + $form[$def->getName()]['#suffix'] = ''; + } + return $form; } diff --git a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml index 79da064..0aaa0b3 100644 --- a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml +++ b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml @@ -15,6 +15,7 @@ foo_settings: textfield: type: textfield label: Textfield + allow_token: true preview: text preview number: type: number @@ -30,6 +31,7 @@ foo_settings: preview: Url boolean: type: boolean + allow_token: true label: Boolean preview: 1 select: diff --git a/ui_patterns_settings.libraries.yml b/ui_patterns_settings.libraries.yml new file mode 100644 index 0000000..cdf0521 --- /dev/null +++ b/ui_patterns_settings.libraries.yml @@ -0,0 +1,12 @@ +widget: + version: VERSION + js: + js/ui_pattern_settings.toggle_token.js: {} + css: + component: + css/ui_patterns_settings.css: {} + dependencies: + - core/jquery + - core/jquery.once + - core/drupal + - core/drupalSettings From 173ff568ab71bb7e511006a7a9ffa54990257e7d Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 20 Sep 2020 11:15:09 +0200 Subject: [PATCH 07/11] Add javascript to enable/disable tokens. --- css/ui_patterns_settings.css | 29 +++++++++++ js/ui_pattern_settings.toggle_token.js | 52 +++++-------------- src/Form/SettingsFormBuilder.php | 1 + src/Plugin/PatternSettingTypeBase.php | 26 +++++----- src/Plugin/TokenSettingTypeBase.php | 3 +- .../SettingType/AttributesSettingType.php | 2 +- .../SettingType/BooleanSettingType.php | 2 +- .../SettingType/CheckboxSettingType.php | 2 +- .../SettingType/NumberSettingType.php | 2 +- .../SettingType/SelectSettingType.php | 1 + .../SettingType/TextfieldSettingType.php | 2 +- 11 files changed, 65 insertions(+), 57 deletions(-) diff --git a/css/ui_patterns_settings.css b/css/ui_patterns_settings.css index e69de29..01b2259 100644 --- a/css/ui_patterns_settings.css +++ b/css/ui_patterns_settings.css @@ -0,0 +1,29 @@ +.ui-patterns-settings__token-wrapper { + position: relative; +} +.js-ui-patterns-settings__toggler { + position: absolute; + width: 10px; + height: 10px; + right: 0; + top: 0; + background-color: black; + display: block; + cursor: pointer; +} + +.ui-patterns-settings__token-wrapper > .js-form-item:first-child { + display: block !important; +} + +.ui-patterns-settings__token-wrapper > .js-form-item:nth-child(2) { + display: none !important; +} + +.ui-patterns-settings__token-wrapper.ui-patterns-settings--token-has-value > .js-form-item:first-child { + display: none !important; +} + +.ui-patterns-settings__token-wrapper.ui-patterns-settings--token-has-value > .js-form-item:nth-child(2) { + display: block !important; +} diff --git a/js/ui_pattern_settings.toggle_token.js b/js/ui_pattern_settings.toggle_token.js index 2f8e832..e73df05 100644 --- a/js/ui_pattern_settings.toggle_token.js +++ b/js/ui_pattern_settings.toggle_token.js @@ -10,7 +10,7 @@ /** * Attaches ui patterns settings module behaviors. * - * Handles enable/disable bind input element. + * Handles enable/disable token element. * * @type {Drupal~behavior} * @@ -21,45 +21,21 @@ */ Drupal.behaviors.ups_toggle_token = { attach: function () { - var disableClass = 'ui-pattern-settings--disable'; - - $('.ui-pattern-settings__token-wrapper').once().each(function () { - if ($(this).hasClass('ui-pattern-settings--token-has-value')) { - $(this).prev().addClass(disableClass); - } - else { - $(this).addClass(disableClass); - } - }); - - - $('.js-ui-patterns-settings-token').once().each(function () { - $(this).click(function () { - var tokenWrapper = $(this).closest('.ui-pattern-settings__token-wrapper'); - var tokenInput = tokenWrapper.find('input'); - var inputWrapper = tokenWrapper.prev(); - var initValue = tokenInput.val(); - - tokenWrapper.addClass(disableClass); - tokenInput.attr('data-init-val', initValue); - tokenInput.val(''); - inputWrapper.removeClass(disableClass); - }); - }); - - $('.js-ui-patterns-settings-input').once().each(function () { - $(this).click(function () { - var inputWrapper = $(this).closest('.js-form-item'); - var tokenWrapper = inputWrapper.next(); - inputWrapper.addClass(disableClass); - tokenWrapper.removeClass(disableClass); - var tokenInput = tokenWrapper.find('input'); - var restoreVal = tokenInput.attr('data-init-val'); - if (restoreVal != '') { - tokenInput.val(restoreVal); + $('.ui-patterns-settings__token-wrapper').once().each(function () { + var wrapper = $(this); + var toggler = $('.js-ui-patterns-settings__toggler', wrapper); + $(toggler).click(function () { + var tokenInput = $('.js-ui-patterns-settings__token', wrapper); + if ($(wrapper).hasClass('ui-patterns-settings--token-has-value')) { + tokenInput.attr('data-init-val', tokenInput.val()); + tokenInput.val(''); + wrapper.removeClass('ui-patterns-settings--token-has-value'); + } else { + tokenInput.val(tokenInput.attr('data-init-val')); + wrapper.addClass('ui-patterns-settings--token-has-value'); } }); - }) + }); } }; diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 263074e..389111d 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -109,6 +109,7 @@ private static function buildVariantsForm($select_selector, array &$fieldset, Pa } // Hide configured setting. $fieldset[$name]['#states']['invisible'][][$select_selector]['value'] = $variant->getName(); + $fieldset[$name . '_token']['#states']['invisible'][][$select_selector]['value'] = $variant->getName(); } } } diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index ea74619..88e5ee7 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -3,7 +3,6 @@ namespace Drupal\ui_patterns_settings\Plugin; use Drupal\Component\Plugin\ConfigurableInterface; -use Drupal\Core\Entity\ContentEntityType; use Drupal\Core\Plugin\PluginBase; use Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -160,9 +159,10 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) '#title' => "Token", '#description' => $this->t("Token for %label", ['%label' => $def->getLabel()]), '#default_value' => $this->getValue($value), + '#attributes' => ['class' => ['js-ui-patterns-settings__token']], ]; + /* $entity_type_definations = \Drupal::entityTypeManager()->getDefinitions(); - /* @var $definition EntityTypeInterface */ foreach ($entity_type_definations as $definition) { if ($definition instanceof ContentEntityType) { $content_entity_types[] = $definition->id(); @@ -173,10 +173,14 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) '#token_types' => $content_entity_types, '#show_restricted' => TRUE, '#default_value' => $value, - ]; + ];*/ return $form; } + protected function handleInput(&$input, PatternDefinitionSetting $def) { + $input['#attributes']['class'][] = 'js-ui-patterns-settings__input'; + } + /** * {@inheritdoc} * @@ -191,18 +195,16 @@ protected function bindForm(array $form, $value, PatternDefinitionSetting $def) public function buildConfigurationForm(array $form, $value, $token_value) { $def = $this->getPatternSettingDefinition(); $form = $this->settingsForm($form, $value, $def); - $classes = 'ui-pattern-settings-token-wrapper'; - if ($def->getAllowToken() && !empty($token_value)) { - $classes .= ' ui-pattern-settings--token-has-value'; + $classes = 'ui-patterns-settings__token-wrapper'; + if ($def->getAllowToken()) { + if (!empty($token_value)) { + $classes .= ' ui-patterns-settings--token-has-value'; + } + $form[$def->getName()]['#prefix'] = '
'; } - $form[$def->getName()]['#prefix'] = '
'; - if ($def->getAllowToken()) { $form = $this->bindForm($form, $token_value, $def); - $form[$def->getName() . '_token_link']['#suffix'] = '
'; - } - else { - $form[$def->getName()]['#suffix'] = '
'; + $form[$def->getName() . '_token']['#suffix'] = ''; } return $form; diff --git a/src/Plugin/TokenSettingTypeBase.php b/src/Plugin/TokenSettingTypeBase.php index 43c50df..6580987 100644 --- a/src/Plugin/TokenSettingTypeBase.php +++ b/src/Plugin/TokenSettingTypeBase.php @@ -53,9 +53,8 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $description, '#default_value' => $this->getValue($value), - '#required' => $def->getRequired(), ]; - + $this->handleInput($form[$def->getName()]['input'], $def); $form[$def->getName()]['token'] = [ '#theme' => 'token_tree_link', '#token_types' => $content_entity_types, diff --git a/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php b/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php index ea89a5f..8bfc11c 100644 --- a/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php @@ -28,8 +28,8 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $description, '#default_value' => $value, - '#required' => $def->getRequired(), ]; + $this->handleInput($form[$def->getName()], $def); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php b/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php index f78ed5c..f979f0e 100644 --- a/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php @@ -25,8 +25,8 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $value, - '#required' => $def->getRequired(), ]; + $this->handleInput($form[$def->getName()], $def); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php b/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php index ced6aa0..faf6613 100644 --- a/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php @@ -48,9 +48,9 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $value, - '#required' => $def->getRequired(), '#options' => $def->getOptions(), ]; + $this->handleInput($form[$def->getName()], $def); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/NumberSettingType.php b/src/Plugin/UiPatterns/SettingType/NumberSettingType.php index c34678b..c0232ea 100644 --- a/src/Plugin/UiPatterns/SettingType/NumberSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/NumberSettingType.php @@ -24,8 +24,8 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $this->getValue($value), - '#required' => $def->getRequired(), ]; + $this->handleInput($form[$def->getName()], $def); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/SelectSettingType.php b/src/Plugin/UiPatterns/SettingType/SelectSettingType.php index ce212f3..f017196 100644 --- a/src/Plugin/UiPatterns/SettingType/SelectSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/SelectSettingType.php @@ -29,6 +29,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#required' => $def->getRequired(), '#options' => $options, ]; + $this->handleInput($form[$def->getName()], $def); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php b/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php index 3966162..6feaadb 100644 --- a/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php @@ -24,8 +24,8 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $this->getValue($value), - '#required' => $def->getRequired(), ]; + $this->handleInput($form[$def->getName()], $def); return $form; } From 468c7cbee022361a7450883b7b73813a7c0567d7 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 20 Sep 2020 23:28:07 +0200 Subject: [PATCH 08/11] Add bind token and validation support. --- css/toggler.png | Bin 0 -> 14513 bytes css/ui_patterns_settings.css | 25 +++--- js/ui_pattern_settings.toggle_token.js | 12 +-- src/Form/SettingsFormBuilder.php | 10 ++- src/Plugin/PatternSettingTypeBase.php | 78 ++++++++++++------ src/Plugin/PatternSettingTypeInterface.php | 8 +- src/Plugin/TokenSettingTypeBase.php | 4 +- .../SettingType/AttributesSettingType.php | 4 +- .../SettingType/BooleanSettingType.php | 4 +- ...tingType.php => CheckboxesSettingType.php} | 8 +- .../SettingType/NumberSettingType.php | 4 +- .../SettingType/SelectSettingType.php | 12 ++- .../SettingType/TextfieldSettingType.php | 4 +- src/UiPatternsSettings.php | 17 +++- .../templates/pattern-foo-settings.html.twig | 4 +- .../templates/settings.ui_patterns.yml | 8 +- .../UiPatternsSettingsRenderTest.php | 2 +- ui_patterns_settings.module | 1 + 18 files changed, 129 insertions(+), 76 deletions(-) create mode 100644 css/toggler.png rename src/Plugin/UiPatterns/SettingType/{CheckboxSettingType.php => CheckboxesSettingType.php} (88%) diff --git a/css/toggler.png b/css/toggler.png new file mode 100644 index 0000000000000000000000000000000000000000..e8db53e8361249c25f17fdeb1911e0984679e4a3 GIT binary patch literal 14513 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 literal 0 HcmV?d00001 diff --git a/css/ui_patterns_settings.css b/css/ui_patterns_settings.css index 01b2259..970532e 100644 --- a/css/ui_patterns_settings.css +++ b/css/ui_patterns_settings.css @@ -1,29 +1,28 @@ -.ui-patterns-settings__token-wrapper { +.js-ui-patterns-settings__wrapper { position: relative; } .js-ui-patterns-settings__toggler { position: absolute; - width: 10px; - height: 10px; + width: 14px; + height: 14px; right: 0; top: 0; - background-color: black; display: block; cursor: pointer; + background-image: url("toggler.png"); + background-repeat: no-repeat; + background-size: cover; } -.ui-patterns-settings__token-wrapper > .js-form-item:first-child { - display: block !important; -} -.ui-patterns-settings__token-wrapper > .js-form-item:nth-child(2) { - display: none !important; +.js-ui-patterns-settings__wrapper .js-ui-patterns-settings__token-wrapper > * { + display: none; } -.ui-patterns-settings__token-wrapper.ui-patterns-settings--token-has-value > .js-form-item:first-child { - display: none !important; +.js-ui-patterns-settings__wrapper.js-ui-patterns-settings--token-has-value > .js-ui-patterns-settings__input-wrapper > * { + display: none; } -.ui-patterns-settings__token-wrapper.ui-patterns-settings--token-has-value > .js-form-item:nth-child(2) { - display: block !important; +.js-ui-patterns-settings__wrapper.js-ui-patterns-settings--token-has-value > .js-ui-patterns-settings__token-wrapper > * { + display: block; } diff --git a/js/ui_pattern_settings.toggle_token.js b/js/ui_pattern_settings.toggle_token.js index e73df05..53d0a3d 100644 --- a/js/ui_pattern_settings.toggle_token.js +++ b/js/ui_pattern_settings.toggle_token.js @@ -21,20 +21,22 @@ */ Drupal.behaviors.ups_toggle_token = { attach: function () { - $('.ui-patterns-settings__token-wrapper').once().each(function () { + $('.js-ui-patterns-settings__wrapper').once().each(function () { var wrapper = $(this); - var toggler = $('.js-ui-patterns-settings__toggler', wrapper); + var toggler = $('
'); $(toggler).click(function () { var tokenInput = $('.js-ui-patterns-settings__token', wrapper); - if ($(wrapper).hasClass('ui-patterns-settings--token-has-value')) { + if ($(wrapper).hasClass('js-ui-patterns-settings--token-has-value')) { tokenInput.attr('data-init-val', tokenInput.val()); tokenInput.val(''); - wrapper.removeClass('ui-patterns-settings--token-has-value'); + wrapper.removeClass('js-ui-patterns-settings--token-has-value'); } else { tokenInput.val(tokenInput.attr('data-init-val')); - wrapper.addClass('ui-patterns-settings--token-has-value'); + wrapper.addClass('js-ui-patterns-settings--token-has-value'); } }); + $('.js-ui-patterns-settings__input-wrapper', wrapper).append(toggler) + $('.js-ui-patterns-settings__token-wrapper', wrapper).append(toggler.clone(true)) }); } }; diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 389111d..66fdaa2 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -24,6 +24,7 @@ class SettingsFormBuilder { public static function layoutForm(array &$form, PatternDefinition $definition, array $configuration) { $settings = UiPatternsSettings::getPatternDefinitionSettings($definition); $form['#attached']['library'][] = 'ui_patterns_settings/widget'; + $form['variant']['#attributes']['class'][] = 'ui-patterns-variant-selector-' . $definition->id(); if (!empty($settings)) { foreach ($settings as $key => $setting) { @@ -39,8 +40,8 @@ public static function layoutForm(array &$form, PatternDefinition $definition, a } $setting_value = isset($configuration['pattern']['settings'][$key]) ? $configuration['pattern']['settings'][$key] : NULL; $token_value = isset($configuration['pattern']['settings'][$key . "_token"]) ? $configuration['pattern']['settings'][$key . "_token"] : ""; - $settingType = UiPatternsSettings::createSettingType($setting); - $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $token_value); + $settingType = UiPatternsSettings::createSettingType($definition, $setting); + $form['settings'] += $settingType->buildConfigurationForm([], $setting_value, $token_value, 'layouts_display'); } SettingsFormBuilder::buildVariantsForm(".ui-patterns-variant-selector-" . $definition->id(), $form['settings'], $definition); } @@ -77,8 +78,9 @@ public static function displayForm(array &$form, array $configuration) { } $fieldset = &$form['pattern_settings'][$pattern_id]; $settingType = UiPatternsSettings::createSettingType($setting); - $setting_value = isset($configuration['pattern_settings'][$pattern_id][$key]) ? $configuration['pattern_settings'][$pattern_id][$key] : ""; - $fieldset += $settingType->buildConfigurationForm([], $setting_value); + $setting_value = isset($configuration['pattern_settings'][$pattern_id][$key]) ? $configuration['pattern_settings'][$pattern_id][$key] : NULL; + $token_value = isset($configuration['pattern_settings'][$pattern_id][$key . "_token"]) ? $configuration['pattern_settings'][$pattern_id][$key . "_token"] : NULL; + $fieldset += $settingType->buildConfigurationForm([], $setting_value, $token_value, 'display'); } SettingsFormBuilder::buildVariantsForm('.ui-patterns-variant-selector-' . $pattern_id, $fieldset, $definition); } diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 88e5ee7..0a78c8a 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -3,6 +3,7 @@ namespace Drupal\ui_patterns_settings\Plugin; use Drupal\Component\Plugin\ConfigurableInterface; +use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Plugin\PluginBase; use Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -13,13 +14,11 @@ abstract class PatternSettingTypeBase extends PluginBase implements ConfigurableInterface, PatternSettingTypeInterface { /** - * Returns a list of all entity tokens. + * Return pattern definitions for setting . * - * @var \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting + * @var \Drupal\ui_patterns\Definition\PatternDefinition */ - protected function getTokens() { - - } + private $patternDefinition; /** * Return pattern definitions for setting . @@ -34,7 +33,9 @@ protected function getTokens() { public function __construct(array $configuration, $plugin_id, array $plugin_definition) { $configuration += $this->defaultConfiguration(); $this->patternSettingDefinition = $configuration['pattern_setting_definition']; + $this->patternDefinition = $configuration['pattern_definition']; unset($configuration['pattern_setting_definition']); + unset($configuration['pattern_definition']); parent::__construct($configuration, $plugin_id, $plugin_definition); } @@ -153,32 +154,59 @@ public function settingsPreprocess($value, array $context, PatternDefinitionSett * @return array * The form. */ - protected function bindForm(array $form, $value, PatternDefinitionSetting $def) { + protected function tokenForm(array $form, $value, PatternDefinitionSetting $def) { $form[$def->getName() . "_token"] = [ '#type' => 'textfield', '#title' => "Token", '#description' => $this->t("Token for %label", ['%label' => $def->getLabel()]), '#default_value' => $this->getValue($value), '#attributes' => ['class' => ['js-ui-patterns-settings__token']], + '#wrapper_attributes' => ['class' => ['js-ui-patterns-settings__token-wrapper']], ]; - /* - $entity_type_definations = \Drupal::entityTypeManager()->getDefinitions(); - foreach ($entity_type_definations as $definition) { - if ($definition instanceof ContentEntityType) { - $content_entity_types[] = $definition->id(); + return $form; + } + + /** + * Check required input fields in layout forms. + * + * @param $element + * The element to validate. + * @param \Drupal\Core\Form\FormStateInterface $form_state + * The form state. + * @param $form + * The form. + */ + public function validateLayout($element, FormStateInterface &$form_state, &$form) { + $parents = $element['#parents']; + $value = $form_state->getValue($parents); + $parents[ count($parents) -1 ] = $parents[ count($parents) -1 ] . '_token'; + $token_value = $form_state->getValue($parents); + if (empty($value) && empty($token_value)) { + // Check if a variant is selected and the value + // is provided by the variant. + $variant = $form_state->getValue(['layout_configuration', 'pattern', 'variant']); + if (!empty($variant)) { + $variant_def = $this->patternDefinition->getVariant($variant); + $variant_ary = $variant_def->toArray(); + if (!empty($variant_ary['settings'][$this->patternSettingDefinition->getName()])) { + return; + } } + + $form_state->setError($element, t('@name field is required.', ['@name' => $element['#title']])); } - $form[$def->getName() . '_token_link'] = [ - '#theme' => 'token_tree_link', - '#token_types' => $content_entity_types, - '#show_restricted' => TRUE, - '#default_value' => $value, - ];*/ - return $form; } - protected function handleInput(&$input, PatternDefinitionSetting $def) { + protected function handleInput(&$input, PatternDefinitionSetting $def, $form_type) { $input['#attributes']['class'][] = 'js-ui-patterns-settings__input'; + $input['#wrapper_attributes']['class'][] = 'js-ui-patterns-settings__input-wrapper'; + if ($def->getRequired()) { + $input['#title'] .=' *'; + if ($form_type === 'layouts_display') { + $input['#def'] = $def; + $input['#element_validate'][] = [$this, 'validateLayout']; + } + } } /** @@ -192,19 +220,19 @@ protected function handleInput(&$input, PatternDefinitionSetting $def) { * * @see \Drupal\Core\Block\BlockBase::blockForm() */ - public function buildConfigurationForm(array $form, $value, $token_value) { + public function buildConfigurationForm(array $form, $value, $token_value, $form_type) { $def = $this->getPatternSettingDefinition(); - $form = $this->settingsForm($form, $value, $def); - $classes = 'ui-patterns-settings__token-wrapper'; + $form = $this->settingsForm($form, $value, $def, $form_type); + $classes = 'js-ui-patterns-settings__wrapper'; if ($def->getAllowToken()) { if (!empty($token_value)) { - $classes .= ' ui-patterns-settings--token-has-value'; + $classes .= ' js-ui-patterns-settings--token-has-value'; } $form[$def->getName()]['#prefix'] = '
'; } if ($def->getAllowToken()) { - $form = $this->bindForm($form, $token_value, $def); - $form[$def->getName() . '_token']['#suffix'] = '
'; + $form = $this->tokenForm($form, $token_value, $def); + $form[$def->getName() . '_token']['#suffix'] = ''; } return $form; diff --git a/src/Plugin/PatternSettingTypeInterface.php b/src/Plugin/PatternSettingTypeInterface.php index 837f7f2..1c71502 100644 --- a/src/Plugin/PatternSettingTypeInterface.php +++ b/src/Plugin/PatternSettingTypeInterface.php @@ -19,11 +19,13 @@ interface PatternSettingTypeInterface extends ConfigurableInterface { * The stored default value. * @param \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting $def * The pattern definition. + * @param string $form_type + * The form type. Either layout or layouts_display or display. * * @return array * The configuration form. */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def); + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type); /** * Preprocess setting variable. @@ -64,7 +66,9 @@ public function preprocess($value, array $context); * The stored default value. * @param string $token_value * The stored token value. + * @param string $form_type + * The form type. Either layout or layouts_display or display. */ - public function buildConfigurationForm(array $form, $value, $token_value); + public function buildConfigurationForm(array $form, $value, $token_value, $form_type); } diff --git a/src/Plugin/TokenSettingTypeBase.php b/src/Plugin/TokenSettingTypeBase.php index 6580987..8ee83cf 100644 --- a/src/Plugin/TokenSettingTypeBase.php +++ b/src/Plugin/TokenSettingTypeBase.php @@ -30,7 +30,7 @@ public static function create(ContainerInterface $container, array $configuratio /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $def = $this->getPatternSettingDefinition(); $value = $this->getValue($value); $description = $def->getDescription() != NULL ? $def->getDescription() : ""; @@ -54,7 +54,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#description' => $description, '#default_value' => $this->getValue($value), ]; - $this->handleInput($form[$def->getName()]['input'], $def); + $this->handleInput($form[$def->getName()]['input'], $def, $form_type); $form[$def->getName()]['token'] = [ '#theme' => 'token_tree_link', '#token_types' => $content_entity_types, diff --git a/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php b/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php index 8bfc11c..b006d16 100644 --- a/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/AttributesSettingType.php @@ -20,7 +20,7 @@ class AttributesSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $value = $this->getValue($value); $description = $def->getDescription() != NULL ? $def->getDescription() : $this->t('E.g. role="navigation" class="class-1"'); $form[$def->getName()] = [ @@ -29,7 +29,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#description' => $description, '#default_value' => $value, ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php b/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php index f979f0e..b5a33a4 100644 --- a/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/BooleanSettingType.php @@ -18,7 +18,7 @@ class BooleanSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $value = $this->getValue($value); $form[$def->getName()] = [ '#type' => 'checkbox', @@ -26,7 +26,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#description' => $def->getDescription(), '#default_value' => $value, ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php b/src/Plugin/UiPatterns/SettingType/CheckboxesSettingType.php similarity index 88% rename from src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php rename to src/Plugin/UiPatterns/SettingType/CheckboxesSettingType.php index faf6613..b92e98d 100644 --- a/src/Plugin/UiPatterns/SettingType/CheckboxSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/CheckboxesSettingType.php @@ -9,11 +9,11 @@ * Checkbox setting type. * * @UiPatternsSettingType( - * id = "checkbox", + * id = "checkboxes", * label = @Translation("Checkboxes") * ) */ -class CheckboxSettingType extends PatternSettingTypeBase { +class CheckboxesSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} @@ -34,7 +34,7 @@ public function settingsPreprocess($value, array $context, PatternDefinitionSett /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $def = $this->getPatternSettingDefinition(); $value = $this->getValue($value); if (is_scalar($value)) { @@ -50,7 +50,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#default_value' => $value, '#options' => $def->getOptions(), ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/NumberSettingType.php b/src/Plugin/UiPatterns/SettingType/NumberSettingType.php index c0232ea..99fd99c 100644 --- a/src/Plugin/UiPatterns/SettingType/NumberSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/NumberSettingType.php @@ -18,14 +18,14 @@ class NumberSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $form[$def->getName()] = [ '#type' => 'number', '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $this->getValue($value), ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/SelectSettingType.php b/src/Plugin/UiPatterns/SettingType/SelectSettingType.php index f017196..114c4fb 100644 --- a/src/Plugin/UiPatterns/SettingType/SelectSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/SelectSettingType.php @@ -18,8 +18,14 @@ class SelectSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { - $options = ["" => $this->t("Please select")]; + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { + if ($def->getRequired() == FALSE) { + $options = ["" => $this->t("Please select")]; + } + else { + $options = []; + } + $options += $def->getOptions(); $form[$def->getName()] = [ '#type' => 'select', @@ -29,7 +35,7 @@ public function settingsForm(array $form, $value, PatternDefinitionSetting $def) '#required' => $def->getRequired(), '#options' => $options, ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php b/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php index 6feaadb..7941b88 100644 --- a/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php +++ b/src/Plugin/UiPatterns/SettingType/TextfieldSettingType.php @@ -18,14 +18,14 @@ class TextfieldSettingType extends PatternSettingTypeBase { /** * {@inheritdoc} */ - public function settingsForm(array $form, $value, PatternDefinitionSetting $def) { + public function settingsForm(array $form, $value, PatternDefinitionSetting $def, $form_type) { $form[$def->getName()] = [ '#type' => 'textfield', '#title' => $def->getLabel(), '#description' => $def->getDescription(), '#default_value' => $this->getValue($value), ]; - $this->handleInput($form[$def->getName()], $def); + $this->handleInput($form[$def->getName()], $def, $form_type); return $form; } diff --git a/src/UiPatternsSettings.php b/src/UiPatternsSettings.php index 6f90335..3c1d270 100644 --- a/src/UiPatternsSettings.php +++ b/src/UiPatternsSettings.php @@ -51,6 +51,14 @@ public static function preprocess($pattern_id, array $settings, $variant, $previ if ($setting_definition->getForcedValue()) { $value = $setting_definition->getForcedValue(); } + elseif (!empty($settings[$key . '_token'])) { + $token_value = $settings[$key . '_token']; + $token_data = []; + if ($entity !== NULL) { + $token_data[$entity->getEntityTypeId()] = $entity; + } + $value = \Drupal::token()->replace($token_value, $token_data, ['clear' => TRUE]); + } elseif (isset($settings[$key])) { $value = $settings[$key]; } @@ -101,17 +109,18 @@ public static function getPatternDefinitionSettings(PatternDefinition $definitio /** * Create setting type plugin. * - * @param \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting $settingDefintion + * @param \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting $setting_defintion * The setting defintion. * * @return \Drupal\ui_patterns_settings\Plugin\PatternSettingTypeInterface * UI Patterns setting manager instance. */ - public static function createSettingType(PatternDefinitionSetting $settingDefintion) { + public static function createSettingType(PatternDefinition $pattern_definition, PatternDefinitionSetting $setting_defintion) { $configuration = []; - $configuration['pattern_setting_definition'] = $settingDefintion; + $configuration['pattern_setting_definition'] = $setting_defintion; + $configuration['pattern_definition'] = $pattern_definition; return \Drupal::service('plugin.manager.ui_patterns_settings') - ->createInstance($settingDefintion->getType(), $configuration); + ->createInstance($setting_defintion->getType(), $configuration); } } diff --git a/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig b/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig index 9b120f5..4b2fd86 100644 --- a/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig +++ b/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig @@ -6,8 +6,8 @@
Boolean: {{ boolean }}
Url: {{ url }}
Select: {{ select }}
-
Checkbox: {% for i in checkbox %} {{- i -}} {% endfor %}
+
Checkboxes: {% for i in checkboxes %} {{- i -}} {% endfor %}
Attributes: {{ attributes }}
-{{ dummy }} \ No newline at end of file +{{ dummy }} diff --git a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml index 0aaa0b3..c043a6b 100644 --- a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml +++ b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml @@ -17,10 +17,12 @@ foo_settings: label: Textfield allow_token: true preview: text preview + required: true number: type: number label: Number preview: 10 + required: true token: type: token label: Token @@ -39,9 +41,9 @@ foo_settings: label: Select options: key: value - checkbox: - type: checkbox - label: Checkbox + checkboxes: + type: checkboxes + label: Checkboxes options: box1: Box1 box2: Box2 diff --git a/tests/src/Functional/UiPatternsSettingsRenderTest.php b/tests/src/Functional/UiPatternsSettingsRenderTest.php index c3dc3a9..2495f3b 100644 --- a/tests/src/Functional/UiPatternsSettingsRenderTest.php +++ b/tests/src/Functional/UiPatternsSettingsRenderTest.php @@ -67,7 +67,7 @@ public function testRender() { '[url][input]' => ['input' => 'internal:/node/1', 'result' => 'Url: /node/1'], '[boolean]' => ['input' => '1', 'result' => 'Boolean: 1'], '[select]' => ['input' => 'key', 'result' => 'Select: key'], - '[checkbox][box1]' => ['input' => TRUE, 'result' => 'Checkbox: Box1'], + '[checkboxes][box1]' => ['input' => TRUE, 'result' => 'Checkboxes: Box1'], '[attributes]' => ['input' => 'class="class"', 'result' => 'Attributes: class="class"'], ]; diff --git a/ui_patterns_settings.module b/ui_patterns_settings.module index 5bc3c4d..c0fa397 100644 --- a/ui_patterns_settings.module +++ b/ui_patterns_settings.module @@ -10,6 +10,7 @@ use Drupal\ui_patterns_settings\UiPatternsSettings; use Drupal\ui_patterns\UiPatterns; use Drupal\ui_patterns\Definition\PatternDefinition; use Drupal\ui_patterns_settings\Form\SettingsFormBuilder; +use Drupal\Core\Form\FormStateInterface; /** * Implements hook_ui_patterns_layouts_display_settings_form_alter(). From fa4100a6e81277be322dabe24fbe529528133cf4 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 20 Sep 2020 23:40:57 +0200 Subject: [PATCH 09/11] Fix createSettingTyp calls. --- src/Form/SettingsFormBuilder.php | 2 +- src/Plugin/PatternSettingTypeBase.php | 1 - src/UiPatternsSettings.php | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 66fdaa2..6e7eb10 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -77,7 +77,7 @@ public static function displayForm(array &$form, array $configuration) { ]; } $fieldset = &$form['pattern_settings'][$pattern_id]; - $settingType = UiPatternsSettings::createSettingType($setting); + $settingType = UiPatternsSettings::createSettingType($definition, $setting); $setting_value = isset($configuration['pattern_settings'][$pattern_id][$key]) ? $configuration['pattern_settings'][$pattern_id][$key] : NULL; $token_value = isset($configuration['pattern_settings'][$pattern_id][$key . "_token"]) ? $configuration['pattern_settings'][$pattern_id][$key . "_token"] : NULL; $fieldset += $settingType->buildConfigurationForm([], $setting_value, $token_value, 'display'); diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 0a78c8a..0c0e613 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -203,7 +203,6 @@ protected function handleInput(&$input, PatternDefinitionSetting $def, $form_typ if ($def->getRequired()) { $input['#title'] .=' *'; if ($form_type === 'layouts_display') { - $input['#def'] = $def; $input['#element_validate'][] = [$this, 'validateLayout']; } } diff --git a/src/UiPatternsSettings.php b/src/UiPatternsSettings.php index 3c1d270..76319a1 100644 --- a/src/UiPatternsSettings.php +++ b/src/UiPatternsSettings.php @@ -77,7 +77,7 @@ public static function preprocess($pattern_id, array $settings, $variant, $previ } } } - $settingType = UiPatternsSettings::createSettingType($setting_definition); + $settingType = UiPatternsSettings::createSettingType($definition, $setting_definition); $processed_settings[$key] = $settingType->preprocess($value, $context); } return $processed_settings; From ea955304d423f4aff370c6aaa017577ecee56624 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Sun, 20 Sep 2020 23:56:48 +0200 Subject: [PATCH 10/11] Fix validation exceptions. --- src/Plugin/PatternSettingTypeBase.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 0c0e613..8ee7698 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -176,7 +176,7 @@ protected function tokenForm(array $form, $value, PatternDefinitionSetting $def) * @param $form * The form. */ - public function validateLayout($element, FormStateInterface &$form_state, &$form) { + public static function validateLayout($element, FormStateInterface &$form_state, &$form) { $parents = $element['#parents']; $value = $form_state->getValue($parents); $parents[ count($parents) -1 ] = $parents[ count($parents) -1 ] . '_token'; @@ -186,9 +186,9 @@ public function validateLayout($element, FormStateInterface &$form_state, &$form // is provided by the variant. $variant = $form_state->getValue(['layout_configuration', 'pattern', 'variant']); if (!empty($variant)) { - $variant_def = $this->patternDefinition->getVariant($variant); + $variant_def = $element['#pattern_definition']->getVariant($variant); $variant_ary = $variant_def->toArray(); - if (!empty($variant_ary['settings'][$this->patternSettingDefinition->getName()])) { + if (!empty($variant_ary['settings'][$element['#pattern_setting_definition']->getName()])) { return; } } @@ -203,7 +203,9 @@ protected function handleInput(&$input, PatternDefinitionSetting $def, $form_typ if ($def->getRequired()) { $input['#title'] .=' *'; if ($form_type === 'layouts_display') { - $input['#element_validate'][] = [$this, 'validateLayout']; + $input['#pattern_setting_definition'] = $this->patternSettingDefinition; + $input['#pattern_definition'] = $this->patternDefinition; + $input['#element_validate'][] = [static::class, 'validateLayout']; } } } From 1ec3586f39a085b330abf7f53888f1b1175223e2 Mon Sep 17 00:00:00 2001 From: Christian Wiedemann Date: Mon, 21 Sep 2020 09:05:15 +0200 Subject: [PATCH 11/11] Add variant token to display layouts. --- src/Element/PatternSettings.php | 12 ++++++- src/Form/SettingsFormBuilder.php | 35 +++++++++++++++++++ src/Plugin/Layout/PatternSettingsLayout.php | 4 ++- src/Plugin/PatternSettingTypeBase.php | 33 ++++++++++++----- src/UiPatternsSettingsManager.php | 20 +++++++++++ .../templates/pattern-foo-settings.html.twig | 3 +- .../templates/settings.ui_patterns.yml | 1 + ui_patterns_settings.module | 1 - 8 files changed, 97 insertions(+), 12 deletions(-) diff --git a/src/Element/PatternSettings.php b/src/Element/PatternSettings.php index 31eedad..9cf867c 100644 --- a/src/Element/PatternSettings.php +++ b/src/Element/PatternSettings.php @@ -37,6 +37,17 @@ public static function processPreviewSettings(array $element) { * Render array. */ public static function processSettings(array $element, $preview = FALSE) { + $context = $element['#context']; + + // Handle Variant token. + if (!empty($element['#variant_token'])) { + $variant_token = $element['#variant_token']; + $entity = $context->getProperty('entity'); + if ($entity !== NULL) { + $token_data[$entity->getEntityTypeId()] = $entity; + } + $element['#variant'] = \Drupal::token()->replace($variant_token, $token_data, ['clear' => TRUE]); + } // Make sure we don't render anything in case fields are empty. if (self::hasSettings($element)) { $settings = isset($element['#settings']) ? $element['#settings'] : []; @@ -51,7 +62,6 @@ public static function processSettings(array $element, $preview = FALSE) { $configuration = $layout->getConfiguration(); $settings = isset($configuration['pattern']['settings']) ? $configuration['pattern']['settings'] : []; } - $context = $element['#context']; $pattern_id = $element['#id']; $entity = $context->getProperty('entity'); $variant = isset($element['#variant']) ? $element['#variant'] : NULL; diff --git a/src/Form/SettingsFormBuilder.php b/src/Form/SettingsFormBuilder.php index 6e7eb10..74286a0 100644 --- a/src/Form/SettingsFormBuilder.php +++ b/src/Form/SettingsFormBuilder.php @@ -5,6 +5,7 @@ use Drupal\ui_patterns\Definition\PatternDefinition; use Drupal\ui_patterns\UiPatterns; use Drupal\ui_patterns_settings\UiPatternsSettings; +use Drupal\ui_patterns_settings\UiPatternsSettingsManager; /** * Build settings in manage display form. @@ -24,6 +25,14 @@ class SettingsFormBuilder { public static function layoutForm(array &$form, PatternDefinition $definition, array $configuration) { $settings = UiPatternsSettings::getPatternDefinitionSettings($definition); $form['#attached']['library'][] = 'ui_patterns_settings/widget'; + if (UiPatternsSettingsManager::allowVariantToken($definition)) { + $variant_token_value = isset($configuration['pattern']['variant_token']) ? $configuration['pattern']['variant_token'] : NULL; + $form['variant_token'] = [ + '#type' => 'textfield', + '#title' => 'Variant token', + '#default_value' => $variant_token_value, + ]; + } $form['variant']['#attributes']['class'][] = 'ui-patterns-variant-selector-' . $definition->id(); if (!empty($settings)) { @@ -60,6 +69,32 @@ public static function displayForm(array &$form, array $configuration) { foreach (UiPatterns::getPatternDefinitions() as $pattern_id => $definition) { $settings = UiPatternsSettings::getPatternDefinitionSettings($definition); $form['variants'][$pattern_id]['#attributes']['class'][] = 'ui-patterns-variant-selector-' . $pattern_id; + if (UiPatternsSettingsManager::allowVariantToken($definition)) { + $variant_token_value = isset($configuration['variants_token'][$pattern_id]) ? $configuration['variants_token'][$pattern_id] : NULL; + $form['variants']['#weight'] = 20; + $form['pattern_mapping']['#weight'] = 30; + $form['pattern_settings']['#weight'] = 40; + $form['variants_token'] = [ + '#type' => 'container', + '#title' => t('Pattern Variant'), + '#weight' => 25, + '#states' => [ + 'visible' => [ + 'select[id="patterns-select"]' => ['value' => $pattern_id], + ], + ], + ]; + $form['variants_token'][$pattern_id] = [ + '#type' => 'textfield', + '#title' => t('Variant token'), + '#default_value' => $variant_token_value, + '#states' => [ + 'visible' => [ + 'select[id="patterns-select"]' => ['value' => $pattern_id], + ], + ], + ]; + } if (!empty($settings)) { foreach ($settings as $key => $setting) { if (empty($setting->getType()) || !$setting->isFormVisible()) { diff --git a/src/Plugin/Layout/PatternSettingsLayout.php b/src/Plugin/Layout/PatternSettingsLayout.php index 63c5660..517c54a 100644 --- a/src/Plugin/Layout/PatternSettingsLayout.php +++ b/src/Plugin/Layout/PatternSettingsLayout.php @@ -20,7 +20,9 @@ public function build(array $regions) { if (isset($configuration['pattern']['settings'])) { $build['#settings'] = $configuration['pattern']['settings']; } - + if (isset($configuration['pattern']['variant_token'])) { + $build['#variant_token'] = $configuration['pattern']['variant_token']; + } return $build; } diff --git a/src/Plugin/PatternSettingTypeBase.php b/src/Plugin/PatternSettingTypeBase.php index 8ee7698..c6aba51 100644 --- a/src/Plugin/PatternSettingTypeBase.php +++ b/src/Plugin/PatternSettingTypeBase.php @@ -169,22 +169,26 @@ protected function tokenForm(array $form, $value, PatternDefinitionSetting $def) /** * Check required input fields in layout forms. * - * @param $element + * @param array $element * The element to validate. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. - * @param $form + * @param array $form * The form. */ - public static function validateLayout($element, FormStateInterface &$form_state, &$form) { + public static function validateLayout(array $element, FormStateInterface &$form_state, array &$form) { $parents = $element['#parents']; $value = $form_state->getValue($parents); - $parents[ count($parents) -1 ] = $parents[ count($parents) -1 ] . '_token'; + $parents[count($parents) - 1] = $parents[count($parents) - 1] . '_token'; $token_value = $form_state->getValue($parents); if (empty($value) && empty($token_value)) { // Check if a variant is selected and the value // is provided by the variant. - $variant = $form_state->getValue(['layout_configuration', 'pattern', 'variant']); + $variant = $form_state->getValue([ + 'layout_configuration', + 'pattern', + 'variant', + ]); if (!empty($variant)) { $variant_def = $element['#pattern_definition']->getVariant($variant); $variant_ary = $variant_def->toArray(); @@ -197,15 +201,28 @@ public static function validateLayout($element, FormStateInterface &$form_state, } } - protected function handleInput(&$input, PatternDefinitionSetting $def, $form_type) { + /** + * Add validation and basics classes to the raw input field. + * + * @param array $input + * The input field. + * @param \Drupal\ui_patterns_settings\Definition\PatternDefinitionSetting $def + * The pattern definition. + * @param string $form_type + * The form type. Either layouts_display or display. + */ + protected function handleInput(array &$input, PatternDefinitionSetting $def, $form_type) { $input['#attributes']['class'][] = 'js-ui-patterns-settings__input'; $input['#wrapper_attributes']['class'][] = 'js-ui-patterns-settings__input-wrapper'; if ($def->getRequired()) { - $input['#title'] .=' *'; + $input['#title'] .= ' *'; if ($form_type === 'layouts_display') { $input['#pattern_setting_definition'] = $this->patternSettingDefinition; $input['#pattern_definition'] = $this->patternDefinition; - $input['#element_validate'][] = [static::class, 'validateLayout']; + $input['#element_validate'][] = [ + PatternSettingTypeBase::class, + 'validateLayout', + ]; } } } diff --git a/src/UiPatternsSettingsManager.php b/src/UiPatternsSettingsManager.php index 17b8b7b..73f131d 100644 --- a/src/UiPatternsSettingsManager.php +++ b/src/UiPatternsSettingsManager.php @@ -8,6 +8,7 @@ use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Plugin\DefaultPluginManager; use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\ui_patterns\Definition\PatternDefinition; /** * Provides the UI Patterns Settings plugin manager. @@ -26,6 +27,25 @@ public function __construct(\Traversable $namespaces, ModuleHandlerInterface $mo $this->setCacheBackend($cache_backend, 'ui_patterns_settings', ['ui_patterns_settings']); } + /** + * Returns TRUE if a variant token can configured. + * + * @param \Drupal\ui_patterns\Definition\PatternDefinition $pattern_definition + * The pattern definition. + * + * @return bool + * Returns TRUE if a variant token can configured. + */ + public static function allowVariantToken(PatternDefinition $pattern_definition) { + $ary = $pattern_definition->getAdditional(); + if (isset($ary['allow_variant_token']) && $ary['allow_variant_token'] === TRUE) { + return TRUE; + } + else { + return FALSE; + } + } + /** * {@inheritdoc} */ diff --git a/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig b/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig index 4b2fd86..5f7c453 100644 --- a/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig +++ b/tests/modules/ui_patterns_settings_render_test/templates/pattern-foo-settings.html.twig @@ -9,5 +9,6 @@
Checkboxes: {% for i in checkboxes %} {{- i -}} {% endfor %}
Attributes: {{ attributes }}
- +VVV +{{ variant }} {{ dummy }} diff --git a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml index c043a6b..021b61e 100644 --- a/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml +++ b/tests/modules/ui_patterns_settings_render_test/templates/settings.ui_patterns.yml @@ -4,6 +4,7 @@ foo_settings: dummy: type: text label: Dummy + allow_variant_token: true variants: default: label: Default diff --git a/ui_patterns_settings.module b/ui_patterns_settings.module index c0fa397..5bc3c4d 100644 --- a/ui_patterns_settings.module +++ b/ui_patterns_settings.module @@ -10,7 +10,6 @@ use Drupal\ui_patterns_settings\UiPatternsSettings; use Drupal\ui_patterns\UiPatterns; use Drupal\ui_patterns\Definition\PatternDefinition; use Drupal\ui_patterns_settings\Form\SettingsFormBuilder; -use Drupal\Core\Form\FormStateInterface; /** * Implements hook_ui_patterns_layouts_display_settings_form_alter().