diff --git a/packages/twenty-docs/docs/start/self-hosting/docker-compose.mdx b/packages/twenty-docs/docs/start/self-hosting/docker-compose.mdx index 9aee44c73..a5594f7ed 100644 --- a/packages/twenty-docs/docs/start/self-hosting/docker-compose.mdx +++ b/packages/twenty-docs/docs/start/self-hosting/docker-compose.mdx @@ -35,7 +35,7 @@ Complete step three and four with : ## Production docker containers -Prebuilt images for both Postgres, frontend, and back-end can be found on [docker hub](https://hub.docker.com/r/twentycrm/). Note that the Postgres container will not persist data if your server is not configured to be stateful (e.g. Heroku). You probably want to configure a special stateful resource for the database. +Prebuilt images for both Postgres, frontend, and back-end can be found on [docker hub](https://hub.docker.com/r/twentycrm/). Note that the Postgres container will not persist data if your server is not configured to be stateful (for example Heroku). You probably want to configure a special stateful resource for the database. ## Environment Variables diff --git a/packages/twenty-front/nyc.config.cjs b/packages/twenty-front/nyc.config.cjs index bf92d9cde..0ee161423 100644 --- a/packages/twenty-front/nyc.config.cjs +++ b/packages/twenty-front/nyc.config.cjs @@ -6,7 +6,7 @@ const globalCoverage = { }; const modulesCoverage = { - statements: 75, + statements: 70, lines: 75, functions: 70, include: ['src/modules/**/*'], diff --git a/packages/twenty-front/src/modules/object-metadata/types/CoreObjectNameSingular.ts b/packages/twenty-front/src/modules/object-metadata/types/CoreObjectNameSingular.ts index 13591a07d..10602b7e3 100644 --- a/packages/twenty-front/src/modules/object-metadata/types/CoreObjectNameSingular.ts +++ b/packages/twenty-front/src/modules/object-metadata/types/CoreObjectNameSingular.ts @@ -15,7 +15,6 @@ export enum CoreObjectNameSingular { MessageThread = 'messageThread', Opportunity = 'opportunity', Person = 'person', - PipelineStep = 'pipelineStep', View = 'view', ViewField = 'viewField', ViewFilter = 'viewFilter', diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx index 4ca474d31..c71702c94 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapFieldMetadataToGraphQLQuery.test.tsx @@ -150,7 +150,6 @@ personId pointOfContactId updatedAt companyId -pipelineStepId probability closeDate amount diff --git a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx index 747390617..a1d34e9b5 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx +++ b/packages/twenty-front/src/modules/object-metadata/utils/__tests__/mapObjectMetadataToGraphQLQuery.test.tsx @@ -78,7 +78,6 @@ personId pointOfContactId updatedAt companyId -pipelineStepId probability closeDate amount @@ -106,7 +105,6 @@ personId pointOfContactId updatedAt companyId -pipelineStepId probability closeDate amount diff --git a/packages/twenty-front/src/modules/object-metadata/utils/getObjectMetadataItemsMock.ts b/packages/twenty-front/src/modules/object-metadata/utils/getObjectMetadataItemsMock.ts index f14d5607e..e9549cf70 100644 --- a/packages/twenty-front/src/modules/object-metadata/utils/getObjectMetadataItemsMock.ts +++ b/packages/twenty-front/src/modules/object-metadata/utils/getObjectMetadataItemsMock.ts @@ -401,23 +401,6 @@ export const getObjectMetadataItemsMock = () => { fromRelationMetadata: null, toRelationMetadata: null, }, - { - __typename: 'field', - id: '20202020-0a2e-4676-8011-3fdb2c30d7f8', - type: 'UUID', - name: 'pipelineStepId', - label: 'Pipeline Step ID (foreign key)', - description: 'Foreign key for pipeline step', - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-11-30T11:13:15.308Z', - updatedAt: '2023-11-30T11:13:15.308Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, { __typename: 'field', id: '20202020-3b9c-4e58-a3d2-c617d3b596b1', @@ -436,32 +419,63 @@ export const getObjectMetadataItemsMock = () => { toRelationMetadata: null, }, { - __typename: 'field', - id: '20202020-0a2e-4676-8011-3fdb2c30c258', - type: 'RELATION', - name: 'pipelineStep', - label: 'Pipeline Step', - description: 'Opportunity pipeline step', - icon: 'IconKanban', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-11-30T11:13:15.308Z', - updatedAt: '2023-11-30T11:13:15.308Z', - fromRelationMetadata: null, - toRelationMetadata: { - __typename: 'relation', - id: 'dfb44970-3e09-49f2-9f1d-51c8c451b8f5', - relationType: 'ONE_TO_MANY', - fromObjectMetadata: { - __typename: 'object', - id: '20202020-1029-4661-9e91-83bad932bdcd', - dataSourceId: '20202020-7f63-47a9-b1b3-6c7290ca9fb1', - nameSingular: 'pipelineStep', - namePlural: 'pipelineSteps', + __typename: 'fieldEdge', + node: { + __typename: 'field', + id: '20202020-46cc-42bb-90d5-c724921a012d', + type: 'SELECT', + name: 'stage', + label: 'Stage', + description: 'Opportunity stage', + icon: 'IconProgressCheck', + isCustom: false, + isActive: true, + isSystem: false, + isNullable: false, + createdAt: '2024-03-21T16:48:40.384Z', + updatedAt: '2024-03-21T16:48:40.384Z', + defaultValue: { + value: 'NEW', }, - fromFieldMetadataId: '20202020-22c4-443a-b114-43c97dda5867', + options: [ + { + id: '20202020-aa3b-4c0b-bd90-9d071e3b9bf2', + color: 'red', + label: 'New', + value: 'NEW', + position: 0, + }, + { + id: '20202020-8f9b-4bc3-b0a0-ce6a5085c1cf', + color: 'purple', + label: 'Screening', + value: 'SCREENING', + position: 1, + }, + { + id: '20202020-9797-448d-81e4-49b055a1d19b', + color: 'sky', + label: 'Meeting', + value: 'MEETING', + position: 2, + }, + { + id: '20202020-d542-479c-bc88-3c6d4ee78d09', + color: 'turquoise', + label: 'Proposal', + value: 'PROPOSAL', + position: 3, + }, + { + id: '20202020-b69a-4c9c-ac16-adcba0ec972d', + color: 'yellow', + label: 'Customer', + value: 'CUSTOMER', + position: 4, + }, + ], + fromRelationMetadata: null, + toRelationMetadata: null, }, }, { @@ -3537,155 +3551,6 @@ export const getObjectMetadataItemsMock = () => { }, ], }, - { - __typename: 'object', - id: '20202020-1029-4661-9e91-83bad932bdcd', - dataSourceId: '20202020-7f63-47a9-b1b3-6c7290ca9fb1', - nameSingular: 'pipelineStep', - namePlural: 'pipelineSteps', - labelSingular: 'Pipeline Step', - labelPlural: 'Pipeline Steps', - description: 'A pipeline step', - icon: 'IconLayoutKanban', - isCustom: false, - isActive: true, - isSystem: true, - createdAt: '2023-11-30T11:13:15.206Z', - updatedAt: '2023-11-30T11:13:15.206Z', - fields: [ - { - __typename: 'field', - id: '20202020-f294-430e-b800-3a411fc05ad3', - type: 'TEXT', - name: 'name', - label: 'Name', - description: 'Pipeline Step name', - icon: 'IconCurrencyDollar', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-039a-4fbd-b4c1-66dfa9e4bd3f', - type: 'UUID', - name: 'id', - label: 'Id', - description: null, - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-816f-4861-9b36-4a2f8ae2791c', - type: 'DATE_TIME', - name: 'createdAt', - label: 'Creation date', - description: null, - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-22c4-443a-b114-43c97dda5867', - type: 'RELATION', - name: 'opportunities', - label: 'Opportunities', - description: 'Opportunities linked to the step.', - icon: 'IconTargetArrow', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: { - __typename: 'relation', - id: 'dfb44970-3e09-49f2-9f1d-51c8c451b8f5', - relationType: 'ONE_TO_MANY', - toObjectMetadata: { - __typename: 'object', - id: '20202020-cae9-4ff4-9579-f7d9fe44c937', - dataSourceId: '20202020-7f63-47a9-b1b3-6c7290ca9fb1', - nameSingular: 'opportunity', - namePlural: 'opportunities', - }, - toFieldMetadataId: '20202020-0a2e-4676-8011-3fdb2c30c258', - }, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-6296-4cab-aafb-121ef5822b13', - type: 'NUMBER', - name: 'position', - label: 'Position', - description: 'Pipeline Step position', - icon: 'IconHierarchy2', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-5b93-4b28-8c45-7988ea68f91b', - type: 'TEXT', - name: 'color', - label: 'Color', - description: 'Pipeline Step color', - icon: 'IconColorSwatch', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - { - __typename: 'field', - id: '20202020-2d73-4829-b774-522c2f5627d7', - type: 'DATE_TIME', - name: 'updatedAt', - label: 'Update date', - description: null, - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-11-30T11:13:15.337Z', - updatedAt: '2023-11-30T11:13:15.337Z', - fromRelationMetadata: null, - toRelationMetadata: null, - }, - ], - }, ]; // Todo fix typing here (the backend is not in sync with the frontend) diff --git a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts index 84eb553d9..7a756cac7 100644 --- a/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts +++ b/packages/twenty-front/src/modules/object-record/hooks/__mocks__/useFindManyRecords.ts @@ -26,7 +26,7 @@ export const query = gql` pointOfContactId updatedAt companyId - pipelineStepId + stage probability closeDate amount { @@ -52,7 +52,7 @@ export const query = gql` pointOfContactId updatedAt companyId - pipelineStepId + stage probability closeDate amount { diff --git a/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts b/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts index 176ccbad2..bb7cc3578 100644 --- a/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts +++ b/packages/twenty-front/src/modules/object-record/utils/filterAvailableTableColumns.ts @@ -16,12 +16,5 @@ export const filterAvailableTableColumns = ( return false; } - if ( - isFieldRelation(columnDefinition) && - columnDefinition.metadata?.fieldName === 'pipelineStep' - ) { - return false; - } - return true; }; diff --git a/packages/twenty-front/src/modules/search/hooks/__mocks__/useFilteredSearchEntityQuery.ts b/packages/twenty-front/src/modules/search/hooks/__mocks__/useFilteredSearchEntityQuery.ts index 39201e66a..cb1daf981 100644 --- a/packages/twenty-front/src/modules/search/hooks/__mocks__/useFilteredSearchEntityQuery.ts +++ b/packages/twenty-front/src/modules/search/hooks/__mocks__/useFilteredSearchEntityQuery.ts @@ -24,7 +24,7 @@ export const query = gql` pointOfContactId updatedAt companyId - pipelineStepId + stage probability closeDate amount { @@ -49,7 +49,7 @@ export const query = gql` pointOfContactId updatedAt companyId - pipelineStepId + stage probability closeDate amount { diff --git a/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockCompanies.ts b/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockCompanies.ts index 1dac5f635..7c0e70918 100644 --- a/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockCompanies.ts +++ b/packages/twenty-front/src/modules/sign-in-background-mock/constants/SignInBackgroundMockCompanies.ts @@ -401,8 +401,8 @@ export const SIGN_IN_BACKGROUND_MOCK_COMPANIES = [ __typename: 'Opportunity', id: '53f66647-0543-4cc2-9f96-95cc699960f2', probability: '0.5', - pipelineStepId: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', pointOfContactId: '93c72d2e-f517-42fd-80ae-14173b3b70ae', + stage: 'NEW', amount: { __typename: 'Currency', amountMicros: 2000000, @@ -609,7 +609,7 @@ export const SIGN_IN_BACKGROUND_MOCK_COMPANIES = [ __typename: 'Opportunity', id: '81ab695d-2f89-406f-90ea-180f433b2445', probability: '0.5', - pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', + stage: 'NEW', pointOfContactId: '9b324a88-6784-4449-afdf-dc62cb8702f2', amount: { __typename: 'Currency', @@ -629,7 +629,7 @@ export const SIGN_IN_BACKGROUND_MOCK_COMPANIES = [ __typename: 'Opportunity', id: '9b059852-35b1-4045-9cde-42f715148954', probability: '0.5', - pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', + stage: 'NEW', pointOfContactId: '98406e26-80f1-4dff-b570-a74942528de3', amount: { __typename: 'Currency', @@ -1157,7 +1157,7 @@ export const SIGN_IN_BACKGROUND_MOCK_COMPANIES = [ __typename: 'Opportunity', id: '7c887ee3-be10-412b-a663-16bd3c2228e1', probability: '0.5', - pipelineStepId: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', + stage: 'NEW', pointOfContactId: '86083141-1c0e-494c-a1b6-85b1c6fefaa5', amount: { __typename: 'Currency', diff --git a/packages/twenty-front/src/testing/mock-data/metadata.ts b/packages/twenty-front/src/testing/mock-data/metadata.ts index 768608ccf..d6c6464f4 100644 --- a/packages/twenty-front/src/testing/mock-data/metadata.ts +++ b/packages/twenty-front/src/testing/mock-data/metadata.ts @@ -1184,220 +1184,6 @@ export const mockedCompaniesMetadata = { }, } as ObjectEdge; -export const mockedPipelineStepsMetadata = { - __typename: 'objectEdge', - node: { - __typename: 'object', - id: 'afa12866-0de4-4f97-97fa-cd8a7c953037', - dataSourceId: 'cabbcaa6-05d6-41f4-920f-9144172a4f08', - nameSingular: 'pipelineStep', - namePlural: 'pipelineSteps', - labelSingular: 'Pipeline Step', - labelPlural: 'Pipeline Steps', - description: 'A pipeline step', - icon: 'IconLayoutKanban', - isCustom: false, - isActive: true, - isSystem: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - labelIdentifierFieldMetadataId: null, - imageIdentifierFieldMetadataId: null, - fields: { - __typename: 'ObjectFieldsConnection', - edges: [ - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '202efca6-9820-4e4a-9a27-f362dc5b46ed', - type: FieldMetadataType.Uuid, - name: 'id', - label: 'Id', - description: null, - icon: null, - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - type: FieldMetadataType.Uuid, - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'c9b9d516-10d2-4eca-94ce-a872547f429f', - type: FieldMetadataType.Text, - name: 'color', - label: 'Color', - description: 'Pipeline Step color', - icon: 'IconColorSwatch', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - value: '', - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '7928241f-6fe9-4ab2-84c6-7e84c5bea05f', - type: FieldMetadataType.DateTime, - name: 'updatedAt', - label: 'Update date', - description: null, - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - type: 'now', - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'ad3e919f-4258-4e21-8caf-bf122f17ca5c', - type: FieldMetadataType.Relation, - name: 'opportunities', - label: 'Opportunities', - description: 'Opportunities linked to the step.', - icon: 'IconTargetArrow', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: { - __typename: 'relation', - id: '7b0474c4-d82d-4c1d-96de-c6728b53339a', - relationType: RelationMetadataType.OneToMany, - toObjectMetadata: { - __typename: 'object', - id: '941ad274-2d26-4e90-94d9-5e446aa5b91e', - dataSourceId: 'cabbcaa6-05d6-41f4-920f-9144172a4f08', - nameSingular: 'opportunity', - namePlural: 'opportunities', - isSystem: true, - }, - toFieldMetadataId: '4756a816-8a18-433a-9414-c756db4727e8', - }, - toRelationMetadata: null, - options: [], - defaultValue: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: 'c26ba58c-5629-4a6b-ae7f-5c06d3045a9b', - type: FieldMetadataType.DateTime, - name: 'createdAt', - label: 'Creation date', - description: null, - icon: 'IconCalendar', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: false, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - type: 'now', - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '4f383c05-3f9b-433a-8617-20ed3861e490', - type: FieldMetadataType.Text, - name: 'name', - label: 'Name', - description: 'Pipeline Step name', - icon: 'IconCurrencyDollar', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - value: '', - }, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '8c712fbc-306f-4534-86c1-caae09b840a2', - type: FieldMetadataType.Number, - name: 'position', - label: 'Position', - description: 'Pipeline Step position', - icon: 'IconHierarchy2', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: { - value: 0, - }, - }, - }, - ], - pageInfo: { - __typename: 'PageInfo', - hasNextPage: false, - hasPreviousPage: false, - startCursor: 'YXJyYXljb25uZWN0aW9uOjA=', - endCursor: 'YXJyYXljb25uZWN0aW9uOjY=', - }, - totalCount: 7, - }, - }, -}; - const mockedCalendarEventsMetadata = { __typename: 'objectEdge', node: { @@ -4837,63 +4623,6 @@ export const mockedOpportunitiesMetadata = { defaultValue: null, }, }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '480e430d-ec7b-4297-93fd-0c6463b9fad3', - type: FieldMetadataType.Uuid, - name: 'pipelineStepId', - label: 'Pipeline Step id (foreign key)', - description: 'Opportunity pipeline step id foreign key', - icon: 'IconKanban', - isCustom: false, - isActive: true, - isSystem: true, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - toRelationMetadata: null, - options: [], - defaultValue: null, - }, - }, - { - __typename: 'fieldEdge', - node: { - __typename: 'field', - id: '4756a816-8a18-433a-9414-c756db4727e8', - type: FieldMetadataType.Relation, - name: 'pipelineStep', - label: 'Pipeline Step', - description: 'Opportunity pipeline step', - icon: 'IconKanban', - isCustom: false, - isActive: true, - isSystem: false, - isNullable: true, - createdAt: '2023-12-15T15:29:39.070Z', - updatedAt: '2023-12-15T15:29:39.070Z', - fromRelationMetadata: null, - options: [], - toRelationMetadata: { - __typename: 'relation', - id: '7b0474c4-d82d-4c1d-96de-c6728b53339a', - relationType: RelationMetadataType.OneToMany, - fromObjectMetadata: { - __typename: 'object', - id: 'afa12866-0de4-4f97-97fa-cd8a7c953037', - dataSourceId: 'cabbcaa6-05d6-41f4-920f-9144172a4f08', - nameSingular: 'pipelineStep', - namePlural: 'pipelineSteps', - isSystem: true, - }, - fromFieldMetadataId: 'ad3e919f-4258-4e21-8caf-bf122f17ca5c', - }, - defaultValue: null, - }, - }, { __typename: 'fieldEdge', node: { @@ -7501,7 +7230,6 @@ export const mockedObjectMetadataItems = { mockedWebhooksMetadata, mockedPeopleMetadata, mockedCompaniesMetadata, - mockedPipelineStepsMetadata, mockedActivityTargetsMetadata, mockedActivitiesMetadata, mockedFavoritesMetadata, diff --git a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts index 0a8ec622e..8e9a7c7ca 100644 --- a/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts +++ b/packages/twenty-server/src/database/commands/data-seed-dev-workspace.command.ts @@ -1,12 +1,10 @@ import { Command, CommandRunner } from 'nest-commander'; -import { DataSource } from 'typeorm'; +import { DataSource, EntityManager } from 'typeorm'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { seedCompanies } from 'src/database/typeorm-seeds/workspace/companies'; -import { seedViews } from 'src/database/typeorm-seeds/workspace/views'; import { TypeORMService } from 'src/database/typeorm/typeorm.service'; import { seedOpportunity } from 'src/database/typeorm-seeds/workspace/opportunity'; -import { seedPipelineStep } from 'src/database/typeorm-seeds/workspace/pipeline-step'; import { seedWorkspaceMember } from 'src/database/typeorm-seeds/workspace/workspaceMember'; import { seedPeople } from 'src/database/typeorm-seeds/workspace/people'; import { seedCoreSchema } from 'src/database/typeorm-seeds/core'; @@ -19,6 +17,7 @@ import { SeedAppleWorkspaceId, SeedTwentyWorkspaceId, } from 'src/database/typeorm-seeds/core/workspaces'; +import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; // TODO: implement dry-run @Command({ @@ -95,10 +94,10 @@ export class DataSeedWorkspaceCommand extends CommandRunner { const objectMetadata = await this.objectMetadataService.findManyWithinWorkspace(workspaceId); const objectMetadataMap = objectMetadata.reduce((acc, object) => { - acc[object.nameSingular] = { + acc[object.standardId ?? ''] = { id: object.id, fields: object.fields.reduce((acc, field) => { - acc[field.name] = field.id; + acc[field.standardId ?? ''] = field.id; return acc; }, {}), @@ -107,24 +106,24 @@ export class DataSeedWorkspaceCommand extends CommandRunner { return acc; }, {}); - await seedCompanies(workspaceDataSource, dataSourceMetadata.schema); - await seedPeople(workspaceDataSource, dataSourceMetadata.schema); - await seedPipelineStep(workspaceDataSource, dataSourceMetadata.schema); - await seedOpportunity(workspaceDataSource, dataSourceMetadata.schema); - await seedCalendarEvents( - workspaceDataSource, - dataSourceMetadata.schema, - ); + await workspaceDataSource.transaction( + async (entityManager: EntityManager) => { + await seedCompanies(entityManager, dataSourceMetadata.schema); + await seedPeople(entityManager, dataSourceMetadata.schema); + await seedOpportunity(entityManager, dataSourceMetadata.schema); + await seedCalendarEvents(entityManager, dataSourceMetadata.schema); + await seedWorkspaceMember( + entityManager, + dataSourceMetadata.schema, + workspaceId, + ); - await seedViews( - workspaceDataSource, - dataSourceMetadata.schema, - objectMetadataMap, - ); - await seedWorkspaceMember( - workspaceDataSource, - dataSourceMetadata.schema, - workspaceId, + await viewPrefillData( + entityManager, + dataSourceMetadata.schema, + objectMetadataMap, + ); + }, ); } catch (error) { console.error(error); diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts index 8f2f23db0..cd643a6c8 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/calendar-events.ts @@ -1,12 +1,12 @@ -import { DataSource } from 'typeorm'; +import { EntityManager } from 'typeorm'; const tableName = 'calendarEvent'; export const seedCalendarEvents = async ( - workspaceDataSource: DataSource, + entityManager: EntityManager, schemaName: string, ) => { - await workspaceDataSource + await entityManager .createQueryBuilder() .insert() .into(`${schemaName}.${tableName}`, [ diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/companies.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/companies.ts index f7f3e2011..b9e83a230 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/companies.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/companies.ts @@ -1,12 +1,12 @@ -import { DataSource } from 'typeorm'; +import { EntityManager } from 'typeorm'; const tableName = 'company'; export const seedCompanies = async ( - workspaceDataSource: DataSource, + entityManager: EntityManager, schemaName: string, ) => { - await workspaceDataSource + await entityManager .createQueryBuilder() .insert() .into(`${schemaName}.${tableName}`, [ diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts index 49f76de5e..a7e799a42 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts @@ -1,12 +1,12 @@ -import { DataSource } from 'typeorm'; +import { EntityManager } from 'typeorm'; const tableName = 'opportunity'; export const seedOpportunity = async ( - workspaceDataSource: DataSource, + entityManager: EntityManager, schemaName: string, ) => { - await workspaceDataSource + await entityManager .createQueryBuilder() .insert() .into(`${schemaName}.${tableName}`, [ @@ -18,7 +18,6 @@ export const seedOpportunity = async ( 'probability', 'stage', 'position', - 'pipelineStepId', 'pointOfContactId', 'companyId', ]) @@ -33,7 +32,6 @@ export const seedOpportunity = async ( probability: 0.5, stage: 'NEW', position: 1, - pipelineStepId: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', pointOfContactId: '86083141-1c0e-494c-a1b6-85b1c6fefaa5', companyId: 'fe256b39-3ec3-4fe3-8997-b76aa0bfa408', }, @@ -46,7 +44,6 @@ export const seedOpportunity = async ( probability: 0.5, stage: 'MEETING', position: 2, - pipelineStepId: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', pointOfContactId: '93c72d2e-f517-42fd-80ae-14173b3b70ae', companyId: '118995f3-5d81-46d6-bf83-f7fd33ea6102', }, @@ -59,7 +56,6 @@ export const seedOpportunity = async ( probability: 0.5, stage: 'PROPOSAL', position: 3, - pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', pointOfContactId: '9b324a88-6784-4449-afdf-dc62cb8702f2', companyId: '460b6fb1-ed89-413a-b31a-962986e67bb4', }, @@ -72,7 +68,6 @@ export const seedOpportunity = async ( probability: 0.5, stage: 'PROPOSAL', position: 4, - pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', pointOfContactId: '98406e26-80f1-4dff-b570-a74942528de3', companyId: '460b6fb1-ed89-413a-b31a-962986e67bb4', }, diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/people.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/people.ts index 690ccd396..74354119f 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/people.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/people.ts @@ -1,12 +1,12 @@ -import { DataSource } from 'typeorm'; +import { EntityManager } from 'typeorm'; const tableName = 'person'; export const seedPeople = async ( - workspaceDataSource: DataSource, + entityManager: EntityManager, schemaName: string, ) => { - await workspaceDataSource + await entityManager .createQueryBuilder() .insert() .into(`${schemaName}.${tableName}`, [ diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/pipeline-step.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/pipeline-step.ts deleted file mode 100644 index 4a9b25e48..000000000 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/pipeline-step.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { DataSource } from 'typeorm'; - -const tableName = 'pipelineStep'; - -export const seedPipelineStep = async ( - workspaceDataSource: DataSource, - schemaName: string, -) => { - await workspaceDataSource - .createQueryBuilder() - .insert() - .into(`${schemaName}.${tableName}`, ['id', 'name', 'color', 'position']) - .orIgnore() - .values([ - { - id: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', - name: 'NEW', - color: 'red', - position: 0, - }, - { - id: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', - name: 'SCREENING', - color: 'purple', - position: 1, - }, - { - id: '30b14887-d592-427d-bd97-6e670158db02', - name: 'MEETING', - color: 'sky', - position: 2, - }, - { - id: 'db5a6648-d80d-4020-af64-4817ab4a12e8', - name: 'PROPOSAL', - color: 'turquoise', - position: 3, - }, - { - id: 'bea8bb7b-5467-48a6-9a8a-a8fa500123fe', - name: 'CUSTOMER', - color: 'yellow', - position: 4, - }, - ]) - .execute(); -}; diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts deleted file mode 100644 index f3846bb2d..000000000 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/views.ts +++ /dev/null @@ -1,263 +0,0 @@ -import { DataSource } from 'typeorm'; - -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; - -export const seedViews = async ( - workspaceDataSource: DataSource, - schemaName: string, - objectMetadataMap: Record, -) => { - const createdViews = await workspaceDataSource - .createQueryBuilder() - .insert() - .into(`${schemaName}.view`, [ - 'name', - 'objectMetadataId', - 'type', - 'key', - 'position', - 'icon', - ]) - .values([ - { - name: 'All Companies', - objectMetadataId: objectMetadataMap['company'].id, - type: 'table', - key: 'INDEX', - position: 0, - icon: 'IconBuildingSkyscraper', - }, - { - name: 'All People', - objectMetadataId: objectMetadataMap['person'].id, - type: 'table', - key: 'INDEX', - position: 0, - icon: 'IconUser', - }, - { - name: 'By Stage', - objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', - key: null, - position: 0, - icon: 'IconLayoutKanban', - }, - { - name: 'All Opportunities', - objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'table', - key: 'INDEX', - position: 1, - icon: 'IconTargetArrow', - }, - ]) - .returning('*') - .execute(); - - const viewIdMap = createdViews.raw.reduce((acc, view) => { - acc[`${view.name}`] = view.id; - - return acc; - }, {}); - - await workspaceDataSource - .createQueryBuilder() - .insert() - .into(`${schemaName}.viewField`, [ - 'fieldMetadataId', - 'viewId', - 'position', - 'isVisible', - 'size', - ]) - .values([ - { - fieldMetadataId: objectMetadataMap['company'].fields['name'], - viewId: viewIdMap['All Companies'], - position: 0, - isVisible: true, - size: 180, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['domainName'], - viewId: viewIdMap['All Companies'], - position: 1, - isVisible: true, - size: 100, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['accountOwner'], - viewId: viewIdMap['All Companies'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['createdAt'], - viewId: viewIdMap['All Companies'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['employees'], - viewId: viewIdMap['All Companies'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['linkedinLink'], - viewId: viewIdMap['All Companies'], - position: 5, - isVisible: true, - size: 170, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['address'], - viewId: viewIdMap['All Companies'], - position: 6, - isVisible: true, - size: 170, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['name'], - viewId: viewIdMap['All People'], - position: 0, - isVisible: true, - size: 210, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['email'], - viewId: viewIdMap['All People'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['company'], - viewId: viewIdMap['All People'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['phone'], - viewId: viewIdMap['All People'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['createdAt'], - viewId: viewIdMap['All People'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['city'], - viewId: viewIdMap['All People'], - position: 5, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['jobTitle'], - viewId: viewIdMap['All People'], - position: 6, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['linkedinLink'], - viewId: viewIdMap['All People'], - position: 7, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['xLink'], - viewId: viewIdMap['All People'], - position: 8, - isVisible: true, - size: 150, - }, - - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['All Opportunities'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['All Opportunities'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['All Opportunities'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['All Opportunities'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['All Opportunities'], - position: 4, - isVisible: true, - size: 150, - }, - - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['By Stage'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['By Stage'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['By Stage'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['By Stage'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['By Stage'], - position: 4, - isVisible: true, - size: 150, - }, - ]) - .execute(); -}; diff --git a/packages/twenty-server/src/database/typeorm-seeds/workspace/workspaceMember.ts b/packages/twenty-server/src/database/typeorm-seeds/workspace/workspaceMember.ts index 7d686c130..342bd56d3 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/workspaceMember.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/workspaceMember.ts @@ -1,4 +1,4 @@ -import { DataSource } from 'typeorm'; +import { EntityManager } from 'typeorm'; import { SeedUserIds } from 'src/database/typeorm-seeds/core/users'; import { @@ -26,7 +26,7 @@ type WorkspaceMembers = Pick< }; export const seedWorkspaceMember = async ( - workspaceDataSource: DataSource, + entityManager: EntityManager, schemaName: string, workspaceId: string, ) => { @@ -77,7 +77,7 @@ export const seedWorkspaceMember = async ( }, ]; } - await workspaceDataSource + await entityManager .createQueryBuilder() .insert() .into(`${schemaName}.${tableName}`, [ diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/company.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/company.ts index a7b724f61..f1df5a2dd 100644 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/company.ts +++ b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/company.ts @@ -2,7 +2,7 @@ import { EntityManager } from 'typeorm'; import companiesDemo from './companies-demo.json'; -export const companyPrefillData = async ( +export const companyPrefillDemoData = async ( entityManager: EntityManager, schemaName: string, ) => { diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts index 6ff990071..1b4b4ec8b 100644 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts +++ b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/demo-objects-prefill-data.ts @@ -1,12 +1,11 @@ import { DataSource, EntityManager } from 'typeorm'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { viewPrefillData } from 'src/engine/workspace-manager/demo-objects-prefill-data/view'; -import { companyPrefillData } from 'src/engine/workspace-manager/demo-objects-prefill-data/company'; -import { personPrefillData } from 'src/engine/workspace-manager/demo-objects-prefill-data/person'; -import { pipelineStepPrefillData } from 'src/engine/workspace-manager/demo-objects-prefill-data/pipeline-step'; import { workspaceMemberPrefillData } from 'src/engine/workspace-manager/demo-objects-prefill-data/workspace-member'; -import { seedDemoOpportunity } from 'src/engine/workspace-manager/demo-objects-prefill-data/opportunity'; +import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; +import { companyPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/company'; +import { personPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/person'; +import { opportunityPrefillDemoData } from 'src/engine/workspace-manager/demo-objects-prefill-data/opportunity'; export const demoObjectsPrefillData = async ( workspaceDataSource: DataSource, @@ -14,10 +13,10 @@ export const demoObjectsPrefillData = async ( objectMetadata: ObjectMetadataEntity[], ) => { const objectMetadataMap = objectMetadata.reduce((acc, object) => { - acc[object.nameSingular] = { + acc[object.standardId ?? ''] = { id: object.id, fields: object.fields.reduce((acc, field) => { - acc[field.name] = field.id; + acc[field.standardId ?? ''] = field.id; return acc; }, {}), @@ -26,18 +25,15 @@ export const demoObjectsPrefillData = async ( return acc; }, {}); - // TODO: udnerstand why only with this createQueryRunner transaction below works - const queryRunner = workspaceDataSource.createQueryRunner(); + await workspaceDataSource.transaction( + async (entityManager: EntityManager) => { + await companyPrefillDemoData(entityManager, schemaName); + await personPrefillDemoData(entityManager, schemaName); + await opportunityPrefillDemoData(entityManager, schemaName); - await queryRunner.connect(); + await viewPrefillData(entityManager, schemaName, objectMetadataMap); - workspaceDataSource.transaction(async (entityManager: EntityManager) => { - await companyPrefillData(entityManager, schemaName); - await personPrefillData(entityManager, schemaName); - await viewPrefillData(entityManager, schemaName, objectMetadataMap); - await pipelineStepPrefillData(entityManager, schemaName); - await seedDemoOpportunity(entityManager, schemaName); - - await workspaceMemberPrefillData(entityManager, schemaName); - }); + await workspaceMemberPrefillData(entityManager, schemaName); + }, + ); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/opportunity.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/opportunity.ts index cd5f40e33..e2d53abfb 100644 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/opportunity.ts +++ b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/opportunity.ts @@ -9,9 +9,6 @@ const getRandomProbability = () => { return firstDigit / 10; }; -const getRandomPipelineStepId = (pipelineStepIds: { id: string }[]) => - pipelineStepIds[Math.floor(Math.random() * pipelineStepIds.length)].id; - const getRandomStage = () => { const stages = ['NEW', 'SCREENING', 'MEETING', 'PROPOSAL', 'CUSTOMER']; @@ -24,14 +21,7 @@ const generateRandomAmountMicros = () => { return firstDigit * 10000000000; }; -// Function to generate the array of opportunities -// companiesWithPeople - selecting from the db companies and 1 person related to the company.id to use companyId, pointOfContactId and personId -// pipelineStepIds - selecting from the db pipeline, getting random id from selected to use as pipelineStepId - -const generateOpportunities = ( - companies, - pipelineStepIds: { id: string }[], -) => { +const generateOpportunities = (companies) => { return companies.map((company) => ({ id: v4(), amountAmountMicros: generateRandomAmountMicros(), @@ -39,13 +29,12 @@ const generateOpportunities = ( closeDate: new Date(), stage: getRandomStage(), probability: getRandomProbability(), - pipelineStepId: getRandomPipelineStepId(pipelineStepIds), pointOfContactId: company.personId, companyId: company.id, })); }; -export const seedDemoOpportunity = async ( +export const opportunityPrefillDemoData = async ( entityManager: EntityManager, schemaName: string, ) => { @@ -55,14 +44,8 @@ export const seedDemoOpportunity = async ( LEFT JOIN ${schemaName}.person ON company.id = "person"."companyId" LIMIT 50`, ); - const pipelineStepIds = await entityManager?.query( - `SELECT id FROM ${schemaName}."pipelineStep"`, - ); - const opportunities = generateOpportunities( - companiesWithPeople, - pipelineStepIds, - ); + const opportunities = generateOpportunities(companiesWithPeople); await entityManager .createQueryBuilder() @@ -74,7 +57,6 @@ export const seedDemoOpportunity = async ( 'closeDate', 'stage', 'probability', - 'pipelineStepId', 'pointOfContactId', 'companyId', 'position', diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/person.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/person.ts index 9edd9639d..48df7d4b8 100644 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/person.ts +++ b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/person.ts @@ -2,7 +2,7 @@ import { EntityManager } from 'typeorm'; import peopleDemo from './people-demo.json'; -export const personPrefillData = async ( +export const personPrefillDemoData = async ( entityManager: EntityManager, schemaName: string, ) => { diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/pipeline-step.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/pipeline-step.ts deleted file mode 100644 index bbf86f127..000000000 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/pipeline-step.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { EntityManager } from 'typeorm'; - -export const pipelineStepPrefillData = async ( - entityManager: EntityManager, - schemaName: string, -) => { - await entityManager - .createQueryBuilder() - .insert() - .into(`${schemaName}.pipelineStep`, ['name', 'color', 'position']) - .orIgnore() - .values([ - { - name: 'NEW', - color: 'red', - position: 0, - }, - { - name: 'SCREENING', - color: 'purple', - position: 1, - }, - { - name: 'MEETING', - color: 'sky', - position: 2, - }, - { - name: 'PROPOSAL', - color: 'turquoise', - position: 3, - }, - { - name: 'CUSTOMER', - color: 'yellow', - position: 4, - }, - ]) - .returning('*') - .execute(); -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/view.ts b/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/view.ts deleted file mode 100644 index e51867aa6..000000000 --- a/packages/twenty-server/src/engine/workspace-manager/demo-objects-prefill-data/view.ts +++ /dev/null @@ -1,269 +0,0 @@ -import { EntityManager } from 'typeorm'; - -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; - -export const viewPrefillData = async ( - entityManager: EntityManager, - schemaName: string, - objectMetadataMap: Record, -) => { - // Creating views - const createdViews = await entityManager - .createQueryBuilder() - .insert() - .into(`${schemaName}.view`, [ - 'name', - 'objectMetadataId', - 'type', - 'key', - 'position', - 'icon', - ]) - .orIgnore() - .values([ - { - name: 'All Companies', - objectMetadataId: objectMetadataMap['company'].id, - type: 'table', - key: 'INDEX', - position: 0, - icon: 'IconBuildingSkyscraper', - }, - { - name: 'All People', - objectMetadataId: objectMetadataMap['person'].id, - type: 'table', - key: 'INDEX', - position: 0, - icon: 'IconUser', - }, - { - name: 'By Stage', - objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', - key: null, - position: 0, - icon: 'IconLayoutKanban', - }, - { - name: 'All Opportunities', - objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'table', - key: 'INDEX', - position: 1, - icon: 'IconTargetArrow', - }, - ]) - .returning('*') - .execute(); - - const viewIdMap = createdViews.raw.reduce((acc, view) => { - acc[view.name] = view.id; - - return acc; - }, {}); - - // Creating viewFields - await entityManager - .createQueryBuilder() - .insert() - .into(`${schemaName}.viewField`, [ - 'fieldMetadataId', - 'viewId', - 'position', - 'isVisible', - 'size', - ]) - .orIgnore() - .values([ - // Company - { - fieldMetadataId: objectMetadataMap['company'].fields['name'], - viewId: viewIdMap['All Companies'], - position: 0, - isVisible: true, - size: 180, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['domainName'], - viewId: viewIdMap['All Companies'], - position: 1, - isVisible: true, - size: 100, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['accountOwner'], - viewId: viewIdMap['All Companies'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['createdAt'], - viewId: viewIdMap['All Companies'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['employees'], - viewId: viewIdMap['All Companies'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['linkedinLink'], - viewId: viewIdMap['All Companies'], - position: 5, - isVisible: true, - size: 170, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['address'], - viewId: viewIdMap['All Companies'], - position: 6, - isVisible: true, - size: 170, - }, - // Person - { - fieldMetadataId: objectMetadataMap['person'].fields['name'], - viewId: viewIdMap['All People'], - position: 0, - isVisible: true, - size: 210, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['email'], - viewId: viewIdMap['All People'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['company'], - viewId: viewIdMap['All People'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['phone'], - viewId: viewIdMap['All People'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['createdAt'], - viewId: viewIdMap['All People'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['city'], - viewId: viewIdMap['All People'], - position: 5, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['jobTitle'], - viewId: viewIdMap['All People'], - position: 6, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['linkedinLink'], - viewId: viewIdMap['All People'], - position: 7, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['xLink'], - viewId: viewIdMap['All People'], - position: 8, - isVisible: true, - size: 150, - }, - // Opportunity - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['All Opportunities'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['All Opportunities'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['All Opportunities'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['All Opportunities'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['All Opportunities'], - position: 4, - isVisible: true, - size: 150, - }, - - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['By Stage'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['By Stage'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['By Stage'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['By Stage'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['By Stage'], - position: 4, - isVisible: true, - size: 150, - }, - ]) - .execute(); -}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts index 5b63225ba..4e404878f 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/standard-objects-prefill-data.ts @@ -4,7 +4,6 @@ import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadat import { viewPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/view'; import { companyPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/company'; import { personPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/person'; -import { pipelineStepPrefillData } from 'src/engine/workspace-manager/standard-objects-prefill-data/pipeline-step'; export const standardObjectsPrefillData = async ( workspaceDataSource: DataSource, @@ -12,10 +11,18 @@ export const standardObjectsPrefillData = async ( objectMetadata: ObjectMetadataEntity[], ) => { const objectMetadataMap = objectMetadata.reduce((acc, object) => { - acc[object.nameSingular] = { + if (!object.standardId) { + throw new Error('Standard Id is not set for object: ${object.name}'); + } + + acc[object.standardId] = { id: object.id, fields: object.fields.reduce((acc, field) => { - acc[field.name] = field.id; + if (!field.standardId) { + throw new Error('Standard Id is not set for field: ${field.name}'); + } + + acc[field.standardId] = field.id; return acc; }, {}), @@ -28,6 +35,5 @@ export const standardObjectsPrefillData = async ( await companyPrefillData(entityManager, schemaName); await personPrefillData(entityManager, schemaName); await viewPrefillData(entityManager, schemaName, objectMetadataMap); - await pipelineStepPrefillData(entityManager, schemaName); }); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields.ts new file mode 100644 index 000000000..20f5841ba --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields.ts @@ -0,0 +1,84 @@ +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { + baseObjectStandardFieldIds, + companyStandardFieldIds, +} from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const viewCompanyFields = ( + viewId: string, + objectMetadataMap: Record, +) => { + return [ + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.name + ], + viewId: viewId, + position: 0, + isVisible: true, + size: 180, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.domainName + ], + viewId: viewId, + position: 1, + isVisible: true, + size: 100, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.accountOwner + ], + viewId: viewId, + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + baseObjectStandardFieldIds.createdAt + ], + viewId: viewId, + position: 3, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.employees + ], + viewId: viewId, + position: 4, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.linkedinLink + ], + viewId: viewId, + position: 5, + isVisible: true, + size: 170, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.company].fields[ + companyStandardFieldIds.address + ], + viewId: viewId, + position: 6, + isVisible: true, + size: 170, + }, + ]; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields.ts new file mode 100644 index 000000000..d455e51bd --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields.ts @@ -0,0 +1,61 @@ +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { opportunityStandardFieldIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const viewOpportunityFields = ( + viewId: string, + objectMetadataMap: Record, +) => { + return [ + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.name + ], + viewId: viewId, + position: 0, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.amount + ], + viewId: viewId, + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.closeDate + ], + viewId: viewId, + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.probability + ], + viewId: viewId, + position: 3, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.pointOfContact + ], + viewId: viewId, + position: 4, + isVisible: true, + size: 150, + }, + ]; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields.ts new file mode 100644 index 000000000..19df85dbd --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields.ts @@ -0,0 +1,104 @@ +import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { + baseObjectStandardFieldIds, + personStandardFieldIds, +} from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; +import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; + +export const viewPersonFields = ( + viewId: string, + objectMetadataMap: Record, +) => { + return [ + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.name + ], + viewId: viewId, + position: 0, + isVisible: true, + size: 210, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.email + ], + viewId: viewId, + position: 1, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.company + ], + viewId: viewId, + position: 2, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.phone + ], + viewId: viewId, + position: 3, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + baseObjectStandardFieldIds.createdAt + ], + viewId: viewId, + position: 4, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.city + ], + viewId: viewId, + position: 5, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.jobTitle + ], + viewId: viewId, + position: 6, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.linkedinLink + ], + viewId: viewId, + position: 7, + isVisible: true, + size: 150, + }, + { + fieldMetadataId: + objectMetadataMap[standardObjectIds.person].fields[ + personStandardFieldIds.xLink + ], + viewId: viewId, + position: 8, + isVisible: true, + size: 150, + }, + ]; +}; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts index e51867aa6..12941d1fc 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/view.ts @@ -1,13 +1,17 @@ import { EntityManager } from 'typeorm'; import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; +import { viewCompanyFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-company-fields'; +import { viewPersonFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-person-fields'; +import { viewOpportunityFields } from 'src/engine/workspace-manager/standard-objects-prefill-data/view-opportunity-fields'; +import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; +import { opportunityStandardFieldIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; export const viewPrefillData = async ( entityManager: EntityManager, schemaName: string, objectMetadataMap: Record, ) => { - // Creating views const createdViews = await entityManager .createQueryBuilder() .insert() @@ -18,40 +22,47 @@ export const viewPrefillData = async ( 'key', 'position', 'icon', + 'kanbanFieldMetadataId', ]) - .orIgnore() .values([ { name: 'All Companies', - objectMetadataId: objectMetadataMap['company'].id, + objectMetadataId: objectMetadataMap[standardObjectIds.company].id, type: 'table', key: 'INDEX', position: 0, icon: 'IconBuildingSkyscraper', + kanbanFieldMetadataId: '', }, { name: 'All People', - objectMetadataId: objectMetadataMap['person'].id, + objectMetadataId: objectMetadataMap[standardObjectIds.person].id, type: 'table', key: 'INDEX', position: 0, icon: 'IconUser', - }, - { - name: 'By Stage', - objectMetadataId: objectMetadataMap['opportunity'].id, - type: 'kanban', - key: null, - position: 0, - icon: 'IconLayoutKanban', + kanbanFieldMetadataId: '', }, { name: 'All Opportunities', - objectMetadataId: objectMetadataMap['opportunity'].id, + objectMetadataId: objectMetadataMap[standardObjectIds.opportunity].id, type: 'table', key: 'INDEX', - position: 1, + position: 0, icon: 'IconTargetArrow', + kanbanFieldMetadataId: '', + }, + { + name: 'By Stage', + objectMetadataId: objectMetadataMap[standardObjectIds.opportunity].id, + type: 'kanban', + key: null, + position: 1, + icon: 'IconLayoutKanban', + kanbanFieldMetadataId: + objectMetadataMap[standardObjectIds.opportunity].fields[ + opportunityStandardFieldIds.stage + ], }, ]) .returning('*') @@ -63,7 +74,6 @@ export const viewPrefillData = async ( return acc; }, {}); - // Creating viewFields await entityManager .createQueryBuilder() .insert() @@ -74,196 +84,16 @@ export const viewPrefillData = async ( 'isVisible', 'size', ]) - .orIgnore() .values([ - // Company - { - fieldMetadataId: objectMetadataMap['company'].fields['name'], - viewId: viewIdMap['All Companies'], - position: 0, - isVisible: true, - size: 180, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['domainName'], - viewId: viewIdMap['All Companies'], - position: 1, - isVisible: true, - size: 100, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['accountOwner'], - viewId: viewIdMap['All Companies'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['createdAt'], - viewId: viewIdMap['All Companies'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['employees'], - viewId: viewIdMap['All Companies'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['linkedinLink'], - viewId: viewIdMap['All Companies'], - position: 5, - isVisible: true, - size: 170, - }, - { - fieldMetadataId: objectMetadataMap['company'].fields['address'], - viewId: viewIdMap['All Companies'], - position: 6, - isVisible: true, - size: 170, - }, - // Person - { - fieldMetadataId: objectMetadataMap['person'].fields['name'], - viewId: viewIdMap['All People'], - position: 0, - isVisible: true, - size: 210, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['email'], - viewId: viewIdMap['All People'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['company'], - viewId: viewIdMap['All People'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['phone'], - viewId: viewIdMap['All People'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['createdAt'], - viewId: viewIdMap['All People'], - position: 4, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['city'], - viewId: viewIdMap['All People'], - position: 5, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['jobTitle'], - viewId: viewIdMap['All People'], - position: 6, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['linkedinLink'], - viewId: viewIdMap['All People'], - position: 7, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['person'].fields['xLink'], - viewId: viewIdMap['All People'], - position: 8, - isVisible: true, - size: 150, - }, - // Opportunity - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['All Opportunities'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['All Opportunities'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['All Opportunities'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['All Opportunities'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['All Opportunities'], - position: 4, - isVisible: true, - size: 150, - }, - - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['name'], - viewId: viewIdMap['By Stage'], - position: 0, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['amount'], - viewId: viewIdMap['By Stage'], - position: 1, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['closeDate'], - viewId: viewIdMap['By Stage'], - position: 2, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: objectMetadataMap['opportunity'].fields['probability'], - viewId: viewIdMap['By Stage'], - position: 3, - isVisible: true, - size: 150, - }, - { - fieldMetadataId: - objectMetadataMap['opportunity'].fields['pointOfContact'], - viewId: viewIdMap['By Stage'], - position: 4, - isVisible: true, - size: 150, - }, + ...viewCompanyFields(viewIdMap['Index Companies'], objectMetadataMap), + ...viewPersonFields(viewIdMap['Index People'], objectMetadataMap), + ...viewOpportunityFields( + viewIdMap['Index Opportunities'], + objectMetadataMap, + ), + ...viewCompanyFields(viewIdMap['All Companies'], objectMetadataMap), + ...viewPersonFields(viewIdMap['All People'], objectMetadataMap), + ...viewOpportunityFields(viewIdMap['By Stage'], objectMetadataMap), ]) .execute(); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts index f3cf6d23c..b8a8fbb21 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids.ts @@ -203,7 +203,6 @@ export const opportunityStandardFieldIds = { probability: '20202020-69d4-45f3-9703-690b09fafcf0', stage: '20202020-6f76-477d-8551-28cd65b2b4b9', position: '20202020-806d-493a-bbc6-6313e62958e2', - pipelineStep: '20202020-cc8c-4ae7-8d83-25c3addaec5a', pointOfContact: '20202020-8dfb-42fc-92b6-01afb759ed16', company: '20202020-cbac-457e-b565-adece5fc815f', favorites: '20202020-a1c2-4500-aaae-83ba8a0e827a', @@ -232,13 +231,6 @@ export const personStandardFieldIds = { events: '20202020-a43e-4873-9c23-e522de906ce5', }; -export const pipelineStepStandardFieldIds = { - name: '20202020-e10a-4119-9466-97873e86fa47', - color: '20202020-4a09-4088-90b8-ce1c72730f43', - position: '20202020-44e8-4520-af64-4a3cb37fa0c5', - opportunities: '20202020-0442-482a-867f-6d8fd4145ed1', -}; - export const viewFieldStandardFieldIds = { fieldMetadataId: '20202020-135f-4c5b-b361-15f24870473c', isVisible: '20202020-e966-473c-9c18-f00d3347e0ba', @@ -267,6 +259,7 @@ export const viewStandardFieldIds = { type: '20202020-dd11-4607-9ec7-c57217262a7f', key: '20202020-298e-49fa-9f4a-7b416b110443', icon: '20202020-1f08-4fd9-929b-cbc07f317166', + kanbanFieldMetadataId: '20202020-d09b-4f65-ac42-06a2f20ba0e8', position: '20202020-e9db-4303-b271-e8250c450172', isCompact: '20202020-674e-4314-994d-05754ea7b22b', viewFields: '20202020-542b-4bdc-b177-b63175d48edf', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids.ts index e155df556..4c9ba5844 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids.ts @@ -27,7 +27,6 @@ export const standardObjectIds = { message: '20202020-3f6b-4425-80ab-e468899ab4b2', opportunity: '20202020-9549-49dd-b2b2-883999db8938', person: '20202020-e674-48e5-a542-72570eee7213', - pipelineStep: '20202020-f9a3-45f3-82e2-28952a8b19bf', viewField: '20202020-4d19-4655-95bf-b2a04cf206d4', viewFilter: '20202020-6fb6-4631-aded-b7d67e952ec8', viewSort: '20202020-e46a-47a8-939a-e5d911f83531', diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-objects/index.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-objects/index.ts index dd53ab77b..b9aaec347 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-objects/index.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-sync-metadata/standard-objects/index.ts @@ -17,7 +17,6 @@ import { MessageThreadObjectMetadata } from 'src/modules/messaging/standard-obje import { MessageObjectMetadata } from 'src/modules/messaging/standard-objects/message.object-metadata'; import { OpportunityObjectMetadata } from 'src/modules/opportunity/standard-objects/opportunity.object-metadata'; import { PersonObjectMetadata } from 'src/modules/person/standard-objects/person.object-metadata'; -import { PipelineStepObjectMetadata } from 'src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata'; import { ViewFieldObjectMetadata } from 'src/modules/view/standard-objects/view-field.object-metadata'; import { ViewFilterObjectMetadata } from 'src/modules/view/standard-objects/view-filter.object-metadata'; import { ViewSortObjectMetadata } from 'src/modules/view/standard-objects/view-sort.object-metadata'; @@ -40,7 +39,6 @@ export const standardObjectMetadataDefinitions = [ FavoriteObjectMetadata, OpportunityObjectMetadata, PersonObjectMetadata, - PipelineStepObjectMetadata, ViewFieldObjectMetadata, ViewFilterObjectMetadata, ViewSortObjectMetadata, diff --git a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.object-metadata.ts b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.object-metadata.ts index 63458e224..c10ff0d35 100644 --- a/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.object-metadata.ts +++ b/packages/twenty-server/src/modules/opportunity/standard-objects/opportunity.object-metadata.ts @@ -17,7 +17,6 @@ import { BaseObjectMetadata } from 'src/engine/workspace-manager/workspace-sync- import { CompanyObjectMetadata } from 'src/modules/company/standard-objects/company.object-metadata'; import { FavoriteObjectMetadata } from 'src/modules/favorite/standard-objects/favorite.object-metadata'; import { PersonObjectMetadata } from 'src/modules/person/standard-objects/person.object-metadata'; -import { PipelineStepObjectMetadata } from 'src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata'; import { EventObjectMetadata } from 'src/modules/event/standard-objects/event.object-metadata'; import { Gate } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/gate.decorator'; @@ -102,18 +101,6 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata { @IsNullable() position: number; - // Relations - @FieldMetadata({ - standardId: opportunityStandardFieldIds.pipelineStep, - type: FieldMetadataType.RELATION, - label: 'Pipeline Step', - description: 'Opportunity pipeline step', - icon: 'IconKanban', - joinColumn: 'pipelineStepId', - }) - @IsNullable() - pipelineStep: PipelineStepObjectMetadata; - @FieldMetadata({ standardId: opportunityStandardFieldIds.pointOfContact, type: FieldMetadataType.RELATION, diff --git a/packages/twenty-server/src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata.ts b/packages/twenty-server/src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata.ts deleted file mode 100644 index 2c99585c3..000000000 --- a/packages/twenty-server/src/modules/pipeline-step/standard-objects/pipeline-step.object-metadata.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { RelationMetadataType } from 'src/engine/metadata-modules/relation-metadata/relation-metadata.entity'; -import { pipelineStepStandardFieldIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { standardObjectIds } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-object-ids'; -import { FieldMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/field-metadata.decorator'; -import { IsNullable } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-nullable.decorator'; -import { IsSystem } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/is-system.decorator'; -import { ObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/object-metadata.decorator'; -import { RelationMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/decorators/relation-metadata.decorator'; -import { BaseObjectMetadata } from 'src/engine/workspace-manager/workspace-sync-metadata/standard-objects/base.object-metadata'; -import { OpportunityObjectMetadata } from 'src/modules/opportunity/standard-objects/opportunity.object-metadata'; - -@ObjectMetadata({ - standardId: standardObjectIds.pipelineStep, - namePlural: 'pipelineSteps', - labelSingular: 'Pipeline Step', - labelPlural: 'Pipeline Steps', - description: 'A pipeline step', - icon: 'IconLayoutKanban', -}) -@IsSystem() -export class PipelineStepObjectMetadata extends BaseObjectMetadata { - @FieldMetadata({ - standardId: pipelineStepStandardFieldIds.name, - type: FieldMetadataType.TEXT, - label: 'Name', - description: 'Pipeline Step name', - icon: 'IconCurrencyDollar', - }) - name: string; - - @FieldMetadata({ - standardId: pipelineStepStandardFieldIds.color, - type: FieldMetadataType.TEXT, - label: 'Color', - description: 'Pipeline Step color', - icon: 'IconColorSwatch', - }) - color: string; - - @FieldMetadata({ - standardId: pipelineStepStandardFieldIds.position, - type: FieldMetadataType.NUMBER, - label: 'Position', - description: 'Pipeline Step position', - icon: 'IconHierarchy2', - defaultValue: { value: 0 }, - }) - @IsNullable() - position: number; - - // Relations - @FieldMetadata({ - standardId: pipelineStepStandardFieldIds.opportunities, - type: FieldMetadataType.RELATION, - label: 'Opportunities', - description: 'Opportunities linked to the step.', - icon: 'IconTargetArrow', - }) - @RelationMetadata({ - type: RelationMetadataType.ONE_TO_MANY, - inverseSideTarget: () => OpportunityObjectMetadata, - }) - @IsNullable() - opportunities: OpportunityObjectMetadata[]; -} diff --git a/packages/twenty-server/src/modules/view/standard-objects/view.object-metadata.ts b/packages/twenty-server/src/modules/view/standard-objects/view.object-metadata.ts index 1660025a5..9669fa414 100644 --- a/packages/twenty-server/src/modules/view/standard-objects/view.object-metadata.ts +++ b/packages/twenty-server/src/modules/view/standard-objects/view.object-metadata.ts @@ -66,6 +66,14 @@ export class ViewObjectMetadata extends BaseObjectMetadata { }) icon: string; + @FieldMetadata({ + standardId: viewStandardFieldIds.kanbanFieldMetadataId, + type: FieldMetadataType.TEXT, + label: 'kanbanfieldMetadataId', + description: 'View Kanban column field', + }) + kanbanFieldMetadataId: string; + @FieldMetadata({ standardId: viewStandardFieldIds.position, type: FieldMetadataType.POSITION,