update: define emittable events for EdgeWrapper
* add onEdgeUpdateEnd callback to useHandle Signed-off-by: Braks <78412429+bcakmakoglu@users.noreply.github.com>
This commit is contained in:
@@ -1,7 +1,16 @@
|
|||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { CSSProperties } from 'vue'
|
import { CSSProperties } from 'vue'
|
||||||
import { useHandle, useStore } from '../../composables'
|
import { useHandle, useStore } from '../../composables'
|
||||||
import { ArrowHeadType, ConnectionMode, Edge, EdgeTextProps, ElementId, SourceTargetNode, Position } from '../../types'
|
import {
|
||||||
|
ArrowHeadType,
|
||||||
|
ConnectionMode,
|
||||||
|
Edge,
|
||||||
|
EdgeTextProps,
|
||||||
|
ElementId,
|
||||||
|
SourceTargetNode,
|
||||||
|
Position,
|
||||||
|
FlowEvents,
|
||||||
|
} from '../../types'
|
||||||
import { isEdge, getEdgePositions, getHandle } from '../../utils'
|
import { isEdge, getEdgePositions, getHandle } from '../../utils'
|
||||||
import EdgeAnchor from './EdgeAnchor.vue'
|
import EdgeAnchor from './EdgeAnchor.vue'
|
||||||
|
|
||||||
@@ -40,7 +49,20 @@ interface EdgeWrapper {
|
|||||||
selectable?: boolean
|
selectable?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface EdgeEvents {
|
||||||
|
(event: 'mouseEnter', data: FlowEvents['edgeMouseEnter']): void
|
||||||
|
(event: 'mouseMove', data: FlowEvents['edgeMouseMove']): void
|
||||||
|
(event: 'mouseLeave', data: FlowEvents['edgeMouseLeave']): void
|
||||||
|
(event: 'contextMenu', data: FlowEvents['edgeContextMenu']): void
|
||||||
|
(event: 'click', data: FlowEvents['edgeClick']): void
|
||||||
|
(event: 'dblClick', data: FlowEvents['edgeDoubleClick']): void
|
||||||
|
(event: 'updateStart', data: FlowEvents['edgeUpdateStart']): void
|
||||||
|
(event: 'update', data: FlowEvents['edgeUpdate']): void
|
||||||
|
(event: 'updateEnd', data: FlowEvents['edgeUpdateEnd']): void
|
||||||
|
}
|
||||||
|
|
||||||
const props = withDefaults(defineProps<EdgeWrapper>(), {})
|
const props = withDefaults(defineProps<EdgeWrapper>(), {})
|
||||||
|
const emit = defineEmits<EdgeEvents>()
|
||||||
|
|
||||||
const store = useStore()
|
const store = useStore()
|
||||||
|
|
||||||
@@ -48,22 +70,40 @@ const updating = ref<boolean>(false)
|
|||||||
const handler = useHandle()
|
const handler = useHandle()
|
||||||
|
|
||||||
const onEdgeClick = (event: MouseEvent) => {
|
const onEdgeClick = (event: MouseEvent) => {
|
||||||
|
const data = { event, edge: props.edge }
|
||||||
if (store.elementsSelectable) {
|
if (store.elementsSelectable) {
|
||||||
store.unsetNodesSelection()
|
store.unsetNodesSelection()
|
||||||
store.addSelectedElements([props.edge])
|
store.addSelectedElements([props.edge])
|
||||||
}
|
}
|
||||||
|
emit('click', data)
|
||||||
|
store.hooks.edgeClick.trigger(data)
|
||||||
store.hooks.elementClick.trigger({ event, element: props.edge })
|
store.hooks.elementClick.trigger({ event, element: props.edge })
|
||||||
store.hooks.edgeClick.trigger({ event, edge: props.edge })
|
|
||||||
}
|
}
|
||||||
const onEdgeContextMenu = (event: MouseEvent) =>
|
const onEdgeContextMenu = (event: MouseEvent) => {
|
||||||
store.hooks.edgeContextMenu.trigger({
|
const data = { event, edge: props.edge }
|
||||||
event,
|
emit('contextMenu', data)
|
||||||
edge: props.edge,
|
store.hooks.edgeContextMenu.trigger(data)
|
||||||
})
|
}
|
||||||
const onDoubleClick = (event: MouseEvent) => store.hooks.edgeDoubleClick.trigger({ event, edge: props.edge })
|
const onDoubleClick = (event: MouseEvent) => {
|
||||||
const onEdgeMouseEnter = (event: MouseEvent) => store.hooks.edgeMouseEnter.trigger({ event, edge: props.edge })
|
const data = { event, edge: props.edge }
|
||||||
const onEdgeMouseMove = (event: MouseEvent) => store.hooks.edgeMouseMove.trigger({ event, edge: props.edge })
|
emit('dblClick', data)
|
||||||
const onEdgeMouseLeave = (event: MouseEvent) => store.hooks.edgeMouseLeave.trigger({ event, edge: props.edge })
|
store.hooks.edgeDoubleClick.trigger(data)
|
||||||
|
}
|
||||||
|
const onEdgeMouseEnter = (event: MouseEvent) => {
|
||||||
|
const data = { event, edge: props.edge }
|
||||||
|
emit('mouseEnter', data)
|
||||||
|
store.hooks.edgeMouseEnter.trigger({ event, edge: props.edge })
|
||||||
|
}
|
||||||
|
const onEdgeMouseMove = (event: MouseEvent) => {
|
||||||
|
const data = { event, edge: props.edge }
|
||||||
|
emit('mouseMove', data)
|
||||||
|
store.hooks.edgeMouseMove.trigger(data)
|
||||||
|
}
|
||||||
|
const onEdgeMouseLeave = (event: MouseEvent) => {
|
||||||
|
const data = { event, edge: props.edge }
|
||||||
|
emit('mouseLeave', data)
|
||||||
|
store.hooks.edgeMouseLeave.trigger(data)
|
||||||
|
}
|
||||||
const onEdgeUpdaterMouseEnter = () => (updating.value = true)
|
const onEdgeUpdaterMouseEnter = () => (updating.value = true)
|
||||||
const onEdgeUpdaterMouseOut = () => (updating.value = false)
|
const onEdgeUpdaterMouseOut = () => (updating.value = false)
|
||||||
const onEdgeUpdaterSourceMouseDown = (event: MouseEvent) => {
|
const onEdgeUpdaterSourceMouseDown = (event: MouseEvent) => {
|
||||||
@@ -79,9 +119,23 @@ const handleEdgeUpdater = (event: MouseEvent, isSourceHandle: boolean) => {
|
|||||||
const isValidConnection = () => true
|
const isValidConnection = () => true
|
||||||
const isTarget = isSourceHandle
|
const isTarget = isSourceHandle
|
||||||
|
|
||||||
|
emit('updateStart', { event, edge: props.edge })
|
||||||
store.hooks.edgeUpdateStart.trigger({ event, edge: props.edge })
|
store.hooks.edgeUpdateStart.trigger({ event, edge: props.edge })
|
||||||
handler(event, handleId, nodeId, isTarget, isValidConnection, isSourceHandle ? 'target' : 'source', (connection) =>
|
handler(
|
||||||
store.hooks.edgeUpdate.trigger({ edge: props.edge, connection }),
|
event,
|
||||||
|
handleId,
|
||||||
|
nodeId,
|
||||||
|
isTarget,
|
||||||
|
isValidConnection,
|
||||||
|
isSourceHandle ? 'target' : 'source',
|
||||||
|
(connection) => {
|
||||||
|
emit('update', { edge: props.edge, connection })
|
||||||
|
store.hooks.edgeUpdate.trigger({ edge: props.edge, connection })
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
emit('updateEnd', event)
|
||||||
|
store.hooks.edgeUpdateEnd.trigger(event)
|
||||||
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,7 @@ export default (store = useStore()) =>
|
|||||||
},
|
},
|
||||||
elementEdgeUpdaterType?: HandleType,
|
elementEdgeUpdaterType?: HandleType,
|
||||||
onEdgeUpdate?: (connection: Connection) => void,
|
onEdgeUpdate?: (connection: Connection) => void,
|
||||||
|
onEdgeUpdateEnd?: () => void,
|
||||||
) => {
|
) => {
|
||||||
const flowNode = (event.target as Element).closest('.vue-flow')
|
const flowNode = (event.target as Element).closest('.vue-flow')
|
||||||
// when vue-flow is used inside a shadow root we can't use document
|
// when vue-flow is used inside a shadow root we can't use document
|
||||||
@@ -152,7 +153,10 @@ export default (store = useStore()) =>
|
|||||||
|
|
||||||
store.hooks.connectEnd.trigger(event)
|
store.hooks.connectEnd.trigger(event)
|
||||||
|
|
||||||
if (elementEdgeUpdaterType) store.hooks.edgeUpdateEnd.trigger(event)
|
if (elementEdgeUpdaterType) {
|
||||||
|
store.hooks.edgeUpdateEnd.trigger(event)
|
||||||
|
onEdgeUpdateEnd?.()
|
||||||
|
}
|
||||||
|
|
||||||
resetRecentHandle(recentHoveredHandle)
|
resetRecentHandle(recentHoveredHandle)
|
||||||
store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined })
|
store.setConnectionNodeId({ connectionNodeId: undefined, connectionHandleId: undefined, connectionHandleType: undefined })
|
||||||
|
|||||||
Reference in New Issue
Block a user