fix: node not updating handlebounds when handle pos changes

* watch source & target pos and update node dimensions on next tick
This commit is contained in:
Braks
2021-10-22 08:16:32 +02:00
parent 9532615cfd
commit 26b3901bd5
4 changed files with 44 additions and 25 deletions

View File

@@ -3,7 +3,18 @@ import dagre from 'dagre'
import initialElements from './initial-elements'
import './layouting.css'
import Flow, { Controls, addEdge, Connection, Edge, Elements, isNode, NodeExtent, Position, removeElements } from '~/index'
import Flow, {
Controls,
addEdge,
ConnectionMode,
Connection,
Edge,
Elements,
isNode,
NodeExtent,
Position,
removeElements,
} from '~/index'
const dagreGraph = new dagre.graphlib.Graph()
dagreGraph.setDefaultEdgeLabel(() => ({}))
@@ -42,6 +53,7 @@ const onLayout = (direction: string) => {
return el
})
console.log(elements.value)
}
</script>
<template>
@@ -49,9 +61,10 @@ const onLayout = (direction: string) => {
<Flow
:elements="elements"
:node-extent="nodeExtent"
:connection-mode="ConnectionMode.Loose"
@connect="onConnect"
@clements-remove="onElementsRemove"
@load="() => onLayout('LR')"
@load="() => onLayout('TB')"
>
<Controls />
</Flow>

View File

@@ -21,20 +21,6 @@ hooks.connect.on((connection) => {
hooks.edgeUpdate.trigger({ edge: props.edge, connection })
})
const nodes = computed(() => {
const n = getSourceTargetNodes(props.edge, store.nodes)
if (!n.sourceNode) {
console.warn(`couldn't create edge for source id: ${props.edge.source}; edge id: ${props.edge.id}`)
}
if (!n.targetNode) {
console.warn(`couldn't create edge for target id: ${props.edge.target}; edge id: ${props.edge.id}`)
}
return n
})
const onEdgeClick = (event: MouseEvent) => {
if (store.elementsSelectable) {
store.unsetNodesSelection()
@@ -92,6 +78,20 @@ const isVisible = ({ sourceX, sourceY, targetX, targetY }: ReturnType<typeof get
: true
}
const nodes = computed(() => {
const n = getSourceTargetNodes(props.edge, store.nodes)
if (!n.sourceNode) {
console.warn(`couldn't create edge for source id: ${props.edge.source}; edge id: ${props.edge.id}`)
}
if (!n.targetNode) {
console.warn(`couldn't create edge for target id: ${props.edge.target}; edge id: ${props.edge.id}`)
}
return n
})
// when connection type is loose we can define all handles as sources
const targetNodeHandles = computed(() =>
store.connectionMode === ConnectionMode.Strict

View File

@@ -1,6 +1,5 @@
<script lang="ts" setup>
import { DraggableEventListener } from '@braks/revue-draggable'
import { watchPostEffect } from 'vue'
import { Node, NodeType, SnapGrid } from '~/types'
import { NodeIdContextKey } from '~/context'
import { useHooks, useStore } from '~/composables'
@@ -45,11 +44,8 @@ const onSelectNodeHandler = (event: MouseEvent) => {
if (selectable) {
store.unsetNodesSelection()
if (!props.selected) {
store.addSelectedElements([n])
}
if (!props.selected) store.addSelectedElements([n])
}
hooks.nodeClick.trigger({ event, node: n })
}
}
@@ -61,9 +57,7 @@ const onDragStart: DraggableEventListener = ({ event }) => {
if (props.selectNodesOnDrag && selectable) {
store.unsetNodesSelection()
if (!props.selected) {
store.addSelectedElements([n])
}
if (!props.selected) store.addSelectedElements([n])
} else if (!props.selectNodesOnDrag && !props.selected && selectable) {
store.unsetNodesSelection()
store.addSelectedElements([])
@@ -134,6 +128,18 @@ watch(
})
},
)
watch(
() => props.node.sourcePosition && props.node.targetPosition,
() => {
nextTick(() => {
store.updateNodeDimensions({
id: props.node.id,
nodeElement: nodeElement.value,
forceUpdate: true,
})
})
},
)
</script>
<template>

View File

@@ -129,7 +129,7 @@ const init = (opts: typeof props) => {
onBeforeUnmount(() => store?.$dispose())
watch(props, (val) => init(val))
onMounted(() => init(props))
init(props)
const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes })
const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })