UNPKG

suoqiu-f2

Version:

Charts for mobile visualization.

872 lines (863 loc) 27.4 kB
"use strict"; exports.__esModule = true; exports["default"] = void 0; var Attr = _interopRequireWildcard(require("../attr/index")); var _common = require("../util/common"); var _base = _interopRequireDefault(require("../base")); var _global = _interopRequireWildcard(require("../global")); var _shape = _interopRequireDefault(require("./shape/shape")); var _base2 = _interopRequireDefault(require("@antv/adjust/lib/base")); var _util = require("./aria/util"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; } function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _inheritsLoose(t, o) { t.prototype = Object.create(o.prototype), t.prototype.constructor = t, _setPrototypeOf(t, o); } function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); } var GROUP_ATTRS = ['color', 'size', 'shape']; var FIELD_ORIGIN = '_origin'; var FIELD_ORIGIN_Y = '_originY'; function parseFields(field) { if ((0, _common.isArray)(field)) { return field; } if ((0, _common.isString)(field)) { return field.split('*'); } return [field]; } /** * The parent class for Geometry * @class Geom */ var Geom = /*#__PURE__*/function (_Base) { function Geom() { return _Base.apply(this, arguments) || this; } _inheritsLoose(Geom, _Base); var _proto = Geom.prototype; _proto.getDefaultCfg = function getDefaultCfg() { return { /** * geometry type * @type {String} */ type: null, /** * the data of geometry * @type {Array} */ data: null, /** * the attrs of geo,etry * @type {Object} */ attrs: {}, scales: {}, /** * group for storing the shapes * @type {Canvas} */ container: null, /** * style options * @type {Object} */ styleOptions: null, chart: null, shapeType: '', /** * wether to generate key points for each shape * @protected * @type {Boolean} */ generatePoints: false, attrOptions: {}, sortable: false, startOnZero: true, visible: true, connectNulls: false, // 是否丢弃没有值的分组。 ignoreEmptyGroup: false, // 是否已经初始化 isInit: false }; }; _proto.init = function init() { var self = this; var isInit = self.get('isInit'); if (isInit) { return; } self._initAttrs(); self._processData(); self.set('isInit', true); }; _proto._getGroupScales = function _getGroupScales() { var self = this; var scales = []; (0, _common.each)(GROUP_ATTRS, function (attrName) { var attr = self.getAttr(attrName); if (attr) { var attrScales = attr.scales; (0, _common.each)(attrScales, function (scale) { if (scale && scale.isCategory && scales.indexOf(scale) === -1) { scales.push(scale); } }); } }); return scales; }; _proto._groupData = function _groupData(data) { var self = this; var colDefs = self.get('colDefs'); var groupScales = self._getGroupScales(); if (groupScales.length) { var appendConditions = {}; var names = []; (0, _common.each)(groupScales, function (scale) { var field = scale.field; names.push(field); if (colDefs && colDefs[field] && colDefs[field].values) { // users have defined appendConditions[scale.field] = colDefs[field].values; } }); return _common.Array.group(data, names, appendConditions); } return [data]; }; _proto._setAttrOptions = function _setAttrOptions(attrName, attrCfg) { var options = this.get('attrOptions'); options[attrName] = attrCfg; var attrs = this.get('attrs'); // 说明已经初始化过了 if (Object.keys(attrs).length) { this._createAttr(attrName, attrCfg); } }; _proto._createAttrOption = function _createAttrOption(attrName, field, cfg, defaultValues) { var attrCfg = {}; attrCfg.field = field; if (cfg) { if ((0, _common.isFunction)(cfg)) { attrCfg.callback = cfg; } else { attrCfg.values = cfg; } } else { attrCfg.values = defaultValues; } this._setAttrOptions(attrName, attrCfg); }; _proto._createAttr = function _createAttr(type, option) { var self = this; var attrs = self.get('attrs'); var coord = self.get('coord'); var className = (0, _common.upperFirst)(type); var fields = parseFields(option.field); if (type === 'position') { option.coord = coord; } var scales = []; for (var i = 0, len = fields.length; i < len; i++) { var field = fields[i]; var scale = self._createScale(field); scales.push(scale); } if (type === 'position') { var yScale = scales[1]; // 饼图的处理,但是还不知道为啥 if (coord.type === 'polar' && coord.transposed && self.hasAdjust('stack')) { if (yScale.values.length) { yScale.change({ nice: false, min: 0, max: Math.max.apply(null, yScale.values) }); } } } option.scales = scales; var attr = new Attr[className](option); attrs[type] = attr; return attr; }; _proto._initAttrs = function _initAttrs() { var self = this; var attrOptions = self.get('attrOptions'); for (var type in attrOptions) { if (attrOptions.hasOwnProperty(type)) { this._createAttr(type, attrOptions[type]); } } }; _proto._createScale = function _createScale(field) { var scales = this.get('scales'); var scale = scales[field]; if (!scale) { scale = this.get('chart').createScale(field); scales[field] = scale; } return scale; }; _proto._processData = function _processData() { var self = this; var data = this.get('data'); var dataArray = []; var groupedArray = this._groupData(data); if (this.get('ignoreEmptyGroup')) { var yScale = this.getYScale(); groupedArray = groupedArray.filter(function (group) { return group.some(function (item) { return typeof item[yScale.field] !== 'undefined'; }); }); } for (var i = 0, len = groupedArray.length; i < len; i++) { var subData = groupedArray[i]; var tempData = self._saveOrigin(subData); if (this.hasAdjust('dodge')) { self._numberic(tempData); } dataArray.push(tempData); } if (self.get('adjust')) { self._adjustData(dataArray); } if (self.get('sortable')) { self._sort(dataArray); } self.emit('afterprocessdata', { dataArray: dataArray }); self.set('mappingData', dataArray); self.set('dataArray', dataArray); return dataArray; }; _proto._saveOrigin = function _saveOrigin(data) { var rst = []; for (var i = 0, len = data.length; i < len; i++) { var origin = data[i]; var obj = {}; for (var k in origin) { obj[k] = origin[k]; } obj[FIELD_ORIGIN] = origin; rst.push(obj); } return rst; }; _proto._numberic = function _numberic(data) { var positionAttr = this.getAttr('position'); var scales = positionAttr.scales; for (var j = 0, len = data.length; j < len; j++) { var obj = data[j]; var count = Math.min(2, scales.length); for (var i = 0; i < count; i++) { var scale = scales[i]; if (scale.isCategory) { var field = scale.field; obj[field] = scale.translate(obj[field]); } } } }; _proto._adjustData = function _adjustData(dataArray) { var self = this; var adjust = self.get('adjust'); if (adjust) { var adjustType = (0, _common.upperFirst)(adjust.type); if (!_base2["default"][adjustType]) { throw new Error('not support such adjust : ' + adjust); } var xScale = self.getXScale(); var yScale = self.getYScale(); var cfg = (0, _common.mix)({ xField: xScale.field, yField: yScale.field }, adjust); var adjustObject = new _base2["default"][adjustType](cfg); adjustObject.processAdjust(dataArray); if (adjustType === 'Stack') { self._updateStackRange(yScale.field, yScale, dataArray); } } }; _proto._updateStackRange = function _updateStackRange(field, scale, dataArray) { var mergeArray = _common.Array.merge(dataArray); var min = scale.min; var max = scale.max; for (var i = 0, len = mergeArray.length; i < len; i++) { var obj = mergeArray[i]; var tmpMin = Math.min.apply(null, obj[field]); var tmpMax = Math.max.apply(null, obj[field]); if (tmpMin < min) { min = tmpMin; } if (tmpMax > max) { max = tmpMax; } } if (min < scale.min || max > scale.max) { scale.change({ min: min, max: max }); } }; _proto._sort = function _sort(mappedArray) { var self = this; var xScale = self.getXScale(); var field = xScale.field, type = xScale.type; if (type !== 'identity' && xScale.values.length > 1) { (0, _common.each)(mappedArray, function (itemArr) { itemArr.sort(function (obj1, obj2) { if (type === 'timeCat') { return (0, _common.toTimeStamp)(obj1[FIELD_ORIGIN][field]) - (0, _common.toTimeStamp)(obj2[FIELD_ORIGIN][field]); } return xScale.translate(obj1[FIELD_ORIGIN][field]) - xScale.translate(obj2[FIELD_ORIGIN][field]); }); }); } self.set('hasSorted', true); self.set('dataArray', mappedArray); }; _proto.paint = function paint() { var self = this; var dataArray = self.get('mappingData'); var mappedArray = []; var shapeFactory = self.getShapeFactory(); shapeFactory.setCoord(self.get('coord')); self._beforeMapping(dataArray); for (var i = 0, len = dataArray.length; i < len; i++) { var data = dataArray[i]; if (data.length) { var mappedData = self._mapping(data); mappedArray.push(mappedData); self.draw(mappedData, shapeFactory); } } self.set('dataArray', mappedArray); this.generateAria(); }; _proto.getShapeFactory = function getShapeFactory() { var shapeFactory = this.get('shapeFactory'); if (!shapeFactory) { var shapeType = this.get('shapeType'); shapeFactory = _shape["default"].getShapeFactory(shapeType); this.set('shapeFactory', shapeFactory); } return shapeFactory; }; _proto._mapping = function _mapping(data) { var self = this; var attrs = self.get('attrs'); var yField = self.getYScale().field; // 用来缓存转换的值,减少mapping耗时 var mappedCache = {}; var mappedData = new Array(data.length); for (var k in attrs) { if (attrs.hasOwnProperty(k)) { var attr = attrs[k]; var names = attr.names; var scales = attr.scales; for (var i = 0, len = data.length; i < len; i++) { var record = data[i]; var mappedRecord = _extends({}, record, mappedData[i]); mappedRecord[FIELD_ORIGIN_Y] = record[yField]; // 获取视觉属性对应的value值 // 位置的缓存命中率低,还是每次单独计算 if (attr.type === 'position') { var values = self._getAttrValues(attr, record); for (var j = 0, _len = values.length; j < _len; j++) { var val = values[j]; var name = names[j]; mappedRecord[name] = (0, _common.isArray)(val) && val.length === 1 ? val[0] : val; } } else { // 除了position其他都只有一项 var _name = names[0]; var field = scales[0].field; var value = record[field]; var key = "" + _name + value; var _values = mappedCache[key]; if (!_values) { _values = self._getAttrValues(attr, record); mappedCache[key] = _values; } mappedRecord[_name] = _values[0]; } // 设置新数组 mappedData[i] = mappedRecord; } } } return mappedData; }; _proto._getAttrValues = function _getAttrValues(attr, record) { var scales = attr.scales; var params = []; for (var i = 0, len = scales.length; i < len; i++) { var scale = scales[i]; var field = scale.field; if (scale.type === 'identity') { params.push(scale.value); } else { params.push(record[field]); } } var values = attr.mapping.apply(attr, params); return values; }; _proto.getAttrValue = function getAttrValue(attrName, record) { var attr = this.getAttr(attrName); var rst = null; if (attr) { var values = this._getAttrValues(attr, record); rst = values[0]; } return rst; }; _proto._beforeMapping = function _beforeMapping(dataArray) { var self = this; if (self.get('generatePoints')) { self._generatePoints(dataArray); } }; _proto.isInCircle = function isInCircle() { var coord = this.get('coord'); return coord && coord.isPolar; }; _proto.getCallbackCfg = function getCallbackCfg(fields, cfg, origin) { if (!fields) { return cfg; } var tmpCfg = {}; var params = fields.map(function (field) { return origin[field]; }); (0, _common.each)(cfg, function (v, k) { if ((0, _common.isFunction)(v)) { tmpCfg[k] = v.apply(null, params); } else { tmpCfg[k] = v; } }); return tmpCfg; }; _proto.getDrawCfg = function getDrawCfg(obj) { var self = this; var isInCircle = self.isInCircle(); var cfg = { origin: obj, x: obj.x, y: obj.y, color: obj.color, size: obj.size, shape: obj.shape, isInCircle: isInCircle, opacity: obj.opacity }; var styleOptions = self.get('styleOptions'); if (styleOptions && styleOptions.style) { cfg.style = self.getCallbackCfg(styleOptions.fields, styleOptions.style, obj[FIELD_ORIGIN]); } if (self.get('generatePoints')) { cfg.points = obj.points; cfg.nextPoints = obj.nextPoints; } if (isInCircle) { cfg.center = self.get('coord').center; } return cfg; }; _proto.draw = function draw(data, shapeFactory) { var self = this; var container = self.get('container'); var yScale = self.getYScale(); (0, _common.each)(data, function (obj, index) { if (yScale && (0, _common.isNil)(obj._origin[yScale.field])) { return; } obj.index = index; var cfg = self.getDrawCfg(obj); var shape = obj.shape; self.drawShape(shape, obj, cfg, container, shapeFactory); }); }; _proto.drawShape = function drawShape(shape, shapeData, cfg, container, shapeFactory) { var gShape = shapeFactory.drawShape(shape, cfg, container); if (gShape) { (0, _common.each)([].concat(gShape), function (s) { s.set('origin', shapeData); }); } }; _proto._generatePoints = function _generatePoints(dataArray) { var self = this; var shapeFactory = self.getShapeFactory(); var shapeAttr = self.getAttr('shape'); (0, _common.each)(dataArray, function (data) { for (var i = 0, len = data.length; i < len; i++) { var obj = data[i]; var cfg = self.createShapePointsCfg(obj); var shape = shapeAttr ? self._getAttrValues(shapeAttr, obj) : null; var points = shapeFactory.getShapePoints(shape, cfg); obj.points = points; } }); // 添加nextPoints (0, _common.each)(dataArray, function (data, index) { var nextData = dataArray[index + 1]; if (nextData) { data[0].nextPoints = nextData[0].points; } }); } // 生成无障碍文本 ; _proto.generateAria = function generateAria() { var container = this.get('container'); var aria = container.get('aria'); if (!aria) { return; } var ariaLables = []; var coord = this.get('coord'); var xScale = this.getXScale(); var yScale = this.getYScale(); var coordAriaLabel = (0, _util.generateCoordAria)(coord, xScale, yScale); ariaLables.push(coordAriaLabel); var _lang$geometry = _global.lang.geometry, prefix = _lang$geometry.prefix, oneData = _lang$geometry.oneData, partData = _lang$geometry.partData, allData = _lang$geometry.allData; var dataArray = this.get('dataArray'); var count = dataArray.length; // 只处理一个,不然太复杂 var groupScale = this._getGroupScales()[0]; if (groupScale) { var prefixLabel = (0, _common.substitute)(prefix, { count: count }); ariaLables.push(prefixLabel); (0, _common.each)(dataArray, function (data, index) { var len = data.length; if (!len) return; var firstObj = data[0]._origin; if (len === 1) { ariaLables.push((0, _common.substitute)(oneData, { index: index + 1, count: len, name: firstObj[groupScale.field], values: firstObj[yScale.field] })); } else { var template = len > 5 ? partData : allData; var values = data.slice(0, 5).map(function (record) { var _origin = record._origin; var xValue = xScale.getText(_origin[xScale.field]); var yValue = yScale.getText(_origin[yScale.field]); return xValue + ":" + yValue; }); ariaLables.push((0, _common.substitute)(template, { index: index + 1, count: len, part: 3, name: firstObj[groupScale.field], values: values.join(' ') })); } }); } container.set('ariaLabel', ariaLables.join('')); } /** * get the info of each shape * @protected * @param {Object} obj the data item * @return {Object} cfg return the result */; _proto.createShapePointsCfg = function createShapePointsCfg(obj) { var xScale = this.getXScale(); var yScale = this.getYScale(); var x = this._normalizeValues(obj[xScale.field], xScale); var y; if (yScale) { y = this._normalizeValues(obj[yScale.field], yScale); } else { y = obj.y ? obj.y : 0.1; } return { x: x, y: y, y0: yScale ? yScale.scale(this.getYMinValue()) : undefined }; }; _proto.getYMinValue = function getYMinValue() { var yScale = this.getYScale(); var min = yScale.min, max = yScale.max; var value; if (this.get('startOnZero')) { if (max <= 0 && min <= 0) { value = max; } else { value = min >= 0 ? min : 0; } } else { value = min; } return value; }; _proto._normalizeValues = function _normalizeValues(values, scale) { var rst = []; if ((0, _common.isArray)(values)) { for (var i = 0, len = values.length; i < len; i++) { var v = values[i]; rst.push(scale.scale(v)); } } else { rst = scale.scale(values); } return rst; }; _proto.getAttr = function getAttr(name) { return this.get('attrs')[name]; }; _proto.getXScale = function getXScale() { return this.getAttr('position').scales[0]; }; _proto.getYScale = function getYScale() { return this.getAttr('position').scales[1]; }; _proto.hasAdjust = function hasAdjust(adjust) { return this.get('adjust') && this.get('adjust').type === adjust; }; _proto._getSnap = function _getSnap(scale, item, arr) { var i = 0; var values; var yField = this.getYScale().field; // 叠加的维度 if (this.hasAdjust('stack') && scale.field === yField) { values = []; arr.forEach(function (obj) { values.push(obj[FIELD_ORIGIN_Y]); }); for (var len = values.length; i < len; i++) { if (values[0][0] > item) { break; } if (values[values.length - 1][1] <= item) { i = values.length - 1; break; } if (values[i][0] <= item && values[i][1] > item) { break; } } } else { values = scale.values; values.sort(function (a, b) { return a - b; }); for (var _len2 = values.length; i < _len2; i++) { // 如果只有1个点直接返回第1个点 if (_len2 <= 1) { break; } // 第1个点和第2个点之间 if ((values[0] + values[1]) / 2 > item) { break; } // 中间的点 if ((values[i - 1] + values[i]) / 2 <= item && (values[i + 1] + values[i]) / 2 > item) { break; } // 最后2个点 if ((values[values.length - 2] + values[values.length - 1]) / 2 <= item) { i = values.length - 1; break; } } } var result = values[i]; return result; }; _proto.getSnapRecords = function getSnapRecords(point) { var self = this; var coord = self.get('coord'); var xScale = self.getXScale(); var yScale = self.getYScale(); var xfield = xScale.field; var dataArray = self.get('dataArray'); if (!this.get('hasSorted')) { this._sort(dataArray); } var rst = []; var invertPoint = coord.invertPoint(point); var invertPointX = invertPoint.x; if (self.isInCircle() && !coord.transposed && invertPointX > (1 + xScale.rangeMax()) / 2) { invertPointX = xScale.rangeMin(); } if (xScale.isCategory) { var min = xScale.rangeMin(); var max = xScale.rangeMax(); // 归一到 范围内 if (invertPointX < min) { invertPointX = min; } if (invertPointX > max) { invertPointX = max; } } var xValue = xScale.invert(invertPointX); if (!xScale.isCategory) { xValue = self._getSnap(xScale, xValue); } var tmp = []; dataArray.forEach(function (data) { data.forEach(function (obj) { var originValue = (0, _common.isNil)(obj[FIELD_ORIGIN]) ? obj[xfield] : obj[FIELD_ORIGIN][xfield]; if (self._isEqual(originValue, xValue, xScale)) { tmp.push(obj); } }); }); // special for pie chart if (this.hasAdjust('stack') && coord.isPolar && coord.transposed) { if (invertPointX >= 0 && invertPointX <= 1) { var yValue = yScale.invert(invertPoint.y); yValue = self._getSnap(yScale, yValue, tmp); tmp.forEach(function (obj) { if ((0, _common.isArray)(yValue) ? obj[FIELD_ORIGIN_Y].toString() === yValue.toString() : obj[FIELD_ORIGIN_Y] === yValue) { rst.push(obj); } }); } } else { rst = tmp; } return rst; }; _proto.getRecords = function getRecords(value) { var _this = this; var xScale = this.getXScale(); var dataArray = this.get('dataArray'); var xfield = xScale.field; return dataArray.map(function (data) { for (var len = data.length, i = len - 1; i >= 0; i--) { var obj = data[i]; var originValue = (0, _common.isNil)(obj[FIELD_ORIGIN]) ? obj[xfield] : obj[FIELD_ORIGIN][xfield]; if (_this._isEqual(originValue, value, xScale)) { return obj; } } return null; }); }; _proto._isEqual = function _isEqual(originValue, value, scale) { if (scale.type === 'timeCat') { return (0, _common.toTimeStamp)(originValue) === value; } return value === originValue; }; _proto.position = function position(field) { this._setAttrOptions('position', { field: field }); return this; }; _proto.color = function color(field, values) { this._createAttrOption('color', field, values, _global["default"].colors); return this; }; _proto.size = function size(field, values) { this._createAttrOption('size', field, values, _global["default"].sizes); return this; }; _proto.shape = function shape(field, values) { var type = this.get('type'); var shapes = _global["default"].shapes[type] || []; this._createAttrOption('shape', field, values, shapes); return this; }; _proto.style = function style(field, cfg) { var styleOptions = this.get('styleOptions'); if (!styleOptions) { styleOptions = {}; this.set('styleOptions', styleOptions); } if ((0, _common.isObject)(field)) { cfg = field; field = null; } var fields; if (field) { fields = parseFields(field); } styleOptions.fields = fields; styleOptions.style = cfg; return this; }; _proto.adjust = function adjust(type) { if ((0, _common.isString)(type)) { type = { type: type }; } this.set('adjust', type); return this; }; _proto.animate = function animate(cfg) { this.set('animateCfg', cfg); return this; }; _proto.changeData = function changeData(data) { this.set('data', data); // 改变数据后,情况度量,因为需要重新实例化 this.set('scales', {}); if (!this.get('isInit')) return; this.set('isInit', false); this.init(); }; _proto.clearInner = function clearInner() { var container = this.get('container'); if (container) { container.clear(); // container.setMatrix([ 1, 0, 0, 1, 0, 0 ]); } }; _proto.reset = function reset() { this.set('isInit', false); this.set('attrs', {}); this.set('attrOptions', {}); this.set('adjust', null); this.clearInner(); }; _proto.clear = function clear() { this.clearInner(); }; _proto.destroy = function destroy() { this.set('isInit', false); this.clear(); _Base.prototype.destroy.call(this); }; _proto._display = function _display(visible) { this.set('visible', visible); var container = this.get('container'); var canvas = container.get('canvas'); container.set('visible', visible); canvas.draw(); }; _proto.show = function show() { this._display(true); }; _proto.hide = function hide() { this._display(false); }; return Geom; }(_base["default"]); var _default = exports["default"] = Geom;