feat(core): add flag to removeNodes to remove children of a node
This commit is contained in:
@@ -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
|
let nodesToRemove = nodes instanceof Function ? nodes(state.nodes) : nodes
|
||||||
nodesToRemove = Array.isArray(nodesToRemove) ? nodesToRemove : [nodesToRemove]
|
nodesToRemove = Array.isArray(nodesToRemove) ? nodesToRemove : [nodesToRemove]
|
||||||
|
|
||||||
const nodeChanges: NodeRemoveChange[] = []
|
const nodeChanges: NodeRemoveChange[] = []
|
||||||
const edgeChanges: EdgeRemoveChange[] = []
|
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) => {
|
nodesToRemove.forEach((item) => {
|
||||||
const currNode = typeof item === 'string' ? findNode(item) : item
|
const currNode = typeof item === 'string' ? findNode(item) : item
|
||||||
|
|
||||||
@@ -527,14 +556,11 @@ export function useActions(
|
|||||||
nodeChanges.push(createRemoveChange(currNode.id))
|
nodeChanges.push(createRemoveChange(currNode.id))
|
||||||
|
|
||||||
if (removeConnectedEdges) {
|
if (removeConnectedEdges) {
|
||||||
const connections = getConnectedEdges([currNode], state.edges).filter((edge) => {
|
createEdgeRemovalChanges([currNode])
|
||||||
if (isDef(edge.deletable)) {
|
}
|
||||||
return edge.deletable
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
|
|
||||||
edgeChanges.push(...connections.map((connection) => createRemoveChange(connection.id)))
|
if (removeChildren) {
|
||||||
|
createChildrenRemovalChanges(currNode.id)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,7 @@ export type AddNodes = (nodes: Node | Node[] | ((nodes: GraphNode[]) => Node | N
|
|||||||
export type RemoveNodes = (
|
export type RemoveNodes = (
|
||||||
nodes: (string | Node) | (Node | string)[] | ((nodes: GraphNode[]) => (string | Node) | (Node | string)[]),
|
nodes: (string | Node) | (Node | string)[] | ((nodes: GraphNode[]) => (string | Node) | (Node | string)[]),
|
||||||
removeConnectedEdges?: boolean,
|
removeConnectedEdges?: boolean,
|
||||||
|
removeChildren?: boolean,
|
||||||
) => void
|
) => void
|
||||||
|
|
||||||
export type RemoveEdges = (
|
export type RemoveEdges = (
|
||||||
@@ -209,7 +210,7 @@ export interface Actions extends ViewportFunctions {
|
|||||||
addNodes: AddNodes
|
addNodes: AddNodes
|
||||||
/** parses edges and adds to state */
|
/** parses edges and adds to state */
|
||||||
addEdges: AddEdges
|
addEdges: AddEdges
|
||||||
/** remove nodes (and possibly connected edges) from state */
|
/** remove nodes (and possibly connected edges and children) from state */
|
||||||
removeNodes: RemoveNodes
|
removeNodes: RemoveNodes
|
||||||
/** remove edges from state */
|
/** remove edges from state */
|
||||||
removeEdges: RemoveEdges
|
removeEdges: RemoveEdges
|
||||||
|
|||||||
Reference in New Issue
Block a user