|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
|   | 
|   | 
| /** | 
|  * AUTO-GENERATED FILE. DO NOT MODIFY. | 
|  */ | 
|   | 
| /* | 
| * Licensed to the Apache Software Foundation (ASF) under one | 
| * or more contributor license agreements.  See the NOTICE file | 
| * distributed with this work for additional information | 
| * regarding copyright ownership.  The ASF licenses this file | 
| * to you under the Apache License, Version 2.0 (the | 
| * "License"); you may not use this file except in compliance | 
| * with the License.  You may obtain a copy of the License at | 
| * | 
| *   http://www.apache.org/licenses/LICENSE-2.0 | 
| * | 
| * Unless required by applicable law or agreed to in writing, | 
| * software distributed under the License is distributed on an | 
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
| * KIND, either express or implied.  See the License for the | 
| * specific language governing permissions and limitations | 
| * under the License. | 
| */ | 
|   | 
| /** | 
|  * Tree data structure | 
|  */ | 
| import * as zrUtil from 'zrender/lib/core/util.js'; | 
| import linkSeriesData from './helper/linkSeriesData.js'; | 
| import SeriesData from './SeriesData.js'; | 
| import prepareSeriesDataSchema from './helper/createDimensions.js'; | 
| import { convertOptionIdName } from '../util/model.js'; | 
|   | 
| var TreeNode = | 
| /** @class */ | 
| function () { | 
|   function TreeNode(name, hostTree) { | 
|     this.depth = 0; | 
|     this.height = 0; | 
|     /** | 
|      * Reference to list item. | 
|      * Do not persistent dataIndex outside, | 
|      * besause it may be changed by list. | 
|      * If dataIndex -1, | 
|      * this node is logical deleted (filtered) in list. | 
|      */ | 
|   | 
|     this.dataIndex = -1; | 
|     this.children = []; | 
|     this.viewChildren = []; | 
|     this.isExpand = false; | 
|     this.name = name || ''; | 
|     this.hostTree = hostTree; | 
|   } | 
|   /** | 
|    * The node is removed. | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.isRemoved = function () { | 
|     return this.dataIndex < 0; | 
|   }; | 
|   | 
|   TreeNode.prototype.eachNode = function (options, cb, context) { | 
|     if (zrUtil.isFunction(options)) { | 
|       context = cb; | 
|       cb = options; | 
|       options = null; | 
|     } | 
|   | 
|     options = options || {}; | 
|   | 
|     if (zrUtil.isString(options)) { | 
|       options = { | 
|         order: options | 
|       }; | 
|     } | 
|   | 
|     var order = options.order || 'preorder'; | 
|     var children = this[options.attr || 'children']; | 
|     var suppressVisitSub; | 
|     order === 'preorder' && (suppressVisitSub = cb.call(context, this)); | 
|   | 
|     for (var i = 0; !suppressVisitSub && i < children.length; i++) { | 
|       children[i].eachNode(options, cb, context); | 
|     } | 
|   | 
|     order === 'postorder' && cb.call(context, this); | 
|   }; | 
|   /** | 
|    * Update depth and height of this subtree. | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.updateDepthAndHeight = function (depth) { | 
|     var height = 0; | 
|     this.depth = depth; | 
|   | 
|     for (var i = 0; i < this.children.length; i++) { | 
|       var child = this.children[i]; | 
|       child.updateDepthAndHeight(depth + 1); | 
|   | 
|       if (child.height > height) { | 
|         height = child.height; | 
|       } | 
|     } | 
|   | 
|     this.height = height + 1; | 
|   }; | 
|   | 
|   TreeNode.prototype.getNodeById = function (id) { | 
|     if (this.getId() === id) { | 
|       return this; | 
|     } | 
|   | 
|     for (var i = 0, children = this.children, len = children.length; i < len; i++) { | 
|       var res = children[i].getNodeById(id); | 
|   | 
|       if (res) { | 
|         return res; | 
|       } | 
|     } | 
|   }; | 
|   | 
|   TreeNode.prototype.contains = function (node) { | 
|     if (node === this) { | 
|       return true; | 
|     } | 
|   | 
|     for (var i = 0, children = this.children, len = children.length; i < len; i++) { | 
|       var res = children[i].contains(node); | 
|   | 
|       if (res) { | 
|         return res; | 
|       } | 
|     } | 
|   }; | 
|   /** | 
|    * @param includeSelf Default false. | 
|    * @return order: [root, child, grandchild, ...] | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.getAncestors = function (includeSelf) { | 
|     var ancestors = []; | 
|     var node = includeSelf ? this : this.parentNode; | 
|   | 
|     while (node) { | 
|       ancestors.push(node); | 
|       node = node.parentNode; | 
|     } | 
|   | 
|     ancestors.reverse(); | 
|     return ancestors; | 
|   }; | 
|   | 
|   TreeNode.prototype.getAncestorsIndices = function () { | 
|     var indices = []; | 
|     var currNode = this; | 
|   | 
|     while (currNode) { | 
|       indices.push(currNode.dataIndex); | 
|       currNode = currNode.parentNode; | 
|     } | 
|   | 
|     indices.reverse(); | 
|     return indices; | 
|   }; | 
|   | 
|   TreeNode.prototype.getDescendantIndices = function () { | 
|     var indices = []; | 
|     this.eachNode(function (childNode) { | 
|       indices.push(childNode.dataIndex); | 
|     }); | 
|     return indices; | 
|   }; | 
|   | 
|   TreeNode.prototype.getValue = function (dimension) { | 
|     var data = this.hostTree.data; | 
|     return data.getStore().get(data.getDimensionIndex(dimension || 'value'), this.dataIndex); | 
|   }; | 
|   | 
|   TreeNode.prototype.setLayout = function (layout, merge) { | 
|     this.dataIndex >= 0 && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge); | 
|   }; | 
|   /** | 
|    * @return {Object} layout | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.getLayout = function () { | 
|     return this.hostTree.data.getItemLayout(this.dataIndex); | 
|   }; // @depcrecated | 
|   // getModel<T = unknown, S extends keyof T = keyof T>(path: S): Model<T[S]> | 
|   // eslint-disable-next-line @typescript-eslint/no-unused-vars | 
|   | 
|   | 
|   TreeNode.prototype.getModel = function (path) { | 
|     if (this.dataIndex < 0) { | 
|       return; | 
|     } | 
|   | 
|     var hostTree = this.hostTree; | 
|     var itemModel = hostTree.data.getItemModel(this.dataIndex); | 
|     return itemModel.getModel(path); | 
|   }; // TODO: TYPE More specific model | 
|   | 
|   | 
|   TreeNode.prototype.getLevelModel = function () { | 
|     return (this.hostTree.levelModels || [])[this.depth]; | 
|   }; | 
|   | 
|   TreeNode.prototype.setVisual = function (key, value) { | 
|     this.dataIndex >= 0 && this.hostTree.data.setItemVisual(this.dataIndex, key, value); | 
|   }; | 
|   /** | 
|    * Get item visual | 
|    * FIXME: make return type better | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.getVisual = function (key) { | 
|     return this.hostTree.data.getItemVisual(this.dataIndex, key); | 
|   }; | 
|   | 
|   TreeNode.prototype.getRawIndex = function () { | 
|     return this.hostTree.data.getRawIndex(this.dataIndex); | 
|   }; | 
|   | 
|   TreeNode.prototype.getId = function () { | 
|     return this.hostTree.data.getId(this.dataIndex); | 
|   }; | 
|   /** | 
|    * index in parent's children | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.getChildIndex = function () { | 
|     if (this.parentNode) { | 
|       var children = this.parentNode.children; | 
|   | 
|       for (var i = 0; i < children.length; ++i) { | 
|         if (children[i] === this) { | 
|           return i; | 
|         } | 
|       } | 
|   | 
|       return -1; | 
|     } | 
|   | 
|     return -1; | 
|   }; | 
|   /** | 
|    * if this is an ancestor of another node | 
|    * | 
|    * @param node another node | 
|    * @return if is ancestor | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.isAncestorOf = function (node) { | 
|     var parent = node.parentNode; | 
|   | 
|     while (parent) { | 
|       if (parent === this) { | 
|         return true; | 
|       } | 
|   | 
|       parent = parent.parentNode; | 
|     } | 
|   | 
|     return false; | 
|   }; | 
|   /** | 
|    * if this is an descendant of another node | 
|    * | 
|    * @param node another node | 
|    * @return if is descendant | 
|    */ | 
|   | 
|   | 
|   TreeNode.prototype.isDescendantOf = function (node) { | 
|     return node !== this && node.isAncestorOf(this); | 
|   }; | 
|   | 
|   return TreeNode; | 
| }(); | 
|   | 
| export { TreeNode }; | 
| ; | 
|   | 
| var Tree = | 
| /** @class */ | 
| function () { | 
|   function Tree(hostModel) { | 
|     this.type = 'tree'; | 
|     this._nodes = []; | 
|     this.hostModel = hostModel; | 
|   } | 
|   | 
|   Tree.prototype.eachNode = function (options, cb, context) { | 
|     this.root.eachNode(options, cb, context); | 
|   }; | 
|   | 
|   Tree.prototype.getNodeByDataIndex = function (dataIndex) { | 
|     var rawIndex = this.data.getRawIndex(dataIndex); | 
|     return this._nodes[rawIndex]; | 
|   }; | 
|   | 
|   Tree.prototype.getNodeById = function (name) { | 
|     return this.root.getNodeById(name); | 
|   }; | 
|   /** | 
|    * Update item available by list, | 
|    * when list has been performed options like 'filterSelf' or 'map'. | 
|    */ | 
|   | 
|   | 
|   Tree.prototype.update = function () { | 
|     var data = this.data; | 
|     var nodes = this._nodes; | 
|   | 
|     for (var i = 0, len = nodes.length; i < len; i++) { | 
|       nodes[i].dataIndex = -1; | 
|     } | 
|   | 
|     for (var i = 0, len = data.count(); i < len; i++) { | 
|       nodes[data.getRawIndex(i)].dataIndex = i; | 
|     } | 
|   }; | 
|   /** | 
|    * Clear all layouts | 
|    */ | 
|   | 
|   | 
|   Tree.prototype.clearLayouts = function () { | 
|     this.data.clearItemLayouts(); | 
|   }; | 
|   /** | 
|    * data node format: | 
|    * { | 
|    *     name: ... | 
|    *     value: ... | 
|    *     children: [ | 
|    *         { | 
|    *             name: ... | 
|    *             value: ... | 
|    *             children: ... | 
|    *         }, | 
|    *         ... | 
|    *     ] | 
|    * } | 
|    */ | 
|   | 
|   | 
|   Tree.createTree = function (dataRoot, hostModel, beforeLink) { | 
|     var tree = new Tree(hostModel); | 
|     var listData = []; | 
|     var dimMax = 1; | 
|     buildHierarchy(dataRoot); | 
|   | 
|     function buildHierarchy(dataNode, parentNode) { | 
|       var value = dataNode.value; | 
|       dimMax = Math.max(dimMax, zrUtil.isArray(value) ? value.length : 1); | 
|       listData.push(dataNode); | 
|       var node = new TreeNode(convertOptionIdName(dataNode.name, ''), tree); | 
|       parentNode ? addChild(node, parentNode) : tree.root = node; | 
|   | 
|       tree._nodes.push(node); | 
|   | 
|       var children = dataNode.children; | 
|   | 
|       if (children) { | 
|         for (var i = 0; i < children.length; i++) { | 
|           buildHierarchy(children[i], node); | 
|         } | 
|       } | 
|     } | 
|   | 
|     tree.root.updateDepthAndHeight(0); | 
|     var dimensions = prepareSeriesDataSchema(listData, { | 
|       coordDimensions: ['value'], | 
|       dimensionsCount: dimMax | 
|     }).dimensions; | 
|     var list = new SeriesData(dimensions, hostModel); | 
|     list.initData(listData); | 
|     beforeLink && beforeLink(list); | 
|     linkSeriesData({ | 
|       mainData: list, | 
|       struct: tree, | 
|       structAttr: 'tree' | 
|     }); | 
|     tree.update(); | 
|     return tree; | 
|   }; | 
|   | 
|   return Tree; | 
| }(); | 
| /** | 
|  * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, | 
|  * so this function is not ready and not necessary to be public. | 
|  */ | 
|   | 
|   | 
| function addChild(child, node) { | 
|   var children = node.children; | 
|   | 
|   if (child.parentNode === node) { | 
|     return; | 
|   } | 
|   | 
|   children.push(child); | 
|   child.parentNode = node; | 
| } | 
|   | 
| export default Tree; |