feat(props): add preventScrolling prop closes #1077
This commit is contained in:
@@ -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} />
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user