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 / 8
CRAP
0.00% covered (danger)
0.00%
0 / 1
VisibilityConditionsPanel
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 8
210
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
 buildForm
0.00% covered (danger)
0.00%
0 / 14
0.00% covered (danger)
0.00%
0 / 1
30
 validateForm
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 alterElement
0.00% covered (danger)
0.00%
0 / 5
0.00% covered (danger)
0.00%
0 / 1
12
 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
1<?php
2
3declare(strict_types=1);
4
5namespace Drupal\display_builder\Plugin\display_builder\Island;
6
7use Drupal\Core\Executable\ExecutableManagerInterface;
8use Drupal\Core\Form\FormStateInterface;
9use Drupal\Core\StringTranslation\TranslatableMarkup;
10use Drupal\display_builder\Attribute\Island;
11use Drupal\display_builder\IslandPluginBase;
12use Drupal\display_builder\IslandType;
13use Drupal\display_builder\IslandWithFormInterface;
14use Drupal\display_builder\IslandWithFormTrait;
15use Drupal\display_builder\RenderableAltererInterface;
16use Symfony\Component\DependencyInjection\ContainerInterface;
17
18/**
19 * Skins island plugin implementation.
20 */
21#[Island(
22  id: 'visibility_conditions',
23  label: new TranslatableMarkup('Visibility'),
24  description: new TranslatableMarkup('Visibility conditions for the active element.'),
25  type: IslandType::Contextual,
26)]
27class VisibilityConditionsPanel extends IslandPluginBase implements IslandWithFormInterface, RenderableAltererInterface {
28
29  use IslandWithFormTrait;
30
31  /**
32   * The condition manager.
33   */
34  protected ExecutableManagerInterface $conditionManager;
35
36  /**
37   * {@inheritdoc}
38   */
39  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
40    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
41    $instance->conditionManager = $container->get('plugin.manager.condition');
42
43    return $instance;
44  }
45
46  /**
47   * {@inheritdoc}
48   */
49  public function buildForm(array &$form, FormStateInterface $form_state): void {
50    $form['#tree'] = TRUE;
51
52    $data = $form_state->getBuildInfo()['args'][0];
53    $instance = $data['instance'] ?? [];
54    $conditions = $this->conditionManager->getDefinitions();
55    unset($conditions['response_status']);
56
57    foreach ($conditions as $condition_id => $definition) {
58      if (\str_starts_with($condition_id, 'entity_bundle:')) {
59        continue;
60      }
61      /** @var \Drupal\Core\Condition\ConditionInterface $condition */
62      $condition = $this->conditionManager->createInstance($condition_id, $instance[$condition_id] ?? []);
63      $form_state->set(['conditions', $condition_id], $condition);
64      $condition_form = $condition->buildConfigurationForm([], $form_state);
65      $condition_form['#type'] = 'details';
66      $condition_form['#title'] = (\is_array($definition) && isset($definition['label'])) ? $definition['label'] : '';
67      $form[$condition_id] = $condition_form;
68    }
69  }
70
71  /**
72   * {@inheritdoc}
73   */
74  public function validateForm(array &$form, FormStateInterface $form_state): void {
75    // Those two lines are necessary to prevent the form from being rebuilt.
76    // if rebuilt, the form state values will have both the computed ones
77    // and the raw ones (wrapper key and values).
78    $form_state->setRebuild(FALSE);
79    $form_state->setExecuted();
80  }
81
82  /**
83   * {@inheritdoc}
84   */
85  public function alterElement(array $element, array $data = []): array {
86    foreach (\array_keys($data) as $condition_id) {
87      /** @var \Drupal\Core\Condition\ConditionInterface $condition */
88      $condition = $this->conditionManager->createInstance($condition_id, $data[$condition_id] ?? []);
89
90      if (!$this->conditionManager->execute($condition)) {
91        return [];
92      }
93    }
94
95    return $element;
96  }
97
98  /**
99   * {@inheritdoc}
100   */
101  public function onAttachToRoot(string $builder_id, string $instance_id): array {
102    return $this->reloadWithInstanceData($builder_id, $instance_id);
103  }
104
105  /**
106   * {@inheritdoc}
107   */
108  public function onAttachToSlot(string $builder_id, string $instance_id, string $parent_id): array {
109    return $this->reloadWithInstanceData($builder_id, $instance_id);
110  }
111
112  /**
113   * {@inheritdoc}
114   */
115  public function onActive(string $builder_id, array $data): array {
116    return $this->reloadWithLocalData($builder_id, $data);
117  }
118
119  /**
120   * {@inheritdoc}
121   */
122  public function onDelete(string $builder_id, string $parent_id): array {
123    return $this->reloadWithLocalData($builder_id, []);
124  }
125
126}