@backstage/plugin-search 0.7.5-next.0 → 0.7.5-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,26 @@
1
1
  # @backstage/plugin-search
2
2
 
3
+ ## 0.7.5-next.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 24254fd433: build(deps): bump `@testing-library/user-event` from 13.5.0 to 14.0.0
8
+ - 5c062f275e: Support customizing the content of the `SidebarSearchModal`
9
+ - 230ad0826f: Bump to using `@types/node` v16
10
+ - ab230a433f: The following exports has been moved to `@backstage/plugin-search-react` and will be removed in the next release. import from `@backstage/plugin-search-react` instead.
11
+
12
+ - `SearchApi` interface.
13
+ - `searchApiRef`
14
+ - `SearchContext`
15
+ - `SearchContextProvider`
16
+ - `useSearch`
17
+
18
+ - Updated dependencies
19
+ - @backstage/core-components@0.9.3-next.2
20
+ - @backstage/core-plugin-api@1.0.1-next.0
21
+ - @backstage/plugin-catalog-react@1.0.1-next.3
22
+ - @backstage/plugin-search-react@0.1.0-next.0
23
+
3
24
  ## 0.7.5-next.0
4
25
 
5
26
  ### Patch Changes
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import SearchIcon from '@material-ui/icons/Search';
3
3
  import { SidebarItem } from '@backstage/core-components';
4
- import { u as useSearchModal, d as SearchModal } from './index-6c1324ea.esm.js';
4
+ import { u as useSearchModal, d as SearchModal } from './index-927faa3d.esm.js';
5
5
  import '@backstage/core-plugin-api';
6
6
  import '@backstage/errors';
7
7
  import 'qs';
@@ -38,9 +38,10 @@ const SidebarSearchModal = (props) => {
38
38
  onClick: toggleModal
39
39
  }), /* @__PURE__ */ React.createElement(SearchModal, {
40
40
  ...state,
41
- toggleModal
41
+ toggleModal,
42
+ children: props.children
42
43
  }));
43
44
  };
44
45
 
45
46
  export { SidebarSearchModal };
46
- //# sourceMappingURL=index-6dc0dac9.esm.js.map
47
+ //# sourceMappingURL=index-6ef71f25.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-6ef71f25.esm.js","sources":["../../src/components/SidebarSearchModal/SidebarSearchModal.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport SearchIcon from '@material-ui/icons/Search';\nimport { SidebarItem } from '@backstage/core-components';\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport {\n SearchModal,\n SearchModalChildrenProps,\n useSearchModal,\n} from '../SearchModal';\n\nexport type SidebarSearchModalProps = {\n icon?: IconComponent;\n children?: (props: SearchModalChildrenProps) => JSX.Element;\n};\n\nexport const SidebarSearchModal = (props: SidebarSearchModalProps) => {\n const { state, toggleModal } = useSearchModal();\n const Icon = props.icon ? props.icon : SearchIcon;\n\n return (\n <>\n <SidebarItem\n className=\"search-icon\"\n icon={Icon}\n text=\"Search\"\n onClick={toggleModal}\n />\n <SearchModal\n {...state}\n toggleModal={toggleModal}\n children={props.children}\n />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOY,MAAC,kBAAkB,GAAG,CAAC,KAAK,KAAK;AAC7C,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,CAAC;AAClD,EAAE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC;AACpD,EAAE,uBAAuB,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,kBAAkB,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE;AACpH,IAAI,SAAS,EAAE,aAAa;AAC5B,IAAI,IAAI,EAAE,IAAI;AACd,IAAI,IAAI,EAAE,QAAQ;AAClB,IAAI,OAAO,EAAE,WAAW;AACxB,GAAG,CAAC,kBAAkB,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE;AACvD,IAAI,GAAG,KAAK;AACZ,IAAI,WAAW;AACf,IAAI,QAAQ,EAAE,KAAK,CAAC,QAAQ;AAC5B,GAAG,CAAC,CAAC,CAAC;AACN;;;;"}
@@ -1,4 +1,4 @@
1
- export { D as DefaultResultListItem } from './index-6c1324ea.esm.js';
1
+ export { D as DefaultResultListItem } from './index-927faa3d.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'qs';
@@ -27,4 +27,4 @@ import 'react-use/lib/useEffectOnce';
27
27
  import '@material-ui/icons/ExpandMore';
28
28
  import '@material-ui/icons/FontDownload';
29
29
  import 'react-router-dom';
30
- //# sourceMappingURL=index-5122e36b.esm.js.map
30
+ //# sourceMappingURL=index-841ba24a.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-841ba24a.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,4 +1,4 @@
1
- export { a as SearchBar, b as SearchBarBase } from './index-6c1324ea.esm.js';
1
+ export { a as SearchBar, b as SearchBarBase } from './index-927faa3d.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'qs';
@@ -27,4 +27,4 @@ import 'react-use/lib/useEffectOnce';
27
27
  import '@material-ui/icons/ExpandMore';
28
28
  import '@material-ui/icons/FontDownload';
29
29
  import 'react-router-dom';
30
- //# sourceMappingURL=index-5c70689c.esm.js.map
30
+ //# sourceMappingURL=index-8fe3dbdd.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-8fe3dbdd.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -620,54 +620,54 @@ const searchPlugin = createPlugin({
620
620
  });
621
621
  const SearchPage$1 = searchPlugin.provide(createRoutableExtension({
622
622
  name: "SearchPage",
623
- component: () => import('./index-c59968b8.esm.js').then((m) => m.SearchPage),
623
+ component: () => import('./index-9a79e9c2.esm.js').then((m) => m.SearchPage),
624
624
  mountPoint: rootRouteRef
625
625
  }));
626
626
  const SearchPageNext = searchPlugin.provide(createRoutableExtension({
627
627
  name: "SearchPageNext",
628
- component: () => import('./index-c59968b8.esm.js').then((m) => m.SearchPage),
628
+ component: () => import('./index-9a79e9c2.esm.js').then((m) => m.SearchPage),
629
629
  mountPoint: rootNextRouteRef
630
630
  }));
631
631
  searchPlugin.provide(createComponentExtension({
632
632
  name: "SearchBar",
633
633
  component: {
634
- lazy: () => import('./index-5c70689c.esm.js').then((m) => m.SearchBar)
634
+ lazy: () => import('./index-8fe3dbdd.esm.js').then((m) => m.SearchBar)
635
635
  }
636
636
  }));
637
637
  const SearchBarNext = searchPlugin.provide(createComponentExtension({
638
638
  name: "SearchBarNext",
639
639
  component: {
640
- lazy: () => import('./index-5c70689c.esm.js').then((m) => m.SearchBar)
640
+ lazy: () => import('./index-8fe3dbdd.esm.js').then((m) => m.SearchBar)
641
641
  }
642
642
  }));
643
643
  const SearchResult$1 = searchPlugin.provide(createComponentExtension({
644
644
  name: "SearchResult",
645
645
  component: {
646
- lazy: () => import('./index-ecefd17e.esm.js').then((m) => m.SearchResult)
646
+ lazy: () => import('./index-e7f638c9.esm.js').then((m) => m.SearchResult)
647
647
  }
648
648
  }));
649
649
  searchPlugin.provide(createComponentExtension({
650
650
  name: "SearchResultNext",
651
651
  component: {
652
- lazy: () => import('./index-ecefd17e.esm.js').then((m) => m.SearchResult)
652
+ lazy: () => import('./index-e7f638c9.esm.js').then((m) => m.SearchResult)
653
653
  }
654
654
  }));
655
655
  const SidebarSearchModal = searchPlugin.provide(createComponentExtension({
656
656
  name: "SidebarSearchModal",
657
657
  component: {
658
- lazy: () => import('./index-6dc0dac9.esm.js').then((m) => m.SidebarSearchModal)
658
+ lazy: () => import('./index-6ef71f25.esm.js').then((m) => m.SidebarSearchModal)
659
659
  }
660
660
  }));
661
661
  const DefaultResultListItem = searchPlugin.provide(createComponentExtension({
662
662
  name: "DefaultResultListItem",
663
663
  component: {
664
- lazy: () => import('./index-5122e36b.esm.js').then((m) => m.DefaultResultListItem)
664
+ lazy: () => import('./index-841ba24a.esm.js').then((m) => m.DefaultResultListItem)
665
665
  }
666
666
  }));
667
667
  const HomePageSearchBar = searchPlugin.provide(createComponentExtension({
668
668
  name: "HomePageSearchBar",
669
669
  component: {
670
- lazy: () => import('./index-c88298b1.esm.js').then((m) => m.HomePageSearchBar)
670
+ lazy: () => import('./index-d0499309.esm.js').then((m) => m.HomePageSearchBar)
671
671
  }
672
672
  }));
673
673
 
@@ -740,8 +740,10 @@ const Modal = ({ toggleModal }) => {
740
740
  const SearchModal = ({
741
741
  open = true,
742
742
  hidden,
743
- toggleModal
743
+ toggleModal,
744
+ children
744
745
  }) => {
746
+ var _a;
745
747
  const classes = useStyles$7();
746
748
  return /* @__PURE__ */ React.createElement(Dialog, {
747
749
  classes: {
@@ -753,7 +755,7 @@ const SearchModal = ({
753
755
  maxWidth: "lg",
754
756
  open,
755
757
  hidden
756
- }, open && /* @__PURE__ */ React.createElement(SearchContextProvider, null, /* @__PURE__ */ React.createElement(Modal, {
758
+ }, open && /* @__PURE__ */ React.createElement(SearchContextProvider, null, (_a = children && children({ toggleModal })) != null ? _a : /* @__PURE__ */ React.createElement(Modal, {
757
759
  toggleModal
758
760
  })));
759
761
  };
@@ -1323,7 +1325,8 @@ const SearchTypeTabs = (props) => {
1323
1325
  indicatorColor: "primary",
1324
1326
  value: types.length === 0 ? "" : types[0],
1325
1327
  onChange: changeTab
1326
- }, definedTypes.map((type) => /* @__PURE__ */ React.createElement(Tab, {
1328
+ }, definedTypes.map((type, idx) => /* @__PURE__ */ React.createElement(Tab, {
1329
+ key: idx,
1327
1330
  className: classes.tab,
1328
1331
  disableRipple: true,
1329
1332
  label: type.name,
@@ -1420,4 +1423,4 @@ const SidebarSearch = (props) => {
1420
1423
  };
1421
1424
 
1422
1425
  export { DefaultResultListItem$1 as D, Filters$1 as F, HomePageSearchBar as H, SearchPage as S, SearchBar$1 as a, SearchBarBase as b, SearchResultComponent as c, SearchModal as d, FiltersButton$1 as e, SearchContextProvider as f, useSearch as g, SearchFilter as h, SearchFilterNext as i, SearchResultPager as j, SearchType as k, SidebarSearch as l, DefaultResultListItem as m, SearchBarNext as n, SearchPage$1 as o, SearchPageNext as p, searchPlugin as q, rootRouteRef as r, searchApiRef as s, SearchResult$1 as t, useSearchModal as u, SidebarSearchModal as v };
1423
- //# sourceMappingURL=index-6c1324ea.esm.js.map
1426
+ //# sourceMappingURL=index-927faa3d.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-927faa3d.esm.js","sources":["../../src/apis.ts","../../src/components/Filters/FiltersButton.tsx","../../src/components/Filters/Filters.tsx","../../src/components/SearchContext/SearchContext.tsx","../../src/components/SearchTracker/SearchTracker.tsx","../../src/components/SearchBar/SearchBar.tsx","../../src/components/SearchFilter/hooks.ts","../../src/components/SearchFilter/SearchFilter.Autocomplete.tsx","../../src/components/SearchFilter/SearchFilter.tsx","../../src/components/DefaultResultListItem/DefaultResultListItem.tsx","../../src/components/SearchResult/SearchResult.tsx","../../src/components/SearchResultPager/SearchResultPager.tsx","../../src/plugin.ts","../../src/components/SearchModal/SearchModal.tsx","../../src/components/SearchModal/useSearchModal.tsx","../../src/components/LegacySearchPage/LegacySearchBar.tsx","../../src/components/LegacySearchPage/Filters/FiltersButton.tsx","../../src/components/LegacySearchPage/Filters/Filters.tsx","../../src/components/LegacySearchPage/LegacySearchResult.tsx","../../src/components/LegacySearchPage/LegacySearchPage.tsx","../../src/components/SearchPage/SearchPage.tsx","../../src/components/SearchType/SearchType.Accordion.tsx","../../src/components/SearchType/SearchType.Tabs.tsx","../../src/components/SearchType/SearchType.tsx","../../src/components/SidebarSearch/SidebarSearch.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createApiRef,\n DiscoveryApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common';\n\nimport qs from 'qs';\n\n/**\n * @deprecated import from `@backstage/plugin-search-react` instead\n */\nexport const searchApiRef = createApiRef<SearchApi>({\n id: 'plugin.search.queryservice',\n});\n\n/**\n * @deprecated import from `@backstage/plugin-search-react` instead\n */\nexport interface SearchApi {\n query(query: SearchQuery): Promise<SearchResultSet>;\n}\n\nexport class SearchClient implements SearchApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n }\n\n async query(query: SearchQuery): Promise<SearchResultSet> {\n const { token } = await this.identityApi.getCredentials();\n const queryString = qs.stringify(query);\n const url = `${await this.discoveryApi.getBaseUrl(\n 'search/query',\n )}?${queryString}`;\n const response = await fetch(url, {\n headers: token ? { Authorization: `Bearer ${token}` } : {},\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { makeStyles, IconButton, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n width: '250px',\n display: 'flex',\n },\n icon: {\n margin: theme.spacing(-1, 0, 0, 0),\n },\n}));\n\ntype FiltersButtonProps = {\n numberOfSelectedFilters: number;\n handleToggleFilters: () => void;\n};\n\nexport const FiltersButton = ({\n numberOfSelectedFilters,\n handleToggleFilters,\n}: FiltersButtonProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.filters}>\n <IconButton\n className={classes.icon}\n aria-label=\"settings\"\n onClick={handleToggleFilters}\n >\n <FilterListIcon />\n </IconButton>\n <Typography variant=\"h6\">\n Filters ({numberOfSelectedFilters ? numberOfSelectedFilters : 0})\n </Typography>\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n makeStyles,\n Typography,\n Divider,\n Card,\n CardHeader,\n Button,\n CardContent,\n Select,\n Checkbox,\n List,\n ListItem,\n ListItemText,\n MenuItem,\n} from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n background: 'transparent',\n boxShadow: '0px 0px 0px 0px',\n },\n checkbox: {\n padding: theme.spacing(0, 1, 0, 1),\n },\n dropdown: {\n width: '100%',\n },\n}));\n\nexport type FiltersState = {\n selected: string;\n checked: Array<string>;\n};\n\nexport type FilterOptions = {\n kind: Array<string>;\n lifecycle: Array<string>;\n};\n\ntype FiltersProps = {\n filters: FiltersState;\n filterOptions: FilterOptions;\n resetFilters: () => void;\n updateSelected: (filter: string) => void;\n updateChecked: (filter: string) => void;\n};\n\nexport const Filters = ({\n filters,\n filterOptions,\n resetFilters,\n updateSelected,\n updateChecked,\n}: FiltersProps) => {\n const classes = useStyles();\n\n return (\n <Card className={classes.filters}>\n <CardHeader\n title={<Typography variant=\"h6\">Filters</Typography>}\n action={\n <Button color=\"primary\" onClick={() => resetFilters()}>\n CLEAR ALL\n </Button>\n }\n />\n <Divider />\n {filterOptions.kind.length === 0 && filterOptions.lifecycle.length === 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">\n Filters cannot be applied to available results\n </Typography>\n </CardContent>\n )}\n {filterOptions.kind.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Kind</Typography>\n <Select\n id=\"outlined-select\"\n onChange={(e: React.ChangeEvent<any>) =>\n updateSelected(e?.target?.value)\n }\n variant=\"outlined\"\n className={classes.dropdown}\n value={filters.selected}\n >\n {filterOptions.kind.map(filter => (\n <MenuItem\n selected={filter === ''}\n dense\n key={filter}\n value={filter}\n >\n {filter}\n </MenuItem>\n ))}\n </Select>\n </CardContent>\n )}\n {filterOptions.lifecycle.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Lifecycle</Typography>\n <List disablePadding dense>\n {filterOptions.lifecycle.map(filter => (\n <ListItem\n key={filter}\n dense\n button\n onClick={() => updateChecked(filter)}\n >\n <Checkbox\n edge=\"start\"\n disableRipple\n className={classes.checkbox}\n color=\"primary\"\n checked={filters.checked.includes(filter)}\n tabIndex={-1}\n value={filter}\n name={filter}\n />\n <ListItemText id={filter} primary={filter} />\n </ListItem>\n ))}\n </List>\n </CardContent>\n )}\n </Card>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '@backstage/types';\nimport { useApi, AnalyticsContext } from '@backstage/core-plugin-api';\nimport { SearchResultSet } from '@backstage/plugin-search-common';\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport useAsync, { AsyncState } from 'react-use/lib/useAsync';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport { searchApiRef } from '../../apis';\n\ntype SearchContextValue = {\n result: AsyncState<SearchResultSet>;\n setTerm: React.Dispatch<React.SetStateAction<string>>;\n setTypes: React.Dispatch<React.SetStateAction<string[]>>;\n setFilters: React.Dispatch<React.SetStateAction<JsonObject>>;\n setPageCursor: React.Dispatch<React.SetStateAction<string | undefined>>;\n fetchNextPage?: React.DispatchWithoutAction;\n fetchPreviousPage?: React.DispatchWithoutAction;\n} & SearchContextState;\n\n/**\n * The initial state of `SearchContextProvider`.\n *\n * @public\n */\nexport type SearchContextState = {\n term: string;\n types: string[];\n filters: JsonObject;\n pageCursor?: string;\n};\n\n/**\n * @deprecated import from `@backstage/plugin-search-react` instead\n */\nexport const SearchContext = createContext<SearchContextValue | undefined>(\n undefined,\n);\n\nconst searchInitialState: SearchContextState = {\n term: '',\n pageCursor: undefined,\n filters: {},\n types: [],\n};\n\n/**\n * @deprecated import from `@backstage/plugin-search-react` instead\n */\nexport const SearchContextProvider = ({\n initialState = searchInitialState,\n children,\n}: PropsWithChildren<{ initialState?: SearchContextState }>) => {\n const searchApi = useApi(searchApiRef);\n const [pageCursor, setPageCursor] = useState<string | undefined>(\n initialState.pageCursor,\n );\n const [filters, setFilters] = useState<JsonObject>(initialState.filters);\n const [term, setTerm] = useState<string>(initialState.term);\n const [types, setTypes] = useState<string[]>(initialState.types);\n\n const prevTerm = usePrevious(term);\n\n const result = useAsync(\n () =>\n searchApi.query({\n term,\n filters,\n pageCursor,\n types,\n }),\n [term, filters, types, pageCursor],\n );\n\n const hasNextPage =\n !result.loading && !result.error && result.value?.nextPageCursor;\n const hasPreviousPage =\n !result.loading && !result.error && result.value?.previousPageCursor;\n const fetchNextPage = useCallback(() => {\n setPageCursor(result.value?.nextPageCursor);\n }, [result.value?.nextPageCursor]);\n const fetchPreviousPage = useCallback(() => {\n setPageCursor(result.value?.previousPageCursor);\n }, [result.value?.previousPageCursor]);\n\n useEffect(() => {\n // Any time a term is reset, we want to start from page 0.\n if (term && prevTerm && term !== prevTerm) {\n setPageCursor(undefined);\n }\n }, [term, prevTerm, initialState.pageCursor]);\n\n const value: SearchContextValue = {\n result,\n filters,\n setFilters,\n term,\n setTerm,\n types,\n setTypes,\n pageCursor,\n setPageCursor,\n fetchNextPage: hasNextPage ? fetchNextPage : undefined,\n fetchPreviousPage: hasPreviousPage ? fetchPreviousPage : undefined,\n };\n\n return (\n <AnalyticsContext attributes={{ searchTypes: types.sort().join(',') }}>\n <SearchContext.Provider value={value} children={children} />\n </AnalyticsContext>\n );\n};\n\n/**\n * @deprecated import from \"@backstage/plugin-search-react\" instead\n */\nexport const useSearch = () => {\n const context = useContext(SearchContext);\n if (context === undefined) {\n throw new Error('useSearch must be used within a SearchContextProvider');\n }\n return context;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport { useAnalytics } from '@backstage/core-plugin-api';\nimport { useSearch } from '../SearchContext';\n\n/**\n * Capture search event on term change.\n */\nexport const TrackSearch = ({ children }: { children: React.ReactChild }) => {\n const analytics = useAnalytics();\n const { term } = useSearch();\n\n useEffect(() => {\n if (term) {\n // Capture analytics search event with search term provided as value\n analytics.captureEvent('search', term);\n }\n }, [analytics, term]);\n\n return <>{children}</>;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, {\n ChangeEvent,\n KeyboardEvent,\n useState,\n useEffect,\n useCallback,\n useContext,\n} from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n InputBase,\n InputBaseProps,\n InputAdornment,\n IconButton,\n} from '@material-ui/core';\nimport SearchIcon from '@material-ui/icons/Search';\nimport ClearButton from '@material-ui/icons/Clear';\n\nimport {\n SearchContext,\n SearchContextProvider,\n useSearch,\n} from '../SearchContext';\nimport { TrackSearch } from '../SearchTracker';\n\n/**\n * Props for {@link SearchBarBase}.\n *\n * @public\n */\nexport type SearchBarBaseProps = Omit<InputBaseProps, 'onChange'> & {\n debounceTime?: number;\n clearButton?: boolean;\n onClear?: () => void;\n onSubmit?: () => void;\n onChange: (value: string) => void;\n};\n\nconst useSearchContextCheck = () => {\n const context = useContext(SearchContext);\n return context !== undefined;\n};\n\n/**\n * All search boxes exported by the search plugin are based on the <SearchBarBase />,\n * and this one is based on the <InputBase /> component from Material UI.\n * Recommended if you don't use Search Provider or Search Context.\n *\n * @public\n */\nexport const SearchBarBase = ({\n onChange,\n onKeyDown,\n onSubmit,\n debounceTime = 200,\n clearButton = true,\n fullWidth = true,\n value: defaultValue,\n inputProps: defaultInputProps = {},\n endAdornment: defaultEndAdornment,\n ...props\n}: SearchBarBaseProps) => {\n const configApi = useApi(configApiRef);\n const [value, setValue] = useState<string>(defaultValue as string);\n const hasSearchContext = useSearchContextCheck();\n\n useEffect(() => {\n setValue(prevValue =>\n prevValue !== defaultValue ? (defaultValue as string) : prevValue,\n );\n }, [defaultValue]);\n\n useDebounce(() => onChange(value), debounceTime, [value]);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n },\n [setValue],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDown) onKeyDown(e);\n if (onSubmit && e.key === 'Enter') {\n onSubmit();\n }\n },\n [onKeyDown, onSubmit],\n );\n\n const handleClear = useCallback(() => {\n onChange('');\n }, [onChange]);\n\n const placeholder = `Search in ${\n configApi.getOptionalString('app.title') || 'Backstage'\n }`;\n\n const startAdornment = (\n <InputAdornment position=\"start\">\n <IconButton aria-label=\"Query\" disabled>\n <SearchIcon />\n </IconButton>\n </InputAdornment>\n );\n\n const endAdornment = (\n <InputAdornment position=\"end\">\n <IconButton aria-label=\"Clear\" onClick={handleClear}>\n <ClearButton />\n </IconButton>\n </InputAdornment>\n );\n\n const searchBar = (\n <TrackSearch>\n <InputBase\n data-testid=\"search-bar-next\"\n value={value}\n placeholder={placeholder}\n startAdornment={startAdornment}\n endAdornment={clearButton ? endAdornment : defaultEndAdornment}\n inputProps={{ 'aria-label': 'Search', ...defaultInputProps }}\n fullWidth={fullWidth}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n {...props}\n />\n </TrackSearch>\n );\n\n return hasSearchContext ? (\n searchBar\n ) : (\n <SearchContextProvider>{searchBar}</SearchContextProvider>\n );\n};\n\n/**\n * Props for {@link SearchBar}.\n *\n * @public\n */\nexport type SearchBarProps = Partial<SearchBarBaseProps>;\n\n/**\n * Recommended search bar when you use the Search Provider or Search Context.\n *\n * @public\n */\nexport const SearchBar = ({ onChange, ...props }: SearchBarProps) => {\n const { term, setTerm } = useSearch();\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (onChange) {\n onChange(newValue);\n } else {\n setTerm(newValue);\n }\n },\n [onChange, setTerm],\n );\n\n return <SearchBarBase value={term} onChange={handleChange} {...props} />;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useRef } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { useSearch } from '../SearchContext';\n\n/**\n * Utility hook for either asynchronously loading filter values from a given\n * function or synchronously providing a given list of default values.\n */\nexport const useAsyncFilterValues = (\n fn: ((partial: string) => Promise<string[]>) | undefined,\n inputValue: string,\n defaultValues: string[] = [],\n debounce: number = 250,\n) => {\n const valuesMemo = useRef<Record<string, string[] | Promise<string[]>>>({});\n const definiteFn = fn || (() => Promise.resolve([]));\n\n const [state, callback] = useAsyncFn(definiteFn, [inputValue], {\n loading: true,\n });\n\n // Do not invoke the given function more than necessary.\n useDebounce(\n () => {\n // Performance optimization: only invoke the callback once per inputValue\n // for the lifetime of the hook/component.\n if (valuesMemo.current[inputValue] === undefined) {\n valuesMemo.current[inputValue] = callback(inputValue).then(values => {\n // Override the value for future immediate returns.\n valuesMemo.current[inputValue] = values;\n return values;\n });\n }\n },\n debounce,\n [callback, inputValue],\n );\n\n // Immediately return the default values if they are provided.\n if (defaultValues.length) {\n return {\n loading: false,\n value: defaultValues,\n };\n }\n\n // Immediately return a memoized value if it is set (and not a promise).\n const possibleValue = valuesMemo.current[inputValue];\n if (Array.isArray(possibleValue)) {\n return {\n loading: false,\n value: possibleValue,\n };\n }\n\n return state;\n};\n\n/**\n * Utility hook for applying a given default value to the search context.\n */\nexport const useDefaultFilterValue = (\n name: string,\n defaultValue?: string | string[] | null,\n) => {\n const { setFilters } = useSearch();\n\n useEffect(() => {\n if (defaultValue && [defaultValue].flat().length > 0) {\n setFilters(prevFilters => ({\n ...prevFilters,\n [name]: defaultValue,\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useState } from 'react';\nimport { Chip, TextField } from '@material-ui/core';\nimport {\n Autocomplete,\n AutocompleteGetTagProps,\n AutocompleteRenderInputParams,\n} from '@material-ui/lab';\nimport { useSearch } from '../SearchContext';\nimport { useAsyncFilterValues, useDefaultFilterValue } from './hooks';\nimport { SearchFilterComponentProps } from './SearchFilter';\n\n/**\n * @public\n */\nexport type SearchAutocompleteFilterProps = SearchFilterComponentProps & {\n filterSelectedOptions?: boolean;\n limitTags?: number;\n multiple?: boolean;\n};\n\nexport const AutocompleteFilter = (props: SearchAutocompleteFilterProps) => {\n const {\n className,\n defaultValue,\n name,\n values: givenValues,\n valuesDebounceMs,\n label,\n filterSelectedOptions,\n limitTags,\n multiple,\n } = props;\n const [inputValue, setInputValue] = useState<string>('');\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values, loading } = useAsyncFilterValues(\n asyncValues,\n inputValue,\n defaultValues,\n valuesDebounceMs,\n );\n const { filters, setFilters } = useSearch();\n const filterValue =\n (filters[name] as string | string[] | undefined) || (multiple ? [] : null);\n\n // Set new filter values on input change.\n const handleChange = (\n _: ChangeEvent<{}>,\n newValue: string | string[] | null,\n ) => {\n setFilters(prevState => {\n const { [name]: filter, ...others } = prevState;\n\n if (newValue) {\n return { ...others, [name]: newValue };\n }\n return { ...others };\n });\n };\n\n // Provide the input field.\n const renderInput = (params: AutocompleteRenderInputParams) => (\n <TextField\n {...params}\n name=\"search\"\n variant=\"outlined\"\n label={label}\n fullWidth\n />\n );\n\n // Render tags as primary-colored chips.\n const renderTags = (\n tagValue: string[],\n getTagProps: AutocompleteGetTagProps,\n ) =>\n tagValue.map((option: string, index: number) => (\n <Chip label={option} color=\"primary\" {...getTagProps({ index })} />\n ));\n\n return (\n <Autocomplete\n filterSelectedOptions={filterSelectedOptions}\n limitTags={limitTags}\n multiple={multiple}\n className={className}\n id={`${multiple ? 'multi-' : ''}select-filter-${name}--select`}\n options={values || []}\n loading={loading}\n value={filterValue}\n onChange={handleChange}\n onInputChange={(_, newValue) => setInputValue(newValue)}\n renderInput={renderInput}\n renderTags={renderTags}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactElement, ChangeEvent } from 'react';\nimport {\n makeStyles,\n FormControl,\n FormControlLabel,\n InputLabel,\n Checkbox,\n Select,\n MenuItem,\n FormLabel,\n} from '@material-ui/core';\n\nimport {\n AutocompleteFilter,\n SearchAutocompleteFilterProps,\n} from './SearchFilter.Autocomplete';\nimport { useSearch } from '../SearchContext';\nimport { useAsyncFilterValues, useDefaultFilterValue } from './hooks';\n\nconst useStyles = makeStyles({\n label: {\n textTransform: 'capitalize',\n },\n});\n\n/**\n * @public\n */\nexport type SearchFilterComponentProps = {\n className?: string;\n name: string;\n label?: string;\n /**\n * Either an array of values directly, or an async function to return a list\n * of values to be used in the filter. In the autocomplete filter, the last\n * input value is provided as an input to allow values to be filtered. This\n * function is debounced and values cached.\n */\n values?: string[] | ((partial: string) => Promise<string[]>);\n defaultValue?: string[] | string | null;\n /**\n * Debounce time in milliseconds, used when values is an async callback.\n * Defaults to 250ms.\n */\n valuesDebounceMs?: number;\n};\n\n/**\n * @public\n */\nexport type SearchFilterWrapperProps = SearchFilterComponentProps & {\n component: (props: SearchFilterComponentProps) => ReactElement;\n debug?: boolean;\n};\n\nconst CheckboxFilter = (props: SearchFilterComponentProps) => {\n const {\n className,\n defaultValue,\n label,\n name,\n values: givenValues = [],\n valuesDebounceMs,\n } = props;\n const classes = useStyles();\n const { filters, setFilters } = useSearch();\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values = [], loading } = useAsyncFilterValues(\n asyncValues,\n '',\n defaultValues,\n valuesDebounceMs,\n );\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const {\n target: { value, checked },\n } = e;\n\n setFilters(prevFilters => {\n const { [name]: filter, ...others } = prevFilters;\n const rest = ((filter as string[]) || []).filter(i => i !== value);\n const items = checked ? [...rest, value] : rest;\n return items.length ? { ...others, [name]: items } : others;\n });\n };\n\n return (\n <FormControl\n className={className}\n disabled={loading}\n fullWidth\n data-testid=\"search-checkboxfilter-next\"\n >\n {label ? <FormLabel className={classes.label}>{label}</FormLabel> : null}\n {values.map((value: string) => (\n <FormControlLabel\n key={value}\n control={\n <Checkbox\n color=\"primary\"\n tabIndex={-1}\n inputProps={{ 'aria-labelledby': value }}\n value={value}\n name={value}\n onChange={handleChange}\n checked={((filters[name] as string[]) ?? []).includes(value)}\n />\n }\n label={value}\n />\n ))}\n </FormControl>\n );\n};\n\nconst SelectFilter = (props: SearchFilterComponentProps) => {\n const {\n className,\n defaultValue,\n label,\n name,\n values: givenValues,\n valuesDebounceMs,\n } = props;\n const classes = useStyles();\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values = [], loading } = useAsyncFilterValues(\n asyncValues,\n '',\n defaultValues,\n valuesDebounceMs,\n );\n const { filters, setFilters } = useSearch();\n\n const handleChange = (e: ChangeEvent<{ value: unknown }>) => {\n const {\n target: { value },\n } = e;\n\n setFilters(prevFilters => {\n const { [name]: filter, ...others } = prevFilters;\n return value ? { ...others, [name]: value as string } : others;\n });\n };\n\n return (\n <FormControl\n disabled={loading}\n className={className}\n variant=\"filled\"\n fullWidth\n data-testid=\"search-selectfilter-next\"\n >\n {label ? (\n <InputLabel className={classes.label} margin=\"dense\">\n {label}\n </InputLabel>\n ) : null}\n <Select\n variant=\"outlined\"\n value={filters[name] || ''}\n onChange={handleChange}\n >\n <MenuItem value=\"\">\n <em>All</em>\n </MenuItem>\n {values.map((value: string) => (\n <MenuItem key={value} value={value}>\n {value}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n\nconst SearchFilter = ({\n component: Element,\n ...props\n}: SearchFilterWrapperProps) => <Element {...props} />;\n\nSearchFilter.Checkbox = (\n props: Omit<SearchFilterWrapperProps, 'component'> &\n SearchFilterComponentProps,\n) => <SearchFilter {...props} component={CheckboxFilter} />;\n\nSearchFilter.Select = (\n props: Omit<SearchFilterWrapperProps, 'component'> &\n SearchFilterComponentProps,\n) => <SearchFilter {...props} component={SelectFilter} />;\n\n/**\n * A control surface for a given filter field name, rendered as an autocomplete\n * textfield. A hard-coded list of values may be provided, or an async function\n * which returns values may be provided instead.\n * @public\n */\nSearchFilter.Autocomplete = (props: SearchAutocompleteFilterProps) => (\n <SearchFilter {...props} component={AutocompleteFilter} />\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchFilter /> component instead. This component will be removed in an\n * upcoming release.\n */\nconst SearchFilterNext = SearchFilter;\n\nexport { SearchFilter, SearchFilterNext };\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactNode } from 'react';\nimport { SearchDocument } from '@backstage/plugin-search-common';\nimport {\n ListItem,\n ListItemIcon,\n ListItemText,\n Box,\n Divider,\n} from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport TextTruncate from 'react-text-truncate';\n\ntype Props = {\n icon?: ReactNode;\n secondaryAction?: ReactNode;\n result: SearchDocument;\n lineClamp?: number;\n};\n\nexport const DefaultResultListItem = ({\n result,\n icon,\n secondaryAction,\n lineClamp = 5,\n}: Props) => {\n return (\n <Link to={result.location}>\n <ListItem alignItems=\"center\">\n {icon && <ListItemIcon>{icon}</ListItemIcon>}\n <ListItemText\n primaryTypographyProps={{ variant: 'h6' }}\n primary={result.title}\n secondary={\n <TextTruncate\n line={lineClamp}\n truncateText=\"…\"\n text={result.text}\n element=\"span\"\n />\n }\n />\n {secondaryAction && <Box alignItems=\"flex-end\">{secondaryAction}</Box>}\n </ListItem>\n <Divider />\n </Link>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n EmptyState,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { SearchResult } from '@backstage/plugin-search-common';\nimport React from 'react';\nimport { useSearch } from '../SearchContext';\n\ntype Props = {\n children: (results: { results: SearchResult[] }) => JSX.Element;\n};\n\nexport const SearchResultComponent = ({ children }: Props) => {\n const {\n result: { loading, error, value },\n } = useSearch();\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return (\n <ResponseErrorPanel\n title=\"Error encountered while fetching search results\"\n error={error}\n />\n );\n }\n\n if (!value?.results.length) {\n return <EmptyState missing=\"data\" title=\"Sorry, no results were found\" />;\n }\n\n return <>{children({ results: value.results })}</>;\n};\n\nexport { SearchResultComponent as SearchResult };\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, makeStyles } from '@material-ui/core';\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport React from 'react';\nimport { useSearch } from '../SearchContext';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n margin: theme.spacing(2, 0),\n },\n}));\n\nexport const SearchResultPager = () => {\n const { fetchNextPage, fetchPreviousPage } = useSearch();\n const classes = useStyles();\n\n if (!fetchNextPage && !fetchPreviousPage) {\n return <></>;\n }\n\n return (\n <nav arial-label=\"pagination navigation\" className={classes.root}>\n <Button\n aria-label=\"previous page\"\n disabled={!fetchPreviousPage}\n onClick={fetchPreviousPage}\n startIcon={<ArrowBackIosIcon />}\n >\n Previous\n </Button>\n\n <Button\n aria-label=\"next page\"\n disabled={!fetchNextPage}\n onClick={fetchNextPage}\n endIcon={<ArrowForwardIosIcon />}\n >\n Next\n </Button>\n </nav>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SearchClient, searchApiRef } from './apis';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n createRoutableExtension,\n discoveryApiRef,\n createComponentExtension,\n identityApiRef,\n} from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'search',\n});\n\nexport const rootNextRouteRef = createRouteRef({\n id: 'search:next',\n});\n\nexport const searchPlugin = createPlugin({\n id: 'search',\n apis: [\n createApiFactory({\n api: searchApiRef,\n deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef },\n factory: ({ discoveryApi, identityApi }) => {\n return new SearchClient({ discoveryApi, identityApi });\n },\n }),\n ],\n routes: {\n root: rootRouteRef,\n nextRoot: rootNextRouteRef,\n },\n});\n\nexport const SearchPage = searchPlugin.provide(\n createRoutableExtension({\n name: 'SearchPage',\n component: () => import('./components/SearchPage').then(m => m.SearchPage),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchPage /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchPageNext = searchPlugin.provide(\n createRoutableExtension({\n name: 'SearchPageNext',\n component: () => import('./components/SearchPage').then(m => m.SearchPage),\n mountPoint: rootNextRouteRef,\n }),\n);\n\nexport const SearchBar = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchBar',\n component: {\n lazy: () => import('./components/SearchBar').then(m => m.SearchBar),\n },\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchBar /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchBarNext = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchBarNext',\n component: {\n lazy: () => import('./components/SearchBar').then(m => m.SearchBar),\n },\n }),\n);\n\nexport const SearchResult = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchResult',\n component: {\n lazy: () => import('./components/SearchResult').then(m => m.SearchResult),\n },\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchResult /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchResultNext = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchResultNext',\n component: {\n lazy: () => import('./components/SearchResult').then(m => m.SearchResult),\n },\n }),\n);\n\nexport const SidebarSearchModal = searchPlugin.provide(\n createComponentExtension({\n name: 'SidebarSearchModal',\n component: {\n lazy: () =>\n import('./components/SidebarSearchModal').then(\n m => m.SidebarSearchModal,\n ),\n },\n }),\n);\n\nexport const DefaultResultListItem = searchPlugin.provide(\n createComponentExtension({\n name: 'DefaultResultListItem',\n component: {\n lazy: () =>\n import('./components/DefaultResultListItem').then(\n m => m.DefaultResultListItem,\n ),\n },\n }),\n);\n\nexport const HomePageSearchBar = searchPlugin.provide(\n createComponentExtension({\n name: 'HomePageSearchBar',\n component: {\n lazy: () =>\n import('./components/HomePageComponent').then(m => m.HomePageSearchBar),\n },\n }),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n Grid,\n List,\n Paper,\n useTheme,\n} from '@material-ui/core';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { SearchBar } from '../SearchBar';\nimport { DefaultResultListItem } from '../DefaultResultListItem';\nimport { SearchResult } from '../SearchResult';\nimport { SearchContextProvider, useSearch } from '../SearchContext';\nimport { SearchResultPager } from '../SearchResultPager';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { Link, useContent } from '@backstage/core-components';\nimport { rootRouteRef } from '../../plugin';\n\n/**\n * @public\n **/\nexport interface SearchModalChildrenProps {\n /**\n * A function that should be invoked when navigating away from the modal.\n */\n toggleModal: () => void;\n}\n\nexport interface SearchModalProps {\n /**\n * If true, it renders the modal.\n */\n open?: boolean;\n /**\n * This is supposed to be used together with the open prop.\n * If `hidden` is true, it hides the modal.\n * If `open` is false, the value of `hidden` has no effect on the modal.\n * Use `open` for controlling whether the modal should be rendered or not.\n */\n hidden?: boolean;\n /**\n * a function invoked when a search item is pressed or when the dialog\n * should be closed.\n */\n toggleModal: () => void;\n /**\n * A function that returns custom content to render in the search modal in\n * place of the default.\n */\n children?: (props: SearchModalChildrenProps) => JSX.Element;\n}\n\nconst useStyles = makeStyles(theme => ({\n container: {\n borderRadius: 30,\n display: 'flex',\n height: '2.4em',\n },\n input: {\n flex: 1,\n },\n // Reduces default height of the modal, keeping a gap of 128px between the top and bottom of the page.\n paperFullWidth: { height: 'calc(100% - 128px)' },\n dialogActionsContainer: { padding: theme.spacing(1, 3) },\n viewResultsLink: { verticalAlign: '0.5em' },\n}));\n\nexport const Modal = ({ toggleModal }: SearchModalProps) => {\n const getSearchLink = useRouteRef(rootRouteRef);\n const classes = useStyles();\n\n const { term } = useSearch();\n const { focusContent } = useContent();\n const { transitions } = useTheme();\n\n const handleResultClick = () => {\n toggleModal();\n setTimeout(focusContent, transitions.duration.leavingScreen);\n };\n\n const handleKeyPress = () => {\n handleResultClick();\n };\n\n return (\n <>\n <DialogTitle>\n <Paper className={classes.container}>\n <SearchBar className={classes.input} />\n </Paper>\n </DialogTitle>\n <DialogContent>\n <Grid\n container\n direction=\"row-reverse\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid item>\n <Link\n onClick={() => {\n toggleModal();\n setTimeout(focusContent, transitions.duration.leavingScreen);\n }}\n to={`${getSearchLink()}?query=${term}`}\n >\n <span className={classes.viewResultsLink}>View Full Results</span>\n <LaunchIcon color=\"primary\" />\n </Link>\n </Grid>\n </Grid>\n <Divider />\n <SearchResult>\n {({ results }) => (\n <List>\n {results.map(({ document }) => (\n <div\n role=\"button\"\n tabIndex={0}\n key={`${document.location}-btn`}\n onClick={handleResultClick}\n onKeyPress={handleKeyPress}\n >\n <DefaultResultListItem\n key={document.location}\n result={document}\n />\n </div>\n ))}\n </List>\n )}\n </SearchResult>\n </DialogContent>\n <DialogActions className={classes.dialogActionsContainer}>\n <Grid container direction=\"row\">\n <Grid item xs={12}>\n <SearchResultPager />\n </Grid>\n </Grid>\n </DialogActions>\n </>\n );\n};\n\nexport const SearchModal = ({\n open = true,\n hidden,\n toggleModal,\n children,\n}: SearchModalProps) => {\n const classes = useStyles();\n\n return (\n <Dialog\n classes={{\n paperFullWidth: classes.paperFullWidth,\n }}\n onClose={toggleModal}\n aria-labelledby=\"search-modal-title\"\n fullWidth\n maxWidth=\"lg\"\n open={open}\n hidden={hidden}\n >\n {open && (\n <SearchContextProvider>\n {(children && children({ toggleModal })) ?? (\n <Modal toggleModal={toggleModal} />\n )}\n </SearchContextProvider>\n )}\n </Dialog>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useState } from 'react';\n\n/**\n * Use this hook to manage the state of {@link SearchModal}\n * and change its visibility.\n *\n * @public\n *\n * @param initialState - pass `true` to make the modal initially visible\n * @returns an object containing the state of the modal together with\n * functions for changing the visibility of the modal.\n */\nexport function useSearchModal(initialState = false) {\n const [state, setState] = useState({\n hidden: !initialState,\n open: initialState,\n });\n\n const toggleModal = useCallback(\n () =>\n setState(prevState => ({\n open: true,\n hidden: !prevState.hidden,\n })),\n [],\n );\n\n const setOpen = useCallback(\n (open: boolean) =>\n setState(prevState => ({\n open: prevState.open || open,\n hidden: !open,\n })),\n [],\n );\n\n return { state, toggleModal, setOpen };\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Paper } from '@material-ui/core';\nimport InputBase from '@material-ui/core/InputBase';\nimport IconButton from '@material-ui/core/IconButton';\nimport SearchIcon from '@material-ui/icons/Search';\nimport ClearButton from '@material-ui/icons/Clear';\n\nconst useStyles = makeStyles(() => ({\n root: {\n display: 'flex',\n alignItems: 'center',\n },\n input: {\n flex: 1,\n },\n}));\n\ntype SearchBarProps = {\n searchQuery: string;\n handleSearch: any;\n handleClearSearchBar: any;\n};\n\nexport const SearchBar = ({\n searchQuery,\n handleSearch,\n handleClearSearchBar,\n}: SearchBarProps) => {\n const classes = useStyles();\n\n return (\n <Paper\n component=\"form\"\n onSubmit={e => handleSearch(e)}\n className={classes.root}\n >\n <IconButton disabled type=\"submit\" aria-label=\"search\">\n <SearchIcon />\n </IconButton>\n <InputBase\n className={classes.input}\n placeholder=\"Search in Backstage\"\n value={searchQuery}\n onChange={e => handleSearch(e)}\n inputProps={{ 'aria-label': 'search backstage' }}\n />\n <IconButton aria-label=\"search\" onClick={() => handleClearSearchBar()}>\n <ClearButton />\n </IconButton>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { makeStyles, IconButton, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n width: '250px',\n display: 'flex',\n },\n icon: {\n margin: theme.spacing(-1, 0, 0, 0),\n },\n}));\n\ntype FiltersButtonProps = {\n numberOfSelectedFilters: number;\n handleToggleFilters: () => void;\n};\n\nexport const FiltersButton = ({\n numberOfSelectedFilters,\n handleToggleFilters,\n}: FiltersButtonProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.filters}>\n <IconButton\n className={classes.icon}\n aria-label=\"settings\"\n onClick={handleToggleFilters}\n >\n <FilterListIcon />\n </IconButton>\n <Typography variant=\"h6\">\n Filters ({numberOfSelectedFilters ? numberOfSelectedFilters : 0})\n </Typography>\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n makeStyles,\n Typography,\n Divider,\n Card,\n CardHeader,\n Button,\n CardContent,\n Select,\n Checkbox,\n List,\n ListItem,\n ListItemText,\n MenuItem,\n} from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n background: 'transparent',\n boxShadow: '0px 0px 0px 0px',\n },\n checkbox: {\n padding: theme.spacing(0, 1, 0, 1),\n },\n dropdown: {\n width: '100%',\n },\n}));\n\nexport type FiltersState = {\n selected: string;\n checked: Array<string>;\n};\n\nexport type FilterOptions = {\n kind: Array<string>;\n lifecycle: Array<string>;\n};\n\ntype FiltersProps = {\n filters: FiltersState;\n filterOptions: FilterOptions;\n resetFilters: () => void;\n updateSelected: (filter: string) => void;\n updateChecked: (filter: string) => void;\n};\n\nexport const Filters = ({\n filters,\n filterOptions,\n resetFilters,\n updateSelected,\n updateChecked,\n}: FiltersProps) => {\n const classes = useStyles();\n\n return (\n <Card className={classes.filters}>\n <CardHeader\n title={<Typography variant=\"h6\">Filters</Typography>}\n action={\n <Button color=\"primary\" onClick={() => resetFilters()}>\n CLEAR ALL\n </Button>\n }\n />\n <Divider />\n {filterOptions.kind.length === 0 && filterOptions.lifecycle.length === 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">\n Filters cannot be applied to available results\n </Typography>\n </CardContent>\n )}\n {filterOptions.kind.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Kind</Typography>\n <Select\n id=\"outlined-select\"\n onChange={(e: React.ChangeEvent<any>) =>\n updateSelected(e?.target?.value)\n }\n variant=\"outlined\"\n className={classes.dropdown}\n value={filters.selected}\n >\n {filterOptions.kind.map(filter => (\n <MenuItem\n selected={filter === ''}\n dense\n key={filter}\n value={filter}\n >\n {filter}\n </MenuItem>\n ))}\n </Select>\n </CardContent>\n )}\n {filterOptions.lifecycle.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Lifecycle</Typography>\n <List disablePadding dense>\n {filterOptions.lifecycle.map(filter => (\n <ListItem\n key={filter}\n dense\n button\n onClick={() => updateChecked(filter)}\n >\n <Checkbox\n edge=\"start\"\n disableRipple\n className={classes.checkbox}\n color=\"primary\"\n checked={filters.checked.includes(filter)}\n tabIndex={-1}\n value={filter}\n name={filter}\n />\n <ListItemText id={filter} primary={filter} />\n </ListItem>\n ))}\n </List>\n </CardContent>\n )}\n </Card>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Divider, Grid, makeStyles, Typography } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useEffect, useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport { Filters, FiltersButton, FiltersState } from './Filters';\nimport { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model';\n\nimport {\n EmptyState,\n Link,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\ntype Result = {\n name: string;\n description: string | undefined;\n owner: string | undefined;\n kind: string;\n lifecycle: string | undefined;\n url: string;\n};\ntype SearchResults = Array<Result>;\n\nconst useStyles = makeStyles(theme => ({\n searchQuery: {\n color: theme.palette.text.primary,\n background: theme.palette.background.default,\n borderRadius: '10%',\n },\n tableHeader: {\n margin: theme.spacing(1, 0, 0, 0),\n display: 'flex',\n },\n divider: {\n width: '1px',\n margin: theme.spacing(0, 2),\n padding: theme.spacing(2, 0),\n },\n}));\n\ntype SearchResultProps = {\n searchQuery?: string;\n};\n\ntype TableHeaderProps = {\n searchQuery?: string;\n numberOfSelectedFilters: number;\n numberOfResults: number;\n handleToggleFilters: () => void;\n};\n\n// TODO: move out column to make the search result component more generic\nconst columns: TableColumn[] = [\n {\n title: 'Name',\n field: 'name',\n highlight: true,\n render: (result: Partial<Result>) => (\n <Link to={result.url || ''}>{result.name}</Link>\n ),\n },\n {\n title: 'Description',\n field: 'description',\n },\n {\n title: 'Owner',\n field: 'owner',\n },\n {\n title: 'Kind',\n field: 'kind',\n },\n {\n title: 'LifeCycle',\n field: 'lifecycle',\n },\n];\n\nconst TableHeader = ({\n searchQuery,\n numberOfSelectedFilters,\n numberOfResults,\n handleToggleFilters,\n}: TableHeaderProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.tableHeader}>\n <FiltersButton\n numberOfSelectedFilters={numberOfSelectedFilters}\n handleToggleFilters={handleToggleFilters}\n />\n <Divider className={classes.divider} orientation=\"vertical\" />\n <Grid item xs={12}>\n {searchQuery ? (\n <Typography variant=\"h6\">\n {`${numberOfResults} `}\n {numberOfResults > 1 ? `results for ` : `result for `}\n <span className={classes.searchQuery}>\"{searchQuery}\"</span>{' '}\n </Typography>\n ) : (\n <Typography variant=\"h6\">{`${numberOfResults} results`}</Typography>\n )}\n </Grid>\n </div>\n );\n};\n\nexport const SearchResult = ({ searchQuery }: SearchResultProps) => {\n const catalogApi = useApi(catalogApiRef);\n\n const [showFilters, toggleFilters] = useState(false);\n const [selectedFilters, setSelectedFilters] = useState<FiltersState>({\n selected: '',\n checked: [],\n });\n\n const [filteredResults, setFilteredResults] = useState<SearchResults>([]);\n\n const {\n loading,\n error,\n value: results,\n } = useAsync(async () => {\n const entities = await catalogApi.getEntities();\n return entities.items.map((entity: Entity) => ({\n name: entity.metadata.name,\n description: entity.metadata.description,\n owner:\n typeof entity.spec?.owner === 'string' ? entity.spec?.owner : undefined,\n kind: entity.kind,\n lifecycle:\n typeof entity.spec?.lifecycle === 'string'\n ? entity.spec?.lifecycle\n : undefined,\n url: `/catalog/${\n entity.metadata.namespace?.toLocaleLowerCase('en-US') ||\n DEFAULT_NAMESPACE\n }/${entity.kind.toLocaleLowerCase('en-US')}/${entity.metadata.name}`,\n }));\n }, []);\n\n useEffect(() => {\n if (results) {\n let withFilters = results;\n\n // apply filters\n\n // filter on selected\n if (selectedFilters.selected !== '') {\n withFilters = results.filter((result: Result) =>\n selectedFilters.selected.includes(result.kind),\n );\n }\n\n // filter on checked\n if (selectedFilters.checked.length > 0) {\n withFilters = withFilters.filter(\n (result: Result) =>\n result.lifecycle &&\n selectedFilters.checked.includes(result.lifecycle),\n );\n }\n\n // filter on searchQuery\n if (searchQuery) {\n withFilters = withFilters.filter(\n (result: Result) =>\n result.name?.toLocaleLowerCase('en-US').includes(searchQuery) ||\n result.name\n ?.toLocaleLowerCase('en-US')\n .includes(searchQuery.split(' ').join('-')) ||\n result.description\n ?.toLocaleLowerCase('en-US')\n .includes(searchQuery),\n );\n }\n\n setFilteredResults(withFilters);\n }\n }, [selectedFilters, searchQuery, results]);\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return (\n <Alert severity=\"error\">\n Error encountered while fetching search results. {error.toString()}\n </Alert>\n );\n }\n if (!results || results.length === 0) {\n return <EmptyState missing=\"data\" title=\"Sorry, no results were found\" />;\n }\n\n const resetFilters = () => {\n setSelectedFilters({\n selected: '',\n checked: [],\n });\n };\n\n const updateSelected = (filter: string) => {\n setSelectedFilters(prevState => ({\n ...prevState,\n selected: filter,\n }));\n };\n\n const updateChecked = (filter: string) => {\n if (selectedFilters.checked.includes(filter)) {\n setSelectedFilters(prevState => ({\n ...prevState,\n checked: prevState.checked.filter(item => item !== filter),\n }));\n return;\n }\n\n setSelectedFilters(prevState => ({\n ...prevState,\n checked: [...prevState.checked, filter],\n }));\n };\n\n const filterOptions = results.reduce(\n (acc, curr) => {\n if (curr.kind && acc.kind.indexOf(curr.kind) < 0) {\n acc.kind.push(curr.kind);\n }\n if (curr.lifecycle && acc.lifecycle.indexOf(curr.lifecycle) < 0) {\n acc.lifecycle.push(curr.lifecycle);\n }\n return acc;\n },\n {\n kind: [] as Array<string>,\n lifecycle: [] as Array<string>,\n },\n );\n\n return (\n <>\n <Grid container>\n {showFilters && (\n <Grid item xs={3}>\n <Filters\n filters={selectedFilters}\n filterOptions={filterOptions}\n resetFilters={resetFilters}\n updateSelected={updateSelected}\n updateChecked={updateChecked}\n />\n </Grid>\n )}\n <Grid item xs={showFilters ? 9 : 12}>\n <Table\n options={{ paging: true, pageSize: 20, search: false }}\n data={filteredResults}\n columns={columns}\n title={\n <TableHeader\n searchQuery={searchQuery}\n numberOfResults={filteredResults.length}\n numberOfSelectedFilters={\n (selectedFilters.selected !== '' ? 1 : 0) +\n selectedFilters.checked.length\n }\n handleToggleFilters={() => toggleFilters(!showFilters)}\n />\n }\n />\n </Grid>\n </Grid>\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Grid } from '@material-ui/core';\nimport React, { useEffect, useState } from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { SearchBar } from './LegacySearchBar';\nimport { SearchResult } from './LegacySearchResult';\nimport {\n Content,\n Header,\n Page,\n useQueryParamState,\n} from '@backstage/core-components';\n\n/**\n * @deprecated This SearchPage, powered directly by the Catalog API, will be\n * removed from a future release of this plugin.\n */\nexport const LegacySearchPage = () => {\n const [queryString, setQueryString] = useQueryParamState<string>('query');\n const [searchQuery, setSearchQuery] = useState(queryString ?? '');\n\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n setSearchQuery(event.target.value);\n };\n\n useEffect(() => setSearchQuery(queryString ?? ''), [queryString]);\n\n useDebounce(\n () => {\n setQueryString(searchQuery);\n },\n 200,\n [searchQuery],\n );\n\n const handleClearSearchBar = () => {\n setSearchQuery('');\n };\n\n return (\n <Page themeId=\"home\">\n <Header title=\"Search\" />\n <Content>\n <Grid container direction=\"row\">\n <Grid item xs={12}>\n <SearchBar\n handleSearch={handleSearch}\n handleClearSearchBar={handleClearSearchBar}\n searchQuery={searchQuery}\n />\n </Grid>\n <Grid item xs={12}>\n <SearchResult\n searchQuery={(queryString ?? '').toLocaleLowerCase('en-US')}\n />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport qs from 'qs';\nimport { useLocation, useOutlet } from 'react-router';\nimport { SearchContextProvider, useSearch } from '../SearchContext';\nimport { JsonObject } from '@backstage/types';\nimport { LegacySearchPage } from '../LegacySearchPage';\n\nexport const UrlUpdater = () => {\n const location = useLocation();\n const {\n term,\n setTerm,\n types,\n setTypes,\n pageCursor,\n setPageCursor,\n filters,\n setFilters,\n } = useSearch();\n\n const prevQueryParams = usePrevious(location.search);\n useEffect(() => {\n // Only respond to changes to url query params\n if (location.search === prevQueryParams) {\n return;\n }\n\n const query =\n qs.parse(location.search.substring(1), { arrayLimit: 0 }) || {};\n\n if (query.filters) {\n setFilters(query.filters as JsonObject);\n }\n\n if (query.query) {\n setTerm(query.query as string);\n }\n\n if (query.pageCursor) {\n setPageCursor(query.pageCursor as string);\n }\n\n if (query.types) {\n setTypes(query.types as string[]);\n }\n }, [prevQueryParams, location, setTerm, setTypes, setPageCursor, setFilters]);\n\n useEffect(() => {\n const newParams = qs.stringify(\n {\n query: term,\n types,\n pageCursor,\n filters,\n },\n { arrayFormat: 'brackets' },\n );\n const newUrl = `${window.location.pathname}?${newParams}`;\n\n // We directly manipulate window history here in order to not re-render\n // infinitely (state => location => state => etc). The intention of this\n // code is just to ensure the right query/filters are loaded when a user\n // clicks the \"back\" button after clicking a result.\n window.history.replaceState(null, document.title, newUrl);\n }, [term, types, pageCursor, filters]);\n\n return null;\n};\n\nexport const SearchPage = () => {\n const outlet = useOutlet();\n\n return (\n <SearchContextProvider>\n <UrlUpdater />\n {outlet || <LegacySearchPage />}\n </SearchContextProvider>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { cloneElement, Fragment, useEffect, useState } from 'react';\nimport { useSearch } from '../SearchContext';\nimport {\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Card,\n CardContent,\n CardHeader,\n Divider,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport AllIcon from '@material-ui/icons/FontDownload';\n\nconst useStyles = makeStyles(theme => ({\n card: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n },\n cardContent: {\n paddingTop: theme.spacing(1),\n },\n icon: {\n color: theme.palette.common.black,\n },\n list: {\n width: '100%',\n },\n listItemIcon: {\n width: '24px',\n height: '24px',\n },\n accordion: {\n backgroundColor: theme.palette.background.paper,\n },\n accordionSummary: {\n minHeight: 'auto',\n '&.Mui-expanded': {\n minHeight: 'auto',\n },\n },\n accordionSummaryContent: {\n margin: theme.spacing(2, 0),\n '&.Mui-expanded': {\n margin: theme.spacing(2, 0),\n },\n },\n accordionDetails: {\n padding: theme.spacing(0, 0, 1),\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeAccordionProps = {\n name: string;\n types: Array<{\n value: string;\n name: string;\n icon: JSX.Element;\n }>;\n defaultValue?: string;\n};\n\nexport const SearchTypeAccordion = (props: SearchTypeAccordionProps) => {\n const classes = useStyles();\n const { setPageCursor, setTypes, types } = useSearch();\n const [expanded, setExpanded] = useState(true);\n const { defaultValue, name, types: givenTypes } = props;\n\n const toggleExpanded = () => setExpanded(prevState => !prevState);\n const handleClick = (type: string) => {\n return () => {\n setTypes(type !== '' ? [type] : []);\n setPageCursor(undefined);\n setExpanded(false);\n };\n };\n\n // Handle any provided defaultValue\n useEffect(() => {\n if (defaultValue) {\n setTypes([defaultValue]);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const definedTypes = [\n {\n value: '',\n name: 'All',\n icon: <AllIcon />,\n },\n ...givenTypes,\n ];\n const selected = types[0] || '';\n\n return (\n <Card className={classes.card}>\n <CardHeader title={name} titleTypographyProps={{ variant: 'overline' }} />\n <CardContent className={classes.cardContent}>\n <Accordion\n className={classes.accordion}\n expanded={expanded}\n onChange={toggleExpanded}\n >\n <AccordionSummary\n classes={{\n root: classes.accordionSummary,\n content: classes.accordionSummaryContent,\n }}\n expandIcon={<ExpandMoreIcon className={classes.icon} />}\n IconButtonProps={{ size: 'small' }}\n >\n {expanded\n ? 'Collapse'\n : definedTypes.filter(t => t.value === selected)[0]!.name}\n </AccordionSummary>\n <AccordionDetails classes={{ root: classes.accordionDetails }}>\n <List\n className={classes.list}\n component=\"nav\"\n aria-label=\"filter by type\"\n disablePadding\n dense\n >\n {definedTypes.map(type => (\n <Fragment key={type.value}>\n <Divider />\n <ListItem\n selected={\n types[0] === type.value ||\n (types.length === 0 && type.value === '')\n }\n onClick={handleClick(type.value)}\n button\n >\n <ListItemIcon>\n {cloneElement(type.icon, {\n className: classes.listItemIcon,\n })}\n </ListItemIcon>\n <ListItemText primary={type.name} />\n </ListItem>\n </Fragment>\n ))}\n </List>\n </AccordionDetails>\n </Accordion>\n </CardContent>\n </Card>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport { useSearch } from '../SearchContext';\nimport { BackstageTheme } from '@backstage/theme';\nimport { makeStyles, Tab, Tabs } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme: BackstageTheme) => ({\n tabs: {\n borderBottom: `1px solid ${theme.palette.textVerySubtle}`,\n padding: theme.spacing(0, 4),\n },\n tab: {\n height: '50px',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.pxToRem(13),\n color: theme.palette.textSubtle,\n minWidth: '130px',\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeTabsProps = {\n types: Array<{\n value: string;\n name: string;\n }>;\n defaultValue?: string;\n};\n\nexport const SearchTypeTabs = (props: SearchTypeTabsProps) => {\n const classes = useStyles();\n const { setPageCursor, setTypes, types } = useSearch();\n const { defaultValue, types: givenTypes } = props;\n\n const changeTab = (_: React.ChangeEvent<{}>, newType: string) => {\n setTypes(newType !== '' ? [newType] : []);\n setPageCursor(undefined);\n };\n\n // Handle any provided defaultValue\n useEffect(() => {\n if (defaultValue) {\n setTypes([defaultValue]);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const definedTypes = [\n {\n value: '',\n name: 'All',\n },\n ...givenTypes,\n ];\n\n return (\n <Tabs\n className={classes.tabs}\n indicatorColor=\"primary\"\n value={types.length === 0 ? '' : types[0]}\n onChange={changeTab}\n >\n {definedTypes.map((type, idx) => (\n <Tab\n key={idx}\n className={classes.tab}\n disableRipple\n label={type.name}\n value={type.value}\n />\n ))}\n </Tabs>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Checkbox,\n Chip,\n FormControl,\n InputLabel,\n ListItemText,\n makeStyles,\n MenuItem,\n Select,\n} from '@material-ui/core';\nimport React, { ChangeEvent } from 'react';\nimport useEffectOnce from 'react-use/lib/useEffectOnce';\nimport {\n SearchTypeAccordion,\n SearchTypeAccordionProps,\n} from './SearchType.Accordion';\nimport { SearchTypeTabs, SearchTypeTabsProps } from './SearchType.Tabs';\nimport { useSearch } from '../SearchContext';\n\nconst useStyles = makeStyles(theme => ({\n label: {\n textTransform: 'capitalize',\n },\n chips: {\n display: 'flex',\n flexWrap: 'wrap',\n marginTop: theme.spacing(1),\n },\n chip: {\n margin: 2,\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeProps = {\n className?: string;\n name: string;\n values?: string[];\n defaultValue?: string[] | string | null;\n};\n\nconst SearchType = (props: SearchTypeProps) => {\n const { className, defaultValue, name, values = [] } = props;\n const classes = useStyles();\n const { types, setTypes } = useSearch();\n\n useEffectOnce(() => {\n if (!types.length) {\n if (defaultValue && Array.isArray(defaultValue)) {\n setTypes(defaultValue);\n } else if (defaultValue) {\n setTypes([defaultValue]);\n }\n }\n });\n\n const handleChange = (e: ChangeEvent<{ value: unknown }>) => {\n const value = e.target.value as string[];\n setTypes(value as string[]);\n };\n\n return (\n <FormControl\n className={className}\n variant=\"filled\"\n fullWidth\n data-testid=\"search-typefilter-next\"\n >\n <InputLabel className={classes.label} margin=\"dense\">\n {name}\n </InputLabel>\n <Select\n multiple\n variant=\"outlined\"\n value={types}\n onChange={handleChange}\n placeholder=\"All Results\"\n renderValue={selected => (\n <div className={classes.chips}>\n {(selected as string[]).map(value => (\n <Chip\n key={value}\n label={value}\n className={classes.chip}\n size=\"small\"\n />\n ))}\n </div>\n )}\n >\n {values.map((value: string) => (\n <MenuItem key={value} value={value}>\n <Checkbox checked={types.indexOf(value) > -1} />\n <ListItemText primary={value} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n\n/**\n * A control surface for the search query's \"types\" property, displayed as a\n * single-select collapsible accordion suitable for use in faceted search UIs.\n * @public\n */\nSearchType.Accordion = (props: SearchTypeAccordionProps) => {\n return <SearchTypeAccordion {...props} />;\n};\n\n/**\n * A control surface for the search query's \"types\" property, displayed as a\n * tabs suitable for use in faceted search UIs.\n * @public\n */\nSearchType.Tabs = (props: SearchTypeTabsProps) => {\n return <SearchTypeTabs {...props} />;\n};\n\nexport { SearchType };\nexport type { SearchTypeAccordionProps, SearchTypeTabsProps };\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport qs from 'qs';\nimport React, { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { rootRouteRef } from '../../plugin';\n\nimport { useRouteRef, IconComponent } from '@backstage/core-plugin-api';\nimport { SidebarSearchField, useContent } from '@backstage/core-components';\n\nexport type SidebarSearchProps = {\n icon?: IconComponent;\n};\n\nexport const SidebarSearch = (props: SidebarSearchProps) => {\n const searchRoute = useRouteRef(rootRouteRef);\n const { focusContent } = useContent();\n const navigate = useNavigate();\n const handleSearch = useCallback(\n (query: string): void => {\n const queryString = qs.stringify({ query }, { addQueryPrefix: true });\n focusContent();\n navigate(`${searchRoute()}${queryString}`);\n },\n [focusContent, navigate, searchRoute],\n );\n\n return (\n <SidebarSearchField\n icon={props.icon}\n onSearch={handleSearch}\n to=\"/search\"\n />\n );\n};\n"],"names":["useStyles","FiltersButton","Filters","SearchBar","DefaultResultListItem","SearchPage","SearchResult","makeStyles","IconButton","InputBase"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { S as SearchPage } from './index-6c1324ea.esm.js';
1
+ export { S as SearchPage } from './index-927faa3d.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'qs';
@@ -27,4 +27,4 @@ import 'react-use/lib/useEffectOnce';
27
27
  import '@material-ui/icons/ExpandMore';
28
28
  import '@material-ui/icons/FontDownload';
29
29
  import 'react-router-dom';
30
- //# sourceMappingURL=index-c59968b8.esm.js.map
30
+ //# sourceMappingURL=index-9a79e9c2.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-9a79e9c2.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1,6 +1,6 @@
1
1
  import React, { useCallback, useState } from 'react';
2
2
  import { makeStyles } from '@material-ui/core/styles';
3
- import { r as rootRouteRef, b as SearchBarBase } from './index-6c1324ea.esm.js';
3
+ import { r as rootRouteRef, b as SearchBarBase } from './index-927faa3d.esm.js';
4
4
  import qs from 'qs';
5
5
  import { useNavigate } from 'react-router-dom';
6
6
  import { useRouteRef } from '@backstage/core-plugin-api';
@@ -64,4 +64,4 @@ const HomePageSearchBar = ({ ...props }) => {
64
64
  };
65
65
 
66
66
  export { HomePageSearchBar };
67
- //# sourceMappingURL=index-c88298b1.esm.js.map
67
+ //# sourceMappingURL=index-d0499309.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-c88298b1.esm.js","sources":["../../src/components/util.ts","../../src/components/HomePageComponent/HomePageSearchBar.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport qs from 'qs';\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { rootRouteRef } from '../plugin';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\n\nexport const useNavigateToQuery = () => {\n const searchRoute = useRouteRef(rootRouteRef);\n const navigate = useNavigate();\n return useCallback(\n ({ query }: { query: string }): void => {\n const queryString = qs.stringify({ query }, { addQueryPrefix: true });\n\n navigate(`${searchRoute()}${queryString}`);\n },\n [navigate, searchRoute],\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { SearchBarBase, SearchBarBaseProps } from '../SearchBar';\nimport { useNavigateToQuery } from '../util';\n\nconst useStyles = makeStyles({\n root: {\n border: '1px solid #555',\n borderRadius: '6px',\n fontSize: '1.5em',\n },\n});\n\n/**\n * Props for {@link HomePageSearchBar}.\n *\n * @public\n */\nexport type HomePageSearchBarProps = Partial<\n Omit<SearchBarBaseProps, 'onChange' | 'onSubmit'>\n>;\n\n/**\n * The search bar created specifically for the composable home page\n *\n * @public\n */\nexport const HomePageSearchBar = ({ ...props }: HomePageSearchBarProps) => {\n const classes = useStyles(props);\n const [query, setQuery] = useState('');\n const handleSearch = useNavigateToQuery();\n\n const handleSubmit = () => {\n handleSearch({ query });\n };\n\n const handleChange = useCallback(\n value => {\n setQuery(value);\n },\n [setQuery],\n );\n\n return (\n <SearchBarBase\n classes={{ root: classes.root }}\n value={query}\n onSubmit={handleSubmit}\n onChange={handleChange}\n {...props}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBO,MAAM,qBAAqB,MAAM;AACtC,EAAM,MAAA,WAAA,GAAc,YAAY,YAAY,CAAA,CAAA;AAC5C,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAO,OAAA,WAAA,CACL,CAAC,EAAE,KAAqC,EAAA,KAAA;AACtC,IAAM,MAAA,WAAA,GAAc,GAAG,SAAU,CAAA,EAAE,OAAS,EAAA,EAAE,cAAgB,EAAA,IAAA,EAAM,CAAA,CAAA;AAEpE,IAAS,QAAA,CAAA,CAAA,EAAG,WAAY,EAAA,CAAA,EAAI,WAAa,CAAA,CAAA,CAAA,CAAA;AAAA,GAE3C,EAAA,CAAC,QAAU,EAAA,WAAW,CACxB,CAAA,CAAA;AACF,CAAA;;ACXA,MAAM,YAAY,UAAW,CAAA;AAAA,EAC3B,IAAM,EAAA;AAAA,IACJ,MAAQ,EAAA,gBAAA;AAAA,IACR,YAAc,EAAA,KAAA;AAAA,IACd,QAAU,EAAA,OAAA;AAAA,GACZ;AACF,CAAC,CAAA,CAAA;AAgBY,MAAA,iBAAA,GAAoB,CAAC,EAAA,GAAK,KAAoC,EAAA,KAAA;AACzE,EAAM,MAAA,OAAA,GAAU,UAAU,KAAK,CAAA,CAAA;AAC/B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAY,CAAA,GAAA,QAAA,CAAS,EAAE,CAAA,CAAA;AACrC,EAAA,MAAM,eAAe,kBAAmB,EAAA,CAAA;AAExC,EAAA,MAAM,eAAe,MAAM;AACzB,IAAa,YAAA,CAAA,EAAE,OAAO,CAAA,CAAA;AAAA,GACxB,CAAA;AAEA,EAAM,MAAA,YAAA,GAAe,YACnB,CAAS,KAAA,KAAA;AACP,IAAA,QAAA,CAAS,KAAK,CAAA,CAAA;AAAA,GAChB,EACA,CAAC,QAAQ,CACX,CAAA,CAAA;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IACC,OAAS,EAAA,EAAE,IAAM,EAAA,OAAA,CAAQ,IAAK,EAAA;AAAA,IAC9B,KAAO,EAAA,KAAA;AAAA,IACP,QAAU,EAAA,YAAA;AAAA,IACV,QAAU,EAAA,YAAA;AAAA,IACN,GAAA,KAAA;AAAA,GACN,CAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"index-d0499309.esm.js","sources":["../../src/components/util.ts","../../src/components/HomePageComponent/HomePageSearchBar.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport qs from 'qs';\nimport { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { rootRouteRef } from '../plugin';\n\nimport { useRouteRef } from '@backstage/core-plugin-api';\n\nexport const useNavigateToQuery = () => {\n const searchRoute = useRouteRef(rootRouteRef);\n const navigate = useNavigate();\n return useCallback(\n ({ query }: { query: string }): void => {\n const queryString = qs.stringify({ query }, { addQueryPrefix: true });\n\n navigate(`${searchRoute()}${queryString}`);\n },\n [navigate, searchRoute],\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useCallback, useState } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { SearchBarBase, SearchBarBaseProps } from '../SearchBar';\nimport { useNavigateToQuery } from '../util';\n\nconst useStyles = makeStyles({\n root: {\n border: '1px solid #555',\n borderRadius: '6px',\n fontSize: '1.5em',\n },\n});\n\n/**\n * Props for {@link HomePageSearchBar}.\n *\n * @public\n */\nexport type HomePageSearchBarProps = Partial<\n Omit<SearchBarBaseProps, 'onChange' | 'onSubmit'>\n>;\n\n/**\n * The search bar created specifically for the composable home page\n *\n * @public\n */\nexport const HomePageSearchBar = ({ ...props }: HomePageSearchBarProps) => {\n const classes = useStyles(props);\n const [query, setQuery] = useState('');\n const handleSearch = useNavigateToQuery();\n\n const handleSubmit = () => {\n handleSearch({ query });\n };\n\n const handleChange = useCallback(\n value => {\n setQuery(value);\n },\n [setQuery],\n );\n\n return (\n <SearchBarBase\n classes={{ root: classes.root }}\n value={query}\n onSubmit={handleSubmit}\n onChange={handleChange}\n {...props}\n />\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKO,MAAM,kBAAkB,GAAG,MAAM;AACxC,EAAE,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;AAChD,EAAE,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;AACjC,EAAE,OAAO,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK;AACpC,IAAI,MAAM,WAAW,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1E,IAAI,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAC/C,GAAG,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;AAC9B,CAAC;;ACRD,MAAM,SAAS,GAAG,UAAU,CAAC;AAC7B,EAAE,IAAI,EAAE;AACR,IAAI,MAAM,EAAE,gBAAgB;AAC5B,IAAI,YAAY,EAAE,KAAK;AACvB,IAAI,QAAQ,EAAE,OAAO;AACrB,GAAG;AACH,CAAC,CAAC,CAAC;AACS,MAAC,iBAAiB,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE,KAAK;AACnD,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;AACnC,EAAE,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;AACzC,EAAE,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;AAC5C,EAAE,MAAM,YAAY,GAAG,MAAM;AAC7B,IAAI,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5B,GAAG,CAAC;AACJ,EAAE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,KAAK,KAAK;AAC9C,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC;AACpB,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACjB,EAAE,uBAAuB,KAAK,CAAC,aAAa,CAAC,aAAa,EAAE;AAC5D,IAAI,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;AACnC,IAAI,KAAK,EAAE,KAAK;AAChB,IAAI,QAAQ,EAAE,YAAY;AAC1B,IAAI,QAAQ,EAAE,YAAY;AAC1B,IAAI,GAAG,KAAK;AACZ,GAAG,CAAC,CAAC;AACL;;;;"}
@@ -1,4 +1,4 @@
1
- export { c as SearchResult } from './index-6c1324ea.esm.js';
1
+ export { c as SearchResult } from './index-927faa3d.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'qs';
@@ -27,4 +27,4 @@ import 'react-use/lib/useEffectOnce';
27
27
  import '@material-ui/icons/ExpandMore';
28
28
  import '@material-ui/icons/FontDownload';
29
29
  import 'react-router-dom';
30
- //# sourceMappingURL=index-ecefd17e.esm.js.map
30
+ //# sourceMappingURL=index-e7f638c9.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-e7f638c9.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -9,7 +9,13 @@ import * as React from 'react';
9
9
  import React__default, { ReactElement } from 'react';
10
10
  import { AsyncState } from 'react-use/lib/useAsync';
11
11
 
12
+ /**
13
+ * @deprecated import from `@backstage/plugin-search-react` instead
14
+ */
12
15
  declare const searchApiRef: _backstage_core_plugin_api.ApiRef<SearchApi>;
16
+ /**
17
+ * @deprecated import from `@backstage/plugin-search-react` instead
18
+ */
13
19
  interface SearchApi {
14
20
  query(query: SearchQuery): Promise<SearchResultSet>;
15
21
  }
@@ -97,9 +103,15 @@ declare type SearchContextState = {
97
103
  filters: JsonObject;
98
104
  pageCursor?: string;
99
105
  };
106
+ /**
107
+ * @deprecated import from `@backstage/plugin-search-react` instead
108
+ */
100
109
  declare const SearchContextProvider: ({ initialState, children, }: React__default.PropsWithChildren<{
101
110
  initialState?: SearchContextState | undefined;
102
111
  }>) => JSX.Element;
112
+ /**
113
+ * @deprecated import from "@backstage/plugin-search-react" instead
114
+ */
103
115
  declare const useSearch: () => SearchContextValue;
104
116
 
105
117
  /**
@@ -170,6 +182,15 @@ declare const SearchFilterNext: {
170
182
  Autocomplete(props: SearchAutocompleteFilterProps): JSX.Element;
171
183
  };
172
184
 
185
+ /**
186
+ * @public
187
+ **/
188
+ interface SearchModalChildrenProps {
189
+ /**
190
+ * A function that should be invoked when navigating away from the modal.
191
+ */
192
+ toggleModal: () => void;
193
+ }
173
194
  interface SearchModalProps {
174
195
  /**
175
196
  * If true, it renders the modal.
@@ -187,8 +208,13 @@ interface SearchModalProps {
187
208
  * should be closed.
188
209
  */
189
210
  toggleModal: () => void;
211
+ /**
212
+ * A function that returns custom content to render in the search modal in
213
+ * place of the default.
214
+ */
215
+ children?: (props: SearchModalChildrenProps) => JSX.Element;
190
216
  }
191
- declare const SearchModal: ({ open, hidden, toggleModal, }: SearchModalProps) => JSX.Element;
217
+ declare const SearchModal: ({ open, hidden, toggleModal, children, }: SearchModalProps) => JSX.Element;
192
218
 
193
219
  /**
194
220
  * Use this hook to manage the state of {@link SearchModal}
@@ -269,6 +295,7 @@ declare const SidebarSearch: (props: SidebarSearchProps) => JSX.Element;
269
295
 
270
296
  declare type SidebarSearchModalProps = {
271
297
  icon?: IconComponent;
298
+ children?: (props: SearchModalChildrenProps) => JSX.Element;
272
299
  };
273
300
 
274
301
  declare const searchPlugin: _backstage_core_plugin_api.BackstagePlugin<{
@@ -304,4 +331,4 @@ declare const DefaultResultListItem: ({ result, icon, secondaryAction, lineClamp
304
331
  }) => JSX.Element;
305
332
  declare const HomePageSearchBar: ({ ...props }: Partial<Omit<SearchBarBaseProps, "onChange" | "onSubmit">>) => JSX.Element;
306
333
 
307
- export { DefaultResultListItem, Filters, FiltersButton, FiltersState, HomePageSearchBar, HomePageSearchBarProps, SearchPage$1 as Router, SearchApi, SearchAutocompleteFilterProps, SearchBar, SearchBarBase, SearchBarBaseProps, SearchBarNext, SearchBarProps, SearchContextProvider, SearchContextState, SearchFilter, SearchFilterComponentProps, SearchFilterNext, SearchFilterWrapperProps, SearchModal, SearchModalProps, SearchPage, SearchPageNext, SearchResult, SearchResultPager, SearchType, SearchTypeAccordionProps, SearchTypeProps, SearchTypeTabsProps, SidebarSearch, SidebarSearchModal, SidebarSearchModalProps, SidebarSearchProps, searchPlugin as plugin, searchApiRef, searchPlugin, useSearch, useSearchModal };
334
+ export { DefaultResultListItem, Filters, FiltersButton, FiltersState, HomePageSearchBar, HomePageSearchBarProps, SearchPage$1 as Router, SearchApi, SearchAutocompleteFilterProps, SearchBar, SearchBarBase, SearchBarBaseProps, SearchBarNext, SearchBarProps, SearchContextProvider, SearchContextState, SearchFilter, SearchFilterComponentProps, SearchFilterNext, SearchFilterWrapperProps, SearchModal, SearchModalChildrenProps, SearchModalProps, SearchPage, SearchPageNext, SearchResult, SearchResultPager, SearchType, SearchTypeAccordionProps, SearchTypeProps, SearchTypeTabsProps, SidebarSearch, SidebarSearchModal, SidebarSearchModalProps, SidebarSearchProps, searchPlugin as plugin, searchApiRef, searchPlugin, useSearch, useSearchModal };
package/dist/index.esm.js CHANGED
@@ -1,4 +1,4 @@
1
- export { m as DefaultResultListItem, F as Filters, e as FiltersButton, H as HomePageSearchBar, S as Router, a as SearchBar, b as SearchBarBase, n as SearchBarNext, f as SearchContextProvider, h as SearchFilter, i as SearchFilterNext, d as SearchModal, o as SearchPage, p as SearchPageNext, t as SearchResult, j as SearchResultPager, k as SearchType, l as SidebarSearch, v as SidebarSearchModal, q as plugin, s as searchApiRef, q as searchPlugin, g as useSearch, u as useSearchModal } from './esm/index-6c1324ea.esm.js';
1
+ export { m as DefaultResultListItem, F as Filters, e as FiltersButton, H as HomePageSearchBar, S as Router, a as SearchBar, b as SearchBarBase, n as SearchBarNext, f as SearchContextProvider, h as SearchFilter, i as SearchFilterNext, d as SearchModal, o as SearchPage, p as SearchPageNext, t as SearchResult, j as SearchResultPager, k as SearchType, l as SidebarSearch, v as SidebarSearchModal, q as plugin, s as searchApiRef, q as searchPlugin, g as useSearch, u as useSearchModal } from './esm/index-927faa3d.esm.js';
2
2
  import '@backstage/core-plugin-api';
3
3
  import '@backstage/errors';
4
4
  import 'qs';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@backstage/plugin-search",
3
3
  "description": "The Backstage plugin that provides your backstage app with search",
4
- "version": "0.7.5-next.0",
4
+ "version": "0.7.5-next.1",
5
5
  "main": "dist/index.esm.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "Apache-2.0",
@@ -35,11 +35,12 @@
35
35
  "dependencies": {
36
36
  "@backstage/catalog-model": "^1.0.1-next.0",
37
37
  "@backstage/config": "^1.0.0",
38
- "@backstage/core-components": "^0.9.3-next.0",
39
- "@backstage/core-plugin-api": "^1.0.0",
38
+ "@backstage/core-components": "^0.9.3-next.2",
39
+ "@backstage/core-plugin-api": "^1.0.1-next.0",
40
40
  "@backstage/errors": "^1.0.0",
41
- "@backstage/plugin-catalog-react": "^1.0.1-next.0",
42
- "@backstage/plugin-search-common": "^0.3.3-next.0",
41
+ "@backstage/plugin-catalog-react": "^1.0.1-next.3",
42
+ "@backstage/plugin-search-common": "^0.3.3-next.1",
43
+ "@backstage/plugin-search-react": "^0.1.0-next.0",
43
44
  "@backstage/theme": "^0.2.15",
44
45
  "@backstage/types": "^1.0.0",
45
46
  "@material-ui/core": "^4.12.2",
@@ -56,21 +57,21 @@
56
57
  "react": "^16.13.1 || ^17.0.0"
57
58
  },
58
59
  "devDependencies": {
59
- "@backstage/cli": "^0.16.1-next.0",
60
- "@backstage/core-app-api": "^1.0.1-next.0",
61
- "@backstage/dev-utils": "^1.0.1-next.0",
62
- "@backstage/test-utils": "^1.0.1-next.0",
60
+ "@backstage/cli": "^0.17.0-next.3",
61
+ "@backstage/core-app-api": "^1.0.1-next.1",
62
+ "@backstage/dev-utils": "^1.0.1-next.1",
63
+ "@backstage/test-utils": "^1.0.1-next.2",
63
64
  "@testing-library/jest-dom": "^5.10.1",
64
65
  "@testing-library/react": "^12.1.3",
65
66
  "@testing-library/react-hooks": "^7.0.2",
66
- "@testing-library/user-event": "^13.1.8",
67
+ "@testing-library/user-event": "^14.0.0",
67
68
  "@types/jest": "^26.0.7",
68
- "@types/node": "^14.14.32",
69
+ "@types/node": "^16.11.26",
69
70
  "cross-fetch": "^3.1.5",
70
71
  "msw": "^0.35.0"
71
72
  },
72
73
  "files": [
73
74
  "dist"
74
75
  ],
75
- "gitHead": "6bc4253672337538ce7ea5aadb3e9f60daeb3f80"
76
+ "gitHead": "2eca57d93ef1081f4a76a19fc994a8e9e1a19e00"
76
77
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-5122e36b.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-5c70689c.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-6c1324ea.esm.js","sources":["../../src/apis.ts","../../src/components/Filters/FiltersButton.tsx","../../src/components/Filters/Filters.tsx","../../src/components/SearchContext/SearchContext.tsx","../../src/components/SearchTracker/SearchTracker.tsx","../../src/components/SearchBar/SearchBar.tsx","../../src/components/SearchFilter/hooks.ts","../../src/components/SearchFilter/SearchFilter.Autocomplete.tsx","../../src/components/SearchFilter/SearchFilter.tsx","../../src/components/DefaultResultListItem/DefaultResultListItem.tsx","../../src/components/SearchResult/SearchResult.tsx","../../src/components/SearchResultPager/SearchResultPager.tsx","../../src/plugin.ts","../../src/components/SearchModal/SearchModal.tsx","../../src/components/SearchModal/useSearchModal.tsx","../../src/components/LegacySearchPage/LegacySearchBar.tsx","../../src/components/LegacySearchPage/Filters/FiltersButton.tsx","../../src/components/LegacySearchPage/Filters/Filters.tsx","../../src/components/LegacySearchPage/LegacySearchResult.tsx","../../src/components/LegacySearchPage/LegacySearchPage.tsx","../../src/components/SearchPage/SearchPage.tsx","../../src/components/SearchType/SearchType.Accordion.tsx","../../src/components/SearchType/SearchType.Tabs.tsx","../../src/components/SearchType/SearchType.tsx","../../src/components/SidebarSearch/SidebarSearch.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createApiRef,\n DiscoveryApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { SearchQuery, SearchResultSet } from '@backstage/plugin-search-common';\nimport qs from 'qs';\n\nexport const searchApiRef = createApiRef<SearchApi>({\n id: 'plugin.search.queryservice',\n});\n\nexport interface SearchApi {\n query(query: SearchQuery): Promise<SearchResultSet>;\n}\n\nexport class SearchClient implements SearchApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly identityApi: IdentityApi;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n identityApi: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.identityApi = options.identityApi;\n }\n\n async query(query: SearchQuery): Promise<SearchResultSet> {\n const { token } = await this.identityApi.getCredentials();\n const queryString = qs.stringify(query);\n const url = `${await this.discoveryApi.getBaseUrl(\n 'search/query',\n )}?${queryString}`;\n const response = await fetch(url, {\n headers: token ? { Authorization: `Bearer ${token}` } : {},\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { makeStyles, IconButton, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n width: '250px',\n display: 'flex',\n },\n icon: {\n margin: theme.spacing(-1, 0, 0, 0),\n },\n}));\n\ntype FiltersButtonProps = {\n numberOfSelectedFilters: number;\n handleToggleFilters: () => void;\n};\n\nexport const FiltersButton = ({\n numberOfSelectedFilters,\n handleToggleFilters,\n}: FiltersButtonProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.filters}>\n <IconButton\n className={classes.icon}\n aria-label=\"settings\"\n onClick={handleToggleFilters}\n >\n <FilterListIcon />\n </IconButton>\n <Typography variant=\"h6\">\n Filters ({numberOfSelectedFilters ? numberOfSelectedFilters : 0})\n </Typography>\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n makeStyles,\n Typography,\n Divider,\n Card,\n CardHeader,\n Button,\n CardContent,\n Select,\n Checkbox,\n List,\n ListItem,\n ListItemText,\n MenuItem,\n} from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n background: 'transparent',\n boxShadow: '0px 0px 0px 0px',\n },\n checkbox: {\n padding: theme.spacing(0, 1, 0, 1),\n },\n dropdown: {\n width: '100%',\n },\n}));\n\nexport type FiltersState = {\n selected: string;\n checked: Array<string>;\n};\n\nexport type FilterOptions = {\n kind: Array<string>;\n lifecycle: Array<string>;\n};\n\ntype FiltersProps = {\n filters: FiltersState;\n filterOptions: FilterOptions;\n resetFilters: () => void;\n updateSelected: (filter: string) => void;\n updateChecked: (filter: string) => void;\n};\n\nexport const Filters = ({\n filters,\n filterOptions,\n resetFilters,\n updateSelected,\n updateChecked,\n}: FiltersProps) => {\n const classes = useStyles();\n\n return (\n <Card className={classes.filters}>\n <CardHeader\n title={<Typography variant=\"h6\">Filters</Typography>}\n action={\n <Button color=\"primary\" onClick={() => resetFilters()}>\n CLEAR ALL\n </Button>\n }\n />\n <Divider />\n {filterOptions.kind.length === 0 && filterOptions.lifecycle.length === 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">\n Filters cannot be applied to available results\n </Typography>\n </CardContent>\n )}\n {filterOptions.kind.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Kind</Typography>\n <Select\n id=\"outlined-select\"\n onChange={(e: React.ChangeEvent<any>) =>\n updateSelected(e?.target?.value)\n }\n variant=\"outlined\"\n className={classes.dropdown}\n value={filters.selected}\n >\n {filterOptions.kind.map(filter => (\n <MenuItem\n selected={filter === ''}\n dense\n key={filter}\n value={filter}\n >\n {filter}\n </MenuItem>\n ))}\n </Select>\n </CardContent>\n )}\n {filterOptions.lifecycle.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Lifecycle</Typography>\n <List disablePadding dense>\n {filterOptions.lifecycle.map(filter => (\n <ListItem\n key={filter}\n dense\n button\n onClick={() => updateChecked(filter)}\n >\n <Checkbox\n edge=\"start\"\n disableRipple\n className={classes.checkbox}\n color=\"primary\"\n checked={filters.checked.includes(filter)}\n tabIndex={-1}\n value={filter}\n name={filter}\n />\n <ListItemText id={filter} primary={filter} />\n </ListItem>\n ))}\n </List>\n </CardContent>\n )}\n </Card>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { JsonObject } from '@backstage/types';\nimport { useApi, AnalyticsContext } from '@backstage/core-plugin-api';\nimport { SearchResultSet } from '@backstage/plugin-search-common';\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport useAsync, { AsyncState } from 'react-use/lib/useAsync';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport { searchApiRef } from '../../apis';\n\ntype SearchContextValue = {\n result: AsyncState<SearchResultSet>;\n setTerm: React.Dispatch<React.SetStateAction<string>>;\n setTypes: React.Dispatch<React.SetStateAction<string[]>>;\n setFilters: React.Dispatch<React.SetStateAction<JsonObject>>;\n setPageCursor: React.Dispatch<React.SetStateAction<string | undefined>>;\n fetchNextPage?: React.DispatchWithoutAction;\n fetchPreviousPage?: React.DispatchWithoutAction;\n} & SearchContextState;\n\n/**\n * The initial state of `SearchContextProvider`.\n *\n * @public\n */\nexport type SearchContextState = {\n term: string;\n types: string[];\n filters: JsonObject;\n pageCursor?: string;\n};\n\nexport const SearchContext = createContext<SearchContextValue | undefined>(\n undefined,\n);\n\nconst searchInitialState: SearchContextState = {\n term: '',\n pageCursor: undefined,\n filters: {},\n types: [],\n};\n\nexport const SearchContextProvider = ({\n initialState = searchInitialState,\n children,\n}: PropsWithChildren<{ initialState?: SearchContextState }>) => {\n const searchApi = useApi(searchApiRef);\n const [pageCursor, setPageCursor] = useState<string | undefined>(\n initialState.pageCursor,\n );\n const [filters, setFilters] = useState<JsonObject>(initialState.filters);\n const [term, setTerm] = useState<string>(initialState.term);\n const [types, setTypes] = useState<string[]>(initialState.types);\n\n const prevTerm = usePrevious(term);\n\n const result = useAsync(\n () =>\n searchApi.query({\n term,\n filters,\n pageCursor,\n types,\n }),\n [term, filters, types, pageCursor],\n );\n\n const hasNextPage =\n !result.loading && !result.error && result.value?.nextPageCursor;\n const hasPreviousPage =\n !result.loading && !result.error && result.value?.previousPageCursor;\n const fetchNextPage = useCallback(() => {\n setPageCursor(result.value?.nextPageCursor);\n }, [result.value?.nextPageCursor]);\n const fetchPreviousPage = useCallback(() => {\n setPageCursor(result.value?.previousPageCursor);\n }, [result.value?.previousPageCursor]);\n\n useEffect(() => {\n // Any time a term is reset, we want to start from page 0.\n if (term && prevTerm && term !== prevTerm) {\n setPageCursor(undefined);\n }\n }, [term, prevTerm, initialState.pageCursor]);\n\n const value: SearchContextValue = {\n result,\n filters,\n setFilters,\n term,\n setTerm,\n types,\n setTypes,\n pageCursor,\n setPageCursor,\n fetchNextPage: hasNextPage ? fetchNextPage : undefined,\n fetchPreviousPage: hasPreviousPage ? fetchPreviousPage : undefined,\n };\n\n return (\n <AnalyticsContext attributes={{ searchTypes: types.sort().join(',') }}>\n <SearchContext.Provider value={value} children={children} />\n </AnalyticsContext>\n );\n};\n\nexport const useSearch = () => {\n const context = useContext(SearchContext);\n if (context === undefined) {\n throw new Error('useSearch must be used within a SearchContextProvider');\n }\n return context;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport { useAnalytics } from '@backstage/core-plugin-api';\nimport { useSearch } from '../SearchContext';\n\n/**\n * Capture search event on term change.\n */\nexport const TrackSearch = ({ children }: { children: React.ReactChild }) => {\n const analytics = useAnalytics();\n const { term } = useSearch();\n\n useEffect(() => {\n if (term) {\n // Capture analytics search event with search term provided as value\n analytics.captureEvent('search', term);\n }\n }, [analytics, term]);\n\n return <>{children}</>;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, {\n ChangeEvent,\n KeyboardEvent,\n useState,\n useEffect,\n useCallback,\n useContext,\n} from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n InputBase,\n InputBaseProps,\n InputAdornment,\n IconButton,\n} from '@material-ui/core';\nimport SearchIcon from '@material-ui/icons/Search';\nimport ClearButton from '@material-ui/icons/Clear';\n\nimport {\n SearchContext,\n SearchContextProvider,\n useSearch,\n} from '../SearchContext';\nimport { TrackSearch } from '../SearchTracker';\n\n/**\n * Props for {@link SearchBarBase}.\n *\n * @public\n */\nexport type SearchBarBaseProps = Omit<InputBaseProps, 'onChange'> & {\n debounceTime?: number;\n clearButton?: boolean;\n onClear?: () => void;\n onSubmit?: () => void;\n onChange: (value: string) => void;\n};\n\nconst useSearchContextCheck = () => {\n const context = useContext(SearchContext);\n return context !== undefined;\n};\n\n/**\n * All search boxes exported by the search plugin are based on the <SearchBarBase />,\n * and this one is based on the <InputBase /> component from Material UI.\n * Recommended if you don't use Search Provider or Search Context.\n *\n * @public\n */\nexport const SearchBarBase = ({\n onChange,\n onKeyDown,\n onSubmit,\n debounceTime = 200,\n clearButton = true,\n fullWidth = true,\n value: defaultValue,\n inputProps: defaultInputProps = {},\n endAdornment: defaultEndAdornment,\n ...props\n}: SearchBarBaseProps) => {\n const configApi = useApi(configApiRef);\n const [value, setValue] = useState<string>(defaultValue as string);\n const hasSearchContext = useSearchContextCheck();\n\n useEffect(() => {\n setValue(prevValue =>\n prevValue !== defaultValue ? (defaultValue as string) : prevValue,\n );\n }, [defaultValue]);\n\n useDebounce(() => onChange(value), debounceTime, [value]);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n setValue(e.target.value);\n },\n [setValue],\n );\n\n const handleKeyDown = useCallback(\n (e: KeyboardEvent<HTMLInputElement>) => {\n if (onKeyDown) onKeyDown(e);\n if (onSubmit && e.key === 'Enter') {\n onSubmit();\n }\n },\n [onKeyDown, onSubmit],\n );\n\n const handleClear = useCallback(() => {\n onChange('');\n }, [onChange]);\n\n const placeholder = `Search in ${\n configApi.getOptionalString('app.title') || 'Backstage'\n }`;\n\n const startAdornment = (\n <InputAdornment position=\"start\">\n <IconButton aria-label=\"Query\" disabled>\n <SearchIcon />\n </IconButton>\n </InputAdornment>\n );\n\n const endAdornment = (\n <InputAdornment position=\"end\">\n <IconButton aria-label=\"Clear\" onClick={handleClear}>\n <ClearButton />\n </IconButton>\n </InputAdornment>\n );\n\n const searchBar = (\n <TrackSearch>\n <InputBase\n data-testid=\"search-bar-next\"\n value={value}\n placeholder={placeholder}\n startAdornment={startAdornment}\n endAdornment={clearButton ? endAdornment : defaultEndAdornment}\n inputProps={{ 'aria-label': 'Search', ...defaultInputProps }}\n fullWidth={fullWidth}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n {...props}\n />\n </TrackSearch>\n );\n\n return hasSearchContext ? (\n searchBar\n ) : (\n <SearchContextProvider>{searchBar}</SearchContextProvider>\n );\n};\n\n/**\n * Props for {@link SearchBar}.\n *\n * @public\n */\nexport type SearchBarProps = Partial<SearchBarBaseProps>;\n\n/**\n * Recommended search bar when you use the Search Provider or Search Context.\n *\n * @public\n */\nexport const SearchBar = ({ onChange, ...props }: SearchBarProps) => {\n const { term, setTerm } = useSearch();\n\n const handleChange = useCallback(\n (newValue: string) => {\n if (onChange) {\n onChange(newValue);\n } else {\n setTerm(newValue);\n }\n },\n [onChange, setTerm],\n );\n\n return <SearchBarBase value={term} onChange={handleChange} {...props} />;\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useEffect, useRef } from 'react';\nimport useAsyncFn from 'react-use/lib/useAsyncFn';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { useSearch } from '../SearchContext';\n\n/**\n * Utility hook for either asynchronously loading filter values from a given\n * function or synchronously providing a given list of default values.\n */\nexport const useAsyncFilterValues = (\n fn: ((partial: string) => Promise<string[]>) | undefined,\n inputValue: string,\n defaultValues: string[] = [],\n debounce: number = 250,\n) => {\n const valuesMemo = useRef<Record<string, string[] | Promise<string[]>>>({});\n const definiteFn = fn || (() => Promise.resolve([]));\n\n const [state, callback] = useAsyncFn(definiteFn, [inputValue], {\n loading: true,\n });\n\n // Do not invoke the given function more than necessary.\n useDebounce(\n () => {\n // Performance optimization: only invoke the callback once per inputValue\n // for the lifetime of the hook/component.\n if (valuesMemo.current[inputValue] === undefined) {\n valuesMemo.current[inputValue] = callback(inputValue).then(values => {\n // Override the value for future immediate returns.\n valuesMemo.current[inputValue] = values;\n return values;\n });\n }\n },\n debounce,\n [callback, inputValue],\n );\n\n // Immediately return the default values if they are provided.\n if (defaultValues.length) {\n return {\n loading: false,\n value: defaultValues,\n };\n }\n\n // Immediately return a memoized value if it is set (and not a promise).\n const possibleValue = valuesMemo.current[inputValue];\n if (Array.isArray(possibleValue)) {\n return {\n loading: false,\n value: possibleValue,\n };\n }\n\n return state;\n};\n\n/**\n * Utility hook for applying a given default value to the search context.\n */\nexport const useDefaultFilterValue = (\n name: string,\n defaultValue?: string | string[] | null,\n) => {\n const { setFilters } = useSearch();\n\n useEffect(() => {\n if (defaultValue && [defaultValue].flat().length > 0) {\n setFilters(prevFilters => ({\n ...prevFilters,\n [name]: defaultValue,\n }));\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ChangeEvent, useState } from 'react';\nimport { Chip, TextField } from '@material-ui/core';\nimport {\n Autocomplete,\n AutocompleteGetTagProps,\n AutocompleteRenderInputParams,\n} from '@material-ui/lab';\nimport { useSearch } from '../SearchContext';\nimport { useAsyncFilterValues, useDefaultFilterValue } from './hooks';\nimport { SearchFilterComponentProps } from './SearchFilter';\n\n/**\n * @public\n */\nexport type SearchAutocompleteFilterProps = SearchFilterComponentProps & {\n filterSelectedOptions?: boolean;\n limitTags?: number;\n multiple?: boolean;\n};\n\nexport const AutocompleteFilter = (props: SearchAutocompleteFilterProps) => {\n const {\n className,\n defaultValue,\n name,\n values: givenValues,\n valuesDebounceMs,\n label,\n filterSelectedOptions,\n limitTags,\n multiple,\n } = props;\n const [inputValue, setInputValue] = useState<string>('');\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values, loading } = useAsyncFilterValues(\n asyncValues,\n inputValue,\n defaultValues,\n valuesDebounceMs,\n );\n const { filters, setFilters } = useSearch();\n const filterValue =\n (filters[name] as string | string[] | undefined) || (multiple ? [] : null);\n\n // Set new filter values on input change.\n const handleChange = (\n _: ChangeEvent<{}>,\n newValue: string | string[] | null,\n ) => {\n setFilters(prevState => {\n const { [name]: filter, ...others } = prevState;\n\n if (newValue) {\n return { ...others, [name]: newValue };\n }\n return { ...others };\n });\n };\n\n // Provide the input field.\n const renderInput = (params: AutocompleteRenderInputParams) => (\n <TextField\n {...params}\n name=\"search\"\n variant=\"outlined\"\n label={label}\n fullWidth\n />\n );\n\n // Render tags as primary-colored chips.\n const renderTags = (\n tagValue: string[],\n getTagProps: AutocompleteGetTagProps,\n ) =>\n tagValue.map((option: string, index: number) => (\n <Chip label={option} color=\"primary\" {...getTagProps({ index })} />\n ));\n\n return (\n <Autocomplete\n filterSelectedOptions={filterSelectedOptions}\n limitTags={limitTags}\n multiple={multiple}\n className={className}\n id={`${multiple ? 'multi-' : ''}select-filter-${name}--select`}\n options={values || []}\n loading={loading}\n value={filterValue}\n onChange={handleChange}\n onInputChange={(_, newValue) => setInputValue(newValue)}\n renderInput={renderInput}\n renderTags={renderTags}\n />\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactElement, ChangeEvent } from 'react';\nimport {\n makeStyles,\n FormControl,\n FormControlLabel,\n InputLabel,\n Checkbox,\n Select,\n MenuItem,\n FormLabel,\n} from '@material-ui/core';\n\nimport {\n AutocompleteFilter,\n SearchAutocompleteFilterProps,\n} from './SearchFilter.Autocomplete';\nimport { useSearch } from '../SearchContext';\nimport { useAsyncFilterValues, useDefaultFilterValue } from './hooks';\n\nconst useStyles = makeStyles({\n label: {\n textTransform: 'capitalize',\n },\n});\n\n/**\n * @public\n */\nexport type SearchFilterComponentProps = {\n className?: string;\n name: string;\n label?: string;\n /**\n * Either an array of values directly, or an async function to return a list\n * of values to be used in the filter. In the autocomplete filter, the last\n * input value is provided as an input to allow values to be filtered. This\n * function is debounced and values cached.\n */\n values?: string[] | ((partial: string) => Promise<string[]>);\n defaultValue?: string[] | string | null;\n /**\n * Debounce time in milliseconds, used when values is an async callback.\n * Defaults to 250ms.\n */\n valuesDebounceMs?: number;\n};\n\n/**\n * @public\n */\nexport type SearchFilterWrapperProps = SearchFilterComponentProps & {\n component: (props: SearchFilterComponentProps) => ReactElement;\n debug?: boolean;\n};\n\nconst CheckboxFilter = (props: SearchFilterComponentProps) => {\n const {\n className,\n defaultValue,\n label,\n name,\n values: givenValues = [],\n valuesDebounceMs,\n } = props;\n const classes = useStyles();\n const { filters, setFilters } = useSearch();\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values = [], loading } = useAsyncFilterValues(\n asyncValues,\n '',\n defaultValues,\n valuesDebounceMs,\n );\n\n const handleChange = (e: ChangeEvent<HTMLInputElement>) => {\n const {\n target: { value, checked },\n } = e;\n\n setFilters(prevFilters => {\n const { [name]: filter, ...others } = prevFilters;\n const rest = ((filter as string[]) || []).filter(i => i !== value);\n const items = checked ? [...rest, value] : rest;\n return items.length ? { ...others, [name]: items } : others;\n });\n };\n\n return (\n <FormControl\n className={className}\n disabled={loading}\n fullWidth\n data-testid=\"search-checkboxfilter-next\"\n >\n {label ? <FormLabel className={classes.label}>{label}</FormLabel> : null}\n {values.map((value: string) => (\n <FormControlLabel\n key={value}\n control={\n <Checkbox\n color=\"primary\"\n tabIndex={-1}\n inputProps={{ 'aria-labelledby': value }}\n value={value}\n name={value}\n onChange={handleChange}\n checked={((filters[name] as string[]) ?? []).includes(value)}\n />\n }\n label={value}\n />\n ))}\n </FormControl>\n );\n};\n\nconst SelectFilter = (props: SearchFilterComponentProps) => {\n const {\n className,\n defaultValue,\n label,\n name,\n values: givenValues,\n valuesDebounceMs,\n } = props;\n const classes = useStyles();\n useDefaultFilterValue(name, defaultValue);\n const asyncValues =\n typeof givenValues === 'function' ? givenValues : undefined;\n const defaultValues =\n typeof givenValues === 'function' ? undefined : givenValues;\n const { value: values = [], loading } = useAsyncFilterValues(\n asyncValues,\n '',\n defaultValues,\n valuesDebounceMs,\n );\n const { filters, setFilters } = useSearch();\n\n const handleChange = (e: ChangeEvent<{ value: unknown }>) => {\n const {\n target: { value },\n } = e;\n\n setFilters(prevFilters => {\n const { [name]: filter, ...others } = prevFilters;\n return value ? { ...others, [name]: value as string } : others;\n });\n };\n\n return (\n <FormControl\n disabled={loading}\n className={className}\n variant=\"filled\"\n fullWidth\n data-testid=\"search-selectfilter-next\"\n >\n {label ? (\n <InputLabel className={classes.label} margin=\"dense\">\n {label}\n </InputLabel>\n ) : null}\n <Select\n variant=\"outlined\"\n value={filters[name] || ''}\n onChange={handleChange}\n >\n <MenuItem value=\"\">\n <em>All</em>\n </MenuItem>\n {values.map((value: string) => (\n <MenuItem key={value} value={value}>\n {value}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n\nconst SearchFilter = ({\n component: Element,\n ...props\n}: SearchFilterWrapperProps) => <Element {...props} />;\n\nSearchFilter.Checkbox = (\n props: Omit<SearchFilterWrapperProps, 'component'> &\n SearchFilterComponentProps,\n) => <SearchFilter {...props} component={CheckboxFilter} />;\n\nSearchFilter.Select = (\n props: Omit<SearchFilterWrapperProps, 'component'> &\n SearchFilterComponentProps,\n) => <SearchFilter {...props} component={SelectFilter} />;\n\n/**\n * A control surface for a given filter field name, rendered as an autocomplete\n * textfield. A hard-coded list of values may be provided, or an async function\n * which returns values may be provided instead.\n * @public\n */\nSearchFilter.Autocomplete = (props: SearchAutocompleteFilterProps) => (\n <SearchFilter {...props} component={AutocompleteFilter} />\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchFilter /> component instead. This component will be removed in an\n * upcoming release.\n */\nconst SearchFilterNext = SearchFilter;\n\nexport { SearchFilter, SearchFilterNext };\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { ReactNode } from 'react';\nimport { SearchDocument } from '@backstage/plugin-search-common';\nimport {\n ListItem,\n ListItemIcon,\n ListItemText,\n Box,\n Divider,\n} from '@material-ui/core';\nimport { Link } from '@backstage/core-components';\nimport TextTruncate from 'react-text-truncate';\n\ntype Props = {\n icon?: ReactNode;\n secondaryAction?: ReactNode;\n result: SearchDocument;\n lineClamp?: number;\n};\n\nexport const DefaultResultListItem = ({\n result,\n icon,\n secondaryAction,\n lineClamp = 5,\n}: Props) => {\n return (\n <Link to={result.location}>\n <ListItem alignItems=\"center\">\n {icon && <ListItemIcon>{icon}</ListItemIcon>}\n <ListItemText\n primaryTypographyProps={{ variant: 'h6' }}\n primary={result.title}\n secondary={\n <TextTruncate\n line={lineClamp}\n truncateText=\"…\"\n text={result.text}\n element=\"span\"\n />\n }\n />\n {secondaryAction && <Box alignItems=\"flex-end\">{secondaryAction}</Box>}\n </ListItem>\n <Divider />\n </Link>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n EmptyState,\n Progress,\n ResponseErrorPanel,\n} from '@backstage/core-components';\nimport { SearchResult } from '@backstage/plugin-search-common';\nimport React from 'react';\nimport { useSearch } from '../SearchContext';\n\ntype Props = {\n children: (results: { results: SearchResult[] }) => JSX.Element;\n};\n\nexport const SearchResultComponent = ({ children }: Props) => {\n const {\n result: { loading, error, value },\n } = useSearch();\n\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return (\n <ResponseErrorPanel\n title=\"Error encountered while fetching search results\"\n error={error}\n />\n );\n }\n\n if (!value?.results.length) {\n return <EmptyState missing=\"data\" title=\"Sorry, no results were found\" />;\n }\n\n return <>{children({ results: value.results })}</>;\n};\n\nexport { SearchResultComponent as SearchResult };\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Button, makeStyles } from '@material-ui/core';\nimport ArrowBackIosIcon from '@material-ui/icons/ArrowBackIos';\nimport ArrowForwardIosIcon from '@material-ui/icons/ArrowForwardIos';\nimport React from 'react';\nimport { useSearch } from '../SearchContext';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n display: 'flex',\n justifyContent: 'space-between',\n gap: theme.spacing(2),\n margin: theme.spacing(2, 0),\n },\n}));\n\nexport const SearchResultPager = () => {\n const { fetchNextPage, fetchPreviousPage } = useSearch();\n const classes = useStyles();\n\n if (!fetchNextPage && !fetchPreviousPage) {\n return <></>;\n }\n\n return (\n <nav arial-label=\"pagination navigation\" className={classes.root}>\n <Button\n aria-label=\"previous page\"\n disabled={!fetchPreviousPage}\n onClick={fetchPreviousPage}\n startIcon={<ArrowBackIosIcon />}\n >\n Previous\n </Button>\n\n <Button\n aria-label=\"next page\"\n disabled={!fetchNextPage}\n onClick={fetchNextPage}\n endIcon={<ArrowForwardIosIcon />}\n >\n Next\n </Button>\n </nav>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SearchClient, searchApiRef } from './apis';\nimport {\n createApiFactory,\n createPlugin,\n createRouteRef,\n createRoutableExtension,\n discoveryApiRef,\n createComponentExtension,\n identityApiRef,\n} from '@backstage/core-plugin-api';\n\nexport const rootRouteRef = createRouteRef({\n id: 'search',\n});\n\nexport const rootNextRouteRef = createRouteRef({\n id: 'search:next',\n});\n\nexport const searchPlugin = createPlugin({\n id: 'search',\n apis: [\n createApiFactory({\n api: searchApiRef,\n deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef },\n factory: ({ discoveryApi, identityApi }) => {\n return new SearchClient({ discoveryApi, identityApi });\n },\n }),\n ],\n routes: {\n root: rootRouteRef,\n nextRoot: rootNextRouteRef,\n },\n});\n\nexport const SearchPage = searchPlugin.provide(\n createRoutableExtension({\n name: 'SearchPage',\n component: () => import('./components/SearchPage').then(m => m.SearchPage),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchPage /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchPageNext = searchPlugin.provide(\n createRoutableExtension({\n name: 'SearchPageNext',\n component: () => import('./components/SearchPage').then(m => m.SearchPage),\n mountPoint: rootNextRouteRef,\n }),\n);\n\nexport const SearchBar = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchBar',\n component: {\n lazy: () => import('./components/SearchBar').then(m => m.SearchBar),\n },\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchBar /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchBarNext = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchBarNext',\n component: {\n lazy: () => import('./components/SearchBar').then(m => m.SearchBar),\n },\n }),\n);\n\nexport const SearchResult = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchResult',\n component: {\n lazy: () => import('./components/SearchResult').then(m => m.SearchResult),\n },\n }),\n);\n\n/**\n * @deprecated This component was used for rapid prototyping of the Backstage\n * Search platform. Now that the API has stabilized, you should use the\n * <SearchResult /> component instead. This component will be removed in an\n * upcoming release.\n */\nexport const SearchResultNext = searchPlugin.provide(\n createComponentExtension({\n name: 'SearchResultNext',\n component: {\n lazy: () => import('./components/SearchResult').then(m => m.SearchResult),\n },\n }),\n);\n\nexport const SidebarSearchModal = searchPlugin.provide(\n createComponentExtension({\n name: 'SidebarSearchModal',\n component: {\n lazy: () =>\n import('./components/SidebarSearchModal').then(\n m => m.SidebarSearchModal,\n ),\n },\n }),\n);\n\nexport const DefaultResultListItem = searchPlugin.provide(\n createComponentExtension({\n name: 'DefaultResultListItem',\n component: {\n lazy: () =>\n import('./components/DefaultResultListItem').then(\n m => m.DefaultResultListItem,\n ),\n },\n }),\n);\n\nexport const HomePageSearchBar = searchPlugin.provide(\n createComponentExtension({\n name: 'HomePageSearchBar',\n component: {\n lazy: () =>\n import('./components/HomePageComponent').then(m => m.HomePageSearchBar),\n },\n }),\n);\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n Divider,\n Grid,\n List,\n Paper,\n useTheme,\n} from '@material-ui/core';\nimport LaunchIcon from '@material-ui/icons/Launch';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { SearchBar } from '../SearchBar';\nimport { DefaultResultListItem } from '../DefaultResultListItem';\nimport { SearchResult } from '../SearchResult';\nimport { SearchContextProvider, useSearch } from '../SearchContext';\nimport { SearchResultPager } from '../SearchResultPager';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { Link, useContent } from '@backstage/core-components';\nimport { rootRouteRef } from '../../plugin';\n\nexport interface SearchModalProps {\n /**\n * If true, it renders the modal.\n */\n open?: boolean;\n /**\n * This is supposed to be used together with the open prop.\n * If `hidden` is true, it hides the modal.\n * If `open` is false, the value of `hidden` has no effect on the modal.\n * Use `open` for controlling whether the modal should be rendered or not.\n */\n hidden?: boolean;\n /**\n * a function invoked when a search item is pressed or when the dialog\n * should be closed.\n */\n toggleModal: () => void;\n}\n\nconst useStyles = makeStyles(theme => ({\n container: {\n borderRadius: 30,\n display: 'flex',\n height: '2.4em',\n },\n input: {\n flex: 1,\n },\n // Reduces default height of the modal, keeping a gap of 128px between the top and bottom of the page.\n paperFullWidth: { height: 'calc(100% - 128px)' },\n dialogActionsContainer: { padding: theme.spacing(1, 3) },\n viewResultsLink: { verticalAlign: '0.5em' },\n}));\n\nexport const Modal = ({ toggleModal }: SearchModalProps) => {\n const getSearchLink = useRouteRef(rootRouteRef);\n const classes = useStyles();\n\n const { term } = useSearch();\n const { focusContent } = useContent();\n const { transitions } = useTheme();\n\n const handleResultClick = () => {\n toggleModal();\n setTimeout(focusContent, transitions.duration.leavingScreen);\n };\n\n const handleKeyPress = () => {\n handleResultClick();\n };\n\n return (\n <>\n <DialogTitle>\n <Paper className={classes.container}>\n <SearchBar className={classes.input} />\n </Paper>\n </DialogTitle>\n <DialogContent>\n <Grid\n container\n direction=\"row-reverse\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n >\n <Grid item>\n <Link\n onClick={() => {\n toggleModal();\n setTimeout(focusContent, transitions.duration.leavingScreen);\n }}\n to={`${getSearchLink()}?query=${term}`}\n >\n <span className={classes.viewResultsLink}>View Full Results</span>\n <LaunchIcon color=\"primary\" />\n </Link>\n </Grid>\n </Grid>\n <Divider />\n <SearchResult>\n {({ results }) => (\n <List>\n {results.map(({ document }) => (\n <div\n role=\"button\"\n tabIndex={0}\n key={`${document.location}-btn`}\n onClick={handleResultClick}\n onKeyPress={handleKeyPress}\n >\n <DefaultResultListItem\n key={document.location}\n result={document}\n />\n </div>\n ))}\n </List>\n )}\n </SearchResult>\n </DialogContent>\n <DialogActions className={classes.dialogActionsContainer}>\n <Grid container direction=\"row\">\n <Grid item xs={12}>\n <SearchResultPager />\n </Grid>\n </Grid>\n </DialogActions>\n </>\n );\n};\n\nexport const SearchModal = ({\n open = true,\n hidden,\n toggleModal,\n}: SearchModalProps) => {\n const classes = useStyles();\n\n return (\n <Dialog\n classes={{\n paperFullWidth: classes.paperFullWidth,\n }}\n onClose={toggleModal}\n aria-labelledby=\"search-modal-title\"\n fullWidth\n maxWidth=\"lg\"\n open={open}\n hidden={hidden}\n >\n {open && (\n <SearchContextProvider>\n <Modal toggleModal={toggleModal} />\n </SearchContextProvider>\n )}\n </Dialog>\n );\n};\n","/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, useState } from 'react';\n\n/**\n * Use this hook to manage the state of {@link SearchModal}\n * and change its visibility.\n *\n * @public\n *\n * @param initialState - pass `true` to make the modal initially visible\n * @returns an object containing the state of the modal together with\n * functions for changing the visibility of the modal.\n */\nexport function useSearchModal(initialState = false) {\n const [state, setState] = useState({\n hidden: !initialState,\n open: initialState,\n });\n\n const toggleModal = useCallback(\n () =>\n setState(prevState => ({\n open: true,\n hidden: !prevState.hidden,\n })),\n [],\n );\n\n const setOpen = useCallback(\n (open: boolean) =>\n setState(prevState => ({\n open: prevState.open || open,\n hidden: !open,\n })),\n [],\n );\n\n return { state, toggleModal, setOpen };\n}\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { Paper } from '@material-ui/core';\nimport InputBase from '@material-ui/core/InputBase';\nimport IconButton from '@material-ui/core/IconButton';\nimport SearchIcon from '@material-ui/icons/Search';\nimport ClearButton from '@material-ui/icons/Clear';\n\nconst useStyles = makeStyles(() => ({\n root: {\n display: 'flex',\n alignItems: 'center',\n },\n input: {\n flex: 1,\n },\n}));\n\ntype SearchBarProps = {\n searchQuery: string;\n handleSearch: any;\n handleClearSearchBar: any;\n};\n\nexport const SearchBar = ({\n searchQuery,\n handleSearch,\n handleClearSearchBar,\n}: SearchBarProps) => {\n const classes = useStyles();\n\n return (\n <Paper\n component=\"form\"\n onSubmit={e => handleSearch(e)}\n className={classes.root}\n >\n <IconButton disabled type=\"submit\" aria-label=\"search\">\n <SearchIcon />\n </IconButton>\n <InputBase\n className={classes.input}\n placeholder=\"Search in Backstage\"\n value={searchQuery}\n onChange={e => handleSearch(e)}\n inputProps={{ 'aria-label': 'search backstage' }}\n />\n <IconButton aria-label=\"search\" onClick={() => handleClearSearchBar()}>\n <ClearButton />\n </IconButton>\n </Paper>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport { makeStyles, IconButton, Typography } from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n width: '250px',\n display: 'flex',\n },\n icon: {\n margin: theme.spacing(-1, 0, 0, 0),\n },\n}));\n\ntype FiltersButtonProps = {\n numberOfSelectedFilters: number;\n handleToggleFilters: () => void;\n};\n\nexport const FiltersButton = ({\n numberOfSelectedFilters,\n handleToggleFilters,\n}: FiltersButtonProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.filters}>\n <IconButton\n className={classes.icon}\n aria-label=\"settings\"\n onClick={handleToggleFilters}\n >\n <FilterListIcon />\n </IconButton>\n <Typography variant=\"h6\">\n Filters ({numberOfSelectedFilters ? numberOfSelectedFilters : 0})\n </Typography>\n </div>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React from 'react';\nimport {\n makeStyles,\n Typography,\n Divider,\n Card,\n CardHeader,\n Button,\n CardContent,\n Select,\n Checkbox,\n List,\n ListItem,\n ListItemText,\n MenuItem,\n} from '@material-ui/core';\n\nconst useStyles = makeStyles(theme => ({\n filters: {\n background: 'transparent',\n boxShadow: '0px 0px 0px 0px',\n },\n checkbox: {\n padding: theme.spacing(0, 1, 0, 1),\n },\n dropdown: {\n width: '100%',\n },\n}));\n\nexport type FiltersState = {\n selected: string;\n checked: Array<string>;\n};\n\nexport type FilterOptions = {\n kind: Array<string>;\n lifecycle: Array<string>;\n};\n\ntype FiltersProps = {\n filters: FiltersState;\n filterOptions: FilterOptions;\n resetFilters: () => void;\n updateSelected: (filter: string) => void;\n updateChecked: (filter: string) => void;\n};\n\nexport const Filters = ({\n filters,\n filterOptions,\n resetFilters,\n updateSelected,\n updateChecked,\n}: FiltersProps) => {\n const classes = useStyles();\n\n return (\n <Card className={classes.filters}>\n <CardHeader\n title={<Typography variant=\"h6\">Filters</Typography>}\n action={\n <Button color=\"primary\" onClick={() => resetFilters()}>\n CLEAR ALL\n </Button>\n }\n />\n <Divider />\n {filterOptions.kind.length === 0 && filterOptions.lifecycle.length === 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">\n Filters cannot be applied to available results\n </Typography>\n </CardContent>\n )}\n {filterOptions.kind.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Kind</Typography>\n <Select\n id=\"outlined-select\"\n onChange={(e: React.ChangeEvent<any>) =>\n updateSelected(e?.target?.value)\n }\n variant=\"outlined\"\n className={classes.dropdown}\n value={filters.selected}\n >\n {filterOptions.kind.map(filter => (\n <MenuItem\n selected={filter === ''}\n dense\n key={filter}\n value={filter}\n >\n {filter}\n </MenuItem>\n ))}\n </Select>\n </CardContent>\n )}\n {filterOptions.lifecycle.length > 0 && (\n <CardContent>\n <Typography variant=\"subtitle2\">Lifecycle</Typography>\n <List disablePadding dense>\n {filterOptions.lifecycle.map(filter => (\n <ListItem\n key={filter}\n dense\n button\n onClick={() => updateChecked(filter)}\n >\n <Checkbox\n edge=\"start\"\n disableRipple\n className={classes.checkbox}\n color=\"primary\"\n checked={filters.checked.includes(filter)}\n tabIndex={-1}\n value={filter}\n name={filter}\n />\n <ListItemText id={filter} primary={filter} />\n </ListItem>\n ))}\n </List>\n </CardContent>\n )}\n </Card>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Divider, Grid, makeStyles, Typography } from '@material-ui/core';\nimport { Alert } from '@material-ui/lab';\nimport React, { useEffect, useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport { Filters, FiltersButton, FiltersState } from './Filters';\nimport { Entity, DEFAULT_NAMESPACE } from '@backstage/catalog-model';\n\nimport {\n EmptyState,\n Link,\n Progress,\n Table,\n TableColumn,\n} from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\n\ntype Result = {\n name: string;\n description: string | undefined;\n owner: string | undefined;\n kind: string;\n lifecycle: string | undefined;\n url: string;\n};\ntype SearchResults = Array<Result>;\n\nconst useStyles = makeStyles(theme => ({\n searchQuery: {\n color: theme.palette.text.primary,\n background: theme.palette.background.default,\n borderRadius: '10%',\n },\n tableHeader: {\n margin: theme.spacing(1, 0, 0, 0),\n display: 'flex',\n },\n divider: {\n width: '1px',\n margin: theme.spacing(0, 2),\n padding: theme.spacing(2, 0),\n },\n}));\n\ntype SearchResultProps = {\n searchQuery?: string;\n};\n\ntype TableHeaderProps = {\n searchQuery?: string;\n numberOfSelectedFilters: number;\n numberOfResults: number;\n handleToggleFilters: () => void;\n};\n\n// TODO: move out column to make the search result component more generic\nconst columns: TableColumn[] = [\n {\n title: 'Name',\n field: 'name',\n highlight: true,\n render: (result: Partial<Result>) => (\n <Link to={result.url || ''}>{result.name}</Link>\n ),\n },\n {\n title: 'Description',\n field: 'description',\n },\n {\n title: 'Owner',\n field: 'owner',\n },\n {\n title: 'Kind',\n field: 'kind',\n },\n {\n title: 'LifeCycle',\n field: 'lifecycle',\n },\n];\n\nconst TableHeader = ({\n searchQuery,\n numberOfSelectedFilters,\n numberOfResults,\n handleToggleFilters,\n}: TableHeaderProps) => {\n const classes = useStyles();\n\n return (\n <div className={classes.tableHeader}>\n <FiltersButton\n numberOfSelectedFilters={numberOfSelectedFilters}\n handleToggleFilters={handleToggleFilters}\n />\n <Divider className={classes.divider} orientation=\"vertical\" />\n <Grid item xs={12}>\n {searchQuery ? (\n <Typography variant=\"h6\">\n {`${numberOfResults} `}\n {numberOfResults > 1 ? `results for ` : `result for `}\n <span className={classes.searchQuery}>\"{searchQuery}\"</span>{' '}\n </Typography>\n ) : (\n <Typography variant=\"h6\">{`${numberOfResults} results`}</Typography>\n )}\n </Grid>\n </div>\n );\n};\n\nexport const SearchResult = ({ searchQuery }: SearchResultProps) => {\n const catalogApi = useApi(catalogApiRef);\n\n const [showFilters, toggleFilters] = useState(false);\n const [selectedFilters, setSelectedFilters] = useState<FiltersState>({\n selected: '',\n checked: [],\n });\n\n const [filteredResults, setFilteredResults] = useState<SearchResults>([]);\n\n const {\n loading,\n error,\n value: results,\n } = useAsync(async () => {\n const entities = await catalogApi.getEntities();\n return entities.items.map((entity: Entity) => ({\n name: entity.metadata.name,\n description: entity.metadata.description,\n owner:\n typeof entity.spec?.owner === 'string' ? entity.spec?.owner : undefined,\n kind: entity.kind,\n lifecycle:\n typeof entity.spec?.lifecycle === 'string'\n ? entity.spec?.lifecycle\n : undefined,\n url: `/catalog/${\n entity.metadata.namespace?.toLocaleLowerCase('en-US') ||\n DEFAULT_NAMESPACE\n }/${entity.kind.toLocaleLowerCase('en-US')}/${entity.metadata.name}`,\n }));\n }, []);\n\n useEffect(() => {\n if (results) {\n let withFilters = results;\n\n // apply filters\n\n // filter on selected\n if (selectedFilters.selected !== '') {\n withFilters = results.filter((result: Result) =>\n selectedFilters.selected.includes(result.kind),\n );\n }\n\n // filter on checked\n if (selectedFilters.checked.length > 0) {\n withFilters = withFilters.filter(\n (result: Result) =>\n result.lifecycle &&\n selectedFilters.checked.includes(result.lifecycle),\n );\n }\n\n // filter on searchQuery\n if (searchQuery) {\n withFilters = withFilters.filter(\n (result: Result) =>\n result.name?.toLocaleLowerCase('en-US').includes(searchQuery) ||\n result.name\n ?.toLocaleLowerCase('en-US')\n .includes(searchQuery.split(' ').join('-')) ||\n result.description\n ?.toLocaleLowerCase('en-US')\n .includes(searchQuery),\n );\n }\n\n setFilteredResults(withFilters);\n }\n }, [selectedFilters, searchQuery, results]);\n if (loading) {\n return <Progress />;\n }\n if (error) {\n return (\n <Alert severity=\"error\">\n Error encountered while fetching search results. {error.toString()}\n </Alert>\n );\n }\n if (!results || results.length === 0) {\n return <EmptyState missing=\"data\" title=\"Sorry, no results were found\" />;\n }\n\n const resetFilters = () => {\n setSelectedFilters({\n selected: '',\n checked: [],\n });\n };\n\n const updateSelected = (filter: string) => {\n setSelectedFilters(prevState => ({\n ...prevState,\n selected: filter,\n }));\n };\n\n const updateChecked = (filter: string) => {\n if (selectedFilters.checked.includes(filter)) {\n setSelectedFilters(prevState => ({\n ...prevState,\n checked: prevState.checked.filter(item => item !== filter),\n }));\n return;\n }\n\n setSelectedFilters(prevState => ({\n ...prevState,\n checked: [...prevState.checked, filter],\n }));\n };\n\n const filterOptions = results.reduce(\n (acc, curr) => {\n if (curr.kind && acc.kind.indexOf(curr.kind) < 0) {\n acc.kind.push(curr.kind);\n }\n if (curr.lifecycle && acc.lifecycle.indexOf(curr.lifecycle) < 0) {\n acc.lifecycle.push(curr.lifecycle);\n }\n return acc;\n },\n {\n kind: [] as Array<string>,\n lifecycle: [] as Array<string>,\n },\n );\n\n return (\n <>\n <Grid container>\n {showFilters && (\n <Grid item xs={3}>\n <Filters\n filters={selectedFilters}\n filterOptions={filterOptions}\n resetFilters={resetFilters}\n updateSelected={updateSelected}\n updateChecked={updateChecked}\n />\n </Grid>\n )}\n <Grid item xs={showFilters ? 9 : 12}>\n <Table\n options={{ paging: true, pageSize: 20, search: false }}\n data={filteredResults}\n columns={columns}\n title={\n <TableHeader\n searchQuery={searchQuery}\n numberOfResults={filteredResults.length}\n numberOfSelectedFilters={\n (selectedFilters.selected !== '' ? 1 : 0) +\n selectedFilters.checked.length\n }\n handleToggleFilters={() => toggleFilters(!showFilters)}\n />\n }\n />\n </Grid>\n </Grid>\n </>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Grid } from '@material-ui/core';\nimport React, { useEffect, useState } from 'react';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { SearchBar } from './LegacySearchBar';\nimport { SearchResult } from './LegacySearchResult';\nimport {\n Content,\n Header,\n Page,\n useQueryParamState,\n} from '@backstage/core-components';\n\n/**\n * @deprecated This SearchPage, powered directly by the Catalog API, will be\n * removed from a future release of this plugin.\n */\nexport const LegacySearchPage = () => {\n const [queryString, setQueryString] = useQueryParamState<string>('query');\n const [searchQuery, setSearchQuery] = useState(queryString ?? '');\n\n const handleSearch = (event: React.ChangeEvent<HTMLInputElement>) => {\n event.preventDefault();\n setSearchQuery(event.target.value);\n };\n\n useEffect(() => setSearchQuery(queryString ?? ''), [queryString]);\n\n useDebounce(\n () => {\n setQueryString(searchQuery);\n },\n 200,\n [searchQuery],\n );\n\n const handleClearSearchBar = () => {\n setSearchQuery('');\n };\n\n return (\n <Page themeId=\"home\">\n <Header title=\"Search\" />\n <Content>\n <Grid container direction=\"row\">\n <Grid item xs={12}>\n <SearchBar\n handleSearch={handleSearch}\n handleClearSearchBar={handleClearSearchBar}\n searchQuery={searchQuery}\n />\n </Grid>\n <Grid item xs={12}>\n <SearchResult\n searchQuery={(queryString ?? '').toLocaleLowerCase('en-US')}\n />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport usePrevious from 'react-use/lib/usePrevious';\nimport qs from 'qs';\nimport { useLocation, useOutlet } from 'react-router';\nimport { SearchContextProvider, useSearch } from '../SearchContext';\nimport { JsonObject } from '@backstage/types';\nimport { LegacySearchPage } from '../LegacySearchPage';\n\nexport const UrlUpdater = () => {\n const location = useLocation();\n const {\n term,\n setTerm,\n types,\n setTypes,\n pageCursor,\n setPageCursor,\n filters,\n setFilters,\n } = useSearch();\n\n const prevQueryParams = usePrevious(location.search);\n useEffect(() => {\n // Only respond to changes to url query params\n if (location.search === prevQueryParams) {\n return;\n }\n\n const query =\n qs.parse(location.search.substring(1), { arrayLimit: 0 }) || {};\n\n if (query.filters) {\n setFilters(query.filters as JsonObject);\n }\n\n if (query.query) {\n setTerm(query.query as string);\n }\n\n if (query.pageCursor) {\n setPageCursor(query.pageCursor as string);\n }\n\n if (query.types) {\n setTypes(query.types as string[]);\n }\n }, [prevQueryParams, location, setTerm, setTypes, setPageCursor, setFilters]);\n\n useEffect(() => {\n const newParams = qs.stringify(\n {\n query: term,\n types,\n pageCursor,\n filters,\n },\n { arrayFormat: 'brackets' },\n );\n const newUrl = `${window.location.pathname}?${newParams}`;\n\n // We directly manipulate window history here in order to not re-render\n // infinitely (state => location => state => etc). The intention of this\n // code is just to ensure the right query/filters are loaded when a user\n // clicks the \"back\" button after clicking a result.\n window.history.replaceState(null, document.title, newUrl);\n }, [term, types, pageCursor, filters]);\n\n return null;\n};\n\nexport const SearchPage = () => {\n const outlet = useOutlet();\n\n return (\n <SearchContextProvider>\n <UrlUpdater />\n {outlet || <LegacySearchPage />}\n </SearchContextProvider>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { cloneElement, Fragment, useEffect, useState } from 'react';\nimport { useSearch } from '../SearchContext';\nimport {\n Accordion,\n AccordionSummary,\n AccordionDetails,\n Card,\n CardContent,\n CardHeader,\n Divider,\n List,\n ListItem,\n ListItemIcon,\n ListItemText,\n makeStyles,\n} from '@material-ui/core';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport AllIcon from '@material-ui/icons/FontDownload';\n\nconst useStyles = makeStyles(theme => ({\n card: {\n backgroundColor: 'rgba(0, 0, 0, .11)',\n },\n cardContent: {\n paddingTop: theme.spacing(1),\n },\n icon: {\n color: theme.palette.common.black,\n },\n list: {\n width: '100%',\n },\n listItemIcon: {\n width: '24px',\n height: '24px',\n },\n accordion: {\n backgroundColor: theme.palette.background.paper,\n },\n accordionSummary: {\n minHeight: 'auto',\n '&.Mui-expanded': {\n minHeight: 'auto',\n },\n },\n accordionSummaryContent: {\n margin: theme.spacing(2, 0),\n '&.Mui-expanded': {\n margin: theme.spacing(2, 0),\n },\n },\n accordionDetails: {\n padding: theme.spacing(0, 0, 1),\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeAccordionProps = {\n name: string;\n types: Array<{\n value: string;\n name: string;\n icon: JSX.Element;\n }>;\n defaultValue?: string;\n};\n\nexport const SearchTypeAccordion = (props: SearchTypeAccordionProps) => {\n const classes = useStyles();\n const { setPageCursor, setTypes, types } = useSearch();\n const [expanded, setExpanded] = useState(true);\n const { defaultValue, name, types: givenTypes } = props;\n\n const toggleExpanded = () => setExpanded(prevState => !prevState);\n const handleClick = (type: string) => {\n return () => {\n setTypes(type !== '' ? [type] : []);\n setPageCursor(undefined);\n setExpanded(false);\n };\n };\n\n // Handle any provided defaultValue\n useEffect(() => {\n if (defaultValue) {\n setTypes([defaultValue]);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const definedTypes = [\n {\n value: '',\n name: 'All',\n icon: <AllIcon />,\n },\n ...givenTypes,\n ];\n const selected = types[0] || '';\n\n return (\n <Card className={classes.card}>\n <CardHeader title={name} titleTypographyProps={{ variant: 'overline' }} />\n <CardContent className={classes.cardContent}>\n <Accordion\n className={classes.accordion}\n expanded={expanded}\n onChange={toggleExpanded}\n >\n <AccordionSummary\n classes={{\n root: classes.accordionSummary,\n content: classes.accordionSummaryContent,\n }}\n expandIcon={<ExpandMoreIcon className={classes.icon} />}\n IconButtonProps={{ size: 'small' }}\n >\n {expanded\n ? 'Collapse'\n : definedTypes.filter(t => t.value === selected)[0]!.name}\n </AccordionSummary>\n <AccordionDetails classes={{ root: classes.accordionDetails }}>\n <List\n className={classes.list}\n component=\"nav\"\n aria-label=\"filter by type\"\n disablePadding\n dense\n >\n {definedTypes.map(type => (\n <Fragment key={type.value}>\n <Divider />\n <ListItem\n selected={\n types[0] === type.value ||\n (types.length === 0 && type.value === '')\n }\n onClick={handleClick(type.value)}\n button\n >\n <ListItemIcon>\n {cloneElement(type.icon, {\n className: classes.listItemIcon,\n })}\n </ListItemIcon>\n <ListItemText primary={type.name} />\n </ListItem>\n </Fragment>\n ))}\n </List>\n </AccordionDetails>\n </Accordion>\n </CardContent>\n </Card>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport React, { useEffect } from 'react';\nimport { useSearch } from '../SearchContext';\nimport { BackstageTheme } from '@backstage/theme';\nimport { makeStyles, Tab, Tabs } from '@material-ui/core';\n\nconst useStyles = makeStyles((theme: BackstageTheme) => ({\n tabs: {\n borderBottom: `1px solid ${theme.palette.textVerySubtle}`,\n padding: theme.spacing(0, 4),\n },\n tab: {\n height: '50px',\n fontWeight: theme.typography.fontWeightBold,\n fontSize: theme.typography.pxToRem(13),\n color: theme.palette.textSubtle,\n minWidth: '130px',\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeTabsProps = {\n types: Array<{\n value: string;\n name: string;\n }>;\n defaultValue?: string;\n};\n\nexport const SearchTypeTabs = (props: SearchTypeTabsProps) => {\n const classes = useStyles();\n const { setPageCursor, setTypes, types } = useSearch();\n const { defaultValue, types: givenTypes } = props;\n\n const changeTab = (_: React.ChangeEvent<{}>, newType: string) => {\n setTypes(newType !== '' ? [newType] : []);\n setPageCursor(undefined);\n };\n\n // Handle any provided defaultValue\n useEffect(() => {\n if (defaultValue) {\n setTypes([defaultValue]);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const definedTypes = [\n {\n value: '',\n name: 'All',\n },\n ...givenTypes,\n ];\n\n return (\n <Tabs\n className={classes.tabs}\n indicatorColor=\"primary\"\n value={types.length === 0 ? '' : types[0]}\n onChange={changeTab}\n >\n {definedTypes.map(type => (\n <Tab\n className={classes.tab}\n disableRipple\n label={type.name}\n value={type.value}\n />\n ))}\n </Tabs>\n );\n};\n","/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n Checkbox,\n Chip,\n FormControl,\n InputLabel,\n ListItemText,\n makeStyles,\n MenuItem,\n Select,\n} from '@material-ui/core';\nimport React, { ChangeEvent } from 'react';\nimport useEffectOnce from 'react-use/lib/useEffectOnce';\nimport {\n SearchTypeAccordion,\n SearchTypeAccordionProps,\n} from './SearchType.Accordion';\nimport { SearchTypeTabs, SearchTypeTabsProps } from './SearchType.Tabs';\nimport { useSearch } from '../SearchContext';\n\nconst useStyles = makeStyles(theme => ({\n label: {\n textTransform: 'capitalize',\n },\n chips: {\n display: 'flex',\n flexWrap: 'wrap',\n marginTop: theme.spacing(1),\n },\n chip: {\n margin: 2,\n },\n}));\n\n/**\n * @public\n */\nexport type SearchTypeProps = {\n className?: string;\n name: string;\n values?: string[];\n defaultValue?: string[] | string | null;\n};\n\nconst SearchType = (props: SearchTypeProps) => {\n const { className, defaultValue, name, values = [] } = props;\n const classes = useStyles();\n const { types, setTypes } = useSearch();\n\n useEffectOnce(() => {\n if (!types.length) {\n if (defaultValue && Array.isArray(defaultValue)) {\n setTypes(defaultValue);\n } else if (defaultValue) {\n setTypes([defaultValue]);\n }\n }\n });\n\n const handleChange = (e: ChangeEvent<{ value: unknown }>) => {\n const value = e.target.value as string[];\n setTypes(value as string[]);\n };\n\n return (\n <FormControl\n className={className}\n variant=\"filled\"\n fullWidth\n data-testid=\"search-typefilter-next\"\n >\n <InputLabel className={classes.label} margin=\"dense\">\n {name}\n </InputLabel>\n <Select\n multiple\n variant=\"outlined\"\n value={types}\n onChange={handleChange}\n placeholder=\"All Results\"\n renderValue={selected => (\n <div className={classes.chips}>\n {(selected as string[]).map(value => (\n <Chip\n key={value}\n label={value}\n className={classes.chip}\n size=\"small\"\n />\n ))}\n </div>\n )}\n >\n {values.map((value: string) => (\n <MenuItem key={value} value={value}>\n <Checkbox checked={types.indexOf(value) > -1} />\n <ListItemText primary={value} />\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n );\n};\n\n/**\n * A control surface for the search query's \"types\" property, displayed as a\n * single-select collapsible accordion suitable for use in faceted search UIs.\n * @public\n */\nSearchType.Accordion = (props: SearchTypeAccordionProps) => {\n return <SearchTypeAccordion {...props} />;\n};\n\n/**\n * A control surface for the search query's \"types\" property, displayed as a\n * tabs suitable for use in faceted search UIs.\n * @public\n */\nSearchType.Tabs = (props: SearchTypeTabsProps) => {\n return <SearchTypeTabs {...props} />;\n};\n\nexport { SearchType };\nexport type { SearchTypeAccordionProps, SearchTypeTabsProps };\n","/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport qs from 'qs';\nimport React, { useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { rootRouteRef } from '../../plugin';\n\nimport { useRouteRef, IconComponent } from '@backstage/core-plugin-api';\nimport { SidebarSearchField, useContent } from '@backstage/core-components';\n\nexport type SidebarSearchProps = {\n icon?: IconComponent;\n};\n\nexport const SidebarSearch = (props: SidebarSearchProps) => {\n const searchRoute = useRouteRef(rootRouteRef);\n const { focusContent } = useContent();\n const navigate = useNavigate();\n const handleSearch = useCallback(\n (query: string): void => {\n const queryString = qs.stringify({ query }, { addQueryPrefix: true });\n focusContent();\n navigate(`${searchRoute()}${queryString}`);\n },\n [focusContent, navigate, searchRoute],\n );\n\n return (\n <SidebarSearchField\n icon={props.icon}\n onSearch={handleSearch}\n to=\"/search\"\n />\n );\n};\n"],"names":["useStyles","FiltersButton","Filters","SearchBar","DefaultResultListItem","SearchPage","SearchResult","makeStyles","IconButton","InputBase"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-6dc0dac9.esm.js","sources":["../../src/components/SidebarSearchModal/SidebarSearchModal.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport SearchIcon from '@material-ui/icons/Search';\nimport { SidebarItem } from '@backstage/core-components';\nimport { IconComponent } from '@backstage/core-plugin-api';\nimport { SearchModal, useSearchModal } from '../SearchModal';\n\nexport type SidebarSearchModalProps = {\n icon?: IconComponent;\n};\n\nexport const SidebarSearchModal = (props: SidebarSearchModalProps) => {\n const { state, toggleModal } = useSearchModal();\n const Icon = props.icon ? props.icon : SearchIcon;\n\n return (\n <>\n <SidebarItem\n className=\"search-icon\"\n icon={Icon}\n text=\"Search\"\n onClick={toggleModal}\n />\n <SearchModal {...state} toggleModal={toggleModal} />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBa,MAAA,kBAAA,GAAqB,CAAC,KAAmC,KAAA;AACpE,EAAM,MAAA,EAAE,KAAO,EAAA,WAAA,EAAA,GAAgB,cAAe,EAAA,CAAA;AAC9C,EAAA,MAAM,IAAO,GAAA,KAAA,CAAM,IAAO,GAAA,KAAA,CAAM,IAAO,GAAA,UAAA,CAAA;AAEvC,EAAA,iFAEK,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA;AAAA,IACC,SAAU,EAAA,aAAA;AAAA,IACV,IAAM,EAAA,IAAA;AAAA,IACN,IAAK,EAAA,QAAA;AAAA,IACL,OAAS,EAAA,WAAA;AAAA,GACX,mBACC,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA;AAAA,IAAgB,GAAA,KAAA;AAAA,IAAO,WAAA;AAAA,GAA0B,CACpD,CAAA,CAAA;AAEJ;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-c59968b8.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-ecefd17e.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}