feat(interaction): add paneMoveable prop #377
This commit is contained in:
@@ -101,6 +101,7 @@ const BasicFlow = () => <ReactFlow elements={elements} />;
|
||||
- `zoomOnScroll`: default: `true`
|
||||
- `zoomOnDoubleClick`: default: `true`
|
||||
- `selectNodesOnDrag`: default: `true`
|
||||
- `paneMoveable`: default: `true` - If set to `false`, panning and zooming is disabled
|
||||
|
||||
#### Element Customization
|
||||
- `nodeTypes`: object with [node types](#node-types--custom-nodes)
|
||||
|
||||
@@ -24,6 +24,7 @@ const InteractionFlow = () => {
|
||||
const [isConnectable, setIsConnectable] = useState(false);
|
||||
const [zoomOnScroll, setZoomOnScroll] = useState(false);
|
||||
const [zoomOnDoubleClick, setZoomOnDoubleClick] = useState(false);
|
||||
const [paneMoveable, setPaneMoveable] = useState(true);
|
||||
|
||||
return (
|
||||
<ReactFlow
|
||||
@@ -37,6 +38,7 @@ const InteractionFlow = () => {
|
||||
onElementClick={onElementClick}
|
||||
onNodeDragStart={onNodeDragStart}
|
||||
onNodeDragStop={onNodeDragStop}
|
||||
paneMoveable={paneMoveable}
|
||||
>
|
||||
<MiniMap />
|
||||
<Controls />
|
||||
@@ -102,6 +104,18 @@ const InteractionFlow = () => {
|
||||
/>
|
||||
</label>
|
||||
</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>
|
||||
</ReactFlow>
|
||||
);
|
||||
|
||||
@@ -60,6 +60,7 @@ export interface GraphViewProps {
|
||||
markerEndId?: string;
|
||||
zoomOnScroll: boolean;
|
||||
zoomOnDoubleClick: boolean;
|
||||
paneMoveable: boolean;
|
||||
}
|
||||
|
||||
const GraphView = ({
|
||||
@@ -98,6 +99,7 @@ const GraphView = ({
|
||||
markerEndId,
|
||||
zoomOnScroll,
|
||||
zoomOnDoubleClick,
|
||||
paneMoveable,
|
||||
}: GraphViewProps) => {
|
||||
const zoomPane = useRef<HTMLDivElement>(null);
|
||||
const rendererNode = useRef<HTMLDivElement>(null);
|
||||
@@ -141,7 +143,6 @@ const GraphView = ({
|
||||
updateDimensions();
|
||||
window.onresize = updateDimensions;
|
||||
|
||||
|
||||
if (rendererNode.current) {
|
||||
resizeObserver = new ResizeObserver((entries) => {
|
||||
for (let _ of entries) {
|
||||
@@ -169,6 +170,7 @@ const GraphView = ({
|
||||
selectionKeyPressed,
|
||||
zoomOnScroll,
|
||||
zoomOnDoubleClick,
|
||||
paneMoveable,
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
@@ -196,7 +198,7 @@ const GraphView = ({
|
||||
}
|
||||
}
|
||||
}, [d3Initialised, onLoad]);
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
if (onConnect) {
|
||||
setOnConnect(onConnect);
|
||||
|
||||
@@ -60,6 +60,7 @@ export interface ReactFlowProps extends Omit<HTMLAttributes<HTMLDivElement>, 'on
|
||||
nodesConnectable: boolean;
|
||||
elementsSelectable: boolean;
|
||||
selectNodesOnDrag: boolean;
|
||||
paneMoveable: boolean;
|
||||
minZoom: number;
|
||||
maxZoom: number;
|
||||
defaultZoom: number;
|
||||
@@ -110,6 +111,7 @@ const ReactFlow = ({
|
||||
markerEndId,
|
||||
zoomOnScroll,
|
||||
zoomOnDoubleClick,
|
||||
paneMoveable,
|
||||
}: ReactFlowProps) => {
|
||||
const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []);
|
||||
const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []);
|
||||
@@ -154,6 +156,7 @@ const ReactFlow = ({
|
||||
markerEndId={markerEndId}
|
||||
zoomOnScroll={zoomOnScroll}
|
||||
zoomOnDoubleClick={zoomOnDoubleClick}
|
||||
paneMoveable={paneMoveable}
|
||||
/>
|
||||
{onSelectionChange && <SelectionListener onSelectionChange={onSelectionChange} />}
|
||||
{children}
|
||||
@@ -186,6 +189,7 @@ ReactFlow.defaultProps = {
|
||||
nodesConnectable: true,
|
||||
elementsSelectable: true,
|
||||
selectNodesOnDrag: true,
|
||||
paneMoveable: true,
|
||||
minZoom: 0.5,
|
||||
maxZoom: 2,
|
||||
defaultZoom: 1,
|
||||
|
||||
@@ -9,6 +9,7 @@ interface UseD3ZoomParams {
|
||||
selectionKeyPressed: boolean;
|
||||
zoomOnScroll: boolean;
|
||||
zoomOnDoubleClick: boolean;
|
||||
paneMoveable: boolean;
|
||||
onMove?: (flowTransform?: FlowTransform) => void;
|
||||
onMoveStart?: (flowTransform?: FlowTransform) => void;
|
||||
onMoveEnd?: (flowTransform?: FlowTransform) => void;
|
||||
@@ -33,6 +34,7 @@ export default ({
|
||||
zoomOnScroll,
|
||||
zoomOnDoubleClick,
|
||||
selectionKeyPressed,
|
||||
paneMoveable,
|
||||
}: UseD3ZoomParams): void => {
|
||||
const prevTransform = useRef<FlowTransform>({ x: 0, y: 0, zoom: 0 });
|
||||
const d3Zoom = useStoreState((s) => s.d3Zoom);
|
||||
@@ -100,6 +102,10 @@ export default ({
|
||||
useEffect(() => {
|
||||
if (d3Zoom) {
|
||||
d3Zoom.filter(() => {
|
||||
if (!paneMoveable) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!zoomOnScroll && event.type === 'wheel') {
|
||||
return false;
|
||||
}
|
||||
@@ -111,5 +117,5 @@ export default ({
|
||||
return !event.ctrlKey && !event.button;
|
||||
});
|
||||
}
|
||||
}, [d3Zoom, zoomOnScroll, zoomOnDoubleClick]);
|
||||
}, [d3Zoom, zoomOnScroll, zoomOnDoubleClick, paneMoveable]);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user