Skip to content

Commit

Permalink
support easily customizable citation card
Browse files Browse the repository at this point in the history
J=CLIP-1332
TEST=auto,manual

ran `npm run test` and test manually on test-site
  • Loading branch information
anguyen-yext2 committed Jun 27, 2024
1 parent a3048dc commit 1eb42ba
Show file tree
Hide file tree
Showing 13 changed files with 102 additions and 22 deletions.
2 changes: 1 addition & 1 deletion docs/search-ui-react.citationprops.getcitationlink.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@
**Signature:**

```typescript
getCitationLink?: (searchResult: Result) => string | undefined;
getCitationLink?: (searchResult: Result) => unknown;
```
11 changes: 11 additions & 0 deletions docs/search-ui-react.citationprops.getcitationsnippet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [@yext/search-ui-react](./search-ui-react.md) &gt; [CitationProps](./search-ui-react.citationprops.md) &gt; [getCitationSnippet](./search-ui-react.citationprops.getcitationsnippet.md)

## CitationProps.getCitationSnippet property

**Signature:**

```typescript
getCitationSnippet?: (searchResult: Result) => unknown;
```
11 changes: 11 additions & 0 deletions docs/search-ui-react.citationprops.getcitationtitle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [@yext/search-ui-react](./search-ui-react.md) &gt; [CitationProps](./search-ui-react.citationprops.md) &gt; [getCitationTitle](./search-ui-react.citationprops.getcitationtitle.md)

## CitationProps.getCitationTitle property

**Signature:**

```typescript
getCitationTitle?: (searchResult: Result) => unknown;
```
4 changes: 3 additions & 1 deletion docs/search-ui-react.citationprops.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ interface CitationProps
| Property | Modifiers | Type | Description |
| --- | --- | --- | --- |
| [cssClasses](./search-ui-react.citationprops.cssclasses.md) | | [GenerativeDirectAnswerCssClasses](./search-ui-react.generativedirectanswercssclasses.md) | |
| [getCitationLink?](./search-ui-react.citationprops.getcitationlink.md) | | (searchResult: Result) =&gt; string \| undefined | _(Optional)_ |
| [getCitationLink?](./search-ui-react.citationprops.getcitationlink.md) | | (searchResult: Result) =&gt; unknown | _(Optional)_ |
| [getCitationSnippet?](./search-ui-react.citationprops.getcitationsnippet.md) | | (searchResult: Result) =&gt; unknown | _(Optional)_ |
| [getCitationTitle?](./search-ui-react.citationprops.getcitationtitle.md) | | (searchResult: Result) =&gt; unknown | _(Optional)_ |
| [searchResult](./search-ui-react.citationprops.searchresult.md) | | Result | |

4 changes: 2 additions & 2 deletions docs/search-ui-react.generativedirectanswer.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@ Displays the AI generated answer of a generative direct answer.
**Signature:**

```typescript
declare function GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink }: GenerativeDirectAnswerProps): JSX.Element | null;
declare function GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink, getCitationTitle, getCitationSnippet }: GenerativeDirectAnswerProps): JSX.Element | null;
```

## Parameters

| Parameter | Type | Description |
| --- | --- | --- |
| { customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink } | [GenerativeDirectAnswerProps](./search-ui-react.generativedirectanswerprops.md) | |
| { customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink, getCitationTitle, getCitationSnippet } | [GenerativeDirectAnswerProps](./search-ui-react.generativedirectanswerprops.md) | |

**Returns:**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ A function which is called to get the page URL that clicking on a citation card
**Signature:**

```typescript
getCitationLink?: (result: Result) => string | undefined;
getCitationLink?: (result: Result) => unknown;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [@yext/search-ui-react](./search-ui-react.md) &gt; [GenerativeDirectAnswerProps](./search-ui-react.generativedirectanswerprops.md) &gt; [getCitationSnippet](./search-ui-react.generativedirectanswerprops.getcitationsnippet.md)

## GenerativeDirectAnswerProps.getCitationSnippet property

A function which is called to get the snippet of citation card.

**Signature:**

```typescript
getCitationSnippet?: (result: Result) => unknown;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [@yext/search-ui-react](./search-ui-react.md) &gt; [GenerativeDirectAnswerProps](./search-ui-react.generativedirectanswerprops.md) &gt; [getCitationTitle](./search-ui-react.generativedirectanswerprops.getcitationtitle.md)

## GenerativeDirectAnswerProps.getCitationTitle property

A function which is called to get the title of citation card.

**Signature:**

```typescript
getCitationTitle?: (result: Result) => unknown;
```
4 changes: 3 additions & 1 deletion docs/search-ui-react.generativedirectanswerprops.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,7 @@ interface GenerativeDirectAnswerProps
| [CitationCard?](./search-ui-react.generativedirectanswerprops.citationcard.md) | | (props: [CitationProps](./search-ui-react.citationprops.md)<!-- -->) =&gt; JSX.Element \| null | _(Optional)_ The component for citation card |
| [citationsHeader?](./search-ui-react.generativedirectanswerprops.citationsheader.md) | | string \| JSX.Element | _(Optional)_ The header for the citations section of the generative direct answer. |
| [customCssClasses?](./search-ui-react.generativedirectanswerprops.customcssclasses.md) | | [GenerativeDirectAnswerCssClasses](./search-ui-react.generativedirectanswercssclasses.md) | _(Optional)_ CSS classes for customizing the component styling. |
| [getCitationLink?](./search-ui-react.generativedirectanswerprops.getcitationlink.md) | | (result: Result) =&gt; string \| undefined | _(Optional)_ A function which is called to get the page URL that clicking on a citation card routes to. |
| [getCitationLink?](./search-ui-react.generativedirectanswerprops.getcitationlink.md) | | (result: Result) =&gt; unknown | _(Optional)_ A function which is called to get the page URL that clicking on a citation card routes to. |
| [getCitationSnippet?](./search-ui-react.generativedirectanswerprops.getcitationsnippet.md) | | (result: Result) =&gt; unknown | _(Optional)_ A function which is called to get the snippet of citation card. |
| [getCitationTitle?](./search-ui-react.generativedirectanswerprops.getcitationtitle.md) | | (result: Result) =&gt; unknown | _(Optional)_ A function which is called to get the title of citation card. |

2 changes: 1 addition & 1 deletion docs/search-ui-react.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
| [Facets(props)](./search-ui-react.facets.md) | A component that displays all facets applicable to the current vertical search. |
| [FilterDivider({ className })](./search-ui-react.filterdivider.md) | A divider component used to separate NumericalFacets, HierarchicalFacets, StandardFacets, and StaticFilters. |
| [FilterSearch({ searchFields, label, placeholder, searchOnSelect, onSelect, onDropdownInputChange, afterDropdownInputFocus, sectioned, customCssClasses })](./search-ui-react.filtersearch.md) | A component which allows a user to search for filters associated with specific entities and fields. |
| [GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink })](./search-ui-react.generativedirectanswer.md) | Displays the AI generated answer of a generative direct answer. |
| [GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink, getCitationTitle, getCitationSnippet })](./search-ui-react.generativedirectanswer.md) | Displays the AI generated answer of a generative direct answer. |
| [Geolocation\_2({ geolocationOptions, radius, label, GeolocationIcon, handleClick, customCssClasses, })](./search-ui-react.geolocation_2.md) | A React Component which collects location information to create a location filter and perform a new search. |
| [getSearchIntents(searchActions)](./search-ui-react.getsearchintents.md) | Get search intents of the current query stored in headless using autocomplete request. |
| [getUserLocation(geolocationOptions)](./search-ui-react.getuserlocation.md) | Retrieves user's location using navigator.geolocation API. |
Expand Down
12 changes: 9 additions & 3 deletions etc/search-ui-react.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,11 @@ export interface CitationProps {
// (undocumented)
cssClasses: GenerativeDirectAnswerCssClasses;
// (undocumented)
getCitationLink?: (searchResult: Result) => string | undefined;
getCitationLink?: (searchResult: Result) => unknown;
// (undocumented)
getCitationSnippet?: (searchResult: Result) => unknown;
// (undocumented)
getCitationTitle?: (searchResult: Result) => unknown;
// (undocumented)
searchResult: Result;
}
Expand Down Expand Up @@ -323,7 +327,7 @@ export interface FilterSearchProps {
export type FocusedItemData = Record<string, unknown>;

// @public
export function GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink }: GenerativeDirectAnswerProps): JSX.Element | null;
export function GenerativeDirectAnswer({ customCssClasses, answerHeader, citationsHeader, CitationCard, getCitationLink, getCitationTitle, getCitationSnippet }: GenerativeDirectAnswerProps): JSX.Element | null;

// @public
export interface GenerativeDirectAnswerCssClasses {
Expand Down Expand Up @@ -351,7 +355,9 @@ export interface GenerativeDirectAnswerProps {
CitationCard?: (props: CitationProps) => JSX.Element | null;
citationsHeader?: string | JSX.Element;
customCssClasses?: GenerativeDirectAnswerCssClasses;
getCitationLink?: (result: Result) => string | undefined;
getCitationLink?: (result: Result) => unknown;
getCitationSnippet?: (result: Result) => unknown;
getCitationTitle?: (result: Result) => unknown;
}

// @public
Expand Down
40 changes: 30 additions & 10 deletions src/components/GenerativeDirectAnswer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ export interface GenerativeDirectAnswerProps {
/** The component for citation card */
CitationCard?: (props: CitationProps) => JSX.Element | null,
/** A function which is called to get the page URL that clicking on a citation card routes to. */
getCitationLink?: (result: Result) => string | undefined
getCitationLink?: (result: Result) => unknown,
/** A function which is called to get the title of citation card. */
getCitationTitle?: (result: Result) => unknown,
/** A function which is called to get the snippet of citation card. */
getCitationSnippet?: (result: Result) => unknown
}

/**
Expand All @@ -68,7 +72,9 @@ export function GenerativeDirectAnswer({
answerHeader,
citationsHeader,
CitationCard,
getCitationLink
getCitationLink,
getCitationTitle,
getCitationSnippet
}: GenerativeDirectAnswerProps): JSX.Element | null {
const cssClasses = useComposedCssClasses(builtInCssClasses, customCssClasses);

Expand Down Expand Up @@ -110,6 +116,8 @@ export function GenerativeDirectAnswer({
searchResults={searchResults}
CitationCard={CitationCard}
getCitationLink={getCitationLink}
getCitationTitle={getCitationTitle}
getCitationSnippet={getCitationSnippet}
/>
</div>
);
Expand Down Expand Up @@ -144,7 +152,9 @@ interface CitationsProps {
searchResults: Result[],
citationsHeader?: string | JSX.Element,
CitationCard?: (props: CitationProps) => JSX.Element | null,
getCitationLink?: (result: Result) => string | undefined
getCitationLink?: (result: Result) => unknown,
getCitationTitle?: (result: Result) => unknown,
getCitationSnippet?: (result: Result) => unknown
}

/**
Expand All @@ -157,7 +167,9 @@ function Citations(props: CitationsProps) {
searchResults,
citationsHeader = `Sources (${gdaResponse.citations.length})`,
CitationCard = Citation,
getCitationLink
getCitationLink,
getCitationTitle,
getCitationSnippet
} = props;
if (!gdaResponse.citations.length) {
return null;
Expand All @@ -173,6 +185,8 @@ function Citations(props: CitationsProps) {
searchResult={result}
cssClasses={cssClasses}
getCitationLink={getCitationLink}
getCitationTitle={getCitationTitle}
getCitationSnippet={getCitationSnippet}
/>
)
}
Expand All @@ -196,18 +210,24 @@ function Citations(props: CitationsProps) {
export interface CitationProps {
searchResult: Result,
cssClasses: GenerativeDirectAnswerCssClasses,
getCitationLink?: (searchResult: Result) => string | undefined
getCitationLink?: (searchResult: Result) => unknown,
getCitationTitle?: (searchResult: Result) => unknown,
getCitationSnippet?: (searchResult: Result) => unknown
}

function Citation(props: CitationProps) {
const {
searchResult,
cssClasses,
getCitationLink
getCitationLink,
getCitationTitle = (searchResult: Result) => searchResult.rawData.name,
getCitationSnippet = (searchResult: Result) => searchResult.rawData.description
} = props;
const citationLink: string | undefined = getCitationLink?.(searchResult);
return <a className={cssClasses.citation} href={citationLink}>
<div className={cssClasses.citationTitle}>{searchResult.rawData.name}</div>
<div className={cssClasses.citationSnippet}>{searchResult.rawData.description}</div>
const citationLink: unknown = getCitationLink?.(searchResult);
const citationTitle: unknown = getCitationTitle?.(searchResult);
const citationSnippet: unknown = getCitationSnippet?.(searchResult);
return <a className={cssClasses.citation} href={typeof citationLink === 'string' ? citationLink : undefined}>
<div className={cssClasses.citationTitle}>{citationTitle}</div>
<div className={cssClasses.citationSnippet}>{citationSnippet}</div>
</a>;
}
6 changes: 4 additions & 2 deletions test-site/src/pages/UniversalPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,10 @@ export default function UniversalPage(): JSX.Element {
<SpellCheck />
<GenerativeDirectAnswer
answerHeader='A custom answer header'
CitationCard={CustomCitationCard}
getCitationLink={searchResult => (typeof searchResult.rawData.link === 'string' ? searchResult.rawData.link : undefined)}
getCitationLink={searchResult => searchResult.rawData.link}
getCitationTitle={searchResult => `${searchResult.rawData.id} - ${searchResult.rawData.name}`}
getCitationSnippet={searchResult => searchResult.rawData.s_snippet}
// CitationCard={CustomCitationCard}
/>
<DirectAnswer />
<ResultsCount />
Expand Down

0 comments on commit 1eb42ba

Please sign in to comment.