mirror of
https://github.com/datahub-project/datahub.git
synced 2025-11-10 08:21:21 +00:00
feat(search): support only searching by quick filter (#7997)
This commit is contained in:
parent
a9bf1abaf8
commit
bb9b981eb3
@ -157,9 +157,8 @@ export const HomePageHeader = () => {
|
|||||||
}, [suggestionsData]);
|
}, [suggestionsData]);
|
||||||
|
|
||||||
const onSearch = (query: string, type?: EntityType, filters?: FacetFilterInput[]) => {
|
const onSearch = (query: string, type?: EntityType, filters?: FacetFilterInput[]) => {
|
||||||
if (!query || query.trim().length === 0) {
|
if (!query.trim() && !selectedQuickFilter) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
analytics.event({
|
analytics.event({
|
||||||
type: EventType.HomePageSearchEvent,
|
type: EventType.HomePageSearchEvent,
|
||||||
query,
|
query,
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import React, { useEffect, useMemo, useState, useRef, useCallback } from 'react';
|
import React, { useEffect, useMemo, useState, useRef, useCallback } from 'react';
|
||||||
import { Input, AutoComplete, Typography, Button } from 'antd';
|
import { Input, AutoComplete, Button } from 'antd';
|
||||||
import { CloseCircleFilled, SearchOutlined } from '@ant-design/icons';
|
import { CloseCircleFilled, SearchOutlined } from '@ant-design/icons';
|
||||||
import styled from 'styled-components/macro';
|
import styled from 'styled-components/macro';
|
||||||
import { useHistory } from 'react-router';
|
import { useHistory } from 'react-router';
|
||||||
@ -10,7 +10,7 @@ import { ANTD_GRAY } from '../entity/shared/constants';
|
|||||||
import { getEntityPath } from '../entity/shared/containers/profile/utils';
|
import { getEntityPath } from '../entity/shared/containers/profile/utils';
|
||||||
import { EXACT_SEARCH_PREFIX } from './utils/constants';
|
import { EXACT_SEARCH_PREFIX } from './utils/constants';
|
||||||
import { useListRecommendationsQuery } from '../../graphql/recommendations.generated';
|
import { useListRecommendationsQuery } from '../../graphql/recommendations.generated';
|
||||||
import AutoCompleteItem, { SuggestionContainer } from './autoComplete/AutoCompleteItem';
|
import AutoCompleteItem from './autoComplete/AutoCompleteItem';
|
||||||
import { useQuickFiltersContext } from '../../providers/QuickFiltersContext';
|
import { useQuickFiltersContext } from '../../providers/QuickFiltersContext';
|
||||||
import QuickFilters from './autoComplete/quickFilters/QuickFilters';
|
import QuickFilters from './autoComplete/quickFilters/QuickFilters';
|
||||||
import { getFiltersWithQuickFilter } from './utils/filterUtils';
|
import { getFiltersWithQuickFilter } from './utils/filterUtils';
|
||||||
@ -20,16 +20,8 @@ import RecommendedOption from './autoComplete/RecommendedOption';
|
|||||||
import SectionHeader, { EntityTypeLabel } from './autoComplete/SectionHeader';
|
import SectionHeader, { EntityTypeLabel } from './autoComplete/SectionHeader';
|
||||||
import { useUserContext } from '../context/useUserContext';
|
import { useUserContext } from '../context/useUserContext';
|
||||||
import { navigateToSearchUrl } from './utils/navigateToSearchUrl';
|
import { navigateToSearchUrl } from './utils/navigateToSearchUrl';
|
||||||
|
import { getQuickFilterDetails } from './autoComplete/quickFilters/utils';
|
||||||
const ExploreForEntity = styled.span`
|
import ViewAllSearchItem from './ViewAllSearchItem';
|
||||||
font-weight: light;
|
|
||||||
font-size: 16px;
|
|
||||||
padding: 5px 0;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const ExploreForEntityText = styled.span`
|
|
||||||
margin-left: 10px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const StyledAutoComplete = styled(AutoComplete)`
|
const StyledAutoComplete = styled(AutoComplete)`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -190,28 +182,25 @@ export const SearchBar = ({
|
|||||||
return [...moduleOptions, exploreAllOption];
|
return [...moduleOptions, exploreAllOption];
|
||||||
}, [data?.listRecommendations?.modules, onClickExploreAll]);
|
}, [data?.listRecommendations?.modules, onClickExploreAll]);
|
||||||
|
|
||||||
const autoCompleteQueryOptions = useMemo(
|
const { quickFilters, selectedQuickFilter, setSelectedQuickFilter } = useQuickFiltersContext();
|
||||||
() =>
|
|
||||||
(suggestions?.length > 0 &&
|
const autoCompleteQueryOptions = useMemo(() => {
|
||||||
effectiveQuery.length > 0 && [
|
const query = suggestions.length ? effectiveQuery : '';
|
||||||
|
const selectedQuickFilterLabel = selectedQuickFilter
|
||||||
|
? getQuickFilterDetails(selectedQuickFilter, entityRegistry).label
|
||||||
|
: '';
|
||||||
|
const text = query || selectedQuickFilterLabel;
|
||||||
|
|
||||||
|
if (!text) return [];
|
||||||
|
|
||||||
|
return [
|
||||||
{
|
{
|
||||||
value: `${EXACT_SEARCH_PREFIX}${effectiveQuery}`,
|
value: `${EXACT_SEARCH_PREFIX}${text}`,
|
||||||
label: (
|
label: <ViewAllSearchItem searchTarget={text} />,
|
||||||
<SuggestionContainer key={EXACT_AUTOCOMPLETE_OPTION_TYPE}>
|
|
||||||
<ExploreForEntity>
|
|
||||||
<SearchOutlined />
|
|
||||||
<ExploreForEntityText>
|
|
||||||
View all results for <Typography.Text strong>{effectiveQuery}</Typography.Text>
|
|
||||||
</ExploreForEntityText>
|
|
||||||
</ExploreForEntity>
|
|
||||||
</SuggestionContainer>
|
|
||||||
),
|
|
||||||
type: EXACT_AUTOCOMPLETE_OPTION_TYPE,
|
type: EXACT_AUTOCOMPLETE_OPTION_TYPE,
|
||||||
},
|
},
|
||||||
]) ||
|
];
|
||||||
[],
|
}, [suggestions, effectiveQuery, selectedQuickFilter, entityRegistry]);
|
||||||
[suggestions, effectiveQuery],
|
|
||||||
);
|
|
||||||
|
|
||||||
const autoCompleteEntityOptions = useMemo(
|
const autoCompleteEntityOptions = useMemo(
|
||||||
() =>
|
() =>
|
||||||
@ -222,8 +211,6 @@ export const SearchBar = ({
|
|||||||
[effectiveQuery, suggestions],
|
[effectiveQuery, suggestions],
|
||||||
);
|
);
|
||||||
|
|
||||||
const { quickFilters, selectedQuickFilter, setSelectedQuickFilter } = useQuickFiltersContext();
|
|
||||||
|
|
||||||
const previousSelectedQuickFilterValue = usePrevious(selectedQuickFilter?.value);
|
const previousSelectedQuickFilterValue = usePrevious(selectedQuickFilter?.value);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// if we change the selected quick filter, re-issue auto-complete
|
// if we change the selected quick filter, re-issue auto-complete
|
||||||
@ -245,10 +232,8 @@ export const SearchBar = ({
|
|||||||
|
|
||||||
const options = useMemo(() => {
|
const options = useMemo(() => {
|
||||||
// Display recommendations when there is no search query, autocomplete suggestions otherwise.
|
// Display recommendations when there is no search query, autocomplete suggestions otherwise.
|
||||||
if (autoCompleteEntityOptions.length > 0) {
|
const tail = autoCompleteEntityOptions.length ? autoCompleteEntityOptions : emptyQueryOptions;
|
||||||
return [...quickFilterOption, ...autoCompleteQueryOptions, ...autoCompleteEntityOptions];
|
return [...quickFilterOption, ...autoCompleteQueryOptions, ...tail];
|
||||||
}
|
|
||||||
return [...quickFilterOption, ...emptyQueryOptions];
|
|
||||||
}, [emptyQueryOptions, autoCompleteEntityOptions, autoCompleteQueryOptions, quickFilterOption]);
|
}, [emptyQueryOptions, autoCompleteEntityOptions, autoCompleteQueryOptions, quickFilterOption]);
|
||||||
|
|
||||||
const searchBarWrapperRef = useRef<HTMLDivElement>(null);
|
const searchBarWrapperRef = useRef<HTMLDivElement>(null);
|
||||||
|
|||||||
@ -71,9 +71,8 @@ export const SearchablePage = ({ onSearch, onAutoComplete, children }: Props) =>
|
|||||||
}, [suggestionsData]);
|
}, [suggestionsData]);
|
||||||
|
|
||||||
const search = (query: string, type?: EntityType, quickFilters?: FacetFilterInput[]) => {
|
const search = (query: string, type?: EntityType, quickFilters?: FacetFilterInput[]) => {
|
||||||
if (!query || query.trim().length === 0) {
|
if (!query.trim() && !selectedQuickFilter) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
analytics.event({
|
analytics.event({
|
||||||
type: EventType.SearchEvent,
|
type: EventType.SearchEvent,
|
||||||
query,
|
query,
|
||||||
|
|||||||
46
datahub-web-react/src/app/search/ViewAllSearchItem.tsx
Normal file
46
datahub-web-react/src/app/search/ViewAllSearchItem.tsx
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import styled from 'styled-components/macro';
|
||||||
|
import { Typography } from 'antd';
|
||||||
|
import { SearchOutlined } from '@ant-design/icons';
|
||||||
|
|
||||||
|
const ExploreForEntity = styled.span`
|
||||||
|
font-weight: light;
|
||||||
|
font-size: 16px;
|
||||||
|
padding: 5px 0;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const ExploreForEntityText = styled.span`
|
||||||
|
margin-left: 10px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const ViewAllContainer = styled.div`
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
width: 100%;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const ReturnKey = styled(Typography.Text)`
|
||||||
|
& kbd {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
font-size: 12px;
|
||||||
|
`;
|
||||||
|
|
||||||
|
function ViewAllSearchItem({ searchTarget: searchText }: { searchTarget?: string }) {
|
||||||
|
return (
|
||||||
|
<ViewAllContainer>
|
||||||
|
<ExploreForEntity>
|
||||||
|
<SearchOutlined />
|
||||||
|
<ExploreForEntityText>
|
||||||
|
View all results for <Typography.Text strong>{searchText}</Typography.Text>
|
||||||
|
</ExploreForEntityText>
|
||||||
|
</ExploreForEntity>
|
||||||
|
<ReturnKey keyboard disabled>
|
||||||
|
⮐ return
|
||||||
|
</ReturnKey>
|
||||||
|
</ViewAllContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ViewAllSearchItem;
|
||||||
Loading…
x
Reference in New Issue
Block a user