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 ? (