From a5273732b38c8216597ad8c5f4c1642aa442a269 Mon Sep 17 00:00:00 2001 From: Guillim Date: Thu, 30 Jan 2025 17:09:42 +0100 Subject: [PATCH] Icon microsoft (#9907) Implementing the Outlook icon for CreatedBy, only for emails. Not in this PR original scope : The similar feature for calendar created records. Since it was straightforward, I added it to the scope of this PR. Fix https://github.com/twentyhq/core-team-issues/issues/252 --- .../useRightDrawerEmailThread.test.tsx | 2 + .../hooks/__tests__/useCompleteTask.test.tsx | 1 + .../CommandMenuContextRecordChip.stories.tsx | 1 + .../favorites/hooks/__mocks__/useFavorites.ts | 14 ++ .../utils/mapFieldMetadataToGraphQLQuery.ts | 1 + .../hooks/__mocks__/personFragments.ts | 4 + .../useLazyLoadRecordIndexTable.test.tsx | 10 + .../__tests__/useToggleEditOnlyInput.test.tsx | 3 + .../display/components/ActorFieldDisplay.tsx | 1 + .../record-field/types/FieldMetadata.ts | 4 + .../types/guards/isFieldActorValue.ts | 7 + ...jectRecordsSpreadsheetImportDialog.test.ts | 3 + .../utils/generateEmptyFieldValue.ts | 1 + .../SettingsCompositeFieldTypeConfigs.ts | 9 +- .../field/display/components/ActorDisplay.tsx | 26 ++- ...-41-add-context-to-actor-composite-type.ts | 191 ++++++++++++++++++ .../0-41/0-41-upgrade-version.command.ts | 8 + .../0-41/0-41-upgrade-version.module.ts | 6 + .../auth/services/google-apis.service.ts | 6 +- .../auth/services/microsoft-apis.service.ts | 6 +- .../composite-types/actor.composite-type.ts | 11 +- .../utils/generate-default-value.ts | 8 + .../twenty-orm/custom.workspace-entity.ts | 9 +- .../company.workspace-entity.ts | 9 +- .../connected-account.workspace-entity.ts | 7 +- .../create-company-and-contact.service.ts | 3 + .../services/create-contact.service.ts | 6 + ...osoft-get-message-list.service.dev.spec.ts | 3 +- ...microsoft-get-messages.service.dev.spec.ts | 3 +- .../microsoft-get-messages.service.spec.ts | 3 +- .../standard-objects/note.workspace-entity.ts | 9 +- .../opportunity.workspace-entity.ts | 9 +- .../person.workspace-entity.ts | 9 +- .../standard-objects/task.workspace-entity.ts | 9 +- .../workflow-run.workspace-entity.ts | 9 +- .../workflow.workspace-entity.ts | 9 +- packages/twenty-shared/src/index.ts | 1 + .../src/types/ConnectedAccountProvider.ts | 4 + .../icon/assets/microsoft-calendar.svg | 142 +++++++++++++ .../display/icon/assets/microsoft-outlook.svg | 41 +++- .../icon/components/IconMicrosoftCalendar.tsx | 14 ++ packages/twenty-ui/src/display/index.ts | 1 + 42 files changed, 530 insertions(+), 93 deletions(-) create mode 100644 packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type.ts create mode 100644 packages/twenty-shared/src/types/ConnectedAccountProvider.ts create mode 100644 packages/twenty-ui/src/display/icon/assets/microsoft-calendar.svg create mode 100644 packages/twenty-ui/src/display/icon/components/IconMicrosoftCalendar.tsx diff --git a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx index f71f7c40d..3dda143cd 100644 --- a/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx +++ b/packages/twenty-front/src/modules/activities/emails/right-drawer/hooks/__tests__/useRightDrawerEmailThread.test.tsx @@ -66,6 +66,7 @@ const mocks = [ source workspaceMemberId name + context } deletedAt emails { @@ -226,6 +227,7 @@ const mocks = [ source workspaceMemberId name + context } deletedAt emails { diff --git a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx index 51408dac5..7e8825611 100644 --- a/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx +++ b/packages/twenty-front/src/modules/activities/tasks/hooks/__tests__/useCompleteTask.test.tsx @@ -74,6 +74,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt dueAt diff --git a/packages/twenty-front/src/modules/command-menu/components/__stories__/CommandMenuContextRecordChip.stories.tsx b/packages/twenty-front/src/modules/command-menu/components/__stories__/CommandMenuContextRecordChip.stories.tsx index 2a02b9190..5b511efd3 100644 --- a/packages/twenty-front/src/modules/command-menu/components/__stories__/CommandMenuContextRecordChip.stories.tsx +++ b/packages/twenty-front/src/modules/command-menu/components/__stories__/CommandMenuContextRecordChip.stories.tsx @@ -47,6 +47,7 @@ const FIND_MANY_COMPANIES = gql` source workspaceMemberId name + context } deletedAt domainName { diff --git a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts index 470f4561f..3c38fd2d1 100644 --- a/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts +++ b/packages/twenty-front/src/modules/favorites/hooks/__mocks__/useFavorites.ts @@ -129,6 +129,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt domainName { @@ -183,6 +184,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt id @@ -204,6 +206,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt id @@ -224,6 +227,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt emails { @@ -273,6 +277,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt id @@ -290,6 +295,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt dueAt @@ -336,6 +342,7 @@ mutation UpdateOneFavorite( source workspaceMemberId name + context } deletedAt endedAt @@ -417,6 +424,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt domainName { @@ -471,6 +479,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt id @@ -492,6 +501,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt id @@ -512,6 +522,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt emails { @@ -561,6 +572,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt id @@ -578,6 +590,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt dueAt @@ -624,6 +637,7 @@ export const mocks = [ source workspaceMemberId name + context } deletedAt endedAt diff --git a/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts b/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts index 187ffe9c9..cf371ad6e 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/mapFieldMetadataToGraphQLQuery.ts @@ -141,6 +141,7 @@ ${mapObjectMetadataToGraphQLQuery({ source workspaceMemberId name + context }`; } diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts index 59c877457..03dbc08c5 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/personFragments.ts @@ -8,6 +8,7 @@ export const PERSON_FRAGMENT_WITH_DEPTH_ZERO_RELATIONS = ` source workspaceMemberId name + context } deletedAt emails { @@ -114,6 +115,7 @@ export const PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS = ` source workspaceMemberId name + context } deletedAt domainName { @@ -152,6 +154,7 @@ export const PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS = ` source workspaceMemberId name + context } deletedAt emails { @@ -249,6 +252,7 @@ export const PERSON_FRAGMENT_WITH_DEPTH_ONE_RELATIONS = ` source workspaceMemberId name + context } deletedAt id diff --git a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyLoadRecordIndexTable.test.tsx b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyLoadRecordIndexTable.test.tsx index 4cebe899e..5faf0081e 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyLoadRecordIndexTable.test.tsx +++ b/packages/twenty-front/src/modules/object-record/hooks/__tests__/useLazyLoadRecordIndexTable.test.tsx @@ -71,6 +71,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt domainName { @@ -115,6 +116,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -136,6 +138,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -156,6 +159,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt emails { @@ -204,6 +208,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -243,6 +248,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt domainName { @@ -292,6 +298,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -312,6 +319,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt emails { @@ -360,6 +368,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -377,6 +386,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt dueAt diff --git a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx index 7149e7c80..aa71f735b 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/hooks/__tests__/useToggleEditOnlyInput.test.tsx @@ -87,6 +87,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt domainName { @@ -163,6 +164,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt id @@ -186,6 +188,7 @@ const mocks: MockedResponse[] = [ source workspaceMemberId name + context } deletedAt emails { diff --git a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ActorFieldDisplay.tsx b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ActorFieldDisplay.tsx index 46b4ace83..cd176beb4 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ActorFieldDisplay.tsx +++ b/packages/twenty-front/src/modules/object-record/record-field/meta-types/display/components/ActorFieldDisplay.tsx @@ -23,6 +23,7 @@ export const ActorFieldDisplay = () => { source={fieldValue.source} avatarUrl={fieldValue.workspaceMember?.avatarUrl} workspaceMemberId={fieldValue.workspaceMemberId} + context={fieldValue.context} /> ) : null; }; diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts b/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts index ef94641c2..12b42973a 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/FieldMetadata.ts @@ -1,3 +1,4 @@ +import { ConnectedAccountProvider } from 'twenty-shared'; import { ThemeColor } from 'twenty-ui'; import { RATING_VALUES } from '@/object-record/record-field/meta-types/constants/RatingValues'; @@ -269,6 +270,9 @@ export type FieldActorValue = { source: string; workspaceMemberId?: string; name: string; + context?: { + provider?: ConnectedAccountProvider; + }; }; export type FieldArrayValue = string[]; diff --git a/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldActorValue.ts b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldActorValue.ts index a26a2820f..676765d3e 100644 --- a/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldActorValue.ts +++ b/packages/twenty-front/src/modules/object-record/record-field/types/guards/isFieldActorValue.ts @@ -1,3 +1,5 @@ +import { ConnectedAccountProvider } from 'twenty-shared'; + import { z } from 'zod'; import { FieldActorValue } from '../FieldMetadata'; @@ -6,6 +8,11 @@ const actorSchema = z.object({ source: z.string(), workspaceMemberId: z.optional(z.string().nullable()), name: z.string(), + context: z.optional( + z.object({ + provider: z.optional(z.nativeEnum(ConnectedAccountProvider)), + }), + ), }); export const isFieldActorValue = ( diff --git a/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/__tests__/useOpenObjectRecordsSpreadsheetImportDialog.test.ts b/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/__tests__/useOpenObjectRecordsSpreadsheetImportDialog.test.ts index 3327365b8..9b37b09de 100644 --- a/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/__tests__/useOpenObjectRecordsSpreadsheetImportDialog.test.ts +++ b/packages/twenty-front/src/modules/object-record/spreadsheet-import/hooks/__tests__/useOpenObjectRecordsSpreadsheetImportDialog.test.ts @@ -86,6 +86,7 @@ const companyMocks = [ source workspaceMemberId name + context } deletedAt domainName { @@ -162,6 +163,7 @@ const companyMocks = [ source workspaceMemberId name + context } deletedAt id @@ -185,6 +187,7 @@ const companyMocks = [ source workspaceMemberId name + context } deletedAt emails { diff --git a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts index 38e375603..90475b1fd 100644 --- a/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts +++ b/packages/twenty-front/src/modules/object-record/utils/generateEmptyFieldValue.ts @@ -89,6 +89,7 @@ export const generateEmptyFieldValue = ( source: 'MANUAL', workspaceMemberId: null, name: '', + context: {}, }; } case FieldMetadataType.PHONES: { diff --git a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts index 761550131..103b7057a 100644 --- a/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts +++ b/packages/twenty-front/src/modules/settings/data-model/constants/SettingsCompositeFieldTypeConfigs.ts @@ -10,6 +10,7 @@ import { } from '@/object-record/record-field/types/FieldMetadata'; import { SettingsFieldTypeConfig } from '@/settings/data-model/constants/SettingsNonCompositeFieldTypeConfigs'; import { CompositeFieldType } from '@/settings/data-model/types/CompositeFieldType'; +import { ConnectedAccountProvider } from 'twenty-shared'; import { IllustrationIconCurrency, IllustrationIconLink, @@ -175,7 +176,13 @@ export const SETTINGS_COMPOSITE_FIELD_TYPE_CONFIGS = { source: 'Source', name: 'Name', workspaceMemberId: 'Workspace Member ID', + context: 'Context', + }, + exampleValue: { + source: 'source', + name: 'name', + workspaceMemberId: 'id', + context: { provider: ConnectedAccountProvider.GOOGLE }, }, - exampleValue: { source: 'source', name: 'name', workspaceMemberId: 'id' }, } as const satisfies SettingsCompositeFieldTypeConfig, } as const satisfies SettingsCompositeFieldTypeConfigArray; diff --git a/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx b/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx index f48c9fb34..e758e7174 100644 --- a/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx +++ b/packages/twenty-front/src/modules/ui/field/display/components/ActorDisplay.tsx @@ -1,4 +1,6 @@ import { FieldActorValue } from '@/object-record/record-field/types/FieldMetadata'; +import { ConnectedAccountProvider } from 'twenty-shared'; + import { useMemo } from 'react'; import { AvatarChip, @@ -7,6 +9,10 @@ import { IconCalendar, IconCsv, IconGmail, + IconGoogleCalendar, + IconMail, + IconMicrosoftCalendar, + IconMicrosoftOutlook, IconRobot, IconSettingsAutomation, } from 'twenty-ui'; @@ -15,11 +21,25 @@ type ActorDisplayProps = Partial & { avatarUrl?: string | null; }; +const PROVIDORS_ICON_MAPPING = { + EMAIL: { + [ConnectedAccountProvider.MICROSOFT]: IconMicrosoftOutlook, + [ConnectedAccountProvider.GOOGLE]: IconGmail, + default: IconMail, + }, + CALENDAR: { + [ConnectedAccountProvider.MICROSOFT]: IconMicrosoftCalendar, + [ConnectedAccountProvider.GOOGLE]: IconGoogleCalendar, + default: IconCalendar, + }, +}; + export const ActorDisplay = ({ name, source, workspaceMemberId, avatarUrl, + context, }: ActorDisplayProps) => { const LeftIcon = useMemo(() => { switch (source) { @@ -28,9 +48,9 @@ export const ActorDisplay = ({ case 'IMPORT': return IconCsv; case 'EMAIL': - return IconGmail; + return PROVIDORS_ICON_MAPPING.EMAIL[context?.provider ?? 'default']; case 'CALENDAR': - return IconCalendar; + return PROVIDORS_ICON_MAPPING.CALENDAR[context?.provider ?? 'default']; case 'SYSTEM': return IconRobot; case 'WORKFLOW': @@ -38,7 +58,7 @@ export const ActorDisplay = ({ default: return undefined; } - }, [source]); + }, [source, context?.provider]); const isIconInverted = source === 'API' || source === 'IMPORT' || source === 'SYSTEM'; diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type.ts new file mode 100644 index 000000000..7912a4189 --- /dev/null +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type.ts @@ -0,0 +1,191 @@ +import { InjectRepository } from '@nestjs/typeorm'; + +import chalk from 'chalk'; +import { Command } from 'nest-commander'; +import { FieldMetadataType } from 'twenty-shared'; +import { In, Repository, TableColumn } from 'typeorm'; + +import { + ActiveWorkspacesCommandOptions, + ActiveWorkspacesCommandRunner, +} from 'src/database/commands/active-workspaces.command'; +import { CommandLogger } from 'src/database/commands/logger'; +import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; +import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service'; +import { TwentyORMGlobalManager } from 'src/engine/twenty-orm/twenty-orm-global.manager'; +import { computeTableName } from 'src/engine/utils/compute-table-name.util'; +import { WorkspaceDataSourceService } from 'src/engine/workspace-datasource/workspace-datasource.service'; + +@Command({ + name: 'upgrade-0.41:add-context-to-actor-composite-type', + description: 'Add context to actor composite type.', +}) +export class AddContextToActorCompositeTypeCommand extends ActiveWorkspacesCommandRunner { + protected readonly logger; + + constructor( + @InjectRepository(Workspace, 'core') + protected readonly workspaceRepository: Repository, + private readonly twentyORMGlobalManager: TwentyORMGlobalManager, + @InjectRepository(FieldMetadataEntity, 'metadata') + private readonly fieldMetadataRepository: Repository, + private readonly workspaceDataSourceService: WorkspaceDataSourceService, + private readonly workspaceMetadataVersionService: WorkspaceMetadataVersionService, + ) { + super(workspaceRepository); + this.logger = new CommandLogger({ + constructorName: this.constructor.name, + verbose: false, + }); + this.logger.setVerbose(false); + } + + async executeActiveWorkspacesCommand( + _passedParam: string[], + options: ActiveWorkspacesCommandOptions, + workspaceIds: string[], + ): Promise { + this.logger.log(`Running add-context-to-actor-composite-type command`); + + if (options?.dryRun) { + this.logger.log(chalk.yellow('Dry run mode: No changes will be applied')); + } + + for (const workspaceId of workspaceIds) { + try { + await this.execute(workspaceId, options?.dryRun); + this.logger.verbose(`Added for workspace: ${workspaceId}`); + } catch (error) { + this.logger.error(`Error for workspace: ${workspaceId}`, error); + } + } + } + + private async execute(workspaceId: string, dryRun = false): Promise { + this.logger.verbose(`Adding for workspace: ${workspaceId}`); + const actorFields = await this.fieldMetadataRepository.find({ + where: { + type: FieldMetadataType.ACTOR, + workspaceId, + }, + relations: ['object'], + }); + + // Filter and update fields with EMAIL or CALENDAR source + for (const field of actorFields) { + if (!field || !field.object) { + this.logger.verbose( + 'field.objectMetadata is null', + workspaceId, + field.id, + ); + continue; + } + + await this.addContextColumn( + field, + `${field.name}Context`, + workspaceId, + dryRun, + ); + + const fieldRepository = + await this.twentyORMGlobalManager.getRepositoryForWorkspace( + workspaceId, + field.object.nameSingular, + ); + + if (!dryRun) { + await this.workspaceMetadataVersionService.incrementMetadataVersion( + workspaceId, + ); + } + + if (!dryRun) { + const rowsToUpdate = await fieldRepository.update( + { + [field.name + 'Source']: In([ + FieldActorSource.EMAIL, + FieldActorSource.CALENDAR, + ]), + [field.name + 'Context']: {}, + }, + { + [field.name + 'Context']: { + provider: 'google', + }, + }, + ); + + this.logger.verbose( + `updated ${rowsToUpdate ? rowsToUpdate.affected : 0} rows`, + ); + } + } + } + + private async addContextColumn( + field: FieldMetadataEntity, + newColumnName: string, + workspaceId: string, + dryRun = false, + ): Promise { + const workspaceDataSource = + await this.workspaceDataSourceService.connectToWorkspaceDataSource( + workspaceId, + ); + + if (!workspaceDataSource) { + this.logger.verbose('No workspace data source found'); + + return; + } + + const queryRunner = workspaceDataSource?.createQueryRunner(); + + await queryRunner.connect(); + await queryRunner.startTransaction(); + + const schemaName = + this.workspaceDataSourceService.getSchemaName(workspaceId); + + try { + const hasColumn = await queryRunner.hasColumn( + `${schemaName}.${computeTableName( + field.object.nameSingular, + field?.object?.isCustom, + )}`, + newColumnName, + ); + + if (hasColumn) { + return; + } + + if (!dryRun) { + await queryRunner.addColumn( + `${schemaName}.${computeTableName( + field.object.nameSingular, + field?.object?.isCustom, + )}`, + new TableColumn({ + name: newColumnName, + type: 'jsonb', + default: `'{}'::"jsonb"`, + isNullable: true, + }), + ); + + await queryRunner.commitTransaction(); + } + } catch (error) { + await queryRunner.rollbackTransaction(); + + throw error; + } finally { + await queryRunner.release(); + } + } +} diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.command.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.command.ts index 8f4c7365d..d17356aac 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.command.ts @@ -5,6 +5,7 @@ import { Repository } from 'typeorm'; import { ActiveWorkspacesCommandRunner } from 'src/database/commands/active-workspaces.command'; import { BaseCommandOptions } from 'src/database/commands/base.command'; +import { AddContextToActorCompositeTypeCommand } from 'src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type'; import { MigrateRelationsToFieldMetadataCommand } from 'src/database/commands/upgrade-version/0-41/0-41-migrate-relations-to-field-metadata.command'; import { RemoveDuplicateMcmasCommand } from 'src/database/commands/upgrade-version/0-41/0-41-remove-duplicate-mcmas'; import { SeedWorkflowViewsCommand } from 'src/database/commands/upgrade-version/0-41/0-41-seed-workflow-views.command'; @@ -22,6 +23,7 @@ export class UpgradeTo0_41Command extends ActiveWorkspacesCommandRunner { private readonly seedWorkflowViewsCommand: SeedWorkflowViewsCommand, private readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, private readonly migrateRelationsToFieldMetadata: MigrateRelationsToFieldMetadataCommand, + private readonly addContextToActorCompositeType: AddContextToActorCompositeTypeCommand, private readonly removeDuplicateMcmasCommand: RemoveDuplicateMcmasCommand, ) { super(workspaceRepository); @@ -40,6 +42,12 @@ export class UpgradeTo0_41Command extends ActiveWorkspacesCommandRunner { workspaceIds, ); + await this.addContextToActorCompositeType.executeActiveWorkspacesCommand( + passedParam, + options, + workspaceIds, + ); + await this.syncWorkspaceMetadataCommand.executeActiveWorkspacesCommand( passedParam, { diff --git a/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.module.ts b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.module.ts index 2cd87eea3..946e79537 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version/0-41/0-41-upgrade-version.module.ts @@ -1,6 +1,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; +import { AddContextToActorCompositeTypeCommand } from 'src/database/commands/upgrade-version/0-41/0-41-add-context-to-actor-composite-type'; import { MigrateRelationsToFieldMetadataCommand } from 'src/database/commands/upgrade-version/0-41/0-41-migrate-relations-to-field-metadata.command'; import { RemoveDuplicateMcmasCommand } from 'src/database/commands/upgrade-version/0-41/0-41-remove-duplicate-mcmas'; import { SeedWorkflowViewsCommand } from 'src/database/commands/upgrade-version/0-41/0-41-seed-workflow-views.command'; @@ -10,6 +11,8 @@ import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module'; +import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module'; +import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; import { WorkspaceHealthModule } from 'src/engine/workspace-manager/workspace-health/workspace-health.module'; import { SyncWorkspaceLoggerService } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/services/sync-workspace-logger.service'; import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; @@ -26,6 +29,8 @@ import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/worksp WorkspaceSyncMetadataCommandsModule, WorkspaceSyncMetadataModule, WorkspaceHealthModule, + WorkspaceDataSourceModule, + WorkspaceMetadataVersionModule, ], providers: [ SyncWorkspaceLoggerService, @@ -33,6 +38,7 @@ import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/worksp SeedWorkflowViewsCommand, UpgradeTo0_41Command, MigrateRelationsToFieldMetadataCommand, + AddContextToActorCompositeTypeCommand, RemoveDuplicateMcmasCommand, ], }) diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts index b64e01e74..e196f0793 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { ConnectedAccountProvider } from 'twenty-shared'; import { EntityManager, Repository } from 'typeorm'; import { v4 } from 'uuid'; @@ -22,10 +23,7 @@ import { CalendarChannelWorkspaceEntity, } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; import { AccountsToReconnectService } from 'src/modules/connected-account/services/accounts-to-reconnect.service'; -import { - ConnectedAccountProvider, - ConnectedAccountWorkspaceEntity, -} from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; +import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MessageChannelSyncStage, MessageChannelSyncStatus, diff --git a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts index 3b67410b4..52c867450 100644 --- a/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts +++ b/packages/twenty-server/src/engine/core-modules/auth/services/microsoft-apis.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; +import { ConnectedAccountProvider } from 'twenty-shared'; import { EntityManager, Repository } from 'typeorm'; import { v4 } from 'uuid'; @@ -21,10 +22,7 @@ import { CalendarChannelWorkspaceEntity, } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; import { AccountsToReconnectService } from 'src/modules/connected-account/services/accounts-to-reconnect.service'; -import { - ConnectedAccountProvider, - ConnectedAccountWorkspaceEntity, -} from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; +import { ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MessageChannelSyncStage, MessageChannelSyncStatus, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type.ts index f517c8b74..3ea641bd7 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type.ts @@ -1,4 +1,4 @@ -import { FieldMetadataType } from 'twenty-shared'; +import { ConnectedAccountProvider, FieldMetadataType } from 'twenty-shared'; import { CompositeProperty, @@ -41,6 +41,12 @@ export const actorCompositeType: CompositeType = { hidden: 'input', isRequired: true, }, + { + name: 'context', + type: FieldMetadataType.RAW_JSON, + hidden: false, + isRequired: false, + }, ], }; @@ -48,4 +54,7 @@ export type ActorMetadata = { source: FieldActorSource; workspaceMemberId?: string; name: string; + context?: { + provider?: ConnectedAccountProvider; + }; }; diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts index d2e3d2bd7..a087c1a8f 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/utils/generate-default-value.ts @@ -2,6 +2,8 @@ import { FieldMetadataType } from 'twenty-shared'; import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; +import { FieldActorSource } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; + export function generateDefaultValue( type: FieldMetadataType, ): FieldMetadataDefaultValue { @@ -52,6 +54,12 @@ export function generateDefaultValue( blocknote: "''", markdown: "''", }; + case FieldMetadataType.ACTOR: + return { + source: `'${FieldActorSource.MANUAL}'`, + name: "'System'", + context: {}, + }; default: return null; } diff --git a/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts b/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts index 6bf5c333d..1d6c3e962 100644 --- a/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts +++ b/packages/twenty-server/src/engine/twenty-orm/custom.workspace-entity.ts @@ -2,10 +2,7 @@ import { msg } from '@lingui/core/macro'; import { FieldMetadataType } from 'twenty-shared'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { DEFAULT_LABEL_IDENTIFIER_FIELD_NAME } from 'src/engine/metadata-modules/object-metadata/object-metadata.constants'; import { @@ -64,10 +61,6 @@ export class CustomWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts index 650f6497b..b52f7ba46 100644 --- a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts +++ b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts @@ -4,10 +4,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { AddressMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/address.composite-type'; import { CurrencyMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/currency.composite-type'; import { LinksMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/links.composite-type'; @@ -157,10 +154,6 @@ export class CompanyWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts b/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts index 251c64453..c103ad176 100644 --- a/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts +++ b/packages/twenty-server/src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts @@ -1,5 +1,5 @@ import { msg } from '@lingui/core/macro'; -import { FieldMetadataType } from 'twenty-shared'; +import { ConnectedAccountProvider, FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; @@ -22,11 +22,6 @@ import { CalendarChannelWorkspaceEntity } from 'src/modules/calendar/common/stan import { MessageChannelWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; -export enum ConnectedAccountProvider { - GOOGLE = 'google', - MICROSOFT = 'microsoft', -} - @WorkspaceEntity({ standardId: STANDARD_OBJECT_IDS.connectedAccount, namePlural: 'connectedAccounts', diff --git a/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts b/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts index c1489e888..c7ef5dd64 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/services/create-company-and-contact.service.ts @@ -127,6 +127,9 @@ export class CreateCompanyAndContactService { : undefined, createdBySource: source, createdByWorkspaceMember: connectedAccount.accountOwner, + createdByContext: { + provider: connectedAccount.provider, + }, })); return this.createContactService.createPeople( diff --git a/packages/twenty-server/src/modules/contact-creation-manager/services/create-contact.service.ts b/packages/twenty-server/src/modules/contact-creation-manager/services/create-contact.service.ts index 6f2dc9e88..d6800089b 100644 --- a/packages/twenty-server/src/modules/contact-creation-manager/services/create-contact.service.ts +++ b/packages/twenty-server/src/modules/contact-creation-manager/services/create-contact.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@nestjs/common'; +import { ConnectedAccountProvider } from 'twenty-shared'; import { DeepPartial, EntityManager } from 'typeorm'; import { v4 } from 'uuid'; @@ -17,6 +18,9 @@ type ContactToCreate = { companyId?: string; createdBySource: FieldActorSource; createdByWorkspaceMember?: WorkspaceMemberWorkspaceEntity | null; + createdByContext?: { + provider?: ConnectedAccountProvider; + }; }; @Injectable() @@ -38,6 +42,7 @@ export class CreateContactService { companyId, createdBySource, createdByWorkspaceMember, + createdByContext, } = contact; const { firstName, lastName } = @@ -56,6 +61,7 @@ export class CreateContactService { source: createdBySource, workspaceMemberId: contact.createdByWorkspaceMember?.id, name: createdByName, + context: createdByContext, }, position: ++lastPersonPosition, }; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-message-list.service.dev.spec.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-message-list.service.dev.spec.ts index f2d663fec..29b38ada6 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-message-list.service.dev.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-message-list.service.dev.spec.ts @@ -1,9 +1,10 @@ import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConnectedAccountProvider } from 'twenty-shared'; + import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { MicrosoftOAuth2ClientManagerService } from 'src/modules/connected-account/oauth2-client-manager/drivers/microsoft/microsoft-oauth2-client-manager.service'; -import { ConnectedAccountProvider } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MicrosoftClientProvider } from 'src/modules/messaging/message-import-manager/drivers/microsoft/providers/microsoft-client.provider'; import { MicrosoftGetMessageListService } from './microsoft-get-message-list.service'; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.dev.spec.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.dev.spec.ts index 43fd7563e..801c5cde4 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.dev.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.dev.spec.ts @@ -1,9 +1,10 @@ import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConnectedAccountProvider } from 'twenty-shared'; + import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { MicrosoftOAuth2ClientManagerService } from 'src/modules/connected-account/oauth2-client-manager/drivers/microsoft/microsoft-oauth2-client-manager.service'; -import { ConnectedAccountProvider } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { MicrosoftClientProvider } from 'src/modules/messaging/message-import-manager/drivers/microsoft/providers/microsoft-client.provider'; import { MicrosoftFetchByBatchService } from 'src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-fetch-by-batch.service'; import { MicrosoftGetMessagesService } from 'src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service'; diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.spec.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.spec.ts index a0652fa22..a2a38e502 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.spec.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/drivers/microsoft/services/microsoft-get-messages.service.spec.ts @@ -1,9 +1,10 @@ import { ConfigService } from '@nestjs/config'; import { Test, TestingModule } from '@nestjs/testing'; +import { ConnectedAccountProvider } from 'twenty-shared'; + import { EnvironmentModule } from 'src/engine/core-modules/environment/environment.module'; import { MicrosoftOAuth2ClientManagerService } from 'src/modules/connected-account/oauth2-client-manager/drivers/microsoft/microsoft-oauth2-client-manager.service'; -import { ConnectedAccountProvider } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; import { microsoftGraphBatchWithHtmlMessagesResponse, microsoftGraphBatchWithTwoMessagesResponse, diff --git a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts index 2c6e741a0..8b2a443de 100644 --- a/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts +++ b/packages/twenty-server/src/modules/note/standard-objects/note.workspace-entity.ts @@ -5,10 +5,7 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/i import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { RichTextV2Metadata } from 'src/engine/metadata-modules/field-metadata/composite-types/rich-text-v2.composite-type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { @@ -101,10 +98,6 @@ export class NoteWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts index 6e52a3f90..f48c1219a 100644 --- a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts +++ b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.workspace-entity.ts @@ -4,10 +4,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { CurrencyMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/currency.composite-type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { @@ -126,10 +123,6 @@ export class OpportunityWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts b/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts index f772ee360..b7f664def 100644 --- a/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts +++ b/packages/twenty-server/src/modules/person/standard-objects/person.workspace-entity.ts @@ -4,10 +4,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { EmailsMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/emails.composite-type'; import { FullNameMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/full-name.composite-type'; import { LinksMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/links.composite-type'; @@ -170,10 +167,6 @@ export class PersonWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts index 874fb212b..52912750d 100644 --- a/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts +++ b/packages/twenty-server/src/modules/task/standard-objects/task.workspace-entity.ts @@ -5,10 +5,7 @@ import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/i import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/constants/search-vector-field.constants'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { RichTextV2Metadata } from 'src/engine/metadata-modules/field-metadata/composite-types/rich-text-v2.composite-type'; import { IndexType } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; import { @@ -139,10 +136,6 @@ export class TaskWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts index 8a34d87d5..539a1b76c 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow-run.workspace-entity.ts @@ -3,10 +3,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { RelationMetadataType, RelationOnDeleteAction, @@ -130,10 +127,6 @@ export class WorkflowRunWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Executed by`, icon: 'IconCreativeCommonsSa', description: msg`The executor of the workflow`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; diff --git a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts index fe3046b99..7e7f2caf4 100644 --- a/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts +++ b/packages/twenty-server/src/modules/workflow/common/standard-objects/workflow.workspace-entity.ts @@ -3,10 +3,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { Relation } from 'src/engine/workspace-manager/workspace-sync-metadata/interfaces/relation.interface'; -import { - ActorMetadata, - FieldActorSource, -} from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; +import { ActorMetadata } from 'src/engine/metadata-modules/field-metadata/composite-types/actor.composite-type'; import { FieldMetadataComplexOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; import { RelationMetadataType, @@ -169,10 +166,6 @@ export class WorkflowWorkspaceEntity extends BaseWorkspaceEntity { label: msg`Created by`, icon: 'IconCreativeCommonsSa', description: msg`The creator of the record`, - defaultValue: { - source: `'${FieldActorSource.MANUAL}'`, - name: "''", - }, }) createdBy: ActorMetadata; } diff --git a/packages/twenty-shared/src/index.ts b/packages/twenty-shared/src/index.ts index 3d08c2280..67ec50bc1 100644 --- a/packages/twenty-shared/src/index.ts +++ b/packages/twenty-shared/src/index.ts @@ -1,6 +1,7 @@ export * from './constants/FieldForTotalCountAggregateOperation'; export * from './constants/TwentyCompaniesBaseUrl'; export * from './constants/TwentyIconsBaseUrl'; +export * from './types/ConnectedAccountProvider'; export * from './types/FieldMetadataType'; export * from './utils/fieldMetadata/isFieldMetadataDateKind'; export * from './utils/image/getImageAbsoluteURI'; diff --git a/packages/twenty-shared/src/types/ConnectedAccountProvider.ts b/packages/twenty-shared/src/types/ConnectedAccountProvider.ts new file mode 100644 index 000000000..8981a410c --- /dev/null +++ b/packages/twenty-shared/src/types/ConnectedAccountProvider.ts @@ -0,0 +1,4 @@ +export enum ConnectedAccountProvider { + GOOGLE = 'google', + MICROSOFT = 'microsoft', +} diff --git a/packages/twenty-ui/src/display/icon/assets/microsoft-calendar.svg b/packages/twenty-ui/src/display/icon/assets/microsoft-calendar.svg new file mode 100644 index 000000000..4307acf79 --- /dev/null +++ b/packages/twenty-ui/src/display/icon/assets/microsoft-calendar.svg @@ -0,0 +1,142 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/packages/twenty-ui/src/display/icon/assets/microsoft-outlook.svg b/packages/twenty-ui/src/display/icon/assets/microsoft-outlook.svg index 8e0cdce35..2cde22d44 100644 --- a/packages/twenty-ui/src/display/icon/assets/microsoft-outlook.svg +++ b/packages/twenty-ui/src/display/icon/assets/microsoft-outlook.svg @@ -1,8 +1,35 @@ - - -file_type_outlook - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/packages/twenty-ui/src/display/icon/components/IconMicrosoftCalendar.tsx b/packages/twenty-ui/src/display/icon/components/IconMicrosoftCalendar.tsx new file mode 100644 index 000000000..7f2574fd4 --- /dev/null +++ b/packages/twenty-ui/src/display/icon/components/IconMicrosoftCalendar.tsx @@ -0,0 +1,14 @@ +import { useTheme } from '@emotion/react'; + +import IconMicrosoftCalendarRaw from '../assets/microsoft-calendar.svg?react'; + +interface IconMicrosoftCalendarProps { + size?: number; +} + +export const IconMicrosoftCalendar = (props: IconMicrosoftCalendarProps) => { + const theme = useTheme(); + const size = props.size ?? theme.icon.size.lg; + + return ; +}; diff --git a/packages/twenty-ui/src/display/index.ts b/packages/twenty-ui/src/display/index.ts index 93a2512b6..b8dca47f3 100644 --- a/packages/twenty-ui/src/display/index.ts +++ b/packages/twenty-ui/src/display/index.ts @@ -16,6 +16,7 @@ export * from './icon/components/IconGoogle'; export * from './icon/components/IconGoogleCalendar'; export * from './icon/components/IconLock'; export * from './icon/components/IconMicrosoft'; +export * from './icon/components/IconMicrosoftCalendar'; export * from './icon/components/IconMicrosoftOutlook'; export * from './icon/components/IconRelationManyToOne'; export * from './icon/components/IconTwentyStar';