From 6a5974e06cbbda058fe5768356b5892d306fc583 Mon Sep 17 00:00:00 2001 From: Marie <51697796+ijreilly@users.noreply.github.com> Date: Wed, 4 Feb 2026 15:51:33 +0100 Subject: [PATCH] [fix] Some fixes (#17674) - fixes [sentry](https://twenty-v7.sentry.io/issues/7239112455/?environment=prod&environment=prod-eu&project=4507072563183616&query=anything%20else&referrer=issue-stream&sort=date) - adapt useClearField logic to morph relations - adapt useClearField logic to one-to-many relations (early return) - fix creation of objects without "name" field from specific parts of the product (which involved a "name" field) --- .../record-field/ui/hooks/useClearField.ts | 33 ++++++++++++++++++- .../utils/buildRecordLabelPayload.ts | 17 ++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/useClearField.ts b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/useClearField.ts index 6ff3b95c2a..b9f7b2eb56 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/useClearField.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/ui/hooks/useClearField.ts @@ -6,6 +6,8 @@ import { recordStoreFamilySelector } from '@/object-record/record-store/states/s import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue'; import { FieldContext } from '@/object-record/record-field/ui/contexts/FieldContext'; +import { getForeignKeyNameFromRelationFieldName } from '@/object-record/utils/getForeignKeyNameFromRelationFieldName'; +import { FieldMetadataType, RelationType } from 'twenty-shared/types'; export const useClearField = () => { const { @@ -37,6 +39,19 @@ export const useClearField = () => { throw new Error('Field metadata item cannot be found'); } + const isRelation = + foundFieldMetadataItem.type === FieldMetadataType.RELATION || + foundFieldMetadataItem.type === FieldMetadataType.MORPH_RELATION; + + const shouldSkipClearingBecauseInvolvesMultipleRecords = + isRelation && + foundFieldMetadataItem.settings?.relationType === + RelationType.ONE_TO_MANY; + + if (shouldSkipClearingBecauseInvolvesMultipleRecords) { + return; + } + const fieldName = fieldDefinition.metadata.fieldName; const emptyFieldValue = generateEmptyFieldValue({ @@ -48,11 +63,27 @@ export const useClearField = () => { emptyFieldValue, ); + const isManyToOneRelation = + isRelation && + foundFieldMetadataItem.settings?.relationType === + RelationType.MANY_TO_ONE; + + const updateFieldName = isManyToOneRelation + ? getForeignKeyNameFromRelationFieldName(fieldName) + : fieldName; + + if (isManyToOneRelation) { + set( + recordStoreFamilySelector({ recordId, fieldName: updateFieldName }), + emptyFieldValue, + ); + } + updateRecord?.({ variables: { where: { id: recordId }, updateOneRecordInput: { - [fieldName]: emptyFieldValue, + [updateFieldName]: emptyFieldValue, }, }, }); diff --git a/packages/twenty-front/src/modules/object-record/utils/buildRecordLabelPayload.ts b/packages/twenty-front/src/modules/object-record/utils/buildRecordLabelPayload.ts index 5fcfc92181..c7685564e4 100644 --- a/packages/twenty-front/src/modules/object-record/utils/buildRecordLabelPayload.ts +++ b/packages/twenty-front/src/modules/object-record/utils/buildRecordLabelPayload.ts @@ -1,6 +1,7 @@ import { type ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; import { getLabelIdentifierFieldMetadataItem } from '@/object-metadata/utils/getLabelIdentifierFieldMetadataItem'; import { FieldMetadataType } from 'twenty-shared/types'; +import { isDefined } from 'twenty-shared/utils'; type BuildRecordLabelPayloadArgs = { id: string; @@ -16,17 +17,27 @@ export const buildRecordLabelPayload = ({ const labelIdentifierField = getLabelIdentifierFieldMetadataItem(objectMetadataItem); - if (labelIdentifierField?.type === FieldMetadataType.FULL_NAME) { + if ( + !isDefined(labelIdentifierField) || + (labelIdentifierField.type !== FieldMetadataType.TEXT && + labelIdentifierField.type !== FieldMetadataType.FULL_NAME) + ) { + return { id }; + } + + const fieldName = labelIdentifierField.name; + + if (labelIdentifierField.type === FieldMetadataType.FULL_NAME) { const words = searchInput?.split(' ') ?? []; const hasMultipleWords = words.length > 1; return { id, - name: hasMultipleWords + [fieldName]: hasMultipleWords ? { firstName: words[0], lastName: words.slice(1).join(' ') } : { firstName: searchInput ?? '', lastName: '' }, }; } - return { id, name: searchInput ?? '' }; + return { id, [fieldName]: searchInput ?? '' }; };