133 lines
3.0 KiB
Java
133 lines
3.0 KiB
Java
/**
|
|
* @fileOverview 度量的控制器
|
|
* @author dxq613@gmail.com
|
|
*/
|
|
var Scale = require('@antv/scale/lib');
|
|
|
|
var Util = require('../../util');
|
|
|
|
var dateRegex = /^(?:(?!0000)[0-9]{4}([-/.]+)(?:(?:0?[1-9]|1[0-2])\1(?:0?[1-9]|1[0-9]|2[0-8])|(?:0?[13-9]|1[0-2])\1(?:29|30)|(?:0?[13578]|1[02])\1(?:31))|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)([-/.]+)0?2\2(?:29))(\s+([01]|([01][0-9]|2[0-3])):([0-9]|[0-5][0-9]):([0-9]|[0-5][0-9]))?$/;
|
|
var TYPES = {
|
|
LINEAR: 'linear',
|
|
CAT: 'cat',
|
|
TIME: 'time'
|
|
};
|
|
|
|
var ScaleController = /*#__PURE__*/function () {
|
|
function ScaleController(cfg) {
|
|
// defs 列定义
|
|
this.defs = {};
|
|
this.viewTheme = {
|
|
scales: {}
|
|
}; // filtered fields
|
|
|
|
this.filters = {};
|
|
Util.assign(this, cfg);
|
|
}
|
|
|
|
var _proto = ScaleController.prototype;
|
|
|
|
_proto._getDef = function _getDef(field) {
|
|
var defs = this.defs;
|
|
var viewTheme = this.viewTheme;
|
|
var def = null;
|
|
|
|
if (viewTheme.scales[field] || defs[field]) {
|
|
def = Util.mix({}, viewTheme.scales[field]); // 处理覆盖属性的问题
|
|
|
|
Util.each(defs[field], function (v, k) {
|
|
if (Util.isNil(v)) {
|
|
delete def[k];
|
|
} else {
|
|
def[k] = v;
|
|
}
|
|
});
|
|
|
|
if (this.filters[field]) {
|
|
delete def.min;
|
|
delete def.max;
|
|
}
|
|
}
|
|
|
|
return def;
|
|
};
|
|
|
|
_proto._getDefaultType = function _getDefaultType(field, data) {
|
|
var type = TYPES.LINEAR;
|
|
var value = Util.Array.firstValue(data, field);
|
|
|
|
if (Util.isArray(value)) {
|
|
value = value[0];
|
|
}
|
|
|
|
if (dateRegex.test(value)) {
|
|
type = TYPES.TIME;
|
|
} else if (Util.isString(value)) {
|
|
type = TYPES.CAT;
|
|
}
|
|
|
|
return type;
|
|
};
|
|
|
|
_proto._getScaleCfg = function _getScaleCfg(type, field, data) {
|
|
var cfg = {
|
|
field: field
|
|
};
|
|
var values = Util.Array.values(data, field);
|
|
cfg.values = values;
|
|
|
|
if (!Scale.isCategory(type) && type !== 'time') {
|
|
var range = Util.Array.getRange(values);
|
|
cfg.min = range.min;
|
|
cfg.max = range.max;
|
|
cfg.nice = true;
|
|
}
|
|
|
|
if (type === 'time') {
|
|
cfg.nice = false;
|
|
}
|
|
|
|
return cfg;
|
|
};
|
|
|
|
_proto.createScale = function createScale(field, data) {
|
|
var self = this;
|
|
|
|
var def = self._getDef(field);
|
|
|
|
var scale;
|
|
var validData = data || [];
|
|
var firstValue = Util.Array.firstValue(validData, field);
|
|
|
|
if (Util.isNumber(field) || Util.isNil(firstValue) && !def) {
|
|
scale = Scale.identity({
|
|
value: field,
|
|
field: field.toString(),
|
|
values: [field]
|
|
});
|
|
} else {
|
|
// 如果已经定义过这个度量
|
|
var type;
|
|
|
|
if (def) {
|
|
type = def.type;
|
|
}
|
|
|
|
type = type || self._getDefaultType(field, validData);
|
|
|
|
var cfg = self._getScaleCfg(type, field, validData);
|
|
|
|
if (def) {
|
|
Util.mix(cfg, def);
|
|
}
|
|
|
|
scale = Scale[type](cfg);
|
|
}
|
|
|
|
return scale;
|
|
};
|
|
|
|
return ScaleController;
|
|
}();
|
|
|
|
module.exports = ScaleController; |