diff --git a/cypress/integration/flow/interaction.spec.js b/cypress/integration/flow/interaction.spec.js index 055a4214..08236192 100644 --- a/cypress/integration/flow/interaction.spec.js +++ b/cypress/integration/flow/interaction.spec.js @@ -20,6 +20,20 @@ describe('Interaction Flow Rendering', () => { expect(pointerEvents).to.equal('none'); }); + it('toggles on capture element click', () => { + cy.get('.react-flow__captureelementclick').click(); + }); + + it('allows node clicks when enabled', () => { + const pointerEvents = Cypress.$('.react-flow__node:first').css('pointer-events'); + expect(pointerEvents).to.equal('all'); + }); + + it('allows edge clicks when enabled', () => { + const pointerEvents = Cypress.$('.react-flow__edge:first').css('pointer-events'); + expect(pointerEvents).to.equal('all'); + }); + it('tries to do a selection', () => { cy.get('body').type('{shift}', { release: false }).get('.react-flow__selectionpane').should('not.exist'); cy.get('body').type('{shift}', { release: true }); diff --git a/example/src/Interaction/index.js b/example/src/Interaction/index.js index 8d8da70b..81129be6 100644 --- a/example/src/Interaction/index.js +++ b/example/src/Interaction/index.js @@ -28,6 +28,7 @@ const InteractionFlow = () => { const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState(false); const [paneMoveable, setPaneMoveable] = useState(true); const [captureZoomClick, setCaptureZoomClick] = useState(false); + const [captureElementClick, setCaptureElementClick] = useState(false); return ( { zoomOnScroll={zoomOnScroll} zoomOnDoubleClick={zoomOnDoubleClick} onConnect={onConnect} - onElementClick={onElementClick} + onElementClick={captureElementClick ? onElementClick : undefined} onNodeDragStart={onNodeDragStart} onNodeDragStop={onNodeDragStop} paneMoveable={paneMoveable} @@ -133,6 +134,18 @@ const InteractionFlow = () => { /> +
+ +
); diff --git a/src/components/Edges/wrapEdge.tsx b/src/components/Edges/wrapEdge.tsx index 21b1d471..23851899 100644 --- a/src/components/Edges/wrapEdge.tsx +++ b/src/components/Edges/wrapEdge.tsx @@ -53,15 +53,13 @@ export default (EdgeComponent: ComponentType) => { const edgeClasses = cc(['react-flow__edge', `react-flow__edge-${type}`, className, { selected, animated }]); const edgeGroupStyle: CSSProperties = { - pointerEvents: elementsSelectable ? 'all' : 'none', + pointerEvents: elementsSelectable || onClick ? 'all' : 'none', }; const onEdgeClick = (event: React.MouseEvent): void => { - if (!elementsSelectable) { - return; + if (elementsSelectable) { + setSelectedElements({ id, source, target }); } - setSelectedElements({ id, source, target }); - if (onClick) { const edgeElement: Edge = { id, source, target, type }; diff --git a/src/components/Nodes/wrapNode.tsx b/src/components/Nodes/wrapNode.tsx index 5f816bef..a286bd33 100644 --- a/src/components/Nodes/wrapNode.tsx +++ b/src/components/Nodes/wrapNode.tsx @@ -241,10 +241,10 @@ export default (NodeComponent: ComponentType) => { (event: MouseEvent) => { if (!isDraggable && isSelectable) { setSelectedElements({ id: node.id, type: node.type } as Node); + } - if (onClick) { - onClick(event, node); - } + if (onClick) { + onClick(event, node); } }, [isSelectable, isDraggable, node] @@ -279,7 +279,7 @@ export default (NodeComponent: ComponentType) => { const nodeStyle: CSSProperties = { zIndex: selected ? 10 : 3, transform: `translate(${xPos}px,${yPos}px)`, - pointerEvents: isSelectable || isDraggable ? 'all' : 'none', + pointerEvents: isSelectable || isDraggable || onClick ? 'all' : 'none', ...style, };