NuclearDispersionSystem/ant-design-vue-jeecg/node_modules/@antv/g2/lib/facet/tree.js
2023-09-14 14:47:11 +08:00

299 lines
7.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; subClass.__proto__ = superClass; }
/**
* @fileOverview tree facets
* @author dxq613@gmail.com
*/
var Base = require('./base');
var Util = require('../util');
var assign = Util.assign;
var Tree = /*#__PURE__*/function (_Base) {
_inheritsLoose(Tree, _Base);
function Tree() {
return _Base.apply(this, arguments) || this;
}
var _proto = Tree.prototype;
_proto.getDefaultCfg = function getDefaultCfg() {
var cfg = _Base.prototype.getDefaultCfg.call(this);
cfg.type = 'tree';
cfg.line = {
lineWidth: 1,
stroke: '#ddd'
};
cfg.lineSmooth = false;
return cfg;
};
_proto.generateFacets = function generateFacets(data) {
var self = this;
var fields = self.fields;
if (!fields.length) {
throw 'Please specify for the fields for facet!';
}
var rst = [];
var root = self.getRootFacet(data); // if (self.showRoot) {
rst.push(root); // }
root.children = self.getChildFacets(data, 1, rst);
self.setRegion(rst);
return rst;
};
_proto.getRootFacet = function getRootFacet(data) {
var self = this;
var facet = {
type: self.type,
rows: self.getRows(),
rowIndex: 0,
colIndex: 0,
colValue: self.rootTitle,
data: data
};
return facet;
};
_proto.getRows = function getRows() {
return this.fields.length + 1;
} // get child
;
_proto.getChildFacets = function getChildFacets(data, level, arr) {
var self = this;
var fields = self.fields;
var length = fields.length;
if (length < level) {
return;
}
var rst = [];
var field = fields[level - 1];
var values = self.getFieldValues(field, data);
values.forEach(function (value, index) {
var conditions = [{
field: field,
value: value,
values: values
}];
var filter = self.getFilter(conditions);
var subData = data.filter(filter);
if (subData.length) {
var facet = {
type: self.type,
colValue: value,
colField: field,
colIndex: index,
rows: self.getRows(),
rowIndex: level,
data: subData,
children: self.getChildFacets(subData, level + 1, arr)
};
rst.push(facet);
arr.push(facet);
}
});
return rst;
} // 设置 region
;
_proto.setRegion = function setRegion(facets) {
var self = this;
self.forceColIndex(facets);
facets.forEach(function (facet) {
facet.region = self.getRegion(facet.rows, facet.cols, facet.colIndex, facet.rowIndex);
});
} // set column index of facets
;
_proto.forceColIndex = function forceColIndex(facets) {
var self = this;
var leafs = [];
var index = 0;
facets.forEach(function (facet) {
if (self.isLeaf(facet)) {
leafs.push(facet);
facet.colIndex = index;
index++;
}
});
leafs.forEach(function (facet) {
facet.cols = leafs.length;
});
var maxLevel = self.fields.length;
for (var i = maxLevel - 1; i >= 0; i--) {
var levelFacets = self.getFacetsByLevel(facets, i); // var yIndex = maxLevel - i;
for (var j = 0; j < levelFacets.length; j++) {
var facet = levelFacets[j];
if (!self.isLeaf(facet)) {
facet.originColIndex = facet.colIndex;
facet.colIndex = self.getRegionIndex(facet.children);
facet.cols = leafs.length;
}
}
}
} // get facet use level
;
_proto.getFacetsByLevel = function getFacetsByLevel(facets, level) {
var rst = [];
facets.forEach(function (facet) {
if (facet.rowIndex === level) {
rst.push(facet);
}
});
return rst;
} // set facets region
;
_proto.getRegion = function getRegion(rows, cols, xIndex, yIndex) {
var xWidth = 1 / cols; // x轴方向的每个分面的偏移
var yWidth = 1 / rows; // y轴方向的每个分面的偏移
var start = {
x: xWidth * xIndex,
y: yWidth * yIndex
};
var end = {
x: start.x + xWidth,
y: start.y + yWidth * 2 / 3 // 预留1/3的空隙方便添加连接线
};
return {
start: start,
end: end
};
} // if the facet has children , make it's column index in the middle of it's children
;
_proto.getRegionIndex = function getRegionIndex(children) {
var first = children[0];
var last = children[children.length - 1];
return (last.colIndex - first.colIndex) / 2 + first.colIndex;
} // is a leaf without children
;
_proto.isLeaf = function isLeaf(facet) {
return !facet.children || !facet.children.length;
};
_proto.setXAxis = function setXAxis(xField, axes, facet) {
// 当是最后一行或者下面没有 view 时文本不显示
if (facet.rowIndex !== facet.rows - 1) {
axes[xField].label = null;
axes[xField].title = null;
}
} // 设置 y 坐标轴的文本、title 是否显示
;
_proto.setYAxis = function setYAxis(yField, axes, facet) {
if (facet.originColIndex !== 0 && facet.colIndex !== 0) {
axes[yField].title = null;
axes[yField].label = null;
}
} // 绘制完成后
;
_proto.onPaint = function onPaint() {
_Base.prototype.onPaint.call(this);
this.group.clear();
if (this.facets && this.line) {
this.drawLines(this.facets, this.group);
}
};
_proto.drawLines = function drawLines(facets, group) {
var self = this;
var lineGroup = group.addGroup();
facets.forEach(function (facet) {
if (!self.isLeaf(facet)) {
var children = facet.children;
self._addFacetLines(facet, children, lineGroup);
}
});
} // add lines with it's children
;
_proto._addFacetLines = function _addFacetLines(facet, children, group) {
var self = this;
var view = facet.view;
var region = view.getViewRegion();
var start = {
x: region.start.x + (region.end.x - region.start.x) / 2,
y: region.start.y
};
children.forEach(function (subFacet) {
var subRegion = subFacet.view.getViewRegion();
var end = {
x: subRegion.start.x + (subRegion.end.x - subRegion.start.x) / 2,
y: subRegion.end.y
};
var middle1 = {
x: start.x,
y: start.y + (end.y - start.y) / 2
};
var middle2 = {
x: end.x,
y: middle1.y
};
self._drawLine([start, middle1, middle2, end], group);
});
};
_proto._getPath = function _getPath(points) {
var self = this;
var path = [];
var smooth = self.lineSmooth;
if (smooth) {
path.push(['M', points[0].x, points[0].y]);
path.push(['C', points[1].x, points[1].y, points[2].x, points[2].y, points[3].x, points[3].y]);
} else {
points.forEach(function (point, index) {
if (index === 0) {
path.push(['M', point.x, point.y]);
} else {
path.push(['L', point.x, point.y]);
}
});
}
return path;
} // draw line width points
;
_proto._drawLine = function _drawLine(points, group) {
var self = this;
var path = self._getPath(points);
var line = self.line;
group.addShape('path', {
attrs: assign({
path: path
}, line)
});
};
return Tree;
}(Base);
module.exports = Tree;