// Add onHover event for dropdowns ;(function ($) { if (!$ || !$.fn) return const SELECTOR = '[data-bs-toggle=dropdown][data-trigger=hover]' const TIMEOUT = 150 function openDropdown($i) { let t = $i.data('dd-timeout') if (t) { clearTimeout(t) t = null $i.data('dd-timeout', t) } if ($i.attr('aria-expanded') !== 'true') $i.dropdown('toggle') } function closeDropdown($i) { let t = $i.data('dd-timeout') if (t) clearTimeout(t) t = setTimeout(() => { let t2 = $i.data('dd-timeout') if (t2) { clearTimeout(t2) t2 = null $i.data('dd-timeout', t2) } if ($i.attr('aria-expanded') === 'true') $i.dropdown('toggle') }, TIMEOUT) $i.data('dd-timeout', t) } $(function () { $('body') .on('mouseenter', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () { const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle') const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu') if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return // Set hovered flag if ($(this).is(SELECTOR)) { $(this).data('hovered', true) } openDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')) }) .on('mouseleave', `${SELECTOR}, ${SELECTOR} ~ .dropdown-menu`, function () { const $toggle = $(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle') const $dropdown = $(this).hasClass('dropdown-menu') ? $(this) : $(this).next('.dropdown-menu') if (window.getComputedStyle($dropdown[0], null).getPropertyValue('position') === 'static') return // Remove hovered flag if ($(this).is(SELECTOR)) { $(this).data('hovered', false) } closeDropdown($(this).hasClass('dropdown-toggle') ? $(this) : $(this).prev('.dropdown-toggle')) }) .on('hide.bs.dropdown', function (e) { if ($(this).find(SELECTOR).data('hovered')) e.preventDefault() }) }) })(window.jQuery)