988f19d9c4a54b78ca6c22df04241698b6f13c6b236edb6fd6cd52bb837bff1ef341e2fe4baa02f7c5f6dc60e943262b83d52339d0861f4d57fdf9ad6b783d 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import { isEqual } from 'lodash-unified';
  2. import Node from './node.mjs';
  3. import { isPropAbsent } from '../../../utils/types.mjs';
  4. const flatNodes = (nodes, leafOnly) => {
  5. return nodes.reduce((res, node) => {
  6. if (node.isLeaf) {
  7. res.push(node);
  8. } else {
  9. !leafOnly && res.push(node);
  10. res = res.concat(flatNodes(node.children, leafOnly));
  11. }
  12. return res;
  13. }, []);
  14. };
  15. class Store {
  16. constructor(data, config) {
  17. this.config = config;
  18. const nodes = (data || []).map((nodeData) => new Node(nodeData, this.config));
  19. this.nodes = nodes;
  20. this.allNodes = flatNodes(nodes, false);
  21. this.leafNodes = flatNodes(nodes, true);
  22. }
  23. getNodes() {
  24. return this.nodes;
  25. }
  26. getFlattedNodes(leafOnly) {
  27. return leafOnly ? this.leafNodes : this.allNodes;
  28. }
  29. appendNode(nodeData, parentNode) {
  30. const node = parentNode ? parentNode.appendChild(nodeData) : new Node(nodeData, this.config);
  31. if (!parentNode)
  32. this.nodes.push(node);
  33. this.appendAllNodesAndLeafNodes(node);
  34. }
  35. appendNodes(nodeDataList, parentNode) {
  36. if (nodeDataList.length > 0) {
  37. nodeDataList.forEach((nodeData) => this.appendNode(nodeData, parentNode));
  38. } else {
  39. parentNode && parentNode.isLeaf && this.leafNodes.push(parentNode);
  40. }
  41. }
  42. appendAllNodesAndLeafNodes(node) {
  43. this.allNodes.push(node);
  44. node.isLeaf && this.leafNodes.push(node);
  45. if (node.children) {
  46. node.children.forEach((subNode) => {
  47. this.appendAllNodesAndLeafNodes(subNode);
  48. });
  49. }
  50. }
  51. getNodeByValue(value, leafOnly = false) {
  52. if (isPropAbsent(value))
  53. return null;
  54. const node = this.getFlattedNodes(leafOnly).find((node2) => isEqual(node2.value, value) || isEqual(node2.pathValues, value));
  55. return node || null;
  56. }
  57. getSameNode(node) {
  58. if (!node)
  59. return null;
  60. const node_ = this.getFlattedNodes(false).find(({ value, level }) => isEqual(node.value, value) && node.level === level);
  61. return node_ || null;
  62. }
  63. }
  64. export { Store as default };
  65. //# sourceMappingURL=store.mjs.map