feat: Extend ValidConnectionFunc

# What's changed?

* Add current edges, sourceNode & targetNode as parameter to valid connection func, so we can possibly prevent new connections based on current elements
This commit is contained in:
Braks
2022-04-13 22:48:23 +02:00
parent 2eacdc9830
commit 2d43806523
2 changed files with 33 additions and 18 deletions
+27 -17
View File
@@ -1,6 +1,6 @@
import useVueFlow from './useVueFlow' import useVueFlow from './useVueFlow'
import { getHostForElement } from '~/utils' import { getHostForElement } from '~/utils'
import { Connection, ConnectionMode, HandleType, Store, ValidConnectionFunc } from '~/types' import { Connection, ConnectionMode, Getters, GraphEdge, HandleType, Store, ValidConnectionFunc } from '~/types'
type Result = { type Result = {
elementBelow: Element | null elementBelow: Element | null
@@ -18,6 +18,8 @@ export const checkElementBelowIsValid = (
handleId: string | null, handleId: string | null,
isValidConnection: ValidConnectionFunc, isValidConnection: ValidConnectionFunc,
doc: Document, doc: Document,
edges: GraphEdge[],
getNode: Getters['getNode'],
) => { ) => {
const elementBelow = doc.elementFromPoint(event.clientX, event.clientY) const elementBelow = doc.elementFromPoint(event.clientX, event.clientY)
const elementBelowIsTarget = elementBelow?.classList.contains('target') || false const elementBelowIsTarget = elementBelow?.classList.contains('target') || false
@@ -40,22 +42,24 @@ export const checkElementBelowIsValid = (
if (isValid) { if (isValid) {
const elementBelowNodeId = elementBelow.getAttribute('data-nodeid') ?? '' const elementBelowNodeId = elementBelow.getAttribute('data-nodeid') ?? ''
const elementBelowHandleId = elementBelow.getAttribute('data-handleid') ?? '' const elementBelowHandleId = elementBelow.getAttribute('data-handleid') ?? ''
const connection: Connection = isTarget
? { const sourceId = isTarget ? elementBelowNodeId : nodeId
source: elementBelowNodeId, const sourceHandleId = isTarget ? elementBelowHandleId : handleId
sourceHandle: elementBelowHandleId, const targetId = isTarget ? nodeId : elementBelowNodeId
target: nodeId, const targetHandleId = isTarget ? handleId : elementBelowHandleId
targetHandle: handleId,
} const connection: Connection = {
: { source: sourceId,
source: nodeId, sourceHandle: sourceHandleId,
sourceHandle: handleId, target: targetId,
target: elementBelowNodeId, targetHandle: targetHandleId,
targetHandle: elementBelowHandleId, }
}
result.connection = connection result.connection = connection
result.isValid = isValidConnection(connection) || !result.connection.target || !result.connection.source result.isValid =
isValidConnection(connection, { edges, sourceNode: getNode(sourceId)!, targetNode: getNode(targetId)! }) ||
!result.connection.target ||
!result.connection.source
} }
} }
@@ -124,6 +128,8 @@ export default (store: Store = useVueFlow().store) => {
handleId, handleId,
validConnectFunc, validConnectFunc,
doc, doc,
store.edges,
store.getNode,
) )
if (!isHoveringHandle) return resetRecentHandle(recentHoveredHandle) if (!isHoveringHandle) return resetRecentHandle(recentHoveredHandle)
@@ -146,14 +152,16 @@ export default (store: Store = useVueFlow().store) => {
handleId, handleId,
validConnectFunc, validConnectFunc,
doc, doc,
store.edges,
store.getNode,
) )
store.hooks.connectStop.trigger(event) store.hooks.connectStop.trigger(event)
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
if (isValid && !isOwnHandle) { if (isValid && !isOwnHandle) {
if (!onEdgeUpdate) store.hooks.connect.trigger(connection) store.hooks.connect.trigger(connection)
else onEdgeUpdate(connection) onEdgeUpdate?.(connection)
} }
store.hooks.connectEnd.trigger(event) store.hooks.connectEnd.trigger(event)
@@ -204,6 +212,8 @@ export default (store: Store = useVueFlow().store) => {
store.connectionStartHandle.handleId || null, store.connectionStartHandle.handleId || null,
validConnectFunc, validConnectFunc,
doc, doc,
store.edges,
store.getNode,
) )
const isOwnHandle = connection.source === connection.target const isOwnHandle = connection.source === connection.target
+6 -1
View File
@@ -1,5 +1,7 @@
import { Dimensions, Position, XYPosition } from './flow' import { Dimensions, Position, XYPosition } from './flow'
import { Connection } from './connection' import { Connection } from './connection'
import { GraphEdge } from './edge'
import { GraphNode } from './node'
export type HandleType = 'source' | 'target' export type HandleType = 'source' | 'target'
@@ -15,7 +17,10 @@ export interface StartHandle {
} }
/** 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 */
export type ValidConnectionFunc = (connection: Connection) => boolean export type ValidConnectionFunc = (
connection: Connection,
elements: { edges: GraphEdge[]; sourceNode: GraphNode; targetNode: GraphNode },
) => boolean
export interface HandleProps { export interface HandleProps {
/** Unique id of handle element */ /** Unique id of handle element */