@@ -11,16 +11,43 @@ export interface PanelSideBarItemProps<TPanelItemId extends string, TPanelItem>
1111 depth ?: number ;
1212 active ?: boolean ;
1313 isParentHidden ?: boolean ;
14+ isIconShownOnSidebarCollapse : boolean ;
1415}
1516
17+ const PanelSidebarItemNavLink = < TPanelItemId extends string , TPanelItem > ( {
18+ item,
19+ collapsedWithIcon,
20+ className,
21+ } : {
22+ item : PanelItem < TPanelItemId , TPanelItem > ;
23+ collapsedWithIcon ?: boolean ;
24+ className ?: string ;
25+ } ) => {
26+ const { icon, title, onSidebarCollapseOptions } = item ;
27+ const panelIconClassName = collapsedWithIcon ? "ms-1 me-3 p-1" : "me-2" ;
28+ const displayIcon = icon || ( collapsedWithIcon && onSidebarCollapseOptions ?. fallbackIcon ) ;
29+
30+ return (
31+ < span className = { className } >
32+ { displayIcon && < FontAwesomeIcon icon = { displayIcon } className = { panelIconClassName } /> }
33+ { ! collapsedWithIcon || ! displayIcon ? title : "" }
34+ </ span >
35+ ) ;
36+ } ;
37+
1638// eslint-disable-next-line complexity
1739const PanelSideBarItem = < TPanelItemId extends string , TPanelItem > ( props : PanelSideBarItemProps < TPanelItemId , TPanelItem > ) => {
18- const { depth = 0 , children : item , isParentHidden = false } = props ;
19- const { LinkRenderer, toggledMenuItemIds, toggleMenuItem, hiddenMenuItemIds } = usePanelSideBarContext < TPanelItemId , TPanelItem > ( ) ;
20- const hasitem = ! ! item . children ?. length ;
21- const isActive = ( hasitem && item . children && hasActiveChildren ( item . children ) ) || item . active ;
40+ const { depth = 0 , children : item , isParentHidden = false , isIconShownOnSidebarCollapse } = props ;
41+ const { LinkRenderer, toggledMenuItemIds, toggleMenuItem, hiddenMenuItemIds, isSidebarOpen } = usePanelSideBarContext <
42+ TPanelItemId ,
43+ TPanelItem
44+ > ( ) ;
45+
46+ const hasItems = ! ! item . children ?. length ;
47+ const isActive = ( hasItems && item . children && hasActiveChildren ( item . children ) ) || item . active ;
2248 const isOpen = toggledMenuItemIds ?. includes ( item . id ) ;
2349 const scrollToActiveItemRef = useRef < HTMLDivElement > ( null ) ;
50+ const collapsedWithIcon = isIconShownOnSidebarCollapse && ! isSidebarOpen ;
2451
2552 useEffect ( ( ) => {
2653 if ( scrollToActiveItemRef . current && isActive ) {
@@ -33,55 +60,54 @@ const PanelSideBarItem = <TPanelItemId extends string, TPanelItem>(props: PanelS
3360 < NavItem
3461 hidden = { isParentHidden || hiddenMenuItemIds . includes ( item . id ) }
3562 onClick = { ( ) => {
36- if ( hasitem && ! item . collapseIconOnly ) {
63+ if ( hasItems && ! item . collapseIconOnly ) {
3764 toggleMenuItem ( item . id ) ;
3865 }
3966 } }
4067 className = { classNames ( { "menu-open" : isOpen , active : isActive } ) }
41- style = { { paddingLeft : depth ? `${ depth + 1 } rem` : undefined } }
68+ style = { { paddingLeft : ! collapsedWithIcon && depth ? `${ depth + 1 } rem` : undefined } }
4269 >
4370 < div ref = { scrollToActiveItemRef } >
44- { hasitem ? (
71+ { hasItems ? (
4572 < div className = { classNames ( "d-flex flex-row" , { "justify-content-between" : item . collapseIconOnly } ) } >
4673 { item . collapseIconOnly && (
4774 < LinkRenderer item = { item } >
48- < span className = "nav-link" >
49- { item . icon && < FontAwesomeIcon icon = { item . icon } className = "me-2" /> }
50- { item . title }
51- </ span >
75+ < PanelSidebarItemNavLink < TPanelItemId , TPanelItem >
76+ className = "nav-link"
77+ item = { item }
78+ collapsedWithIcon = { collapsedWithIcon }
79+ />
5280 </ LinkRenderer >
5381 ) }
5482
5583 < a
5684 role = "button"
57- className = { classNames ( "nav-link" , { "w-100" : ! item . collapseIconOnly } , { "dropdown-toggle" : hasitem } ) }
85+ className = { classNames (
86+ "nav-link" ,
87+ { "w-100" : ! item . collapseIconOnly } ,
88+ { "dropdown-toggle" : hasItems && ! collapsedWithIcon } ,
89+ ) }
5890 onClick = { ( ) => {
5991 if ( item . collapseIconOnly ) {
6092 toggleMenuItem ( item . id ) ;
6193 }
6294 } }
6395 >
6496 { ! item . collapseIconOnly && (
65- < span >
66- { item . icon && < FontAwesomeIcon className = "me-2" icon = { item . icon } /> }
67- { item . title }
68- </ span >
97+ < PanelSidebarItemNavLink < TPanelItemId , TPanelItem > item = { item } collapsedWithIcon = { collapsedWithIcon } />
6998 ) }
7099 </ a >
71100 </ div >
72101 ) : (
73102 < >
74103 < LinkRenderer item = { item } >
75- < span className = "nav-link" >
76- { item . icon && < FontAwesomeIcon icon = { item . icon } className = "me-2" /> }
77- { item . title }
78- </ span >
104+ < PanelSidebarItemNavLink < TPanelItemId , TPanelItem > className = "nav-link" item = { item } collapsedWithIcon = { collapsedWithIcon } />
79105 </ LinkRenderer >
80106 </ >
81107 ) }
82108 </ div >
83109 </ NavItem >
84- { hasitem && (
110+ { hasItems && (
85111 < Collapse isOpen = { isOpen } navbar className = { classNames ( "item-menu" , { "mb-1" : isOpen } ) } >
86112 { item . children ?. map ( ( childItem ) => (
87113 < PanelSideBarItem
@@ -90,6 +116,7 @@ const PanelSideBarItem = <TPanelItemId extends string, TPanelItem>(props: PanelS
90116 depth = { depth + 1 }
91117 active = { item . active }
92118 isParentHidden = { hiddenMenuItemIds . includes ( item . id ) }
119+ isIconShownOnSidebarCollapse = { isIconShownOnSidebarCollapse }
93120 />
94121 ) ) }
95122 </ Collapse >
0 commit comments