Initial Drupal 11 with DDEV setup
This commit is contained in:
135
web/core/modules/navigation/js/toolbar-menu.js
Normal file
135
web/core/modules/navigation/js/toolbar-menu.js
Normal file
@ -0,0 +1,135 @@
|
||||
/**
|
||||
*
|
||||
* 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);
|
||||
Reference in New Issue
Block a user