Skip to content

Commit b35bef2

Browse files
authored
Fix sidebar items inconsistently opening in new tabs when they are supposed to (#916)
1 parent 75ccd65 commit b35bef2

1 file changed

Lines changed: 21 additions & 27 deletions

File tree

ui-next/src/components/Sidebar/SidebarItem.tsx

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,18 @@ export const SidebarItem = ({
106106
const isParentWithActiveChild =
107107
hasChildren && hasActiveChild && !isRouteActive && !isActive;
108108

109+
const opensInNewTab = useMemo(
110+
() =>
111+
Boolean(
112+
item.isOpenNewTab ||
113+
(item.linkTo &&
114+
(item.linkTo.startsWith("//") ||
115+
item.linkTo.startsWith("http://") ||
116+
item.linkTo.startsWith("https://"))),
117+
),
118+
[item.isOpenNewTab, item.linkTo],
119+
);
120+
109121
const handleClick = useCallback(() => {
110122
if (hasChildren) {
111123
setIsExpanded((prev) => !prev);
@@ -146,37 +158,19 @@ export const SidebarItem = ({
146158
const badgeCount = (item.useBadgeCount ?? (() => 0))();
147159
const showBadge = badgeCount > 0;
148160

149-
// Check if link should open in new tab (isOpenNewTab flag or absolute URL)
150-
const isExternalLink =
151-
item.isOpenNewTab ||
152-
(item.linkTo &&
153-
(item.linkTo.startsWith("//") ||
154-
item.linkTo.startsWith("http://") ||
155-
item.linkTo.startsWith("https://")));
161+
const isLeafLink = Boolean(item.linkTo) && item.linkTo !== "" && !hasChildren;
162+
// New-tab leaf: omit custom onClick so Link/anchor default is the only navigation
163+
// (ListItemButton + component="a" + onClick races with target="_blank" otherwise).
164+
const leafLinkClicksOpenNewTab = isLeafLink && opensInNewTab;
156165

157166
const itemContent = (
158167
<ListItemButton
159168
id={item.id}
160-
component={
161-
item.linkTo && !hasChildren && item.linkTo !== "" && !isExternalLink
162-
? Link
163-
: isExternalLink && item.linkTo && !hasChildren && item.linkTo !== ""
164-
? "a"
165-
: "div"
166-
}
167-
to={
168-
item.linkTo && !hasChildren && item.linkTo !== "" && !isExternalLink
169-
? item.linkTo
170-
: undefined
171-
}
172-
href={
173-
isExternalLink && item.linkTo && !hasChildren && item.linkTo !== ""
174-
? item.linkTo
175-
: undefined
176-
}
177-
target={isExternalLink ? "_blank" : undefined}
178-
rel={isExternalLink ? "noopener noreferrer" : undefined}
179-
onClick={handleClick}
169+
component={isLeafLink ? Link : "div"}
170+
to={isLeafLink ? item.linkTo : undefined}
171+
target={opensInNewTab ? "_blank" : undefined}
172+
rel={opensInNewTab ? "noopener noreferrer" : undefined}
173+
onClick={leafLinkClicksOpenNewTab ? undefined : handleClick}
180174
onMouseEnter={
181175
!open && hasChildren && level === 0 ? onMouseEnter : undefined
182176
}

0 commit comments

Comments
 (0)