From 98e199c01ddc3f424d1ddf1d751c6e3adcf45d92 Mon Sep 17 00:00:00 2001 From: Gaurav Date: Tue, 20 May 2025 03:33:30 +0530 Subject: [PATCH] Support Full Name as Record Text Identifier (#11610) closes #11296 [recording.webm](https://github.com/user-attachments/assets/da0f2587-a435-4bee-a802-81eb9ca92733) --------- Co-authored-by: Charles Bochet --- .../LabelIdentifierFieldMetadataTypes.ts | 1 + .../utils/getLabelIdentifierFieldValue.ts | 14 +++++++------- .../object-record/hooks/useRecordChipData.ts | 14 +++++--------- .../utils/getRecordChipGenerators.ts | 2 +- ...SettingsDataModelObjectIdentifiersForm.tsx | 19 +++++++++++++++++-- ...e-metadata-name-is-not-reserved-keyword.ts | 1 - 6 files changed, 31 insertions(+), 20 deletions(-) diff --git a/packages/twenty-front/src/modules/object-metadata/constants/LabelIdentifierFieldMetadataTypes.ts b/packages/twenty-front/src/modules/object-metadata/constants/LabelIdentifierFieldMetadataTypes.ts index 49e3d2984..b164fc620 100644 --- a/packages/twenty-front/src/modules/object-metadata/constants/LabelIdentifierFieldMetadataTypes.ts +++ b/packages/twenty-front/src/modules/object-metadata/constants/LabelIdentifierFieldMetadataTypes.ts @@ -3,4 +3,5 @@ import { FieldMetadataType } from '~/generated-metadata/graphql'; export const LABEL_IDENTIFIER_FIELD_METADATA_TYPES = [ FieldMetadataType.NUMBER, FieldMetadataType.TEXT, + FieldMetadataType.FULL_NAME, ]; diff --git a/packages/twenty-front/src/modules/object-metadata/utils/getLabelIdentifierFieldValue.ts b/packages/twenty-front/src/modules/object-metadata/utils/getLabelIdentifierFieldValue.ts index 2287dec2b..2f9254e95 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/getLabelIdentifierFieldValue.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/getLabelIdentifierFieldValue.ts @@ -9,16 +9,16 @@ export const getLabelIdentifierFieldValue = ( labelIdentifierFieldMetadataItem: FieldMetadataItem | undefined, objectNameSingular: string, ): string => { + if (!isDefined(labelIdentifierFieldMetadataItem)) { + return record.id; + } + if ( objectNameSingular === CoreObjectNameSingular.WorkspaceMember || - labelIdentifierFieldMetadataItem?.type === FieldMetadataType.FULL_NAME + labelIdentifierFieldMetadataItem.type === FieldMetadataType.FULL_NAME ) { - return `${record.name?.firstName ?? ''} ${record.name?.lastName ?? ''}`; + return `${record[labelIdentifierFieldMetadataItem.name]?.firstName ?? ''} ${record[labelIdentifierFieldMetadataItem.name]?.lastName ?? ''}`; } - if (isDefined(labelIdentifierFieldMetadataItem?.name)) { - return record[labelIdentifierFieldMetadataItem.name] ?? ''; - } - - return ''; + return record[labelIdentifierFieldMetadataItem.name] ?? ''; }; diff --git a/packages/twenty-front/src/modules/object-record/hooks/useRecordChipData.ts b/packages/twenty-front/src/modules/object-record/hooks/useRecordChipData.ts index f1e844cec..99767a4e3 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useRecordChipData.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useRecordChipData.ts @@ -1,5 +1,4 @@ import { PreComputedChipGeneratorsContext } from '@/object-metadata/contexts/PreComputedChipGeneratorsContext'; -import { generateDefaultRecordChipData } from '@/object-metadata/utils/generateDefaultRecordChipData'; import { RecordChipData } from '@/object-record/record-field/types/RecordChipData'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; import { useContext } from 'react'; @@ -23,16 +22,13 @@ export const useRecordChipData = ({ const identifierChipGenerator = identifierChipGeneratorPerObject[objectNameSingular]; - if (isDefined(identifierChipGenerator)) { - return { - recordChipData: identifierChipGenerator(record), - }; + if (!isDefined(identifierChipGenerator)) { + throw new Error( + `No identifier chip generator found for object name singular: ${objectNameSingular}`, + ); } return { - recordChipData: generateDefaultRecordChipData({ - objectNameSingular, - record, - }), + recordChipData: identifierChipGenerator(record), }; }; diff --git a/packages/twenty-front/src/modules/object-record/utils/getRecordChipGenerators.ts b/packages/twenty-front/src/modules/object-record/utils/getRecordChipGenerators.ts index 560592022..52c05d951 100644 --- a/packages/twenty-front/src/modules/object-record/utils/getRecordChipGenerators.ts +++ b/packages/twenty-front/src/modules/object-record/utils/getRecordChipGenerators.ts @@ -11,8 +11,8 @@ import { isLabelIdentifierField } from '@/object-metadata/utils/isLabelIdentifie import { isFieldIdentifierDisplay } from '@/object-record/record-field/meta-types/display/utils/isFieldIdentifierDisplay'; import { RecordChipData } from '@/object-record/record-field/types/RecordChipData'; import { ObjectRecord } from '@/object-record/types/ObjectRecord'; -import { FieldMetadataType } from '~/generated-metadata/graphql'; import { isDefined } from 'twenty-shared/utils'; +import { FieldMetadataType } from '~/generated-metadata/graphql'; export const getRecordChipGenerators = ( objectMetadataItems: ObjectMetadataItem[], diff --git a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx index a954b87c2..eba3dee57 100644 --- a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectIdentifiersForm.tsx @@ -13,7 +13,8 @@ import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; import { Select } from '@/ui/input/components/Select'; import { zodResolver } from '@hookform/resolvers/zod'; import { t } from '@lingui/core/macro'; -import { IconCircleOff, useIcons } from 'twenty-ui/display'; +import { useNavigate } from 'react-router-dom'; +import { IconCircleOff, IconPlus, useIcons } from 'twenty-ui/display'; import { SelectOption } from 'twenty-ui/input'; export const settingsDataModelObjectIdentifiersFormSchema = @@ -100,6 +101,9 @@ export const SettingsDataModelObjectIdentifiersForm = ({ label: 'None', value: null, }; + + const navigate = useNavigate(); + return ( {[ @@ -124,12 +128,23 @@ export const SettingsDataModelObjectIdentifiersForm = ({ render={({ field: { onChange, value } }) => (