diff --git a/.changeset/clear-houses-wonder.md b/.changeset/clear-houses-wonder.md
new file mode 100644
index 0000000000..46ada62fbe
--- /dev/null
+++ b/.changeset/clear-houses-wonder.md
@@ -0,0 +1,5 @@
+---
+'@backstage/plugin-techdocs': patch
+---
+
+TechDocs page titles have been improved, especially for deeply nested pages.
diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx
index 6f6ee81c8b..3c10b26f7f 100644
--- a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.test.tsx
@@ -52,13 +52,11 @@ const mockTechDocsMetadata = {
site_description: 'test-site-desc',
};
-const mockUseParams = jest.fn();
-mockUseParams.mockReturnValue({ '*': 'foo/bar/baz/' });
-
+let useParamsPath = '/';
jest.mock('react-router-dom', () => {
return {
...(jest.requireActual('react-router-dom') as any),
- useParams: () => mockUseParams(),
+ useParams: () => ({ '*': useParamsPath }),
};
});
@@ -189,6 +187,7 @@ describe('', () => {
getEntityMetadata.mockResolvedValue(mockEntityMetadata);
getTechDocsMetadata.mockResolvedValue(mockTechDocsMetadata);
+ useParamsPath = 'foo/bar/baz/';
await renderInTestApp(
@@ -203,7 +202,31 @@ describe('', () => {
await waitFor(() => {
expect(document.title).toEqual(
- 'Backstage | Test Entity | Foo | Bar | Baz',
+ 'Test Entity | Foo | Bar | Baz | Backstage',
+ );
+ });
+ });
+
+ it('The header title is abbreviated if path is too long', async () => {
+ getEntityMetadata.mockResolvedValue(mockEntityMetadata);
+ getTechDocsMetadata.mockResolvedValue(mockTechDocsMetadata);
+
+ useParamsPath = 'foo/bar/baz/qux/quux/';
+ await renderInTestApp(
+
+
+ ,
+ {
+ mountedRoutes: {
+ '/catalog/:namespace/:kind/:name/*': entityRouteRef,
+ '/docs': rootRouteRef,
+ },
+ },
+ );
+
+ await waitFor(() => {
+ expect(document.title).toEqual(
+ 'Test Entity | Foo | Bar | Baz | Qux | Quux | Backstage',
);
});
});
diff --git a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx
index bafcdd270c..6328becc73 100644
--- a/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx
+++ b/plugins/techdocs/src/reader/components/TechDocsReaderPageHeader/TechDocsReaderPageHeader.tsx
@@ -172,17 +172,16 @@ export const TechDocsReaderPageHeader = (
const removeTrailingSlash = (str: string) => str.replace(/\/$/, '');
const normalizeAndSpace = (str: string) =>
- str.replace(/-/g, ' ').split(' ').map(capitalize).join(' ');
+ str.replace(/[-_]/g, ' ').split(' ').map(capitalize).join(' ');
let techdocsTabTitleItems: string[] = [];
if (path !== '')
techdocsTabTitleItems = removeTrailingSlash(path)
.split('/')
- .slice(0, 3)
.map(normalizeAndSpace);
- const tabTitleItems = [appTitle, entityDisplayName, ...techdocsTabTitleItems];
+ const tabTitleItems = [entityDisplayName, ...techdocsTabTitleItems, appTitle];
const tabTitle = tabTitleItems.join(' | ');
return (