From 9ceff84bbff6f07642504877f7014e7c55abef3b Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Fri, 9 Feb 2024 14:44:11 +0100 Subject: [PATCH] Set opportunity stage as editable (#3838) * Set opportunity stage as editable * Fix comments * Add command for migration * Fixes --------- Co-authored-by: Thomas Trompette Co-authored-by: Charles Bochet --- ...SettingsObjectFieldSelectFormOptionRow.tsx | 2 +- .../data-model/SettingsObjectFieldEdit.tsx | 15 ++++++- .../typeorm-seeds/workspace/opportunity.ts | 8 ++-- .../typeorm-seeds/workspace/pipeline-step.ts | 10 ++--- .../field-metadata/field-metadata.service.ts | 45 ++++++++++++++----- .../demo-objects-prefill-data/opportunity.ts | 2 +- .../pipeline-step.ts | 10 ++--- .../pipeline-step.ts | 10 ++--- .../workspace-migration-enum.service.ts | 10 +++-- .../workspace-migration-runner.service.ts | 2 + .../opportunity.object-metadata.ts | 12 ++--- 11 files changed, 83 insertions(+), 43 deletions(-) diff --git a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectFormOptionRow.tsx b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectFormOptionRow.tsx index ef71223fa..5c74bc686 100644 --- a/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectFormOptionRow.tsx +++ b/packages/twenty-front/src/modules/settings/data-model/components/SettingsObjectFieldSelectFormOptionRow.tsx @@ -138,7 +138,7 @@ export const SettingsObjectFieldSelectFormOptionRow = ({ }} /> )} - {!!onRemove && ( + {!!onRemove && !isDefault && ( { + return ( + fieldMetadataItem.isCustom || + fieldMetadataItem.type === FieldMetadataType.Select + ); +}; + export const SettingsObjectFieldEdit = () => { const navigate = useNavigate(); const { enqueueSnackBar } = useSnackBar(); @@ -172,6 +182,9 @@ export const SettingsObjectFieldEdit = () => { navigate(`/settings/objects/${objectSlug}`); }; + const shouldDisplaySaveAndCancel = + canPersistFieldMetadataItemUpdate(activeMetadataField); + return ( @@ -186,7 +199,7 @@ export const SettingsObjectFieldEdit = () => { { children: activeMetadataField.label }, ]} /> - {activeMetadataField.isCustom && ( + {shouldDisplaySaveAndCancel && ( navigate(`/settings/objects/${objectSlug}`)} 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 af4f0525a..e2a201865 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/opportunity.ts @@ -31,7 +31,7 @@ export const seedOpportunity = async ( amountCurrencyCode: 'USD', closeDate: new Date(), probability: 0.5, - stage: 'new', + stage: 'NEW', position: 0, pipelineStepId: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', pointOfContactId: '86083141-1c0e-494c-a1b6-85b1c6fefaa5', @@ -44,7 +44,7 @@ export const seedOpportunity = async ( amountCurrencyCode: 'USD', closeDate: new Date(), probability: 0.5, - stage: 'meeting', + stage: 'MEETING', position: 1, pipelineStepId: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', pointOfContactId: '93c72d2e-f517-42fd-80ae-14173b3b70ae', @@ -57,7 +57,7 @@ export const seedOpportunity = async ( amountCurrencyCode: 'USD', closeDate: new Date(), probability: 0.5, - stage: 'proposal', + stage: 'PROPOSAL', position: 2, pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', pointOfContactId: '9b324a88-6784-4449-afdf-dc62cb8702f2', @@ -70,7 +70,7 @@ export const seedOpportunity = async ( amountCurrencyCode: 'USD', closeDate: new Date(), probability: 0.5, - stage: 'proposal', + stage: 'PROPOSAL', position: 3, pipelineStepId: '30b14887-d592-427d-bd97-6e670158db02', pointOfContactId: '98406e26-80f1-4dff-b570-a74942528de3', 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 index c99821440..4a9b25e48 100644 --- a/packages/twenty-server/src/database/typeorm-seeds/workspace/pipeline-step.ts +++ b/packages/twenty-server/src/database/typeorm-seeds/workspace/pipeline-step.ts @@ -14,31 +14,31 @@ export const seedPipelineStep = async ( .values([ { id: '6edf4ead-006a-46e1-9c6d-228f1d0143c9', - name: 'New', + name: 'NEW', color: 'red', position: 0, }, { id: 'd8361722-03fb-4e65-bd4f-ec9e52e5ec0a', - name: 'Screening', + name: 'SCREENING', color: 'purple', position: 1, }, { id: '30b14887-d592-427d-bd97-6e670158db02', - name: 'Meeting', + name: 'MEETING', color: 'sky', position: 2, }, { id: 'db5a6648-d80d-4020-af64-4817ab4a12e8', - name: 'Proposal', + name: 'PROPOSAL', color: 'turquoise', position: 3, }, { id: 'bea8bb7b-5467-48a6-9a8a-a8fa500123fe', - name: 'Customer', + name: 'CUSTOMER', color: 'yellow', position: 4, }, diff --git a/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts b/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts index 723a8f998..57a26db08 100644 --- a/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts +++ b/packages/twenty-server/src/metadata/field-metadata/field-metadata.service.ts @@ -186,15 +186,6 @@ export class FieldMetadataService extends TypeOrmQueryService pipelineStepIds[Math.floor(Math.random() * pipelineStepIds.length)].id; const getRandomStage = () => { - const stages = ['new', 'screening', 'meeting', 'proposal', 'customer']; + const stages = ['NEW', 'SCREENING', 'MEETING', 'PROPOSAL', 'CUSTOMER']; return stages[Math.floor(Math.random() * stages.length)]; }; diff --git a/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/pipeline-step.ts b/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/pipeline-step.ts index 707676105..bbf86f127 100644 --- a/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/pipeline-step.ts +++ b/packages/twenty-server/src/workspace/workspace-manager/demo-objects-prefill-data/pipeline-step.ts @@ -11,27 +11,27 @@ export const pipelineStepPrefillData = async ( .orIgnore() .values([ { - name: 'New', + name: 'NEW', color: 'red', position: 0, }, { - name: 'Screening', + name: 'SCREENING', color: 'purple', position: 1, }, { - name: 'Meeting', + name: 'MEETING', color: 'sky', position: 2, }, { - name: 'Proposal', + name: 'PROPOSAL', color: 'turquoise', position: 3, }, { - name: 'Customer', + name: 'CUSTOMER', color: 'yellow', position: 4, }, diff --git a/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts b/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts index 707676105..bbf86f127 100644 --- a/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts +++ b/packages/twenty-server/src/workspace/workspace-manager/standard-objects-prefill-data/pipeline-step.ts @@ -11,27 +11,27 @@ export const pipelineStepPrefillData = async ( .orIgnore() .values([ { - name: 'New', + name: 'NEW', color: 'red', position: 0, }, { - name: 'Screening', + name: 'SCREENING', color: 'purple', position: 1, }, { - name: 'Meeting', + name: 'MEETING', color: 'sky', position: 2, }, { - name: 'Proposal', + name: 'PROPOSAL', color: 'turquoise', position: 3, }, { - name: 'Customer', + name: 'CUSTOMER', color: 'yellow', position: 4, }, diff --git a/packages/twenty-server/src/workspace/workspace-migration-runner/services/workspace-migration-enum.service.ts b/packages/twenty-server/src/workspace/workspace-migration-runner/services/workspace-migration-enum.service.ts index 874b67861..b1df7d860 100644 --- a/packages/twenty-server/src/workspace/workspace-migration-runner/services/workspace-migration-enum.service.ts +++ b/packages/twenty-server/src/workspace/workspace-migration-runner/services/workspace-migration-enum.service.ts @@ -138,13 +138,13 @@ export class WorkspaceMigrationEnumService { .map((e) => `'${e}'`) .join(', ')}]`; } else { - defaultValue = `'${columnDefinition.defaultValue}'`; + defaultValue = this.getStringifyValue(columnDefinition.defaultValue); } } await queryRunner.query(` UPDATE "${schemaName}"."${tableName}" - SET "${columnDefinition.columnName}" = ${defaultValue} + SET "${columnDefinition.columnName}" = '${defaultValue}' WHERE "${columnDefinition.columnName}" NOT IN (${enumValues .map((e) => `'${e}'`) .join(', ')}) @@ -159,7 +159,7 @@ export class WorkspaceMigrationEnumService { newEnumTypeName: string, ) { await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" TYPE "${schemaName}"."${newEnumTypeName}" USING ("${columnName}"::text::"${schemaName}"."${newEnumTypeName}")`, + `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" DROP DEFAULT, ALTER COLUMN "${columnName}" TYPE "${schemaName}"."${newEnumTypeName}" USING ("${columnName}"::text::"${schemaName}"."${newEnumTypeName}")`, ); } @@ -184,4 +184,8 @@ export class WorkspaceMigrationEnumService { RENAME TO "${oldEnumTypeName}" `); } + + private getStringifyValue(value: any) { + return typeof value === 'string' ? value : `'${value}'`; + } } diff --git a/packages/twenty-server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts b/packages/twenty-server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts index ec63b1b66..3b976978d 100644 --- a/packages/twenty-server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts +++ b/packages/twenty-server/src/workspace/workspace-migration-runner/workspace-migration-runner.service.ts @@ -275,6 +275,8 @@ export class WorkspaceMigrationRunnerService { tableName, migrationColumn, ); + + return; } if ( diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts index 8c0888f9c..bf0112ac8 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/standard-objects/opportunity.object-metadata.ts @@ -63,18 +63,18 @@ export class OpportunityObjectMetadata extends BaseObjectMetadata { description: 'Opportunity stage', icon: 'IconProgressCheck', options: [ - { value: 'new', label: 'New', position: 0, color: 'red' }, - { value: 'screening', label: 'Screening', position: 1, color: 'purple' }, - { value: 'meeting', label: 'Meeting', position: 2, color: 'sky' }, + { value: 'NEW', label: 'New', position: 0, color: 'red' }, + { value: 'SCREENING', label: 'Screening', position: 1, color: 'purple' }, + { value: 'MEETING', label: 'Meeting', position: 2, color: 'sky' }, { - value: 'proposal', + value: 'PROPOSAL', label: 'Proposal', position: 3, color: 'turquoise', }, - { value: 'customer', label: 'Customer', position: 4, color: 'yellow' }, + { value: 'CUSTOMER', label: 'Customer', position: 4, color: 'yellow' }, ], - defaultValue: { value: 'new' }, + defaultValue: { value: 'NEW' }, }) stage: string;