Improve FieldMetadataEntity defaultValue, settings and options typing (#13320)
# Introduction Following https://github.com/twentyhq/twenty/pull/13264, this PR introduces several `fieldMetadataEntity` typing enhancement suggestions. Mainly any nullable field metadata entity properties are now either nullable or defined. Or never if field is dynamically required or not depending on the field metadata type This enhance DevX ## Standards - field enum ( `MULTI_SELECT`, `SELECT`, `RATING` ) will never have `options` set to `NULL` in db - field `RELATION` or `MORH_RELATION` won't ever have its relation fields set to `NULL` in db - field of any type `settings`, even if possibly defined, can still be `NULL` in db - field of any type `defaultValue`, even if possibly defined, can still be `NULL` in db It coud be interesting to guard these standards by adding dedicated pg constraints on each field ## TypesScript type tests added coverage for each `settings`, `defaultValue`, and `options` depending on the current `fieldMetadata` Honestly I don' know if this typescript assertions test file is not overkill, but regarding metadata staticness it might be very interesting to have this guard ## Possible improvements - We could type as `unknown` instead of "all" on `FieldMetadataType` inferrance - We still need to deprecate remaining duplicated entities such as `Index/Field/MetadataInterface` etc not a huge refactor neither urgent
This commit is contained in:
@ -131,7 +131,6 @@ export const fieldRelationMock = getMockFieldMetadataEntity({
|
||||
type: FieldMetadataType.RELATION,
|
||||
label: 'Field Relation',
|
||||
isNullable: true,
|
||||
defaultValue: null,
|
||||
settings: {
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
joinColumnName: 'fieldRelationId',
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { WorkspaceEntityDuplicateCriteria } from 'src/engine/api/graphql/workspace-query-builder/types/workspace-entity-duplicate-criteria.type';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
import { getMockObjectMetadataItemWithFieldsMaps } from 'src/utils/__test__/get-object-metadata-item-with-fields-maps.mock';
|
||||
|
||||
@ -57,7 +56,7 @@ export const mockPersonObjectMetadataWithFieldMaps = (
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'emails-id': getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
objectMetadataId: '',
|
||||
@ -75,7 +74,7 @@ export const mockPersonObjectMetadataWithFieldMaps = (
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'linkedinLink-id': getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
objectMetadataId: '',
|
||||
@ -95,7 +94,7 @@ export const mockPersonObjectMetadataWithFieldMaps = (
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'jobTitle-id': getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
objectMetadataId: '',
|
||||
@ -111,6 +110,6 @@ export const mockPersonObjectMetadataWithFieldMaps = (
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
});
|
||||
|
||||
@ -5,7 +5,6 @@ import {
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { getFieldType } from 'src/engine/api/rest/core/query-builder/utils/get-field-type.utils';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
|
||||
@ -25,7 +24,7 @@ describe('getFieldType', () => {
|
||||
});
|
||||
|
||||
const fieldsById: FieldMetadataMap = {
|
||||
'field-number-id': completeFieldNumberMock as FieldMetadataEntity,
|
||||
'field-number-id': completeFieldNumberMock,
|
||||
};
|
||||
|
||||
const mockObjectMetadataWithFieldMaps = {
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { FieldMetadataDefaultSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
import { FieldMetadataRelationSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import {
|
||||
@ -10,7 +10,6 @@ import {
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { mapFieldMetadataToGraphqlQuery } from 'src/engine/api/rest/core/query-builder/utils/map-field-metadata-to-graphql-query.utils';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
|
||||
import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
|
||||
@ -60,9 +59,9 @@ describe('mapFieldMetadataToGraphqlQuery', () => {
|
||||
});
|
||||
|
||||
const fieldsById: FieldMetadataMap = {
|
||||
'field-number-id': typedFieldNumberMock as FieldMetadataEntity,
|
||||
'field-text-id': typedFieldTextMock as FieldMetadataEntity,
|
||||
'field-currency-id': typedFieldCurrencyMock as FieldMetadataEntity,
|
||||
'field-number-id': typedFieldNumberMock,
|
||||
'field-text-id': typedFieldTextMock,
|
||||
'field-currency-id': typedFieldCurrencyMock,
|
||||
};
|
||||
|
||||
const typedObjectMetadataItem: ObjectMetadataItemWithFieldMaps = {
|
||||
@ -90,19 +89,19 @@ describe('mapFieldMetadataToGraphqlQuery', () => {
|
||||
expect(
|
||||
mapFieldMetadataToGraphqlQuery(
|
||||
objectMetadataMapsMock,
|
||||
typedFieldNumberMock as FieldMetadataEntity,
|
||||
typedFieldNumberMock,
|
||||
),
|
||||
).toEqual('fieldNumber');
|
||||
expect(
|
||||
mapFieldMetadataToGraphqlQuery(
|
||||
objectMetadataMapsMock,
|
||||
typedFieldTextMock as FieldMetadataEntity,
|
||||
typedFieldTextMock,
|
||||
),
|
||||
).toEqual('fieldText');
|
||||
expect(
|
||||
mapFieldMetadataToGraphqlQuery(
|
||||
objectMetadataMapsMock,
|
||||
typedFieldCurrencyMock as FieldMetadataEntity,
|
||||
typedFieldCurrencyMock,
|
||||
),
|
||||
).toEqual(`
|
||||
fieldCurrency
|
||||
@ -132,8 +131,8 @@ describe('mapFieldMetadataToGraphqlQuery', () => {
|
||||
fieldMetadataType === FieldMetadataType.MORPH_RELATION
|
||||
? ({
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
} as FieldMetadataDefaultSettings)
|
||||
: undefined,
|
||||
} as FieldMetadataRelationSettings)
|
||||
: null,
|
||||
});
|
||||
|
||||
expect(
|
||||
|
||||
@ -4,7 +4,6 @@ import { DateDisplayFormat } from 'src/engine/metadata-modules/field-metadata/in
|
||||
import { RelationOnDeleteAction } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-on-delete-action.interface';
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
import { getMockObjectMetadataItemWithFieldsMaps } from 'src/utils/__test__/get-object-metadata-item-with-fields-maps.mock';
|
||||
|
||||
@ -50,7 +49,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-5eef-417a-b517-ebeedaa8e10b': getMockFieldMetadataEntity({
|
||||
id: '20202020-5eef-417a-b517-ebeedaa8e10b',
|
||||
workspaceId,
|
||||
@ -69,7 +68,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-597c-44d3-98ec-ea71aea5256b': getMockFieldMetadataEntity({
|
||||
id: '20202020-597c-44d3-98ec-ea71aea5256b',
|
||||
workspaceId,
|
||||
@ -88,7 +87,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-9b94-454a-94ca-8afb09c68faf': getMockFieldMetadataEntity({
|
||||
id: '20202020-9b94-454a-94ca-8afb09c68faf',
|
||||
workspaceId,
|
||||
@ -144,7 +143,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-30a5-4d8e-9b93-12d31ece0aaa': getMockFieldMetadataEntity({
|
||||
id: '20202020-30a5-4d8e-9b93-12d31ece0aaa',
|
||||
workspaceId,
|
||||
@ -163,7 +162,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-f95f-424f-ab32-65961e8e9635': getMockFieldMetadataEntity({
|
||||
id: '20202020-f95f-424f-ab32-65961e8e9635',
|
||||
workspaceId,
|
||||
@ -182,7 +181,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-5e10-4780-babb-38a465ac546c': getMockFieldMetadataEntity({
|
||||
id: '20202020-5e10-4780-babb-38a465ac546c',
|
||||
workspaceId,
|
||||
@ -201,7 +200,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-8f4a-4f8d-822e-90fe72f75b79': getMockFieldMetadataEntity({
|
||||
id: '20202020-8f4a-4f8d-822e-90fe72f75b79',
|
||||
workspaceId,
|
||||
@ -220,7 +219,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-f120-4b59-b239-f7f1d8eb243e': getMockFieldMetadataEntity({
|
||||
id: '20202020-f120-4b59-b239-f7f1d8eb243e',
|
||||
workspaceId,
|
||||
@ -240,7 +239,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: false,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-dcc8-4318-9756-b87377692561': getMockFieldMetadataEntity({
|
||||
id: '20202020-dcc8-4318-9756-b87377692561',
|
||||
workspaceId,
|
||||
@ -260,7 +259,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: false,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-1694-4f8b-8760-61a5ff330022': getMockFieldMetadataEntity({
|
||||
id: '20202020-1694-4f8b-8760-61a5ff330022',
|
||||
workspaceId,
|
||||
@ -280,7 +279,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: false,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-4f52-4dea-a116-723f9bf7f082': getMockFieldMetadataEntity({
|
||||
id: '20202020-4f52-4dea-a116-723f9bf7f082',
|
||||
workspaceId,
|
||||
@ -288,7 +287,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'pointOfContact',
|
||||
label: 'Point of Contact',
|
||||
defaultValue: null,
|
||||
description: 'The point of contact for this opportunity',
|
||||
icon: 'IconUser',
|
||||
settings: {
|
||||
@ -304,7 +302,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-fc02-4be2-be1a-e121daf5400d': getMockFieldMetadataEntity({
|
||||
id: '20202020-fc02-4be2-be1a-e121daf5400d',
|
||||
workspaceId,
|
||||
@ -312,7 +310,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'company',
|
||||
label: 'Company',
|
||||
defaultValue: null,
|
||||
description: 'The company this opportunity is associated with',
|
||||
icon: 'IconBuildingSkyscraper',
|
||||
settings: {
|
||||
@ -328,7 +325,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-fd9f-48f0-bd5f-5b0fec6a5de4': getMockFieldMetadataEntity({
|
||||
id: '20202020-fd9f-48f0-bd5f-5b0fec6a5de4',
|
||||
workspaceId,
|
||||
@ -336,7 +333,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'favorites',
|
||||
label: 'Favorites',
|
||||
defaultValue: null,
|
||||
description: 'Users who favorited this opportunity',
|
||||
icon: 'IconStar',
|
||||
settings: {
|
||||
@ -351,7 +347,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-88ab-4138-98ce-80533bb423e3': getMockFieldMetadataEntity({
|
||||
id: '20202020-88ab-4138-98ce-80533bb423e3',
|
||||
workspaceId,
|
||||
@ -359,7 +355,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'taskTargets',
|
||||
label: 'Task Targets',
|
||||
defaultValue: null,
|
||||
description: 'Tasks targeting this opportunity',
|
||||
icon: 'IconCheckbox',
|
||||
settings: {
|
||||
@ -374,7 +369,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-4258-422b-b35b-db3f090af8da': getMockFieldMetadataEntity({
|
||||
id: '20202020-4258-422b-b35b-db3f090af8da',
|
||||
workspaceId,
|
||||
@ -382,7 +377,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'noteTargets',
|
||||
label: 'Note Targets',
|
||||
defaultValue: null,
|
||||
description: 'Notes targeting this opportunity',
|
||||
icon: 'IconNotes',
|
||||
settings: {
|
||||
@ -397,7 +391,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-16ca-40a7-a1ba-712975c916cd': getMockFieldMetadataEntity({
|
||||
id: '20202020-16ca-40a7-a1ba-712975c916cd',
|
||||
workspaceId,
|
||||
@ -405,7 +399,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'attachments',
|
||||
label: 'Attachments',
|
||||
defaultValue: null,
|
||||
description: 'Attachments for this opportunity',
|
||||
icon: 'IconPaperclip',
|
||||
settings: {
|
||||
@ -420,7 +413,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'20202020-92a5-47bf-a38d-c1c72b2c3e4d': getMockFieldMetadataEntity({
|
||||
id: '20202020-92a5-47bf-a38d-c1c72b2c3e4d',
|
||||
workspaceId,
|
||||
@ -428,7 +421,6 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
type: FieldMetadataType.RELATION,
|
||||
name: 'timelineActivities',
|
||||
label: 'Timeline Activities',
|
||||
defaultValue: null,
|
||||
description: 'Timeline activities for this opportunity',
|
||||
icon: 'IconTimeline',
|
||||
settings: {
|
||||
@ -443,7 +435,7 @@ export const OPPORTUNITY_WITH_FIELDS_MAPS =
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
updatedAt: new Date('2025-06-27T12:55:13.271Z'),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
fieldIdByName: {
|
||||
name: '20202020-c2f1-4435-adca-22931f8b41b6',
|
||||
|
||||
@ -5,7 +5,6 @@ import {
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { checkFilterEnumValues } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/check-filter-enum-values';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
|
||||
@ -26,7 +25,7 @@ describe('checkFilterEnumValues', () => {
|
||||
});
|
||||
|
||||
const fieldsById: FieldMetadataMap = {
|
||||
'field-select-id': completeFieldSelectMock as FieldMetadataEntity,
|
||||
'field-select-id': completeFieldSelectMock,
|
||||
};
|
||||
|
||||
const mockObjectMetadataWithFieldMaps = {
|
||||
|
||||
@ -4,7 +4,6 @@ import {
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { parseFilter } from 'src/engine/api/rest/core/query-builder/utils/filter-utils/parse-filter.utils';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
@ -39,8 +38,8 @@ describe('parseFilter', () => {
|
||||
});
|
||||
|
||||
const fieldsById: FieldMetadataMap = {
|
||||
'field-number-id': completeFieldNumberMock as FieldMetadataEntity,
|
||||
'field-text-id': completeFieldTextMock as FieldMetadataEntity,
|
||||
'field-number-id': completeFieldNumberMock,
|
||||
'field-text-id': completeFieldTextMock,
|
||||
};
|
||||
|
||||
const mockObjectMetadataWithFieldMaps: ObjectMetadataItemWithFieldMaps = {
|
||||
|
||||
@ -7,7 +7,6 @@ import {
|
||||
objectMetadataMapItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { FilterInputFactory } from 'src/engine/api/rest/input-factories/filter-input.factory';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FieldMetadataMap } from 'src/engine/metadata-modules/types/field-metadata-map';
|
||||
import { ObjectMetadataItemWithFieldMaps } from 'src/engine/metadata-modules/types/object-metadata-item-with-field-maps';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
@ -27,7 +26,7 @@ describe('FilterInputFactory', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
const completeFieldTextMock = getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
@ -41,7 +40,7 @@ describe('FilterInputFactory', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
const completeFieldCurrencyMock = getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
@ -55,7 +54,7 @@ describe('FilterInputFactory', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
const fieldsById: FieldMetadataMap = {
|
||||
'field-number-id': completeFieldNumberMock,
|
||||
|
||||
@ -4,7 +4,6 @@ import { OrderByDirection } from 'src/engine/api/graphql/workspace-query-builder
|
||||
|
||||
import { GraphqlQueryRunnerException } from 'src/engine/api/graphql/graphql-query-runner/errors/graphql-query-runner.exception';
|
||||
import { computeCursorArgFilter } from 'src/engine/api/utils/compute-cursor-arg-filter.utils';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
import { getMockObjectMetadataItemWithFieldsMaps } from 'src/utils/__test__/get-object-metadata-item-with-fields-maps.mock';
|
||||
|
||||
@ -44,7 +43,7 @@ describe('computeCursorArgFilter', () => {
|
||||
isNullable: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'age-id': getMockFieldMetadataEntity({
|
||||
workspaceId: 'workspace-id',
|
||||
objectMetadataId: 'object-id',
|
||||
@ -56,7 +55,7 @@ describe('computeCursorArgFilter', () => {
|
||||
isNullable: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
'fullname-id': getMockFieldMetadataEntity({
|
||||
workspaceId: 'workspace-id',
|
||||
objectMetadataId: 'object-id',
|
||||
@ -68,7 +67,7 @@ describe('computeCursorArgFilter', () => {
|
||||
isNullable: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { getMockFieldMetadataEntity } from 'src/utils/__test__/get-field-metadata-entity.mock';
|
||||
import { getMockObjectMetadataItemWithFieldsMaps } from 'src/utils/__test__/get-object-metadata-item-with-fields-maps.mock';
|
||||
|
||||
@ -47,7 +46,7 @@ export const mockObjectMetadataItemsWithFieldMaps = [
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
fieldIdByName: {
|
||||
name: 'nameFieldMetadataId',
|
||||
@ -90,7 +89,7 @@ export const mockObjectMetadataItemsWithFieldMaps = [
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
domainNameFieldMetadataId: getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
objectMetadataId: '20202020-c03c-45d6-a4b0-04afe1357c5c',
|
||||
@ -110,7 +109,7 @@ export const mockObjectMetadataItemsWithFieldMaps = [
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
fieldIdByName: {
|
||||
name: 'nameFieldMetadataId',
|
||||
@ -154,7 +153,7 @@ export const mockObjectMetadataItemsWithFieldMaps = [
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
imageIdentifierFieldMetadataId: getMockFieldMetadataEntity({
|
||||
workspaceId,
|
||||
objectMetadataId: '20202020-3d75-4aab-bacd-ee176c5f63ca',
|
||||
@ -170,7 +169,7 @@ export const mockObjectMetadataItemsWithFieldMaps = [
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
fieldIdByName: {
|
||||
name: 'nameFieldMetadataId',
|
||||
|
||||
@ -133,7 +133,7 @@ export class FieldMetadataDTO<T extends FieldMetadataType = FieldMetadataType> {
|
||||
// @Validate(IsFieldMetadataOptions)
|
||||
@IsOptional()
|
||||
@Field(() => GraphQLJSON, { nullable: true })
|
||||
options?: FieldMetadataOptions<T> | null;
|
||||
options?: FieldMetadataOptions<T>;
|
||||
|
||||
@IsOptional()
|
||||
@Field(() => GraphQLJSON, { nullable: true })
|
||||
|
||||
@ -24,7 +24,7 @@ import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permis
|
||||
|
||||
type IsRelationType<Ttype, T extends FieldMetadataType = FieldMetadataType> =
|
||||
IsExactly<T, FieldMetadataType> extends true
|
||||
? null | Ttype
|
||||
? null | Ttype // Could be improved to be | unknown
|
||||
: T extends FieldMetadataType.RELATION
|
||||
? Ttype
|
||||
: T extends FieldMetadataType.MORPH_RELATION
|
||||
@ -53,7 +53,8 @@ type IsRelationType<Ttype, T extends FieldMetadataType = FieldMetadataType> =
|
||||
// TODO add some documentation about this entity
|
||||
export class FieldMetadataEntity<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> {
|
||||
> implements Required<FieldMetadataEntity>
|
||||
{
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
@ -84,7 +85,7 @@ export class FieldMetadataEntity<
|
||||
label: string;
|
||||
|
||||
@Column({ nullable: true, type: 'jsonb' })
|
||||
defaultValue: FieldMetadataDefaultValue<T> | null;
|
||||
defaultValue: FieldMetadataDefaultValue<T>;
|
||||
|
||||
@Column({ nullable: true, type: 'text' })
|
||||
description: string | null;
|
||||
@ -93,13 +94,13 @@ export class FieldMetadataEntity<
|
||||
icon: string | null;
|
||||
|
||||
@Column({ type: 'jsonb', nullable: true })
|
||||
standardOverrides?: FieldStandardOverridesDTO | null;
|
||||
standardOverrides: FieldStandardOverridesDTO | null;
|
||||
|
||||
@Column('jsonb', { nullable: true })
|
||||
options: FieldMetadataOptions<T> | null;
|
||||
options: FieldMetadataOptions<T>;
|
||||
|
||||
@Column('jsonb', { nullable: true })
|
||||
settings?: FieldMetadataSettings<T> | null;
|
||||
settings: FieldMetadataSettings<T>;
|
||||
|
||||
@Column({ default: false })
|
||||
isCustom: boolean;
|
||||
|
||||
@ -110,7 +110,7 @@ describe('BeforeUpdateOneField', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(fieldMetadataService, 'findOneWithinWorkspace')
|
||||
@ -147,7 +147,7 @@ describe('BeforeUpdateOneField', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(fieldMetadataService, 'findOneWithinWorkspace')
|
||||
@ -182,7 +182,7 @@ describe('BeforeUpdateOneField', () => {
|
||||
isLabelSyncedWithName: true,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(fieldMetadataService, 'findOneWithinWorkspace')
|
||||
@ -230,7 +230,7 @@ describe('BeforeUpdateOneField', () => {
|
||||
},
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(fieldMetadataService, 'findOneWithinWorkspace')
|
||||
@ -277,7 +277,7 @@ describe('BeforeUpdateOneField', () => {
|
||||
isLabelSyncedWithName: false,
|
||||
createdAt: new Date(),
|
||||
updatedAt: new Date(),
|
||||
}) as FieldMetadataEntity;
|
||||
});
|
||||
|
||||
jest
|
||||
.spyOn(fieldMetadataService, 'findOneWithinWorkspace')
|
||||
|
||||
@ -73,7 +73,7 @@ export type FieldMetadataDefaultValue<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> =
|
||||
IsExactly<T, FieldMetadataType> extends true
|
||||
? FieldMetadataDefaultValueForAnyType
|
||||
? FieldMetadataDefaultValueForAnyType | null // Could be improved to be | unknown
|
||||
: T extends keyof FieldMetadataDefaultValueMapping
|
||||
? FieldMetadataDefaultValueForType<T>
|
||||
: never;
|
||||
|
||||
@ -15,7 +15,7 @@ export type FieldMetadataOptions<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> =
|
||||
IsExactly<T, FieldMetadataType> extends true
|
||||
? FieldMetadataDefaultOption[] | FieldMetadataComplexOption[]
|
||||
? null | (FieldMetadataDefaultOption[] | FieldMetadataComplexOption[]) // Could be improved to be | unknown
|
||||
: T extends keyof FieldMetadataOptionsMapping
|
||||
? FieldMetadataOptionsMapping[T]
|
||||
: never;
|
||||
|
||||
@ -9,10 +9,6 @@ export enum NumberDataType {
|
||||
BIGINT = 'bigint',
|
||||
}
|
||||
|
||||
export type FieldMetadataDefaultSettings = {
|
||||
isForeignKey?: boolean;
|
||||
};
|
||||
|
||||
export enum DateDisplayFormat {
|
||||
RELATIVE = 'RELATIVE',
|
||||
USER_SETTINGS = 'USER_SETTINGS',
|
||||
@ -54,11 +50,14 @@ type FieldMetadataSettingsMapping = {
|
||||
[FieldMetadataType.MORPH_RELATION]: FieldMetadataRelationSettings;
|
||||
};
|
||||
|
||||
export type AllFieldMetadataSettings =
|
||||
FieldMetadataSettingsMapping[keyof FieldMetadataSettingsMapping];
|
||||
|
||||
export type FieldMetadataSettings<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> =
|
||||
IsExactly<T, FieldMetadataType> extends true
|
||||
? FieldMetadataDefaultSettings
|
||||
? null | AllFieldMetadataSettings // Could be improved to be | unknown
|
||||
: T extends keyof FieldMetadataSettingsMapping
|
||||
? FieldMetadataSettingsMapping[T] & FieldMetadataDefaultSettings
|
||||
? FieldMetadataSettingsMapping[T] | null
|
||||
: never;
|
||||
|
||||
@ -137,12 +137,17 @@ export class FieldMetadataEnumValidationService {
|
||||
);
|
||||
}
|
||||
|
||||
private validateDuplicates(options: FieldMetadataOptions) {
|
||||
private validateDuplicates(
|
||||
options: FieldMetadataOptions<EnumFieldMetadataType>,
|
||||
) {
|
||||
const fieldsToCheckForDuplicates = [
|
||||
'position',
|
||||
'id',
|
||||
'value',
|
||||
] as const satisfies (keyof FieldMetadataOptions[number])[];
|
||||
] as const satisfies (keyof (
|
||||
| FieldMetadataDefaultOption[]
|
||||
| FieldMetadataComplexOption[]
|
||||
)[number])[];
|
||||
const duplicatedValidators = fieldsToCheckForDuplicates.map<
|
||||
Validator<FieldMetadataDefaultOption[] | FieldMetadataComplexOption[]>
|
||||
>((field) => ({
|
||||
@ -178,7 +183,7 @@ export class FieldMetadataEnumValidationService {
|
||||
}
|
||||
|
||||
private validateSelectDefaultValue(
|
||||
options: FieldMetadataOptions,
|
||||
options: FieldMetadataOptions<EnumFieldMetadataType>,
|
||||
defaultValue: unknown,
|
||||
) {
|
||||
if (typeof defaultValue !== 'string') {
|
||||
@ -209,7 +214,7 @@ export class FieldMetadataEnumValidationService {
|
||||
}
|
||||
|
||||
private validateMultiSelectDefaultValue(
|
||||
options: FieldMetadataOptions,
|
||||
options: FieldMetadataOptions<EnumFieldMetadataType>,
|
||||
defaultValue: unknown,
|
||||
) {
|
||||
if (!Array.isArray(defaultValue)) {
|
||||
@ -241,7 +246,7 @@ export class FieldMetadataEnumValidationService {
|
||||
|
||||
private validateFieldMetadataDefaultValue(
|
||||
fieldType: EnumFieldMetadataType,
|
||||
options: FieldMetadataOptions,
|
||||
options: FieldMetadataOptions<EnumFieldMetadataType>,
|
||||
defaultValue: unknown,
|
||||
) {
|
||||
switch (fieldType) {
|
||||
|
||||
@ -8,8 +8,8 @@ import { v4 } from 'uuid';
|
||||
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import {
|
||||
FieldMetadataException,
|
||||
FieldMetadataExceptionCode,
|
||||
|
||||
@ -8,6 +8,7 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { Repository } from 'typeorm';
|
||||
import { v4 } from 'uuid';
|
||||
|
||||
import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
|
||||
@ -313,6 +314,7 @@ export class FieldMetadataRelationService {
|
||||
});
|
||||
}
|
||||
|
||||
// TODO refactor and strictly type
|
||||
computeCustomRelationFieldMetadataForCreation({
|
||||
fieldMetadataInput,
|
||||
relationCreationPayload,
|
||||
@ -332,13 +334,23 @@ export class FieldMetadataRelationService {
|
||||
FieldMetadataType.MORPH_RELATION,
|
||||
);
|
||||
|
||||
const defaultIcon = 'IconRelationOneToMany';
|
||||
|
||||
const isManyToOne =
|
||||
isRelation && relationCreationPayload?.type === RelationType.MANY_TO_ONE;
|
||||
|
||||
const isOneToMany =
|
||||
isRelation && relationCreationPayload?.type === RelationType.ONE_TO_MANY;
|
||||
|
||||
const defaultIcon = 'IconRelationOneToMany';
|
||||
const settings = isManyToOne
|
||||
? {
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
onDelete: RelationOnDeleteAction.SET_NULL,
|
||||
joinColumnName,
|
||||
}
|
||||
: {
|
||||
...(fieldMetadataInput.settings as FieldMetadataSettings<
|
||||
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
|
||||
>),
|
||||
relationType: RelationType.ONE_TO_MANY,
|
||||
};
|
||||
|
||||
return {
|
||||
...fieldMetadataInput,
|
||||
@ -346,21 +358,7 @@ export class FieldMetadataRelationService {
|
||||
relationCreationPayload,
|
||||
relationTargetObjectMetadataId:
|
||||
relationCreationPayload?.targetObjectMetadataId,
|
||||
settings: {
|
||||
...fieldMetadataInput.settings,
|
||||
...(isOneToMany
|
||||
? {
|
||||
relationType: RelationType.ONE_TO_MANY,
|
||||
}
|
||||
: {}),
|
||||
...(isManyToOne
|
||||
? {
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
onDelete: RelationOnDeleteAction.SET_NULL,
|
||||
joinColumnName,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
settings,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@ -77,32 +77,37 @@ export class FieldMetadataValidationService {
|
||||
}) {
|
||||
switch (fieldType) {
|
||||
case FieldMetadataType.NUMBER:
|
||||
await this.validateSettings<FieldMetadataType.NUMBER>(
|
||||
NumberSettingsValidation,
|
||||
await this.validateSettings({
|
||||
type: FieldMetadataType.NUMBER,
|
||||
validator: NumberSettingsValidation,
|
||||
settings,
|
||||
);
|
||||
});
|
||||
break;
|
||||
case FieldMetadataType.TEXT:
|
||||
await this.validateSettings<FieldMetadataType.TEXT>(
|
||||
TextSettingsValidation,
|
||||
await this.validateSettings({
|
||||
type: FieldMetadataType.TEXT,
|
||||
validator: TextSettingsValidation,
|
||||
settings,
|
||||
);
|
||||
});
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private async validateSettings<Type extends FieldMetadataType>(
|
||||
validator: ClassConstructor<
|
||||
Type extends FieldMetadataType.NUMBER
|
||||
? NumberSettingsValidation
|
||||
: Type extends FieldMetadataType.TEXT
|
||||
? TextSettingsValidation
|
||||
: never
|
||||
>,
|
||||
settings: FieldMetadataSettings<Type>,
|
||||
) {
|
||||
private async validateSettings<
|
||||
Type extends FieldMetadataType,
|
||||
TValidator extends ClassConstructor<object>,
|
||||
TFieldMetadataType extends FieldMetadataType,
|
||||
>({
|
||||
type: _type,
|
||||
settings,
|
||||
validator,
|
||||
}: {
|
||||
validator: TValidator;
|
||||
settings: FieldMetadataSettings<Type>;
|
||||
type: TFieldMetadataType;
|
||||
}) {
|
||||
try {
|
||||
const settingsInstance = plainToInstance(validator, settings);
|
||||
|
||||
|
||||
@ -9,13 +9,13 @@ import { DataSource, FindOneOptions, In, Repository } from 'typeorm';
|
||||
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
|
||||
import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service';
|
||||
import { compositeTypeDefinitions } 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 { UpdateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/update-field.input';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import {
|
||||
FieldMetadataException,
|
||||
FieldMetadataExceptionCode,
|
||||
|
||||
@ -1,7 +1,24 @@
|
||||
import { Expect, HasAllProperties } from 'twenty-shared/testing';
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
import { FieldMetadataType, NullablePartial } from 'twenty-shared/types';
|
||||
import { Relation as TypeOrmRelation } from 'typeorm';
|
||||
|
||||
import {
|
||||
AllFieldMetadataSettings,
|
||||
FieldMetadataDateSettings,
|
||||
FieldMetadataDateTimeSettings,
|
||||
FieldMetadataNumberSettings,
|
||||
FieldMetadataRelationSettings,
|
||||
FieldMetadataTextSettings,
|
||||
} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
import {
|
||||
FieldMetadataDefaultValueForAnyType,
|
||||
FieldMetadataDefaultValueForType,
|
||||
} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface';
|
||||
|
||||
import {
|
||||
FieldMetadataComplexOption,
|
||||
FieldMetadataDefaultOption,
|
||||
} from 'src/engine/metadata-modules/field-metadata/dtos/options.input';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
|
||||
@ -19,6 +36,8 @@ type NotDefinedRelationRecord = {
|
||||
relationTargetObjectMetadata: never;
|
||||
};
|
||||
|
||||
type AbstractFieldMetadata = FieldMetadataEntity<FieldMetadataType>;
|
||||
|
||||
type UUIDFieldMetadata = FieldMetadataEntity<FieldMetadataType.UUID>;
|
||||
|
||||
type TextFieldMetadata = FieldMetadataEntity<FieldMetadataType.TEXT>;
|
||||
@ -64,7 +83,7 @@ type MorphRelationFieldMetadata =
|
||||
FieldMetadataEntity<FieldMetadataType.MORPH_RELATION>;
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
type Assertions = [
|
||||
type RelationAssertions = [
|
||||
Expect<HasAllProperties<UUIDFieldMetadata, NotDefinedRelationRecord>>,
|
||||
Expect<HasAllProperties<TextFieldMetadata, NotDefinedRelationRecord>>,
|
||||
Expect<HasAllProperties<NumberFieldMetadata, NotDefinedRelationRecord>>,
|
||||
@ -87,4 +106,288 @@ type Assertions = [
|
||||
|
||||
Expect<HasAllProperties<RelationFieldMetadata, DefinedRelationRecord>>,
|
||||
Expect<HasAllProperties<MorphRelationFieldMetadata, DefinedRelationRecord>>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
AbstractFieldMetadata,
|
||||
NullablePartial<DefinedRelationRecord>
|
||||
>
|
||||
>,
|
||||
];
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
type SettingsAssertions = [
|
||||
Expect<HasAllProperties<CurrencyFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<FullNameFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<RatingFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<SelectFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<MultiSelectFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<PositionFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<RawJsonFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<RichTextFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<ActorFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<ArrayFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<PhonesFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<EmailsFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<LinksFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<UUIDFieldMetadata, { settings: never }>>,
|
||||
Expect<HasAllProperties<BooleanFieldMetadata, { settings: never }>>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
TextFieldMetadata,
|
||||
{ settings: FieldMetadataTextSettings | null }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
NumberFieldMetadata,
|
||||
{ settings: FieldMetadataNumberSettings | null }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
DateFieldMetadata,
|
||||
{ settings: FieldMetadataDateSettings | null }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
DateTimeFieldMetadata,
|
||||
{ settings: FieldMetadataDateTimeSettings | null }
|
||||
>
|
||||
>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
RelationFieldMetadata,
|
||||
{ settings: FieldMetadataRelationSettings | null }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
MorphRelationFieldMetadata,
|
||||
{ settings: FieldMetadataRelationSettings | null }
|
||||
>
|
||||
>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
AbstractFieldMetadata,
|
||||
{ settings: AllFieldMetadataSettings | null }
|
||||
>
|
||||
>,
|
||||
];
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
type DefaultValueAssertions = [
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
UUIDFieldMetadata,
|
||||
{ defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.UUID> }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
TextFieldMetadata,
|
||||
{ defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.TEXT> }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
NumberFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.NUMBER>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
BooleanFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.BOOLEAN>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
DateFieldMetadata,
|
||||
{ defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.DATE> }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
DateTimeFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.DATE_TIME>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
CurrencyFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.CURRENCY>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
FullNameFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.FULL_NAME>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
RatingFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.RATING>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
SelectFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.SELECT>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
MultiSelectFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.MULTI_SELECT>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
PositionFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.POSITION>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
RawJsonFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.RAW_JSON>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
RichTextFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.RICH_TEXT>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
ActorFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.ACTOR>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
ArrayFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.ARRAY>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
PhonesFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.PHONES>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
EmailsFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.EMAILS>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
LinksFieldMetadata,
|
||||
{
|
||||
defaultValue: FieldMetadataDefaultValueForType<FieldMetadataType.LINKS>;
|
||||
}
|
||||
>
|
||||
>,
|
||||
|
||||
Expect<HasAllProperties<RelationFieldMetadata, { defaultValue: never }>>,
|
||||
Expect<HasAllProperties<MorphRelationFieldMetadata, { defaultValue: never }>>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
AbstractFieldMetadata,
|
||||
{ defaultValue: FieldMetadataDefaultValueForAnyType | null }
|
||||
>
|
||||
>,
|
||||
];
|
||||
|
||||
// eslint-disable-next-line unused-imports/no-unused-vars, @typescript-eslint/no-unused-vars
|
||||
type OptionsAssertions = [
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
RatingFieldMetadata,
|
||||
{ options: FieldMetadataDefaultOption[] }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
SelectFieldMetadata,
|
||||
{ options: FieldMetadataComplexOption[] }
|
||||
>
|
||||
>,
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
MultiSelectFieldMetadata,
|
||||
{ options: FieldMetadataComplexOption[] }
|
||||
>
|
||||
>,
|
||||
|
||||
Expect<HasAllProperties<UUIDFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<TextFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<NumberFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<BooleanFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<DateFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<DateTimeFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<CurrencyFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<FullNameFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<PositionFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<RawJsonFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<RichTextFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<ActorFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<ArrayFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<PhonesFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<EmailsFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<LinksFieldMetadata, { options: never }>>,
|
||||
|
||||
Expect<HasAllProperties<RelationFieldMetadata, { options: never }>>,
|
||||
Expect<HasAllProperties<MorphRelationFieldMetadata, { options: never }>>,
|
||||
|
||||
Expect<
|
||||
HasAllProperties<
|
||||
AbstractFieldMetadata,
|
||||
{
|
||||
options:
|
||||
| null
|
||||
| (FieldMetadataDefaultOption[] | FieldMetadataComplexOption[]);
|
||||
}
|
||||
>
|
||||
>,
|
||||
];
|
||||
|
||||
@ -28,7 +28,10 @@ describe('FieldMetadataValidationService', () => {
|
||||
});
|
||||
|
||||
it('should validate NUMBER settings successfully', async () => {
|
||||
const settings = { decimals: 2, type: 'number' } as FieldMetadataSettings;
|
||||
const settings: FieldMetadataSettings<FieldMetadataType.NUMBER> = {
|
||||
decimals: 2,
|
||||
type: 'number',
|
||||
};
|
||||
|
||||
await expect(
|
||||
service.validateSettingsOrThrow({
|
||||
@ -39,7 +42,10 @@ describe('FieldMetadataValidationService', () => {
|
||||
});
|
||||
|
||||
it('should throw an error for invalid NUMBER settings', async () => {
|
||||
const settings = { type: 'invalidType' } as FieldMetadataSettings;
|
||||
const settings: FieldMetadataSettings<FieldMetadataType.NUMBER> = {
|
||||
// @ts-expect-error expected invalid payload below
|
||||
type: 'invalidType',
|
||||
};
|
||||
|
||||
await expect(
|
||||
service.validateSettingsOrThrow({
|
||||
@ -50,7 +56,9 @@ describe('FieldMetadataValidationService', () => {
|
||||
});
|
||||
|
||||
it('should validate TEXT settings successfully', async () => {
|
||||
const settings = { displayedMaxRows: 10 } as FieldMetadataSettings;
|
||||
const settings: FieldMetadataSettings<FieldMetadataType.TEXT> = {
|
||||
displayedMaxRows: 10,
|
||||
};
|
||||
|
||||
await expect(
|
||||
service.validateSettingsOrThrow({
|
||||
@ -61,9 +69,10 @@ describe('FieldMetadataValidationService', () => {
|
||||
});
|
||||
|
||||
it('should throw an error for invalid TEXT settings', async () => {
|
||||
const settings = {
|
||||
const settings: FieldMetadataSettings<FieldMetadataType.TEXT> = {
|
||||
// @ts-expect-error expected invalid payload below
|
||||
displayedMaxRows: 'NotANumber',
|
||||
} as FieldMetadataSettings;
|
||||
};
|
||||
|
||||
await expect(
|
||||
service.validateSettingsOrThrow({
|
||||
|
||||
@ -27,7 +27,7 @@ import { ObjectPermissionEntity } from 'src/engine/metadata-modules/object-permi
|
||||
'namePlural',
|
||||
'workspaceId',
|
||||
])
|
||||
export class ObjectMetadataEntity {
|
||||
export class ObjectMetadataEntity implements Required<ObjectMetadataEntity> {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
id: string;
|
||||
|
||||
|
||||
@ -6,7 +6,6 @@ import { capitalize, isDefined } from 'twenty-shared/utils';
|
||||
import { QueryRunner, Repository } from 'typeorm';
|
||||
import { v4 as uuidV4 } from 'uuid';
|
||||
|
||||
import { FieldMetadataDefaultSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
|
||||
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
@ -228,7 +227,7 @@ export class ObjectMetadataFieldRelationService {
|
||||
id: targetFieldMetadataToUpdate.id,
|
||||
...targetFieldMetadataUpdateData,
|
||||
settings: {
|
||||
...(targetFieldMetadataToUpdate.settings as FieldMetadataDefaultSettings),
|
||||
...targetFieldMetadataToUpdate.settings,
|
||||
...(isTargetFieldMetadataManyToOneRelation
|
||||
? {
|
||||
joinColumnName: `${sourceObjectMetadata.nameSingular}Id`,
|
||||
@ -260,7 +259,7 @@ export class ObjectMetadataFieldRelationService {
|
||||
id: sourceFieldMetadataToUpdate.id,
|
||||
...sourceFieldMetadataUpdateData,
|
||||
settings: {
|
||||
...(sourceFieldMetadataToUpdate.settings as FieldMetadataDefaultSettings),
|
||||
...sourceFieldMetadataToUpdate.settings,
|
||||
...(isSourceFieldMetadataManyToOneRelation
|
||||
? {
|
||||
joinColumnName: `${targetObjectMetadata.nameSingular}Id`,
|
||||
|
||||
@ -8,7 +8,6 @@ import {
|
||||
fieldTextMock,
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
import { UpsertFieldPermissionsInput } from 'src/engine/metadata-modules/object-permission/dtos/upsert-field-permissions.input';
|
||||
import { FieldPermissionEntity } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.entity';
|
||||
import { FieldPermissionService } from 'src/engine/metadata-modules/object-permission/field-permission/field-permission.service';
|
||||
@ -127,7 +126,7 @@ describe('FieldPermissionService', () => {
|
||||
objectMetadataId: testObjectMetadataId,
|
||||
workspaceId: testWorkspaceId,
|
||||
id: '20202020-0000-0000-0000-000000000003',
|
||||
}) as FieldMetadataEntity,
|
||||
}),
|
||||
},
|
||||
fieldIdByJoinColumnName: {},
|
||||
fieldIdByName: {},
|
||||
|
||||
@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm';
|
||||
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
import { In, Repository } from 'typeorm';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||
|
||||
@ -175,7 +176,14 @@ export class RemoteTableRelationsService {
|
||||
isNullable: true,
|
||||
isSystem: true,
|
||||
defaultValue: undefined,
|
||||
settings: { ...objectPrimaryKeyFieldSettings, isForeignKey: true },
|
||||
...(isDefined(objectPrimaryKeyFieldSettings)
|
||||
? {
|
||||
settings: {
|
||||
...objectPrimaryKeyFieldSettings,
|
||||
isForeignKey: true,
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
);
|
||||
|
||||
@ -215,7 +223,14 @@ export class RemoteTableRelationsService {
|
||||
isNullable: true,
|
||||
isSystem: true,
|
||||
defaultValue: undefined,
|
||||
settings: { ...objectPrimaryKeyFieldSettings, isForeignKey: true },
|
||||
...(isDefined(objectPrimaryKeyFieldSettings)
|
||||
? {
|
||||
settings: {
|
||||
...objectPrimaryKeyFieldSettings,
|
||||
isForeignKey: true,
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
);
|
||||
|
||||
@ -255,7 +270,14 @@ export class RemoteTableRelationsService {
|
||||
isNullable: true,
|
||||
isSystem: true,
|
||||
defaultValue: undefined,
|
||||
settings: { ...objectPrimaryKeyFieldSettings, isForeignKey: true },
|
||||
...(isDefined(objectPrimaryKeyFieldSettings)
|
||||
? {
|
||||
settings: {
|
||||
...objectPrimaryKeyFieldSettings,
|
||||
isForeignKey: true,
|
||||
},
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
@ -6,19 +6,16 @@ import { FlatFieldMetadata } from 'src/engine/workspace-manager/workspace-migrat
|
||||
type FlatFieldMetadataOverrides<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> = Required<
|
||||
Pick<FlatFieldMetadata<T>, 'uniqueIdentifier' | 'objectMetadataId'>
|
||||
Pick<FlatFieldMetadata<T>, 'uniqueIdentifier' | 'objectMetadataId' | 'type'>
|
||||
> &
|
||||
Partial<FlatFieldMetadata<T>>;
|
||||
|
||||
export const getFlatFieldMetadataMock = <
|
||||
T extends FieldMetadataType = FieldMetadataType.TEXT,
|
||||
>(
|
||||
export const getFlatFieldMetadataMock = <T extends FieldMetadataType>(
|
||||
overrides: FlatFieldMetadataOverrides<T>,
|
||||
): FlatFieldMetadata<T> => {
|
||||
): FlatFieldMetadata => {
|
||||
const createdAt = faker.date.anytime();
|
||||
|
||||
return {
|
||||
type: FieldMetadataType.TEXT as T,
|
||||
createdAt,
|
||||
description: 'default flat field metadata description',
|
||||
icon: 'icon',
|
||||
@ -32,7 +29,8 @@ export const getFlatFieldMetadataMock = <
|
||||
isLabelSyncedWithName: false,
|
||||
isSystem: false,
|
||||
standardId: null,
|
||||
standardOverrides: undefined,
|
||||
standardOverrides: null,
|
||||
settings: null,
|
||||
updatedAt: createdAt,
|
||||
workspaceId: faker.string.uuid(),
|
||||
defaultValue: null,
|
||||
|
||||
@ -25,8 +25,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -58,8 +59,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -85,8 +87,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -112,8 +115,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -139,8 +143,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -166,8 +171,9 @@ exports[`Workspace migration builder field actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -226,8 +232,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -259,8 +266,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -319,8 +327,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": Any<String>,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": Any<String>,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "RELATION",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -352,8 +361,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": Any<String>,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": Any<String>,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "RELATION",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -412,8 +422,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -445,8 +456,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -472,8 +484,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -499,8 +512,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -526,8 +540,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -553,8 +568,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -580,8 +596,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -662,8 +679,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": Any<String>,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": Any<String>,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "RELATION",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -695,8 +713,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -722,8 +741,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -749,8 +769,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -776,8 +797,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -803,8 +825,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -830,8 +853,9 @@ exports[`Workspace migration builder field actions test suite It should build an
|
||||
"relationTargetFieldMetadataId": Any<String>,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": Any<String>,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "RELATION",
|
||||
"uniqueIdentifier": "field-metadata-unique-identifier-1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1038,8 +1062,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1065,8 +1090,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1092,8 +1118,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1119,8 +1146,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1146,8 +1174,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1201,8 +1230,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1234,8 +1264,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1261,8 +1292,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1288,8 +1320,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1315,8 +1348,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1342,8 +1376,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1397,8 +1432,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1430,8 +1466,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1457,8 +1494,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1484,8 +1522,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1511,8 +1550,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1538,8 +1578,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1593,8 +1634,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1626,8 +1668,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1653,8 +1696,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1680,8 +1724,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1707,8 +1752,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1734,8 +1780,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1789,8 +1836,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1822,8 +1870,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1849,8 +1898,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1876,8 +1926,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1903,8 +1954,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1930,8 +1982,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -1985,8 +2038,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -2018,8 +2072,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_0",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -2045,8 +2100,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_1",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -2072,8 +2128,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_2",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -2099,8 +2156,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_3",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
@ -2126,8 +2184,9 @@ exports[`Workspace migration builder object actions test suite It should build a
|
||||
"relationTargetFieldMetadataId": undefined,
|
||||
"relationTargetObjectMetadata": undefined,
|
||||
"relationTargetObjectMetadataId": undefined,
|
||||
"settings": null,
|
||||
"standardId": null,
|
||||
"standardOverrides": undefined,
|
||||
"standardOverrides": null,
|
||||
"type": "TEXT",
|
||||
"uniqueIdentifier": "field_4",
|
||||
"updatedAt": Any<ClockDate>,
|
||||
|
||||
@ -12,6 +12,7 @@ const basicFlatFieldMetadatas = Array.from({ length: 5 }, (_value, index) =>
|
||||
getFlatFieldMetadataMock({
|
||||
objectMetadataId: basicObjectMetadataId,
|
||||
uniqueIdentifier: `field_${index}`,
|
||||
type: FieldMetadataType.TEXT,
|
||||
}),
|
||||
);
|
||||
|
||||
@ -110,7 +111,6 @@ const relationTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
type: FieldMetadataType.RELATION,
|
||||
settings: {
|
||||
relationType: RelationType.MANY_TO_ONE,
|
||||
isForeignKey: true,
|
||||
joinColumnName: 'column-name',
|
||||
onDelete: undefined,
|
||||
},
|
||||
@ -129,7 +129,7 @@ const relationTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
{
|
||||
...flatObjectMetadata,
|
||||
flatFieldMetadatas: [
|
||||
getFlatFieldMetadataMock({
|
||||
{
|
||||
...updatedFieldMetadata,
|
||||
settings: {
|
||||
relationType: RelationType.ONE_TO_MANY,
|
||||
@ -139,7 +139,7 @@ const relationTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
},
|
||||
relationTargetFieldMetadataId: faker.string.uuid(),
|
||||
relationTargetObjectMetadataId: faker.string.uuid(),
|
||||
}),
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
@ -158,6 +158,7 @@ const basicCrudTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
|
||||
const flatFieldMetadata = getFlatFieldMetadataMock({
|
||||
uniqueIdentifier: 'field-metadata-unique-identifier-1',
|
||||
type: FieldMetadataType.TEXT,
|
||||
objectMetadataId,
|
||||
});
|
||||
const flatObjectMetadata = getFlatObjectMetadataMock({
|
||||
@ -189,6 +190,7 @@ const basicCrudTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
|
||||
const flatFieldMetadata = getFlatFieldMetadataMock({
|
||||
uniqueIdentifier: 'field-metadata-unique-identifier-1',
|
||||
type: FieldMetadataType.TEXT,
|
||||
objectMetadataId,
|
||||
});
|
||||
const flatObjectMetadata = getFlatObjectMetadataMock({
|
||||
@ -228,6 +230,7 @@ const basicCrudTestCases: WorkspaceMigrationBuilderTestCase[] = [
|
||||
|
||||
const flatFieldMetadata = getFlatFieldMetadataMock({
|
||||
uniqueIdentifier: 'field-metadata-unique-identifier-1',
|
||||
type: FieldMetadataType.TEXT,
|
||||
objectMetadataId,
|
||||
});
|
||||
const flatObjectMetadata = getFlatObjectMetadataMock({
|
||||
@ -264,6 +267,7 @@ export const WORKSPACE_MIGRATION_FIELD_BUILDER_TEST_CASES: WorkspaceMigrationBui
|
||||
const objectMetadataId = faker.string.uuid();
|
||||
const flatFieldMetadata = getFlatFieldMetadataMock({
|
||||
uniqueIdentifier: 'field-metadata-unique-identifier-1',
|
||||
type: FieldMetadataType.TEXT,
|
||||
objectMetadataId,
|
||||
});
|
||||
const from = [
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import { faker } from '@faker-js/faker';
|
||||
import { FieldMetadataType } from 'twenty-shared/types';
|
||||
|
||||
import { getFlatFieldMetadataMock } from 'src/engine/workspace-manager/workspace-migration-v2/__tests__/get-flat-field-metadata.mock';
|
||||
import { getFlatObjectMetadataMock } from 'src/engine/workspace-manager/workspace-migration-v2/__tests__/get-flat-object-metadata.mock';
|
||||
@ -66,6 +67,7 @@ export const WORKSPACE_MIGRATION_OBJECT_BUILDER_TEST_CASES: WorkspaceMigrationBu
|
||||
{ length: 5 },
|
||||
(_value, index) =>
|
||||
getFlatFieldMetadataMock({
|
||||
type: FieldMetadataType.TEXT,
|
||||
objectMetadataId,
|
||||
uniqueIdentifier: `field_${index}`,
|
||||
}),
|
||||
|
||||
@ -145,7 +145,8 @@ export class StandardFieldFactory {
|
||||
description: workspaceFieldMetadataArgs.description,
|
||||
defaultValue: workspaceFieldMetadataArgs.defaultValue ?? null,
|
||||
options: workspaceFieldMetadataArgs.options ?? null,
|
||||
settings: workspaceFieldMetadataArgs.settings,
|
||||
settings: workspaceFieldMetadataArgs.settings ?? null,
|
||||
standardOverrides: null,
|
||||
workspaceId: context.workspaceId,
|
||||
isNullable: workspaceFieldMetadataArgs.isNullable,
|
||||
isUnique: workspaceFieldMetadataArgs.isUnique,
|
||||
@ -205,6 +206,8 @@ export class StandardFieldFactory {
|
||||
relationTargetFieldMetadataId: null,
|
||||
relationTargetObjectMetadata: null,
|
||||
relationTargetObjectMetadataId: null,
|
||||
settings: null, // accurate ? looks weird for this to be undefined even for standard fields ?
|
||||
standardOverrides: null,
|
||||
});
|
||||
|
||||
return fieldMetadataCollection;
|
||||
|
||||
@ -54,6 +54,8 @@ export const computeStandardFields = (
|
||||
relationTargetFieldMetadataId: null,
|
||||
relationTargetObjectMetadata: null,
|
||||
relationTargetObjectMetadataId: null,
|
||||
settings: null,
|
||||
standardOverrides: null,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
|
||||
@ -8,15 +8,17 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat
|
||||
type GetMockFieldMetadataEntityOverride<
|
||||
T extends FieldMetadataType = FieldMetadataType,
|
||||
> = Partial<FieldMetadataEntity<T>> &
|
||||
Required<Pick<FieldMetadataEntity<T>, 'workspaceId' | 'objectMetadataId'>>;
|
||||
Required<
|
||||
Pick<FieldMetadataEntity<T>, 'workspaceId' | 'objectMetadataId' | 'type'>
|
||||
>;
|
||||
|
||||
// Should be renamed to abstract
|
||||
export const getMockFieldMetadataEntity = <
|
||||
T extends FieldMetadataType = FieldMetadataType.TEXT,
|
||||
>(
|
||||
overrides: GetMockFieldMetadataEntityOverride<T>,
|
||||
): FieldMetadataEntity<T> => {
|
||||
): FieldMetadataEntity => {
|
||||
return {
|
||||
type: FieldMetadataType.TEXT as T,
|
||||
fieldPermissions: [],
|
||||
icon: null,
|
||||
indexFieldMetadatas: {} as IndexFieldMetadataEntity,
|
||||
|
||||
3
packages/twenty-shared/src/types/NullablePartial.ts
Normal file
3
packages/twenty-shared/src/types/NullablePartial.ts
Normal file
@ -0,0 +1,3 @@
|
||||
export type NullablePartial<T> = {
|
||||
[P in keyof T]: T[P] | null;
|
||||
};
|
||||
@ -11,6 +11,7 @@ export type { ConfigVariableValue } from './ConfigVariableValue';
|
||||
export { ConnectedAccountProvider } from './ConnectedAccountProvider';
|
||||
export { FieldMetadataType } from './FieldMetadataType';
|
||||
export type { IsExactly } from './IsExactly';
|
||||
export type { NullablePartial } from './NullablePartial';
|
||||
export type { ObjectRecordsPermissions } from './ObjectRecordsPermissions';
|
||||
export type { ObjectRecordsPermissionsByRoleId } from './ObjectRecordsPermissionsByRoleId';
|
||||
export type { RestrictedFields } from './RestrictedFields';
|
||||
|
||||
Reference in New Issue
Block a user