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) {
|
const nodes = this.getFlattedNodes(false, !this.config.lazy)
|
.filter(node => (valueEquals(node.path, value) || node.value === value));
|
return nodes && nodes.length ? nodes[0] : null;
|
}
|
}
|