feat(nodes): allow connected edges to be removed with removeNodes

This commit is contained in:
bcakmakoglu
2022-06-07 18:33:00 +02:00
committed by Braks
parent a86eded793
commit f434ab0f79
4 changed files with 29 additions and 15 deletions
@@ -94,7 +94,6 @@ export default (models: ToRefs<Pick<FlowProps, 'nodes' | 'edges' | 'modelValue'>
if (pauseStore) pauseStore.pause() if (pauseStore) pauseStore.pause()
if (pauseModel) pauseModel.pause() if (pauseModel) pauseModel.pause()
console.log('watcher', v)
store.setEdges(v) store.setEdges(v)
pauseStore = watchPausable( pauseStore = watchPausable(
+18 -6
View File
@@ -20,6 +20,7 @@ import {
createGraphNodes, createGraphNodes,
createRemoveChange, createRemoveChange,
createSelectionChange, createSelectionChange,
getConnectedEdges,
getDimensions, getDimensions,
getHandleBounds, getHandleBounds,
getSelectionChanges, getSelectionChanges,
@@ -184,8 +185,8 @@ export default (state: State, getters: ComputedGetters): Actions => {
const missingSource = !sourceNode || typeof sourceNode === 'undefined' const missingSource = !sourceNode || typeof sourceNode === 'undefined'
const missingTarget = !targetNode || typeof targetNode === 'undefined' const missingTarget = !targetNode || typeof targetNode === 'undefined'
if (missingSource) console.warn(`[vueflow]: Couldn't create edge for source id: ${edge.source}; edge id: ${edge.id}`) if (missingSource) console.warn(`[vue-flow]: Couldn't create edge for source id: ${edge.source}; edge id: ${edge.id}`)
if (missingTarget) console.warn(`[vueflow]: Couldn't create edge for target id: ${edge.target}; edge id: ${edge.id}`) if (missingTarget) console.warn(`[vue-flow]: Couldn't create edge for target id: ${edge.target}; edge id: ${edge.id}`)
if (missingSource || missingTarget) return res if (missingSource || missingTarget) return res
const storedEdge = getters.getEdge.value(edge.id) const storedEdge = getters.getEdge.value(edge.id)
@@ -257,14 +258,25 @@ export default (state: State, getters: ComputedGetters): Actions => {
if (changes.length) state.hooks.edgesChange.trigger(changes) if (changes.length) state.hooks.edgesChange.trigger(changes)
} }
const removeNodes: Actions['removeNodes'] = (nodes) => { const removeNodes: Actions['removeNodes'] = (nodes, removeConnectedEdges = true) => {
const curr = nodes instanceof Function ? nodes(state.nodes) : nodes const curr = nodes instanceof Function ? nodes(state.nodes) : nodes
const changes: NodeRemoveChange[] = [] const nodeChanges: NodeRemoveChange[] = []
const edgeChanges: EdgeRemoveChange[] = []
curr.forEach((item) => { curr.forEach((item) => {
changes.push(createRemoveChange(typeof item === 'string' ? item : item.id)) nodeChanges.push(createRemoveChange(typeof item === 'string' ? item : item.id))
if (removeConnectedEdges) {
const connections = getConnectedEdges([typeof item === 'string' ? ({ id: item } as any) : item], state.edges)
edgeChanges.push(...connections.map((connection) => createRemoveChange(connection.id)))
}
}) })
state.hooks.nodesChange.trigger(changes) if (nodeChanges.length) {
state.hooks.nodesChange.trigger(nodeChanges)
}
if (edgeChanges.length) {
state.hooks.edgesChange.trigger(edgeChanges)
}
} }
const removeEdges: Actions['removeEdges'] = (edges) => { const removeEdges: Actions['removeEdges'] = (edges) => {
+5 -5
View File
@@ -52,9 +52,9 @@ export default (state: State): ComputedGetters => {
: nodes ?? [] : nodes ?? []
}) })
const edgeHidden = (e: GraphEdge) => { const edgeHidden = (e: GraphEdge, source?: GraphNode, target?: GraphNode) => {
const source = getNode.value(e.source) source = source ?? getNode.value(e.source)
const target = getNode.value(e.target) target = target ?? getNode.value(e.target)
if (!source || !target) { if (!source || !target) {
console.warn(`[vue-flow]: Orphaned edge ${e.id} will be removed.`) console.warn(`[vue-flow]: Orphaned edge ${e.id} will be removed.`)
@@ -75,14 +75,14 @@ export default (state: State): ComputedGetters => {
) )
} }
const getEdges = computed<GraphEdge[]>(() => { const getEdges = computed<GraphEdge[]>(() => {
if (!state.onlyRenderVisibleElements) return state.edges.filter(edgeHidden) if (!state.onlyRenderVisibleElements) return state.edges.filter((edge) => edgeHidden(edge))
return state.edges.filter((e) => { return state.edges.filter((e) => {
const source = getNode.value(e.source)! const source = getNode.value(e.source)!
const target = getNode.value(e.target)! const target = getNode.value(e.target)!
return ( return (
edgeHidden(e) && edgeHidden(e, source, target) &&
isEdgeVisible({ isEdgeVisible({
sourcePos: source.computedPosition || { x: 0, y: 0 }, sourcePos: source.computedPosition || { x: 0, y: 0 },
targetPos: target.computedPosition || { x: 0, y: 0 }, targetPos: target.computedPosition || { x: 0, y: 0 },
+6 -3
View File
@@ -106,7 +106,10 @@ export type SetElements = (elements: Elements | ((elements: FlowElements) => Ele
export type SetNodes = (nodes: Node[] | ((nodes: GraphNode[]) => Node[]), extent?: CoordinateExtent) => void export type SetNodes = (nodes: Node[] | ((nodes: GraphNode[]) => Node[]), extent?: CoordinateExtent) => void
export type SetEdges = (edges: Edge[] | ((edges: GraphEdge[]) => Edge[])) => void export type SetEdges = (edges: Edge[] | ((edges: GraphEdge[]) => Edge[])) => void
export type AddNodes = (nodes: Node[] | ((nodes: GraphNode[]) => Node[]), extent?: CoordinateExtent) => void export type AddNodes = (nodes: Node[] | ((nodes: GraphNode[]) => Node[]), extent?: CoordinateExtent) => void
export type RemoveNodes = (nodes: (Node[] | string[]) | ((nodes: GraphNode[]) => Node[] | string[])) => void export type RemoveNodes = (
nodes: (Node[] | string[]) | ((nodes: GraphNode[]) => Node[] | string[]),
removeConnectedEdges?: boolean,
) => void
export type RemoveEdges = (edges: (Edge[] | string[]) | ((edges: GraphEdge[]) => Edge[] | string[])) => void export type RemoveEdges = (edges: (Edge[] | string[]) | ((edges: GraphEdge[]) => Edge[] | string[])) => void
export type AddEdges = (edgesOrConnections: (Edge | Connection)[] | ((edges: GraphEdge[]) => (Edge | Connection)[])) => void 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) => GraphEdge | false
@@ -129,9 +132,9 @@ export interface Actions {
addNodes: AddNodes addNodes: AddNodes
/** parses edges and adds to state */ /** parses edges and adds to state */
addEdges: AddEdges addEdges: AddEdges
/** parses nodes and adds to state */ /** remove nodes (and possibly connected edges) from state */
removeNodes: RemoveNodes removeNodes: RemoveNodes
/** parses edges and adds to state */ /** remove edges from state */
removeEdges: RemoveEdges removeEdges: RemoveEdges
/** updates an edge */ /** updates an edge */
updateEdge: UpdateEdge updateEdge: UpdateEdge