From 7daadfc383b866dac1a90ff56c4be523a2188d08 Mon Sep 17 00:00:00 2001 From: braks <78412429+bcakmakoglu@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:27:39 +0100 Subject: [PATCH] fix(nodes): properly calculate node extent Signed-off-by: braks <78412429+bcakmakoglu@users.noreply.github.com> --- packages/core/src/utils/drag.ts | 44 +++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/core/src/utils/drag.ts b/packages/core/src/utils/drag.ts index 7f9b6309..6e93c208 100644 --- a/packages/core/src/utils/drag.ts +++ b/packages/core/src/utils/drag.ts @@ -1,4 +1,5 @@ import type { Ref } from 'vue' +import { isNumber } from '@vueuse/shared' import type { ComputedGetters, CoordinateExtent, Getters, GraphNode, NodeDragItem, XYPosition } from '~/types' export function hasSelector(target: Element, selector: string, node: Ref): boolean { @@ -59,27 +60,38 @@ export function getEventHandlerParams({ } export function applyExtent(item: T, extent?: CoordinateExtent, parent?: GraphNode) { - const currentExtent = item.extent ?? extent - let nextExtent = currentExtent + let currentExtent = item.extent || extent - if (currentExtent === 'parent' && parent) { - nextExtent = [ - [parent.computedPosition.x, parent.computedPosition.y], - [ - parent.computedPosition.x + parent.dimensions.width - item.dimensions.width, - parent.computedPosition.y + parent.dimensions.height - item.dimensions.height, - ], - ] - } else if (currentExtent !== 'parent' && currentExtent && parent) { - const itemExtent = currentExtent + if (item.extent === 'parent') { + if (item.parentNode && parent && item.dimensions.width && item.dimensions.height) { + currentExtent = + parent && + isNumber(parent.computedPosition.x) && + isNumber(parent.computedPosition.y) && + isNumber(parent.dimensions.width) && + isNumber(parent.dimensions.height) + ? [ + [parent.computedPosition.x + item.dimensions.width, parent.computedPosition.y + item.dimensions.height], + [ + parent.computedPosition.x + parent.dimensions.width - item.dimensions.width + item.dimensions.width, + parent.computedPosition.y + parent.dimensions.height - item.dimensions.height + item.dimensions.height, + ], + ] + : currentExtent + } else { + warn('Only child nodes can use a parent extent.') + + currentExtent = extent + } + } else if (item.extent && parent) { const parentX = parent.computedPosition.x const parentY = parent.computedPosition.y - nextExtent = [ - [itemExtent[0][0] + parentX, itemExtent[0][1] + parentY], - [itemExtent[1][0] + parentX, itemExtent[1][1] + parentY], + currentExtent = [ + [item.extent[0][0] + parentX, item.extent[0][1] + parentY], + [item.extent[1][0] + parentX, item.extent[1][1] + parentY], ] } - return nextExtent as CoordinateExtent + return currentExtent as CoordinateExtent }