Code Coverage
 
Lines
Branches
Paths
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 60
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
ViewsManagementController
0.00% covered (danger)
0.00%
0 / 60
0.00% covered (danger)
0.00%
0 / 17
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 4
90
0.00% covered (danger)
0.00%
0 / 1
 __construct
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
 pageViewsIndex
0.00% covered (danger)
0.00%
0 / 16
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
6
 buildRow
0.00% covered (danger)
0.00%
0 / 28
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 6
0.00% covered (danger)
0.00%
0 / 1
30
 getOperationLinks
0.00% covered (danger)
0.00%
0 / 15
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_views\Controller;
6
7use Drupal\Core\Controller\ControllerBase;
8use Drupal\Core\Datetime\DateFormatterInterface;
9use Drupal\Core\Url;
10use Drupal\display_builder\DisplayBuildableInterface;
11use Drupal\display_builder\DisplayBuilderHelpers;
12use Drupal\display_builder\InstanceInterface;
13use Drupal\display_builder_views\Plugin\display_builder\Buildable\ViewDisplay;
14
15/**
16 * Returns responses for Display Builder ui routes.
17 */
18class ViewsManagementController extends ControllerBase {
19
20  public function __construct(
21    private readonly DateFormatterInterface $dateFormatter,
22  ) {}
23
24  /**
25   * Generate a simple index of saved display builder.
26   *
27   * @return array
28   *   A render array.
29   */
30  public function pageViewsIndex(): array {
31    $build = [];
32    $build['display_builder_table'] = [
33      '#theme' => 'table',
34      '#header' => [
35        'id' => ['data' => $this->t('View')],
36        'profile_id' => ['data' => $this->t('Profile')],
37        'updated' => ['data' => $this->t('Updated')],
38        'log' => ['data' => $this->t('Last log')],
39        'operations' => ['data' => $this->t('Operations')],
40      ],
41      '#empty' => $this->t('No Display builder enabled on any view.'),
42    ];
43
44    foreach (ViewDisplay::collectInstances() as $instance_id => $instance) {
45      $build['display_builder_table']['#rows'][$instance_id] = $this->buildRow($instance);
46    }
47    $build['pager'] = ['#type' => 'pager'];
48
49    return $build;
50  }
51
52  /**
53   * Builds a table row for a display builder related to a view display managed.
54   *
55   * @param \Drupal\display_builder\InstanceInterface|null $instance
56   *   The display builder instance (or NULL).
57   *
58   * @return array
59   *   A table row.
60   */
61  protected function buildRow(?InstanceInterface $instance): array {
62    if (!$instance) {
63      return [];
64    }
65
66    $instance_id = (string) $instance->id();
67    $view_id = ViewDisplay::checkInstanceId($instance_id)['view'];
68    $display_id = ViewDisplay::checkInstanceId($instance_id)['display'];
69    $view = $this->entityTypeManager()->getStorage('view')->load($view_id);
70
71    if (!$view) {
72      return [];
73    }
74
75    /** @var \Drupal\display_builder\Plugin\Field\FieldType\HistoryStep $present; */
76    $present = $instance->get('present')->first();
77
78    $row = [];
79
80    $row['id']['data'] = [
81      '#type' => 'link',
82      '#title' => $view->label() . ' (' . $display_id . ')',
83      '#url' => Url::fromRoute('entity.view.edit_display_form', ['view' => $view_id, 'display_id' => $display_id]),
84    ];
85
86    $row['profile_id'] = [
87      'data-profile-id' => \sprintf('profile_%s', $view_id),
88      'data' => $view->getDisplay($display_id)['display_options']['display_extenders']['display_builder'][DisplayBuildableInterface::PROFILE_PROPERTY] ?? '?',
89    ];
90    $row['updated']['data'] = $present->getTime() ? DisplayBuilderHelpers::formatTime($this->dateFormatter, (int) $present->getTime()) : '-';
91
92    if ($log = $present->getLog()) {
93      $row['log']['data'] = $log;
94    }
95    else {
96      $row['log']['data'] = '-';
97    }
98    $row['operations']['data']['operations'] = [
99      '#type' => 'operations',
100      '#links' => $this->getOperationLinks($instance_id),
101    ];
102
103    return ['data' => $row];
104  }
105
106  /**
107   * Delete a display builder.
108   *
109   * @param string $builder_id
110   *   The display builder id.
111   *
112   * @return array
113   *   The operation links.
114   */
115  private function getOperationLinks(string $builder_id): array {
116    return [
117      'manage' => [
118        'title' => $this->t('Build display'),
119        'url' => ViewDisplay::getUrlFromInstanceId($builder_id),
120        'attributes' => [
121          'data-link-builder' => $builder_id,
122        ],
123      ],
124      'delete' => [
125        'title' => $this->t('Delete'),
126        'url' => Url::fromRoute('display_builder_views.views.delete', [
127          'builder_id' => $builder_id,
128        ]),
129      ],
130    ];
131  }
132
133}