From cbf731dba746ef039434aa71db0849e8c9fb76a5 Mon Sep 17 00:00:00 2001 From: Thomas Trompette Date: Tue, 29 Jul 2025 16:19:22 +0200 Subject: [PATCH] Filter batch fixes (#13486) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - handle multiselect and select Before Capture d’écran 2025-07-29 à 13 47
36 After Capture d’écran 2025-07-29 à 13 44
09 - Fix node display in run Before Capture d’écran 2025-07-29 à 13 47
13 After Capture d’écran 2025-07-29 à 13 44
58 - Remove assert to fix discard draft - handle label for readonly --- .../WorkflowDiagramDefaultEdgeEditable.tsx | 2 -- .../components/WorkflowRunStepNodeDetail.tsx | 11 +++++++++-- .../workflow-steps/hooks/useCreateStep.ts | 8 +++++++- .../WorkflowStepFilterFieldSelect.tsx | 9 ++++++--- .../WorkflowStepFilterValueInput.tsx | 18 ++++++++++++++++++ 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeEditable.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeEditable.tsx index 67af1881897..4d9d8660685 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeEditable.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeEditable.tsx @@ -1,7 +1,6 @@ import { useRecoilComponentValueV2 } from '@/ui/utilities/state/component-state/hooks/useRecoilComponentValueV2'; import { useWorkflowWithCurrentVersion } from '@/workflow/hooks/useWorkflowWithCurrentVersion'; import { workflowVisualizerWorkflowIdComponentState } from '@/workflow/states/workflowVisualizerWorkflowIdComponentState'; -import { assertWorkflowWithCurrentVersionIsDefined } from '@/workflow/utils/assertWorkflowWithCurrentVersionIsDefined'; import { WorkflowDiagramEdgeV2Container } from '@/workflow/workflow-diagram/components/WorkflowDiagramEdgeV2Container'; import { WorkflowDiagramEdgeV2VisibilityContainer } from '@/workflow/workflow-diagram/components/WorkflowDiagramEdgeV2VisibilityContainer'; import { CREATE_STEP_NODE_WIDTH } from '@/workflow/workflow-diagram/constants/CreateStepNodeWidth'; @@ -51,7 +50,6 @@ export const WorkflowDiagramDefaultEdgeEditable = ({ workflowVisualizerWorkflowIdComponentState, ); const workflow = useWorkflowWithCurrentVersion(workflowVisualizerWorkflowId); - assertWorkflowWithCurrentVersionIsDefined(workflow); const { createStep } = useCreateStep({ workflow }); const { startNodeCreation } = useStartNodeCreation(); diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowRunStepNodeDetail.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowRunStepNodeDetail.tsx index 490acdc69f6..afa3a02e9d4 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowRunStepNodeDetail.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/components/WorkflowRunStepNodeDetail.tsx @@ -11,6 +11,7 @@ import { WorkflowEditActionCreateRecord } from '@/workflow/workflow-steps/workfl import { WorkflowEditActionDeleteRecord } from '@/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionDeleteRecord'; import { WorkflowEditActionSendEmail } from '@/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionSendEmail'; import { WorkflowEditActionUpdateRecord } from '@/workflow/workflow-steps/workflow-actions/components/WorkflowEditActionUpdateRecord'; +import { WorkflowEditActionFilter } from '@/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowEditActionFilter'; import { WorkflowEditActionFindRecords } from '@/workflow/workflow-steps/workflow-actions/find-records-action/components/WorkflowEditActionFindRecords'; import { WorkflowEditActionFormFiller } from '@/workflow/workflow-steps/workflow-actions/form-action/components/WorkflowEditActionFormFiller'; import { WorkflowEditActionHttpRequest } from '@/workflow/workflow-steps/workflow-actions/http-request-action/components/WorkflowEditActionHttpRequest'; @@ -204,8 +205,14 @@ export const WorkflowRunStepNodeDetail = ({ ); } case 'FILTER': { - throw new Error( - "The Filter action isn't meant to be displayed as a node.", + return ( + ); } } diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/useCreateStep.ts b/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/useCreateStep.ts index 401598d941f..b0f3a189108 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/useCreateStep.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/hooks/useCreateStep.ts @@ -13,7 +13,7 @@ import { isDefined } from 'twenty-shared/utils'; export const useCreateStep = ({ workflow, }: { - workflow: WorkflowWithCurrentVersion; + workflow: WorkflowWithCurrentVersion | undefined; }) => { const [isLoading, setIsLoading] = useState(false); const { createWorkflowVersionStep } = useCreateWorkflowVersionStep(); @@ -26,6 +26,12 @@ export const useCreateStep = ({ const { getUpdatableWorkflowVersion } = useGetUpdatableWorkflowVersion(); + if (!isDefined(workflow)) { + return { + createStep: async () => undefined, + }; + } + const createStep = async ({ newStepType, parentStepId, diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterFieldSelect.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterFieldSelect.tsx index 04c59f92bb5..064bf22a282 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterFieldSelect.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterFieldSelect.tsx @@ -116,7 +116,9 @@ export const WorkflowStepFilterFieldSelect = ({ : variableLabel; const dropdownId = `step-filter-field-${stepFilter.id}`; - if (noAvailableVariables) { + const isReadonly = readonly ?? false; + + if (isReadonly || noAvailableVariables) { return ( @@ -145,7 +149,6 @@ export const WorkflowStepFilterFieldSelect = ({ value: stepFilter.stepOutputKey, label, }} - isDisabled={readonly} textAccent={isSelectedFieldNotFound ? 'placeholder' : 'default'} /> } diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueInput.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueInput.tsx index a309fde68ff..29ea2c8a9ee 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueInput.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueInput.tsx @@ -1,6 +1,7 @@ import { useGetFieldMetadataItemById } from '@/object-metadata/hooks/useGetFieldMetadataItemById'; import { configurableViewFilterOperands } from '@/object-record/object-filter-dropdown/utils/configurableViewFilterOperands'; import { FormFieldInput } from '@/object-record/record-field/components/FormFieldInput'; +import { FormMultiSelectFieldInput } from '@/object-record/record-field/form-types/components/FormMultiSelectFieldInput'; import { FormTextFieldInput } from '@/object-record/record-field/form-types/components/FormTextFieldInput'; import { FieldMetadata } from '@/object-record/record-field/types/FieldMetadata'; import { WorkflowStepFilterValueCompositeInput } from '@/workflow/workflow-steps/workflow-actions/filter-action/components/WorkflowStepFilterValueCompositeInput'; @@ -90,6 +91,10 @@ export const WorkflowStepFilterValueInput = ({ ? getFieldMetadataItemById(fieldMetadataId) : undefined; + const isFilterableByMultiSelectValue = + variableType === FieldMetadataType.MULTI_SELECT || + variableType === FieldMetadataType.SELECT; + if ( !isDefined(variableType) || !isFilterableFieldMetadataType(variableType) || @@ -118,6 +123,19 @@ export const WorkflowStepFilterValueInput = ({ ); } + if (isFilterableByMultiSelectValue) { + return ( + + ); + } + const field = { type: variableType as FieldMetadataType, label: '',