diff --git a/plugins/search-react/src/context/SearchContext.tsx b/plugins/search-react/src/context/SearchContext.tsx index 94e51c0668..53192d0eac 100644 --- a/plugins/search-react/src/context/SearchContext.tsx +++ b/plugins/search-react/src/context/SearchContext.tsx @@ -95,16 +95,27 @@ export const useSearchContextCheck = () => { }; /** - * The initial state of `SearchContextProvider`. + * @public * + * Constructs an object representing the initial state default + * configuration for the SearchPage component + * + * @returns {SearchContextState} */ -const searchInitialState: SearchContextState = { +export const getSearchContextInitialStateDefaults = (): SearchContextState => ({ term: '', types: [], filters: {}, pageLimit: undefined, pageCursor: undefined, -}; +}); + +/** + * The initial state of `SearchContextProvider`. + * + */ +const searchInitialState: SearchContextState = + getSearchContextInitialStateDefaults(); const useSearchContextValue = ( initialValue: SearchContextState = searchInitialState, diff --git a/plugins/search-react/src/context/index.tsx b/plugins/search-react/src/context/index.tsx index 720af8a949..f00ba3ecfa 100644 --- a/plugins/search-react/src/context/index.tsx +++ b/plugins/search-react/src/context/index.tsx @@ -18,6 +18,7 @@ export { SearchContextProvider, useSearch, useSearchContextCheck, + getSearchContextInitialStateDefaults, } from './SearchContext'; export type { diff --git a/plugins/search-react/src/index.ts b/plugins/search-react/src/index.ts index 8b234e3c05..250bb2e893 100644 --- a/plugins/search-react/src/index.ts +++ b/plugins/search-react/src/index.ts @@ -28,6 +28,7 @@ export { SearchContextProvider, useSearch, useSearchContextCheck, + getSearchContextInitialStateDefaults, } from './context'; export type { SearchContextProviderProps, diff --git a/plugins/search/config.d.ts b/plugins/search/config.d.ts new file mode 100644 index 0000000000..5ba6a24870 --- /dev/null +++ b/plugins/search/config.d.ts @@ -0,0 +1,40 @@ +/* + * Copyright 2021 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface Config { + app: { + /** + * Configuration options for the search plugin + */ + search?: { + /** + * An object representing the initial state configuration for the SearchPage + * component. By configuring and modifying the values of the initialState + * object attributes, you can customize the initial state of the search component + * and define how it behaves when it is first loaded or reset. + */ + initialState?: { + /** + * A number indicating the maximum number of results to be returned + * per page during pagination. + * + * @visibility frontend + */ + pageLimit?: number; + }; + }; + }; +} diff --git a/plugins/search/package.json b/plugins/search/package.json index 3bca411e3e..e155783fc8 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -70,6 +70,8 @@ "msw": "^1.0.0" }, "files": [ - "dist" - ] + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" } diff --git a/plugins/search/src/components/SearchPage/SearchPage.tsx b/plugins/search/src/components/SearchPage/SearchPage.tsx index 3ee444bd32..edac4d9b2f 100644 --- a/plugins/search/src/components/SearchPage/SearchPage.tsx +++ b/plugins/search/src/components/SearchPage/SearchPage.tsx @@ -21,8 +21,10 @@ import { useLocation, useOutlet } from 'react-router-dom'; import { SearchContextProvider, useSearch, + getSearchContextInitialStateDefaults, } from '@backstage/plugin-search-react'; import { JsonObject } from '@backstage/types'; +import { configApiRef, useApi } from '@backstage/core-plugin-api'; export const UrlUpdater = () => { const location = useLocation(); @@ -91,9 +93,15 @@ export const UrlUpdater = () => { */ export const SearchPage = () => { const outlet = useOutlet(); + const configApi = useApi(configApiRef); + + const initialState = { + ...getSearchContextInitialStateDefaults(), + pageLimit: configApi.getOptionalNumber('app.search.initialState.pageLimit'), + }; return ( - + {outlet}