feat(core): add flag to removeNodes to remove children of a node

This commit is contained in:
braks
2023-07-24 22:10:50 +02:00
committed by Braks
parent bc2de7254a
commit c4acb0d0f6
2 changed files with 36 additions and 9 deletions

View File

@@ -506,13 +506,42 @@ export function useActions(
}
}
const removeNodes: Actions['removeNodes'] = (nodes, removeConnectedEdges = true) => {
const removeNodes: Actions['removeNodes'] = (nodes, removeConnectedEdges = true, removeChildren = false) => {
let nodesToRemove = nodes instanceof Function ? nodes(state.nodes) : nodes
nodesToRemove = Array.isArray(nodesToRemove) ? nodesToRemove : [nodesToRemove]
const nodeChanges: NodeRemoveChange[] = []
const edgeChanges: EdgeRemoveChange[] = []
function createEdgeRemovalChanges(nodes: Node[]) {
const connections = getConnectedEdges(nodes, state.edges).filter((edge) => {
if (isDef(edge.deletable)) {
return edge.deletable
}
return true
})
edgeChanges.push(...connections.map((connection) => createRemoveChange(connection.id)))
}
// recursively get all children and if the child is a parent, get those children as well until all nodes have been removed that are children of the current node
function createChildrenRemovalChanges(id: string) {
const children = state.nodes.filter((n) => n.parentNode === id)
if (children.length) {
const childIds = children.map((n) => n.id)
nodeChanges.push(...childIds.map((id) => createRemoveChange(id)))
if (removeConnectedEdges) {
createEdgeRemovalChanges(children)
}
children.forEach((child) => {
createChildrenRemovalChanges(child.id)
})
}
}
nodesToRemove.forEach((item) => {
const currNode = typeof item === 'string' ? findNode(item) : item
@@ -527,14 +556,11 @@ export function useActions(
nodeChanges.push(createRemoveChange(currNode.id))
if (removeConnectedEdges) {
const connections = getConnectedEdges([currNode], state.edges).filter((edge) => {
if (isDef(edge.deletable)) {
return edge.deletable
}
return true
})
createEdgeRemovalChanges([currNode])
}
edgeChanges.push(...connections.map((connection) => createRemoveChange(connection.id)))
if (removeChildren) {
createChildrenRemovalChanges(currNode.id)
}
})

View File

@@ -155,6 +155,7 @@ export type AddNodes = (nodes: Node | Node[] | ((nodes: GraphNode[]) => Node | N
export type RemoveNodes = (
nodes: (string | Node) | (Node | string)[] | ((nodes: GraphNode[]) => (string | Node) | (Node | string)[]),
removeConnectedEdges?: boolean,
removeChildren?: boolean,
) => void
export type RemoveEdges = (
@@ -209,7 +210,7 @@ export interface Actions extends ViewportFunctions {
addNodes: AddNodes
/** parses edges and adds to state */
addEdges: AddEdges
/** remove nodes (and possibly connected edges) from state */
/** remove nodes (and possibly connected edges and children) from state */
removeNodes: RemoveNodes
/** remove edges from state */
removeEdges: RemoveEdges