Skip to main content

Main menu dropdown parent item clickable in Drupal 8 using Bootstrap 4

 Edit menu--main.html.twig template file

{#

/**

 * @file

 * Bootstrap Barrio's override to display a menu.

 *

 * Available variables:

 * - menu_name: The machine name of the menu.

 * - items: A nested list of menu items. Each menu item contains:

 *   - attributes: HTML attributes for the menu item.

 *   - below: The menu item child items.

 *   - title: The menu link title.

 *   - url: The menu link url, instance of \Drupal\Core\Url

 *   - localized_options: Menu link localized options.

 *   - is_expanded: TRUE if the link has visible children within the current

 *     menu tree.

 *   - is_collapsed: TRUE if the link has children within the current menu tree

 *     that are not currently visible.

 *   - in_active_trail: TRUE if the link is in the active trail.

 */

#}

{% import _self as menus %}


{#

  We call a macro which calls itself to render the full tree.

  @see http://twig.sensiolabs.org/doc/tags/macro.html

#}

{{ menus.menu_links(items, attributes, 0) }}


{% macro menu_links(items, attributes, menu_level) %}

  {% import _self as menus %}

  {% if items %}

    {% if menu_level == 0 %}

      <ul{{ attributes.addClass('nav navbar-nav') }}>

    {% else %}

      <ul class="dropdown-menu">

    {% endif %}

    {% for item in items %}

      {%

        set classes = [

          menu_level ? 'dropdown-item' : 'nav-item',

          item.is_expanded ? 'menu-item--expanded',

          item.is_collapsed ? 'menu-item--collapsed',

          item.in_active_trail ? 'active',

          item.below ? 'dropdown',

        ]

      %}

      <li{{ item.attributes.addClass(classes) }}>

        {%

          set link_classes = [

            not menu_level ? 'nav-link',

            item.in_active_trail ? 'active',

            item.below ? 'dropdown-toggle-none',

            item.url.getOption('attributes').class ? item.url.getOption('attributes').class | join(' '),

            'nav-link-' ~ item.url.toString() | clean_class,

          ]

        %}

        {% if item.below %}

          {{ link(item.title, item.url, {'class': link_classes}) }}

          <span class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"></span>

          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}

        {% else %}

          {{ link(item.title, item.url, {'class': link_classes}) }}

        {% endif %}

      </li>

    {% endfor %}

    </ul>

  {% endif %}

{% endmacro %}



Javascript to handle multilevel dropdown menu items

$('.dropdown-menu span.dropdown-toggle').on('click', function(e) {
    if (!$(this).next().hasClass('show')) {
      $(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
    }
    var $subMenu = $(this).next('.dropdown-menu');
    $subMenu.toggleClass('show');


    $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
      $('.dropdown-submenu .show').removeClass('show');
    });


    return false;
  });

CSS

.dropdown-toggle::after {
        content: '\f078';
        font-family: "Font Awesome 5 Free";
        font-size: 20px;
        right: 35px;
        position: absolute;
        font-weight: 600;
        border: none;
        top: 10px;
    }

Comments

Popular posts from this blog

Use Case Diagram for Online Book Store

Linear search & Binary search using Template

Write a program to search an element from a list. Give user the option to perform Linear or Binary search. Use Template functions. #include<iostream> using namespace std; template <class T> void Lsearch(T *a, T item, int n) { int z=0; for(int i=0;i<n;i++) { if(a[i]== item) { z=1; cout<<"\n Item found at position = "<<i+1<<"\n\n"; } else if(z!=1) { z=0; } } if(z==0) cout<<"\n Item not found in the list\n\n"; } template <class T> void Bsearch(T *a, T item, int n) { int beg=0,end=n-1; int mid=beg+end/2; while((a[mid]!=item) && (n>0)) { if(item>a[mid]) beg=mid; else end=mid; mid=(beg+end)/2; n--; } if(a[mid]==item) cout<<"\n Item found at position = "<<mid+1<<"\n\n"; else cout<<"\n Item not found in the list\n\n"; } void main() { int iarr[10] = {2,42,56,86,87,99,323,546,767,886};...

Occurrences of each letter of alphabet in the text

Program to print a table indicating the no. of occurrences of each letter of alphabet in the text entered as command line arguments. #include<iostream> #include<string> using namespace std; int main(int argc, char *argv[]) { string str=""; static int alphabet[26]; int x; cout<<"\n\n Command-Line Argument\n"; for(int i=0;i<argc;i++) { cout<<"\n "<<argv[i]; str+=argv[i]; } for(int i=0;i<str.length();i++) { if(str[i]>='A' && str[i]<='Z') { x=((int)str[i])-65; alphabet[x]++; } else if(str[i]>='a' && str[i]<='z') { x=((int)str[i])-97; alphabet[x]++; } } //Displaying No. of occurrences of each alphabets in the command line argument cout<<"\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n Alphabet No. of Occurrences\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"; for(int i=0;i<26;i++)...