diff --git a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx index 858931019..aed21d0ee 100644 --- a/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/objects/forms/components/SettingsDataModelObjectAboutForm.tsx @@ -102,6 +102,8 @@ const StyledLabel = styled.span` const infoCircleElementId = 'info-circle-id'; +export const IS_LABEL_SYNCED_WITH_NAME_LABEL = 'isLabelSyncedWithName'; + export const SettingsDataModelObjectAboutForm = ({ disabled, disableNameEdit, @@ -115,7 +117,7 @@ export const SettingsDataModelObjectAboutForm = ({ isAdvancedModeEnabled, ); - const isLabelSyncedWithName = watch('isLabelSyncedWithName'); + const isLabelSyncedWithName = watch(IS_LABEL_SYNCED_WITH_NAME_LABEL); const labelSingular = watch('labelSingular'); const labelPlural = watch('labelPlural'); const apiNameTooltipText = isLabelSyncedWithName @@ -318,7 +320,7 @@ export const SettingsDataModelObjectAboutForm = ({ ), )} { formValues: SettingsDataModelObjectEditFormValues, ) => { let values = formValues; - if ( - formValues.isLabelSyncedWithName === true || - activeObjectMetadataItem.isLabelSyncedWithName === true - ) { + const dirtyFieldKeys = Object.keys( + formConfig.formState.dirtyFields, + ) as (keyof SettingsDataModelObjectEditFormValues)[]; + const shouldComputeNamesFromLabels: boolean = dirtyFieldKeys.includes( + IS_LABEL_SYNCED_WITH_NAME_LABEL, + ) + ? (formValues.isLabelSyncedWithName as boolean) + : activeObjectMetadataItem.isLabelSyncedWithName; + + if (shouldComputeNamesFromLabels) { values = { ...values, ...(values.labelSingular @@ -104,10 +111,6 @@ export const SettingsObjectEdit = () => { }; } - const dirtyFieldKeys = Object.keys( - formConfig.formState.dirtyFields, - ) as (keyof SettingsDataModelObjectEditFormValues)[]; - return settingsUpdateObjectInputSchema.parse( pick(values, [ ...dirtyFieldKeys, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 7e05d25f9..56c3d549b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -447,6 +447,15 @@ export class ObjectMetadataService extends TypeOrmQueryService { + if ( + fullObjectMetadataAfterUpdate.nameSingular === + fullObjectMetadataAfterUpdate.namePlural + ) { + throw new ObjectMetadataException( + 'The singular and plural name cannot be the same for an object', + ObjectMetadataExceptionCode.INVALID_OBJECT_INPUT, + ); + } + }; }