projects/rebirth-ng/src/lib/tree-view/tree-view.service.ts
        
| appendNodes | |||||||||||||||
appendNodes(treeData: any[], valueField: any, parentId: , nodes: any[])
                     | 
                |||||||||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                any
                             | 
                
| checkAllNodes | ||||||
checkAllNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                void
                             | 
                
| collapseAllNodes | ||||||
collapseAllNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                void
                             | 
                
| expendAllNodes | ||||||
expendAllNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                void
                             | 
                
| expendNodesByLevel | |||||||||
expendNodesByLevel(treeData: any[], level: number)
                     | 
                |||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                void
                             | 
                
| expendNodesByValue | 
expendNodesByValue(treeData: any[], valueField: string, value: any)
                     | 
                
| 
                            
                             
                                Returns :      
                                void
                             | 
                
| getCheckedNodes | ||||||
getCheckedNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                {}
                             | 
                
| getFirstMatchedItem | |||||||||
getFirstMatchedItem(treeData: any[], match: (node: any) => void)
                     | 
                |||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                any
                             | 
                
| getMatchedItems | |||||||||
getMatchedItems(treeData: any[], match: (node: any) => void)
                     | 
                |||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                {}
                             | 
                
| getNodePathByValue | 
getNodePathByValue(treeData: any[], valueField: string, value: any)
                     | 
                
| 
                            
                             
                                Returns :      
                                any
                             | 
                
| getSelectNodes | ||||||
getSelectNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                {}
                             | 
                
| getTreeNodeByValue | 
getTreeNodeByValue(treeData: any[], valueField: string, value: any)
                     | 
                
| 
                            
                             
                                Returns :      
                                any
                             | 
                
| Private innerGetFirstMatchedItem | ||||||||||||
                            
                        innerGetFirstMatchedItem(parent: , items: any[], match: (node: any) => void)
                     | 
                ||||||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                any
                             | 
                
| Private innerGetMatchedItems | ||||||||||||
                            
                        innerGetMatchedItems(parent: , items: any[], match: (node: any) => void)
                     | 
                ||||||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                {}
                             | 
                
| Private innerLookNode | ||||||||||||
                            
                        innerLookNode(parent: , items: any[], action: (node: any,parent: any) => void)
                     | 
                ||||||||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                {}
                             | 
                
| removeNode | 
removeNode(treeData: any[], valueField: string, value: any)
                     | 
                
| 
                            
                             
                                Returns :      
                                any
                             | 
                
| unCheckAllNodes | ||||||
unCheckAllNodes(treeData: any[])
                     | 
                ||||||
| 
                             
                                    Parameters :
                                     
                            
 
                                Returns :      
                                void
                             | 
                
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class TreeViewService {
  getSelectNodes(treeData: any[]) {
    return this.innerGetMatchedItems(null, treeData, (node) => node.$select);
  }
  getCheckedNodes(treeData: any[]) {
    return this.innerGetMatchedItems(null, treeData, (node) => node.$check);
  }
  getMatchedItems(treeData: any[], match: (node: any) => boolean) {
    return this.innerGetMatchedItems(null, treeData, match);
  }
  getFirstMatchedItem(treeData: any[], match: (node: any) => boolean) {
    return this.innerGetFirstMatchedItem(null, treeData, match);
  }
  getTreeNodeByValue(treeData: any[], valueField: string, value: any) {
    return this.innerGetFirstMatchedItem(null, treeData, (node) => node[valueField] === value);
  }
  expendNodesByLevel(treeData: any[], level: number) {
    if (!treeData || !level) {
      return;
    }
    treeData.forEach((nodeItem) => {
      nodeItem.$expend = true;
      this.expendNodesByLevel(nodeItem.children, level - 1);
    });
  }
  expendNodesByValue(treeData: any[], valueField: string, value: any) {
    const paths = this.getNodePathByValue(treeData, valueField, value);
    if (paths) {
      paths.forEach((nodeItem) => nodeItem.$expend = true);
    }
  }
  getNodePathByValue(treeData: any[], valueField: string, value: any) {
    if (!treeData) {
      return;
    }
    for (let i = 0; i < treeData.length; i++) {
      const nodeItem = treeData[i];
      if (nodeItem[valueField] === value) {
        return [nodeItem];
      }
      const matchNode = this.getNodePathByValue(nodeItem.children, valueField, value);
      if (matchNode && matchNode.length) {
        return [nodeItem, ...matchNode];
      }
    }
  }
  expendAllNodes(treeData: any[]) {
    this.innerLookNode(null, treeData, (node) => {
      node.$expend = true;
    });
  }
  collapseAllNodes(treeData: any[]) {
    this.innerLookNode(null, treeData, (node) => {
      node.$expend = false;
    });
  }
  checkAllNodes(treeData: any[]) {
    this.innerLookNode(null, treeData, (node) => {
      node.$check = true;
    });
  }
  unCheckAllNodes(treeData: any[]) {
    this.innerLookNode(null, treeData, (node) => {
      node.$check = false;
    });
  }
  appendNodes(treeData: any[], valueField: any, parentId, nodes: any[]) {
    if (parentId) {
      const parentNode = this.getTreeNodeByValue(treeData, valueField, parentId);
      parentNode.node.children = parentNode.node.children || [];
      parentNode.node.children.push(...nodes);
      return parentNode;
    }
    treeData.push(...nodes);
  }
  removeNode(treeData: any[], valueField: string, value: any) {
    const node = this.getTreeNodeByValue(treeData, valueField, value);
    if (node.parent) {
      node.parent.children = node.parent.children.filter((nodeItem) => nodeItem[valueField] !== value);
    } else {
      const index = treeData.indexOf(node.node);
      if (index !== -1) {
        treeData.splice(index, 1);
      }
    }
    return node;
  }
  private innerLookNode(parent, items: any[], action: (node: any, parent: any) => void) {
    if (!items) {
      return;
    }
    const nodes = [];
    items.forEach((nodeItem) => {
      action(nodeItem, parent);
      this.innerLookNode(nodeItem, nodeItem.children, action);
    });
    return nodes;
  }
  private innerGetMatchedItems(parent, items: any[], match: (node: any) => boolean) {
    if (!items) {
      return [];
    }
    const nodes = [];
    items.forEach((nodeItem) => {
      if (match(nodeItem)) {
        nodes.push({ node: nodeItem, parent: parent });
      }
      nodes.push(...this.innerGetMatchedItems(nodeItem, nodeItem.children, match));
    });
    return nodes;
  }
  private innerGetFirstMatchedItem(parent, items: any[], match: (node: any) => boolean) {
    if (!items) {
      return;
    }
    for (let i = 0; i < items.length; i++) {
      const nodeItem = items[i];
      if (match(nodeItem)) {
        return { node: nodeItem, parent: parent };
      }
      const matchNode = this.innerGetFirstMatchedItem(nodeItem, nodeItem.children, match);
      if (matchNode) {
        return matchNode;
      }
    }
  }
}