1
1
import ExpandLessIcon from '@mui/icons-material/ExpandLess' ;
2
2
import ExpandMoreIcon from '@mui/icons-material/ExpandMore' ;
3
+ import { ListItemTextProps , MenuListProps } from '@mui/material' ;
3
4
import React , { MouseEvent , useState } from 'react' ;
4
5
import { Collapse , Divider , ListItemText , MenuItem } from '../../base' ;
5
6
import { IconWrapper , MenuItemList , MenuItemSubList , MenuListStyle , SubIconWrapper } from './style' ;
@@ -14,64 +15,71 @@ type NavigationItem = {
14
15
addDivider ?: boolean ;
15
16
} ;
16
17
17
- type NavigationNavbarProps = {
18
+ interface NavigationNavbarProps {
18
19
navigationItems : NavigationItem [ ] ;
19
- } ;
20
+ MenuListProps ?: Omit < MenuListProps , 'children' > ;
21
+ ListItemTextProps ?: Omit < ListItemTextProps , 'primary' > ;
22
+ }
20
23
21
- const NavigationNavbar : React . FC < NavigationNavbarProps > = ( { navigationItems } ) => {
24
+ const NavigationNavbar : React . FC < NavigationNavbarProps > = ( {
25
+ navigationItems,
26
+ MenuListProps = { } ,
27
+ ListItemTextProps = { }
28
+ } ) => {
22
29
const [ openSectionId , setOpenSectionId ] = useState < string | null > ( null ) ;
23
-
24
30
const toggleSectionOpen = ( sectionId : string , event : MouseEvent < SVGSVGElement > ) => {
25
31
event . stopPropagation ( ) ;
26
32
setOpenSectionId ( ( currentOpenSectionId ) =>
27
33
currentOpenSectionId === sectionId ? null : sectionId
28
34
) ;
29
35
} ;
30
36
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 ;
36
43
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 >
44
61
{ 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 >
52
76
) }
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
+ ) ;
75
83
} ;
76
84
77
85
export default NavigationNavbar ;
0 commit comments