Refactor useFilteredSearchEntityQuery to accept multiple filters (#1526)

* refactoring useFilteredSearchEntityQuery

* refactor with filter addition

---------

Co-authored-by: Charles Bochet <charlesBochet@users.noreply.github.com>
This commit is contained in:
Aditya Pimpalkar
2023-09-11 00:12:16 +01:00
committed by GitHub
parent b6eb280639
commit bcbf303364
7 changed files with 78 additions and 41 deletions

View File

@ -1,4 +1,4 @@
import * as Apollo from '@apollo/client';
import { QueryHookOptions, QueryResult } from '@apollo/client';
import { EntitiesForMultipleEntitySelect } from '@/ui/input/relation-picker/components/MultipleEntitySelect';
import { EntityForSelect } from '@/ui/input/relation-picker/types/EntityForSelect';
@ -26,6 +26,8 @@ type ExtractEntityTypeFromQueryResponse<T> = T extends {
? U
: never;
type SearchFilter = { fieldName: string; filter: string | number };
const DEFAULT_SEARCH_REQUEST_LIMIT = 10;
// TODO: use this for all search queries, because we need selectedEntities and entitiesToSelect each time we want to search
@ -36,7 +38,6 @@ export function useFilteredSearchEntityQuery<
},
EntityStringField extends SelectStringKeys<EntityType>,
OrderByField extends EntityStringField,
SearchOnField extends EntityStringField,
QueryResponseForExtract,
QueryResponse extends {
searchResults: EntityType[];
@ -53,31 +54,24 @@ export function useFilteredSearchEntityQuery<
CustomEntityForSelect extends EntityForSelect,
>({
queryHook,
searchOnFields,
filterByFields,
orderByField,
filters,
sortOrder = SortOrder.Asc,
selectedIds,
mappingFunction,
limit,
searchFilter, // TODO: put in a scoped recoil state
excludePersonIds = [],
excludeEntityIds = [],
}: {
queryHook: (
queryOptions?: Apollo.QueryHookOptions<
QueryResponseForExtract,
QueryVariables
>,
) => Apollo.QueryResult<QueryResponse, QueryVariables>;
searchOnFields: SearchOnField[];
filterByFields?: Record<string, any>[];
queryOptions?: QueryHookOptions<QueryResponseForExtract, QueryVariables>,
) => QueryResult<QueryResponse, QueryVariables>;
orderByField: OrderByField;
filters: SearchFilter[];
sortOrder?: SortOrder;
selectedIds: string[];
mappingFunction: (entity: EntityType) => CustomEntityForSelect;
limit?: number;
searchFilter: string;
excludePersonIds?: string[];
excludeEntityIds?: string[];
}): EntitiesForMultipleEntitySelect<CustomEntityForSelect> {
const { loading: selectedEntitiesLoading, data: selectedEntitiesData } =
queryHook({
@ -93,9 +87,9 @@ export function useFilteredSearchEntityQuery<
} as QueryVariables,
});
const searchFilterByField = searchOnFields.map((field) => ({
[field]: {
contains: `%${searchFilter}%`,
const searchFilterByField = filters.map(({ fieldName, filter }) => ({
[fieldName]: {
contains: `%${filter}%`,
mode: QueryMode.Insensitive,
},
}));
@ -150,7 +144,7 @@ export function useFilteredSearchEntityQuery<
},
{
id: {
notIn: [...selectedIds, ...excludePersonIds],
notIn: [...selectedIds, ...excludeEntityIds],
},
},
],