Initial Drupal 11 with DDEV setup
This commit is contained in:
		
							
								
								
									
										155
									
								
								web/core/modules/navigation/js/sidebar.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								web/core/modules/navigation/js/sidebar.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,155 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @file
 | 
			
		||||
 *
 | 
			
		||||
 * Sidebar component.
 | 
			
		||||
 *
 | 
			
		||||
 * Only few common things. Like close all popovers when one is opened.
 | 
			
		||||
 *
 | 
			
		||||
 * @type {Drupal~behavior}
 | 
			
		||||
 *
 | 
			
		||||
 * @prop {Drupal~behaviorAttach} attach
 | 
			
		||||
 *   Attaches the behavior to the `.admin-toolbar` element.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
(
 | 
			
		||||
  (Drupal, once) => {
 | 
			
		||||
    /**
 | 
			
		||||
     * Drupal behaviors object.
 | 
			
		||||
     *
 | 
			
		||||
     * @type {Drupal~behaviors}
 | 
			
		||||
     */
 | 
			
		||||
 | 
			
		||||
    Drupal.behaviors.navigation = {
 | 
			
		||||
      attach(context) {
 | 
			
		||||
        /**
 | 
			
		||||
         * Sidebar element with the `.admin-toolbar` class.
 | 
			
		||||
         *
 | 
			
		||||
         * @type {HTMLElement}
 | 
			
		||||
         */
 | 
			
		||||
        once('navigation', '.admin-toolbar', context).forEach((sidebar) => {
 | 
			
		||||
          const backButton = sidebar.querySelector(
 | 
			
		||||
            '[data-toolbar-back-control]',
 | 
			
		||||
          );
 | 
			
		||||
          if (!backButton) {
 | 
			
		||||
            // We're in layout editing mode and the .admin-toolbar we have in
 | 
			
		||||
            // scope here is the empty one that only exists to leave space for
 | 
			
		||||
            // the one added by layout builder. We need to use an empty
 | 
			
		||||
            // .admin-toolbar element because the css uses the adjacent
 | 
			
		||||
            // sibling selector.
 | 
			
		||||
            // @see \navigation_page_top();
 | 
			
		||||
            return;
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          /**
 | 
			
		||||
           * All menu triggers.
 | 
			
		||||
           *
 | 
			
		||||
           * @type {NodeList}
 | 
			
		||||
           */
 | 
			
		||||
          const buttons = sidebar.querySelectorAll(
 | 
			
		||||
            '[data-toolbar-menu-trigger]',
 | 
			
		||||
          );
 | 
			
		||||
 | 
			
		||||
          /**
 | 
			
		||||
           * All popovers and tooltip triggers.
 | 
			
		||||
           *
 | 
			
		||||
           * @type {NodeList}
 | 
			
		||||
           */
 | 
			
		||||
          // const popovers = sidebar.querySelectorAll('[data-toolbar-popover]');
 | 
			
		||||
 | 
			
		||||
          /**
 | 
			
		||||
           * NodeList of all tooltip elements.
 | 
			
		||||
           *
 | 
			
		||||
           * @type {NodeList}
 | 
			
		||||
           */
 | 
			
		||||
          const tooltips = sidebar.querySelectorAll('[data-drupal-tooltip]');
 | 
			
		||||
 | 
			
		||||
          const closeButtons = () => {
 | 
			
		||||
            buttons.forEach((button) => {
 | 
			
		||||
              button.dispatchEvent(
 | 
			
		||||
                new CustomEvent('toolbar-menu-set-toggle', {
 | 
			
		||||
                  detail: {
 | 
			
		||||
                    state: false,
 | 
			
		||||
                  },
 | 
			
		||||
                }),
 | 
			
		||||
              );
 | 
			
		||||
            });
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          const closePopovers = (current = false) => {
 | 
			
		||||
            // TODO: Find way to use popovers variable.
 | 
			
		||||
            // This change needed because BigPipe replaces user popover.
 | 
			
		||||
            sidebar
 | 
			
		||||
              .querySelectorAll('[data-toolbar-popover]')
 | 
			
		||||
              .forEach((popover) => {
 | 
			
		||||
                if (
 | 
			
		||||
                  current &&
 | 
			
		||||
                  current instanceof Element &&
 | 
			
		||||
                  popover.isEqualNode(current)
 | 
			
		||||
                ) {
 | 
			
		||||
                  return;
 | 
			
		||||
                }
 | 
			
		||||
                popover.dispatchEvent(
 | 
			
		||||
                  new CustomEvent('toolbar-popover-close', {}),
 | 
			
		||||
                );
 | 
			
		||||
              });
 | 
			
		||||
          };
 | 
			
		||||
 | 
			
		||||
          // Add click event listeners to all buttons and then contains the callback
 | 
			
		||||
          // to expand / collapse the button's menus.
 | 
			
		||||
          sidebar.addEventListener('click', (e) => {
 | 
			
		||||
            if (e.target.matches('button, button *')) {
 | 
			
		||||
              e.target.closest('button').focus();
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          // We want to close all popovers when we close sidebar.
 | 
			
		||||
          sidebar.addEventListener('toggle-admin-toolbar-content', (e) => {
 | 
			
		||||
            if (!e.detail.state) {
 | 
			
		||||
              closePopovers();
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          // When any popover opened we close all others.
 | 
			
		||||
          sidebar.addEventListener('toolbar-popover-toggled', (e) => {
 | 
			
		||||
            if (e.detail.state) {
 | 
			
		||||
              closeButtons();
 | 
			
		||||
              closePopovers(e.target);
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
 | 
			
		||||
          // When any menu opened we close all others.
 | 
			
		||||
          sidebar.addEventListener('toolbar-menu-toggled', (e) => {
 | 
			
		||||
            if (e.detail.state) {
 | 
			
		||||
              // We want to close buttons on when new opened only if they are on same level.
 | 
			
		||||
              const targetLevel = e.detail.level;
 | 
			
		||||
              buttons.forEach((button) => {
 | 
			
		||||
                const buttonLevel = button.dataset.toolbarMenuTrigger;
 | 
			
		||||
                if (
 | 
			
		||||
                  !button.isEqualNode(e.target) &&
 | 
			
		||||
                  +buttonLevel === +targetLevel
 | 
			
		||||
                ) {
 | 
			
		||||
                  button.dispatchEvent(
 | 
			
		||||
                    new CustomEvent('toolbar-menu-set-toggle', {
 | 
			
		||||
                      detail: {
 | 
			
		||||
                        state: false,
 | 
			
		||||
                      },
 | 
			
		||||
                    }),
 | 
			
		||||
                  );
 | 
			
		||||
                }
 | 
			
		||||
              });
 | 
			
		||||
            }
 | 
			
		||||
          });
 | 
			
		||||
          backButton.addEventListener('click', closePopovers);
 | 
			
		||||
 | 
			
		||||
          // Tooltips triggered on hover and focus so add an extra event listener
 | 
			
		||||
          // to close all popovers.
 | 
			
		||||
          tooltips.forEach((tooltip) => {
 | 
			
		||||
            ['mouseover', 'focus'].forEach((e) => {
 | 
			
		||||
              tooltip.addEventListener(e, closePopovers);
 | 
			
		||||
            });
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      },
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
)(Drupal, once);
 | 
			
		||||
		Reference in New Issue
	
	Block a user