Code Coverage |
||||||||||||||||
Lines |
Branches |
Paths |
Functions and Methods |
Classes and Traits |
||||||||||||
| Total | |
28.57% |
10 / 35 |
|
50.00% |
5 / 10 |
|
37.50% |
3 / 8 |
|
33.33% |
2 / 6 |
CRAP | |
0.00% |
0 / 1 |
| ScaffoldPanel | |
35.71% |
10 / 28 |
|
50.00% |
5 / 10 |
|
37.50% |
3 / 8 |
|
33.33% |
2 / 6 |
28.78 | |
0.00% |
0 / 1 |
| keyboardShortcuts | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| defaultConfiguration | |
100.00% |
3 / 3 |
|
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
| buildConfigurationForm | |
0.00% |
0 / 8 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| configurationSummary | |
0.00% |
0 / 4 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
|
0.00% |
0 / 1 |
2 | |||
| buildSingleComponent | |
71.43% |
5 / 7 |
|
60.00% |
3 / 5 |
|
33.33% |
1 / 3 |
|
0.00% |
0 / 1 |
5.67 | |||
| getLayoutComponentIds | |
100.00% |
2 / 2 |
|
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
2 | |||
| 1 | <?php |
| 2 | |
| 3 | declare(strict_types=1); |
| 4 | |
| 5 | namespace Drupal\display_builder\Plugin\display_builder\Island; |
| 6 | |
| 7 | use Drupal\Core\Form\FormStateInterface; |
| 8 | use Drupal\Core\StringTranslation\TranslatableMarkup; |
| 9 | use Drupal\display_builder\Attribute\Island; |
| 10 | use Drupal\display_builder\InstanceInterface; |
| 11 | use Drupal\display_builder\Island\IslandConfigurationFormInterface; |
| 12 | use Drupal\display_builder\Island\IslandConfigurationFormTrait; |
| 13 | use Drupal\display_builder\Island\IslandType; |
| 14 | use Drupal\display_builder\SourceWithSlotsInterface; |
| 15 | |
| 16 | /** |
| 17 | * Scaffold island plugin implementation. |
| 18 | * |
| 19 | * A Wireframe-style hierarchical view (schematic cards, no live preview) - |
| 20 | * except for a configurable allowlist of component IDs, rendered with |
| 21 | * their real output instead (@see BuilderPanel::buildComponentRealRender()), |
| 22 | * so the actual grid/layout nesting is visible at a glance. |
| 23 | * |
| 24 | * Which components count as "layout" is theme-specific, hence a configurable |
| 25 | * list rather than a hardcoded one. |
| 26 | */ |
| 27 | #[Island( |
| 28 | id: 'scaffold', |
| 29 | label: new TranslatableMarkup('Scaffold'), |
| 30 | description: new TranslatableMarkup('Hierarchical view like the Wireframe, with configured components (e.g. grid rows) rendered with their real output.'), |
| 31 | type: IslandType::View, |
| 32 | default_region: 'main', |
| 33 | icon: 'grid-3x3-gap', |
| 34 | )] |
| 35 | class ScaffoldPanel extends WireframePanelBase implements IslandConfigurationFormInterface { |
| 36 | |
| 37 | use IslandConfigurationFormTrait; |
| 38 | |
| 39 | /** |
| 40 | * {@inheritdoc} |
| 41 | */ |
| 42 | public static function keyboardShortcuts(): array { |
| 43 | return [ |
| 44 | 'key' => 'g', |
| 45 | 'help' => t('Show the scaffold'), |
| 46 | ]; |
| 47 | } |
| 48 | |
| 49 | /** |
| 50 | * {@inheritdoc} |
| 51 | */ |
| 52 | public function defaultConfiguration(): array { |
| 53 | return [ |
| 54 | 'components' => '', |
| 55 | ]; |
| 56 | } |
| 57 | |
| 58 | /** |
| 59 | * {@inheritdoc} |
| 60 | */ |
| 61 | public function buildConfigurationForm(array $form, FormStateInterface $form_state): array { |
| 62 | $configuration = $this->getConfiguration(); |
| 63 | |
| 64 | $form['components'] = [ |
| 65 | '#type' => 'textarea', |
| 66 | '#title' => $this->t('Render components'), |
| 67 | '#description' => $this->t('Component IDs to render with their real output instead of a placeholder. One per line. Example: "ui_suite_bootstrap:grid_row_1". Recommended usage is to set components used as layout/grid.'), |
| 68 | '#default_value' => $configuration['components'] ?? '', |
| 69 | ]; |
| 70 | |
| 71 | return $form; |
| 72 | } |
| 73 | |
| 74 | /** |
| 75 | * {@inheritdoc} |
| 76 | */ |
| 77 | public function configurationSummary(): array { |
| 78 | $count = \count($this->getLayoutComponentIds()); |
| 79 | |
| 80 | return [ |
| 81 | $this->formatPlural($count, '@count component rendered with real output', '@count components rendered with real output'), |
| 82 | ]; |
| 83 | } |
| 84 | |
| 85 | /** |
| 86 | * {@inheritdoc} |
| 87 | */ |
| 88 | protected function buildSingleComponent(InstanceInterface $instance, string $node_id, SourceWithSlotsInterface $source, array $data, int $index = 0): ?array { |
| 89 | $info = $this->resolveComponentInfo($source, $data, $node_id); |
| 90 | |
| 91 | if ($info === NULL) { |
| 92 | return NULL; |
| 93 | } |
| 94 | |
| 95 | ['component_id' => $component_id, 'label' => $label, 'instance_id' => $node_id] = $info; |
| 96 | |
| 97 | if (\in_array($component_id, $this->getLayoutComponentIds(), TRUE)) { |
| 98 | return $this->buildComponentRealRender($instance, $node_id, $source, $data, $component_id, $label, $index); |
| 99 | } |
| 100 | |
| 101 | return parent::buildSingleComponent($instance, $node_id, $source, $data, $index); |
| 102 | } |
| 103 | |
| 104 | /** |
| 105 | * The configured component IDs to render with their real output. |
| 106 | * |
| 107 | * @return string[] |
| 108 | * Component IDs, e.g. "ui_suite_bootstrap:grid_row_1". |
| 109 | */ |
| 110 | private function getLayoutComponentIds(): array { |
| 111 | $configuration = $this->getConfiguration(); |
| 112 | |
| 113 | return \array_filter(\preg_split('/\r\n|\r|\n/', \trim($configuration['components'] ?? '')) ?: []); |
| 114 | } |
| 115 | |
| 116 | } |
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.
| 61 | public function buildConfigurationForm(array $form, FormStateInterface $form_state): array { |
| 62 | $configuration = $this->getConfiguration(); |
| 63 | |
| 64 | $form['components'] = [ |
| 65 | '#type' => 'textarea', |
| 66 | '#title' => $this->t('Render components'), |
| 67 | '#description' => $this->t('Component IDs to render with their real output instead of a placeholder. One per line. Example: "ui_suite_bootstrap:grid_row_1". Recommended usage is to set components used as layout/grid.'), |
| 68 | '#default_value' => $configuration['components'] ?? '', |
| 69 | ]; |
| 70 | |
| 71 | return $form; |
| 72 | } |
| 88 | protected function buildSingleComponent(InstanceInterface $instance, string $node_id, SourceWithSlotsInterface $source, array $data, int $index = 0): ?array { |
| 89 | $info = $this->resolveComponentInfo($source, $data, $node_id); |
| 90 | |
| 91 | if ($info === NULL) { |
| 92 | return NULL; |
| 88 | protected function buildSingleComponent(InstanceInterface $instance, string $node_id, SourceWithSlotsInterface $source, array $data, int $index = 0): ?array { |
| 89 | $info = $this->resolveComponentInfo($source, $data, $node_id); |
| 90 | |
| 91 | if ($info === NULL) { |
| 95 | ['component_id' => $component_id, 'label' => $label, 'instance_id' => $node_id] = $info; |
| 96 | |
| 97 | if (\in_array($component_id, $this->getLayoutComponentIds(), TRUE)) { |
| 98 | return $this->buildComponentRealRender($instance, $node_id, $source, $data, $component_id, $label, $index); |
| 88 | protected function buildSingleComponent(InstanceInterface $instance, string $node_id, SourceWithSlotsInterface $source, array $data, int $index = 0): ?array { |
| 89 | $info = $this->resolveComponentInfo($source, $data, $node_id); |
| 90 | |
| 91 | if ($info === NULL) { |
| 95 | ['component_id' => $component_id, 'label' => $label, 'instance_id' => $node_id] = $info; |
| 96 | |
| 97 | if (\in_array($component_id, $this->getLayoutComponentIds(), TRUE)) { |
| 101 | return parent::buildSingleComponent($instance, $node_id, $source, $data, $index); |
| 102 | } |
| 78 | $count = \count($this->getLayoutComponentIds()); |
| 79 | |
| 80 | return [ |
| 81 | $this->formatPlural($count, '@count component rendered with real output', '@count components rendered with real output'), |
| 82 | ]; |
| 83 | } |
| 54 | 'components' => '', |
| 55 | ]; |
| 56 | } |
| 111 | $configuration = $this->getConfiguration(); |
| 112 | |
| 113 | return \array_filter(\preg_split('/\r\n|\r|\n/', \trim($configuration['components'] ?? '')) ?: []); |
| 114 | } |
| 44 | 'key' => 'g', |
| 45 | 'help' => t('Show the scaffold'), |
| 46 | ]; |
| 47 | } |