diff --git a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx index 67608f689..6879667dc 100644 --- a/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/object-details/components/SettingsObjectFieldDisabledActionDropdown.tsx @@ -21,7 +21,6 @@ export const SettingsObjectFieldInactiveActionDropdown = ({ scopeKey, onDelete, isCustomField, - fieldType, }: SettingsObjectFieldInactiveActionDropdownProps) => { const dropdownId = `${scopeKey}-settings-field-disabled-action-dropdown`; @@ -37,7 +36,7 @@ export const SettingsObjectFieldInactiveActionDropdown = ({ closeDropdown(); }; - const isDeletable = isCustomField && fieldType !== FieldMetadataType.Address; + const isDeletable = isCustomField; return ( { ActionIcon={ activateMetadataField(deactivatedMetadataField) diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts index fe8175773..7147e28ed 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts @@ -7,6 +7,7 @@ import { v4 as uuidV4 } from 'uuid'; import { TypeORMService } from 'src/database/typeorm/typeorm.service'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; +import { compositeTypeDefintions } from 'src/engine/metadata-modules/field-metadata/composite-types'; import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; import { DeleteOneFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/delete-field.input'; import { FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto'; @@ -20,8 +21,12 @@ import { FieldMetadataExceptionCode, } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; import { assertDoesNotNullifyDefaultValueForNonNullableField } from 'src/engine/metadata-modules/field-metadata/utils/assert-does-not-nullify-default-value-for-non-nullable-field.util'; -import { computeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; +import { + computeColumnName, + computeCompositeColumnName, +} from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { generateNullable } from 'src/engine/metadata-modules/field-metadata/utils/generate-nullable'; +import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { assertMutationNotOnRemoteObject } from 'src/engine/metadata-modules/object-metadata/utils/assert-mutation-not-on-remote-object.util'; import { @@ -460,22 +465,54 @@ export class FieldMetadataService extends TypeOrmQueryService { + return { + action: WorkspaceMigrationColumnActionType.DROP, + columnName: computeCompositeColumnName( + fieldMetadata.name, + property, + ), + } satisfies WorkspaceMigrationColumnDrop; + }), + } satisfies WorkspaceMigrationTableAction, + ], + ); + } else { + await this.workspaceMigrationService.createCustomMigration( + generateMigrationName(`delete-${fieldMetadata.name}`), + workspaceId, + [ + { + name: computeObjectTargetTable(objectMetadata), + action: WorkspaceMigrationTableActionType.ALTER, + columns: [ + { + action: WorkspaceMigrationColumnActionType.DROP, + columnName: computeColumnName(fieldMetadata), + } satisfies WorkspaceMigrationColumnDrop, + ], + } satisfies WorkspaceMigrationTableAction, + ], + ); + } await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( workspaceId, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/compute-column-name.util.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/compute-column-name.util.ts index 116eb94f1..263448dab 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/compute-column-name.util.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/compute-column-name.util.ts @@ -1,13 +1,13 @@ -import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; import { CompositeProperty } from 'src/engine/metadata-modules/field-metadata/interfaces/composite-type.interface'; +import { FieldMetadataInterface } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata.interface'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; -import { pascalCase } from 'src/utils/pascal-case'; import { FieldMetadataException, FieldMetadataExceptionCode, } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception'; +import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; +import { pascalCase } from 'src/utils/pascal-case'; type ComputeColumnNameOptions = { isForeignKey?: boolean }; @@ -34,7 +34,7 @@ export function computeColumnName( if (isCompositeFieldMetadataType(fieldMetadataOrFieldName.type)) { throw new FieldMetadataException( - `Cannot compute composite column name for non-composite field metadata type: ${fieldMetadataOrFieldName.type}`, + `Cannot compute composite column name for field: ${fieldMetadataOrFieldName.type}`, FieldMetadataExceptionCode.INVALID_FIELD_INPUT, ); }