@alicloud/cloud-charts
Version:

88 lines (71 loc) • 3.72 kB
JavaScript
;
import _extends from "@babel/runtime/helpers/extends";
import { timePretty, timeCat } from './autoTimeTicksMethod';
var defaultMask = 'HH:mm:ss\nYYYY-MM-DD';
var MINUTE_MS = 60 * 1000;
var HOUR_MS = 3600 * 1000;
var DAY_MS = 24 * HOUR_MS;
var YEAR_MS = 365 * DAY_MS; // 跨度判定列表:大于半年、大于一个月、大于一天、大于一小时、大于一分钟、(小于分钟)
var timeList = [0.51 * YEAR_MS, 28 * DAY_MS, DAY_MS, HOUR_MS, MINUTE_MS];
/*
| 间隔 \ 跨度 | 大于半年 | 大于一个月 | 大于一天 | 大于一小时 | 大于一分钟 | 小于分钟 |
| 大于半年 | YYYY | - | - | - | - | - |
| 大于一个月 | YYYY-MM | YYYY-MM | - | - | - | - |
| 大于一天 | YYYY-MM-DD | MM-DD | MM-DD | - | - | - |
| 大于一小时 | YYYY-MM-DD HH:mm | MM-DD HH:mm | MM-DD HH:mm | HH:mm | - | - |
| 大于一分钟 | YYYY-MM-DD HH:mm | MM-DD HH:mm | MM-DD HH:mm | HH:mm | HH:mm | - |
| 小于分钟 | YYYY-MM-DD HH:mm:ss | MM-DD HH:mm:ss | MM-DD HH:mm:ss | HH:mm:ss | mm:ss | mm:ss |
*/
var maskMap = [['YYYY'], ['YYYY-MM', 'YYYY-MM'], ['YYYY-MM-DD', 'MM-DD', 'MM-DD'], ['YYYY-MM-DD HH:mm', 'MM-DD HH:mm', 'MM-DD HH:mm', 'HH:mm'], ['YYYY-MM-DD HH:mm', 'MM-DD HH:mm', 'MM-DD HH:mm', 'HH:mm', 'HH:mm'], ['HH:mm:ss\nYYYY-MM-DD', 'MM-DD HH:mm:ss', 'MM-DD HH:mm:ss', 'HH:mm:ss', 'mm:ss', 'mm:ss']];
function getTimeIndex(t) {
for (var i = 0; i < timeList.length; i++) {
if (t >= timeList[i]) {
return i;
}
}
return timeList.length;
}
/**
* 自动计算时间格式。
* @param defs {object} 数据列定义
* @param data {array} G2图表实例
* */
export default function (defs, data) {
var def = defs.x;
if ((def.type === 'time' || def.type === 'timeCat') && def.mask === 'auto' && Array.isArray(data) && data[0] && Array.isArray(data[0].data)) {
def.mask = getAutoMask(def, data[0].data); // 默认的tickCount为7,导致时间永远无法获取全量数据
// 这里通过修改tickCount的值为当前X轴的数量,使保底能得到全量数据
if (!def.tickMethod && def.type === 'time') {
def.tickMethod = function (cfg) {
var values = cfg.values;
return timePretty(_extends({}, cfg, {
tickCount: values === null || values === void 0 ? void 0 : values.length
}, def));
};
} else if (!def.tickMethod && def.type === 'timeCat') {
def.tickMethod = function (cfg) {
var values = cfg.values;
return timeCat(_extends({}, cfg, {
tickCount: values === null || values === void 0 ? void 0 : values.length
}, def));
};
}
}
} // 取数据的跨度和间距两种值,跨度决定上限,间距决定下限。
function getAutoMask(def, data) {
if (data.length < 2) {
return defaultMask;
} // 假设数据是升序的,且传入为 Date 能识别的格式
// 只取第一、二个元素的间距
var min = new Date(data[0][0]).getTime();
var minFirst = new Date(data[1][0]).getTime();
var max = new Date(data[data.length - 1][0]).getTime();
if (isNaN(min) || isNaN(max) || isNaN(minFirst)) {
return defaultMask;
}
var span = max - min; // 间隔
var interval = def.tickInterval || minFirst - min; // 跨度
var spanIndex = getTimeIndex(span);
var intervalIndex = getTimeIndex(interval); // 如果记录表中没有记录,则使用默认 mask
return maskMap[intervalIndex][spanIndex] || defaultMask;
}