refactor(props): merge defaultPosition and defaultZoom to defaultViewport #2313

This commit is contained in:
moklick
2022-07-25 16:03:42 +02:00
parent 0054dd3d61
commit 37b311851c
6 changed files with 31 additions and 32 deletions
+12 -6
View File
@@ -1,4 +1,4 @@
import React, { MouseEvent } from 'react'; import React, { MouseEvent, useCallback } from 'react';
import ReactFlow, { import ReactFlow, {
addEdge, addEdge,
Connection, Connection,
@@ -18,8 +18,6 @@ import MiniMap from '@react-flow/minimap';
import CustomEdge from './CustomEdge'; import CustomEdge from './CustomEdge';
import CustomEdge2 from './CustomEdge2'; import CustomEdge2 from './CustomEdge2';
const onInit = (reactFlowInstance: ReactFlowInstance) =>
reactFlowInstance.fitView();
const onNodeDragStop = (_: MouseEvent, node: Node) => const onNodeDragStop = (_: MouseEvent, node: Node) =>
console.log('drag stop', node); console.log('drag stop', node);
const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node); const onNodeClick = (_: MouseEvent, node: Node) => console.log('click', node);
@@ -183,11 +181,19 @@ const edgeTypes: EdgeTypes = {
custom2: CustomEdge2, custom2: CustomEdge2,
}; };
const defaultViewport = {
x: 200,
y: 200,
zoom: 0.8,
};
const EdgesFlow = () => { const EdgesFlow = () => {
const [nodes, , onNodesChange] = useNodesState(initialNodes); const [nodes, , onNodesChange] = useNodesState(initialNodes);
const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges); const [edges, setEdges, onEdgesChange] = useEdgesState(initialEdges);
const onConnect = (params: Connection | Edge) => const onConnect = useCallback(
setEdges((eds) => addEdge(params, eds)); (params: Connection | Edge) => setEdges((eds) => addEdge(params, eds)),
[]
);
return ( return (
<ReactFlow <ReactFlow
@@ -198,7 +204,6 @@ const EdgesFlow = () => {
onNodeClick={onNodeClick} onNodeClick={onNodeClick}
onConnect={onConnect} onConnect={onConnect}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
onInit={onInit}
snapToGrid={true} snapToGrid={true}
edgeTypes={edgeTypes} edgeTypes={edgeTypes}
onEdgeClick={onEdgeClick} onEdgeClick={onEdgeClick}
@@ -206,6 +211,7 @@ const EdgesFlow = () => {
onEdgeMouseEnter={onEdgeMouseEnter} onEdgeMouseEnter={onEdgeMouseEnter}
onEdgeMouseMove={onEdgeMouseMove} onEdgeMouseMove={onEdgeMouseMove}
onEdgeMouseLeave={onEdgeMouseLeave} onEdgeMouseLeave={onEdgeMouseLeave}
defaultViewport={defaultViewport}
> >
<MiniMap /> <MiniMap />
<Controls /> <Controls />
@@ -51,8 +51,7 @@ const FlowRenderer = ({
panOnScrollMode, panOnScrollMode,
zoomOnDoubleClick, zoomOnDoubleClick,
panOnDrag, panOnDrag,
defaultPosition, defaultViewport,
defaultZoom,
preventScrolling, preventScrolling,
onSelectionContextMenu, onSelectionContextMenu,
noWheelClassName, noWheelClassName,
@@ -87,8 +86,7 @@ const FlowRenderer = ({
panOnScrollMode={panOnScrollMode} panOnScrollMode={panOnScrollMode}
zoomOnDoubleClick={zoomOnDoubleClick} zoomOnDoubleClick={zoomOnDoubleClick}
panOnDrag={panOnDrag} panOnDrag={panOnDrag}
defaultPosition={defaultPosition} defaultViewport={defaultViewport}
defaultZoom={defaultZoom}
zoomActivationKeyCode={zoomActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode}
preventScrolling={preventScrolling} preventScrolling={preventScrolling}
noWheelClassName={noWheelClassName} noWheelClassName={noWheelClassName}
@@ -3,9 +3,9 @@ import React, { memo } from 'react';
import FlowRenderer from '../FlowRenderer'; import FlowRenderer from '../FlowRenderer';
import NodeRenderer from '../NodeRenderer'; import NodeRenderer from '../NodeRenderer';
import EdgeRenderer from '../EdgeRenderer'; import EdgeRenderer from '../EdgeRenderer';
import Viewport from '../Viewport'; import ViewportWrapper from '../Viewport';
import useOnInitHandler from '../../hooks/useOnInitHandler'; import useOnInitHandler from '../../hooks/useOnInitHandler';
import { NodeTypesWrapped, EdgeTypesWrapped, ConnectionLineType, KeyCode, ReactFlowProps } from '../../types'; import { NodeTypesWrapped, EdgeTypesWrapped, ConnectionLineType, KeyCode, ReactFlowProps, Viewport } from '../../types';
export interface GraphViewProps export interface GraphViewProps
extends Omit<ReactFlowProps, 'onSelectionChange' | 'nodes' | 'edges' | 'nodeTypes' | 'edgeTypes'> { extends Omit<ReactFlowProps, 'onSelectionChange' | 'nodes' | 'edges' | 'nodeTypes' | 'edgeTypes'> {
@@ -16,13 +16,12 @@ export interface GraphViewProps
multiSelectionKeyCode: KeyCode | null; multiSelectionKeyCode: KeyCode | null;
connectionLineType: ConnectionLineType; connectionLineType: ConnectionLineType;
onlyRenderVisibleElements: boolean; onlyRenderVisibleElements: boolean;
defaultZoom: number;
defaultPosition: [number, number];
defaultMarkerColor: string; defaultMarkerColor: string;
selectNodesOnDrag: boolean; selectNodesOnDrag: boolean;
noDragClassName: string; noDragClassName: string;
noWheelClassName: string; noWheelClassName: string;
noPanClassName: string; noPanClassName: string;
defaultViewport: Viewport;
} }
const GraphView = ({ const GraphView = ({
@@ -52,8 +51,7 @@ const GraphView = ({
onlyRenderVisibleElements, onlyRenderVisibleElements,
elementsSelectable, elementsSelectable,
selectNodesOnDrag, selectNodesOnDrag,
defaultZoom, defaultViewport,
defaultPosition,
preventScrolling, preventScrolling,
defaultMarkerColor, defaultMarkerColor,
zoomOnScroll, zoomOnScroll,
@@ -108,15 +106,14 @@ const GraphView = ({
panOnScrollSpeed={panOnScrollSpeed} panOnScrollSpeed={panOnScrollSpeed}
panOnScrollMode={panOnScrollMode} panOnScrollMode={panOnScrollMode}
panOnDrag={panOnDrag} panOnDrag={panOnDrag}
defaultPosition={defaultPosition} defaultViewport={defaultViewport}
defaultZoom={defaultZoom}
onSelectionContextMenu={onSelectionContextMenu} onSelectionContextMenu={onSelectionContextMenu}
preventScrolling={preventScrolling} preventScrolling={preventScrolling}
noDragClassName={noDragClassName} noDragClassName={noDragClassName}
noWheelClassName={noWheelClassName} noWheelClassName={noWheelClassName}
noPanClassName={noPanClassName} noPanClassName={noPanClassName}
> >
<Viewport> <ViewportWrapper>
<EdgeRenderer <EdgeRenderer
edgeTypes={edgeTypes} edgeTypes={edgeTypes}
onEdgeClick={onEdgeClick} onEdgeClick={onEdgeClick}
@@ -152,7 +149,7 @@ const GraphView = ({
noPanClassName={noPanClassName} noPanClassName={noPanClassName}
noDragClassName={noDragClassName} noDragClassName={noDragClassName}
/> />
</Viewport> </ViewportWrapper>
</FlowRenderer> </FlowRenderer>
); );
}; };
@@ -22,6 +22,7 @@ import {
PanOnScrollMode, PanOnScrollMode,
ReactFlowProps, ReactFlowProps,
ReactFlowRefType, ReactFlowRefType,
Viewport,
} from '../../types'; } from '../../types';
import { createEdgeTypes } from '../EdgeRenderer/utils'; import { createEdgeTypes } from '../EdgeRenderer/utils';
import GraphView from '../GraphView'; import GraphView from '../GraphView';
@@ -44,7 +45,7 @@ const defaultEdgeTypes: EdgeTypes = {
}; };
const initSnapGrid: [number, number] = [15, 15]; const initSnapGrid: [number, number] = [15, 15];
const initDefaultPosition: [number, number] = [0, 0]; const initDefaultViewport: Viewport = { x: 0, y: 0, zoom: 1 };
const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>( const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
( (
@@ -102,8 +103,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
elementsSelectable, elementsSelectable,
minZoom, minZoom,
maxZoom, maxZoom,
defaultZoom = 1, defaultViewport = initDefaultViewport,
defaultPosition = initDefaultPosition,
translateExtent, translateExtent,
preventScrolling = true, preventScrolling = true,
nodeExtent, nodeExtent,
@@ -177,8 +177,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
zoomActivationKeyCode={zoomActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode}
onlyRenderVisibleElements={onlyRenderVisibleElements} onlyRenderVisibleElements={onlyRenderVisibleElements}
selectNodesOnDrag={selectNodesOnDrag} selectNodesOnDrag={selectNodesOnDrag}
defaultZoom={defaultZoom} defaultViewport={defaultViewport}
defaultPosition={defaultPosition}
preventScrolling={preventScrolling} preventScrolling={preventScrolling}
zoomOnScroll={zoomOnScroll} zoomOnScroll={zoomOnScroll}
zoomOnPinch={zoomOnPinch} zoomOnPinch={zoomOnPinch}
@@ -45,8 +45,7 @@ const ZoomPane = ({
selectionKeyPressed, selectionKeyPressed,
elementsSelectable, elementsSelectable,
panOnDrag = true, panOnDrag = true,
defaultPosition = [0, 0], defaultViewport,
defaultZoom = 1,
zoomActivationKeyCode, zoomActivationKeyCode,
preventScrolling = true, preventScrolling = true,
children, children,
@@ -68,9 +67,9 @@ const ZoomPane = ({
const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent); const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent);
const selection = select(zoomPane.current as Element).call(d3ZoomInstance); const selection = select(zoomPane.current as Element).call(d3ZoomInstance);
const clampedX = clamp(defaultPosition[0], translateExtent[0][0], translateExtent[1][0]); const clampedX = clamp(defaultViewport.x, translateExtent[0][0], translateExtent[1][0]);
const clampedY = clamp(defaultPosition[1], translateExtent[0][1], translateExtent[1][1]); const clampedY = clamp(defaultViewport.y, translateExtent[0][1], translateExtent[1][1]);
const clampedZoom = clamp(defaultZoom, minZoom, maxZoom); const clampedZoom = clamp(defaultViewport.zoom, minZoom, maxZoom);
const updatedTransform = zoomIdentity.translate(clampedX, clampedY).scale(clampedZoom); const updatedTransform = zoomIdentity.translate(clampedX, clampedY).scale(clampedZoom);
d3ZoomInstance.transform(selection, updatedTransform); d3ZoomInstance.transform(selection, updatedTransform);
+2 -2
View File
@@ -32,6 +32,7 @@ import {
NodeDragHandler, NodeDragHandler,
NodeMouseHandler, NodeMouseHandler,
SelectionDragHandler, SelectionDragHandler,
Viewport,
} from '.'; } from '.';
import { HandleType } from './handles'; import { HandleType } from './handles';
@@ -98,8 +99,7 @@ export interface ReactFlowProps extends HTMLAttributes<HTMLDivElement> {
panOnDrag?: boolean; panOnDrag?: boolean;
minZoom?: number; minZoom?: number;
maxZoom?: number; maxZoom?: number;
defaultZoom?: number; defaultViewport?: Viewport;
defaultPosition?: [number, number];
translateExtent?: CoordinateExtent; translateExtent?: CoordinateExtent;
preventScrolling?: boolean; preventScrolling?: boolean;
nodeExtent?: CoordinateExtent; nodeExtent?: CoordinateExtent;