Skip to content

Commit 6619cb2

Browse files
authored
Merge pull request #768 from amitamrutiya/update-navigation
Make navigation navbar more generic to use for the use in meshery ui
2 parents 18e0aea + 4775708 commit 6619cb2

File tree

2 files changed

+56
-49
lines changed

2 files changed

+56
-49
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
22
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
3+
import { ListItemTextProps, MenuListProps } from '@mui/material';
34
import React, { MouseEvent, useState } from 'react';
45
import { Collapse, Divider, ListItemText, MenuItem } from '../../base';
56
import { IconWrapper, MenuItemList, MenuItemSubList, MenuListStyle, SubIconWrapper } from './style';
@@ -14,64 +15,71 @@ type NavigationItem = {
1415
addDivider?: boolean;
1516
};
1617

17-
type NavigationNavbarProps = {
18+
interface NavigationNavbarProps {
1819
navigationItems: NavigationItem[];
19-
};
20+
MenuListProps?: Omit<MenuListProps, 'children'>;
21+
ListItemTextProps?: Omit<ListItemTextProps, 'primary'>;
22+
}
2023

21-
const NavigationNavbar: React.FC<NavigationNavbarProps> = ({ navigationItems }) => {
24+
const NavigationNavbar: React.FC<NavigationNavbarProps> = ({
25+
navigationItems,
26+
MenuListProps = {},
27+
ListItemTextProps = {}
28+
}) => {
2229
const [openSectionId, setOpenSectionId] = useState<string | null>(null);
23-
2430
const toggleSectionOpen = (sectionId: string, event: MouseEvent<SVGSVGElement>) => {
2531
event.stopPropagation();
2632
setOpenSectionId((currentOpenSectionId) =>
2733
currentOpenSectionId === sectionId ? null : sectionId
2834
);
2935
};
3036

31-
const NavigationNavbarItems = () => {
32-
return navigationItems.map((item) => {
33-
const isOpen = openSectionId === item.id;
34-
const permission = item.permission ?? true;
35-
const addDivider = item.addDivider ?? false;
37+
return (
38+
<MenuListStyle {...MenuListProps} dense>
39+
{navigationItems.map((item) => {
40+
const isOpen = openSectionId === item.id;
41+
const permission = item.permission ?? true;
42+
const addDivider = item.addDivider ?? false;
3643

37-
return (
38-
<React.Fragment key={item.id}>
39-
<MenuItem disabled={!permission} onClick={item.onClick}>
40-
<MenuItemList>
41-
<IconWrapper>{item.icon}</IconWrapper>
42-
<ListItemText primary={item.title} />
43-
</MenuItemList>
44+
return (
45+
<React.Fragment key={item.id}>
46+
<MenuItem disabled={!permission} onClick={item.onClick}>
47+
<MenuItemList>
48+
{item.icon && <IconWrapper>{item.icon}</IconWrapper>}
49+
<ListItemText primary={item.title} {...ListItemTextProps} />
50+
</MenuItemList>
51+
{item.subItems && (
52+
<ListItemText>
53+
{isOpen ? (
54+
<ExpandLessIcon onClick={(e) => toggleSectionOpen(item.id, e)} />
55+
) : (
56+
<ExpandMoreIcon onClick={(e) => toggleSectionOpen(item.id, e)} />
57+
)}
58+
</ListItemText>
59+
)}
60+
</MenuItem>
4461
{item.subItems && (
45-
<ListItemText>
46-
{isOpen ? (
47-
<ExpandLessIcon onClick={(e) => toggleSectionOpen(item.id, e)} />
48-
) : (
49-
<ExpandMoreIcon onClick={(e) => toggleSectionOpen(item.id, e)} />
50-
)}
51-
</ListItemText>
62+
<Collapse in={isOpen} timeout="auto" unmountOnExit variant="submenu">
63+
{item.subItems.map((subItem) => (
64+
<MenuItem
65+
key={subItem.id}
66+
disabled={!subItem.permission}
67+
onClick={subItem.onClick}
68+
>
69+
<MenuItemSubList>
70+
{subItem.icon && <SubIconWrapper>{subItem.icon}</SubIconWrapper>}
71+
<ListItemText primary={subItem.title} {...ListItemTextProps} />
72+
</MenuItemSubList>
73+
</MenuItem>
74+
))}
75+
</Collapse>
5276
)}
53-
</MenuItem>
54-
55-
{item.subItems && (
56-
<Collapse in={isOpen} timeout="auto" unmountOnExit variant="submenu">
57-
{item.subItems.map((subItem) => (
58-
<MenuItem key={subItem.id} disabled={!subItem.permission} onClick={subItem.onClick}>
59-
<MenuItemSubList>
60-
<SubIconWrapper>{subItem.icon}</SubIconWrapper>
61-
<ListItemText primary={subItem.title} />
62-
</MenuItemSubList>
63-
</MenuItem>
64-
))}
65-
</Collapse>
66-
)}
67-
68-
{addDivider && <Divider />}
69-
</React.Fragment>
70-
);
71-
});
72-
};
73-
74-
return <MenuListStyle dense>{NavigationNavbarItems()}</MenuListStyle>;
77+
{addDivider && <Divider />}
78+
</React.Fragment>
79+
);
80+
})}
81+
</MenuListStyle>
82+
);
7583
};
7684

7785
export default NavigationNavbar;

src/custom/NavigationNavbar/style.tsx

+3-4
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ export const ListItemStyle = styled('div')(({ theme }) => ({
77
}));
88

99
export const MenuListStyle = styled(MenuList)({
10-
minHeight: '31rem',
11-
width: '13rem',
1210
overflowY: 'auto',
1311
scrollbarWidth: 'none',
1412
'&::-webkit-scrollbar': {
@@ -18,7 +16,7 @@ export const MenuListStyle = styled(MenuList)({
1816

1917
export const MenuItemList = styled(ListItem)(() => ({
2018
pointerEvents: 'auto',
21-
margin: '0.5rem 0rem 0.5rem 0.5rem',
19+
margin: '0.5rem 0rem 0.5rem 0rem',
2220
fontSize: '0.1rem',
2321
padding: '0'
2422
}));
@@ -30,7 +28,8 @@ export const MenuItemSubList = styled(ListItem)(() => ({
3028
}));
3129

3230
export const IconWrapper = styled('div')({
33-
marginRight: '0.75rem'
31+
marginRight: '0.75rem',
32+
marginLeft: '0.5rem'
3433
});
3534

3635
export const SubIconWrapper = styled('div')({

0 commit comments

Comments
 (0)