diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts index 474a2831b04..154723c1def 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/usePersistField.ts @@ -53,8 +53,11 @@ import { isFieldRichTextValue } from '@/object-record/record-field/ui/types/guar import { isFieldRichTextV2Value } from '@/object-record/record-field/ui/types/guards/isFieldRichTextValueV2'; import { isFieldText } from '@/object-record/record-field/ui/types/guards/isFieldText'; import { isFieldTextValue } from '@/object-record/record-field/ui/types/guards/isFieldTextValue'; +import { buildRecordWithAllMorphObjectIdsToNull } from '@/object-record/record-field/ui/meta-types/input/utils/buildRecordWithAllMorphObjectIdsToNull'; +import { type ObjectRecord } from '@/object-record/types/ObjectRecord'; import { useUpsertRecordsInStore } from '@/object-record/record-store/hooks/useUpsertRecordsInStore'; import { getForeignKeyNameFromRelationFieldName } from '@/object-record/utils/getForeignKeyNameFromRelationFieldName'; +import { computeMorphRelationFieldName, isDefined } from 'twenty-shared/utils'; import { isDeeplyEqual } from '~/utils/isDeeplyEqual'; export const usePersistField = ({ @@ -222,12 +225,54 @@ export const usePersistField = ({ return; } + const morphFieldDefinition = + fieldDefinition as FieldDefinition; + const morphRelations = morphFieldDefinition.metadata.morphRelations; + const relationType = morphFieldDefinition.metadata.relationType; + + const recordWithAllMorphObjectIdsToNull = + buildRecordWithAllMorphObjectIdsToNull({ + morphRelations, + fieldName, + relationType, + }); + + if (!isDefined(valueToPersist)) { + await updateOneRecord({ + objectNameSingular: objectMetadataItem.nameSingular, + idToUpdate: recordId, + updateOneRecordInput: recordWithAllMorphObjectIdsToNull, + }); + return; + } + + const targetMorphRelation = morphRelations.find( + (morphRelation) => + morphRelation.targetObjectMetadata.id === + (valueToPersist as ObjectRecord).objectMetadataId, + ); + + if (!isDefined(targetMorphRelation)) { + throw new Error( + `Target morph relation not found for objectMetadataId ${(valueToPersist as ObjectRecord).objectMetadataId}`, + ); + } + + const computedFieldName = computeMorphRelationFieldName({ + fieldName, + relationType, + targetObjectMetadataNameSingular: + targetMorphRelation.targetObjectMetadata.nameSingular, + targetObjectMetadataNamePlural: + targetMorphRelation.targetObjectMetadata.namePlural, + }); + const newRecord = await updateOneRecord({ objectNameSingular: objectMetadataItem.nameSingular, idToUpdate: recordId, updateOneRecordInput: { - [getForeignKeyNameFromRelationFieldName(fieldName)]: - valueToPersist?.id ?? null, + ...recordWithAllMorphObjectIdsToNull, + [`${computedFieldName}Id`]: valueToPersist?.id, }, }); diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts index d975fed3efa..157ba39f6c0 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/types/guards/isFieldAddressValue.ts @@ -10,8 +10,8 @@ export const addressSchema = z.object({ addressState: z.string().nullable(), addressPostcode: z.string().nullable(), addressCountry: z.string().nullable(), - addressLat: z.coerce.number().nullable(), - addressLng: z.coerce.number().nullable(), + addressLat: z.number().nullable(), + addressLng: z.number().nullable(), }); export const isFieldAddressValue = (