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:
@@ -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>
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 })
|
||||||
|
|||||||
Reference in New Issue
Block a user