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: {