/* * 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(path: S): Model // 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;