import React, { useState, useEffect } from 'react'; import { FilterOutlined } from '@ant-design/icons'; import { Alert, Button, Card, Divider, List, Modal, Pagination, Row, Typography } from 'antd'; import { SearchCfg } from '../../conf'; import { useGetSearchResultsQuery } from '../../graphql/search.generated'; import { EntityType, FacetFilterInput } from '../../types.generated'; import { IconStyleType } from '../entity/Entity'; import { Message } from '../shared/Message'; import { useEntityRegistry } from '../useEntityRegistry'; import { SearchFilters } from './SearchFilters'; import { filtersToGraphqlParams } from './utils/filtersToGraphqlParams'; const styles = { loading: { marginTop: '10%' }, addFilters: { backgroundColor: '#F5F5F5' }, resultSummary: { color: 'gray', marginTop: '36px' }, resultHeaderCardBody: { padding: '16px 24px' }, resultHeaderCard: { right: '52px', top: '-40px', position: 'absolute' }, resultList: { width: '100%', borderColor: '#f0f0f0', marginTop: '12px', padding: '16px 32px' }, paginationRow: { padding: 40 }, resultsContainer: { width: '100%', padding: '20px 132px' }, }; interface Props { type: EntityType; query: string; page: number; filters: Array; onChangeFilters: (filters: Array) => void; onChangePage: (page: number) => void; } export const EntitySearchResults = ({ type, query, page, filters, onChangeFilters, onChangePage }: Props) => { const [isEditingFilters, setIsEditingFilters] = useState(false); const [selectedFilters, setSelectedFilters] = useState(filters); useEffect(() => { setSelectedFilters(filters); }, [filters]); const entityRegistry = useEntityRegistry(); const { loading, error, data } = useGetSearchResultsQuery({ variables: { input: { type, query, start: (page - 1) * SearchCfg.RESULTS_PER_PAGE, count: SearchCfg.RESULTS_PER_PAGE, filters: filtersToGraphqlParams(filters), }, }, }); const results = data?.search?.entities || []; const pageStart = data?.search?.start || 0; const pageSize = data?.search?.count || 0; const totalResults = data?.search?.total || 0; const lastResultIndex = pageStart * pageSize + pageSize > totalResults ? totalResults : pageStart * pageSize + pageSize; const onFilterSelect = (selected: boolean, field: string, value: string) => { const newFilters = selected ? [...selectedFilters, { field, value }] : selectedFilters.filter((filter) => filter.field !== field || filter.value !== value); setSelectedFilters(newFilters); }; const onEditFilters = () => { setIsEditingFilters(true); }; const onApplyFilters = () => { onChangeFilters(selectedFilters); setIsEditingFilters(false); }; const onCloseEditFilters = () => { setIsEditingFilters(false); setSelectedFilters(filters); }; if (error || (!loading && !error && !data)) { return ; } return (
{loading && } Apply} visible={isEditingFilters} destroyOnClose onCancel={onCloseEditFilters} > Showing{' '} {(page - 1) * pageSize} - {lastResultIndex} {' '} of {totalResults} results {entityRegistry.getIcon(type, 36, IconStyleType.ACCENT)} } style={styles.resultList} dataSource={results} split={false} renderItem={(item, index) => ( <> {entityRegistry.renderSearchResult(type, item)} {index < results.length - 1 && } )} bordered />
); };