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