From 756b30815ea6035f0a32fea6642f0b8f11f37f3d Mon Sep 17 00:00:00 2001 From: Charles Bochet Date: Thu, 21 Dec 2023 23:48:52 +0100 Subject: [PATCH] Fix various bugs before 0.2.2 (#3118) * Fix various bugs before 0.2.2 release * Additional fixes * More fixes * Fixes --- .../components/ActivityBodyEditor.tsx | 1 - .../activities/components/ActivityEditor.tsx | 1 - .../hooks/useOpenCreateActivityDrawer.ts | 1 - .../components/MainNavigationDrawerItems.tsx | 7 - .../components/ObjectMetadataNavItems.tsx | 53 ++++-- .../meta-types/hooks/useCurrencyField.ts | 2 +- .../object-record/hooks/useCreateOneRecord.ts | 4 +- .../hooks/useGenerateEmptyRecord.ts | 156 +----------------- .../object-record/hooks/useUpdateOneRecord.ts | 1 - .../record-table/components/ColumnHead.tsx | 14 +- .../components/ColumnHeadWithDropdown.tsx | 9 +- .../components/RecordTableBody.tsx | 20 ++- .../RecordTableBodyFetchMoreLoader.tsx | 18 +- .../utils/generateEmptyFieldValue.ts | 57 +++++++ .../utils/isFieldMetadataItemAvailable.ts | 6 +- .../components/SettingsObjectFieldPreview.tsx | 4 +- .../components/SettingsObjectAboutSection.tsx | 4 +- .../components/SettingsObjectItemTableRow.tsx | 4 +- .../modules/ui/display/tag/components/Tag.tsx | 18 +- .../layout/dropdown/components/Dropdown.tsx | 6 +- .../ui/layout/page/RightDrawerContainer.tsx | 4 +- .../field-metadata/field-metadata.service.ts | 2 - .../object-metadata.service.ts | 4 - .../relation-metadata.service.ts | 6 - .../workspace-migration.entity.ts | 2 - .../workspace-migration-runner.service.ts | 14 +- .../company.object-metadata.ts | 2 +- .../workspace-sync.metadata.service.ts | 8 - 28 files changed, 183 insertions(+), 245 deletions(-) create mode 100644 packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts diff --git a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx index 503f8891af..c90a05c3af 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityBodyEditor.tsx @@ -28,7 +28,6 @@ export const ActivityBodyEditor = ({ const [body, setBody] = useState(null); const { updateOneRecord } = useUpdateOneRecord({ objectNameSingular: 'activity', - refetchFindManyQuery: true, }); useEffect(() => { diff --git a/packages/twenty-front/src/modules/activities/components/ActivityEditor.tsx b/packages/twenty-front/src/modules/activities/components/ActivityEditor.tsx index 62864b0c72..0f40feb80a 100644 --- a/packages/twenty-front/src/modules/activities/components/ActivityEditor.tsx +++ b/packages/twenty-front/src/modules/activities/components/ActivityEditor.tsx @@ -82,7 +82,6 @@ export const ActivityEditor = ({ const containerRef = useRef(null); const { updateOneRecord: updateOneActivity } = useUpdateOneRecord({ objectNameSingular: 'activity', - refetchFindManyQuery: true, }); const { FieldContextProvider: DueAtFieldContextProvider } = useFieldContext({ diff --git a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts index 0d90a48a39..628f884216 100644 --- a/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts +++ b/packages/twenty-front/src/modules/activities/hooks/useOpenCreateActivityDrawer.ts @@ -24,7 +24,6 @@ export const useOpenCreateActivityDrawer = () => { }); const { createOneRecord: createOneActivity } = useCreateOneRecord({ objectNameSingular: 'activity', - refetchFindManyQuery: true, }); const currentWorkspaceMember = useRecoilValue(currentWorkspaceMemberState); const setHotkeyScope = useSetHotkeyScope(); diff --git a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerItems.tsx b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerItems.tsx index 3403b6ea0e..de94c04d4c 100644 --- a/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerItems.tsx +++ b/packages/twenty-front/src/modules/navigation/components/MainNavigationDrawerItems.tsx @@ -10,7 +10,6 @@ import { IconCheckbox, IconSearch, IconSettings, - IconTargetArrow, } from '@/ui/display/icon'; import { NavigationDrawerItem } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerItem'; import { NavigationDrawerSection } from '@/ui/navigation/navigation-drawer/components/NavigationDrawerSection'; @@ -70,12 +69,6 @@ export const MainNavigationDrawerItems = () => { - ); diff --git a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx index 527b40cdb4..130419aa8e 100644 --- a/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx +++ b/packages/twenty-front/src/modules/object-metadata/components/ObjectMetadataNavItems.tsx @@ -12,20 +12,45 @@ export const ObjectMetadataNavItems = () => { return ( <> - {activeObjectMetadataItems.map((objectMetadataItem) => - objectMetadataItem.nameSingular === 'opportunity' ? null : ( - { - navigate(`/objects/${objectMetadataItem.namePlural}`); - }} - /> - ), - )} + {[ + ...activeObjectMetadataItems + .filter((item) => + ['person', 'company', 'opportunity'].includes(item.nameSingular), + ) + .sort((objectMetadataItemA, _) => { + if (objectMetadataItemA.nameSingular === 'person') { + return -1; + } + + if (objectMetadataItemA.nameSingular === 'opportunity') { + return 1; + } + + return 0; + }), + ...activeObjectMetadataItems + .filter( + (item) => + !['person', 'company', 'opportunity'].includes(item.nameSingular), + ) + .sort((objectMetadataItemA, objectMetadataItemB) => { + return new Date(objectMetadataItemA.createdAt) < + new Date(objectMetadataItemB.createdAt) + ? 1 + : -1; + }), + ].map((objectMetadataItem) => ( + { + navigate(`/objects/${objectMetadataItem.namePlural}`); + }} + /> + ))} ); }; diff --git a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts b/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts index fcc942c8bd..58b7260b0f 100644 --- a/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts +++ b/packages/twenty-front/src/modules/object-record/field/meta-types/hooks/useCurrencyField.ts @@ -38,7 +38,7 @@ const initializeValue = ( return { amount: convertCurrencyMicrosToCurrency(fieldValue.amountMicros), - currencyCode: fieldValue.currencyCode, + currencyCode: CurrencyCode.USD, }; }; diff --git a/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts index d08c69027d..17640c6d9e 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useCreateOneRecord.ts @@ -8,7 +8,6 @@ import { capitalize } from '~/utils/string/capitalize'; type useCreateOneRecordProps = { objectNameSingular: string; - refetchFindManyQuery?: boolean; }; export const useCreateOneRecord = ({ @@ -36,6 +35,7 @@ export const useCreateOneRecord = ({ const generatedEmptyRecord = generateEmptyRecord>({ id: recordId, + createdAt: new Date().toISOString(), ...input, }); @@ -53,7 +53,7 @@ export const useCreateOneRecord = ({ }, optimisticResponse: { [`create${capitalize(objectMetadataItem.nameSingular)}`]: - generateEmptyRecord({ id: recordId, ...input }), + generatedEmptyRecord, }, }); diff --git a/packages/twenty-front/src/modules/object-record/hooks/useGenerateEmptyRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useGenerateEmptyRecord.ts index 17d994ac76..d7f1b90a7f 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useGenerateEmptyRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useGenerateEmptyRecord.ts @@ -1,4 +1,5 @@ import { ObjectMetadataItem } from '@/object-metadata/types/ObjectMetadataItem'; +import { generateEmptyFieldValue } from '@/object-record/utils/generateEmptyFieldValue'; export const useGenerateEmptyRecord = ({ objectMetadataItem, @@ -10,157 +11,14 @@ export const useGenerateEmptyRecord = ({ // Todo replace this by runtime typing const validatedInput = input as { id: string } & { [key: string]: any }; - if (objectMetadataItem.nameSingular === 'company') { - return { - id: validatedInput.id, - domainName: '', - accountOwnerId: null, - createdAt: new Date().toISOString(), - address: '', - people: [ - { - edges: [], - __typename: 'PersonConnection', - }, - ], - xLink: { - label: '', - url: '', - __typename: 'Link', - }, - attachments: { - edges: [], - __typename: 'AttachmentConnection', - }, - activityTargets: { - edges: [], - __typename: 'ActivityTargetConnection', - }, - idealCustomerProfile: null, - annualRecurringRevenue: { - amountMicros: null, - currencyCode: null, - __typename: 'Currency', - }, - updatedAt: new Date().toISOString(), - employees: null, - accountOwner: null, - name: '', - linkedinLink: { - label: '', - url: '', - __typename: 'Link', - }, - favorites: { - edges: [], - __typename: 'FavoriteConnection', - }, - opportunities: { - edges: [], - __typename: 'OpportunityConnection', - }, - __typename: 'Company', - } as T; - } + const emptyRecord = {} as Record; - if (objectMetadataItem.nameSingular === 'person') { - return { - id: validatedInput.id, - activityTargets: { - edges: [], - __typename: 'ActivityTargetConnection', - }, - opportunities: { - edges: [], - __typename: 'OpportunityConnection', - }, - companyId: null, - favorites: { - edges: [], - __typename: 'FavoriteConnection', - }, - phone: '', - company: null, - xLink: { - label: '', - url: '', - __typename: 'Link', - }, - jobTitle: '', - pointOfContactForOpportunities: { - edges: [], - __typename: 'OpportunityConnection', - }, - email: '', - attachments: { - edges: [], - __typename: 'AttachmentConnection', - }, - name: { - firstName: '', - lastName: '', - __typename: 'FullName', - }, - avatarUrl: '', - updatedAt: new Date().toISOString(), - createdAt: new Date().toISOString(), - city: '', - linkedinLink: { - label: '', - url: '', - __typename: 'Link', - }, - __typename: 'Person', - } as T; - } - - if (objectMetadataItem.nameSingular === 'opportunity') { - return { - id: validatedInput.id, - pipelineStepId: validatedInput.pipelineStepId, - closeDate: null, - updatedAt: new Date().toISOString(), - pipelineStep: null, - probability: '0', - pointOfContactId: null, - personId: null, - amount: { - amountMicros: null, - currencyCode: null, - __typename: 'Currency', - }, - createdAt: new Date().toISOString(), - pointOfContact: null, - person: null, - company: null, - companyId: validatedInput.companyId, - __typename: 'Opportunity', - } as T; - } - - if (objectMetadataItem.nameSingular === 'opportunity') { - return { - id: validatedInput.id, - pipelineStepId: validatedInput.pipelineStepId, - closeDate: null, - updatedAt: new Date().toISOString(), - pipelineStep: null, - probability: '0', - pointOfContactId: null, - personId: null, - amount: { - amountMicros: null, - currencyCode: null, - __typename: 'Currency', - }, - createdAt: new Date().toISOString(), - pointOfContact: null, - person: null, - company: null, - companyId: validatedInput.companyId, - __typename: 'Opportunity', - } as T; + for (const fieldMetadataItem of objectMetadataItem.fields) { + emptyRecord[fieldMetadataItem.name] = + validatedInput[fieldMetadataItem.name] ?? + generateEmptyFieldValue(fieldMetadataItem); } + return emptyRecord as T; }; return { diff --git a/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts b/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts index 010d55c624..136abacbe6 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/useUpdateOneRecord.ts @@ -7,7 +7,6 @@ import { capitalize } from '~/utils/string/capitalize'; type useUpdateOneRecordProps = { objectNameSingular: string; - refetchFindManyQuery?: boolean; }; export const useUpdateOneRecord = ({ diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx index 86852946a7..c3f61d8988 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHead.tsx @@ -43,13 +43,11 @@ export const ColumnHead = ({ column }: ColumnHeadProps) => { const Icon = getIcon(column.iconName); return ( - <> - - - - - {column.label} - - + + + + + {column.label} + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx index dd84a7fef7..be45fa901b 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/ColumnHeadWithDropdown.tsx @@ -1,3 +1,5 @@ +import styled from '@emotion/styled'; + import { Dropdown } from '@/ui/layout/dropdown/components/Dropdown'; import { DropdownScope } from '@/ui/layout/dropdown/scopes/DropdownScope'; @@ -14,6 +16,11 @@ type ColumnHeadWithDropdownProps = { primaryColumnKey: string; }; +const StyledDropdown = styled(Dropdown)` + display: flex; + flex: 1; +`; + export const ColumnHeadWithDropdown = ({ column, isFirstColumn, @@ -22,7 +29,7 @@ export const ColumnHeadWithDropdown = ({ }: ColumnHeadWithDropdownProps) => { return ( - } dropdownComponents={ { const tableRowIds = useRecoilValue(tableRowIdsState); return ( - - {tableRowIds.map((rowId, rowIndex) => ( - - - - - - ))} + <> + + {tableRowIds.map((rowId, rowIndex) => ( + + + + + + ))} + - + ); }; diff --git a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableBodyFetchMoreLoader.tsx b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableBodyFetchMoreLoader.tsx index 5ea98abb29..aa212ac772 100644 --- a/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableBodyFetchMoreLoader.tsx +++ b/packages/twenty-front/src/modules/object-record/record-table/components/RecordTableBodyFetchMoreLoader.tsx @@ -30,11 +30,15 @@ export const RecordTableBodyFetchMoreLoader = () => { onChange: onLastRowVisible, }); - return isFetchingMoreObjects ? ( - - - Loading more... - - - ) : null; + return ( + + {isFetchingMoreObjects ? ( + + + Loading more... + + + ) : null} + + ); }; diff --git a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts new file mode 100644 index 0000000000..adf24323a7 --- /dev/null +++ b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts @@ -0,0 +1,57 @@ +import { FieldMetadataItem } from '@/object-metadata/types/FieldMetadataItem'; +import { FieldMetadataType } from '~/generated/graphql'; + +export const generateEmptyFieldValue = ( + fieldMetadataItem: FieldMetadataItem, +) => { + switch (fieldMetadataItem.type) { + case FieldMetadataType.Email: + case FieldMetadataType.Phone: + case FieldMetadataType.Text: { + return ''; + } + case FieldMetadataType.Link: { + return { + label: '', + url: '', + __typename: 'Link', + }; + } + case FieldMetadataType.FullName: { + return { + firstName: '', + lastName: '', + __typename: 'FullName', + }; + } + case FieldMetadataType.DateTime: { + return null; + } + case FieldMetadataType.Number: + case FieldMetadataType.Rating: + case FieldMetadataType.Numeric: { + return null; + } + case FieldMetadataType.Uuid: { + return ''; + } + case FieldMetadataType.Boolean: { + return true; + } + case FieldMetadataType.Relation: { + return null; + } + case FieldMetadataType.Currency: { + return { + amountMicros: null, + currencyCode: null, + __typename: 'Currency', + }; + } + + case FieldMetadataType.MultiSelect: + case FieldMetadataType.Select: { + throw new Error('Not implemented yet'); + } + } +}; diff --git a/packages/twenty-front/src/modules/object-record/utils/isFieldMetadataItemAvailable.ts b/packages/twenty-front/src/modules/object-record/utils/isFieldMetadataItemAvailable.ts index e3db7bf12b..a6679aa478 100644 --- a/packages/twenty-front/src/modules/object-record/utils/isFieldMetadataItemAvailable.ts +++ b/packages/twenty-front/src/modules/object-record/utils/isFieldMetadataItemAvailable.ts @@ -5,7 +5,9 @@ export const isFieldMetadataItemAvailable = ( fieldMetadataItem: FieldMetadataItem, ) => fieldMetadataItem.type !== 'UUID' && - (fieldMetadataItem.type !== 'RELATION' || - parseFieldRelationType(fieldMetadataItem) === 'TO_ONE_OBJECT') && + !( + fieldMetadataItem.type === 'RELATION' && + parseFieldRelationType(fieldMetadataItem) !== 'TO_ONE_OBJECT' + ) && !fieldMetadataItem.isSystem && !!fieldMetadataItem.isActive; diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx index f137a6d939..1683bdc358 100644 --- a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldPreview.tsx @@ -111,9 +111,9 @@ export const SettingsObjectFieldPreview = ({ {objectMetadataItem?.labelPlural} {objectMetadataItem?.isCustom ? ( - + ) : ( - + )} {isCustom ? ( - + ) : ( - + )} {objectItem.isCustom ? ( - + ) : ( - + )} diff --git a/packages/twenty-front/src/modules/ui/display/tag/components/Tag.tsx b/packages/twenty-front/src/modules/ui/display/tag/components/Tag.tsx index 7019f4f06d..f0b534128e 100644 --- a/packages/twenty-front/src/modules/ui/display/tag/components/Tag.tsx +++ b/packages/twenty-front/src/modules/ui/display/tag/components/Tag.tsx @@ -5,6 +5,7 @@ import { themeColorSchema } from '@/ui/theme/utils/themeColorSchema'; const StyledTag = styled.h3<{ color: ThemeColor; + weight: TagWeight; }>` align-items: center; background: ${({ color, theme }) => theme.tag.background[color]}; @@ -13,7 +14,10 @@ const StyledTag = styled.h3<{ display: inline-flex; font-size: ${({ theme }) => theme.font.size.md}; font-style: normal; - font-weight: ${({ theme }) => theme.font.weight.regular}; + font-weight: ${({ theme, weight }) => + weight === 'regular' + ? theme.font.weight.regular + : theme.font.weight.medium}; height: ${({ theme }) => theme.spacing(5)}; margin: 0; overflow: hidden; @@ -26,18 +30,28 @@ const StyledContent = styled.span` white-space: nowrap; `; +type TagWeight = 'regular' | 'medium'; + type TagProps = { className?: string; color: ThemeColor; text: string; onClick?: () => void; + weight?: TagWeight; }; -export const Tag = ({ className, color, text, onClick }: TagProps) => ( +export const Tag = ({ + className, + color, + text, + onClick, + weight = 'regular', +}: TagProps) => ( {text} diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index a242ee5749..2f9866221f 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -102,7 +102,11 @@ export const Dropdown = ({ return (
{clickableComponent && ( -
+
{clickableComponent}
)} diff --git a/packages/twenty-front/src/modules/ui/layout/page/RightDrawerContainer.tsx b/packages/twenty-front/src/modules/ui/layout/page/RightDrawerContainer.tsx index aaa6e49890..d7fcdd1730 100644 --- a/packages/twenty-front/src/modules/ui/layout/page/RightDrawerContainer.tsx +++ b/packages/twenty-front/src/modules/ui/layout/page/RightDrawerContainer.tsx @@ -18,7 +18,9 @@ const StyledMainContainer = styled.div` flex-direction: row; gap: ${({ theme }) => theme.spacing(2)}; min-height: 0; - padding: ${({ theme }) => theme.spacing(0, 3)}; + padding-bottom: ${({ theme }) => theme.spacing(3)}; + padding-left: 0; + padding-right: ${({ theme }) => theme.spacing(3)}; width: 100%; @media (max-width: ${MOBILE_VIEWPORT}px) { diff --git a/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts b/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts index e3cb818516..49f0fca457 100644 --- a/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts +++ b/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts @@ -94,7 +94,6 @@ export class FieldMetadataService extends TypeOrmQueryService field.type !== FieldMetadataType.RELATION) @@ -402,7 +401,6 @@ export class WorkspaceSyncMetadataService { ({ name: object.targetTableName, action: 'alter', - schemaName: object.dataSource.schema, columns: this.workspaceMigrationFactory.createColumnActions( WorkspaceMigrationColumnActionType.CREATE, field, @@ -434,8 +432,6 @@ export class WorkspaceSyncMetadataService { { name: objectsInDbById[field.objectMetadataId].targetTableName, action: 'alter', - schemaName: - objectsInDbById[field.objectMetadataId].dataSource.schema, columns: this.workspaceMigrationFactory.createColumnActions( WorkspaceMigrationColumnActionType.CREATE, field, @@ -457,8 +453,6 @@ export class WorkspaceSyncMetadataService { { name: objectsInDbById[field.objectMetadataId].targetTableName, action: 'alter', - schemaName: - objectsInDbById[field.objectMetadataId].dataSource.schema, columns: [ { action: WorkspaceMigrationColumnActionType.DROP, @@ -524,13 +518,11 @@ export class WorkspaceSyncMetadataService { { name: toObjectMetadata.targetTableName, action: 'alter', - schemaName: toObjectMetadata.dataSource.schema, columns: [ { action: WorkspaceMigrationColumnActionType.RELATION, columnName: `${camelCase(toFieldMetadata.name)}Id`, referencedTableName: fromObjectMetadata.targetTableName, - referencedSchema: fromObjectMetadata.dataSource.schema, referencedTableColumnName: 'id', isUnique: relation.relationType === RelationMetadataType.ONE_TO_ONE,