299 lines
7.3 KiB
Java
299 lines
7.3 KiB
Java
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; |