gitlab-org--gitlab-foss/app/assets/javascripts/fly_out_nav.js

65 lines
2.1 KiB
JavaScript
Raw Normal View History

import Cookies from 'js-cookie';
import bp from './breakpoints';
2017-08-02 09:22:13 +00:00
export const canShowActiveSubItems = (el) => {
const isHiddenByMedia = bp.getBreakpointSize() === 'sm' || bp.getBreakpointSize() === 'md';
if (el.classList.contains('active') && !isHiddenByMedia) {
return Cookies.get('sidebar_collapsed') === 'true';
}
return true;
};
export const canShowSubItems = () => bp.getBreakpointSize() === 'sm' || bp.getBreakpointSize() === 'md' || bp.getBreakpointSize() === 'lg';
2017-08-02 09:22:13 +00:00
export const calculateTop = (boundingRect, outerHeight) => {
const windowHeight = window.innerHeight;
const bottomOverflow = windowHeight - (boundingRect.top + outerHeight);
return bottomOverflow < 0 ? (boundingRect.top - outerHeight) + boundingRect.height :
boundingRect.top;
};
2017-08-01 07:49:03 +00:00
export const showSubLevelItems = (el) => {
2017-08-02 07:46:25 +00:00
const subItems = el.querySelector('.sidebar-sub-level-items');
2017-08-01 07:49:03 +00:00
if (!subItems || !canShowSubItems() || !canShowActiveSubItems(el)) return;
2017-08-01 07:49:03 +00:00
2017-08-02 07:46:25 +00:00
subItems.style.display = 'block';
el.classList.add('is-showing-fly-out');
el.classList.add('is-over');
2017-08-01 07:49:03 +00:00
const boundingRect = el.getBoundingClientRect();
2017-08-02 07:46:25 +00:00
const top = calculateTop(boundingRect, subItems.offsetHeight);
2017-08-01 07:49:03 +00:00
const isAbove = top < boundingRect.top;
2017-08-03 01:19:43 +00:00
subItems.classList.add('fly-out-list');
2017-08-02 07:46:25 +00:00
subItems.style.transform = `translate3d(0, ${Math.floor(top)}px, 0)`;
2017-08-01 07:49:03 +00:00
if (isAbove) {
2017-08-02 07:46:25 +00:00
subItems.classList.add('is-above');
2017-08-01 07:49:03 +00:00
}
};
export const hideSubLevelItems = (el) => {
2017-08-02 07:46:25 +00:00
const subItems = el.querySelector('.sidebar-sub-level-items');
2017-08-01 07:49:03 +00:00
if (!subItems || !canShowSubItems() || !canShowActiveSubItems(el)) return;
2017-08-01 07:49:03 +00:00
el.classList.remove('is-showing-fly-out');
el.classList.remove('is-over');
subItems.style.display = '';
subItems.style.transform = '';
2017-08-02 07:46:25 +00:00
subItems.classList.remove('is-above');
2017-08-01 07:49:03 +00:00
};
export default () => {
const items = [...document.querySelectorAll('.sidebar-top-level-items > li')]
.filter(el => el.querySelector('.sidebar-sub-level-items'));
2017-08-01 07:49:03 +00:00
items.forEach((el) => {
el.addEventListener('mouseenter', e => showSubLevelItems(e.currentTarget));
el.addEventListener('mouseleave', e => hideSubLevelItems(e.currentTarget));
});
};