Merge pull request #379 from wbkd/develop

feat(interaction): add paneMoveable prop #377
This commit is contained in:
Moritz
2020-07-30 11:11:42 +02:00
committed by GitHub
5 changed files with 30 additions and 3 deletions
+1
View File
@@ -101,6 +101,7 @@ const BasicFlow = () => <ReactFlow elements={elements} />;
- `zoomOnScroll`: default: `true` - `zoomOnScroll`: default: `true`
- `zoomOnDoubleClick`: default: `true` - `zoomOnDoubleClick`: default: `true`
- `selectNodesOnDrag`: default: `true` - `selectNodesOnDrag`: default: `true`
- `paneMoveable`: default: `true` - If set to `false`, panning and zooming is disabled
#### Element Customization #### Element Customization
- `nodeTypes`: object with [node types](#node-types--custom-nodes) - `nodeTypes`: object with [node types](#node-types--custom-nodes)
+14
View File
@@ -24,6 +24,7 @@ const InteractionFlow = () => {
const [isConnectable, setIsConnectable] = useState(false); const [isConnectable, setIsConnectable] = useState(false);
const [zoomOnScroll, setZoomOnScroll] = useState(false); const [zoomOnScroll, setZoomOnScroll] = useState(false);
const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState(false); const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState(false);
const [paneMoveable, setPaneMoveable] = useState(true);
return ( return (
<ReactFlow <ReactFlow
@@ -37,6 +38,7 @@ const InteractionFlow = () => {
onElementClick={onElementClick} onElementClick={onElementClick}
onNodeDragStart={onNodeDragStart} onNodeDragStart={onNodeDragStart}
onNodeDragStop={onNodeDragStop} onNodeDragStop={onNodeDragStop}
paneMoveable={paneMoveable}
> >
<MiniMap /> <MiniMap />
<Controls /> <Controls />
@@ -102,6 +104,18 @@ const InteractionFlow = () => {
/> />
</label> </label>
</div> </div>
<div>
<label htmlFor="panemoveable">
pane moveable
<input
id="panemoveable"
type="checkbox"
checked={paneMoveable}
onChange={(evt) => setPaneMoveable(evt.target.checked)}
className="react-flow__panemoveable"
/>
</label>
</div>
</div> </div>
</ReactFlow> </ReactFlow>
); );
+3 -1
View File
@@ -60,6 +60,7 @@ export interface GraphViewProps {
markerEndId?: string; markerEndId?: string;
zoomOnScroll: boolean; zoomOnScroll: boolean;
zoomOnDoubleClick: boolean; zoomOnDoubleClick: boolean;
paneMoveable: boolean;
} }
const GraphView = ({ const GraphView = ({
@@ -98,6 +99,7 @@ const GraphView = ({
markerEndId, markerEndId,
zoomOnScroll, zoomOnScroll,
zoomOnDoubleClick, zoomOnDoubleClick,
paneMoveable,
}: GraphViewProps) => { }: GraphViewProps) => {
const zoomPane = useRef<HTMLDivElement>(null); const zoomPane = useRef<HTMLDivElement>(null);
const rendererNode = useRef<HTMLDivElement>(null); const rendererNode = useRef<HTMLDivElement>(null);
@@ -141,7 +143,6 @@ const GraphView = ({
updateDimensions(); updateDimensions();
window.onresize = updateDimensions; window.onresize = updateDimensions;
if (rendererNode.current) { if (rendererNode.current) {
resizeObserver = new ResizeObserver((entries) => { resizeObserver = new ResizeObserver((entries) => {
for (let _ of entries) { for (let _ of entries) {
@@ -169,6 +170,7 @@ const GraphView = ({
selectionKeyPressed, selectionKeyPressed,
zoomOnScroll, zoomOnScroll,
zoomOnDoubleClick, zoomOnDoubleClick,
paneMoveable,
}); });
useEffect(() => { useEffect(() => {
+4
View File
@@ -60,6 +60,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
nodesConnectable: boolean; nodesConnectable: boolean;
elementsSelectable: boolean; elementsSelectable: boolean;
selectNodesOnDrag: boolean; selectNodesOnDrag: boolean;
paneMoveable: boolean;
minZoom: number; minZoom: number;
maxZoom: number; maxZoom: number;
defaultZoom: number; defaultZoom: number;
@@ -110,6 +111,7 @@ const ReactFlow = ({
markerEndId, markerEndId,
zoomOnScroll, zoomOnScroll,
zoomOnDoubleClick, zoomOnDoubleClick,
paneMoveable,
}: ReactFlowProps) => { }: ReactFlowProps) => {
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []); const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []);
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []); const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []);
@@ -154,6 +156,7 @@ const ReactFlow = ({
markerEndId={markerEndId} markerEndId={markerEndId}
zoomOnScroll={zoomOnScroll} zoomOnScroll={zoomOnScroll}
zoomOnDoubleClick={zoomOnDoubleClick} zoomOnDoubleClick={zoomOnDoubleClick}
paneMoveable={paneMoveable}
/> />
{onSelectionChange && <SelectionListener onSelectionChange={onSelectionChange} />} {onSelectionChange && <SelectionListener onSelectionChange={onSelectionChange} />}
{children} {children}
@@ -186,6 +189,7 @@ ReactFlow.defaultProps = {
nodesConnectable: true, nodesConnectable: true,
elementsSelectable: true, elementsSelectable: true,
selectNodesOnDrag: true, selectNodesOnDrag: true,
paneMoveable: true,
minZoom: 0.5, minZoom: 0.5,
maxZoom: 2, maxZoom: 2,
defaultZoom: 1, defaultZoom: 1,
+7 -1
View File
@@ -9,6 +9,7 @@ interface UseD3ZoomParams {
selectionKeyPressed: boolean; selectionKeyPressed: boolean;
zoomOnScroll: boolean; zoomOnScroll: boolean;
zoomOnDoubleClick: boolean; zoomOnDoubleClick: boolean;
paneMoveable: boolean;
onMove?: (flowTransform?: FlowTransform) => void; onMove?: (flowTransform?: FlowTransform) => void;
onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveStart?: (flowTransform?: FlowTransform) => void;
onMoveEnd?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void;
@@ -33,6 +34,7 @@ export default ({
zoomOnScroll, zoomOnScroll,
zoomOnDoubleClick, zoomOnDoubleClick,
selectionKeyPressed, selectionKeyPressed,
paneMoveable,
}: UseD3ZoomParams): void => { }: UseD3ZoomParams): void => {
const prevTransform = useRef<FlowTransform>({ x: 0, y: 0, zoom: 0 }); const prevTransform = useRef<FlowTransform>({ x: 0, y: 0, zoom: 0 });
const d3Zoom = useStoreState((s) => s.d3Zoom); const d3Zoom = useStoreState((s) => s.d3Zoom);
@@ -100,6 +102,10 @@ export default ({
useEffect(() => { useEffect(() => {
if (d3Zoom) { if (d3Zoom) {
d3Zoom.filter(() => { d3Zoom.filter(() => {
if (!paneMoveable) {
return false;
}
if (!zoomOnScroll && event.type === 'wheel') { if (!zoomOnScroll && event.type === 'wheel') {
return false; return false;
} }
@@ -111,5 +117,5 @@ export default ({
return !event.ctrlKey && !event.button; return !event.ctrlKey && !event.button;
}); });
} }
}, [d3Zoom, zoomOnScroll, zoomOnDoubleClick]); }, [d3Zoom, zoomOnScroll, zoomOnDoubleClick, paneMoveable]);
}; };