Fix multi select filtering (#5358) (#8452)

Allow filtering by multi-select fields.

<img width="1053" alt="Screenshot 2024-11-11 at 11 54 45"
src="https://github.com/user-attachments/assets/a79b2251-94e3-48f8-abda-e808103a6c39">

---------

Co-authored-by: Félix Malfait <felix@twenty.com>
This commit is contained in:
ad-elias
2024-11-17 15:27:38 +01:00
committed by GitHub
parent ac1197afe1
commit badebc513f
25 changed files with 408 additions and 177 deletions

View File

@ -1,6 +1,11 @@
import { Injectable, Logger } from '@nestjs/common';
import { GraphQLInputObjectType, GraphQLInputType, GraphQLList } from 'graphql';
import {
GraphQLBoolean,
GraphQLInputObjectType,
GraphQLInputType,
GraphQLList,
} from 'graphql';
import { WorkspaceBuildSchemaOptions } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface';
@ -103,7 +108,9 @@ export class InputTypeFactory {
eq: { type: enumType },
neq: { type: enumType },
in: { type: new GraphQLList(enumType) },
containsAny: { type: new GraphQLList(enumType) },
is: { type: FilterIs },
isEmptyArray: { type: GraphQLBoolean },
}),
});
}

View File

@ -1,12 +1,12 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLString } from 'graphql';
import { GraphQLBoolean, GraphQLInputObjectType, GraphQLString } from 'graphql';
import { FilterIs } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/filter-is.input-type';
export const ArrayFilterType = new GraphQLInputObjectType({
name: 'ArrayFilter',
fields: {
contains: { type: new GraphQLList(GraphQLString) },
not_contains: { type: new GraphQLList(GraphQLString) },
containsIlike: { type: GraphQLString },
is: { type: FilterIs },
isEmptyArray: { type: GraphQLBoolean },
},
});

View File

@ -0,0 +1,17 @@
import {
GraphQLBoolean,
GraphQLInputObjectType,
GraphQLList,
GraphQLString,
} from 'graphql';
import { FilterIs } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/filter-is.input-type';
export const MultiSelectFilterType = new GraphQLInputObjectType({
name: 'MultiSelectFilter',
fields: {
containsAny: { type: new GraphQLList(GraphQLString) },
is: { type: FilterIs },
isEmptyArray: { type: GraphQLBoolean },
},
});

View File

@ -0,0 +1,11 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLString } from 'graphql';
import { FilterIs } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/filter-is.input-type';
export const SelectFilterType = new GraphQLInputObjectType({
name: 'SelectFilter',
fields: {
in: { type: new GraphQLList(GraphQLString) },
is: { type: FilterIs },
},
});

View File

@ -27,6 +27,8 @@ import {
StringFilterType,
} from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input';
import { IDFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/id-filter.input-type';
import { MultiSelectFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/multi-select-filter.input-type';
import { SelectFilterType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/input/select-filter.input-type';
import {
BigFloatScalarType,
UUIDScalarType,
@ -115,6 +117,8 @@ export class TypeMapperService {
[FieldMetadataType.RAW_JSON, RawJsonFilterType],
[FieldMetadataType.RICH_TEXT, StringFilterType],
[FieldMetadataType.ARRAY, ArrayFilterType],
[FieldMetadataType.MULTI_SELECT, MultiSelectFilterType],
[FieldMetadataType.SELECT, SelectFilterType],
[FieldMetadataType.TS_VECTOR, StringFilterType], // TODO: Add TSVectorFilterType
]);

View File

@ -58,7 +58,9 @@ export const generateFields = <
? {
nullable: fieldMetadata.isNullable,
defaultValue: fieldMetadata.defaultValue,
isArray: fieldMetadata.type === FieldMetadataType.MULTI_SELECT,
isArray:
kind !== InputTypeDefinitionKind.Filter &&
fieldMetadata.type === FieldMetadataType.MULTI_SELECT,
settings: fieldMetadata.settings,
isIdField: fieldMetadata.name === 'id',
}