refactor(edges,store): emit connection events start and end with actions

This commit is contained in:
braks
2022-10-07 22:55:38 +02:00
committed by Braks
parent a443d38f12
commit 7a657f141a
9 changed files with 24 additions and 41 deletions
@@ -18,7 +18,6 @@ const elements = ref([
const onLoad = (flowInstance) => flowInstance.fitView() const onLoad = (flowInstance) => flowInstance.fitView()
const onConnectStart = ({ nodeId, handleType }) => console.log('on connect start', { nodeId, handleType }) const onConnectStart = ({ nodeId, handleType }) => console.log('on connect start', { nodeId, handleType })
const onConnectStop = (event) => console.log('on connect stop', event)
const onConnectEnd = (event) => console.log('on connect end', event) const onConnectEnd = (event) => console.log('on connect end', event)
const onConnect = (params) => { const onConnect = (params) => {
@@ -34,7 +33,6 @@ const onConnect = (params) => {
@connect="onConnect" @connect="onConnect"
@pane-ready="onLoad" @pane-ready="onLoad"
@connect-start="onConnectStart" @connect-start="onConnectStart"
@connect-stop="onConnectStop"
@connect-end="onConnectEnd" @connect-end="onConnectEnd"
> >
<template #node-custominput="props"> <template #node-custominput="props">
@@ -19,7 +19,6 @@ const { nodes, edges, addEdges } = useVueFlow({
}) })
const onLoad = (flowInstance: VueFlowStore) => flowInstance.fitView() const onLoad = (flowInstance: VueFlowStore) => flowInstance.fitView()
const onConnectStart = ({ nodeId, handleType }: OnConnectStartParams) => console.log('on connect start', { nodeId, handleType }) const onConnectStart = ({ nodeId, handleType }: OnConnectStartParams) => console.log('on connect start', { nodeId, handleType })
const onConnectStop = (event: MouseEvent) => console.log('on connect stop', event)
const onConnectEnd = (event: MouseEvent) => console.log('on connect end', event) const onConnectEnd = (event: MouseEvent) => console.log('on connect end', event)
const onConnect = (params: Connection) => { const onConnect = (params: Connection) => {
@@ -35,7 +34,6 @@ const onConnect = (params: Connection) => {
@connect="onConnect" @connect="onConnect"
@pane-ready="onLoad" @pane-ready="onLoad"
@connect-start="onConnectStart" @connect-start="onConnectStart"
@connect-stop="onConnectStop"
@connect-end="onConnectEnd" @connect-end="onConnectEnd"
> >
<template #node-custominput="props"> <template #node-custominput="props">
+4 -15
View File
@@ -83,7 +83,6 @@ export default () => {
startConnection, startConnection,
updateConnection, updateConnection,
endConnection, endConnection,
setState,
getNode, getNode,
vueFlowRef, vueFlowRef,
} = $(useVueFlow()) } = $(useVueFlow())
@@ -133,10 +132,9 @@ export default () => {
x: event.clientX - containerBounds.left, x: event.clientX - containerBounds.left,
y: event.clientY - containerBounds.top, y: event.clientY - containerBounds.top,
}, },
event,
) )
emits.connectStart({ event, nodeId, handleId, handleType })
function onMouseMove(event: MouseEvent) { function onMouseMove(event: MouseEvent) {
updateConnection({ updateConnection({
x: event.clientX - containerBounds.left, x: event.clientX - containerBounds.left,
@@ -179,8 +177,6 @@ export default () => {
getNode, getNode,
) )
emits.connectStop(event)
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
if (isValid && !isOwnHandle) { if (isValid && !isOwnHandle) {
@@ -188,13 +184,11 @@ export default () => {
else onEdgeUpdate(connection) else onEdgeUpdate(connection)
} }
emits.connectEnd(event)
if (elementEdgeUpdaterType) onEdgeUpdateEnd?.() if (elementEdgeUpdaterType) onEdgeUpdateEnd?.()
resetRecentHandle(recentHoveredHandle) resetRecentHandle(recentHoveredHandle)
endConnection() endConnection(event)
doc.removeEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject) doc.removeEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject)
doc.removeEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject) doc.removeEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject)
@@ -213,8 +207,7 @@ export default () => {
) => { ) => {
if (!connectOnClick) return if (!connectOnClick) return
if (!connectionStartHandle) { if (!connectionStartHandle) {
emits.connectStart({ event, nodeId, handleId, handleType }) startConnection({ nodeId, type: handleType, handleId }, undefined, event)
setState({ connectionStartHandle: { nodeId, type: handleType, handleId } })
} else { } else {
let validConnectFunc: ValidConnectionFunc = isValidConnection ?? (() => true) let validConnectFunc: ValidConnectionFunc = isValidConnection ?? (() => true)
@@ -242,13 +235,9 @@ export default () => {
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
emits.connectStop(event)
if (isValid && !isOwnHandle) emits.connect(connection) if (isValid && !isOwnHandle) emits.connect(connection)
emits.connectEnd(event) endConnection(event)
setState({ connectionStartHandle: null })
} }
} }
@@ -64,11 +64,10 @@ const emit = defineEmits<{
( (
event: 'connectStart', event: 'connectStart',
connectionEvent: { connectionEvent: {
event: MouseEvent event?: MouseEvent
} & OnConnectStartParams, } & OnConnectStartParams,
): void ): void
(event: 'connectStop', connectionEvent: MouseEvent): void (event: 'connectEnd', connectionEvent?: MouseEvent): void
(event: 'connectEnd', connectionEvent: MouseEvent): void
(event: 'moveStart', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void (event: 'moveStart', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void
(event: 'move', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void (event: 'move', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void
(event: 'moveEnd', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void (event: 'moveEnd', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void
+12 -3
View File
@@ -358,18 +358,27 @@ export default (state: State, getters: ComputedGetters): Actions => {
const applyEdgeChanges: Actions['applyEdgeChanges'] = (changes) => applyChanges(changes, state.edges) const applyEdgeChanges: Actions['applyEdgeChanges'] = (changes) => applyChanges(changes, state.edges)
const startConnection: Actions['startConnection'] = (startHandle, position) => { const startConnection: Actions['startConnection'] = (startHandle, position, event) => {
state.connectionStartHandle = startHandle state.connectionStartHandle = startHandle
state.connectionPosition = position
if (position) state.connectionPosition = position
state.hooks.connectStart.trigger({
event,
nodeId: startHandle.nodeId,
handleId: startHandle.handleId,
handleType: startHandle.type,
})
} }
const updateConnection: Actions['updateConnection'] = (position) => { const updateConnection: Actions['updateConnection'] = (position) => {
state.connectionPosition = position state.connectionPosition = position
} }
const endConnection: Actions['endConnection'] = () => { const endConnection: Actions['endConnection'] = (event) => {
state.connectionPosition = { x: NaN, y: NaN } state.connectionPosition = { x: NaN, y: NaN }
state.connectionStartHandle = null state.connectionStartHandle = null
state.hooks.connectEnd.trigger(event)
} }
const setState: Actions['setState'] = (options) => { const setState: Actions['setState'] = (options) => {
-1
View File
@@ -21,7 +21,6 @@ export const createHooks = (): FlowHooks => ({
miniMapNodeMouseLeave: createEventHook(), miniMapNodeMouseLeave: createEventHook(),
connect: createEventHook(), connect: createEventHook(),
connectStart: createEventHook(), connectStart: createEventHook(),
connectStop: createEventHook(),
connectEnd: createEventHook(), connectEnd: createEventHook(),
paneReady: createEventHook(), paneReady: createEventHook(),
move: createEventHook(), move: createEventHook(),
+1 -1
View File
@@ -13,7 +13,7 @@ export interface HandleElement extends XYPosition, Dimensions {
export interface StartHandle { export interface StartHandle {
nodeId: string nodeId: string
type: HandleType type: HandleType
handleId?: string | null handleId: string | null
} }
/** A valid connection function can determine if an attempted connection is valid or not, i.e. abort creating a new edge */ /** A valid connection function can determine if an attempted connection is valid or not, i.e. abort creating a new edge */
+2 -4
View File
@@ -52,10 +52,9 @@ export interface FlowEvents {
miniMapNodeMouseLeave: NodeMouseEvent miniMapNodeMouseLeave: NodeMouseEvent
connect: Connection connect: Connection
connectStart: { connectStart: {
event: MouseEvent event?: MouseEvent
} & OnConnectStartParams } & OnConnectStartParams
connectStop: MouseEvent connectEnd: MouseEvent | undefined
connectEnd: MouseEvent
paneReady: VueFlowStore paneReady: VueFlowStore
move: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform } move: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }
moveStart: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform } moveStart: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }
@@ -120,7 +119,6 @@ export interface Emits {
event: MouseEvent event: MouseEvent
} & OnConnectStartParams, } & OnConnectStartParams,
): void ): void
(event: 'connectStop', connectionEvent: MouseEvent): void
(event: 'connectEnd', connectionEvent: MouseEvent): void (event: 'connectEnd', connectionEvent: MouseEvent): void
(event: 'moveStart', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void (event: 'moveStart', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void
(event: 'move', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void (event: 'move', moveEvent: { event: D3ZoomEvent<HTMLDivElement, any>; flowTransform: ViewpaneTransform }): void
+3 -10
View File
@@ -8,7 +8,7 @@ import type { CoordinateExtent, GraphNode, Node } from './node'
import type { D3Selection, D3Zoom, D3ZoomHandler, PanOnScrollMode, Viewport, ViewportFunctions } from './zoom' import type { D3Selection, D3Zoom, D3ZoomHandler, PanOnScrollMode, Viewport, ViewportFunctions } from './zoom'
import type { CustomEvent, FlowHooks, FlowHooksEmit, FlowHooksOn } from './hooks' import type { CustomEvent, FlowHooks, FlowHooksEmit, FlowHooksOn } from './hooks'
import type { EdgeChange, NodeChange, NodeDragItem } from './changes' import type { EdgeChange, NodeChange, NodeDragItem } from './changes'
import type { HandleType, StartHandle } from './handle' import type { StartHandle } from './handle'
export interface UpdateNodeDimensionsParams { export interface UpdateNodeDimensionsParams {
id: string id: string
@@ -16,13 +16,6 @@ export interface UpdateNodeDimensionsParams {
forceUpdate?: boolean forceUpdate?: boolean
} }
export interface StartConnectionParams {
connectionPosition: XYPosition
connectionNodeId: string
connectionHandleId: string | null
connectionHandleType: HandleType
}
export interface State extends Omit<FlowOptions, 'id' | 'modelValue'> { export interface State extends Omit<FlowOptions, 'id' | 'modelValue'> {
/** Vue flow element ref */ /** Vue flow element ref */
vueFlowRef: HTMLDivElement | null vueFlowRef: HTMLDivElement | null
@@ -195,11 +188,11 @@ export interface Actions extends ViewportFunctions {
/** force update node internal data, if handle bounds are incorrect, you might want to use this */ /** force update node internal data, if handle bounds are incorrect, you might want to use this */
updateNodeInternals: UpdateNodeInternals updateNodeInternals: UpdateNodeInternals
/** start a connection */ /** start a connection */
startConnection: (startHandle: StartHandle, position: XYPosition) => void startConnection: (startHandle: StartHandle, position?: XYPosition, event?: MouseEvent) => void
/** update connection position */ /** update connection position */
updateConnection: (position: XYPosition) => void updateConnection: (position: XYPosition) => void
/** end (or cancel) a connection */ /** end (or cancel) a connection */
endConnection: () => void endConnection: (event?: MouseEvent) => void
/** internal position updater, you probably don't want to use this */ /** internal position updater, you probably don't want to use this */
updateNodePositions: UpdateNodePosition updateNodePositions: UpdateNodePosition