mirror of
https://github.com/grafana/grafana.git
synced 2025-02-15 01:53:33 -06:00
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import { css } from '@emotion/css';
|
|
import { cloneDeep } from 'lodash';
|
|
import React from 'react';
|
|
import { useLocation } from 'react-router-dom';
|
|
|
|
import { GrafanaTheme2, NavModelItem, NavSection } from '@grafana/data';
|
|
import { config } from '@grafana/runtime';
|
|
import { useTheme2 } from '@grafana/ui';
|
|
import { useSelector } from 'app/types';
|
|
|
|
import { enrichConfigItems, enrichWithInteractionTracking, getActiveItem } from '../NavBar/utils';
|
|
|
|
import { NavBarMenu } from './NavBarMenu';
|
|
|
|
export interface Props {
|
|
onClose: () => void;
|
|
searchBarHidden?: boolean;
|
|
}
|
|
|
|
export const MegaMenu = React.memo<Props>(({ onClose, searchBarHidden }) => {
|
|
const navBarTree = useSelector((state) => state.navBarTree);
|
|
const theme = useTheme2();
|
|
const styles = getStyles(theme);
|
|
const location = useLocation();
|
|
|
|
const homeItem: NavModelItem = enrichWithInteractionTracking(
|
|
{
|
|
id: 'home',
|
|
text: 'Home',
|
|
url: config.appSubUrl || '/',
|
|
icon: 'home-alt',
|
|
},
|
|
true
|
|
);
|
|
|
|
const navTree = cloneDeep(navBarTree);
|
|
|
|
const coreItems = navTree
|
|
.filter((item) => item.section === NavSection.Core)
|
|
.map((item) => enrichWithInteractionTracking(item, true));
|
|
const pluginItems = navTree
|
|
.filter((item) => item.section === NavSection.Plugin)
|
|
.map((item) => enrichWithInteractionTracking(item, true));
|
|
const configItems = enrichConfigItems(
|
|
navTree.filter((item) => item.section === NavSection.Config && item && item.id !== 'help' && item.id !== 'profile'),
|
|
location
|
|
).map((item) => enrichWithInteractionTracking(item, true));
|
|
|
|
const navItems = [homeItem, ...coreItems, ...pluginItems, ...configItems];
|
|
|
|
const activeItem = getActiveItem(navItems, location.pathname);
|
|
|
|
return (
|
|
<div className={styles.menuWrapper}>
|
|
<NavBarMenu activeItem={activeItem} navItems={navItems} onClose={onClose} searchBarHidden={searchBarHidden} />
|
|
</div>
|
|
);
|
|
});
|
|
|
|
MegaMenu.displayName = 'MegaMenu';
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => ({
|
|
menuWrapper: css({
|
|
position: 'fixed',
|
|
display: 'grid',
|
|
gridAutoFlow: 'column',
|
|
height: '100%',
|
|
zIndex: theme.zIndex.sidemenu,
|
|
}),
|
|
});
|