UNPKG

chartx

Version:

Data Visualization Chart Library

372 lines (357 loc) 12.4 kB
"use strict"; 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 _group = _interopRequireDefault(require("./group")); var _index = _interopRequireDefault(require("../index")); var _canvax = require("canvax"); var _tools = require("../../../utils/tools"); 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; })(); } //假如用户传入的是和 堆叠柱状图一样的 二维数组的field [ [uv, uv_bottom], pv ] 这样的, //那么就 只保留uv作为field, 第二个数据作为 bottom field, 其他的多余的删除掉 //然后,bottomFieldMap中用field的uv作为key,bottom的field作为值,传给group来绘制起点 var bottomFieldMap = {}; var LineGraphs = /*#__PURE__*/function (_GraphsBase) { function LineGraphs(opt, app) { var _this; (0, _classCallCheck2.default)(this, LineGraphs); _this = _callSuper(this, LineGraphs, [opt, app]); _this.type = "line"; _this.enabledField = null; _this.groups = []; //群组集合 _canvax._.extend(true, _this, (0, _tools.getDefaultProps)(LineGraphs.defaultProps()), opt); _this.init(); return _this; } (0, _inherits2.default)(LineGraphs, _GraphsBase); return (0, _createClass2.default)(LineGraphs, [{ key: "init", value: function init() {} }, { key: "draw", value: function draw(opt) { !opt && (opt = {}); this.width = opt.width; this.height = opt.height; _canvax._.extend(true, this.origin, opt.origin); this.sprite.context.x = this.origin.x; this.sprite.context.y = this.origin.y; this.data = this._trimGraphs(); this._setGroupsForYfield(this.data, null, opt); if (this.animation && !opt.resize) { this.grow(); } else { this.fire("complete"); } return this; } }, { key: "resetData", value: function resetData(dataFrame, dataTrigger, opt) { var me = this; if (dataFrame) { me.dataFrame = dataFrame; } ; if (opt) { if ('origin' in opt) { if ('x' in opt.origin) this.sprite.context.x = opt.origin.x; if ('y' in opt.origin) this.sprite.context.y = opt.origin.y; } } me.data = me._trimGraphs(); me.groups.forEach(function (g) { g.resetData(me.data[g.field].data, dataTrigger, opt); }); } }, { key: "setEnabledField", value: function setEnabledField() { //要根据自己的 field,从enabledFields中根据enabled数据,计算一个 enabled版本的field子集 this.enabledField = this.app.getComponent({ name: 'coord' }).filterEnabledFields(this.field); } //dataFrame }, { key: "_trimGraphs", value: function _trimGraphs() { var me = this; var _coord = this.app.getComponent({ name: 'coord' }); //{"uv":{}.. ,"ppc": "pv":]} //这样按照字段摊平的一维结构 var tmpData = {}; me.setEnabledField(); _canvax._.each(_canvax._.flatten(me.enabledField), function (field, i) { //let maxValue = 0; var fieldConfig = me.app.getComponent({ name: 'coord' }).getFieldConfig(field); //单条line的全部data数据 var _lineData = me.dataFrame.getFieldData(field); if (!_lineData) return; var _graphsData = []; for (var b = 0, bl = _lineData.length; b < bl; b++) { //返回一个和value的结构对应的point结构{x: y: } var point = _coord.getPoint({ iNode: b, field: field, value: { //x: y: _lineData[b] } }); var node = { type: "line", iGroup: i, iNode: b, field: field, value: _lineData[b], x: point.pos.x, y: point.pos.y, rowData: me.dataFrame.getRowDataAt(b), color: fieldConfig.color //默认设置皮肤颜色,动态的在group里面会被修改 }; _graphsData.push(node); } ; tmpData[field] = { yAxis: fieldConfig.yAxis, field: field, data: _graphsData }; }); return tmpData; } /** * 生长动画 */ }, { key: "grow", value: function grow(callback) { var gi = 0; var gl = this.groups.length; var me = this; _canvax._.each(this.groups, function (g) { g._grow(function () { gi++; callback && callback(g); if (gi == gl) { me.fire("complete"); } }); }); return this; } //field 可以是单个 field 也可以是fields数组 }, { key: "show", value: function show(field) { var _this2 = this; //过渡优化,有field的状态变化,可能就y轴的数据区间都有了变化,这里的优化就成了bug,所有的field都需要绘制一次 //这个field不再这个graphs里面的,不相关 // if( _.indexOf( _.flatten( [me.field] ), field ) == -1 ){ // return; // }; this.data = this._trimGraphs(); //先把现有的group resetData this.groups.forEach(function (g) { g.resetData(_this2.data[g.field].data); }); //然后把field添加到groups里面去 var newGroups = this._setGroupsForYfield(this.data, field); newGroups.forEach(function (g) { g._grow(); }); } }, { key: "hide", value: function hide(field) { var me = this; var i = me.getGroupIndex(field); if (i > -1) { this.groups.splice(i, 1)[0].destroy(); //return; //这里不能直接return,和上面的show一样,同样的属于过渡优化,因为这个时候y轴的值域可能变了, 其他的graphs需要重新绘制 } ; if (bottomFieldMap[field]) { var fieldConfig = me.app.getComponent({ name: 'coord' }).getFieldConfig(field); fieldConfig.yAxis.resetSection(); } this.data = this._trimGraphs(); _canvax._.each(this.groups, function (g) { g.resetData(me.data[g.field].data); }); } }, { key: "getGroupIndex", value: function getGroupIndex(field) { var ind = -1; for (var i = 0, l = this.groups.length; i < l; i++) { if (this.groups[i].field === field) { ind = i; break; } } return ind; } }, { key: "getGroup", value: function getGroup(field) { return this.groups[this.getGroupIndex(field)]; } }, { key: "_setGroupsForYfield", value: function _setGroupsForYfield(data, fields, opt) { var me = this; !opt && (opt = {}); if (fields) { //如果有传入field参数,那么就说明只需要从data里面挑选指定的field来添加 //一般用在add()执行的时候 fields = _canvax._.flatten([fields]); } var _flattenField = _canvax._.flatten([this.field]); var newGroups = [], callbacks = []; _canvax._.each(data, function (g, field) { if (fields && _canvax._.indexOf(fields, field) == -1) { //如果有传入fields,但是当前field不在fields里面的话,不需要处理 //说明该group已经在graphs里面了 return; } ; var fieldConfig = me.app.getComponent({ name: 'coord' }).getFieldConfig(field); //iGroup 是这条group在本graphs中的ind,而要拿整个图表层级的index, 就是fieldMap.ind var iGroup = _canvax._.indexOf(_flattenField, field); var group = new _group.default(fieldConfig, iGroup, //不同于fieldMap.ind me._opt, me.ctx, me.height, me.width, me, bottomFieldMap); var insert = false; //在groups数组中插入到比自己_groupInd小的元素前面去 for (var gi = 0, gl = me.groups.length; gi < gl; gi++) { if (iGroup < me.groups[gi].iGroup) { me.groups.splice(gi, 0, group); insert = true; me.sprite.addChildAt(group.sprite, gi); break; } } ; //否则就只需要直接push就好了 if (!insert) { var preGroup = me.groups.find(function (g) { return g.field == group.field; }); if (preGroup) { me.groups.splice(me.groups.indexOf(preGroup), 1); preGroup.destroy(); } me.groups.push(group); me.sprite.addChild(group.sprite); } ; group.draw({ animation: me.animation, isResize: opt.resize }, g.data); newGroups.push(group); var _bottomField = bottomFieldMap[field]; if (_bottomField) { callbacks.push(function () { return fieldConfig.yAxis.addValToSection(me.dataFrame.getFieldData(_bottomField)); }); } }); // 等所有field对应的groups都都添加完之后,再将bottomField的数据添加到y轴,统一执行resetData callbacks.forEach(function (cb) { return cb(); }); return newGroups; } /**获取data中 和 ind 或者最接近的nodeData */ }, { key: "getNodesAt", value: function getNodesAt(ind, e) { var _nodesInfoList = []; //节点信息集合 _canvax._.each(this.groups, function (group) { var node = group.getNodeInfoAt(ind, e); node && _nodesInfoList.push(node); }); return _nodesInfoList; } /**获取x像素位置上的nodeData,如果这个值不在data中,则会构建一个 */ }, { key: "getNodesOfPos", value: function getNodesOfPos(x) { var _nodesInfoList = []; //节点信息集合 _canvax._.each(this.groups, function (group) { var node = group.getNodeInfoOfX(x); node && _nodesInfoList.push(node); }); return _nodesInfoList; } }, { key: "getNodesOfXVal", value: function getNodesOfXVal(xVal) {} }, { key: "tipsPointerOf", value: function tipsPointerOf(e) { this.groups.forEach(function (group) { group.tipsPointerOf(e); }); } }, { key: "tipsPointerHideOf", value: function tipsPointerHideOf(e) { this.groups.forEach(function (group) { group.tipsPointerHideOf(e); }); } }], [{ key: "defaultProps", value: function defaultProps() { return { field: { detail: '字段配置,支持二维数组格式', default: null }, yAxisAlign: { detail: '绘制在哪根y轴上面', default: 'left' }, _props: [_group.default] }; } }, { key: "polyfill", value: function polyfill(opt) { if (Array.isArray(opt.field)) { opt.field.forEach(function (item) { if (Array.isArray(item) && item.length > 1) { //说明这个是一个河流图,[ [uv, uv_bottom] ] 这样的, var bottomField = item[1]; item.length = 1; bottomFieldMap[item[0]] = bottomField; } }); } return opt; } }]); }(_index.default); _index.default.registerComponent(LineGraphs, 'graphs', 'line'); var _default = exports.default = LineGraphs;