import * as React from 'react'; import * as QueryString from 'query-string'; import { useHistory, useLocation } from 'react-router'; import { Affix, Col, Row, Tabs, Layout } from 'antd'; import { SearchablePage } from './SearchablePage'; import { fromCollectionName, fromPathName, toCollectionName, toPathName } from '../shared/EntityTypeUtil'; import { useGetSearchResultsQuery } from '../../graphql/search.generated'; import { SearchResults } from './SearchResults'; import { PlatformNativeType } from '../../types.generated'; import { SearchFilters } from './SearchFilters'; import { SearchCfg } from '../../conf'; import { PageRoutes } from '../../conf/Global'; const { SEARCHABLE_ENTITY_TYPES, RESULTS_PER_PAGE } = SearchCfg; /** * A dedicated search page. * * TODO: Read / write filter parameters from the URL query parameters. */ export const SearchPage = () => { const history = useHistory(); const location = useLocation(); const params = QueryString.parse(location.search); const typeParam = params.type ? fromPathName(params.type as string) : SEARCHABLE_ENTITY_TYPES[0]; const queryParam = params.query ? (params.query as string) : ''; const pageParam = params.page && Number(params.page as string) > 0 ? Number(params.page as string) : 1; const filtersParam = location.state ? ((location.state as any).filters as Array<{ field: string; value: string }>) : []; const { loading, error, data } = useGetSearchResultsQuery({ variables: { input: { type: typeParam, query: queryParam, start: (pageParam - 1) * RESULTS_PER_PAGE, count: RESULTS_PER_PAGE, filters: filtersParam, }, }, }); const onSearchTypeChange = (newType: string) => { const entityType = fromCollectionName(newType); history.push({ pathname: PageRoutes.SEARCH, search: `?type=${toPathName(entityType)}&query=${queryParam}&page=1`, }); }; const onFilterSelect = (selected: boolean, field: string, value: string) => { const newFilters = selected ? [...filtersParam, { field, value }] : filtersParam.filter((filter) => filter.field !== field || filter.value !== value); history.push({ pathname: PageRoutes.SEARCH, search: `?type=${toPathName(typeParam)}&query=${queryParam}&page=1`, state: { filters: newFilters, }, }); }; const onResultsPageChange = (page: number) => { return history.push({ pathname: PageRoutes.SEARCH, search: `?type=${toPathName(typeParam)}&query=${queryParam}&page=${page}`, state: { filters: [...filtersParam], }, }); }; const navigateToDataset = (urn: string) => { return history.push({ pathname: `${PageRoutes.DATASETS}/${urn}`, state: { filters: [...filtersParam], }, }); }; const toDatasetSearchResult = (dataset: { urn: string; name: string; origin: string; description: string; platformNativeType: PlatformNativeType; }) => { return { title: (
Loading results...
} {error && !data &&Search error!
} {data && data?.search && (