Merge pull request #379 from wbkd/develop
feat(interaction): add paneMoveable prop #377
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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]);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user