54 lines
1.6 KiB
JavaScript
54 lines
1.6 KiB
JavaScript
/* cspell:ignore uidom */
|
|
((Drupal, once, { computePosition, offset, shift, flip }) => {
|
|
/**
|
|
* Attaches the dropdown behavior to all required triggers.
|
|
*
|
|
* @type {Drupal~behavior}
|
|
*
|
|
* @prop {Drupal~behaviorAttach} attach
|
|
* Attaches the dropdown behavior.
|
|
*/
|
|
Drupal.behaviors.dropdownInit = {
|
|
attach: (context) => {
|
|
once('dropdown-trigger', '[data-drupal-dropdown]', context).forEach(
|
|
(trigger) => {
|
|
const dropdown = trigger.nextElementSibling;
|
|
|
|
const updatePosition = () => {
|
|
computePosition(trigger, dropdown, {
|
|
strategy: 'fixed',
|
|
placement: trigger.dataset.drupalDropdownPosition || 'bottom',
|
|
middleware: [
|
|
flip({ padding: 16 }),
|
|
offset(6),
|
|
shift({ padding: 16 }),
|
|
],
|
|
}).then(({ x, y }) => {
|
|
Object.assign(dropdown.style, {
|
|
left: `${x}px`,
|
|
top: `${y}px`,
|
|
});
|
|
});
|
|
};
|
|
|
|
trigger.addEventListener('click', (e) => {
|
|
updatePosition();
|
|
trigger.setAttribute(
|
|
'aria-expanded',
|
|
e.currentTarget.getAttribute('aria-expanded') === 'false',
|
|
);
|
|
});
|
|
|
|
// Event listener to close dropdown when clicking outside
|
|
document.addEventListener('click', (e) => {
|
|
const isButtonClicked = trigger.contains(e.target);
|
|
if (!isButtonClicked) {
|
|
trigger.setAttribute('aria-expanded', 'false');
|
|
}
|
|
});
|
|
},
|
|
);
|
|
},
|
|
};
|
|
})(Drupal, once, FloatingUIDOM);
|