diff --git a/.changeset/wicked-bugs-joke.md b/.changeset/wicked-bugs-joke.md new file mode 100644 index 0000000000..94fc77a213 --- /dev/null +++ b/.changeset/wicked-bugs-joke.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Added Link component in `TabUI` providing functionality like copy link or open in new tab. diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx index 5aec83bc2b..dad40c4615 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.test.tsx @@ -95,4 +95,13 @@ describe('', () => { await user.click(rendered.getByText('Docs')); expect(mockOnChange).toHaveBeenCalledTimes(1); }); + + it('should render 2 nav tabs', async () => { + const rendered = await renderInTestApp(); + const tabs = rendered.queryAllByTestId(id => id.startsWith('header-tab')); + expect(tabs).toHaveLength(2); + tabs.forEach(tab => { + expect(tab.tagName.toLocaleLowerCase('en-US')).toBe('a'); + }); + }); }); diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx index 799eab1eb5..852622c741 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx @@ -18,6 +18,7 @@ import { makeStyles } from '@material-ui/core/styles'; import TabUI, { TabProps } from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import React, { useCallback, useEffect, useState } from 'react'; +import { Link } from '@backstage/core-components'; // TODO(blam): Remove this implementation when the Tabs are ready // This is just a temporary solution to implementing tabs for now @@ -95,7 +96,9 @@ export function HeaderTabs(props: HeaderTabsProps) { setSelectedTab(selectedIndex); } }, [selectedIndex]); - + function removeLeadingSlash(path: string) { + return path.replace(/^\//, ''); + } return ( {tabs.map((tab, index) => ( ))} diff --git a/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx b/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx index 243e348319..e31c9f26fd 100644 --- a/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx +++ b/plugins/user-settings/src/components/DefaultSettingsPage/DefaultSettingsPage.test.tsx @@ -34,7 +34,7 @@ describe('', () => { it('should render the settings page with 3 tabs', async () => { const { container } = await renderInTestApp(); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(3); }); @@ -48,7 +48,7 @@ describe('', () => { , ); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); expect(tabs[3].textContent).toEqual('Advanced'); }); @@ -63,7 +63,7 @@ describe('', () => { , ); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); expect(tabs[3].textContent).toEqual('Advanced'); }); diff --git a/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx b/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx index 8f2efa73f4..f6be87f14f 100644 --- a/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx +++ b/plugins/user-settings/src/components/SettingsPage/SettingsPage.test.tsx @@ -36,7 +36,7 @@ describe('', () => { it('should render the default settings page with 3 tabs', async () => { const { container } = await renderInTestApp(); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(3); }); @@ -49,7 +49,7 @@ describe('', () => { (useOutlet as jest.Mock).mockReturnValue(advancedTabRoute); const { container } = await renderInTestApp(); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); expect(tabs[3].textContent).toEqual('Advanced'); }); @@ -63,7 +63,7 @@ describe('', () => { (useOutlet as jest.Mock).mockReturnValue(advancedTabRoute); const { container } = await renderInTestApp(); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(4); expect(tabs[3].textContent).toEqual('Advanced'); const user = userEvent.setup(); @@ -86,7 +86,7 @@ describe('', () => { (useOutlet as jest.Mock).mockReturnValue(customLayout); const { container } = await renderInTestApp(); - const tabs = container.querySelectorAll('[class*=MuiTabs-root] button'); + const tabs = container.querySelectorAll('[class*=MuiTabs-root] a'); expect(tabs).toHaveLength(2); expect(tabs[0].textContent).toEqual('General'); expect(tabs[1].textContent).toEqual('Advanced');