11import ExpandLessIcon from '@mui/icons-material/ExpandLess' ;
22import ExpandMoreIcon from '@mui/icons-material/ExpandMore' ;
3+ import { ListItemTextProps , MenuListProps } from '@mui/material' ;
34import React , { MouseEvent , useState } from 'react' ;
45import { Collapse , Divider , ListItemText , MenuItem } from '../../base' ;
56import { 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
7785export default NavigationNavbar ;
0 commit comments