Skip to content

Commit fcd15c5

Browse files
authored
Merge pull request #443 from msinha569/fix/nav-main-expand-collapse
Fix: expand/collapse on full button click
2 parents 1ea99bc + 61edefa commit fcd15c5

File tree

1 file changed

+32
-14
lines changed

1 file changed

+32
-14
lines changed

surfsense_web/components/sidebar/nav-main.tsx

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,27 @@ export function NavMain({ items }: { items: NavItem[] }) {
6262
<SidebarMenu>
6363
{memoizedItems.map((item, index) => {
6464
const translatedTitle = translateTitle(item.title);
65+
const hasSub = !!item.items?.length;
6566
return (
6667
<Collapsible key={`${item.title}-${index}`} asChild defaultOpen={item.isActive}>
6768
<SidebarMenuItem>
68-
<SidebarMenuButton
69-
asChild
70-
tooltip={translatedTitle}
71-
isActive={item.isActive}
72-
aria-label={`${translatedTitle}${item.items?.length ? " with submenu" : ""}`}
73-
>
74-
<a href={item.url}>
75-
<item.icon />
76-
<span>{translatedTitle}</span>
77-
</a>
78-
</SidebarMenuButton>
79-
80-
{item.items?.length ? (
69+
{hasSub ? (
70+
// When the item has children, make the whole row a collapsible trigger
8171
<>
72+
<CollapsibleTrigger asChild>
73+
<SidebarMenuButton
74+
asChild
75+
tooltip={translatedTitle}
76+
isActive={item.isActive}
77+
aria-label={`${translatedTitle} with submenu`}
78+
>
79+
<button type="button" className="flex items-center gap-2 w-full text-left">
80+
<item.icon />
81+
<span>{translatedTitle}</span>
82+
</button>
83+
</SidebarMenuButton>
84+
</CollapsibleTrigger>
85+
8286
<CollapsibleTrigger asChild>
8387
<SidebarMenuAction
8488
className="data-[state=open]:rotate-90 transition-transform duration-200"
@@ -88,6 +92,7 @@ export function NavMain({ items }: { items: NavItem[] }) {
8892
<span className="sr-only">Toggle submenu</span>
8993
</SidebarMenuAction>
9094
</CollapsibleTrigger>
95+
9196
<CollapsibleContent className="data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:slide-out-to-top-2 data-[state=open]:slide-in-from-top-2 duration-200">
9297
<SidebarMenuSub>
9398
{item.items?.map((subItem, subIndex) => {
@@ -105,7 +110,20 @@ export function NavMain({ items }: { items: NavItem[] }) {
105110
</SidebarMenuSub>
106111
</CollapsibleContent>
107112
</>
108-
) : null}
113+
) : (
114+
// Leaf item: treat as a normal link
115+
<SidebarMenuButton
116+
asChild
117+
tooltip={translatedTitle}
118+
isActive={item.isActive}
119+
aria-label={translatedTitle}
120+
>
121+
<a href={item.url}>
122+
<item.icon />
123+
<span>{translatedTitle}</span>
124+
</a>
125+
</SidebarMenuButton>
126+
)}
109127
</SidebarMenuItem>
110128
</Collapsible>
111129
);

0 commit comments

Comments
 (0)