Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
0.00% |
0 / 1 |
|
11.11% |
1 / 9 |
CRAP | |
15.73% |
14 / 89 |
| ViewListBuilder | |
0.00% |
0 / 1 |
|
11.11% |
1 / 9 |
339.57 | |
15.73% |
14 / 89 |
| createInstance | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 3 |
|||
| __construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 4 |
|||
| load | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 6 |
|||
| buildRow | |
100.00% |
1 / 1 |
2 | |
100.00% |
14 / 14 |
|||
| buildHeader | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 6 |
|||
| getDefaultOperations | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 11 |
|||
| render | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 28 |
|||
| getDisplaysList | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 7 |
|||
| getDisplayPaths | |
0.00% |
0 / 1 |
30 | |
0.00% |
0 / 10 |
|||
| <?php | |
| /** | |
| * @file | |
| * Contains \Drupal\views_ui\ViewListBuilder. | |
| */ | |
| namespace Drupal\views_ui; | |
| use Drupal\Component\Plugin\PluginManagerInterface; | |
| use Drupal\Core\Entity\EntityInterface; | |
| use Drupal\Core\Config\Entity\ConfigEntityListBuilder; | |
| use Drupal\Core\Entity\EntityStorageInterface; | |
| use Drupal\Core\Entity\EntityTypeInterface; | |
| use Drupal\Core\Url; | |
| use Symfony\Component\DependencyInjection\ContainerInterface; | |
| /** | |
| * Defines a class to build a listing of view entities. | |
| * | |
| * @see \Drupal\views\Entity\View | |
| */ | |
| class ViewListBuilder extends ConfigEntityListBuilder { | |
| /** | |
| * The views display plugin manager to use. | |
| * | |
| * @var \Drupal\Component\Plugin\PluginManagerInterface | |
| */ | |
| protected $displayManager; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| protected $limit; | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) { | |
| return new static( | |
| $entity_type, | |
| $container->get('entity.manager')->getStorage($entity_type->id()), | |
| $container->get('plugin.manager.views.display') | |
| ); | |
| } | |
| /** | |
| * Constructs a new ViewListBuilder object. | |
| * | |
| * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type | |
| * The entity type definition. | |
| * @param \Drupal\Core\Entity\EntityStorageInterface $storage. | |
| * The entity storage class. | |
| * @param \Drupal\Component\Plugin\PluginManagerInterface $display_manager | |
| * The views display plugin manager to use. | |
| */ | |
| public function __construct(EntityTypeInterface $entity_type, EntityStorageInterface $storage, PluginManagerInterface $display_manager) { | |
| parent::__construct($entity_type, $storage); | |
| $this->displayManager = $display_manager; | |
| // This list builder uses client-side filters which requires all entities to | |
| // be listed, disable the pager. | |
| // @todo https://www.drupal.org/node/2536826 change the filtering to support | |
| // a pager. | |
| $this->limit = FALSE; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function load() { | |
| $entities = array( | |
| 'enabled' => array(), | |
| 'disabled' => array(), | |
| ); | |
| foreach (parent::load() as $entity) { | |
| if ($entity->status()) { | |
| $entities['enabled'][] = $entity; | |
| } | |
| else { | |
| $entities['disabled'][] = $entity; | |
| } | |
| } | |
| return $entities; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildRow(EntityInterface $view) { | |
| $row = parent::buildRow($view); | |
| return array( | |
| 'data' => array( | |
| 'view_name' => array( | |
| 'data' => array( | |
| '#theme' => 'views_ui_view_info', | |
| '#view' => $view, | |
| '#displays' => $this->getDisplaysList($view) | |
| ), | |
| ), | |
| 'description' => array( | |
| 'data' => array( | |
| '#plain_text' => $view->get('description'), | |
| ), | |
| 'data-drupal-selector' => 'views-table-filter-text-source', | |
| ), | |
| 'tag' => array( | |
| 'data' => array( | |
| '#plain_text' => $view->get('tag'), | |
| ), | |
| 'data-drupal-selector' => 'views-table-filter-text-source', | |
| ), | |
| 'path' => array( | |
| 'data' => array( | |
| '#theme' => 'item_list', | |
| '#items' => $this->getDisplayPaths($view), | |
| '#context' => ['list_style' => 'comma-list'], | |
| ), | |
| ), | |
| 'operations' => $row['operations'], | |
| ), | |
| 'title' => $this->t('Machine name: @name', array('@name' => $view->id())), | |
| 'class' => array($view->status() ? 'views-ui-list-enabled' : 'views-ui-list-disabled'), | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function buildHeader() { | |
| return array( | |
| 'view_name' => array( | |
| 'data' => $this->t('View name'), | |
| 'class' => array('views-ui-name'), | |
| ), | |
| 'description' => array( | |
| 'data' => $this->t('Description'), | |
| 'class' => array('views-ui-description'), | |
| ), | |
| 'tag' => array( | |
| 'data' => $this->t('Tag'), | |
| 'class' => array('views-ui-tag'), | |
| ), | |
| 'path' => array( | |
| 'data' => $this->t('Path'), | |
| 'class' => array('views-ui-path'), | |
| ), | |
| 'operations' => array( | |
| 'data' => $this->t('Operations'), | |
| 'class' => array('views-ui-operations'), | |
| ), | |
| ); | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function getDefaultOperations(EntityInterface $entity) { | |
| $operations = parent::getDefaultOperations($entity); | |
| if ($entity->hasLinkTemplate('duplicate-form')) { | |
| $operations['duplicate'] = array( | |
| 'title' => $this->t('Duplicate'), | |
| 'weight' => 15, | |
| 'url' => $entity->urlInfo('duplicate-form'), | |
| ); | |
| } | |
| // Add AJAX functionality to enable/disable operations. | |
| foreach (array('enable', 'disable') as $op) { | |
| if (isset($operations[$op])) { | |
| $operations[$op]['url'] = $entity->urlInfo($op); | |
| // Enable and disable operations should use AJAX. | |
| $operations[$op]['attributes']['class'][] = 'use-ajax'; | |
| } | |
| } | |
| return $operations; | |
| } | |
| /** | |
| * {@inheritdoc} | |
| */ | |
| public function render() { | |
| $entities = $this->load(); | |
| $list['#type'] = 'container'; | |
| $list['#attributes']['id'] = 'views-entity-list'; | |
| $list['#attached']['library'][] = 'core/drupal.ajax'; | |
| $list['#attached']['library'][] = 'views_ui/views_ui.listing'; | |
| $form['filters'] = array( | |
| '#type' => 'container', | |
| '#attributes' => array( | |
| 'class' => array('table-filter', 'js-show'), | |
| ), | |
| ); | |
| $list['filters']['text'] = array( | |
| '#type' => 'search', | |
| '#title' => $this->t('Filter'), | |
| '#title_display' => 'invisible', | |
| '#size' => 40, | |
| '#placeholder' => $this->t('Filter by view name or description'), | |
| '#attributes' => array( | |
| 'class' => array('views-filter-text'), | |
| 'data-table' => '.views-listing-table', | |
| 'autocomplete' => 'off', | |
| 'title' => $this->t('Enter a part of the view name or description to filter by.'), | |
| ), | |
| ); | |
| $list['enabled']['heading']['#markup'] = '<h2>' . $this->t('Enabled', array(), array('context' => 'Plural')) . '</h2>'; | |
| $list['disabled']['heading']['#markup'] = '<h2>' . $this->t('Disabled', array(), array('context' => 'Plural')) . '</h2>'; | |
| foreach (array('enabled', 'disabled') as $status) { | |
| $list[$status]['#type'] = 'container'; | |
| $list[$status]['#attributes'] = array('class' => array('views-list-section', $status)); | |
| $list[$status]['table'] = array( | |
| '#type' => 'table', | |
| '#attributes' => array( | |
| 'class' => array('views-listing-table'), | |
| ), | |
| '#header' => $this->buildHeader(), | |
| '#rows' => array(), | |
| ); | |
| foreach ($entities[$status] as $entity) { | |
| $list[$status]['table']['#rows'][$entity->id()] = $this->buildRow($entity); | |
| } | |
| } | |
| // @todo Use a placeholder for the entity label if this is abstracted to | |
| // other entity types. | |
| $list['enabled']['table']['#empty'] = $this->t('There are no enabled views.'); | |
| $list['disabled']['table']['#empty'] = $this->t('There are no disabled views.'); | |
| return $list; | |
| } | |
| /** | |
| * Gets a list of displays included in the view. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $view | |
| * The view entity instance to get a list of displays for. | |
| * | |
| * @return array | |
| * An array of display types that this view includes. | |
| */ | |
| protected function getDisplaysList(EntityInterface $view) { | |
| $displays = array(); | |
| foreach ($view->get('display') as $display) { | |
| $definition = $this->displayManager->getDefinition($display['display_plugin']); | |
| if (!empty($definition['admin'])) { | |
| // Cast the admin label to a string since it is an object. | |
| // @see \Drupal\Core\StringTranslation\TranslatableMarkup | |
| $displays[] = (string) $definition['admin']; | |
| } | |
| } | |
| sort($displays); | |
| return $displays; | |
| } | |
| /** | |
| * Gets a list of paths assigned to the view. | |
| * | |
| * @param \Drupal\Core\Entity\EntityInterface $view | |
| * The view entity. | |
| * | |
| * @return array | |
| * An array of paths for this view. | |
| */ | |
| protected function getDisplayPaths(EntityInterface $view) { | |
| $all_paths = array(); | |
| $executable = $view->getExecutable(); | |
| $executable->initDisplay(); | |
| foreach ($executable->displayHandlers as $display) { | |
| if ($display->hasPath()) { | |
| $path = $display->getPath(); | |
| if ($view->status() && strpos($path, '%') === FALSE) { | |
| // @todo Views should expect and store a leading /. See: | |
| // https://www.drupal.org/node/2423913 | |
| $all_paths[] = \Drupal::l('/' . $path, Url::fromUserInput('/' . $path)); | |
| } | |
| else { | |
| $all_paths[] = '/' . $path; | |
| } | |
| } | |
| } | |
| return array_unique($all_paths); | |
| } | |
| } |