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');