webpack-bootstrap-ui-kit/src/js/ui/dropdown.js

109 lines
2.7 KiB
JavaScript
Raw Normal View History

2021-12-28 02:01:36 +01:00
import Events from '../_events';
2021-09-05 21:05:55 +02:00
/*
* Bootstrap compatible dropdowns without popover library
*
* [data-bs-toggle="hover"] - shows/hides dropdown on mouseover/mouseout
* [data-bs-toggle="dropdown"], .js-dropdown - shows/hides dropdown on click
*
*/
2021-09-05 21:05:55 +02:00
const DropdownHoverUI = ((window) => {
2021-12-28 02:01:36 +01:00
const NAME = 'js-dropdown';
2021-09-05 21:05:55 +02:00
2022-01-03 05:59:41 +01:00
const HideAll = () => {
2021-12-28 02:01:36 +01:00
// hide others
document.querySelectorAll('.dropdown-menu').forEach((el, i) => {
el.classList.remove('show');
});
2022-01-03 05:59:41 +01:00
};
const Toggle = (el) => {
HideAll();
2021-12-28 02:01:36 +01:00
2021-09-05 21:05:55 +02:00
el.querySelector('.dropdown-menu').classList.toggle('show');
};
const Show = (e) => {
const el = e.currentTarget;
el.querySelector('.dropdown-menu').classList.add('show');
};
const Hide = (e) => {
const el = e.currentTarget;
el.querySelector('.dropdown-menu').classList.remove('show');
};
const init = () => {
console.log(`${NAME}: init`);
2022-03-18 13:09:51 +01:00
const clickableEls = document.querySelectorAll(`.${NAME},[data-bs-toggle="dropdown"]`);
const hoverableEls = document.querySelectorAll(`[data-bs-toggle="hover"]`);
2021-09-05 21:05:55 +02:00
const attachHoverEvents = (el) => {
2021-12-28 02:01:36 +01:00
el.addEventListener('mouseover', Show, false);
el.addEventListener('mouseout', Hide, false);
2021-09-05 21:05:55 +02:00
el.classList.add(`${NAME}-active`);
};
const attachClickEvents = (el) => {
2021-12-28 02:01:36 +01:00
el.addEventListener('click', (e) => {
2021-09-05 21:05:55 +02:00
e.preventDefault();
2021-09-05 21:05:55 +02:00
const el = e.currentTarget;
const parent = el.closest('.dropdown');
Toggle(parent);
});
el.classList.add(`${NAME}-active`);
};
2022-03-18 13:09:51 +01:00
// Hide all for outside clicks
/*document.addEventListener('click', function (event) {
const isClickInside = clickableEls.contains(event.target);
if (!isClickInside) {
HideAll();
}
});*/
2022-01-03 05:59:41 +01:00
document.addEventListener('click', (event) => {
let breakPath = false;
2022-03-18 13:09:51 +01:00
const path = event.path || (event.composedPath && event.composedPath());
if (!path) {
console.warn('Browser does not provide event path to hide dropdowns on outside click');
}
path.forEach((el, i) => {
2022-01-03 05:59:41 +01:00
if (breakPath) {
return;
}
if (el === document) {
HideAll();
}
if (el.classList && el.classList.contains('dropdown-toggle')) {
breakPath = true;
return;
}
});
});
2022-03-18 13:09:51 +01:00
hoverableEls.forEach((el, i) => {
2021-09-05 21:05:55 +02:00
const parent = el.closest('.dropdown');
attachHoverEvents(parent);
});
2022-03-18 13:09:51 +01:00
clickableEls.forEach((el, i) => {
2021-09-05 21:05:55 +02:00
attachClickEvents(el);
});
};
window.addEventListener(`${Events.LODEDANDREADY}`, init);
window.addEventListener(`${Events.AJAX}`, init);
})(window);
export default DropdownHoverUI;