import Node from './node'; import { coerceTruthyValueToArray, valueEquals } from 'element-ui/src/utils/util'; const flatNodes = (data, leafOnly) => { return data.reduce((res, node) => { if (node.isLeaf) { res.push(node); } else { !leafOnly && res.push(node); res = res.concat(flatNodes(node.children, leafOnly)); } return res; }, []); }; export default class Store { constructor(data, config) { this.config = config; this.initNodes(data); } initNodes(data) { data = coerceTruthyValueToArray(data); this.nodes = data.map(nodeData => new Node(nodeData, this.config)); this.flattedNodes = this.getFlattedNodes(false, false); this.leafNodes = this.getFlattedNodes(true, false); } appendNode(nodeData, parentNode) { const node = new Node(nodeData, this.config, parentNode); const children = parentNode ? parentNode.children : this.nodes; children.push(node); } appendNodes(nodeDataList, parentNode) { nodeDataList = coerceTruthyValueToArray(nodeDataList); nodeDataList.forEach(nodeData => this.appendNode(nodeData, parentNode)); } getNodes() { return this.nodes; } getFlattedNodes(leafOnly, cached = true) { const cachedNodes = leafOnly ? this.leafNodes : this.flattedNodes; return cached ? cachedNodes : flatNodes(this.nodes, leafOnly); } getNodeByValue(value) { if (value) { const nodes = this.getFlattedNodes(false, !this.config.lazy) .filter(node => (valueEquals(node.path, value) || node.value === value)); return nodes && nodes.length ? nodes[0] : null; } return null; } }