@@ -17,13 +17,8 @@ import { ActionButton } from '../common';
1717import CreateButton from '../common/Resource/CreateButton' ;
1818import NavigationTabs from './NavigationTabs' ;
1919import prepareRoutes from './prepareRoutes' ;
20- import SidebarItem from './SidebarItem' ;
21- import {
22- DefaultSidebars ,
23- setSidebarSelected ,
24- setWhetherSidebarOpen ,
25- SidebarEntry ,
26- } from './sidebarSlice' ;
20+ import SidebarItem , { SidebarItemProps } from './SidebarItem' ;
21+ import { DefaultSidebars , setSidebarSelected , setWhetherSidebarOpen } from './sidebarSlice' ;
2722import VersionButton from './VersionButton' ;
2823
2924export const drawerWidth = 240 ;
@@ -153,6 +148,34 @@ const DefaultLinkArea = memo((props: { sidebarName: string; isOpen: boolean }) =
153148 ) ;
154149} ) ;
155150
151+ /**
152+ * Checks if item or any sub items are selected
153+ */
154+ function getIsSelected ( item : SidebarItemProps , selectedName ?: string | null ) : boolean {
155+ if ( ! selectedName ) return false ;
156+ return (
157+ item . name === selectedName || Boolean ( item . subList ?. find ( it => getIsSelected ( it , selectedName ) ) )
158+ ) ;
159+ }
160+
161+ /**
162+ * Updates the isSelected field of an item
163+ */
164+ function updateItemSelected (
165+ item : SidebarItemProps ,
166+ selectedName ?: string | null
167+ ) : SidebarItemProps {
168+ const isSelected = getIsSelected ( item , selectedName ) ;
169+ if ( isSelected === false ) return item ;
170+ return {
171+ ...item ,
172+ isSelected : isSelected ,
173+ subList : item . subList
174+ ? item . subList . map ( it => updateItemSelected ( it , selectedName ) )
175+ : item . subList ,
176+ } ;
177+ }
178+
156179export default function Sidebar ( ) {
157180 const { t, i18n } = useTranslation ( [ 'glossary' , 'translation' ] ) ;
158181
@@ -177,7 +200,7 @@ export default function Sidebar() {
177200 return prepareRoutes ( t , sidebar . selected . sidebar || '' ) ;
178201 } , [
179202 cluster ,
180- sidebar . selected ,
203+ sidebar . selected . sidebar ,
181204 sidebar . entries ,
182205 sidebar . filters ,
183206 i18n . language ,
@@ -195,13 +218,18 @@ export default function Sidebar() {
195218 [ sidebar . selected . sidebar , isOpen ]
196219 ) ;
197220
221+ const processedItems = useMemo (
222+ ( ) => items . map ( item => updateItemSelected ( item , sidebar . selected . item ) ) ,
223+ [ items , sidebar . selected . item ]
224+ ) ;
225+
198226 if ( sidebar . selected . sidebar === null || ! sidebar ?. isVisible ) {
199227 return null ;
200228 }
201229
202230 return (
203231 < PureSidebar
204- items = { items }
232+ items = { processedItems }
205233 open = { isOpen }
206234 openUserSelected = { isUserOpened }
207235 isNarrowOnly = { isNarrowOnly }
@@ -220,7 +248,7 @@ export interface PureSidebarProps {
220248 /** If the user has selected to open/shrink the sidebar */
221249 openUserSelected ?: boolean ;
222250 /** To show in the sidebar. */
223- items : SidebarEntry [ ] ;
251+ items : SidebarItemProps [ ] ;
224252 /** The selected route name of the sidebar open. */
225253 selectedName : string | null ;
226254 /** If the sidebar is the temporary one (full sidebar when user selects it in mobile). */
@@ -240,7 +268,6 @@ export const PureSidebar = memo(
240268 open,
241269 openUserSelected,
242270 items,
243- selectedName,
244271 isTemporaryDrawer = false ,
245272 isNarrowOnly = false ,
246273 onToggleOpen,
@@ -292,7 +319,7 @@ export const PureSidebar = memo(
292319 { items . map ( item => (
293320 < SidebarItem
294321 key = { item . name }
295- selectedName = { selectedName }
322+ isSelected = { item . isSelected }
296323 fullWidth = { largeSideBarOpen }
297324 search = { search }
298325 { ...item }
0 commit comments