fix node extent

This commit is contained in:
peterkogo
2024-08-19 17:44:36 +02:00
parent 9b768b2dae
commit d9563505d8
5 changed files with 26 additions and 8 deletions
+7
View File
@@ -0,0 +1,7 @@
---
'@xyflow/react': patch
'@xyflow/svelte': patch
'@xyflow/system': patch
---
Fix extent on nodes not working properly
@@ -42,7 +42,7 @@ export function NodeWrapper<NodeType extends Node>({
nodeClickDistance,
onError,
}: NodeWrapperProps<NodeType>) {
const { node, internals, isParent } = useStore((s) => {
const { node, internals, isParent, origin } = useStore((s) => {
const node = s.nodeLookup.get(id)! as InternalNode<NodeType>;
const isParent = s.parentLookup.has(id);
@@ -50,6 +50,7 @@ export function NodeWrapper<NodeType extends Node>({
node,
internals: node.internals,
isParent,
origin: node.origin ?? s.nodeOrigin,
};
}, shallow);
@@ -89,7 +90,7 @@ export function NodeWrapper<NodeType extends Node>({
const inlineDimensions = getNodeInlineStyleDimensions(node);
// TODO: clamping should happen earlier
const clampedPosition = nodeExtent
? clampPosition(internals.positionAbsolute, nodeExtent)
? clampPosition(internals.positionAbsolute, nodeExtent, node.measured, origin)
: internals.positionAbsolute;
const hasPointerEvents = isSelectable || isDraggable || onClick || onMouseEnter || onMouseMove || onMouseLeave;
+7 -2
View File
@@ -278,10 +278,15 @@ const createStore = ({
triggerEdgeChanges(edgeChanges);
},
setNodeExtent: (nodeExtent) => {
const { nodeLookup } = get();
const { nodeLookup, nodeOrigin } = get();
for (const [, node] of nodeLookup) {
const positionAbsolute = clampPosition(node.internals.positionAbsolute, nodeExtent);
const positionAbsolute = clampPosition(
node.internals.positionAbsolute,
nodeExtent,
node.measured,
node.origin ?? nodeOrigin
);
nodeLookup.set(node.id, {
...node,
+8 -3
View File
@@ -16,9 +16,14 @@ import { getNodePositionWithOrigin, isInternalNodeBase } from './graph';
export const clamp = (val: number, min = 0, max = 1): number => Math.min(Math.max(val, min), max);
export const clampPosition = (position: XYPosition = { x: 0, y: 0 }, extent: CoordinateExtent) => ({
x: clamp(position.x, extent[0][0], extent[1][0]),
y: clamp(position.y, extent[0][1], extent[1][1]),
export const clampPosition = (
position: XYPosition = { x: 0, y: 0 },
extent: CoordinateExtent,
dimensions: Partial<Dimensions>,
origin: NodeOrigin
) => ({
x: clamp(position.x, extent[0][0], extent[1][0] - (dimensions?.width ?? 0) * origin[0]),
y: clamp(position.y, extent[0][1], extent[1][1] - (dimensions?.height ?? 0) * origin[1]),
});
/**
+1 -1
View File
@@ -346,7 +346,7 @@ export function calculateNodePosition<NodeType extends NodeBase>({
}
const positionAbsolute = isCoordinateExtent(currentExtent)
? clampPosition(nextPosition, currentExtent)
? clampPosition(nextPosition, currentExtent, node.measured, origin)
: nextPosition;
return {