Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 33
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
UiStylesPanel
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 10
156
0.00% covered (danger)
0.00%
0 / 1
 create
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 label
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 buildForm
0.00% covered (danger)
0.00%
0 / 9
0.00% covered (danger)
0.00%
0 / 1
2
 validateForm
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
2
 alterElement
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 onAttachToRoot
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onAttachToSlot
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onActive
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onDelete
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 isApplicable
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
12
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder\Plugin\display_builder\Island;
6
7use Drupal\Core\Form\FormStateInterface;
8use Drupal\Core\StringTranslation\TranslatableMarkup;
9use Drupal\display_builder\Attribute\Island;
10use Drupal\display_builder\IslandPluginBase;
11use Drupal\display_builder\IslandType;
12use Drupal\display_builder\IslandWithFormInterface;
13use Drupal\display_builder\IslandWithFormTrait;
14use Drupal\display_builder\RenderableAltererInterface;
15use Drupal\ui_styles\StylePluginManagerInterface;
16use Symfony\Component\DependencyInjection\ContainerInterface;
17
18/**
19 * Styles island plugin implementation.
20 *
21 * @todo must move to UI Styles module.
22 */
23#[Island(
24  id: 'ui_styles',
25  label: new TranslatableMarkup('UI Styles'),
26  description: new TranslatableMarkup('Style utilities to apply to the active element.'),
27  type: IslandType::Contextual,
28)]
29class UiStylesPanel extends IslandPluginBase implements IslandWithFormInterface, RenderableAltererInterface {
30
31  use IslandWithFormTrait;
32
33  /**
34   * The UI Styles styles manager.
35   */
36  protected StylePluginManagerInterface $stylesManager;
37
38  /**
39   * {@inheritdoc}
40   */
41  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
42    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
43    $instance->stylesManager = $container->get('plugin.manager.ui_styles');
44
45    return $instance;
46  }
47
48  /**
49   * {@inheritdoc}
50   */
51  public function label(): string {
52    return 'Styles';
53  }
54
55  /**
56   * {@inheritdoc}
57   */
58  public function buildForm(array &$form, FormStateInterface $form_state): void {
59    // The data to be received here is in the form of:
60    // ['styles' => ['selected' => [], 'extra' => '']].
61    $form += [
62      'styles' => [
63        '#type' => 'ui_styles_styles',
64        '#title' => $this->t('Styles'),
65        '#wrapper_type' => 'div',
66        '#default_value' => \array_merge(['selected' => [], 'extra' => ''], $this->data ?? []),
67      ],
68      '#tree' => TRUE,
69    ];
70  }
71
72  /**
73   * {@inheritdoc}
74   */
75  public function validateForm(array &$form, FormStateInterface $form_state): void {
76    // The styles key in the values is added by BlockStylesForm.
77    // Inside the styles key, there are two keys: selected and extra.
78    // The structure here is the one produced by UI styles Form API element.
79    $values = $form_state->getValue('styles');
80    $form_state->setValue('selected', $values['selected'] ?? []);
81    $form_state->setValue('extra', $values['extra'] ?? '');
82    $form_state->unsetValue('styles');
83    // Those two lines are necessary to prevent the form from being rebuilt.
84    // if rebuilt, the form state values will have both the computed ones
85    // and the raw ones (wrapper key and values).
86    $form_state->setRebuild(FALSE);
87    $form_state->setExecuted();
88  }
89
90  /**
91   * {@inheritdoc}
92   */
93  public function alterElement(array $element, array $data = []): array {
94    $selected = $data['selected'] ?? [];
95    $extra = $data['extra'] ?? '';
96
97    return $this->stylesManager->addClasses($element, $selected, $extra);
98  }
99
100  /**
101   * {@inheritdoc}
102   */
103  public function onAttachToRoot(string $builder_id, string $instance_id): array {
104    return $this->reloadWithInstanceData($builder_id, $instance_id);
105  }
106
107  /**
108   * {@inheritdoc}
109   */
110  public function onAttachToSlot(string $builder_id, string $instance_id, string $parent_id): array {
111    return $this->reloadWithInstanceData($builder_id, $instance_id);
112  }
113
114  /**
115   * {@inheritdoc}
116   */
117  public function onActive(string $builder_id, array $data): array {
118    return $this->reloadWithLocalData($builder_id, $data);
119  }
120
121  /**
122   * {@inheritdoc}
123   */
124  public function onDelete(string $builder_id, string $parent_id): array {
125    return $this->reloadWithLocalData($builder_id, []);
126  }
127
128  /**
129   * {@inheritdoc}
130   */
131  public function isApplicable(): bool {
132    return parent::isApplicable() && !empty($this->data) && \Drupal::service('module_handler')
133      ->moduleExists('ui_styles');
134  }
135
136}