You are here

public static function ClaroPreRender::verticalTabs in Drupal 9

Same name and namespace in other branches
  1. 8 core/themes/claro/src/ClaroPreRender.php \Drupal\claro\ClaroPreRender::verticalTabs()

Prerender callback for Vertical Tabs element.

File

core/themes/claro/src/ClaroPreRender.php, line 67

Class

ClaroPreRender
Implements trusted prerender callbacks for the Claro theme.

Namespace

Drupal\claro

Code

public static function verticalTabs($element) {
  $group_type_is_details = isset($element['group']['#type']) && $element['group']['#type'] === 'details';
  $groups_are_present = isset($element['group']['#groups']) && is_array($element['group']['#groups']);

  // If the vertical tabs have a details group, add attributes to those
  // details elements so they are styled as accordion items and have BEM
  // classes.
  if ($group_type_is_details && $groups_are_present) {
    $group_keys = Element::children($element['group']['#groups'], TRUE);
    $first_key = TRUE;
    $last_group_with_child_key = NULL;
    $last_group_with_child_key_last_child_key = NULL;

    // Only iterate through the parents instead of all the group keys.
    foreach ($element['#parents'] as $group_key) {

      // Check parents against groups because we are only looking for group
      // elements.
      if (!in_array($group_key, $group_keys)) {
        continue;
      }
      $children_keys = Element::children($element['group']['#groups'][$group_key], TRUE);
      foreach ($children_keys as $child_key) {
        $last_group_with_child_key = $group_key;
        $type = isset($element['group']['#groups'][$group_key][$child_key]['#type']) ? $element['group']['#groups'][$group_key][$child_key]['#type'] : NULL;
        if ($type === 'details') {

          // Add BEM class to specify the details element is in a vertical
          // tabs group.
          $element['group']['#groups'][$group_key][$child_key]['#attributes']['class'][] = 'vertical-tabs__item';
          $element['group']['#groups'][$group_key][$child_key]['#vertical_tab_item'] = TRUE;
          if ($first_key) {
            $element['group']['#groups'][$group_key][$child_key]['#attributes']['class'][] = 'vertical-tabs__item--first';
            $first_key = FALSE;
          }
          $last_group_with_child_key_last_child_key = $child_key;
        }
      }
    }
    if ($last_group_with_child_key && $last_group_with_child_key_last_child_key) {
      $element['group']['#groups'][$last_group_with_child_key][$last_group_with_child_key_last_child_key]['#attributes']['class'][] = 'vertical-tabs__item--last';
    }
    $element['#attributes']['class'][] = 'vertical-tabs__items';
  }
  return $element;
}