diff --git a/assets/ts/ui/autocomplete/__autocomplete.d.ts b/assets/ts/ui/autocomplete/__autocomplete.d.ts index b14257ec0d..2d9611a010 100644 --- a/assets/ts/ui/autocomplete/__autocomplete.d.ts +++ b/assets/ts/ui/autocomplete/__autocomplete.d.ts @@ -28,6 +28,10 @@ type ContentItem = { content_title: string; } & AlgoliaItem; +type SearchResultItem = { + _search_result_url: string; +} & ContentItem; + export type LocationItem = { longitude: number; latitude: number; diff --git a/assets/ts/ui/autocomplete/helpers.ts b/assets/ts/ui/autocomplete/helpers.ts index a2a48f92f9..e220643c1b 100644 --- a/assets/ts/ui/autocomplete/helpers.ts +++ b/assets/ts/ui/autocomplete/helpers.ts @@ -7,6 +7,7 @@ import { LocationItem, PopularItem, RouteItem, + SearchResultItem, StopItem } from "./__autocomplete"; import { isLGDown } from "../../helpers/media-breakpoints"; @@ -23,6 +24,11 @@ export function isContentItem(x: Item): x is ContentItem { return Object.keys(x).includes("_content_type"); } +export function isSearchResultItem(x: Item): x is SearchResultItem { + // eslint-disable-next-line no-underscore-dangle + return isContentItem(x) && x._content_type === "search_result"; +} + export const getTitleAttribute = (item: Item): string[] => { if (isStopItem(item)) { return ["stop", "name"]; diff --git a/assets/ts/ui/autocomplete/templates/algolia.tsx b/assets/ts/ui/autocomplete/templates/algolia.tsx index eec63a1c3c..72910147ac 100644 --- a/assets/ts/ui/autocomplete/templates/algolia.tsx +++ b/assets/ts/ui/autocomplete/templates/algolia.tsx @@ -7,6 +7,7 @@ import { getTitleAttribute, isContentItem, isRouteItem, + isSearchResultItem, isStopItem } from "../helpers"; import { @@ -22,7 +23,13 @@ interface LinkForItemProps { } export function LinkForItem(props: LinkForItemProps): React.ReactElement { const { item, query, children } = props; - const url = isContentItem(item) ? item._content_url : item.url; + + let url = isContentItem(item) ? item._content_url : item.url; + + // Search result items are a subset of content items that point to a different URL + if (isSearchResultItem(item)) { + url = item._search_result_url.replace(/(internal|entity):/g, "/"); + } // Special case: When the matching text isn't part of the page title, help the // user locate the matching text by linking directly to / scrolling to the