You are here

public function ViewEditForm::renderDisplayTop in Drupal 10

Same name and namespace in other branches
  1. 8 core/modules/views_ui/src/ViewEditForm.php \Drupal\views_ui\ViewEditForm::renderDisplayTop()
  2. 9 core/modules/views_ui/src/ViewEditForm.php \Drupal\views_ui\ViewEditForm::renderDisplayTop()

Render the top of the display so it can be updated during ajax operations.

File

core/modules/views_ui/src/ViewEditForm.php, line 714

Class

ViewEditForm
Form controller for the Views edit form.

Namespace

Drupal\views_ui

Code

public function renderDisplayTop(ViewUI $view) {
  $display_id = $this->displayID;
  $element['#theme_wrappers'][] = 'views_ui_container';
  $element['#attributes']['class'] = [
    'views-display-top',
    'clearfix',
  ];
  $element['#attributes']['id'] = [
    'views-display-top',
  ];

  // Extra actions for the display
  $element['extra_actions'] = [
    '#type' => 'dropbutton',
    '#attributes' => [
      'id' => 'views-display-extra-actions',
    ],
    '#links' => [
      'edit-details' => [
        'title' => $this
          ->t('Edit view name/description'),
        'url' => Url::fromRoute('views_ui.form_edit_details', [
          'js' => 'nojs',
          'view' => $view
            ->id(),
          'display_id' => $display_id,
        ]),
        'attributes' => [
          'class' => [
            'views-ajax-link',
          ],
        ],
      ],
      'analyze' => [
        'title' => $this
          ->t('Analyze view'),
        'url' => Url::fromRoute('views_ui.form_analyze', [
          'js' => 'nojs',
          'view' => $view
            ->id(),
          'display_id' => $display_id,
        ]),
        'attributes' => [
          'class' => [
            'views-ajax-link',
          ],
        ],
      ],
      'duplicate' => [
        'title' => $this
          ->t('Duplicate view'),
        'url' => $view
          ->toUrl('duplicate-form'),
      ],
      'reorder' => [
        'title' => $this
          ->t('Reorder displays'),
        'url' => Url::fromRoute('views_ui.form_reorder_displays', [
          'js' => 'nojs',
          'view' => $view
            ->id(),
          'display_id' => $display_id,
        ]),
        'attributes' => [
          'class' => [
            'views-ajax-link',
          ],
        ],
      ],
    ],
  ];
  if ($view
    ->access('delete')) {
    $element['extra_actions']['#links']['delete'] = [
      'title' => $this
        ->t('Delete view'),
      'url' => $view
        ->toUrl('delete-form'),
    ];
  }

  // Let other modules add additional links here.
  \Drupal::moduleHandler()
    ->alter('views_ui_display_top_links', $element['extra_actions']['#links'], $view, $display_id);
  if (isset($view->type) && $view->type != $this
    ->t('Default')) {
    if ($view->type == $this
      ->t('Overridden')) {
      $element['extra_actions']['#links']['revert'] = [
        'title' => $this
          ->t('Revert view'),
        'href' => "admin/structure/views/view/{$view->id()}/revert",
        'query' => [
          'destination' => $view
            ->toUrl('edit-form')
            ->toString(),
        ],
      ];
    }
    else {
      $element['extra_actions']['#links']['delete'] = [
        'title' => $this
          ->t('Delete view'),
        'url' => $view
          ->toUrl('delete-form'),
      ];
    }
  }

  // Determine the displays available for editing.
  if ($tabs = $this
    ->getDisplayTabs($view)) {
    if ($display_id) {
      $tabs[$display_id]['#active'] = TRUE;
    }
    $tabs['#prefix'] = '<h2 class="visually-hidden">' . $this
      ->t('Secondary tabs') . '</h2><ul id = "views-display-menu-tabs" class="tabs secondary">';
    $tabs['#suffix'] = '</ul>';
    $element['tabs'] = $tabs;
  }

  // Buttons for adding a new display.
  foreach (Views::fetchPluginNames('display', NULL, [
    $view
      ->get('base_table'),
  ]) as $type => $label) {
    $element['add_display'][$type] = [
      '#type' => 'submit',
      '#value' => $this
        ->t('Add @display', [
        '@display' => $label,
      ]),
      '#limit_validation_errors' => [],
      '#submit' => [
        '::submitDisplayAdd',
        '::submitDelayDestination',
      ],
      '#attributes' => [
        'class' => [
          'add-display',
        ],
        'data-drupal-dropdown-label' => $label,
      ],
      // Allow JavaScript to remove the 'Add ' prefix from the button label when
      // placing the button in an "Add" dropdown menu.
      '#process' => array_merge([
        'views_ui_form_button_was_clicked',
      ], $this->elementInfo
        ->getInfoProperty('submit', '#process', [])),
      '#values' => [
        $this
          ->t('Add @display', [
          '@display' => $label,
        ]),
        $label,
      ],
    ];
  }

  // In AJAX context, ViewUI::rebuildCurrentTab() returns this outside of form
  // context, so hook_form_view_edit_form_alter() is insufficient.
  // @todo remove this after
  //   https://www.drupal.org/project/drupal/issues/3087455 has been resolved.
  \Drupal::moduleHandler()
    ->alter('views_ui_display_top', $element, $view, $display_id);

  // Because themes can implement hook_form_FORM_ID_alter() and because this
  // is a workaround for hook_form_view_edit_form_alter() being insufficient,
  // also invoke this on themes.
  // @todo remove this after
  //   https://www.drupal.org/project/drupal/issues/3087455 has been resolved.
  $this->themeManager
    ->alter('views_ui_display_top', $element, $view, $display_id);
  return $element;
}