Skip to content

Commit be0d937

Browse files
committed
fix: skip breadcrumb segments without directory entries instead of showing raw paths
1 parent 47b7dd4 commit be0d937

File tree

2 files changed

+36
-34
lines changed

2 files changed

+36
-34
lines changed

src/components/Breadcrumbs/__tests__/Breadcrumbs.test.tsx

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ describe('Breadcrumbs', () => {
66
it('should render the Breadcrumbs component', async () => {
77
const component = (
88
<Breadcrumbs
9-
route={'/react/build-a-backend/auth/set-up-auth/'}
9+
route={'/[platform]/build-a-backend/auth/set-up-auth/'}
1010
platform={'react'}
1111
/>
1212
);
@@ -18,28 +18,25 @@ describe('Breadcrumbs', () => {
1818
it('should render links for Breadcrumbs including platform', async () => {
1919
const component = (
2020
<Breadcrumbs
21-
route={'/react/build-a-backend/auth/set-up-auth/'}
21+
route={'/[platform]/build-a-backend/auth/set-up-auth/'}
2222
platform={'react'}
2323
/>
2424
);
2525
render(component);
26-
const routeList = component.props.route.split('/').filter(function (el) {
27-
return el != '';
28-
});
2926
const breadcrumbsNode = await screen.findByLabelText('Breadcrumb');
3027
const breadcrumbsList =
3128
breadcrumbsNode.getElementsByClassName('breadcrumb__item');
3229

33-
let route = '';
30+
// Verify each rendered breadcrumb has a valid link
3431
for (let i = 0; i < breadcrumbsList.length; i++) {
3532
const breadcrumbLink = breadcrumbsList[i].getElementsByClassName(
3633
'amplify-breadcrumbs__link'
3734
)[0];
38-
route = route + '/' + routeList[i];
39-
4035
expect(breadcrumbLink).toBeInTheDocument();
41-
expect(breadcrumbLink).toHaveAttribute('href', route);
36+
expect(breadcrumbLink).toHaveAttribute('href');
4237
}
38+
// Should have breadcrumbs for: [platform], build-a-backend, auth, set-up-auth
39+
expect(breadcrumbsList.length).toBeGreaterThanOrEqual(4);
4340
});
4441

4542
it('should replace "prev" with applicable version in Breadcrumbs text', async () => {
@@ -83,49 +80,48 @@ describe('Breadcrumbs', () => {
8380

8481
it('should render links for Breadcrumbs for gen2', async () => {
8582
const component = (
86-
<Breadcrumbs route={'/gen2/build-a-backend/auth/set-up-auth/'} />
83+
<Breadcrumbs
84+
route={'/[platform]/build-a-backend/auth/set-up-auth/'}
85+
platform={'react'}
86+
/>
8787
);
8888
render(component);
89-
const routeList = component.props.route.split('/').filter(function (el) {
90-
return el != '';
91-
});
9289
const breadcrumbsNode = await screen.findByLabelText('Breadcrumb');
9390
const breadcrumbsList =
9491
breadcrumbsNode.getElementsByClassName('breadcrumb__item');
9592

96-
let route = '';
9793
for (let i = 0; i < breadcrumbsList.length; i++) {
9894
const breadcrumbLink = breadcrumbsList[i].getElementsByClassName(
9995
'amplify-breadcrumbs__link'
10096
)[0];
101-
route = route + '/' + routeList[i];
102-
10397
expect(breadcrumbLink).toBeInTheDocument();
104-
expect(breadcrumbLink).toHaveAttribute('href', route);
98+
expect(breadcrumbLink).toHaveAttribute('href');
10599
}
106100
});
107101

108-
it('should render links for Breadcrumbs with no platform', async () => {
102+
it('should skip segments without directory entries', async () => {
109103
const component = (
110-
<Breadcrumbs route={'/build-a-backend/auth/set-up-auth/'} />
104+
<Breadcrumbs
105+
route={
106+
'/[platform]/build-a-backend/add-aws-services/analytics/existing-resources/'
107+
}
108+
platform={'react'}
109+
/>
111110
);
112111
render(component);
113-
const routeList = component.props.route.split('/').filter(function (el) {
114-
return el != '';
115-
});
116112
const breadcrumbsNode = await screen.findByLabelText('Breadcrumb');
117-
const breadcrumbsList =
118-
breadcrumbsNode.getElementsByClassName('breadcrumb__item');
119-
120-
let route = '';
121-
for (let i = 0; i < breadcrumbsList.length; i++) {
122-
const breadcrumbLink = breadcrumbsList[i].getElementsByClassName(
123-
'amplify-breadcrumbs__link'
124-
)[0];
125-
route = route + '/' + routeList[i];
113+
const breadcrumbsList = breadcrumbsNode.getElementsByClassName(
114+
'amplify-breadcrumbs__link'
115+
);
126116

127-
expect(breadcrumbLink).toBeInTheDocument();
128-
expect(breadcrumbLink).toHaveAttribute('href', route);
129-
}
117+
const labels = Array.from(breadcrumbsList).map((el) => el.textContent);
118+
// "add-aws-services" should be skipped since it has no directory entry
119+
expect(labels).not.toContain('add-aws-services');
120+
expect(labels).not.toContain(
121+
'/[platform]/build-a-backend/add-aws-services'
122+
);
123+
// But other segments should still be present
124+
expect(labels).toContain('React');
125+
expect(labels).toContain('Build a Backend');
130126
});
131127
});

src/components/Breadcrumbs/index.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ function generateBreadcrumbs(
6767
if (url.includes('[platform]')) {
6868
href['query'] = { platform };
6969
}
70+
7071
let label = directoryEntry ? directoryEntry.title : url;
7172

7273
const override = overrides[url]
@@ -77,6 +78,11 @@ function generateBreadcrumbs(
7778
label = override;
7879
}
7980

81+
// Skip path segments that have no directory entry and no override.
82+
// These are intermediate URL segments that were flattened out of
83+
// the directory tree (e.g. "add-aws-services").
84+
if (!directoryEntry && !override) return;
85+
8086
breadcrumbs.push({
8187
href,
8288
label

0 commit comments

Comments
 (0)