From eca03bdae912a69b7c92a951092a7843cc21b1e0 Mon Sep 17 00:00:00 2001 From: Joshua Jung Date: Fri, 16 Aug 2024 10:56:05 -0500 Subject: [PATCH] Adding customization of SidebarSearchModal search item renderers Signed-off-by: Joshua Jung --- .changeset/proud-rice-exist.md | 5 +++ plugins/search/README.md | 2 +- .../components/SearchModal/SearchModal.tsx | 34 ++++++++++++++----- .../components/SearchType/SearchType.Tabs.tsx | 2 +- .../SidebarSearchModal/SidebarSearchModal.tsx | 4 ++- plugins/search/src/plugin.ts | 22 +++++++++++- 6 files changed, 57 insertions(+), 12 deletions(-) create mode 100644 .changeset/proud-rice-exist.md diff --git a/.changeset/proud-rice-exist.md b/.changeset/proud-rice-exist.md new file mode 100644 index 0000000000..e13619234f --- /dev/null +++ b/.changeset/proud-rice-exist.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search': patch +--- + +Added ability to customize the search items within the SidebarSearchModal diff --git a/plugins/search/README.md b/plugins/search/README.md index e6b664338d..0aab198994 100644 --- a/plugins/search/README.md +++ b/plugins/search/README.md @@ -30,7 +30,7 @@ This search plugin is primarily responsible for the following: - Providing a `` routable extension. - Exposing various search-related components (like ``, - ``, etc), which can be composed by a Backstage App or by + ``, etc.), which can be composed by a Backstage App or by other Backstage Plugins to power search experiences of all kinds. Don't forget, a lot of functionality is available in web libraries and backend plugins: diff --git a/plugins/search/src/components/SearchModal/SearchModal.tsx b/plugins/search/src/components/SearchModal/SearchModal.tsx index 07eec4438e..422197462d 100644 --- a/plugins/search/src/components/SearchModal/SearchModal.tsx +++ b/plugins/search/src/components/SearchModal/SearchModal.tsx @@ -37,12 +37,12 @@ import CloseIcon from '@material-ui/icons/Close'; import React, { useCallback, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; -import { rootRouteRef } from '../../plugin'; +import { rootRouteRef, SearchResultChildrenProvider } from '../../plugin'; /** * @public */ -export interface SearchModalChildrenProps { +export interface SearchModalChildrenProps extends SearchResultChildrenProvider { /** * A function that should be invoked when navigating away from the modal. */ @@ -52,7 +52,7 @@ export interface SearchModalChildrenProps { /** * @public */ -export interface SearchModalProps { +export interface SearchModalProps extends SearchResultChildrenProvider { /** * If true, it renders the modal. */ @@ -100,7 +100,10 @@ const useStyles = makeStyles(theme => ({ viewResultsLink: { verticalAlign: '0.5em' }, })); -export const Modal = ({ toggleModal }: SearchModalChildrenProps) => { +export const Modal = ({ + toggleModal, + searchResultChildren, +}: SearchModalChildrenProps) => { const classes = useStyles(); const navigate = useNavigate(); const { transitions } = useTheme(); @@ -163,7 +166,9 @@ export const Modal = ({ toggleModal }: SearchModalChildrenProps) => { + > + {searchResultChildren} + @@ -180,7 +185,13 @@ export const Modal = ({ toggleModal }: SearchModalChildrenProps) => { * @public */ export const SearchModal = (props: SearchModalProps) => { - const { open = true, hidden, toggleModal, children } = props; + const { + open = true, + hidden, + toggleModal, + children, + searchResultChildren, + } = props; const classes = useStyles(); @@ -199,8 +210,15 @@ export const SearchModal = (props: SearchModalProps) => { > {open && ( - {(children && children({ toggleModal })) ?? ( - + {(children && + children({ + toggleModal, + searchResultChildren: searchResultChildren || [], + })) ?? ( + )} )} diff --git a/plugins/search/src/components/SearchType/SearchType.Tabs.tsx b/plugins/search/src/components/SearchType/SearchType.Tabs.tsx index d48420bdac..0ee20e48ed 100644 --- a/plugins/search/src/components/SearchType/SearchType.Tabs.tsx +++ b/plugins/search/src/components/SearchType/SearchType.Tabs.tsx @@ -20,7 +20,7 @@ import Tab from '@material-ui/core/Tab'; import Tabs from '@material-ui/core/Tabs'; import { makeStyles } from '@material-ui/core/styles'; -const useStyles = makeStyles(theme => ({ +const useStyles = makeStyles((theme: any) => ({ tabs: { borderBottom: `1px solid ${theme.palette.textVerySubtle}`, }, diff --git a/plugins/search/src/components/SidebarSearchModal/SidebarSearchModal.tsx b/plugins/search/src/components/SidebarSearchModal/SidebarSearchModal.tsx index fb4afc75fd..c4826cdd61 100644 --- a/plugins/search/src/components/SidebarSearchModal/SidebarSearchModal.tsx +++ b/plugins/search/src/components/SidebarSearchModal/SidebarSearchModal.tsx @@ -23,13 +23,14 @@ import { SearchModalProvider, useSearchModal, } from '../SearchModal'; +import { SearchResultChildrenProvider } from '../../plugin'; /** * Props for {@link SidebarSearchModal}. * * @public */ -export type SidebarSearchModalProps = { +export type SidebarSearchModalProps = SearchResultChildrenProvider & { icon?: IconComponent; children?: (props: SearchModalChildrenProps) => JSX.Element; }; @@ -49,6 +50,7 @@ const SidebarSearchModalContent = (props: SidebarSearchModalProps) => { diff --git a/plugins/search/src/plugin.ts b/plugins/search/src/plugin.ts index 1adfd2e684..03ed040917 100644 --- a/plugins/search/src/plugin.ts +++ b/plugins/search/src/plugin.ts @@ -25,6 +25,24 @@ import { createComponentExtension, fetchApiRef, } from '@backstage/core-plugin-api'; +import { ReactNode } from 'react'; +import { SearchResultSet } from '@backstage/plugin-search-common'; + +/** + * This type allows us to pass children to the component via the . + * + * This allows us to customize the search result items displayed in the SidebarSearchModal, like so: + * + * , + * } /> + * ]} /> + */ +export type SearchResultChildrenProvider = { + searchResultChildren?: + | ReactNode + | ((resultSet: SearchResultSet) => JSX.Element); +}; export const rootRouteRef = createRouteRef({ id: 'search', @@ -63,7 +81,9 @@ export const SearchPage = searchPlugin.provide( /** * @public */ -export const SidebarSearchModal = searchPlugin.provide( +export const SidebarSearchModal = searchPlugin.provide< + (props: SearchResultChildrenProvider) => JSX.Element | null +>( createComponentExtension({ name: 'SidebarSearchModal', component: {