light-chart
Version:
Charts for mobile visualization.
115 lines (105 loc) • 2.65 kB
JavaScript
const Util = require('../../util/common');
const Global = require('../../global');
const Scale = require('../../scale/');
const SCALE_TYPES_MAP = {
linear: 'Linear',
cat: 'Cat',
timeCat: 'TimeCat',
identity: 'Identity'
};
class ScaleController {
constructor(cfg) {
// defs 列定义
this.defs = {};
Util.mix(this, cfg);
}
_getDef(field) {
const defs = this.defs;
let def = null;
if (Global.scales[field] || defs[field]) {
def = Util.mix({}, Global.scales[field]);
Util.each(defs[field], function(v, k) {
if (Util.isNil(v)) {
delete def[k];
} else {
def[k] = v;
}
});
}
return def;
}
_getDefaultType(field, data, def) {
if (def && def.type) {
return def.type;
}
let type = 'linear';
let value = Util.Array.firstValue(data, field);
if (Util.isArray(value)) {
value = value[0];
}
if (Util.isString(value)) {
type = 'cat';
}
return type;
}
_getScaleCfg(type, field, data, def) {
let values;
if (def && def.values) {
values = def.values;
} else {
values = Util.Array.values(data, field);
}
const cfg = {
field,
values
};
if (type !== 'cat' && type !== 'timeCat') {
if (!def || !(def.min && def.max)) {
const { min, max } = Util.Array.getRange(values);
cfg.min = min;
cfg.max = max;
cfg.nice = true;
}
} else {
cfg.isRounding = false; // used for tickCount calculation
}
return cfg;
}
createScale(field, data) {
const self = this;
const def = self._getDef(field);
let scale;
if (!data || !data.length) {
if (def && def.type) {
def.field = field;
scale = new Scale[SCALE_TYPES_MAP[def.type]](def);
} else {
scale = new Scale.Identity({
value: field,
field: field.toString(),
values: [ field ]
});
}
return scale;
}
const firstObj = data[0];
let firstValue = firstObj[field];
if (firstValue === null) {
firstValue = Util.Array.firstValue(data, field);
}
if (Util.isNumber(field) || (Util.isNil(firstValue)) && !def) {
scale = new Scale.Identity({
value: field,
field: field.toString(),
values: [ field ]
});
} else {
const type = self._getDefaultType(field, data, def);
const cfg = self._getScaleCfg(type, field, data, def);
def && Util.mix(cfg, def);
scale = new Scale[SCALE_TYPES_MAP[type]](cfg);
}
return scale;
}
}
module.exports = ScaleController;