diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx index 8bf20ab16..9a48c0244 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionCreateRecord.tsx @@ -2,7 +2,9 @@ import { useFilteredObjectMetadataItems } from '@/object-metadata/hooks/useFilte import { useObjectMetadataItems } from '@/object-metadata/hooks/useObjectMetadataItems'; import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/utils/formatFieldMetadataItemAsFieldDefinition'; import { FormFieldInput } from '@/object-record/record-field/components/FormFieldInput'; +import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; import { Select } from '@/ui/input/components/Select'; +import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; import { useViewOrDefaultViewFromPrefetchedViews } from '@/views/hooks/useViewOrDefaultViewFromPrefetchedViews'; import { WorkflowCreateRecordAction } from '@/workflow/types/Workflow'; import { WorkflowStepBody } from '@/workflow/workflow-steps/components/WorkflowStepBody'; @@ -10,14 +12,14 @@ import { WorkflowStepHeader } from '@/workflow/workflow-steps/components/Workflo import { useWorkflowActionHeader } from '@/workflow/workflow-steps/workflow-actions/hooks/useWorkflowActionHeader'; import { shouldDisplayFormField } from '@/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField'; import { WorkflowVariablePicker } from '@/workflow/workflow-variables/components/WorkflowVariablePicker'; +import { useTheme } from '@emotion/react'; import { useEffect, useState } from 'react'; import { isDefined } from 'twenty-shared/utils'; import { HorizontalSeparator, useIcons } from 'twenty-ui/display'; import { SelectOption } from 'twenty-ui/input'; import { JsonValue } from 'type-fest'; import { useDebouncedCallback } from 'use-debounce'; -import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; -import { useTheme } from '@emotion/react'; +import { RelationType } from '~/generated-metadata/graphql'; type WorkflowEditActionCreateRecordProps = { action: WorkflowCreateRecordAction; @@ -31,9 +33,13 @@ type WorkflowEditActionCreateRecordProps = { }; }; +type RelationManyToOneField = { + id: string; +}; + type CreateRecordFormData = { objectName: string; - [field: string]: unknown; + [field: string]: RelationManyToOneField | JsonValue; }; const sortByViewFieldPosition = ( @@ -77,6 +83,7 @@ export const WorkflowEditActionCreateRecord = ({ objectName: action.settings.input.objectName, ...action.settings.input.objectRecord, }); + const isFormDisabled = actionOptions.readonly; const objectNameSingular = formData.objectName; @@ -123,9 +130,27 @@ export const WorkflowEditActionCreateRecord = ({ fieldName: keyof CreateRecordFormData, updatedValue: JsonValue, ) => { + const fieldDefinition = inlineFieldDefinitions?.find( + (definition) => definition.metadata.fieldName === fieldName, + ); + + if (!isDefined(fieldDefinition)) { + return; + } + + const isFieldRelationManyToOne = + isFieldRelation(fieldDefinition) && + fieldDefinition.metadata.relationType === RelationType.MANY_TO_ONE; + + const fieldValue = isFieldRelationManyToOne + ? { + id: updatedValue, + } + : updatedValue; + const newFormData: CreateRecordFormData = { ...formData, - [fieldName]: updatedValue, + [fieldName]: fieldValue, }; setFormData(newFormData); @@ -211,16 +236,26 @@ export const WorkflowEditActionCreateRecord = ({ - {inlineFieldDefinitions?.map((field) => { - const currentValue = formData[field.metadata.fieldName] as JsonValue; + {inlineFieldDefinitions?.map((fieldDefinition) => { + const isFieldRelationManyToOne = + isFieldRelation(fieldDefinition) && + fieldDefinition.metadata.relationType === RelationType.MANY_TO_ONE; + + const currentValue = isFieldRelationManyToOne + ? ( + formData[ + fieldDefinition.metadata.fieldName + ] as RelationManyToOneField + )?.id + : (formData[fieldDefinition.metadata.fieldName] as JsonValue); return ( { - handleFieldChange(field.metadata.fieldName, value); + handleFieldChange(fieldDefinition.metadata.fieldName, value); }} VariablePicker={WorkflowVariablePicker} readonly={isFormDisabled} diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionUpdateRecord.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionUpdateRecord.tsx index 6af70f234..f40638a00 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionUpdateRecord.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionUpdateRecord.tsx @@ -7,20 +7,20 @@ import { formatFieldMetadataItemAsFieldDefinition } from '@/object-metadata/util import { FormFieldInput } from '@/object-record/record-field/components/FormFieldInput'; import { FormSingleRecordPicker } from '@/object-record/record-field/form-types/components/FormSingleRecordPicker'; import { isFieldRelation } from '@/object-record/record-field/types/guards/isFieldRelation'; +import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; import { WorkflowFieldsMultiSelect } from '@/workflow/components/WorkflowEditUpdateEventFieldsMultiSelect'; import { WorkflowStepBody } from '@/workflow/workflow-steps/components/WorkflowStepBody'; import { WorkflowStepHeader } from '@/workflow/workflow-steps/components/WorkflowStepHeader'; import { useWorkflowActionHeader } from '@/workflow/workflow-steps/workflow-actions/hooks/useWorkflowActionHeader'; import { shouldDisplayFormField } from '@/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField'; import { WorkflowVariablePicker } from '@/workflow/workflow-variables/components/WorkflowVariablePicker'; +import { useTheme } from '@emotion/react'; import { isDefined } from 'twenty-shared/utils'; import { HorizontalSeparator, useIcons } from 'twenty-ui/display'; import { SelectOption } from 'twenty-ui/input'; import { JsonValue } from 'type-fest'; import { useDebouncedCallback } from 'use-debounce'; import { RelationType } from '~/generated-metadata/graphql'; -import { useTheme } from '@emotion/react'; -import { GenericDropdownContentWidth } from '@/ui/layout/dropdown/constants/GenericDropdownContentWidth'; type WorkflowEditActionUpdateRecordProps = { action: WorkflowUpdateRecordAction; @@ -65,6 +65,7 @@ export const WorkflowEditActionUpdateRecord = ({ fieldsToUpdate: action.settings.input.fieldsToUpdate ?? [], ...action.settings.input.objectRecord, }); + const isFormDisabled = actionOptions.readonly; const handleFieldChange = ( diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts index d05d2c0f0..1ef227b36 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/utils/shouldDisplayFormField.ts @@ -41,24 +41,30 @@ export const shouldDisplayFormField = ({ isTypeAllowedForAction = fieldMetadataItem.type !== FieldMetadataType.RELATION || fieldMetadataItem.settings?.['relationType'] === 'MANY_TO_ONE'; - break; + return ( + isTypeAllowedForAction && + !fieldMetadataItem.isSystem && + fieldMetadataItem.isActive + ); case 'UPDATE_RECORD': isTypeAllowedForAction = COMMON_DISPLAYABLE_FIELD_TYPES.includes(fieldMetadataItem.type) || fieldMetadataItem.settings?.['relationType'] === 'MANY_TO_ONE'; - break; + return ( + isTypeAllowedForAction && + !fieldMetadataItem.isSystem && + fieldMetadataItem.isActive + ); case 'FIND_RECORDS': isTypeAllowedForAction = FIND_RECORDS_DISPLAYABLE_FIELD_TYPES.includes( fieldMetadataItem.type, ); - break; + return ( + isTypeAllowedForAction && + (!fieldMetadataItem.isSystem || isIdField) && + fieldMetadataItem.isActive + ); default: throw new Error(`Action "${actionType}" is not supported`); } - - return ( - isTypeAllowedForAction && - (!fieldMetadataItem.isSystem || isIdField) && - fieldMetadataItem.isActive - ); }; diff --git a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts index 581d1b011..92ad8d4e3 100644 --- a/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts +++ b/packages/twenty-server/src/engine/workspace-manager/standard-objects-prefill-data/views/workflow-versions-all.view.ts @@ -75,7 +75,7 @@ export const workflowVersionsAllView = ( field.standardId === WORKFLOW_VERSION_STANDARD_FIELD_IDS.runs, )?.id ?? '', position: 4, - isVisible: true, + isVisible: false, size: 150, }, ],