diff --git a/packages/twenty-front/src/modules/object-metadata/validation-schemas/selectOptionsSchema.ts b/packages/twenty-front/src/modules/object-metadata/validation-schemas/selectOptionsSchema.ts index ff767cdd5..3893306c8 100644 --- a/packages/twenty-front/src/modules/object-metadata/validation-schemas/selectOptionsSchema.ts +++ b/packages/twenty-front/src/modules/object-metadata/validation-schemas/selectOptionsSchema.ts @@ -2,7 +2,6 @@ import { themeColorSchema } from 'twenty-ui'; import { z } from 'zod'; import { FieldMetadataItemOption } from '@/object-metadata/types/FieldMetadataItem'; -import { getOptionValueFromLabel } from '@/settings/data-model/fields/forms/select/utils/getOptionValueFromLabel'; import { computeOptionValueFromLabelOrThrow } from '~/pages/settings/data-model/utils/compute-option-value-from-label.utils'; const selectOptionSchema = z @@ -13,9 +12,6 @@ const selectOptionSchema = z position: z.number(), value: z.string(), }) - .refine((option) => option.value === getOptionValueFromLabel(option.label), { - message: 'Value does not match label', - }) .refine( (option) => { try { diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory.ts b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory.ts index de77733d6..aefd82efc 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-schema-builder/factories/enum-type-definition.factory.ts @@ -3,15 +3,16 @@ import { Injectable, Logger } from '@nestjs/common'; import { GraphQLEnumType } from 'graphql'; import { WorkspaceBuildSchemaOptions } from 'src/engine/api/graphql/workspace-schema-builder/interfaces/workspace-build-schema-optionts.interface'; -import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface'; import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; +import { ObjectMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/object-metadata.interface'; -import { pascalCase } from 'src/utils/pascal-case'; import { FieldMetadataComplexOption, FieldMetadataDefaultOption, } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; import { isEnumFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-enum-field-metadata-type.util'; +import { transformEnumValue } from 'src/engine/utils/transform-enum-value'; +import { pascalCase } from 'src/utils/pascal-case'; export interface EnumTypeDefinition { target: string; @@ -53,7 +54,7 @@ export class EnumTypeDefinitionFactory { ): GraphQLEnumType { // FixMe: It's a hack until Typescript get fixed on union types for reduce function // https://github.com/microsoft/TypeScript/issues/36390 - const enumOptions = fieldMetadata.options as Array< + const enumOptions = transformEnumValue(fieldMetadata.options) as Array< FieldMetadataDefaultOption | FieldMetadataComplexOption >; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts index 576ce0b64..b81cf7a76 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto.ts @@ -12,6 +12,7 @@ import { QueryOptions, Relation, } from '@ptc-org/nestjs-query-graphql'; +import { Transform } from 'class-transformer'; import { IsBoolean, IsDateString, @@ -30,11 +31,13 @@ import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadat import { UUIDScalarType } from 'src/engine/api/graphql/workspace-schema-builder/graphql-types/scalars'; import { IsValidMetadataName } from 'src/engine/decorators/metadata/is-valid-metadata-name.decorator'; +import { FieldMetadataDefaultOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { IsFieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/validators/is-field-metadata-default-value.validator'; import { IsFieldMetadataOptions } from 'src/engine/metadata-modules/field-metadata/validators/is-field-metadata-options.validator'; import { ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto'; import { RelationMetadataDTO } from 'src/engine/metadata-modules/relation-metadata/dtos/relation-metadata.dto'; +import { transformEnumValue } from 'src/engine/utils/transform-enum-value'; registerEnumType(FieldMetadataType, { name: 'FieldMetadataType', @@ -120,6 +123,9 @@ export class FieldMetadataDTO< @Field(() => GraphQLJSON, { nullable: true }) defaultValue?: FieldMetadataDefaultValue; + @Transform(({ value }) => + transformEnumValue(value as FieldMetadataDefaultOption[]), + ) @Validate(IsFieldMetadataOptions) @IsOptional() @Field(() => GraphQLJSON, { nullable: true }) diff --git a/packages/twenty-server/src/engine/utils/transform-enum-value.ts b/packages/twenty-server/src/engine/utils/transform-enum-value.ts new file mode 100644 index 000000000..20eb24e49 --- /dev/null +++ b/packages/twenty-server/src/engine/utils/transform-enum-value.ts @@ -0,0 +1,14 @@ +import { FieldMetadataDefaultOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; + +export function transformEnumValue(options?: FieldMetadataDefaultOption[]) { + return options?.map((option) => { + if (/^\d/.test(option.value)) { + return { + ...option, + value: `_${option.value}`, + }; + } + + return option; + }); +}