Merge pull request #2226 from wbkd/refactor/nodes-selection
Refactor/nodes-selection
This commit is contained in:
@@ -59,6 +59,10 @@ const LayoutFlow = () => {
|
|||||||
setNodes(layoutedNodes);
|
setNodes(layoutedNodes);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const unselect = () => {
|
||||||
|
setNodes((nds) => nds.map((n) => ({ ...n, selected: false })));
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="layoutflow">
|
<div className="layoutflow">
|
||||||
<ReactFlowProvider>
|
<ReactFlowProvider>
|
||||||
@@ -77,7 +81,10 @@ const LayoutFlow = () => {
|
|||||||
<button onClick={() => onLayout('TB')} style={{ marginRight: 10 }}>
|
<button onClick={() => onLayout('TB')} style={{ marginRight: 10 }}>
|
||||||
vertical layout
|
vertical layout
|
||||||
</button>
|
</button>
|
||||||
<button onClick={() => onLayout('LR')}>horizontal layout</button>
|
<button onClick={() => onLayout('LR')} style={{ marginRight: 10 }}>
|
||||||
|
horizontal layout
|
||||||
|
</button>
|
||||||
|
<button onClick={() => unselect()}>unselect nodes</button>
|
||||||
</div>
|
</div>
|
||||||
</ReactFlowProvider>
|
</ReactFlowProvider>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -11,22 +11,21 @@ import NodesSelection from '../../components/NodesSelection';
|
|||||||
|
|
||||||
import { ReactFlowState } from '../../types';
|
import { ReactFlowState } from '../../types';
|
||||||
|
|
||||||
interface FlowRendererProps
|
export type FlowRendererProps = Omit<
|
||||||
extends Omit<
|
GraphViewProps,
|
||||||
GraphViewProps,
|
| 'snapToGrid'
|
||||||
| 'snapToGrid'
|
| 'nodeTypes'
|
||||||
| 'nodeTypes'
|
| 'edgeTypes'
|
||||||
| 'edgeTypes'
|
| 'snapGrid'
|
||||||
| 'snapGrid'
|
| 'connectionLineType'
|
||||||
| 'connectionLineType'
|
| 'connectionLineContainerStyle'
|
||||||
| 'connectionLineContainerStyle'
|
| 'arrowHeadColor'
|
||||||
| 'arrowHeadColor'
|
| 'onlyRenderVisibleElements'
|
||||||
| 'onlyRenderVisibleElements'
|
| 'selectNodesOnDrag'
|
||||||
| 'selectNodesOnDrag'
|
| 'defaultMarkerColor'
|
||||||
| 'defaultMarkerColor'
|
> & {
|
||||||
> {
|
|
||||||
children: ReactNode;
|
children: ReactNode;
|
||||||
}
|
};
|
||||||
|
|
||||||
const selector = (s: ReactFlowState) => ({
|
const selector = (s: ReactFlowState) => ({
|
||||||
resetSelectedElements: s.resetSelectedElements,
|
resetSelectedElements: s.resetSelectedElements,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useRef, ReactNode } from 'react';
|
import React, { useEffect, useRef } from 'react';
|
||||||
import { D3ZoomEvent, zoom, zoomIdentity } from 'd3-zoom';
|
import { D3ZoomEvent, zoom, zoomIdentity } from 'd3-zoom';
|
||||||
import { select, pointer } from 'd3-selection';
|
import { select, pointer } from 'd3-selection';
|
||||||
import shallow from 'zustand/shallow';
|
import shallow from 'zustand/shallow';
|
||||||
@@ -7,29 +7,13 @@ import { clamp } from '../../utils';
|
|||||||
import useKeyPress from '../../hooks/useKeyPress';
|
import useKeyPress from '../../hooks/useKeyPress';
|
||||||
import useResizeHandler from '../../hooks/useResizeHandler';
|
import useResizeHandler from '../../hooks/useResizeHandler';
|
||||||
import { useStore, useStoreApi } from '../../store';
|
import { useStore, useStoreApi } from '../../store';
|
||||||
import { Viewport, PanOnScrollMode, KeyCode, ReactFlowState, OnMove, OnMoveStart, OnMoveEnd } from '../../types';
|
import { Viewport, PanOnScrollMode, ReactFlowState } from '../../types';
|
||||||
|
import { FlowRendererProps } from '../FlowRenderer';
|
||||||
|
|
||||||
interface ZoomPaneProps {
|
type ZoomPaneProps = Omit<
|
||||||
selectionKeyPressed: boolean;
|
FlowRendererProps,
|
||||||
elementsSelectable?: boolean;
|
'deleteKeyCode' | 'selectionKeyCode' | 'multiSelectionKeyCode' | 'noDragClassName'
|
||||||
zoomOnScroll?: boolean;
|
> & { selectionKeyPressed: boolean };
|
||||||
zoomOnPinch?: boolean;
|
|
||||||
panOnScroll?: boolean;
|
|
||||||
panOnScrollSpeed?: number;
|
|
||||||
panOnScrollMode?: PanOnScrollMode;
|
|
||||||
zoomOnDoubleClick?: boolean;
|
|
||||||
panOnDrag?: boolean;
|
|
||||||
defaultPosition?: [number, number];
|
|
||||||
defaultZoom?: number;
|
|
||||||
onMove?: OnMove;
|
|
||||||
onMoveStart?: OnMoveStart;
|
|
||||||
onMoveEnd?: OnMoveEnd;
|
|
||||||
zoomActivationKeyCode?: KeyCode;
|
|
||||||
preventScrolling?: boolean;
|
|
||||||
children: ReactNode;
|
|
||||||
noWheelClassName: string;
|
|
||||||
noPanClassName: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
const viewChanged = (prevViewport: Viewport, eventViewport: any): boolean =>
|
const viewChanged = (prevViewport: Viewport, eventViewport: any): boolean =>
|
||||||
prevViewport.x !== eventViewport.x || prevViewport.y !== eventViewport.y || prevViewport.zoom !== eventViewport.k;
|
prevViewport.x !== eventViewport.x || prevViewport.y !== eventViewport.y || prevViewport.zoom !== eventViewport.k;
|
||||||
|
|||||||
@@ -131,7 +131,6 @@ function useDrag({
|
|||||||
.filter((event: MouseEvent) => {
|
.filter((event: MouseEvent) => {
|
||||||
const target = event.target as HTMLDivElement;
|
const target = event.target as HTMLDivElement;
|
||||||
const isDraggable =
|
const isDraggable =
|
||||||
!event.ctrlKey &&
|
|
||||||
!event.button &&
|
!event.button &&
|
||||||
(!noDragClassName || !hasSelector(target, `.${noDragClassName}`, nodeRef)) &&
|
(!noDragClassName || !hasSelector(target, `.${noDragClassName}`, nodeRef)) &&
|
||||||
(!handleSelector || hasSelector(target, handleSelector, nodeRef));
|
(!handleSelector || hasSelector(target, handleSelector, nodeRef));
|
||||||
|
|||||||
@@ -106,6 +106,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.react-flow__handle {
|
.react-flow__handle {
|
||||||
|
position: absolute;
|
||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
|
|
||||||
&.connectable {
|
&.connectable {
|
||||||
|
|||||||
@@ -88,7 +88,6 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.react-flow__handle {
|
.react-flow__handle {
|
||||||
position: absolute;
|
|
||||||
width: 6px;
|
width: 6px;
|
||||||
height: 6px;
|
height: 6px;
|
||||||
background: #555;
|
background: #555;
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ export interface ReactFlowProps extends HTMLAttributes<HTMLDivElement> {
|
|||||||
deleteKeyCode?: KeyCode | null;
|
deleteKeyCode?: KeyCode | null;
|
||||||
selectionKeyCode?: KeyCode | null;
|
selectionKeyCode?: KeyCode | null;
|
||||||
multiSelectionKeyCode?: KeyCode | null;
|
multiSelectionKeyCode?: KeyCode | null;
|
||||||
zoomActivationKeyCode?: KeyCode;
|
zoomActivationKeyCode?: KeyCode | null;
|
||||||
snapToGrid?: boolean;
|
snapToGrid?: boolean;
|
||||||
snapGrid?: [number, number];
|
snapGrid?: [number, number];
|
||||||
onlyRenderVisibleElements?: boolean;
|
onlyRenderVisibleElements?: boolean;
|
||||||
|
|||||||
@@ -141,6 +141,10 @@ export const pointToRendererPoint = (
|
|||||||
};
|
};
|
||||||
|
|
||||||
export const getRectOfNodes = (nodes: Node[]): Rect => {
|
export const getRectOfNodes = (nodes: Node[]): Rect => {
|
||||||
|
if (nodes.length === 0) {
|
||||||
|
return { x: 0, y: 0, width: 0, height: 0 };
|
||||||
|
}
|
||||||
|
|
||||||
const box = nodes.reduce(
|
const box = nodes.reduce(
|
||||||
(currBox, { positionAbsolute, position, width, height }) =>
|
(currBox, { positionAbsolute, position, width, height }) =>
|
||||||
getBoundsOfBoxes(
|
getBoundsOfBoxes(
|
||||||
|
|||||||
Reference in New Issue
Block a user