From 4ccdbf11507392498060595a66a834d7ddd9e01a Mon Sep 17 00:00:00 2001 From: Abdul Rahman <81605929+abdulrahmancodes@users.noreply.github.com> Date: Thu, 22 Jan 2026 20:00:11 +0530 Subject: [PATCH] fix: remove empty else-if branches and add numbering (#17315) --- .../workflow-diagram/types/WorkflowDiagram.ts | 1 + .../generateNodesAndEdgesForIfElseNode.ts | 8 +++++ .../WorkflowDiagramDefaultEdgeEditable.tsx | 5 ++- .../WorkflowDiagramDefaultEdgeReadonly.tsx | 5 ++- .../components/WorkflowDiagramEdgeLabel.tsx | 17 +++++++++- .../components/WorkflowStepFilterColumn.tsx | 3 ++ .../WorkflowStepFilterLogicalOperatorCell.tsx | 14 ++++++-- .../WorkflowEditActionIfElseBody.tsx | 7 ++++ .../components/WorkflowIfElseBranchEditor.tsx | 3 ++ .../utils/remove-step.ts | 33 ++++++++++++++++--- 10 files changed, 87 insertions(+), 9 deletions(-) diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts index ac336d3ab3..6b71cd1935 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/types/WorkflowDiagram.ts @@ -103,6 +103,7 @@ export type WorkflowRunDiagramNodeData = Exclude< export type WorkflowDiagramEdgeLabelOptions = { position: Position; label: MessageDescriptor; + elseIfIndex?: number; }; export type WorkflowDiagramEdgePathStrategy = diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForIfElseNode.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForIfElseNode.ts index 153d4c9f0f..4af46bee8b 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForIfElseNode.ts +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/utils/generateNodesAndEdgesForIfElseNode.ts @@ -76,6 +76,13 @@ export const generateNodesAndEdgesForIfElseNode = ({ branch, }); + const elseIfIndex = + branchIndex > 0 && + branchIndex < totalBranches - 1 && + isDefined(branch.filterGroupId) + ? branchIndex + : undefined; + const nextStepIds = branch.nextStepIds; for (const nextStepId of nextStepIds) { const nextStep = steps.find((s) => s.id === nextStepId); @@ -99,6 +106,7 @@ export const generateNodesAndEdgesForIfElseNode = ({ labelOptions: { position: Position.Bottom, label, + elseIfIndex, }, edgePathStrategy: getEdgePathStrategy({ step, diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeEditable.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeEditable.tsx index 18ce5172d2..58990a5952 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeEditable.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeEditable.tsx @@ -113,7 +113,10 @@ export const WorkflowDiagramDefaultEdgeEditable = ({ centerX={labelX} centerY={labelY} > - + )} diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeReadonly.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeReadonly.tsx index 5388e9848b..10bf046e9f 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeReadonly.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramDefaultEdgeReadonly.tsx @@ -59,7 +59,10 @@ export const WorkflowDiagramDefaultEdgeReadonly = ({ centerX={labelX} centerY={labelY} > - + )} diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramEdgeLabel.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramEdgeLabel.tsx index 5e91ca2e35..323373e095 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramEdgeLabel.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/workflow-edges/components/WorkflowDiagramEdgeLabel.tsx @@ -1,4 +1,5 @@ import styled from '@emotion/styled'; +import { isDefined } from 'twenty-shared/utils'; import { Label } from 'twenty-ui/display'; const StyledContainer = styled.div` @@ -14,9 +15,23 @@ const StyledContainer = styled.div` padding-inline: ${({ theme }) => theme.spacing(1)}; `; -export const WorkflowDiagramEdgeLabel = ({ label }: { label: string }) => { +const StyledNumber = styled.span` + color: ${({ theme }) => theme.font.color.tertiary}; + font-size: ${({ theme }) => theme.font.size.sm}; +`; + +type WorkflowDiagramEdgeLabelProps = { + label: string; + elseIfIndex?: number; +}; + +export const WorkflowDiagramEdgeLabel = ({ + label, + elseIfIndex, +}: WorkflowDiagramEdgeLabelProps) => { return ( + {isDefined(elseIfIndex) && {elseIfIndex}} ); diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterColumn.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterColumn.tsx index f25fe8612c..431ada294e 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterColumn.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterColumn.tsx @@ -14,6 +14,7 @@ type WorkflowStepFilterColumnProps = { stepFilter: StepFilter; stepFilterIndex: number; firstFilterLabel?: string; + elseIfIndex?: number; preventDeletion?: boolean; }; @@ -29,6 +30,7 @@ export const WorkflowStepFilterColumn = ({ stepFilter, stepFilterIndex, firstFilterLabel, + elseIfIndex, preventDeletion = false, }: WorkflowStepFilterColumnProps) => { const { readonly } = useContext(WorkflowStepFilterContext); @@ -42,6 +44,7 @@ export const WorkflowStepFilterColumn = ({ index={stepFilterIndex} stepFilterGroup={stepFilterGroup} firstFilterLabel={firstFilterLabel} + elseIfIndex={elseIfIndex} /> {shouldShowDropdown && ( diff --git a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterLogicalOperatorCell.tsx b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterLogicalOperatorCell.tsx index 763c67bc30..4c836220d4 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterLogicalOperatorCell.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-steps/filters/components/WorkflowStepFilterLogicalOperatorCell.tsx @@ -8,7 +8,7 @@ import styled from '@emotion/styled'; import { useLingui } from '@lingui/react/macro'; import { useContext, useMemo } from 'react'; import { StepLogicalOperator, type StepFilterGroup } from 'twenty-shared/types'; -import { capitalize } from 'twenty-shared/utils'; +import { capitalize, isDefined } from 'twenty-shared/utils'; const StyledText = styled.div` align-items: center; @@ -17,6 +17,11 @@ const StyledText = styled.div` height: ${({ theme }) => theme.spacing(8)}; `; +const StyledNumber = styled.span` + color: ${({ theme }) => theme.font.color.tertiary}; + margin-right: ${({ theme }) => theme.spacing(1)}; +`; + const StyledContainer = styled.div` align-items: start; display: flex; @@ -28,12 +33,14 @@ type WorkflowStepFilterLogicalOperatorCellProps = { index: number; stepFilterGroup: StepFilterGroup; firstFilterLabel?: string; + elseIfIndex?: number; }; export const WorkflowStepFilterLogicalOperatorCell = ({ index, stepFilterGroup, firstFilterLabel, + elseIfIndex, }: WorkflowStepFilterLogicalOperatorCellProps) => { const { readonly } = useContext(WorkflowStepFilterContext); const { t } = useLingui(); @@ -69,7 +76,10 @@ export const WorkflowStepFilterLogicalOperatorCell = ({ return ( {index === 0 ? ( - {firstFilterLabel ?? defaultFirstFilterLabel} + + {isDefined(elseIfIndex) && {elseIfIndex}} + {firstFilterLabel ?? defaultFirstFilterLabel} + ) : index === 1 ? ( readonly ? (