From 86e899b9775b34af8e83c039f5d2b7f6e050d099 Mon Sep 17 00:00:00 2001 From: Emma Indal Date: Fri, 30 Sep 2022 14:55:26 +0200 Subject: [PATCH] Be able to pass through index used for index ranking Co-authored-by: Camila Loiola Signed-off-by: Emma Indal --- .../SearchResultGroup/SearchResultGroup.tsx | 75 ++++++++++--------- 1 file changed, 39 insertions(+), 36 deletions(-) diff --git a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx index 2a82dd7fee..6040dbe560 100644 --- a/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx +++ b/plugins/search-react/src/components/SearchResultGroup/SearchResultGroup.tsx @@ -282,10 +282,6 @@ export type SearchResultGroupLayoutProps = ListProps & { * Icon that representing a result group. */ icon: JSX.Element; - /** - * Optional component to render when no results. Default to component. - */ - noResultsComponent?: React.ReactNode; /** * The results group title content, it could be a text or an element. */ @@ -310,7 +306,11 @@ export type SearchResultGroupLayoutProps = ListProps & { * Function to customize how filter options are rendered. * @remarks Defaults to a menu item where its value and label bounds to the option string. */ - renderFilterOption?: (filterOption: FilterOption) => JSX.Element; + renderFilterOption?: ( + value: FilterOption, + index: number, + array: FilterOption[], + ) => JSX.Element | null; /** * A list of search filter keys, also known as filter field names. */ @@ -326,7 +326,11 @@ export type SearchResultGroupLayoutProps = ListProps & { /** * Function to customize how result items are rendered. */ - renderResultItem?: (resultItem: SearchResult) => JSX.Element; + renderResultItem?: ( + value: SearchResult, + index: number, + array: SearchResult[], + ) => JSX.Element | null; /** * If defined, will render a default error panel. */ @@ -335,6 +339,10 @@ export type SearchResultGroupLayoutProps = ListProps & { * If defined, will render a default loading progress. */ loading?: boolean; + /** + * Optional component to render when no results. Default to component. + */ + noResultsComponent?: ReactNode; }; /** @@ -351,20 +359,34 @@ export function SearchResultGroupLayout( const { loading, error, - noResultsComponent = ( - - ), icon, title, titleProps = {}, - link, + link = ( + <> + See all + + + ), linkProps = {}, filterOptions, - renderFilterOption, + renderFilterOption = filterOption => ( + + {filterOption} + + ), filterFields, renderFilterField, resultItems, - renderResultItem, + renderResultItem = resultItem => ( + + ), + noResultsComponent = ( + + ), ...rest } = props; @@ -408,30 +430,14 @@ export function SearchResultGroupLayout( onClick={handleClose} keepMounted > - {filterOptions.map(filterOption => - renderFilterOption ? ( - renderFilterOption(filterOption) - ) : ( - - {filterOption} - - ), - )} + {filterOptions.map(renderFilterOption)} ) : null} {filterFields?.map( filterField => renderFilterField?.(filterField) ?? null, )} - {link ?? ( - <> - See all - - - )} + {link} {loading ? : null} @@ -442,7 +448,7 @@ export function SearchResultGroupLayout( /> ) : null} {!loading && !error && resultItems?.length - ? resultItems.map(resultItem => renderResultItem?.(resultItem) ?? null) + ? resultItems.map(renderResultItem) : null} {!loading && !error && !resultItems?.length ? ( {noResultsComponent} @@ -480,9 +486,6 @@ export function SearchResultGroup( const { query, linkProps = {}, - renderResultItem = ({ document }) => ( - - ), disableRenderingWithNoResults, ...rest } = props; @@ -506,8 +509,9 @@ export function SearchResultGroup( > {({ loading, error, value }) => { - if (disableRenderingWithNoResults && value?.results.length === 0) + if (!value?.results?.length && disableRenderingWithNoResults) { return null; + } return ( ( error={error} linkProps={{ to, ...linkProps }} resultItems={value?.results} - renderResultItem={renderResultItem} filterFields={Object.keys(query.filters ?? {})} /> );