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 d98351d51c..96b2a5c4a2 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 @@ -91,6 +91,7 @@ export const WorkflowDiagramDefaultEdgeEditable = ({ startNodeCreation({ parentStepId: source, nextStepId: target, + position: { x: labelX, y: labelY }, }); }; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilterEdgeEditable.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilterEdgeEditable.tsx index 269dadcdcb..32c03707be 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilterEdgeEditable.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilterEdgeEditable.tsx @@ -148,6 +148,17 @@ export const WorkflowDiagramFilterEdgeEditable = ({ }); }; + const handleAddNodeButtonClick = () => { + closeDropdown(dropdownId); + setHovered(false); + + startNodeCreation({ + parentStepId: data.stepId, + nextStepId: target, + position: { x: labelX, y: labelY }, + }); + }; + return ( <> { - closeDropdown(dropdownId); - setHovered(false); - - startNodeCreation({ - parentStepId: data.stepId, - nextStepId: target, - }); - }} + onClick={handleAddNodeButtonClick} /> diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeEditable.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeEditable.tsx index dcbeaee3b2..4255ee8045 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeEditable.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramFilteringDisabledEdgeEditable.tsx @@ -58,6 +58,14 @@ export const WorkflowDiagramFilteringDisabledEdgeEditable = ({ nextStepId: target, }); + const handleAddNodeButtonClick = () => { + startNodeCreation({ + parentStepId: source, + nextStepId: target, + position: { x: labelX, y: labelY }, + }); + }; + return ( <> { - startNodeCreation({ - parentStepId: source, - nextStepId: target, - }); - }, + onClick: handleAddNodeButtonClick, }, ]} /> diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramRightClickCommandMenu.tsx b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramRightClickCommandMenu.tsx index 1c07d277fd..d50b706b21 100644 --- a/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramRightClickCommandMenu.tsx +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/components/WorkflowDiagramRightClickCommandMenu.tsx @@ -12,6 +12,7 @@ import { useWorkflowWithCurrentVersion } from '@/workflow/hooks/useWorkflowWithC import { useStartNodeCreation } from '@/workflow/workflow-diagram/hooks/useStartNodeCreation'; import { useCloseRightClickMenu } from '@/workflow/workflow-diagram/hooks/useCloseRightClickMenu'; import { useTidyUpWorkflowVersion } from '@/workflow/workflow-version/hooks/useTidyUpWorkflowVersion'; +import { useWorkflowDiagramScreenToFlowPosition } from '@/workflow/workflow-diagram/hooks/useWorkflowDiagramScreenToFlowPosition'; const StyledContainer = styled.div<{ x: number; y: number }>` background: ${({ theme }) => theme.background.primary}; @@ -31,6 +32,9 @@ export const WorkflowDiagramRightClickCommandMenu = () => { const { t } = useLingui(); const rightClickCommandMenuRef = useRef(null); + const { workflowDiagramScreenToFlowPosition } = + useWorkflowDiagramScreenToFlowPosition(); + const { startNodeCreation } = useStartNodeCreation(); const { closeRightClickMenu } = useCloseRightClickMenu(); @@ -57,10 +61,13 @@ export const WorkflowDiagramRightClickCommandMenu = () => { }; const addNode = () => { + const position = workflowDiagramScreenToFlowPosition( + workflowDiagramRightClickMenuPosition, + ); startNodeCreation({ parentStepId: undefined, nextStepId: undefined, - position: workflowDiagramRightClickMenuPosition, + position, }); }; diff --git a/packages/twenty-front/src/modules/workflow/workflow-diagram/hooks/useWorkflowDiagramScreenToFlowPosition.ts b/packages/twenty-front/src/modules/workflow/workflow-diagram/hooks/useWorkflowDiagramScreenToFlowPosition.ts new file mode 100644 index 0000000000..73532a920e --- /dev/null +++ b/packages/twenty-front/src/modules/workflow/workflow-diagram/hooks/useWorkflowDiagramScreenToFlowPosition.ts @@ -0,0 +1,29 @@ +import { useReactFlow } from '@xyflow/react'; +import { isDefined } from 'twenty-shared/utils'; +import { THEME_COMMON } from 'twenty-ui/theme'; + +export const useWorkflowDiagramScreenToFlowPosition = () => { + const { screenToFlowPosition } = useReactFlow(); + + const workflowDiagramScreenToFlowPosition = (position?: { + x: number; + y: number; + }) => { + if (!isDefined(position)) { + return; + } + + const visibleRightDrawerWidth = Number( + THEME_COMMON.rightDrawerWidth.replace('px', ''), + ); + + const flowPosition = screenToFlowPosition(position); + + return { + x: flowPosition.x + visibleRightDrawerWidth / 2, + y: flowPosition.y, + }; + }; + + return { workflowDiagramScreenToFlowPosition }; +};