Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 87
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 1
PreviewPanel
0.00% covered (danger)
0.00%
0 / 79
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 13
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
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 keyboardShortcuts
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 build
0.00% covered (danger)
0.00%
0 / 8
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 4
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
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
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onMove
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onHistoryChange
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 onUpdate
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
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
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 alterPreviewPlaceholder
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 1
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\StringTranslation\TranslatableMarkup;
8use Drupal\display_builder\Attribute\Island;
9use Drupal\display_builder\DisplayBuilderHelpers;
10use Drupal\display_builder\InstanceInterface;
11use Drupal\display_builder\IslandPluginBase;
12use Drupal\display_builder\IslandType;
13use Drupal\ui_patterns\Element\ComponentElementBuilder;
14use Symfony\Component\DependencyInjection\ContainerInterface;
15
16/**
17 * Preview island plugin implementation.
18 */
19#[Island(
20  id: 'preview',
21  enabled_by_default: TRUE,
22  label: new TranslatableMarkup('Preview'),
23  description: new TranslatableMarkup('Show a real time preview of the display.'),
24  type: IslandType::View,
25  default_region: 'main',
26  icon: 'binoculars',
27)]
28class PreviewPanel extends IslandPluginBase {
29
30  /**
31   * The component element builder.
32   */
33  protected ComponentElementBuilder $componentElementBuilder;
34
35  /**
36   * {@inheritdoc}
37   */
38  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
39    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
40    $instance->componentElementBuilder = $container->get('ui_patterns.component_element_builder');
41
42    return $instance;
43  }
44
45  /**
46   * {@inheritdoc}
47   */
48  public static function keyboardShortcuts(): array {
49    return [
50      'key' => 'p',
51      'help' => t('Show the preview'),
52    ];
53  }
54
55  /**
56   * {@inheritdoc}
57   */
58  public function build(InstanceInterface $builder, array $data = [], array $options = []): array {
59    if (empty($data)) {
60      return [];
61    }
62
63    // Replace preview for empty block until #3561447.
64    $this->alterPreviewPlaceholder($data);
65
66    $returned = [];
67
68    foreach ($data as $slot) {
69      $build = $this->componentElementBuilder->buildSource([], 'content', [], $slot, $this->configuration['contexts'] ?? []);
70      $returned[] = $build['#slots']['content'][0] ?? [];
71    }
72
73    return $returned;
74  }
75
76  /**
77   * {@inheritdoc}
78   */
79  public function onAttachToRoot(string $builder_id, string $instance_id): array {
80    return $this->reloadWithGlobalData($builder_id);
81  }
82
83  /**
84   * {@inheritdoc}
85   */
86  public function onAttachToSlot(string $builder_id, string $instance_id, string $parent_id): array {
87    return $this->reloadWithGlobalData($builder_id);
88  }
89
90  /**
91   * {@inheritdoc}
92   */
93  public function onMove(string $builder_id, string $instance_id): array {
94    return $this->reloadWithGlobalData($builder_id);
95  }
96
97  /**
98   * {@inheritdoc}
99   */
100  public function onHistoryChange(string $builder_id): array {
101    return $this->reloadWithGlobalData($builder_id);
102  }
103
104  /**
105   * {@inheritdoc}
106   */
107  public function onUpdate(string $builder_id, string $instance_id): array {
108    return $this->reloadWithGlobalData($builder_id);
109  }
110
111  /**
112   * {@inheritdoc}
113   */
114  public function onDelete(string $builder_id, string $parent_id): array {
115    return $this->reloadWithGlobalData($builder_id);
116  }
117
118  /**
119   * Replace placeholder for preview.
120   *
121   * Some block source will not be created, create a simple placeholder to have
122   * a preview instead of nothing. Until #3561447 is resoled.
123   *
124   * @param array $data
125   *   The instance data to replace.
126   */
127  private function alterPreviewPlaceholder(array &$data): void {
128    $replacements = [
129      [
130        'search' => ['plugin_id' => 'system_messages_block'],
131        'new_value_title' => new TranslatableMarkup('[Placeholder] Block messages'),
132      ],
133      [
134        'search' => ['source_id' => 'page_title'],
135        'new_value_title' => new TranslatableMarkup('[Placeholder] Page title'),
136      ],
137      [
138        'search' => ['source_id' => 'main_page_content'],
139        'new_value_title' => new TranslatableMarkup('[Placeholder] Page content'),
140        'new_value_class' => 'db-preview-placeholder-lg',
141      ],
142      [
143        'search' => ['source_id' => 'view_attachment_before'],
144        'new_value_title' => new TranslatableMarkup('[Placeholder] View attachment before'),
145        'new_value_class' => 'db-preview-placeholder-md',
146      ],
147      [
148        'search' => ['source_id' => 'view_exposed'],
149        'new_value_title' => new TranslatableMarkup('[Placeholder] View exposed form'),
150        'new_value_class' => 'db-preview-placeholder-md',
151      ],
152      [
153        'search' => ['source_id' => 'view_header'],
154        'new_value_title' => new TranslatableMarkup('[Placeholder] View header'),
155        'new_value_class' => 'db-preview-placeholder-md',
156      ],
157      [
158        'search' => ['source_id' => 'view_rows'],
159        'new_value_title' => new TranslatableMarkup('[Placeholder] View rows'),
160        'new_value_class' => 'db-preview-placeholder-lg',
161      ],
162      [
163        'search' => ['source_id' => 'view_attachment_after'],
164        'new_value_title' => new TranslatableMarkup('[Placeholder] View attachment after'),
165        'new_value_class' => 'db-preview-placeholder-md',
166      ],
167      [
168        'search' => ['source_id' => 'view_pager'],
169        'new_value_title' => new TranslatableMarkup('[Placeholder] View pager'),
170      ],
171      [
172        'search' => ['source_id' => 'view_more'],
173        'new_value_title' => new TranslatableMarkup('[Placeholder] View more'),
174      ],
175      [
176        'search' => ['source_id' => 'view_footer'],
177        'new_value_title' => new TranslatableMarkup('[Placeholder] View footer'),
178        'new_value_class' => 'db-preview-placeholder-md',
179      ],
180      [
181        'search' => ['source_id' => 'view_feed_icons'],
182        'new_value_title' => new TranslatableMarkup('[Placeholder] View feed icons'),
183      ],
184    ];
185
186    DisplayBuilderHelpers::findAndReplaceInArray($data, $replacements);
187  }
188
189}

Paths

Below are the source code lines that represent each code path as identified by Xdebug. Please note a path is not necessarily coterminous with a line, a line may contain multiple paths and therefore show up more than once. Please also be aware that some paths may include implicit rather than explicit branches, e.g. an if statement always has an else as part of its logical flow even if you didn't write one.

PreviewPanel->alterPreviewPlaceholder
127  private function alterPreviewPlaceholder(array &$data): void {
128    $replacements = [
129      [
130        'search' => ['plugin_id' => 'system_messages_block'],
131        'new_value_title' => new TranslatableMarkup('[Placeholder] Block messages'),
132      ],
133      [
134        'search' => ['source_id' => 'page_title'],
135        'new_value_title' => new TranslatableMarkup('[Placeholder] Page title'),
136      ],
137      [
138        'search' => ['source_id' => 'main_page_content'],
139        'new_value_title' => new TranslatableMarkup('[Placeholder] Page content'),
140        'new_value_class' => 'db-preview-placeholder-lg',
141      ],
142      [
143        'search' => ['source_id' => 'view_attachment_before'],
144        'new_value_title' => new TranslatableMarkup('[Placeholder] View attachment before'),
145        'new_value_class' => 'db-preview-placeholder-md',
146      ],
147      [
148        'search' => ['source_id' => 'view_exposed'],
149        'new_value_title' => new TranslatableMarkup('[Placeholder] View exposed form'),
150        'new_value_class' => 'db-preview-placeholder-md',
151      ],
152      [
153        'search' => ['source_id' => 'view_header'],
154        'new_value_title' => new TranslatableMarkup('[Placeholder] View header'),
155        'new_value_class' => 'db-preview-placeholder-md',
156      ],
157      [
158        'search' => ['source_id' => 'view_rows'],
159        'new_value_title' => new TranslatableMarkup('[Placeholder] View rows'),
160        'new_value_class' => 'db-preview-placeholder-lg',
161      ],
162      [
163        'search' => ['source_id' => 'view_attachment_after'],
164        'new_value_title' => new TranslatableMarkup('[Placeholder] View attachment after'),
165        'new_value_class' => 'db-preview-placeholder-md',
166      ],
167      [
168        'search' => ['source_id' => 'view_pager'],
169        'new_value_title' => new TranslatableMarkup('[Placeholder] View pager'),
170      ],
171      [
172        'search' => ['source_id' => 'view_more'],
173        'new_value_title' => new TranslatableMarkup('[Placeholder] View more'),
174      ],
175      [
176        'search' => ['source_id' => 'view_footer'],
177        'new_value_title' => new TranslatableMarkup('[Placeholder] View footer'),
178        'new_value_class' => 'db-preview-placeholder-md',
179      ],
180      [
181        'search' => ['source_id' => 'view_feed_icons'],
182        'new_value_title' => new TranslatableMarkup('[Placeholder] View feed icons'),
183      ],
184    ];
185
186    DisplayBuilderHelpers::findAndReplaceInArray($data, $replacements);
187  }
PreviewPanel->build
58  public function build(InstanceInterface $builder, array $data = [], array $options = []): array {
59    if (empty($data)) {
 
60      return [];
58  public function build(InstanceInterface $builder, array $data = [], array $options = []): array {
59    if (empty($data)) {
 
64    $this->alterPreviewPlaceholder($data);
65
66    $returned = [];
67
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
69      $build = $this->componentElementBuilder->buildSource([], 'content', [], $slot, $this->configuration['contexts'] ?? []);
 
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
69      $build = $this->componentElementBuilder->buildSource([], 'content', [], $slot, $this->configuration['contexts'] ?? []);
70      $returned[] = $build['#slots']['content'][0] ?? [];
71    }
72
73    return $returned;
74  }
58  public function build(InstanceInterface $builder, array $data = [], array $options = []): array {
59    if (empty($data)) {
 
64    $this->alterPreviewPlaceholder($data);
65
66    $returned = [];
67
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
69      $build = $this->componentElementBuilder->buildSource([], 'content', [], $slot, $this->configuration['contexts'] ?? []);
70      $returned[] = $build['#slots']['content'][0] ?? [];
71    }
72
73    return $returned;
74  }
58  public function build(InstanceInterface $builder, array $data = [], array $options = []): array {
59    if (empty($data)) {
 
64    $this->alterPreviewPlaceholder($data);
65
66    $returned = [];
67
68    foreach ($data as $slot) {
 
68    foreach ($data as $slot) {
69      $build = $this->componentElementBuilder->buildSource([], 'content', [], $slot, $this->configuration['contexts'] ?? []);
70      $returned[] = $build['#slots']['content'][0] ?? [];
71    }
72
73    return $returned;
74  }
PreviewPanel->create
38  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
39    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
40    $instance->componentElementBuilder = $container->get('ui_patterns.component_element_builder');
41
42    return $instance;
43  }
PreviewPanel->keyboardShortcuts
50      'key' => 'p',
51      'help' => t('Show the preview'),
52    ];
53  }
PreviewPanel->onAttachToRoot
79  public function onAttachToRoot(string $builder_id, string $instance_id): array {
80    return $this->reloadWithGlobalData($builder_id);
81  }
PreviewPanel->onAttachToSlot
86  public function onAttachToSlot(string $builder_id, string $instance_id, string $parent_id): array {
87    return $this->reloadWithGlobalData($builder_id);
88  }
PreviewPanel->onDelete
114  public function onDelete(string $builder_id, string $parent_id): array {
115    return $this->reloadWithGlobalData($builder_id);
116  }
PreviewPanel->onHistoryChange
100  public function onHistoryChange(string $builder_id): array {
101    return $this->reloadWithGlobalData($builder_id);
102  }
PreviewPanel->onMove
93  public function onMove(string $builder_id, string $instance_id): array {
94    return $this->reloadWithGlobalData($builder_id);
95  }
PreviewPanel->onUpdate
107  public function onUpdate(string $builder_id, string $instance_id): array {
108    return $this->reloadWithGlobalData($builder_id);
109  }