import { Transitions } from '@/components/@extended'; import { useMenuConfig } from '@/components/Layout/MenuProvider'; import { NavCollapse } from '@/components/Layout/Navigation/NavCollapse'; import { NavItem } from '@/components/Layout/Navigation/NavItem'; import { useLayoutMediaState } from '@/components/Layout/Provider'; import { DownOutlined, RightOutlined } from '@ant-design/icons'; import { Box, ClickAwayListener, List, ListItemButton, ListItemIcon, ListItemText, Paper, Popper, Theme, Typography } from '@mui/material'; import { styled, useTheme } from '@mui/material/styles'; import { Fragment, useEffect, useState } from 'react'; import { useTranslate } from 'react-admin'; type PopperStyledProps = { theme: Theme; }; const PopperStyled = styled(Popper)(({ theme }: PopperStyledProps) => ({ overflow: 'visible', zIndex: 1202, minWidth: 180, '&:before': { content: '""', display: 'block', position: 'absolute', top: 5, left: 32, width: 12, height: 12, transform: 'translateY(-50%) rotate(45deg)', zIndex: 120, borderWidth: '6px', borderStyle: 'solid', borderColor: `${theme.palette.background.paper} transparent transparent ${theme.palette.background.paper}` } })); function NavGroup({ item, lastItem, remItems, lastItemId, setSelectedItems, selectedItems, setSelectedLevel, selectedLevel }: NavGroupProps) { const theme = useTheme(); const translate = useTranslate(); const { pathname } = { pathname: '' }; // useLocation() const { horizontal, downLg } = useLayoutMediaState(); const menu = useMenuConfig(); const { drawerOpen, selectedID, activeID } = menu; const [anchorEl, setAnchorEl] = useState(null); const [currentItem, setCurrentItem] = useState(item); const openMini = Boolean(anchorEl); useEffect(() => { if (lastItem) { if (item.id === lastItemId) { const localItem = { ...item }; const elements = remItems.map((ele) => ele.elements); localItem.children = elements.flat(1); setCurrentItem(localItem); } else { setCurrentItem(item); } } // eslint-disable-next-line react-hooks/exhaustive-deps }, [item, lastItem, downLg]); function checkOpenForParent(child: any, id: any) { child.forEach((ele: any) => { if (ele.children?.length) { checkOpenForParent(ele.children, currentItem.id); } if (ele.url === pathname) { activeID(id); } }); } function checkSelectedOnload(data: any) { const childrens = data.children ? data.children : []; childrens.forEach((itemCheck: any) => { if (itemCheck.children?.length) { checkOpenForParent(itemCheck.children, currentItem.id); } if (itemCheck.url === pathname) { activeID(currentItem.id); } }); } useEffect(() => { checkSelectedOnload(currentItem); if (openMini) setAnchorEl(null); // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname, currentItem]); function handleClick(event: any) { if (!openMini) { setAnchorEl(event?.currentTarget); } } function handleClose() { setAnchorEl(null); } const Icon = currentItem?.icon; const itemIcon = currentItem?.icon ? ( ) : null; const navCollapse = item.children?.map((menuItem: any) => { switch (menuItem.type) { case 'collapse': return ( ); case 'item': return ; default: return ( Menu Items Error ); } }); const moreItems = remItems.map((itemRem, i) => ( {itemRem.title ? ( {itemRem.title} ) : null} {itemRem?.elements?.map((menu: any) => { switch (menu.type) { case 'collapse': return ( ); case 'item': return ; default: return ( Menu Items Error ); } })} )); // menu list collapse & items const items = currentItem.children?.map((menu: any) => { switch (menu.type) { case 'collapse': return ( ); case 'item': return ; default: return ( Menu Items Error ); } }); const popperId = openMini ? `group-pop-${item.id}` : undefined; return ( <> {!horizontal ? ( {item.title} {item.caption ? ( {item.caption} ) : null} ) : null } sx={{ mt: drawerOpen && item.title ? 1.5 : 0, py: 0, zIndex: 0 }} > {navCollapse} ) : ( {itemIcon ? ( {currentItem.id === lastItemId ? : itemIcon} ) : null} {currentItem.id === lastItemId ? translate('ra.actions.more') : currentItem.title} } /> {openMini ? ( ) : ( )} {anchorEl ? ( {({ TransitionProps }) => ( // @ts-ignore {currentItem.id !== lastItemId ? items : moreItems} )} ) : null} )} ); } type NavGroupProps = { item: any; lastItem?: number | undefined; remItems: any[]; lastItemId: string; setSelectedItems: (value: string) => void; selectedItems: string; setSelectedLevel: (value: number) => void; selectedLevel: number; }; export { NavGroup }; export type { NavGroupProps };