import React, { ReactNode } from 'react'; import { Item } from '@react-stately/collections'; import { css, cx } from '@emotion/css'; import { GrafanaTheme2, locationUtil, NavMenuItemType, NavModelItem } from '@grafana/data'; import { IconName, useTheme2 } from '@grafana/ui'; import { locationService } from '@grafana/runtime'; import { NavBarMenuItem } from './NavBarMenuItem'; import { getNavBarItemWithoutMenuStyles, NavBarItemWithoutMenu } from './NavBarItemWithoutMenu'; import { NavBarItemMenuTrigger } from './NavBarItemMenuTrigger'; import { NavBarItemMenu } from './NavBarItemMenu'; import { getNavModelItemKey } from './utils'; import { useLingui } from '@lingui/react'; import menuItemTranslations from './navBarItem-translations'; export interface Props { isActive?: boolean; children: ReactNode; className?: string; reverseMenuDirection?: boolean; showMenu?: boolean; link: NavModelItem; } const NavBarItem = ({ isActive = false, children, className, reverseMenuDirection = false, showMenu = true, link, }: Props) => { const { i18n } = useLingui(); const theme = useTheme2(); const menuItems = link.children ?? []; const menuItemsSorted = reverseMenuDirection ? menuItems.reverse() : menuItems; const filteredItems = menuItemsSorted .filter((item) => !item.hideFromMenu) .map((i) => ({ ...i, menuItemType: NavMenuItemType.Item })); const adjustHeightForBorder = filteredItems.length === 0; const styles = getStyles(theme, adjustHeightForBorder, isActive); const section: NavModelItem = { ...link, children: filteredItems, menuItemType: NavMenuItemType.Section, }; const items: NavModelItem[] = [section].concat(filteredItems); const onNavigate = (item: NavModelItem) => { const { url, target, onClick } = item; if (!url) { onClick?.(); return; } if (!target && url.startsWith('/')) { locationService.push(locationUtil.stripBaseFromUrl(url)); } else { window.open(url, target); } }; const translationKey = link.id && menuItemTranslations[link.id]; const linkText = translationKey ? i18n._(translationKey) : link.text; return showMenu ? (