chartx
Version:
Data Visualization Chart Library
365 lines (355 loc) • 15.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
var _canvax = _interopRequireDefault(require("canvax"));
var _index = _interopRequireDefault(require("../relation/index"));
var _dataFrame = _interopRequireDefault(require("../../../core/dataFrame"));
var _tools = require("../../../utils/tools");
var _trigger2 = _interopRequireDefault(require("../../trigger"));
var _data2 = require("../relation/data");
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
var _ = _canvax.default._,
event = _canvax.default.event;
var Rect = _canvax.default.Shapes.Rect;
var Diamond = _canvax.default.Shapes.Diamond;
var Path = _canvax.default.Shapes.Path;
var Circle = _canvax.default.Shapes.Circle;
var Arrow = _canvax.default.Shapes.Arrow;
/**
* 关系图中 包括了 配置,数据,和布局数据,
* 默认用配置和数据可以完成绘图, 但是如果有布局数据,就绘图玩额外调用一次绘图,把布局数据传入修正布局效果
*/
var Tree = /*#__PURE__*/function (_GraphsBase) {
function Tree(opt, app) {
var _this;
(0, _classCallCheck2.default)(this, Tree);
_this = _callSuper(this, Tree, [opt, app]);
_this.type = "tree";
_this.shrinked = []; //所有被设置了收缩的node的key
_.extend(true, _this, (0, _tools.getDefaultProps)(Tree.defaultProps()), opt);
return _this;
}
(0, _inherits2.default)(Tree, _GraphsBase);
return (0, _createClass2.default)(Tree, [{
key: "_initData",
value: function _initData(_data) {
var _this2 = this;
return new Promise(function (resolve) {
if (_data && _data.nodes && _data.edges) {
resolve(_data);
return;
}
;
var data = {
//{ type,key,content,ctype,width,height,x,y }
nodes: [],
//{ type,key[],content,ctype,width,height,x,y }
edges: [],
size: {
width: 0,
height: 0
}
};
var originData = _this2.app._data;
if ((0, _data2.checkDataIsJson)(originData, _this2.field, _this2.childrenField)) {
_this2.jsonData = (0, _data2.jsonToArrayForRelation)(originData, _this2, _this2.childrenField);
_this2.dataFrame = _this2.app.dataFrame = (0, _dataFrame.default)(_this2.jsonData, _this2);
} else {
//源数据就是图表标准数据,只需要转换成json的Children格式
//app.dataFrame.jsonOrg ==> [{name: key:} ...] 不是children的树结构
//this.jsonData = arrayToTreeJsonForRelation(this.app.dataFrame.jsonOrg, this);
//if( this.layout == "tree" ){
//源数据就是图表标准数据,只需要转换成json的Children格式
//app.dataFrame.jsonOrg ==> [{name: key:} ...] 不是children的树结构
_this2.jsonData = (0, _data2.arrayToTreeJsonForRelation)(JSON.parse(JSON.stringify(_this2.app.dataFrame.jsonOrg)), _this2);
//};
}
;
var _setData = function setData(list, parentRowData) {
list.forEach(function (rowData) {
var key = rowData[_this2.field];
var content = _this2._getContent(rowData);
//let preNode = this._preData ? this._preData.nodes.find( item => item.key == key ) : null
var node = _this2._getDefNode();
Object.assign(node, {
type: 'tree',
iNode: rowData.__index__,
rowData: rowData,
key: key,
content: content,
ctype: _this2._checkHtml(content) ? 'html' : 'canvas'
});
node.shapeType = _this2.getProp(_this2.node.shapeType, node);
Object.assign(node, _this2.layoutOpts.node);
data.nodes.push(node);
//如果有parent,那么就还有连线需要处理
if (parentRowData) {
//edge在relation中也是一个标准的node数据结构
var edgeKey = [parentRowData[_this2.field], rowData[_this2.field]];
//let preEdge = this._preData ? this._preData.edges.find( item => item.key.join(',') == edgeKey.join(',') ) : null
var edge = _this2._getDefNode();
var edgeFilter = {};
edgeFilter[_this2.field] = edgeKey.join(',');
var edgeRowDatas = _this2.dataFrame.getRowDataOf(edgeFilter);
if (edgeRowDatas && edgeRowDatas.length) {
//edgeRowData
var edgeRowData = edgeRowDatas[0];
var edgeContent = _this2._getContent(edgeRowData);
Object.assign(edge, {
type: 'tree',
iNode: edgeRowData.__index__,
rowData: edgeRowData,
key: edgeKey,
content: edgeContent,
ctype: _this2._checkHtml(edgeContent) ? 'html' : 'canvas'
});
edge.shapeType = _this2.getProp(_this2.line.shapeType, edge);
Object.assign(edge, _this2.layoutOpts.edge);
data.edges.push(edge);
}
}
;
if (rowData.children && _this2.shrinked.indexOf(key) == -1) {
_setData(rowData.children, rowData);
}
;
});
};
_setData(_this2.jsonData);
_this2._initAllDataSize(data).then(function (data) {
resolve(data);
});
});
}
}, {
key: "_drawNodes",
value: function _drawNodes() {
var _this3 = this;
var me = this;
_.each(this.data.nodes, function (node) {
_this3._drawNode(node);
//shrink
if (_this3.node.shrink.enabled) {
if (node.rowData.children && node.rowData.children.length) {
var iconId = node.key + "_shrink_icon";
var iconBackId = node.key + "_shrink_icon_back";
var charCode = _this3.node.shrink.openCharCode;
if (_this3.shrinked.indexOf(node.key) == -1) {
charCode = _this3.node.shrink.closeCharCode;
}
;
var iconText = String.fromCharCode(parseInt(_this3.getProp(charCode, node), 16));
var fontSize = _this3.getProp(_this3.node.shrink.fontSize, node);
var fontColor = _this3.getProp(_this3.node.shrink.fontColor, node);
var fontFamily = _this3.getProp(_this3.node.shrink.fontFamily, node);
var offsetX = _this3.getProp(_this3.node.shrink.offsetX, node);
var offsetY = _this3.getProp(_this3.node.shrink.offsetY, node);
var tipsContent = _this3.getProp(_this3.node.shrink.tipsContent, node);
var background = _this3.getProp(_this3.node.shrink.background, node);
var lineWidth = _this3.getProp(_this3.node.shrink.lineWidth, node);
var strokeStyle = _this3.getProp(_this3.node.shrink.strokeStyle, node);
var _shrinkIcon = _this3.labelsSp.getChildById(iconId);
var _shrinkIconBack = _this3.labelsSp.getChildById(iconBackId);
var x = parseInt(node.x + node.width / 2 + offsetX);
var y = parseInt(node.y + offsetY);
//shrinkIcon的 位置默认为左右方向的xy
var shrinkCtx = {
x: x,
y: y + 1,
fontSize: fontSize,
fontFamily: fontFamily,
fillStyle: fontColor,
textAlign: "center",
textBaseline: "middle",
cursor: 'pointer'
};
var _shrinkBackCtx = {
x: x,
y: y,
r: parseInt(fontSize * 0.5) + 2,
fillStyle: background,
strokeStyle: strokeStyle,
lineWidth: lineWidth
};
if (_shrinkIcon) {
_shrinkIcon.resetText(iconText);
Object.assign(_shrinkIcon.context, shrinkCtx);
Object.assign(_shrinkIconBack.context, _shrinkBackCtx);
} else {
_shrinkIcon = new _canvax.default.Display.Text(iconText, {
id: iconId,
context: shrinkCtx
});
_shrinkIconBack = new Circle({
id: iconBackId,
context: _shrinkBackCtx
});
_this3.labelsSp.addChild(_shrinkIconBack);
_this3.labelsSp.addChild(_shrinkIcon);
_shrinkIcon._shrinkIconBack = _shrinkIconBack;
_shrinkIcon.on(event.types.get(), function (e) {
var trigger = _this3.node.shrink;
e.eventInfo = {
trigger: trigger,
tipsContent: tipsContent,
nodes: [] //node
};
//下面的这个就只在鼠标环境下有就好了
if (_shrinkIconBack.context) {
if (e.type == 'mousedown') {
_shrinkIconBack.context.r += 1;
}
if (e.type == 'mouseup') {
_shrinkIconBack.context.r -= 1;
}
}
;
if (_this3.node.shrink.triggerEventType.indexOf(e.type) > -1) {
if (_this3.shrinked.indexOf(node.key) == -1) {
_this3.shrinked.push(node.key);
} else {
for (var i = 0, l = _this3.shrinked.length; i < l; i++) {
if (_this3.shrinked[i] == node.key) {
_this3.shrinked.splice(i, 1);
i--;
l--;
}
}
}
;
var _trigger = new _trigger2.default(me, {
origin: node.key
});
_this3.app.resetData(null, _trigger);
}
_this3.app.fire(e.type, e);
});
}
;
//TODO: 这个赋值只能在这里处理, 因为resetData的时候, 每次node都是一个新的node数据
//shrinkIcon的引用就断了
_shrinkIcon.nodeData = node;
node.shrinkIcon = _shrinkIcon;
node.shrinkIconBack = _shrinkIconBack;
}
}
});
}
}, {
key: "_destroy",
value: function _destroy(item) {
item.shapeElement && item.shapeElement.destroy();
if (item.contentElement.destroy) {
item.contentElement.destroy();
} else {
//否则就可定是个dom
this.domContainer.removeChild(item.contentElement);
}
;
//下面的几个是销毁edge上面的元素
item.pathElement && item.pathElement.destroy();
item.labelElement && item.labelElement.destroy();
item.arrowElement && item.arrowElement.destroy();
item.edgeIconElement && item.edgeIconElement.destroy();
item.edgeIconBack && item.edgeIconBack.destroy();
//下面两个是tree中独有的
item.shrinkIcon && item.shrinkIcon.destroy();
item.shrinkIconBack && item.shrinkIconBack.destroy();
if (Array.isArray(item.key)) {
//是个edge的话,要检查下源头是不是没有子节点了, 没有子节点了, 还要把shrinkIcon 都干掉
var sourceNode = item.source;
if (!this.data.edges.find(function (item) {
return item.key[0] == sourceNode.key;
})) {
//如歌edges里面还有 targetNode.key 开头的,targetNode 还有子节点, 否则就可以把 targetNode的shrinkIcon去掉
sourceNode.shrinkIcon && sourceNode.shrinkIcon.destroy();
sourceNode.shrinkIconBack && sourceNode.shrinkIconBack.destroy();
}
}
}
}], [{
key: "defaultProps",
value: function defaultProps() {
return {
field: {
detail: 'key字段设置',
documentation: '',
default: null
},
node: {
detail: '单个节点的配置',
propertys: {
shrink: {
detail: '树状图是否有节点收缩按钮',
propertys: {
enabled: {
detail: "是否开启",
default: true
},
triggerEventType: {
detail: '触发事件',
default: 'click,tap'
},
openCharCode: {
detail: "点击后触发展开的icon chartCode,当前状态为收缩",
default: ''
},
closeCharCode: {
detail: "点击后触发收缩的icon chartCode,当前状态为展开",
default: ''
},
fontSize: {
detail: "icon字号大小",
default: 12
},
fontColor: {
detail: "icon字体颜色",
default: '#666'
},
fontFamily: {
detail: "icon在css中的fontFamily",
default: 'iconfont'
},
tipsContent: {
detail: '鼠标移动到收缩icon上面的tips内容',
default: ''
},
offsetX: {
detail: 'x方向偏移量',
default: 10
},
offsetY: {
detail: 'y方向偏移量',
default: 1
},
background: {
detail: 'icon的 背景色',
default: '#fff'
},
lineWidth: {
detail: '边框大小',
default: 1
},
strokeStyle: {
detail: '描边颜色',
default: '#667894'
}
}
}
}
}
};
}
}]);
}(_index.default);
_index.default.registerComponent(Tree, 'graphs', 'tree');
var _default = exports.default = Tree;