136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			136 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/**
 | 
						|
 *
 | 
						|
 * Toolbar menu code.
 | 
						|
 *
 | 
						|
 * Toggle own state
 | 
						|
 * Listens toolbar-menu-set-toggle to change state.
 | 
						|
 *
 | 
						|
 * @type {Drupal~behavior}
 | 
						|
 *
 | 
						|
 * @prop {Drupal~behaviorAttach} attach
 | 
						|
 */
 | 
						|
 | 
						|
(
 | 
						|
  (Drupal, once) => {
 | 
						|
    /**
 | 
						|
     * Constant for the "toolbar-menu-set-toggle" event name.
 | 
						|
     *
 | 
						|
     * @type {string}
 | 
						|
     */
 | 
						|
    const TOOLBAR_MENU_SET_TOGGLE = 'toolbar-menu-set-toggle';
 | 
						|
 | 
						|
    /**
 | 
						|
     * Initializes menu buttons.
 | 
						|
     *
 | 
						|
     * @type {Drupal~behavior}
 | 
						|
     *
 | 
						|
     * @prop {Drupal~behaviorAttach} attach
 | 
						|
     *  Toggles aria-expanded attribute.
 | 
						|
     *  Changes buttons inner text.
 | 
						|
     *  Listens event when should be expanded.
 | 
						|
     */
 | 
						|
    Drupal.behaviors.navigationProcessToolbarMenuTriggers = {
 | 
						|
      attach: (context) => {
 | 
						|
        once(
 | 
						|
          'toolbar-menu-trigger',
 | 
						|
          '[data-toolbar-menu-trigger]',
 | 
						|
          context,
 | 
						|
        ).forEach((button) => {
 | 
						|
          const menu = button.nextElementSibling;
 | 
						|
 | 
						|
          /**
 | 
						|
           * Element containing the button text.
 | 
						|
           *
 | 
						|
           * @type {HTMLElement}
 | 
						|
           */
 | 
						|
          const text = button.querySelector('[data-toolbar-action]');
 | 
						|
 | 
						|
          /**
 | 
						|
           * Toggles the button's aria-expanded attribute and updates its text.
 | 
						|
           * This is only one function which change state of button.
 | 
						|
           *
 | 
						|
           * @param {boolean} state The button state it should be expanded or collapsed.
 | 
						|
           */
 | 
						|
          const toggleButtonState = (state) => {
 | 
						|
            button.setAttribute('aria-expanded', state);
 | 
						|
            if (text) {
 | 
						|
              text.textContent = state
 | 
						|
                ? Drupal.t('Collapse')
 | 
						|
                : Drupal.t('Extend');
 | 
						|
            }
 | 
						|
            if (state) {
 | 
						|
              menu.removeAttribute('inert');
 | 
						|
            } else {
 | 
						|
              menu.setAttribute('inert', true);
 | 
						|
            }
 | 
						|
          };
 | 
						|
 | 
						|
          button.addEventListener('click', (e) => {
 | 
						|
            const level = e.currentTarget.dataset.toolbarMenuTrigger;
 | 
						|
            const state =
 | 
						|
              e.currentTarget.getAttribute('aria-expanded') === 'false';
 | 
						|
            toggleButtonState(state);
 | 
						|
            button.dispatchEvent(
 | 
						|
              new CustomEvent('toolbar-menu-toggled', {
 | 
						|
                bubbles: true,
 | 
						|
                detail: {
 | 
						|
                  state,
 | 
						|
                  level,
 | 
						|
                },
 | 
						|
              }),
 | 
						|
            );
 | 
						|
          });
 | 
						|
 | 
						|
          // State of submenu button can be changed by CustomEvent.
 | 
						|
          button.addEventListener(TOOLBAR_MENU_SET_TOGGLE, (e) => {
 | 
						|
            const newState = e.detail.state;
 | 
						|
            toggleButtonState(newState);
 | 
						|
          });
 | 
						|
        });
 | 
						|
      },
 | 
						|
    };
 | 
						|
 | 
						|
    /**
 | 
						|
     * Initializes menu links.
 | 
						|
     *
 | 
						|
     * @type {Drupal~behavior}
 | 
						|
     *
 | 
						|
     * @prop {Drupal~behaviorAttach} attach
 | 
						|
     *
 | 
						|
     * When current url it adds classes and dispatch event to popover.
 | 
						|
     */
 | 
						|
    Drupal.behaviors.navigationProcessToolbarMenuLinks = {
 | 
						|
      attach: (context) => {
 | 
						|
        once(
 | 
						|
          'toolbar-menu-link',
 | 
						|
          'a.toolbar-menu__link, a.toolbar-button',
 | 
						|
          context,
 | 
						|
        ).forEach((link) => {
 | 
						|
          // What we do if menu link is in current url.
 | 
						|
          if (document.URL === link.href) {
 | 
						|
            link.classList.add('current', 'is-active');
 | 
						|
 | 
						|
            link.dispatchEvent(
 | 
						|
              new CustomEvent('toolbar-active-url', {
 | 
						|
                bubbles: true,
 | 
						|
              }),
 | 
						|
            );
 | 
						|
 | 
						|
            // We also want to open all parent menus.
 | 
						|
            const menu = link.closest('.toolbar-menu');
 | 
						|
            if (menu) {
 | 
						|
              menu.previousElementSibling.dispatchEvent(
 | 
						|
                new CustomEvent(TOOLBAR_MENU_SET_TOGGLE, {
 | 
						|
                  detail: {
 | 
						|
                    state: true,
 | 
						|
                  },
 | 
						|
                }),
 | 
						|
              );
 | 
						|
            }
 | 
						|
          }
 | 
						|
        });
 | 
						|
      },
 | 
						|
    };
 | 
						|
  }
 | 
						|
)(Drupal, once);
 |