@@ -26,55 +26,36 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
26
26
} ) ;
27
27
} ;
28
28
29
- // Initialize collapsed state - only expand items that are part of the active path
29
+ // Initialize collapsed state - main menu always collapsed, sidebar expands active path
30
30
const getInitialCollapsedState = ( ) => {
31
31
const collapsed = new Set ( ) ;
32
32
33
- const collapseAllCollapsibleItems = ( itemsList , currentLevel ) => {
33
+ const processItems = ( itemsList , currentLevel ) => {
34
34
itemsList . forEach ( ( item , index ) => {
35
35
const itemId = `${ item . label } -${ currentLevel } -${ index } ` ;
36
-
37
- // Force collapsible when specified (for top-level menu),
38
- // or for level 1 in regular sidebar,
39
- // or respect the collapsible property for deeper levels
40
- const isCollapsibleItem = forceCollapsible
41
- ? ( item . items && item . items . length > 0 )
42
- : ( currentLevel === 1
43
- ? ( item . items && item . items . length > 0 )
44
- : ( item . items && item . items . length > 0 && item . collapsible !== false ) ) ;
45
-
46
- if ( isCollapsibleItem ) {
47
- collapsed . add ( itemId ) ;
48
- // Recursively collapse children too
49
- collapseAllCollapsibleItems ( item . items , currentLevel + 1 ) ;
50
- }
51
- } ) ;
52
- } ;
53
-
54
- const expandActivePathItems = ( itemsList , currentLevel ) => {
55
- itemsList . forEach ( ( item , index ) => {
56
- const itemId = `${ item . label } -${ currentLevel } -${ index } ` ;
57
-
58
- // Check if this item or any of its children are in the active path
59
- if ( item . items && item . items . length > 0 ) {
60
- const isActiveCategory = hasActiveChild ( item ) || isActiveItem ( item ) ;
61
-
62
- if ( isActiveCategory ) {
63
- // Remove from collapsed set (expand it)
64
- collapsed . delete ( itemId ) ;
65
- // Recursively check children
66
- expandActivePathItems ( item . items , currentLevel + 1 ) ;
36
+ const hasChildren = item . items && item . items . length > 0 ;
37
+
38
+ if ( hasChildren ) {
39
+ if ( forceCollapsible ) {
40
+ // Main menu: ALWAYS collapse everything
41
+ collapsed . add ( itemId ) ;
42
+ } else {
43
+ // Sidebar: only expand if this item or its children are in the active path
44
+ const shouldExpand = isActiveItem ( item ) || hasActiveChild ( item ) ;
45
+ if ( ! shouldExpand ) {
46
+ collapsed . add ( itemId ) ;
47
+ }
67
48
}
49
+
50
+ // Recursively process children
51
+ processItems ( item . items , currentLevel + 1 ) ;
68
52
}
69
53
} ) ;
70
54
} ;
71
55
56
+ console . log ( `Getting initial state for ${ forceCollapsible ? 'MAIN MENU' : 'SIDEBAR' } ` ) ;
72
57
if ( items && items . length > 0 ) {
73
- // First: Collapse everything that is collapsible
74
- collapseAllCollapsibleItems ( items , level ) ;
75
-
76
- // Second: Expand only items in the active path
77
- expandActivePathItems ( items , level ) ;
58
+ processItems ( items , level ) ;
78
59
}
79
60
80
61
return collapsed ;
@@ -84,10 +65,8 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
84
65
85
66
// Reset collapsed state when menu becomes visible (reopened)
86
67
React . useEffect ( ( ) => {
87
- if ( isMenuVisible ) {
88
- setCollapsedItems ( getInitialCollapsedState ( ) ) ;
89
- }
90
- } , [ isMenuVisible ] ) ;
68
+ setCollapsedItems ( getInitialCollapsedState ( ) ) ;
69
+ } , [ isMenuVisible , forceCollapsible , items , activePath , location . pathname ] ) ;
91
70
92
71
const toggleCollapse = ( itemId ) => {
93
72
const newCollapsed = new Set ( collapsedItems ) ;
@@ -103,14 +82,8 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
103
82
const itemId = `${ item . label } -${ level } -${ index } ` ;
104
83
const isActive = isActiveItem ( item ) ;
105
84
const hasChildren = item . items && item . items . length > 0 ;
106
- // Force collapsible when specified (for top-level menu),
107
- // or for level 1 in regular sidebar,
108
- // or respect the collapsible property for deeper levels
109
- const isCollapsible = forceCollapsible
110
- ? hasChildren
111
- : ( level === 1
112
- ? hasChildren
113
- : ( hasChildren && item . collapsible !== false ) ) ;
85
+ // All items with children are collapsible - ignore the collapsible property completely
86
+ const isCollapsible = hasChildren ;
114
87
const isCollapsed = collapsedItems . has ( itemId ) ;
115
88
const hasActiveDescendant = hasActiveChild ( item ) ;
116
89
@@ -125,13 +98,13 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
125
98
{
126
99
[ styles . active ] : isActive ,
127
100
[ styles . hasActiveChild ] : hasActiveDescendant && ! isActive ,
128
- [ styles . collapsible ] : hasChildren && isCollapsible ,
101
+ [ styles . collapsible ] : hasChildren ,
129
102
[ styles . collapsed ] : isCollapsed ,
130
103
}
131
104
) }
132
105
onClick = { ( e ) => {
133
- // Only expand/collapse if not clicking on the text and item is collapsible
134
- if ( hasChildren && isCollapsible && ! e . target . closest ( `.${ styles . categoryLabel } ` ) ) {
106
+ // Only expand/collapse if not clicking on the text and item has children
107
+ if ( hasChildren && ! e . target . closest ( `.${ styles . categoryLabel } ` ) ) {
135
108
toggleCollapse ( itemId ) ;
136
109
}
137
110
} }
@@ -140,7 +113,7 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
140
113
onKeyDown = { ( e ) => {
141
114
if ( e . key === 'Enter' || e . key === ' ' ) {
142
115
e . preventDefault ( ) ;
143
- if ( hasChildren && isCollapsible ) {
116
+ if ( hasChildren ) {
144
117
toggleCollapse ( itemId ) ;
145
118
}
146
119
}
@@ -169,7 +142,7 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
169
142
>
170
143
{ item . label }
171
144
</ span >
172
- { hasChildren && isCollapsible && (
145
+ { hasChildren && (
173
146
< span
174
147
className = { clsx ( styles . collapseIcon , {
175
148
[ styles . collapsed ] : isCollapsed
@@ -199,6 +172,7 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
199
172
activePath = { activePath }
200
173
level = { level + 1 }
201
174
onItemClick = { onItemClick }
175
+ forceCollapsible = { forceCollapsible }
202
176
/>
203
177
</ ul >
204
178
) }
@@ -254,4 +228,4 @@ const CustomSidebarItems = ({ items, activePath, level = 1, onItemClick, isMenuV
254
228
) ;
255
229
} ;
256
230
257
- export default CustomSidebarItems ;
231
+ export default CustomSidebarItems ;
0 commit comments