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 };