290 lines
9.7 KiB
Java
290 lines
9.7 KiB
Java
import { __assign, __extends } from "tslib";
|
||
/**
|
||
* Create By Bruce Too
|
||
* On 2020-02-10
|
||
*/
|
||
import { assign, deepMix, each } from '@antv/util';
|
||
import { DIRECTION, VIEW_LIFE_CIRCLE } from '../constant';
|
||
import { getFactTitleConfig } from '../util/facet';
|
||
import { Facet } from './facet';
|
||
/**
|
||
* @ignore
|
||
* Tree Facet
|
||
*/
|
||
var Tree = /** @class */ (function (_super) {
|
||
__extends(Tree, _super);
|
||
function Tree() {
|
||
var _this = _super !== null && _super.apply(this, arguments) || this;
|
||
_this.afterChartRender = function () {
|
||
if (_this.facets && _this.cfg.line) {
|
||
_this.container.clear();
|
||
_this.drawLines(_this.facets);
|
||
}
|
||
};
|
||
return _this;
|
||
}
|
||
Tree.prototype.afterEachView = function (view, facet) {
|
||
this.processAxis(view, facet);
|
||
};
|
||
Tree.prototype.beforeEachView = function (view, facet) {
|
||
};
|
||
Tree.prototype.init = function () {
|
||
_super.prototype.init.call(this);
|
||
this.view.on(VIEW_LIFE_CIRCLE.AFTER_RENDER, this.afterChartRender);
|
||
};
|
||
Tree.prototype.getDefaultCfg = function () {
|
||
return deepMix({}, _super.prototype.getDefaultCfg.call(this), {
|
||
type: 'tree',
|
||
line: {
|
||
style: {
|
||
lineWidth: 1,
|
||
stroke: '#ddd'
|
||
},
|
||
smooth: false,
|
||
},
|
||
showTitle: true,
|
||
title: _super.prototype.getDefaultTitleCfg.call(this),
|
||
});
|
||
};
|
||
Tree.prototype.generateFacets = function (data) {
|
||
var fields = this.cfg.fields;
|
||
if (!fields.length) {
|
||
throw new Error('Please specify for the fields for rootFacet!');
|
||
}
|
||
var rst = [];
|
||
var rootFacet = {
|
||
type: this.cfg.type,
|
||
data: data,
|
||
region: null,
|
||
rowValuesLength: this.getRows(),
|
||
columnValuesLength: 1,
|
||
rowIndex: 0,
|
||
columnIndex: 0,
|
||
rowField: '',
|
||
columnField: '',
|
||
rowValue: '',
|
||
columnValue: '',
|
||
};
|
||
rst.push(rootFacet);
|
||
rootFacet.children = this.getChildFacets(data, 1, rst);
|
||
this.setRegion(rst);
|
||
return rst;
|
||
};
|
||
Tree.prototype.setRegion = function (facets) {
|
||
var _this = this;
|
||
this.forceColIndex(facets);
|
||
facets.forEach(function (facet) {
|
||
// @ts-ignore 允许调整
|
||
facet.region = _this.getRegion(facet.rowValuesLength, facet.columnValuesLength, facet.columnIndex, facet.rowIndex);
|
||
});
|
||
};
|
||
Tree.prototype.getRegion = function (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
|
||
};
|
||
};
|
||
Tree.prototype.forceColIndex = function (facets) {
|
||
var _this = this;
|
||
var leafs = [];
|
||
var index = 0;
|
||
facets.forEach(function (facet) {
|
||
if (_this.isLeaf(facet)) {
|
||
leafs.push(facet);
|
||
// @ts-ignore 允许调整
|
||
facet.columnIndex = index;
|
||
index++;
|
||
}
|
||
});
|
||
leafs.forEach(function (facet) {
|
||
// @ts-ignore
|
||
facet.columnValuesLength = leafs.length;
|
||
});
|
||
var maxLevel = this.cfg.fields.length;
|
||
for (var i = maxLevel - 1; i >= 0; i--) {
|
||
var levelFacets = this.getFacetsByLevel(facets, i);
|
||
// var yIndex = maxLevel - i;
|
||
for (var _i = 0, levelFacets_1 = levelFacets; _i < levelFacets_1.length; _i++) {
|
||
var facet = levelFacets_1[_i];
|
||
if (!this.isLeaf(facet)) {
|
||
facet.originColIndex = facet.columnIndex;
|
||
// @ts-ignore
|
||
facet.columnIndex = this.getRegionIndex(facet.children);
|
||
// @ts-ignore
|
||
facet.columnValuesLength = leafs.length;
|
||
}
|
||
}
|
||
}
|
||
};
|
||
// get facet use level
|
||
Tree.prototype.getFacetsByLevel = function (facets, level) {
|
||
var rst = [];
|
||
facets.forEach(function (facet) {
|
||
if (facet.rowIndex === level) {
|
||
rst.push(facet);
|
||
}
|
||
});
|
||
return rst;
|
||
};
|
||
// if the facet has children , make it's column index in the middle of it's children
|
||
Tree.prototype.getRegionIndex = function (children) {
|
||
var first = children[0];
|
||
var last = children[children.length - 1];
|
||
return (last.columnIndex - first.columnIndex) / 2 + first.columnIndex;
|
||
};
|
||
// is a leaf without children
|
||
Tree.prototype.isLeaf = function (facet) {
|
||
return !facet.children || !facet.children.length;
|
||
};
|
||
Tree.prototype.getRows = function () {
|
||
return this.cfg.fields.length + 1;
|
||
};
|
||
// get child
|
||
Tree.prototype.getChildFacets = function (data, level, arr) {
|
||
var _this = this;
|
||
// [ 'grade', 'class' ]
|
||
var fields = this.cfg.fields;
|
||
var length = fields.length;
|
||
if (length < level) {
|
||
return;
|
||
}
|
||
var rst = [];
|
||
// get fist level except root node
|
||
var field = fields[level - 1];
|
||
// get field value
|
||
var values = this.getFieldValues(data, field);
|
||
values.forEach(function (value, index) {
|
||
var conditions = [
|
||
{ field: field, value: value, values: values }
|
||
];
|
||
var subData = data.filter(_this.getFacetDataFilter(conditions));
|
||
if (subData.length) {
|
||
var facet = {
|
||
type: _this.cfg.type,
|
||
data: subData,
|
||
region: null,
|
||
columnValue: value,
|
||
rowValue: '',
|
||
columnField: field,
|
||
rowField: '',
|
||
columnIndex: index,
|
||
rowValuesLength: _this.getRows(),
|
||
columnValuesLength: 1,
|
||
rowIndex: level,
|
||
children: _this.getChildFacets(subData, level + 1, arr)
|
||
};
|
||
rst.push(facet);
|
||
arr.push(facet);
|
||
}
|
||
});
|
||
return rst;
|
||
};
|
||
Tree.prototype.render = function () {
|
||
_super.prototype.render.call(this);
|
||
if (this.cfg.showTitle) {
|
||
this.renderTitle();
|
||
}
|
||
};
|
||
Tree.prototype.renderTitle = function () {
|
||
var _this = this;
|
||
each(this.facets, function (facet) {
|
||
var columnValue = facet.columnValue, view = facet.view;
|
||
var config = deepMix({
|
||
position: ['50%', '0%'],
|
||
content: columnValue,
|
||
}, getFactTitleConfig(DIRECTION.TOP), _this.cfg.title);
|
||
view.annotation().text(config);
|
||
});
|
||
};
|
||
Tree.prototype.drawLines = function (facets) {
|
||
var _this = this;
|
||
facets.forEach(function (facet) {
|
||
if (!_this.isLeaf(facet)) {
|
||
var children = facet.children;
|
||
_this.addFacetLines(facet, children);
|
||
}
|
||
});
|
||
};
|
||
// add lines with it's children
|
||
Tree.prototype.addFacetLines = function (facet, children) {
|
||
var _this = this;
|
||
var view = facet.view;
|
||
var region = view.coordinateBBox;
|
||
// top, right, bottom, left
|
||
var start = {
|
||
x: region.x + region.width / 2,
|
||
y: region.y + region.height
|
||
};
|
||
children.forEach(function (subFacet) {
|
||
var subRegion = subFacet.view.coordinateBBox;
|
||
var end = {
|
||
x: subRegion.bl.x + (subRegion.tr.x - subRegion.bl.x) / 2,
|
||
y: subRegion.tr.y
|
||
};
|
||
var middle1 = {
|
||
x: start.x,
|
||
y: start.y + (end.y - start.y) / 2
|
||
};
|
||
var middle2 = {
|
||
x: end.x,
|
||
y: middle1.y
|
||
};
|
||
_this.drawLine([start, middle1, middle2, end]);
|
||
});
|
||
};
|
||
Tree.prototype.getPath = function (points) {
|
||
var path = [];
|
||
var smooth = this.cfg.line.smooth;
|
||
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
|
||
Tree.prototype.drawLine = function (points) {
|
||
var path = this.getPath(points);
|
||
var line = this.cfg.line.style;
|
||
this.container.addShape('path', {
|
||
attrs: assign({
|
||
// @ts-ignore
|
||
path: path
|
||
}, line),
|
||
});
|
||
};
|
||
Tree.prototype.getXAxisOption = function (x, axes, option, facet) {
|
||
if (facet.rowIndex !== facet.rowValuesLength - 1) {
|
||
return __assign(__assign({}, option), { title: null, label: null });
|
||
}
|
||
return option;
|
||
};
|
||
Tree.prototype.getYAxisOption = function (y, axes, option, facet) {
|
||
if (facet.originColIndex !== 0 && facet.columnIndex !== 0) {
|
||
return __assign(__assign({}, option), { title: null, label: null });
|
||
}
|
||
return option;
|
||
};
|
||
return Tree;
|
||
}(Facet));
|
||
export default Tree;
|
||
//# sourceMappingURL=tree.js.map |