Remove workflow filters from lab (#14017)

As title
This commit is contained in:
Thomas Trompette
2025-08-21 14:30:36 +02:00
committed by GitHub
parent f7709955f6
commit b9b5f9a347
23 changed files with 15 additions and 255 deletions
@@ -965,7 +965,6 @@ export enum FeatureFlagKey {
IS_TWO_FACTOR_AUTHENTICATION_ENABLED = 'IS_TWO_FACTOR_AUTHENTICATION_ENABLED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED',
IS_WORKFLOW_BRANCH_ENABLED = 'IS_WORKFLOW_BRANCH_ENABLED',
IS_WORKFLOW_FILTERING_ENABLED = 'IS_WORKFLOW_FILTERING_ENABLED',
IS_WORKSPACE_MIGRATION_V2_ENABLED = 'IS_WORKSPACE_MIGRATION_V2_ENABLED'
}
@@ -929,7 +929,6 @@ export enum FeatureFlagKey {
IS_TWO_FACTOR_AUTHENTICATION_ENABLED = 'IS_TWO_FACTOR_AUTHENTICATION_ENABLED',
IS_UNIQUE_INDEXES_ENABLED = 'IS_UNIQUE_INDEXES_ENABLED',
IS_WORKFLOW_BRANCH_ENABLED = 'IS_WORKFLOW_BRANCH_ENABLED',
IS_WORKFLOW_FILTERING_ENABLED = 'IS_WORKFLOW_FILTERING_ENABLED',
IS_WORKSPACE_MIGRATION_V2_ENABLED = 'IS_WORKSPACE_MIGRATION_V2_ENABLED'
}
@@ -27,9 +27,6 @@ export const useRunWorkflowRunOpeningInCommandMenuSideEffects = () => {
const { objectPermissionsByObjectMetadataId } = useObjectPermissions();
const isWorkflowFilteringEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
);
const isWorkflowBranchEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
);
@@ -65,7 +62,6 @@ export const useRunWorkflowRunOpeningInCommandMenuSideEffects = () => {
steps: workflowRunRecord.state.flow.steps,
stepInfos: workflowRunRecord.state.stepInfos,
trigger: workflowRunRecord.state.flow.trigger,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
});
@@ -136,7 +132,6 @@ export const useRunWorkflowRunOpeningInCommandMenuSideEffects = () => {
[
apolloCoreClient.cache,
objectPermissionsByObjectMetadataId,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
openWorkflowRunViewStepInCommandMenu,
getIcon,
@@ -6,7 +6,7 @@ import { WorkflowDiagramBlankEdge } from '@/workflow/workflow-diagram/components
import { WorkflowDiagramCanvasBase } from '@/workflow/workflow-diagram/components/WorkflowDiagramCanvasBase';
import { WorkflowDiagramCanvasEditableEffect } from '@/workflow/workflow-diagram/components/WorkflowDiagramCanvasEditableEffect';
import { WorkflowDiagramDefaultEdgeEditable } from '@/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeEditable';
import { WorkflowDiagramFilteringDisabledEdgeEditable } from '@/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeEditable';
import { workflowDiagramComponentState } from '@/workflow/workflow-diagram/states/workflowDiagramComponentState';
import { workflowDiagramRightClickMenuPositionState } from '@/workflow/workflow-diagram/states/workflowDiagramRightClickMenuPositionState';
import {
@@ -125,8 +125,6 @@ export const WorkflowDiagramCanvasEditable = () => {
}}
edgeTypes={{
blank: WorkflowDiagramBlankEdge,
'filtering-disabled--editable':
WorkflowDiagramFilteringDisabledEdgeEditable,
'empty-filter--editable': WorkflowDiagramDefaultEdgeEditable,
'filter--editable': WorkflowDiagramFilterEdgeEditable,
}}
@@ -1,7 +1,7 @@
import { type WorkflowVersionStatus } from '@/workflow/types/Workflow';
import { WorkflowDiagramCanvasBase } from '@/workflow/workflow-diagram/components/WorkflowDiagramCanvasBase';
import { WorkflowDiagramDefaultEdgeReadonly } from '@/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeReadonly';
import { WorkflowDiagramFilteringDisabledEdgeReadonly } from '@/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeReadonly';
import { getWorkflowVersionStatusTagProps } from '@/workflow/workflow-diagram/utils/getWorkflowVersionStatusTagProps';
import { WorkflowDiagramEmptyTriggerReadonly } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramEmptyTriggerReadonly';
import { WorkflowDiagramFilterEdgeReadonly } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowDiagramFilterEdgeReadonly';
@@ -25,8 +25,6 @@ export const WorkflowDiagramCanvasReadonly = ({
'empty-trigger': WorkflowDiagramEmptyTriggerReadonly,
}}
edgeTypes={{
'filtering-disabled--readonly':
WorkflowDiagramFilteringDisabledEdgeReadonly,
'empty-filter--readonly': WorkflowDiagramDefaultEdgeReadonly,
'filter--readonly': WorkflowDiagramFilterEdgeReadonly,
}}
@@ -40,10 +40,6 @@ export const WorkflowDiagramEffect = () => {
workflowLastCreatedStepIdComponentState,
);
const isWorkflowFilteringEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
);
const isWorkflowBranchEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
);
@@ -58,7 +54,6 @@ export const WorkflowDiagramEffect = () => {
const nextWorkflowDiagram = getWorkflowVersionDiagram({
workflowVersion: currentVersion,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
isEditable: true,
});
@@ -95,7 +90,6 @@ export const WorkflowDiagramEffect = () => {
},
[
workflowDiagramState,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
workflowLastCreatedStepIdState,
],
@@ -1,87 +0,0 @@
import { WORKFLOW_DIAGRAM_EDGE_OPTIONS_CLICK_OUTSIDE_ID } from '@/workflow/workflow-diagram/constants/WorkflowDiagramEdgeOptionsClickOutsideId';
import { useStartNodeCreation } from '@/workflow/workflow-diagram/hooks/useStartNodeCreation';
import { type WorkflowDiagramEdge } from '@/workflow/workflow-diagram/types/WorkflowDiagram';
import {
EdgeLabelRenderer,
type EdgeProps,
getBezierPath,
} from '@xyflow/react';
import { IconPlus } from 'twenty-ui/display';
import { WorkflowDiagramEdgeV2Container } from '@/workflow/workflow-diagram/components/WorkflowDiagramEdgeV2Container';
import { WorkflowDiagramEdgeV2VisibilityContainer } from '@/workflow/workflow-diagram/components/WorkflowDiagramEdgeV2VisibilityContainer';
import { useEdgeHovered } from '@/workflow/workflow-diagram/hooks/useEdgeHovered';
import { WorkflowDiagramBaseEdge } from '@/workflow/workflow-diagram/components/WorkflowDiagramBaseEdge';
import { WorkflowDiagramEdgeButtonGroup } from '@/workflow/workflow-diagram/components/WorkflowDiagramEdgeButtonGroup';
type WorkflowDiagramFilteringDisabledEdgeEditableProps =
EdgeProps<WorkflowDiagramEdge>;
export const WorkflowDiagramFilteringDisabledEdgeEditable = ({
id,
markerStart,
markerEnd,
source,
sourceY,
sourceX,
target,
targetX,
targetY,
}: WorkflowDiagramFilteringDisabledEdgeEditableProps) => {
const { isEdgeHovered } = useEdgeHovered();
const [edgePath, labelX, labelY] = getBezierPath({
sourceX,
sourceY,
targetX,
targetY,
});
const { startNodeCreation, isNodeCreationStarted } = useStartNodeCreation();
const nodeCreationStarted = isNodeCreationStarted({
parentStepId: source,
nextStepId: target,
});
const handleAddNodeButtonClick = () => {
startNodeCreation({
parentStepId: source,
nextStepId: target,
position: { x: labelX, y: labelY },
});
};
return (
<>
<WorkflowDiagramBaseEdge
source={source}
target={target}
path={edgePath}
markerStart={markerStart}
markerEnd={markerEnd}
/>
<EdgeLabelRenderer>
<WorkflowDiagramEdgeV2Container
data-click-outside-id={WORKFLOW_DIAGRAM_EDGE_OPTIONS_CLICK_OUTSIDE_ID}
labelX={labelX}
labelY={labelY}
>
<WorkflowDiagramEdgeV2VisibilityContainer
shouldDisplay={isEdgeHovered(id) || nodeCreationStarted}
>
<WorkflowDiagramEdgeButtonGroup
iconButtons={[
{
Icon: IconPlus,
onClick: handleAddNodeButtonClick,
},
]}
selected={nodeCreationStarted}
/>
</WorkflowDiagramEdgeV2VisibilityContainer>
</WorkflowDiagramEdgeV2Container>
</EdgeLabelRenderer>
</>
);
};
@@ -1,33 +0,0 @@
import { type WorkflowDiagramEdge } from '@/workflow/workflow-diagram/types/WorkflowDiagram';
import { useTheme } from '@emotion/react';
import { BaseEdge, type EdgeProps, getBezierPath } from '@xyflow/react';
type WorkflowDiagramFilteringDisabledEdgeReadonlyProps =
EdgeProps<WorkflowDiagramEdge>;
export const WorkflowDiagramFilteringDisabledEdgeReadonly = ({
markerStart,
markerEnd,
sourceX,
sourceY,
targetX,
targetY,
}: WorkflowDiagramFilteringDisabledEdgeReadonlyProps) => {
const theme = useTheme();
const [edgePath] = getBezierPath({
sourceX,
sourceY,
targetX,
targetY,
});
return (
<BaseEdge
markerStart={markerStart}
markerEnd={markerEnd}
path={edgePath}
style={{ stroke: theme.border.color.strong }}
/>
);
};
@@ -1,30 +0,0 @@
import { WorkflowRunDiagramBaseEdge } from '@/workflow/workflow-diagram/components/WorkflowRunDiagramBaseEdge';
import { type WorkflowDiagramEdge } from '@/workflow/workflow-diagram/types/WorkflowDiagram';
import { type EdgeProps, getBezierPath } from '@xyflow/react';
type WorkflowDiagramFilteringDisabledEdgeRunProps =
EdgeProps<WorkflowDiagramEdge>;
export const WorkflowDiagramFilteringDisabledEdgeRun = ({
sourceX,
sourceY,
targetX,
targetY,
markerStart,
markerEnd,
}: WorkflowDiagramFilteringDisabledEdgeRunProps) => {
const [edgePath] = getBezierPath({
sourceX,
sourceY,
targetX,
targetY,
});
return (
<WorkflowRunDiagramBaseEdge
path={edgePath}
markerStart={markerStart}
markerEnd={markerEnd}
/>
);
};
@@ -2,9 +2,9 @@ import { type WorkflowRunStatus } from '@/workflow/types/Workflow';
import { WorkflowDiagramCanvasBase } from '@/workflow/workflow-diagram/components/WorkflowDiagramCanvasBase';
import { WorkflowDiagramDefaultEdgeRun } from '@/workflow/workflow-diagram/components/WorkflowDiagramDefaultEdgeRun';
import { WorkflowDiagramFilterEdgeRun } from '@/workflow/workflow-diagram/components/WorkflowDiagramFilterEdgeRun';
import { WorkflowDiagramFilteringDisabledEdgeRun } from '@/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeRun';
import { WorkflowRunDiagramStepNode } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode';
import { getWorkflowRunStatusTagProps } from '@/workflow/workflow-diagram/utils/getWorkflowRunStatusTagProps';
import { WorkflowRunDiagramStepNode } from '@/workflow/workflow-diagram/workflow-nodes/components/WorkflowRunDiagramStepNode';
import { ReactFlowProvider } from '@xyflow/react';
export const WorkflowRunDiagramCanvas = ({
@@ -23,7 +23,6 @@ export const WorkflowRunDiagramCanvas = ({
default: WorkflowRunDiagramStepNode,
}}
edgeTypes={{
'filtering-disabled--run': WorkflowDiagramFilteringDisabledEdgeRun,
'empty-filter--run': WorkflowDiagramDefaultEdgeRun,
'filter--run': WorkflowDiagramFilterEdgeRun,
}}
@@ -71,9 +71,6 @@ export const WorkflowRunVisualizerEffect = ({
const { isInRightDrawer } = useContext(ActionMenuContext);
const isWorkflowFilteringEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
);
const isWorkflowBranchEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
);
@@ -136,7 +133,6 @@ export const WorkflowRunVisualizerEffect = ({
trigger: workflowRunState.flow.trigger,
steps: workflowRunState.flow.steps,
stepInfos: workflowRunState.stepInfos,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
});
@@ -209,7 +205,6 @@ export const WorkflowRunVisualizerEffect = ({
flowState,
getIcon,
isWorkflowBranchEnabled,
isWorkflowFilteringEnabled,
openWorkflowRunViewStepInCommandMenu,
workflowDiagramState,
workflowDiagramStatusState,
@@ -31,10 +31,6 @@ export const WorkflowVersionVisualizerEffect = ({
const { populateStepsOutputSchema } = useStepsOutputSchema();
const isWorkflowFilteringEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
);
const isWorkflowBranchEnabled = useIsFeatureEnabled(
FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
);
@@ -70,18 +66,12 @@ export const WorkflowVersionVisualizerEffect = ({
const nextWorkflowDiagram = getWorkflowVersionDiagram({
workflowVersion,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
isEditable: false,
});
setWorkflowDiagram(nextWorkflowDiagram);
}, [
isWorkflowBranchEnabled,
isWorkflowFilteringEnabled,
setWorkflowDiagram,
workflowVersion,
]);
}, [isWorkflowBranchEnabled, setWorkflowDiagram, workflowVersion]);
useEffect(() => {
if (!isDefined(workflowVersion)) {
@@ -96,9 +96,6 @@ export type WorkflowDiagramNodeType = 'default' | 'empty-trigger';
export type WorkflowDiagramEdgeType =
| 'blank'
| 'filtering-disabled--editable'
| 'filtering-disabled--readonly'
| 'filtering-disabled--run'
| 'empty-filter--editable'
| 'empty-filter--readonly'
| 'empty-filter--run'
@@ -104,7 +104,7 @@ describe('generateWorkflowRunDiagram', () => {
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled: true,
isWorkflowBranchEnabled: true,
});
@@ -334,7 +334,7 @@ describe('generateWorkflowRunDiagram', () => {
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled: true,
isWorkflowBranchEnabled: true,
});
@@ -564,7 +564,7 @@ describe('generateWorkflowRunDiagram', () => {
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled: true,
isWorkflowBranchEnabled: true,
});
@@ -813,7 +813,7 @@ describe('generateWorkflowRunDiagram', () => {
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled: true,
isWorkflowBranchEnabled: true,
});
@@ -1042,7 +1042,7 @@ describe('generateWorkflowRunDiagram', () => {
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled: true,
isWorkflowBranchEnabled: true,
});
@@ -10,7 +10,6 @@ describe('getWorkflowVersionDiagram', () => {
const result = getWorkflowVersionDiagram({
workflowVersion: undefined,
isEditable: true,
isWorkflowFilteringEnabled: true,
});
expect(result).toMatchInlineSnapshot(`
@@ -35,7 +34,6 @@ describe('getWorkflowVersionDiagram', () => {
workflowId: '',
},
isEditable: true,
isWorkflowFilteringEnabled: true,
});
expect(result).toMatchInlineSnapshot(`
@@ -80,7 +78,6 @@ describe('getWorkflowVersionDiagram', () => {
workflowId: '',
},
isEditable: true,
isWorkflowFilteringEnabled: true,
});
expect(result).toMatchInlineSnapshot(`
@@ -149,7 +146,6 @@ describe('getWorkflowVersionDiagram', () => {
workflowId: '',
},
isEditable: true,
isWorkflowFilteringEnabled: true,
});
expect(result).toMatchInlineSnapshot(`
@@ -19,13 +19,11 @@ export const generateWorkflowRunDiagram = ({
trigger,
steps,
stepInfos,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
}: {
trigger: WorkflowTrigger;
steps: Array<WorkflowStep>;
stepInfos: WorkflowRunStepInfos | undefined;
isWorkflowFilteringEnabled: boolean;
isWorkflowBranchEnabled: boolean;
}): {
diagram: WorkflowRunDiagram;
@@ -46,7 +44,7 @@ export const generateWorkflowRunDiagram = ({
const workflowDiagram = generateWorkflowDiagram({
trigger,
steps,
defaultEdgeType: 'filtering-disabled--readonly',
defaultEdgeType: 'empty-filter--readonly',
});
const workflowRunDiagramNodes: WorkflowRunDiagramNode[] =
@@ -91,9 +89,7 @@ export const generateWorkflowRunDiagram = ({
const stepInfo = stepInfos?.[parentNode.id];
const edgeType: WorkflowDiagramEdgeType = isWorkflowFilteringEnabled
? 'empty-filter--run'
: 'filtering-disabled--run';
const edgeType: WorkflowDiagramEdgeType = 'empty-filter--run';
return {
...edge,
@@ -106,16 +102,6 @@ export const generateWorkflowRunDiagram = ({
};
});
if (!isWorkflowFilteringEnabled) {
return {
diagram: {
nodes: workflowRunDiagramNodes,
edges: workflowRunDiagramEdges,
},
stepToOpenByDefault,
};
}
return {
diagram: transformFilterNodesAsEdges({
nodes: workflowRunDiagramNodes,
@@ -13,29 +13,19 @@ const EMPTY_DIAGRAM: WorkflowDiagram = {
};
const getEdgeTypeToCreateByDefault = ({
isWorkflowFilteringEnabled,
isEditable,
}: {
isWorkflowFilteringEnabled: boolean;
isEditable: boolean;
}): WorkflowDiagramEdgeType => {
if (isWorkflowFilteringEnabled) {
return isEditable ? 'empty-filter--editable' : 'empty-filter--readonly';
}
return isEditable
? 'filtering-disabled--editable'
: 'filtering-disabled--readonly';
return isEditable ? 'empty-filter--editable' : 'empty-filter--readonly';
};
export const getWorkflowVersionDiagram = ({
workflowVersion,
isWorkflowFilteringEnabled,
isWorkflowBranchEnabled,
isEditable,
}: {
workflowVersion: WorkflowVersion | undefined;
isWorkflowFilteringEnabled: boolean;
isWorkflowBranchEnabled?: boolean;
isEditable: boolean;
}): WorkflowDiagram => {
@@ -47,7 +37,6 @@ export const getWorkflowVersionDiagram = ({
trigger: workflowVersion.trigger ?? undefined,
steps: workflowVersion.steps ?? [],
defaultEdgeType: getEdgeTypeToCreateByDefault({
isWorkflowFilteringEnabled,
isEditable,
}),
isWorkflowBranchEnabled,
@@ -40,16 +40,6 @@ export const PUBLIC_FEATURE_FLAGS: PublicFeatureFlag[] = [
'https://twenty.com/images/lab/is-fields-permissions-enabled.png',
},
},
{
key: FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
metadata: {
label: 'Workflow Filter Step',
description:
'Continue to the next node only if the filter conditions are met',
imagePath:
'https://twenty.com/images/lab/is-worklfow-filtering-enabled.png',
},
},
{
key: FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
metadata: {
@@ -7,7 +7,6 @@ export enum FeatureFlagKey {
IS_AI_ENABLED = 'IS_AI_ENABLED',
IS_IMAP_SMTP_CALDAV_ENABLED = 'IS_IMAP_SMTP_CALDAV_ENABLED',
IS_MORPH_RELATION_ENABLED = 'IS_MORPH_RELATION_ENABLED',
IS_WORKFLOW_FILTERING_ENABLED = 'IS_WORKFLOW_FILTERING_ENABLED',
IS_WORKFLOW_BRANCH_ENABLED = 'IS_WORKFLOW_BRANCH_ENABLED',
IS_RELATION_CONNECT_ENABLED = 'IS_RELATION_CONNECT_ENABLED',
IS_FIELDS_PERMISSIONS_ENABLED = 'IS_FIELDS_PERMISSIONS_ENABLED',
@@ -12,15 +12,6 @@ describe('featureFlagValidator', () => {
).not.toThrow();
});
it('should not throw error for new workflow filtering feature flag', () => {
expect(() =>
featureFlagValidator.assertIsFeatureFlagKey(
'IS_WORKFLOW_FILTERING_ENABLED',
new UnknownException('Error', 'Error'),
),
).not.toThrow();
});
it('should throw error if featureFlagKey is invalid', () => {
const invalidKey = 'InvalidKey';
const exception = new UnknownException('Error', 'Error');
@@ -130,7 +130,7 @@ describe('WorkspaceEntityManager', () => {
IS_AI_ENABLED: false,
IS_IMAP_SMTP_CALDAV_ENABLED: false,
IS_MORPH_RELATION_ENABLED: false,
IS_WORKFLOW_FILTERING_ENABLED: false,
IS_WORKFLOW_BRANCH_ENABLED: false,
IS_RELATION_CONNECT_ENABLED: false,
IS_FIELDS_PERMISSIONS_ENABLED: false,
@@ -157,7 +157,7 @@ describe('WorkspaceEntityManager', () => {
IS_AI_ENABLED: false,
IS_IMAP_SMTP_CALDAV_ENABLED: false,
IS_MORPH_RELATION_ENABLED: false,
IS_WORKFLOW_FILTERING_ENABLED: false,
IS_RELATION_CONNECT_ENABLED: false,
IS_FIELDS_PERMISSIONS_ENABLED: true,
IS_CORE_VIEW_SYNCING_ENABLED: false,
@@ -40,11 +40,6 @@ export const seedFeatureFlags = async (
workspaceId: workspaceId,
value: true,
},
{
key: FeatureFlagKey.IS_WORKFLOW_FILTERING_ENABLED,
workspaceId: workspaceId,
value: false,
},
{
key: FeatureFlagKey.IS_WORKFLOW_BRANCH_ENABLED,
workspaceId: workspaceId,
Binary file not shown.

Before

Width:  |  Height:  |  Size: 176 KiB