123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- import { each } from '@antv/util';
- import fecha from 'fecha';
- import { testLabel } from '../../util/label';
- import { strLen } from '../../util/text';
- var SECOND = 1000;
- var MINUTE = 60 * SECOND;
- var HOUR = 60 * MINUTE;
- var DAY = 24 * HOUR;
- var MONTH = 31 * DAY;
- var YEAR = 365 * DAY;
- /** 时间周期显示 */
- function dateTimeAbbrevaite(label, labels, index, timeDuration, limitLength) {
- var text = label.attr('text');
- var labelLength = label.getBBox().width;
- var codeLength = strLen(text);
- var reseveLength = Math.floor((limitLength / labelLength) * codeLength);
- var ellipsised = false;
- var campareText;
- if (index === labels.length - 1) {
- campareText = labels[index - 1].attr('text');
- }
- else {
- campareText = labels[index + 1].attr('text');
- }
- var compare = new Date(campareText);
- var current = new Date(label.attr('text'));
- // time frequency
- var timeCycle = getDateTimeMode(current, compare);
- // 如果duration和frequency在同一区间
- if (timeDuration === timeCycle) {
- if (index !== 0 && index !== labels.length - 1) {
- var formatter = sameSectionFormatter(current, timeDuration, reseveLength);
- label.attr('text', fecha.format(current, formatter));
- ellipsised = true;
- }
- return;
- }
- if (index !== 0) {
- var previousText = labels[index - 1].attr('text');
- var previous = new Date(previousText);
- var isAbbreviate = needAbbrevaite(timeDuration, current, previous);
- if (isAbbreviate) {
- var formatter = getAbbrevaiteFormatter(timeDuration, timeCycle);
- label.attr('text', fecha.format(current, formatter));
- ellipsised = true;
- }
- }
- if (ellipsised) {
- label.set('tip', text);
- }
- else {
- label.set('tip', null);
- }
- }
- /** 工具方法: 获取时间周期 */
- function getTimeDuration(labels) {
- var start = new Date(labels[0].attr('text'));
- var end = new Date(labels[labels.length - 1].attr('text'));
- return getDateTimeMode(start, end);
- }
- /** 工具方法: 获取连个时间戳之间差值的时间粒度 */
- function getDateTimeMode(a, b) {
- var mode;
- var dist = Math.abs(a - b);
- var mapper = {
- minute: [MINUTE, HOUR],
- hour: [HOUR, DAY],
- day: [DAY, MONTH],
- month: [MONTH, YEAR],
- year: [YEAR, Infinity],
- };
- each(mapper, function (range, key) {
- if (dist >= range[0] && dist < range[1]) {
- mode = key;
- }
- });
- return mode.toString();
- }
- /** 判断是否要进行时间周期显示 */
- function needAbbrevaite(mode, current, previous) {
- var currentStamp = getTime(current, mode);
- var previousStamp = getTime(previous, mode);
- if (currentStamp !== previousStamp) {
- return false;
- }
- return true;
- }
- function getTime(date, mode) {
- if (mode.toString() === 'year') {
- return date.getFullYear();
- }
- if (mode.toString() === 'month') {
- return date.getMonth() + 1;
- }
- if (mode.toString() === 'day') {
- return date.getDay() + 1;
- }
- if (mode.toString() === 'hour') {
- return date.getHours() + 1;
- }
- if (mode.toString() === 'minute') {
- return date.getMinutes() + 1;
- }
- }
- /** 获取时间周期显示的formatter */
- function getAbbrevaiteFormatter(duration, cycle) {
- var times = ['year', 'month', 'day', 'hour', 'minute'];
- var formatters = ['YYYY', 'MM', 'DD', 'HH', 'MM'];
- var startIndex = times.indexOf(duration.toString()) + 1;
- var endIndex = times.indexOf(cycle.toString());
- var formatter = '';
- for (var i = startIndex; i <= endIndex; i++) {
- formatter += formatters[i];
- if (i < endIndex) {
- formatter += '-';
- }
- }
- return formatter;
- }
- /** 逐级显示逻辑 */
- function sameSectionFormatter(time, mode, reseveLength) {
- var times = ['year', 'month', 'day', 'hour', 'minute'];
- var formatters = ['YYYY', 'MM', 'DD', 'HH', 'MM'];
- var index = times.indexOf(mode);
- var formatter = formatters[index];
- /*
- * 格式补完、逐级显示逻辑:
- * YYYY、MM、DD、HH、mm、ss 为时间格式字段,DD左边的字段为高位字段,右边的字段为低位字段。
- * 如果空间允许,DD及之前向高位补一位,HH及之后向低位补一位
- */
- if (index !== 0 && index !== times.length) {
- var extendIndex = index <= 2 ? index - 1 : index + 1;
- var extendFormatter = index <= 2 ? formatters[extendIndex] + "-" + formatter : formatter + "-" + formatters[extendIndex];
- if (strLen(fecha.format(time, extendFormatter)) <= reseveLength) {
- return extendFormatter;
- }
- }
- return formatter;
- }
- export function ellipsisTime(labelGroup, limitLength) {
- var children = labelGroup.getChildren();
- var needEllipsis = false;
- var ellipsised = false;
- each(children, function (label) {
- var rst = testLabel(label, limitLength);
- needEllipsis = needEllipsis || rst;
- });
- if (needEllipsis) {
- var timeDuration_1 = getTimeDuration(children);
- each(children, function (label, index) {
- dateTimeAbbrevaite(label, children, index, timeDuration_1, limitLength);
- });
- ellipsised = true;
- }
- return ellipsised;
- }
- //# sourceMappingURL=auto-ellipsis-time.js.map
|