diff --git a/.changeset/unlucky-queens-brush.md b/.changeset/unlucky-queens-brush.md new file mode 100644 index 0000000000..c080856246 --- /dev/null +++ b/.changeset/unlucky-queens-brush.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added ability for SidebarSubmenuItem to handle external links correctly via the "to" prop diff --git a/packages/core-components/src/layout/Sidebar/Bar.test.tsx b/packages/core-components/src/layout/Sidebar/Bar.test.tsx index 89133997f9..fc42e7a94e 100644 --- a/packages/core-components/src/layout/Sidebar/Bar.test.tsx +++ b/packages/core-components/src/layout/Sidebar/Bar.test.tsx @@ -46,6 +46,11 @@ async function renderScalableSidebar() { {}} text="Catalog"> + @@ -112,5 +121,22 @@ describe('Sidebar', () => { '/dropdownitemlink', ); }); + + it('Submenu item renders an external link when `to` value is provided', async () => { + userEvent.hover(screen.getByTestId('item-with-submenu')); + expect(screen.getByText('External Link').closest('a')).toHaveAttribute( + 'href', + 'https://backstage.io/', + ); + }); + + it('Dropdown item in submenu renders an external link when `to` value is provided', async () => { + userEvent.hover(screen.getByTestId('item-with-submenu')); + userEvent.click(screen.getByText('Misc')); + expect(screen.getByText('dropdown item 3').closest('a')).toHaveAttribute( + 'href', + 'https://backstage.io/', + ); + }); }); }); diff --git a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx index 1ede5f887e..d204728bcf 100644 --- a/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx +++ b/packages/core-components/src/layout/Sidebar/SidebarSubmenuItem.tsx @@ -14,15 +14,10 @@ * limitations under the License. */ import React, { useContext, useState } from 'react'; -import { - NavLink, - resolvePath, - useLocation, - useResolvedPath, -} from 'react-router-dom'; +import { resolvePath, useLocation, useResolvedPath } from 'react-router-dom'; import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; -import Link from '@material-ui/core/Link'; +import { Link } from '../../components/Link'; import { IconComponent } from '@backstage/core-plugin-api'; import classnames from 'classnames'; import { BackstageTheme } from '@backstage/theme'; @@ -163,7 +158,6 @@ export const SidebarSubmenuItem = (props: SidebarSubmenuItemProps) => {
{dropdownItems.map((object, key) => ( { return (