UNPKG

chartx

Version:

Data Visualization Chart Library

637 lines (618 loc) 20.2 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 _index = _interopRequireDefault(require("./index")); var _canvax = _interopRequireDefault(require("canvax")); var _xaxis = _interopRequireDefault(require("./xaxis")); var _yaxis = _interopRequireDefault(require("./yaxis")); var _grid = _interopRequireDefault(require("./grid")); var _tools = require("../../utils/tools"); var _trigger = _interopRequireDefault(require("../trigger")); 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 = /*#__PURE__*/function (_coordBase) { function Rect(opt, app) { var _this; (0, _classCallCheck2.default)(this, Rect); _this = _callSuper(this, Rect, [opt, app]); _.extend(true, _this, (0, _tools.getDefaultProps)(Rect.defaultProps()), _this.setDefaultOpt(opt, app)); _this.type = "rect"; _this._xAxis = null; _this._yAxis = []; _this._yAxisLeft = null; _this._yAxisRight = null; _this._grid = null; _this.init(opt); return _this; } (0, _inherits2.default)(Rect, _coordBase); return (0, _createClass2.default)(Rect, [{ key: "setDefaultOpt", value: function setDefaultOpt(coordOpt, app) { var coord = { field: this.dataFrame.fields[0], xAxis: { //波峰波谷布局模型,默认是柱状图的,折线图种需要做覆盖 layoutType: "rule", //"peak", //默认为false,x轴的计量是否需要取整, 这样 比如某些情况下得柱状图的柱子间隔才均匀。 //比如一像素间隔的柱状图,如果需要精确的绘制出来每个柱子的间距是1px, 就必须要把这里设置为true posParseToInt: false }, grid: {} }; _.extend(true, coord, coordOpt); if (coord.yAxis) { var _nyarr = []; //TODO: 因为我们的deep extend 对于数组是整个对象引用过去,所以,这里需要 //把每个子元素单独clone一遍,恩恩恩, 在canvax中优化extend对于array的处理 _.each(_.flatten([coord.yAxis]), function (yopt) { _nyarr.push(_.clone(yopt)); }); coord.yAxis = _nyarr; } else { coord.yAxis = []; } ; //根据opt中得Graphs配置,来设置 coord.yAxis var graphsArr = app._opt.graphs ? _.flatten([app._opt.graphs]) : []; //有graphs的就要用找到这个graphs.field来设置coord.yAxis var _loop = function _loop() { var graphs = graphsArr[i]; if (graphs.type == "bar") { //如果graphs里面有柱状图,那么就整个xAxis都强制使用 peak 的layoutType coord.xAxis.layoutType = "peak"; } if (graphs.field) { //没有配置field的话就不绘制这个 graphs了 var align = "left"; //默认left if (graphs.yAxisAlign == "right") { align = "right"; } ; var optsYaxisObj = null; optsYaxisObj = _.find(coord.yAxis, function (obj, i) { return obj.align == align || !obj.align && i == (align == "left" ? 0 : 1); }); if (!optsYaxisObj) { optsYaxisObj = { align: align, field: [] }; coord.yAxis.push(optsYaxisObj); } else { if (!optsYaxisObj.align) { optsYaxisObj.align = align; } } if (!optsYaxisObj.field) { optsYaxisObj.field = []; } else { if (!_.isArray(optsYaxisObj.field)) { optsYaxisObj.field = [optsYaxisObj.field]; } } if (_.isArray(graphs.field)) { optsYaxisObj.field = optsYaxisObj.field.concat(graphs.field); } else { optsYaxisObj.field.push(graphs.field); } } }; for (var i = 0; i < graphsArr.length; i++) { _loop(); } ; //再梳理一遍yAxis,get没有align的手动配置上align //要手动把yAxis 按照 left , right的顺序做次排序 var _lys = [], _rys = []; _.each(coord.yAxis, function (yAxis, i) { if (!yAxis.align) { yAxis.align = i ? "right" : "left"; } if (yAxis.align == "left") { _lys.push(yAxis); } else { _rys.push(yAxis); } }); coord.yAxis = _lys.concat(_rys); if (coord.horizontal) { coord.xAxis.isH = true; _.each(coord.yAxis, function (yAxis) { yAxis.isH = true; }); } ; if ("enabled" in coord) { //如果有给直角坐标系做配置display,就直接通知到xAxis,yAxis,grid三个子组件 _.extend(true, coord.xAxis, { enabled: coord.enabled }); _.each(coord.yAxis, function (yAxis) { _.extend(true, yAxis, { enabled: coord.enabled }); }); coord.grid.enabled = coord.enabled; } ; if ("animation" in coord) { //如果有给直角坐标系做配置animation,就直接通知到xAxis,yAxis,grid三个子组件 _.extend(true, coord.xAxis, { animation: coord.animation }); _.each(coord.yAxis, function (yAxis) { _.extend(true, yAxis, { animation: coord.animation }); }); coord.grid.animation = coord.animation; } ; return coord; } }, { key: "init", value: function init() { this._initModules(); //创建好了坐标系统后,设置 _fieldsDisplayMap 的值, // _fieldsDisplayMap 的结构里包含每个字段是否在显示状态的enabled 和 这个字段属于哪个yAxis this.graphsFieldsMap = this.setGraphsFieldsMap({ type: "yAxis" }); } }, { key: "reset", value: function reset() { this.resetData(this.dataFrame); } }, { key: "resetData", value: function resetData(dataFrame) { var me = this; var _padding = this.app.padding; //let w = this._opt.width || this.app.width; var h = this._opt.height || this.app.height; var w = this._opt.width || this.app.width; if (this.horizontal) { //如果是横向的坐标系统,也就是xy对调,那么高宽也要对调 var _num = w; w = h; h = _num; } ; this.dataFrame = dataFrame; var _yAxisWAll = 0; var _leftYAxisW = 0; _.each(this._yAxis, function (_yAxis) { //这个_yAxis是具体的y轴实例 var yAxisDataFrame = me.getAxisDataFrame(_yAxis.field); _yAxis.resetData(yAxisDataFrame); _yAxisWAll += _yAxis.width; if (_yAxis.align == 'left') { _leftYAxisW = _yAxis.width; } }); var xAxisWidth = w - _yAxisWAll - _padding.left - _padding.right; this.width = xAxisWidth; var _xAxisDataFrame = this.getAxisDataFrame(this.xAxis.field); this._xAxis.resetData(_xAxisDataFrame, { width: xAxisWidth, pos: { x: _padding.left + _leftYAxisW //y : y } }); this.origin.x = _leftYAxisW + _padding.left; this._resetXY_axisLine_pos(); this._grid.reset({ animation: false }); } }, { key: "draw", value: function draw(opt) { //在绘制的时候,要先拿到xAxis的高 console.log('rect coord draw'); !opt && (opt = {}); var _padding = this.app.padding; var h = opt.height || this.app.height; var w = opt.width || this.app.width; if (this.horizontal) { //如果是横向的坐标系统,也就是xy对调,那么高宽也要对调 var _num = w; w = h; h = _num; } ; var y = h - this._xAxis.height - _padding.bottom; var _yAxisW = 0; var _yAxisRW = 0; //绘制yAxis if (this._yAxisLeft) { this._yAxisLeft.draw({ pos: { x: _padding.left, y: y }, yMaxHeight: y - _padding.top, resize: opt.resize }); _yAxisW = this._yAxisLeft.width; } //如果有双轴 if (this._yAxisRight) { this._yAxisRight.draw({ pos: { x: 0, y: y }, yMaxHeight: y - _padding.top, resize: opt.resize }); _yAxisRW = this._yAxisRight.width; } ; //绘制x轴 this._xAxis.draw({ pos: { x: _padding.left + _yAxisW, y: y }, width: w - _yAxisW - _padding.left - _yAxisRW - _padding.right, resize: opt.resize }); this._yAxisRight && this._yAxisRight.setX(_yAxisW + _padding.left + this._xAxis.width); this.width = this._xAxis.width; this.height = this._yAxis.length ? this._yAxis[0].height : 0; this.origin.x = _yAxisW + _padding.left; this.origin.y = y; //绘制背景网格 this._grid.draw({ width: this.width, height: this.height, pos: this.origin, resize: opt.resize }); this._initInduce(); this._resetXY_axisLine_pos(); if (this.horizontal) { this._horizontal({ w: w, h: h }); } } }, { key: "_resetXY_axisLine_pos", value: function _resetXY_axisLine_pos() { var me = this; //设置下x y 轴的 _axisLine轴线的位置,默认 axisLine.position==default var xAxisPosY; if (this._xAxis.enabled) { if (this._xAxis.axisLine.position == 'center') { xAxisPosY = -this._yAxis[0].height / 2; } if (this._xAxis.axisLine.position == 'center') { xAxisPosY = -this._yAxis[0].height / 2; } if (_.isNumber(this._xAxis.axisLine.position)) { xAxisPosY = -this._yAxis[0].getPosOfVal(this._xAxis.axisLine.position); } if (xAxisPosY !== undefined) { this._xAxis._axisLine.context.y = xAxisPosY; } } _.each(this._yAxis, function (_yAxis) { //这个_yAxis是具体的y轴实例 var yAxisPosX; if (_yAxis.enabled) { if (_yAxis.axisLine.position == 'center') { yAxisPosX = me._xAxis.width / 2; } ; if (_.isNumber(_yAxis.axisLine.position)) { yAxisPosX = me._xAxis.getPosOfVal(_yAxis.axisLine.position); } ; if (yAxisPosX !== undefined) { _yAxis._axisLine.context.x = yAxisPosX; } ; } }); } }, { key: "getSizeAndOrigin", value: function getSizeAndOrigin() { var obj = { width: this.width, height: this.height, origin: this.origin }; if (this.horizontal) { var _padding = this.app.padding; //因为在drawBeginHorizontal中 //横向了之后, 要把4个padding值轮换换过了 //top,right 对调 , bottom,left 对调 //所以,这里要对调换回来给到origin var left = _padding.bottom; var top = _padding.right; obj = { width: this._yAxis[0].height, height: this._xAxis.width, origin: { x: this._xAxis.height + left, y: this._yAxis[0].height + top } }; } ; return obj; } }, { key: "_initModules", value: function _initModules() { this._grid = new _grid.default(this.grid, this); this.sprite.addChild(this._grid.sprite); var _xAxisDataFrame = this.getAxisDataFrame(this.xAxis.field); this._xAxis = new _xaxis.default(this.xAxis, _xAxisDataFrame, this); this._axiss.push(this._xAxis); this.sprite.addChild(this._xAxis.sprite); //这里定义的是配置 var yAxis = this.yAxis; var yAxisLeft, yAxisRight; var yAxisLeftDataFrame, yAxisRightDataFrame; // yAxis 肯定是个数组 if (!_.isArray(yAxis)) { yAxis = [yAxis]; } ; //left是一定有的 yAxisLeft = _.find(yAxis, function (ya) { return ya.align == "left"; }); if (yAxisLeft) { yAxisLeftDataFrame = this.getAxisDataFrame(yAxisLeft.field); this._yAxisLeft = new _yaxis.default(yAxisLeft, yAxisLeftDataFrame, this); this._yAxisLeft.axis = yAxisLeft; this.sprite.addChild(this._yAxisLeft.sprite); this._yAxis.push(this._yAxisLeft); this._axiss.push(this._yAxisLeft); } yAxisRight = _.find(yAxis, function (ya) { return ya.align == "right"; }); if (yAxisRight) { yAxisRightDataFrame = this.getAxisDataFrame(yAxisRight.field); this._yAxisRight = new _yaxis.default(yAxisRight, yAxisRightDataFrame, this); this._yAxisRight.axis = yAxisRight; this.sprite.addChild(this._yAxisRight.sprite); this._yAxis.push(this._yAxisRight); this._axiss.push(this._yAxisRight); } ; } /** * * @param {x,y} size */ }, { key: "_horizontal", value: function _horizontal(opt) { var me = this; var w = opt.h; var h = opt.w; _.each([me.sprite.context], function (ctx) { ctx.x += (w - h) / 2; ctx.y += (h - w) / 2; var origin = { x: h / 2, y: w / 2 }; ctx.rotation = 90; ctx.rotateOrigin = origin; }); } //由coor_base中得addField removeField来调用 }, { key: "changeFieldEnabled", value: function changeFieldEnabled(field) { var _this2 = this; this.setFieldEnabled(field); var fieldConfig = this.getFieldConfig(field); var _axis = fieldConfig.yAxis || fieldConfig.rAxis; var enabledFields = this.getEnabledFieldsOf(_axis); //[ fieldConfig.yAxis.align ]; _axis.resetData(this.getAxisDataFrame(enabledFields)); this.draw(); var graphs = this.app.getGraphs(); graphs.forEach(function (graph) { graph.origin = _this2.origin; graph.sprite.context.x = _this2.origin.x; graph.sprite.context.y = _this2.origin.y; }); } }, { key: "_initInduce", value: function _initInduce() { var me = this; me.induce = new _canvax.default.Shapes.Rect({ id: "induce", context: { x: me.origin.x, y: me.origin.y - me.height, width: me.width, height: me.height, fillStyle: '#000000', globalAlpha: 0, cursor: 'pointer' } }); if (!me.sprite.getChildById("induce")) { me.sprite.addChild(me.induce); } ; me.induce.on(event.types.get(), function (e) { //e.eventInfo = me._getInfoHandler(e); me.fire(e.type, e); //图表触发,用来处理Tips me.app.fire(e.type, e); }); } }, { key: "getTipsInfoHandler", value: function getTipsInfoHandler(e) { //这里只获取xAxis的刻度信息; var induceX = e.point.x; if (e.target !== this.induce) { induceX = this.induce.globalToLocal(e.target.localToGlobal(e.point)).x; } ; var xNode = this._xAxis.getNodeInfoOfX(induceX); var obj = { xAxis: xNode, dimension_1: xNode, //和xAxis一致,, 极坐标也会有dimension_1 title: xNode.text, //下面两个属性是所有坐标系统一的 iNode: xNode.ind, nodes: [ //遍历_graphs 去拿东西 ] }; if (e.eventInfo) { _.extend(true, obj, e.eventInfo); //把xNode信息写到eventInfo上面 if (obj.xAxis) { e.eventInfo.xAxis = xNode; } ; } ; return obj; } //下面的方法是所有坐标系都要提供的方法,用来计算位置的, graphs里面会调用 //return {pos {x,y}, value :{x,y}} }, { key: "getPoint", value: function getPoint(opt) { var point = { x: 0, y: undefined }; var xaxisExp = { type: "xAxis" }; var yaxisExp = { type: "yAxis", field: opt.field }; var _xAxis = this.getAxis(xaxisExp); var _yAxis = this.getAxis(yaxisExp); var _iNode = opt.iNode || 0; var _value = opt.value; //x y 一般至少会带 yval过来 if (!("x" in _value)) { //如果没有传xval过来,要用iNode去xAxis的org去取 _value.x = _.flatten(_xAxis.dataOrg)[_iNode]; } ; point.x = _xAxis.getPosOf({ ind: _iNode, val: _value.x }); var y = _value.y; if (!isNaN(y) && y !== null && y !== undefined && y !== "") { if (!!opt.vIndex) { //说明是堆叠的 //要获取到对应Y轴的最小值, 如果最小值是大于0的,那么val要加上这个最小值 if (_yAxis._min > 0) { y += _yAxis._min; } } point.y = -_yAxis.getPosOfVal(y); } else { point.y = undefined; } ; return { pos: point, value: _value }; } }, { key: "getAxisOriginPoint", value: function getAxisOriginPoint(exp) { var _yAxis = this.getAxis(exp); return { pos: -_yAxis.originPos, value: _yAxis.origin }; } }, { key: "getOriginPos", value: function getOriginPos(exp) { var xaxisExp = { type: "xAxis" }; var yaxisExp = { type: "yAxis", field: exp.field }; var _xAxis = this.getAxis(xaxisExp); var _yAxis = this.getAxis(yaxisExp); return { x: _xAxis.originPos, y: -_yAxis.originPos }; } //某axis变化了后,对应的依附于该axis的graphs都要重新reset }, { key: "resetGraphsOfAxis", value: function resetGraphsOfAxis(axis) { var _this3 = this; var graphs = this.app.getGraphs(); if (axis.type == 'yAxis') { graphs.forEach(function (graph) { if (graph.yAxisAlign == axis.align) { graph.resetData(null, new _trigger.default(_this3)); graph.origin = _this3.origin; graph.sprite.context.x = _this3.origin.x; graph.sprite.context.y = _this3.origin.y; } }); } } }], [{ key: "defaultProps", value: function defaultProps() { return { horizontal: { detail: '横向翻转坐标系', documentation: "横向翻转坐标系", insertText: "horizontal: ", default: false, values: [true, false] }, _props: { xAxis: _xaxis.default, yAxis: _yaxis.default, grid: _grid.default } }; } }]); }(_index.default); _index.default.registerComponent(Rect, 'coord', 'rect'); var _default = exports.default = Rect;