Skip to content

Commit c239232

Browse files
committed
use navigateToUrl to navigate to recent nav links
1 parent 3d91165 commit c239232

File tree

6 files changed

+30
-7
lines changed

6 files changed

+30
-7
lines changed

src/core/public/chrome/ui/header/__snapshots__/collapsible_nav.test.tsx.snap

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/core/public/chrome/ui/header/__snapshots__/header.test.tsx.snap

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/core/public/chrome/ui/header/collapsible_nav.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ function mockProps() {
6767
onIsLockedUpdate: () => {},
6868
closeNav: () => {},
6969
navigateToApp: () => Promise.resolve(),
70+
navigateToUrl: () => Promise.resolve(),
7071
customNavLink$: new BehaviorSubject(undefined),
7172
};
7273
}

src/core/public/chrome/ui/header/collapsible_nav.tsx

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ interface Props {
8787
onIsLockedUpdate: OnIsLockedUpdate;
8888
closeNav: () => void;
8989
navigateToApp: InternalApplicationStart['navigateToApp'];
90+
navigateToUrl: InternalApplicationStart['navigateToUrl'];
9091
customNavLink$: Rx.Observable<ChromeNavLink | undefined>;
9192
}
9293

@@ -100,6 +101,7 @@ export function CollapsibleNav({
100101
onIsLockedUpdate,
101102
closeNav,
102103
navigateToApp,
104+
navigateToUrl,
103105
...observables
104106
}: Props) {
105107
const navLinks = useObservable(observables.navLinks$, []).filter((link) => !link.hidden);
@@ -217,17 +219,21 @@ export function CollapsibleNav({
217219
listItems={recentlyAccessed.map((link) => {
218220
// TODO #64541
219221
// Can remove icon from recent links completely
220-
const { iconType, ...hydratedLink } = createRecentNavLink(link, navLinks, basePath);
222+
const { iconType, onClick, ...hydratedLink } = createRecentNavLink(
223+
link,
224+
navLinks,
225+
basePath,
226+
navigateToUrl
227+
);
221228

222229
return {
223230
...hydratedLink,
224231
'data-test-subj': 'collapsibleNavAppLink--recent',
225232
onClick: (event) => {
226-
if (isModifiedOrPrevented(event)) {
227-
return;
233+
if (!isModifiedOrPrevented(event)) {
234+
closeNav();
235+
onClick(event);
228236
}
229-
230-
closeNav();
231237
},
232238
};
233239
})}

src/core/public/chrome/ui/header/header.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ export function Header({
184184
homeHref={homeHref}
185185
basePath={basePath}
186186
navigateToApp={application.navigateToApp}
187+
navigateToUrl={application.navigateToUrl}
187188
onIsLockedUpdate={onIsLockedUpdate}
188189
closeNav={() => {
189190
setIsNavOpen(false);

src/core/public/chrome/ui/header/nav_link.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { i18n } from '@kbn/i18n';
2222
import React from 'react';
2323
import { ChromeNavLink, ChromeRecentlyAccessedHistoryItem, CoreStart } from '../../..';
2424
import { HttpStart } from '../../../http';
25+
import { InternalApplicationStart } from '../../../application/types';
2526
import { relativeToAbsolute } from '../../nav_links/to_nav_link';
2627

2728
export const isModifiedOrPrevented = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) =>
@@ -87,6 +88,7 @@ export interface RecentNavLink {
8788
title: string;
8889
'aria-label': string;
8990
iconType?: string;
91+
onClick: React.MouseEventHandler;
9092
}
9193

9294
/**
@@ -102,8 +104,9 @@ export interface RecentNavLink {
102104
export function createRecentNavLink(
103105
recentLink: ChromeRecentlyAccessedHistoryItem,
104106
navLinks: ChromeNavLink[],
105-
basePath: HttpStart['basePath']
106-
) {
107+
basePath: HttpStart['basePath'],
108+
navigateToUrl: InternalApplicationStart['navigateToUrl']
109+
): RecentNavLink {
107110
const { link, label } = recentLink;
108111
const href = relativeToAbsolute(basePath.prepend(link));
109112
const navLink = navLinks.find((nl) => href.startsWith(nl.baseUrl));
@@ -125,5 +128,12 @@ export function createRecentNavLink(
125128
title: titleAndAriaLabel,
126129
'aria-label': titleAndAriaLabel,
127130
iconType: navLink?.euiIconType,
131+
/* Use href and onClick to support "open in new tab" and SPA navigation in the same link */
132+
onClick(event: React.MouseEvent<HTMLButtonElement, MouseEvent>) {
133+
if (event.button === 0 && !isModifiedOrPrevented(event)) {
134+
event.preventDefault();
135+
navigateToUrl(href);
136+
}
137+
},
128138
};
129139
}

0 commit comments

Comments
 (0)