feat(props): add preventScrolling prop closes #1077

This commit is contained in:
moklick
2021-07-01 15:30:29 +02:00
parent 55d95d3684
commit ef47500122
4 changed files with 32 additions and 4 deletions
+2
View File
@@ -49,6 +49,7 @@ const FlowRenderer = ({
defaultPosition, defaultPosition,
defaultZoom, defaultZoom,
translateExtent, translateExtent,
preventScrolling,
onSelectionDragStart, onSelectionDragStart,
onSelectionDrag, onSelectionDrag,
onSelectionDragStop, onSelectionDragStop,
@@ -103,6 +104,7 @@ const FlowRenderer = ({
defaultZoom={defaultZoom} defaultZoom={defaultZoom}
translateExtent={translateExtent} translateExtent={translateExtent}
zoomActivationKeyCode={zoomActivationKeyCode} zoomActivationKeyCode={zoomActivationKeyCode}
preventScrolling={preventScrolling}
> >
{children} {children}
<UserSelection selectionKeyPressed={selectionKeyPressed} /> <UserSelection selectionKeyPressed={selectionKeyPressed} />
+2
View File
@@ -73,6 +73,7 @@ const GraphView = ({
defaultZoom, defaultZoom,
defaultPosition, defaultPosition,
translateExtent, translateExtent,
preventScrolling,
nodeExtent, nodeExtent,
arrowHeadColor, arrowHeadColor,
markerEndId, markerEndId,
@@ -244,6 +245,7 @@ const GraphView = ({
onSelectionDrag={onSelectionDrag} onSelectionDrag={onSelectionDrag}
onSelectionDragStop={onSelectionDragStop} onSelectionDragStop={onSelectionDragStop}
onSelectionContextMenu={onSelectionContextMenu} onSelectionContextMenu={onSelectionContextMenu}
preventScrolling={preventScrolling}
> >
<NodeRenderer <NodeRenderer
nodeTypes={nodeTypes} nodeTypes={nodeTypes}
+3
View File
@@ -107,6 +107,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
defaultZoom?: number; defaultZoom?: number;
defaultPosition?: [number, number]; defaultPosition?: [number, number];
translateExtent?: TranslateExtent; translateExtent?: TranslateExtent;
preventScrolling?: boolean;
nodeExtent?: NodeExtent; nodeExtent?: NodeExtent;
arrowHeadColor?: string; arrowHeadColor?: string;
markerEndId?: string; markerEndId?: string;
@@ -181,6 +182,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
defaultZoom = 1, defaultZoom = 1,
defaultPosition = [0, 0], defaultPosition = [0, 0],
translateExtent, translateExtent,
preventScrolling = true,
nodeExtent, nodeExtent,
arrowHeadColor = '#b1b1b7', arrowHeadColor = '#b1b1b7',
markerEndId, markerEndId,
@@ -258,6 +260,7 @@ const ReactFlow = forwardRef<ReactFlowRefType, ReactFlowProps>(
defaultZoom={defaultZoom} defaultZoom={defaultZoom}
defaultPosition={defaultPosition} defaultPosition={defaultPosition}
translateExtent={translateExtent} translateExtent={translateExtent}
preventScrolling={preventScrolling}
nodeExtent={nodeExtent} nodeExtent={nodeExtent}
arrowHeadColor={arrowHeadColor} arrowHeadColor={arrowHeadColor}
markerEndId={markerEndId} markerEndId={markerEndId}
+25 -4
View File
@@ -25,6 +25,7 @@ interface ZoomPaneProps {
onMoveStart?: (flowTransform?: FlowTransform) => void; onMoveStart?: (flowTransform?: FlowTransform) => void;
onMoveEnd?: (flowTransform?: FlowTransform) => void; onMoveEnd?: (flowTransform?: FlowTransform) => void;
zoomActivationKeyCode?: KeyCode; zoomActivationKeyCode?: KeyCode;
preventScrolling?: boolean;
children: ReactNode; children: ReactNode;
} }
@@ -39,6 +40,8 @@ const eventToFlowTransform = (eventTransform: any): FlowTransform => ({
zoom: eventTransform.k, zoom: eventTransform.k,
}); });
const hasNoWheelClass = (event: any) => event.target.closest('.nowheel');
const ZoomPane = ({ const ZoomPane = ({
onMove, onMove,
onMoveStart, onMoveStart,
@@ -56,6 +59,7 @@ const ZoomPane = ({
defaultZoom = 1, defaultZoom = 1,
translateExtent, translateExtent,
zoomActivationKeyCode, zoomActivationKeyCode,
preventScrolling = true,
children, children,
}: ZoomPaneProps) => { }: ZoomPaneProps) => {
const zoomPane = useRef<HTMLDivElement>(null); const zoomPane = useRef<HTMLDivElement>(null);
@@ -102,7 +106,7 @@ const ZoomPane = ({
if (panOnScroll && !zoomActivationKeyPressed) { if (panOnScroll && !zoomActivationKeyPressed) {
d3Selection d3Selection
.on('wheel', (event: any) => { .on('wheel', (event: any) => {
if (event.target.closest('.nowheel')) { if (hasNoWheelClass(event)) {
return false; return false;
} }
event.preventDefault(); event.preventDefault();
@@ -134,10 +138,27 @@ const ZoomPane = ({
}) })
.on('wheel.zoom', null); .on('wheel.zoom', null);
} else if (typeof d3ZoomHandler !== 'undefined') { } else if (typeof d3ZoomHandler !== 'undefined') {
d3Selection.on('wheel', null).on('wheel.zoom', d3ZoomHandler); d3Selection
.on('wheel', (event: any) => {
if (!preventScrolling || hasNoWheelClass(event)) {
return null;
}
event.preventDefault();
})
.on('wheel.zoom', d3ZoomHandler);
} }
} }
}, [panOnScroll, panOnScrollMode, d3Selection, d3Zoom, d3ZoomHandler, zoomActivationKeyPressed, zoomOnPinch]); }, [
panOnScroll,
panOnScrollMode,
d3Selection,
d3Zoom,
d3ZoomHandler,
zoomActivationKeyPressed,
zoomOnPinch,
preventScrolling,
]);
useEffect(() => { useEffect(() => {
if (d3Zoom) { if (d3Zoom) {
@@ -211,7 +232,7 @@ const ZoomPane = ({
return false; return false;
} }
if (event.target.closest('.nowheel') && event.type === 'wheel') { if (hasNoWheelClass(event) && event.type === 'wheel') {
return false; return false;
} }