Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/funny-turkeys-give.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@vue-flow/core': minor
---

Add option to enable/disable replacing edge id when `updateEdge` action is used
3 changes: 2 additions & 1 deletion packages/core/src/store/actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,8 @@ export function useActions(state: State, getters: ComputedGetters): Actions {
state.hooks.edgesChange.trigger(changes)
}

const updateEdge: Actions['updateEdge'] = (oldEdge, newConnection) => updateEdgeAction(oldEdge, newConnection, state.edges)
const updateEdge: Actions['updateEdge'] = (oldEdge, newConnection, shouldReplaceId = true) =>
updateEdgeAction(oldEdge, newConnection, state.edges, findEdge, shouldReplaceId)

const applyNodeChanges: Actions['applyNodeChanges'] = (changes) => applyChanges(changes, state.nodes)

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/types/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ export type RemoveEdges = (edges: (Edge[] | string[]) | ((edges: GraphEdge[]) =>

export type AddEdges = (edgesOrConnections: (Edge | Connection)[] | ((edges: GraphEdge[]) => (Edge | Connection)[])) => void

export type UpdateEdge = (oldEdge: GraphEdge, newConnection: Connection) => GraphEdge | false
export type UpdateEdge = (oldEdge: GraphEdge, newConnection: Connection, shouldReplaceId: boolean) => GraphEdge | false

export type SetState = (
state:
Expand Down
21 changes: 16 additions & 5 deletions packages/core/src/utils/store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,45 @@ export function addEdgeToStore(edgeParams: Edge | Connection, edges: Edge[]) {

let edge
if (isEdge(edgeParams)) {
edge = { ...edgeParams }
edge = edgeParams
} else {
edge = {
...edgeParams,
id: getEdgeId(edgeParams),
} as Edge
}

edge = parseEdge(edge)

if (connectionExists(edge, edges)) return false

return edge
}

export function updateEdgeAction(edge: GraphEdge, newConnection: Connection, edges: GraphEdge[]) {
export function updateEdgeAction(
edge: GraphEdge,
newConnection: Connection,
edges: GraphEdge[],
findEdge: Actions['findEdge'],
shouldReplaceId: boolean,
) {
if (!newConnection.source || !newConnection.target) {
warn("Can't create new edge. An edge needs a source and a target.")
return false
}

const foundEdge = edges.find((e) => isGraphEdge(e) && e.id === edge.id)
const foundEdge = findEdge(edge.id)

if (!foundEdge) {
warn(`The old edge with id=${edge.id} does not exist.`)
return false
}

const { id, ...rest } = edge

const newEdge = {
...edge,
id: getEdgeId(newConnection),
...rest,
id: shouldReplaceId ? getEdgeId(newConnection) : id,
source: newConnection.source,
target: newConnection.target,
sourceHandle: newConnection.sourceHandle,
Expand Down