remove setPaneClickDistance from store and update it declaritively

This commit is contained in:
peterkogo
2025-10-27 12:06:53 +01:00
parent 4f549b1095
commit f8c547d92f
17 changed files with 26 additions and 30 deletions
@@ -34,6 +34,7 @@ const BasicFlow = () => {
selectionMode={SelectionMode.Partial} selectionMode={SelectionMode.Partial}
panOnDrag={panOnDrag} panOnDrag={panOnDrag}
panOnScroll panOnScroll
paneClickDistance={2}
zoomActivationKeyCode="Meta" zoomActivationKeyCode="Meta"
multiSelectionKeyCode={MULTI_SELECT_KEY} multiSelectionKeyCode={MULTI_SELECT_KEY}
onPaneContextMenu={onPaneContextMenu} onPaneContextMenu={onPaneContextMenu}
@@ -69,7 +69,6 @@ const reactFlowFieldsToTrack = [
'onBeforeDelete', 'onBeforeDelete',
'debug', 'debug',
'autoPanSpeed', 'autoPanSpeed',
'paneClickDistance',
'ariaLabelConfig', 'ariaLabelConfig',
] as const; ] as const;
@@ -93,7 +92,6 @@ const selector = (s: ReactFlowState) => ({
setNodeExtent: s.setNodeExtent, setNodeExtent: s.setNodeExtent,
reset: s.reset, reset: s.reset,
setDefaultNodesAndEdges: s.setDefaultNodesAndEdges, setDefaultNodesAndEdges: s.setDefaultNodesAndEdges,
setPaneClickDistance: s.setPaneClickDistance,
}); });
const initPrevValues = { const initPrevValues = {
@@ -124,7 +122,6 @@ export function StoreUpdater<NodeType extends Node = Node, EdgeType extends Edge
setNodeExtent, setNodeExtent,
reset, reset,
setDefaultNodesAndEdges, setDefaultNodesAndEdges,
setPaneClickDistance,
} = useStore(selector, shallow); } = useStore(selector, shallow);
const store = useStoreApi<NodeType, EdgeType>(); const store = useStoreApi<NodeType, EdgeType>();
@@ -155,7 +152,6 @@ export function StoreUpdater<NodeType extends Node = Node, EdgeType extends Edge
else if (fieldName === 'maxZoom') setMaxZoom(fieldValue as number); else if (fieldName === 'maxZoom') setMaxZoom(fieldValue as number);
else if (fieldName === 'translateExtent') setTranslateExtent(fieldValue as CoordinateExtent); else if (fieldName === 'translateExtent') setTranslateExtent(fieldValue as CoordinateExtent);
else if (fieldName === 'nodeExtent') setNodeExtent(fieldValue as CoordinateExtent); else if (fieldName === 'nodeExtent') setNodeExtent(fieldValue as CoordinateExtent);
else if (fieldName === 'paneClickDistance') setPaneClickDistance(fieldValue as number);
else if (fieldName === 'ariaLabelConfig') else if (fieldName === 'ariaLabelConfig')
store.setState({ ariaLabelConfig: mergeAriaLabelConfig(fieldValue as AriaLabelConfig) }); store.setState({ ariaLabelConfig: mergeAriaLabelConfig(fieldValue as AriaLabelConfig) });
// Renamed fields // Renamed fields
@@ -105,6 +105,7 @@ function FlowRendererComponent<NodeType extends Node = Node>({
onViewportChange={onViewportChange} onViewportChange={onViewportChange}
isControlledViewport={isControlledViewport} isControlledViewport={isControlledViewport}
paneClickDistance={paneClickDistance} paneClickDistance={paneClickDistance}
selectionOnDrag={_selectionOnDrag}
> >
<Pane <Pane
onSelectionStart={onSelectionStart} onSelectionStart={onSelectionStart}
@@ -119,6 +120,7 @@ function FlowRendererComponent<NodeType extends Node = Node>({
isSelecting={!!isSelecting} isSelecting={!!isSelecting}
selectionMode={selectionMode} selectionMode={selectionMode}
selectionKeyPressed={selectionKeyPressed} selectionKeyPressed={selectionKeyPressed}
paneClickDistance={paneClickDistance}
selectionOnDrag={_selectionOnDrag} selectionOnDrag={_selectionOnDrag}
> >
{children} {children}
@@ -39,6 +39,7 @@ type PaneProps = {
| 'onPaneMouseMove' | 'onPaneMouseMove'
| 'onPaneMouseLeave' | 'onPaneMouseLeave'
| 'selectionOnDrag' | 'selectionOnDrag'
| 'paneClickDistance'
> >
>; >;
@@ -309,7 +309,6 @@ function ReactFlow<NodeType extends Node = Node, EdgeType extends Edge = Edge>(
nodeDragThreshold={nodeDragThreshold} nodeDragThreshold={nodeDragThreshold}
connectionDragThreshold={connectionDragThreshold} connectionDragThreshold={connectionDragThreshold}
onBeforeDelete={onBeforeDelete} onBeforeDelete={onBeforeDelete}
paneClickDistance={paneClickDistance}
debug={debug} debug={debug}
ariaLabelConfig={ariaLabelConfig} ariaLabelConfig={ariaLabelConfig}
/> />
@@ -12,12 +12,7 @@ import type { ReactFlowState } from '../../types';
type ZoomPaneProps = Omit< type ZoomPaneProps = Omit<
FlowRendererProps, FlowRendererProps,
| 'deleteKeyCode' 'deleteKeyCode' | 'selectionKeyCode' | 'multiSelectionKeyCode' | 'noDragClassName' | 'disableKeyboardA11y'
| 'selectionKeyCode'
| 'multiSelectionKeyCode'
| 'noDragClassName'
| 'disableKeyboardA11y'
| 'selectionOnDrag'
> & { > & {
isControlledViewport: boolean; isControlledViewport: boolean;
}; };
@@ -49,6 +44,7 @@ export function ZoomPane({
onViewportChange, onViewportChange,
isControlledViewport, isControlledViewport,
paneClickDistance, paneClickDistance,
selectionOnDrag,
}: ZoomPaneProps) { }: ZoomPaneProps) {
const store = useStoreApi(); const store = useStoreApi();
const zoomPane = useRef<HTMLDivElement>(null); const zoomPane = useRef<HTMLDivElement>(null);
@@ -77,7 +73,6 @@ export function ZoomPane({
maxZoom, maxZoom,
translateExtent, translateExtent,
viewport: defaultViewport, viewport: defaultViewport,
paneClickDistance,
onDraggingChange: (paneDragging: boolean) => store.setState({ paneDragging }), onDraggingChange: (paneDragging: boolean) => store.setState({ paneDragging }),
onPanZoomStart: (event, vp) => { onPanZoomStart: (event, vp) => {
const { onViewportChangeStart, onMoveStart } = store.getState(); const { onViewportChangeStart, onMoveStart } = store.getState();
@@ -128,6 +123,8 @@ export function ZoomPane({
lib, lib,
onTransformChange, onTransformChange,
connectionInProgress, connectionInProgress,
selectionOnDrag,
paneClickDistance,
}); });
}, [ }, [
onPaneContextMenu, onPaneContextMenu,
@@ -146,6 +143,8 @@ export function ZoomPane({
lib, lib,
onTransformChange, onTransformChange,
connectionInProgress, connectionInProgress,
selectionOnDrag,
paneClickDistance,
]); ]);
return ( return (
-3
View File
@@ -312,9 +312,6 @@ const createStore = ({
set({ translateExtent }); set({ translateExtent });
}, },
setPaneClickDistance: (clickDistance) => {
get().panZoom?.setClickDistance(clickDistance);
},
resetSelectedElements: () => { resetSelectedElements: () => {
const { edges, nodes, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get(); const { edges, nodes, triggerNodeChanges, triggerEdgeChanges, elementsSelectable } = get();
-1
View File
@@ -175,7 +175,6 @@ export type ReactFlowActions<NodeType extends Node, EdgeType extends Edge> = {
triggerEdgeChanges: (changes: EdgeChange<EdgeType>[]) => void; triggerEdgeChanges: (changes: EdgeChange<EdgeType>[]) => void;
panBy: PanBy; panBy: PanBy;
setCenter: SetCenter; setCenter: SetCenter;
setPaneClickDistance: (distance: number) => void;
}; };
export type ReactFlowState<NodeType extends Node = Node, EdgeType extends Edge = Edge> = ReactFlowStore< export type ReactFlowState<NodeType extends Node = Node, EdgeType extends Edge = Edge> = ReactFlowStore<
@@ -35,6 +35,7 @@ type ZoomParams = {
userSelectionActive: boolean; userSelectionActive: boolean;
lib: string; lib: string;
paneClickDistance: number; paneClickDistance: number;
selectionOnDrag?: boolean;
onTransformChange: (transform: Transform) => void; onTransformChange: (transform: Transform) => void;
onDraggingChange: (dragging: boolean) => void; onDraggingChange: (dragging: boolean) => void;
connectionInProgress: boolean; connectionInProgress: boolean;
@@ -49,7 +50,6 @@ export default function zoom(domNode: Element, params: ZoomParams) {
onPanZoom, onPanZoom,
onPanZoomEnd, onPanZoomEnd,
translateExtent, translateExtent,
paneClickDistance,
setPanZoomInstance, setPanZoomInstance,
onDraggingChange, onDraggingChange,
onTransformChange onTransformChange
@@ -61,7 +61,6 @@ export default function zoom(domNode: Element, params: ZoomParams) {
maxZoom, maxZoom,
translateExtent, translateExtent,
viewport: initialViewport, viewport: initialViewport,
paneClickDistance,
onPanZoom, onPanZoom,
onPanZoomStart, onPanZoomStart,
onPanZoomEnd, onPanZoomEnd,
@@ -5,6 +5,7 @@ import type { SvelteFlowStore } from '$lib/store/types';
export type PaneProps<NodeType extends Node = Node, EdgeType extends Edge = Edge> = { export type PaneProps<NodeType extends Node = Node, EdgeType extends Edge = Edge> = {
store: SvelteFlowStore<NodeType, EdgeType>; store: SvelteFlowStore<NodeType, EdgeType>;
panOnDrag?: boolean | number[]; panOnDrag?: boolean | number[];
paneClickDistance: number;
selectionOnDrag?: boolean; selectionOnDrag?: boolean;
onselectionstart?: (event: PointerEvent) => void; onselectionstart?: (event: PointerEvent) => void;
onselectionend?: (event: PointerEvent) => void; onselectionend?: (event: PointerEvent) => void;
@@ -156,6 +156,7 @@
{panOnScrollSpeed} {panOnScrollSpeed}
{panOnDrag} {panOnDrag}
{paneClickDistance} {paneClickDistance}
{selectionOnDrag}
{onmovestart} {onmovestart}
{onmove} {onmove}
{onmoveend} {onmoveend}
@@ -168,6 +169,7 @@
{onselectionstart} {onselectionstart}
{onselectionend} {onselectionend}
{panOnDrag} {panOnDrag}
{paneClickDistance}
{selectionOnDrag} {selectionOnDrag}
> >
<ViewportComponent bind:store> <ViewportComponent bind:store>
@@ -16,6 +16,7 @@
panOnScroll, panOnScroll,
panOnScrollSpeed, panOnScrollSpeed,
paneClickDistance, paneClickDistance,
selectionOnDrag,
onmovestart, onmovestart,
onmove, onmove,
onmoveend, onmoveend,
@@ -69,6 +70,7 @@
translateExtent: store.translateExtent, translateExtent: store.translateExtent,
lib: 'svelte', lib: 'svelte',
paneClickDistance, paneClickDistance,
selectionOnDrag,
onTransformChange: (transform: Transform) => { onTransformChange: (transform: Transform) => {
store.viewport = { x: transform[0], y: transform[1], zoom: transform[2] }; store.viewport = { x: transform[0], y: transform[1], zoom: transform[2] };
}, },
@@ -14,6 +14,7 @@ export type ZoomProps<NodeType extends Node = Node, EdgeType extends Edge = Edge
panOnScroll: boolean; panOnScroll: boolean;
panOnDrag: boolean | number[]; panOnDrag: boolean | number[];
paneClickDistance: number; paneClickDistance: number;
selectionOnDrag?: boolean;
onmove?: OnMove; onmove?: OnMove;
onmovestart?: OnMoveStart; onmovestart?: OnMoveStart;
onmoveend?: OnMoveEnd; onmoveend?: OnMoveEnd;
-5
View File
@@ -191,10 +191,6 @@ export function createStore<NodeType extends Node = Node, EdgeType extends Edge
} }
} }
function setPaneClickDistance(distance: number) {
store.panZoom?.setClickDistance(distance);
}
function deselect<T extends Node | Edge>( function deselect<T extends Node | Edge>(
elements: T[], elements: T[],
elementsToDeselect: Set<string> | null = null elementsToDeselect: Set<string> | null = null
@@ -393,7 +389,6 @@ export function createStore<NodeType extends Node = Node, EdgeType extends Edge
setMinZoom, setMinZoom,
setMaxZoom, setMaxZoom,
setTranslateExtent, setTranslateExtent,
setPaneClickDistance,
unselectNodesAndEdges, unselectNodesAndEdges,
addSelectedNodes, addSelectedNodes,
addSelectedEdges, addSelectedEdges,
-1
View File
@@ -23,7 +23,6 @@ export type SvelteFlowStoreActions<NodeType extends Node = Node, EdgeType extend
setMinZoom: (minZoom: number) => void; setMinZoom: (minZoom: number) => void;
setMaxZoom: (maxZoom: number) => void; setMaxZoom: (maxZoom: number) => void;
setTranslateExtent: (extent: CoordinateExtent) => void; setTranslateExtent: (extent: CoordinateExtent) => void;
setPaneClickDistance: (distance: number) => void;
fitView: (options?: FitViewOptions) => Promise<boolean>; fitView: (options?: FitViewOptions) => Promise<boolean>;
setCenter: SetCenter; setCenter: SetCenter;
updateNodePositions: UpdateNodePositions; updateNodePositions: UpdateNodePositions;
+2 -1
View File
@@ -9,7 +9,6 @@ export type PanZoomParams = {
domNode: Element; domNode: Element;
minZoom: number; minZoom: number;
maxZoom: number; maxZoom: number;
paneClickDistance: number;
viewport: Viewport; viewport: Viewport;
translateExtent: CoordinateExtent; translateExtent: CoordinateExtent;
onDraggingChange: OnDraggingChange; onDraggingChange: OnDraggingChange;
@@ -43,6 +42,8 @@ export type PanZoomUpdateOptions = {
lib: string; lib: string;
onTransformChange: OnTransformChange; onTransformChange: OnTransformChange;
connectionInProgress: boolean; connectionInProgress: boolean;
paneClickDistance: number;
selectionOnDrag?: boolean;
}; };
export type PanZoomInstance = { export type PanZoomInstance = {
+7 -5
View File
@@ -37,7 +37,6 @@ export function XYPanZoom({
domNode, domNode,
minZoom, minZoom,
maxZoom, maxZoom,
paneClickDistance,
translateExtent, translateExtent,
viewport, viewport,
onPanZoom, onPanZoom,
@@ -55,10 +54,7 @@ export function XYPanZoom({
isPanScrolling: false, isPanScrolling: false,
}; };
const bbox = domNode.getBoundingClientRect(); const bbox = domNode.getBoundingClientRect();
const d3ZoomInstance = zoom() const d3ZoomInstance = zoom().scaleExtent([minZoom, maxZoom]).translateExtent(translateExtent);
.clickDistance(!isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance)
.scaleExtent([minZoom, maxZoom])
.translateExtent(translateExtent);
const d3Selection = select(domNode).call(d3ZoomInstance); const d3Selection = select(domNode).call(d3ZoomInstance);
setViewportConstrained( setViewportConstrained(
@@ -109,6 +105,8 @@ export function XYPanZoom({
lib, lib,
onTransformChange, onTransformChange,
connectionInProgress, connectionInProgress,
paneClickDistance,
selectionOnDrag,
}: PanZoomUpdateOptions) { }: PanZoomUpdateOptions) {
if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) { if (userSelectionActive && !zoomPanValues.isZoomingOrPanning) {
destroy(); destroy();
@@ -116,6 +114,10 @@ export function XYPanZoom({
const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive; const isPanOnScroll = panOnScroll && !zoomActivationKeyPressed && !userSelectionActive;
d3ZoomInstance.clickDistance(
selectionOnDrag ? Infinity : !isNumeric(paneClickDistance) || paneClickDistance < 0 ? 0 : paneClickDistance
);
const wheelHandler = isPanOnScroll const wheelHandler = isPanOnScroll
? createPanOnScrollHandler({ ? createPanOnScrollHandler({
zoomPanValues, zoomPanValues,