import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { TIMELINE_ACTIVITY_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; import { STANDARD_OBJECT_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; import { CompanyWorkspaceEntity } from 'src/modules/company/standard-objects/company.workspace-entity'; import { OpportunityWorkspaceEntity } from 'src/modules/opportunity/standard-objects/opportunity.workspace-entity'; import { PersonWorkspaceEntity } from 'src/modules/person/standard-objects/person.workspace-entity'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; import { CustomWorkspaceEntity } from 'src/engine/twenty-orm/custom.workspace-entity'; import { BaseWorkspaceEntity } from 'src/engine/twenty-orm/base.workspace-entity'; import { WorkspaceEntity } from 'src/engine/twenty-orm/decorators/workspace-entity.decorator'; import { WorkspaceIsSystem } from 'src/engine/twenty-orm/decorators/workspace-is-system.decorator'; import { WorkspaceIsNotAuditLogged } from 'src/engine/twenty-orm/decorators/workspace-is-not-audit-logged.decorator'; import { WorkspaceField } from 'src/engine/twenty-orm/decorators/workspace-field.decorator'; import { WorkspaceIsNullable } from 'src/engine/twenty-orm/decorators/workspace-is-nullable.decorator'; import { WorkspaceRelation } from 'src/engine/twenty-orm/decorators/workspace-relation.decorator'; import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; import { WorkspaceDynamicRelation } from 'src/engine/twenty-orm/decorators/workspace-dynamic-relation.decorator'; @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.timelineActivity, namePlural: 'timelineActivities', labelSingular: 'Timeline Activity', labelPlural: 'Timeline Activities', description: 'Aggregated / filtered event to be displayed on the timeline', icon: 'IconIconTimelineEvent', }) @WorkspaceIsSystem() @WorkspaceIsNotAuditLogged() export class TimelineActivityWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.happensAt, type: FieldMetadataType.DATE_TIME, label: 'Creation date', description: 'Creation date', icon: 'IconCalendar', defaultValue: 'now', }) happensAt: Date; @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.name, type: FieldMetadataType.TEXT, label: 'Event name', description: 'Event name', icon: 'IconAbc', }) name: string; @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.properties, type: FieldMetadataType.RAW_JSON, label: 'Event details', description: 'Json value for event details', icon: 'IconListDetails', }) @WorkspaceIsNullable() properties: JSON; // Special objects that don't have their own timeline and are 'link' to the main object @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.linkedRecordCachedName, type: FieldMetadataType.TEXT, label: 'Linked Record cached name', description: 'Cached record name', icon: 'IconAbc', }) linkedRecordCachedName: string; @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.linkedRecordId, type: FieldMetadataType.UUID, label: 'Linked Record id', description: 'Linked Record id', icon: 'IconAbc', }) @WorkspaceIsNullable() linkedRecordId: string; @WorkspaceField({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.linkedObjectMetadataId, type: FieldMetadataType.UUID, label: 'Linked Object Metadata Id', description: 'inked Object Metadata Id', icon: 'IconAbc', }) @WorkspaceIsNullable() linkedObjectMetadataId: string; // Who made the action @WorkspaceRelation({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.workspaceMember, type: RelationMetadataType.MANY_TO_ONE, label: 'Workspace Member', description: 'Event workspace member', icon: 'IconCircleUser', joinColumn: 'workspaceMemberId', inverseSideTarget: () => WorkspaceMemberWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) @WorkspaceIsNullable() workspaceMember: Relation; @WorkspaceRelation({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.person, type: RelationMetadataType.MANY_TO_ONE, label: 'Person', description: 'Event person', icon: 'IconUser', joinColumn: 'personId', inverseSideTarget: () => PersonWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) @WorkspaceIsNullable() person: Relation; @WorkspaceRelation({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.company, type: RelationMetadataType.MANY_TO_ONE, label: 'Company', description: 'Event company', icon: 'IconBuildingSkyscraper', joinColumn: 'companyId', inverseSideTarget: () => CompanyWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) @WorkspaceIsNullable() company: Relation; @WorkspaceRelation({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.opportunity, type: RelationMetadataType.MANY_TO_ONE, label: 'Opportunity', description: 'Event opportunity', icon: 'IconTargetArrow', joinColumn: 'opportunityId', inverseSideTarget: () => OpportunityWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) @WorkspaceIsNullable() opportunity: Relation; @WorkspaceDynamicRelation({ type: RelationMetadataType.MANY_TO_ONE, argsFactory: (oppositeObjectMetadata) => ({ standardId: TIMELINE_ACTIVITY_STANDARD_FIELD_IDS.custom, name: oppositeObjectMetadata.nameSingular, label: oppositeObjectMetadata.labelSingular, description: `Event ${oppositeObjectMetadata.labelSingular}`, joinColumn: `${oppositeObjectMetadata.nameSingular}Id`, icon: 'IconTimeline', }), inverseSideTarget: () => CustomWorkspaceEntity, inverseSideFieldKey: 'timelineActivities', }) custom: Relation; }