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
+15 -2
View File
@@ -3,7 +3,18 @@ import dagre from 'dagre'
import initialElements from './initial-elements' import initialElements from './initial-elements'
import './layouting.css' 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() const dagreGraph = new dagre.graphlib.Graph()
dagreGraph.setDefaultEdgeLabel(() => ({})) dagreGraph.setDefaultEdgeLabel(() => ({}))
@@ -42,6 +53,7 @@ const onLayout = (direction: string) => {
return el return el
}) })
console.log(elements.value)
} }
</script> </script>
<template> <template>
@@ -49,9 +61,10 @@ const onLayout = (direction: string) => {
<Flow <Flow
:elements="elements" :elements="elements"
:node-extent="nodeExtent" :node-extent="nodeExtent"
:connection-mode="ConnectionMode.Loose"
@connect="onConnect" @connect="onConnect"
@clements-remove="onElementsRemove" @clements-remove="onElementsRemove"
@load="() => onLayout('LR')" @load="() => onLayout('TB')"
> >
<Controls /> <Controls />
</Flow> </Flow>
+14 -14
View File
@@ -21,20 +21,6 @@ hooks.connect.on((connection) => {
hooks.edgeUpdate.trigger({ edge: props.edge, 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) => { const onEdgeClick = (event: MouseEvent) => {
if (store.elementsSelectable) { if (store.elementsSelectable) {
store.unsetNodesSelection() store.unsetNodesSelection()
@@ -92,6 +78,20 @@ const isVisible = ({ sourceX, sourceY, targetX, targetY }: ReturnType<typeof get
: true : 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 // when connection type is loose we can define all handles as sources
const targetNodeHandles = computed(() => const targetNodeHandles = computed(() =>
store.connectionMode === ConnectionMode.Strict store.connectionMode === ConnectionMode.Strict
+14 -8
View File
@@ -1,6 +1,5 @@
<script lang="ts" setup> <script lang="ts" setup>
import { DraggableEventListener } from '@braks/revue-draggable' import { DraggableEventListener } from '@braks/revue-draggable'
import { watchPostEffect } from 'vue'
import { Node, NodeType, SnapGrid } from '~/types' import { Node, NodeType, SnapGrid } from '~/types'
import { NodeIdContextKey } from '~/context' import { NodeIdContextKey } from '~/context'
import { useHooks, useStore } from '~/composables' import { useHooks, useStore } from '~/composables'
@@ -45,11 +44,8 @@ const onSelectNodeHandler = (event: MouseEvent) => {
if (selectable) { if (selectable) {
store.unsetNodesSelection() store.unsetNodesSelection()
if (!props.selected) { if (!props.selected) store.addSelectedElements([n])
store.addSelectedElements([n])
}
} }
hooks.nodeClick.trigger({ event, node: n }) hooks.nodeClick.trigger({ event, node: n })
} }
} }
@@ -61,9 +57,7 @@ const onDragStart: DraggableEventListener = ({ event }) => {
if (props.selectNodesOnDrag && selectable) { if (props.selectNodesOnDrag && selectable) {
store.unsetNodesSelection() store.unsetNodesSelection()
if (!props.selected) { if (!props.selected) store.addSelectedElements([n])
store.addSelectedElements([n])
}
} else if (!props.selectNodesOnDrag && !props.selected && selectable) { } else if (!props.selectNodesOnDrag && !props.selected && selectable) {
store.unsetNodesSelection() store.unsetNodesSelection()
store.addSelectedElements([]) 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> </script>
<template> <template>
+1 -1
View File
@@ -129,7 +129,7 @@ const init = (opts: typeof props) => {
onBeforeUnmount(() => store?.$dispose()) onBeforeUnmount(() => store?.$dispose())
watch(props, (val) => init(val)) watch(props, (val) => init(val))
onMounted(() => init(props)) init(props)
const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes }) const nodeTypes = createNodeTypes({ ...defaultNodeTypes, ...props.nodeTypes })
const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes }) const edgeTypes = createEdgeTypes({ ...defaultEdgeTypes, ...props.edgeTypes })