Introduce ARRAY field type (#6862)

This PR was created by \[GitStart\](<https://gitstart.com/>) to address
the requirements from this ticket:
\[TWNTY-6447\](<https://clients.gitstart.com/twenty/5449/tickets/TWNTY-6447>).

This ticket was imported from:
<https://github.com/twentyhq/twenty/issues/6447>

### Description

\- We added a new field type

### Refs

#6447

### Demo

<https://jam.dev/c/2b4d7853-ea89-4e9d-a561-6edcb4fdb34b>

Fixes #6447

---------

Co-authored-by: gitstart-twenty <gitstart-twenty@users.noreply.github.com>
Co-authored-by: Charles Bochet <charles@twenty.com>
This commit is contained in:
gitstart-app[bot]
2024-09-16 14:07:55 +02:00
committed by GitHub
parent bc99cfec98
commit 8208a3e976
40 changed files with 392 additions and 28 deletions

View File

@ -230,6 +230,13 @@ const fieldEmailsMock = {
defaultValue: [{ primaryEmail: '', additionalEmails: {} }],
};
const fieldArrayMock = {
name: 'fieldArray',
type: FieldMetadataType.ARRAY,
isNullable: true,
defaultValue: null,
};
const fieldPhonesMock = {
name: FIELD_PHONES_MOCK_NAME,
type: FieldMetadataType.PHONES,
@ -267,6 +274,7 @@ export const fields = [
fieldRawJsonMock,
fieldRichTextMock,
fieldActorMock,
fieldArrayMock,
];
export const objectMetadataItemMock = {

View File

@ -0,0 +1,10 @@
import { GraphQLInputObjectType, GraphQLList, GraphQLString } from 'graphql';
export const ArrayFilterType = new GraphQLInputObjectType({
name: 'ArrayFilter',
fields: {
contains: { type: new GraphQLList(GraphQLString) },
contains_any: { type: new GraphQLList(GraphQLString) },
not_contains: { type: new GraphQLList(GraphQLString) },
},
});

View File

@ -1,3 +1,4 @@
export * from './array-filter.input-type';
export * from './big-float-filter.input-type';
export * from './big-int-filter.input-type';
export * from './boolean-filter.input-type';

View File

@ -18,6 +18,7 @@ import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadat
import { OrderByDirectionType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/enum';
import {
ArrayFilterType,
BigFloatFilterType,
BooleanFilterType,
DateFilterType,
@ -45,6 +46,8 @@ export interface TypeOptions<T = any> {
isIdField?: boolean;
}
const StringArrayScalarType = new GraphQLList(GraphQLString);
@Injectable()
export class TypeMapperService {
mapToScalarType(
@ -55,7 +58,6 @@ export class TypeMapperService {
if (isIdField || settings?.isForeignKey) {
return GraphQLID;
}
const typeScalarMapping = new Map<FieldMetadataType, GraphQLScalarType>([
[FieldMetadataType.UUID, UUIDScalarType],
[FieldMetadataType.TEXT, GraphQLString],
@ -74,6 +76,10 @@ export class TypeMapperService {
[FieldMetadataType.NUMERIC, BigFloatScalarType],
[FieldMetadataType.POSITION, PositionScalarType],
[FieldMetadataType.RAW_JSON, RawJSONScalar],
[
FieldMetadataType.ARRAY,
StringArrayScalarType as unknown as GraphQLScalarType,
],
[FieldMetadataType.RICH_TEXT, GraphQLString],
]);
@ -111,6 +117,7 @@ export class TypeMapperService {
[FieldMetadataType.POSITION, FloatFilterType],
[FieldMetadataType.RAW_JSON, RawJsonFilterType],
[FieldMetadataType.RICH_TEXT, StringFilterType],
[FieldMetadataType.ARRAY, ArrayFilterType],
]);
return typeFilterMapping.get(fieldMetadataType);
@ -135,6 +142,7 @@ export class TypeMapperService {
[FieldMetadataType.POSITION, OrderByDirectionType],
[FieldMetadataType.RAW_JSON, OrderByDirectionType],
[FieldMetadataType.RICH_TEXT, OrderByDirectionType],
[FieldMetadataType.ARRAY, OrderByDirectionType],
]);
return typeOrderByMapping.get(fieldMetadataType);

View File

@ -31,6 +31,7 @@ export const mapFieldMetadataToGraphqlQuery = (
FieldMetadataType.POSITION,
FieldMetadataType.RAW_JSON,
FieldMetadataType.RICH_TEXT,
FieldMetadataType.ARRAY,
].includes(fieldType);
if (fieldIsSimpleValue) {