auto-ellipsis-time.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { each } from '@antv/util';
  2. import fecha from 'fecha';
  3. import { testLabel } from '../../util/label';
  4. import { strLen } from '../../util/text';
  5. var SECOND = 1000;
  6. var MINUTE = 60 * SECOND;
  7. var HOUR = 60 * MINUTE;
  8. var DAY = 24 * HOUR;
  9. var MONTH = 31 * DAY;
  10. var YEAR = 365 * DAY;
  11. /** 时间周期显示 */
  12. function dateTimeAbbrevaite(label, labels, index, timeDuration, limitLength) {
  13. var text = label.attr('text');
  14. var labelLength = label.getBBox().width;
  15. var codeLength = strLen(text);
  16. var reseveLength = Math.floor((limitLength / labelLength) * codeLength);
  17. var ellipsised = false;
  18. var campareText;
  19. if (index === labels.length - 1) {
  20. campareText = labels[index - 1].attr('text');
  21. }
  22. else {
  23. campareText = labels[index + 1].attr('text');
  24. }
  25. var compare = new Date(campareText);
  26. var current = new Date(label.attr('text'));
  27. // time frequency
  28. var timeCycle = getDateTimeMode(current, compare);
  29. // 如果duration和frequency在同一区间
  30. if (timeDuration === timeCycle) {
  31. if (index !== 0 && index !== labels.length - 1) {
  32. var formatter = sameSectionFormatter(current, timeDuration, reseveLength);
  33. label.attr('text', fecha.format(current, formatter));
  34. ellipsised = true;
  35. }
  36. return;
  37. }
  38. if (index !== 0) {
  39. var previousText = labels[index - 1].attr('text');
  40. var previous = new Date(previousText);
  41. var isAbbreviate = needAbbrevaite(timeDuration, current, previous);
  42. if (isAbbreviate) {
  43. var formatter = getAbbrevaiteFormatter(timeDuration, timeCycle);
  44. label.attr('text', fecha.format(current, formatter));
  45. ellipsised = true;
  46. }
  47. }
  48. if (ellipsised) {
  49. label.set('tip', text);
  50. }
  51. else {
  52. label.set('tip', null);
  53. }
  54. }
  55. /** 工具方法: 获取时间周期 */
  56. function getTimeDuration(labels) {
  57. var start = new Date(labels[0].attr('text'));
  58. var end = new Date(labels[labels.length - 1].attr('text'));
  59. return getDateTimeMode(start, end);
  60. }
  61. /** 工具方法: 获取连个时间戳之间差值的时间粒度 */
  62. function getDateTimeMode(a, b) {
  63. var mode;
  64. var dist = Math.abs(a - b);
  65. var mapper = {
  66. minute: [MINUTE, HOUR],
  67. hour: [HOUR, DAY],
  68. day: [DAY, MONTH],
  69. month: [MONTH, YEAR],
  70. year: [YEAR, Infinity],
  71. };
  72. each(mapper, function (range, key) {
  73. if (dist >= range[0] && dist < range[1]) {
  74. mode = key;
  75. }
  76. });
  77. return mode.toString();
  78. }
  79. /** 判断是否要进行时间周期显示 */
  80. function needAbbrevaite(mode, current, previous) {
  81. var currentStamp = getTime(current, mode);
  82. var previousStamp = getTime(previous, mode);
  83. if (currentStamp !== previousStamp) {
  84. return false;
  85. }
  86. return true;
  87. }
  88. function getTime(date, mode) {
  89. if (mode.toString() === 'year') {
  90. return date.getFullYear();
  91. }
  92. if (mode.toString() === 'month') {
  93. return date.getMonth() + 1;
  94. }
  95. if (mode.toString() === 'day') {
  96. return date.getDay() + 1;
  97. }
  98. if (mode.toString() === 'hour') {
  99. return date.getHours() + 1;
  100. }
  101. if (mode.toString() === 'minute') {
  102. return date.getMinutes() + 1;
  103. }
  104. }
  105. /** 获取时间周期显示的formatter */
  106. function getAbbrevaiteFormatter(duration, cycle) {
  107. var times = ['year', 'month', 'day', 'hour', 'minute'];
  108. var formatters = ['YYYY', 'MM', 'DD', 'HH', 'MM'];
  109. var startIndex = times.indexOf(duration.toString()) + 1;
  110. var endIndex = times.indexOf(cycle.toString());
  111. var formatter = '';
  112. for (var i = startIndex; i <= endIndex; i++) {
  113. formatter += formatters[i];
  114. if (i < endIndex) {
  115. formatter += '-';
  116. }
  117. }
  118. return formatter;
  119. }
  120. /** 逐级显示逻辑 */
  121. function sameSectionFormatter(time, mode, reseveLength) {
  122. var times = ['year', 'month', 'day', 'hour', 'minute'];
  123. var formatters = ['YYYY', 'MM', 'DD', 'HH', 'MM'];
  124. var index = times.indexOf(mode);
  125. var formatter = formatters[index];
  126. /*
  127. * 格式补完、逐级显示逻辑:
  128. * YYYY、MM、DD、HH、mm、ss 为时间格式字段,DD左边的字段为高位字段,右边的字段为低位字段。
  129. * 如果空间允许,DD及之前向高位补一位,HH及之后向低位补一位
  130. */
  131. if (index !== 0 && index !== times.length) {
  132. var extendIndex = index <= 2 ? index - 1 : index + 1;
  133. var extendFormatter = index <= 2 ? formatters[extendIndex] + "-" + formatter : formatter + "-" + formatters[extendIndex];
  134. if (strLen(fecha.format(time, extendFormatter)) <= reseveLength) {
  135. return extendFormatter;
  136. }
  137. }
  138. return formatter;
  139. }
  140. export function ellipsisTime(labelGroup, limitLength) {
  141. var children = labelGroup.getChildren();
  142. var needEllipsis = false;
  143. var ellipsised = false;
  144. each(children, function (label) {
  145. var rst = testLabel(label, limitLength);
  146. needEllipsis = needEllipsis || rst;
  147. });
  148. if (needEllipsis) {
  149. var timeDuration_1 = getTimeDuration(children);
  150. each(children, function (label, index) {
  151. dateTimeAbbrevaite(label, children, index, timeDuration_1, limitLength);
  152. });
  153. ellipsised = true;
  154. }
  155. return ellipsised;
  156. }
  157. //# sourceMappingURL=auto-ellipsis-time.js.map