Skip to content

Commit 13d3efa

Browse files
committed
improve period labels set dtick in respect to tickformat and fixup rangebreaks
1 parent 3613ad9 commit 13d3efa

File tree

5 files changed

+108
-113
lines changed

5 files changed

+108
-113
lines changed

src/plots/cartesian/axes.js

Lines changed: 85 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,11 @@ axes.calcTicks = function calcTicks(ax, opts) {
589589
var endTick = exRng[1];
590590
// check for reversed axis
591591
var axrev = (rng[1] < rng[0]);
592+
var minRange = Math.min(rng[0], rng[1]);
593+
var maxRange = Math.max(rng[0], rng[1]);
594+
var dtick = ax.dtick;
595+
var tickformat = axes.getTickFormat(ax);
596+
var isPeriod = ax.ticklabelmode === 'period';
592597

593598
// No visible ticks? Quit.
594599
// I've only seen this on category axes with all categories off the edge.
@@ -600,7 +605,77 @@ axes.calcTicks = function calcTicks(ax, opts) {
600605
Math.min(ax._categories.length - 0.5, endTick);
601606
}
602607

603-
var isDLog = (ax.type === 'log') && !(isNumeric(ax.dtick) || ax.dtick.charAt(0) === 'L');
608+
var isDLog = (ax.type === 'log') && !(isNumeric(dtick) || dtick.charAt(0) === 'L');
609+
610+
var definedDelta;
611+
if(isPeriod && tickformat) {
612+
if(
613+
!(/%[fLQsSMX]/.test(tickformat))
614+
// %f: microseconds as a decimal number [000000, 999999]
615+
// %L: milliseconds as a decimal number [000, 999]
616+
// %Q: milliseconds since UNIX epoch
617+
// %s: seconds since UNIX epoch
618+
// %S: second as a decimal number [00,61]
619+
// %M: minute as a decimal number [00,59]
620+
// %X: the locale’s time, such as %-I:%M:%S %p
621+
) {
622+
if(
623+
/%[HI]/.test(tickformat)
624+
// %H: hour (24-hour clock) as a decimal number [00,23]
625+
// %I: hour (12-hour clock) as a decimal number [01,12]
626+
) {
627+
definedDelta = ONEHOUR;
628+
if(!dtick) dtick = ONEHOUR;
629+
} else if(
630+
/%p/.test(tickformat) // %p: either AM or PM
631+
) {
632+
definedDelta = HALFDAY;
633+
if(!dtick) dtick = HALFDAY;
634+
} else if(
635+
/%[Aadejuwx]/.test(tickformat)
636+
// %A: full weekday name
637+
// %a: abbreviated weekday name
638+
// %d: zero-padded day of the month as a decimal number [01,31]
639+
// %e: space-padded day of the month as a decimal number [ 1,31]
640+
// %j: day of the year as a decimal number [001,366]
641+
// %u: Monday-based (ISO 8601) weekday as a decimal number [1,7]
642+
// %w: Sunday-based weekday as a decimal number [0,6]
643+
// %x: the locale’s date, such as %-m/%-d/%Y
644+
) {
645+
definedDelta = ONEDAY;
646+
if(!dtick) dtick = ONEDAY;
647+
} else if(
648+
/%[UVW]/.test(tickformat)
649+
// %U: Sunday-based week of the year as a decimal number [00,53]
650+
// %V: ISO 8601 week of the year as a decimal number [01, 53]
651+
// %W: Monday-based week of the year as a decimal number [00,53]
652+
) {
653+
definedDelta = ONEWEEK;
654+
if(!dtick) dtick = ONEWEEK;
655+
} else if(
656+
/%[Bbm]/.test(tickformat)
657+
// %B: full month name
658+
// %b: abbreviated month name
659+
// %m: month as a decimal number [01,12]
660+
) {
661+
definedDelta = ONEAVGMONTH;
662+
if(!dtick) dtick = ONEMAXMONTH;
663+
} else if(
664+
/%[q]/.test(tickformat)
665+
// %q: quarter of the year as a decimal number [1,4]
666+
) {
667+
definedDelta = ONEAVGQUARTER;
668+
if(!dtick) dtick = ONEMAXQUARTER;
669+
} else if(
670+
/%[Yy]/.test(tickformat)
671+
// %Y: year with century as a decimal number, such as 1999
672+
// %y: year without century as a decimal number [00,99]
673+
) {
674+
definedDelta = ONEAVGYEAR;
675+
if(!dtick) dtick = ONEMAXYEAR;
676+
}
677+
}
678+
}
604679

605680
var tickVals;
606681
function generateTicks() {
@@ -609,7 +684,7 @@ axes.calcTicks = function calcTicks(ax, opts) {
609684
tickVals = [];
610685
for(var x = ax._tmin;
611686
(axrev) ? (x >= endTick) : (x <= endTick);
612-
x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar)) {
687+
x = axes.tickIncrement(x, dtick, axrev, ax.calendar)) {
613688
// prevent infinite loops - no more than one tick per pixel,
614689
// and make sure each value is different from the previous
615690
if(tickVals.length > maxTicks || x === xPrevious) break;
@@ -629,13 +704,12 @@ axes.calcTicks = function calcTicks(ax, opts) {
629704

630705
generateTicks();
631706

632-
var isPeriod = ax.ticklabelmode === 'period';
633707
var addedPreTick0Label = false;
634708
if(isPeriod && tickVals[0]) {
635709
// add one label to show pre tick0 period
636710
tickVals.unshift({
637711
minor: false,
638-
value: axes.tickIncrement(tickVals[0].value, ax.dtick, !axrev, ax.caldendar)
712+
value: axes.tickIncrement(tickVals[0].value, dtick, !axrev, ax.caldendar)
639713
});
640714
addedPreTick0Label = true;
641715
}
@@ -701,68 +775,8 @@ axes.calcTicks = function calcTicks(ax, opts) {
701775
ax._prevDateHead = '';
702776
ax._inCalcTicks = true;
703777

704-
var minRange = Math.min(rng[0], rng[1]);
705-
var maxRange = Math.max(rng[0], rng[1]);
706-
707-
var definedDelta;
708-
var tickformat = axes.getTickFormat(ax);
709-
if(isPeriod && tickformat) {
710-
if(
711-
!(/%[fLQsSMX]/.test(tickformat))
712-
// %f: microseconds as a decimal number [000000, 999999]
713-
// %L: milliseconds as a decimal number [000, 999]
714-
// %Q: milliseconds since UNIX epoch
715-
// %s: seconds since UNIX epoch
716-
// %S: second as a decimal number [00,61]
717-
// %M: minute as a decimal number [00,59]
718-
// %X: the locale’s time, such as %-I:%M:%S %p
719-
) {
720-
if(
721-
/%[HI]/.test(tickformat)
722-
// %H: hour (24-hour clock) as a decimal number [00,23]
723-
// %I: hour (12-hour clock) as a decimal number [01,12]
724-
) definedDelta = ONEHOUR;
725-
else if(
726-
/%p/.test(tickformat) // %p: either AM or PM
727-
) definedDelta = HALFDAY;
728-
else if(
729-
/%[Aadejuwx]/.test(tickformat)
730-
// %A: full weekday name
731-
// %a: abbreviated weekday name
732-
// %d: zero-padded day of the month as a decimal number [01,31]
733-
// %e: space-padded day of the month as a decimal number [ 1,31]
734-
// %j: day of the year as a decimal number [001,366]
735-
// %u: Monday-based (ISO 8601) weekday as a decimal number [1,7]
736-
// %w: Sunday-based weekday as a decimal number [0,6]
737-
// %x: the locale’s date, such as %-m/%-d/%Y
738-
) definedDelta = ONEDAY;
739-
else if(
740-
/%[UVW]/.test(tickformat)
741-
// %U: Sunday-based week of the year as a decimal number [00,53]
742-
// %V: ISO 8601 week of the year as a decimal number [01, 53]
743-
// %W: Monday-based week of the year as a decimal number [00,53]
744-
) definedDelta = ONEWEEK;
745-
else if(
746-
/%[Bbm]/.test(tickformat)
747-
// %B: full month name
748-
// %b: abbreviated month name
749-
// %m: month as a decimal number [01,12]
750-
) definedDelta = ONEAVGMONTH;
751-
else if(
752-
/%[q]/.test(tickformat)
753-
// %q: quarter of the year as a decimal number [1,4]
754-
) definedDelta = ONEAVGQUARTER;
755-
else if(
756-
/%[Yy]/.test(tickformat)
757-
// %Y: year with century as a decimal number, such as 1999
758-
// %y: year without century as a decimal number [00,99]
759-
) definedDelta = ONEAVGYEAR;
760-
}
761-
}
762-
763778
var ticksOut = [];
764779
var i;
765-
var prevText;
766780
for(i = 0; i < tickVals.length; i++) {
767781
var _minor = tickVals[i].minor;
768782
var _value = tickVals[i].value;
@@ -774,9 +788,6 @@ axes.calcTicks = function calcTicks(ax, opts) {
774788
_minor // noSuffixPrefix
775789
);
776790

777-
if(isPeriod && prevText === t.text) continue;
778-
prevText = t.text;
779-
780791
ticksOut.push(t);
781792
}
782793

@@ -825,6 +836,7 @@ axes.calcTicks = function calcTicks(ax, opts) {
825836
}
826837
} else if(definedDelta === ONEWEEK && delta >= ONEWEEK) {
827838
periodLength = ONEWEEK;
839+
if(ax._hasDayOfWeekBreaks) periodLength -= 2 * ONEDAY; // hack to center labels | TODO: improve this based on the actual number of days
828840
} else if(delta >= ONEDAY) {
829841
periodLength = ONEDAY;
830842
} else if(definedDelta === HALFDAY && delta >= HALFDAY) {
@@ -833,28 +845,11 @@ axes.calcTicks = function calcTicks(ax, opts) {
833845
periodLength = ONEHOUR;
834846
}
835847

836-
if(periodLength && ax.rangebreaks) {
837-
var nFirstHalf = 0;
838-
var nSecondHalf = 0;
839-
var nAll = 2 * 3 * 7; // number of samples
840-
for(var c = 0; c < nAll; c++) {
841-
var r = c / nAll;
842-
if(ax.maskBreaks(A * (1 - r) + B * r) !== BADNUM) {
843-
if(r < 0.5) {
844-
nFirstHalf++;
845-
} else {
846-
nSecondHalf++;
847-
}
848-
}
849-
}
850-
851-
if(nSecondHalf) {
852-
periodLength *= (nFirstHalf + nSecondHalf) / nAll;
853-
}
854-
}
848+
// ensure new label positions remain between ticks
849+
v += Math.min(periodLength, actualDelta) / 2;
855850

856-
if(periodLength <= actualDelta) { // i.e. to ensure new label positions remain between ticks
857-
v += periodLength / 2;
851+
if(periodLength && ax.rangebreaks) {
852+
v = moveOutsideBreak(v, ax, true);
858853
}
859854

860855
ticksOut[i].periodX = v;
@@ -3386,12 +3381,12 @@ function isAngular(ax) {
33863381
return ax._id === 'angularaxis';
33873382
}
33883383

3389-
function moveOutsideBreak(v, ax) {
3384+
function moveOutsideBreak(v, ax, isStart) {
33903385
var len = ax._rangebreaks.length;
33913386
for(var k = 0; k < len; k++) {
33923387
var brk = ax._rangebreaks[k];
33933388
if(v >= brk.min && v < brk.max) {
3394-
return brk.max;
3389+
return isStart ? brk.min : brk.max;
33953390
}
33963391
}
33973392
return v;
Loading
365 Bytes
Loading
-123 Bytes
Loading

test/jasmine/tests/axes_test.js

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5522,7 +5522,7 @@ describe('Test axes', function() {
55225522
})
55235523
.then(function() {
55245524
_assert('', [
5525-
['2019-12-31 04:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'],
5525+
['2019-12-31 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'],
55265526
['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00'],
55275527
['2020-01-01 12:00', '2020-01-08 12:00', '2020-01-15 12:00', '2020-01-22 12:00', '2020-01-29 12:00']
55285528
][i], [
@@ -5630,28 +5630,28 @@ describe('Test axes', function() {
56305630
},
56315631
{
56325632
formatter: '%p',
5633-
positions: ['2019-12-31 21:00', '2020-01-01 06:00', '2020-01-01 18:00', '2020-01-02 06:00'],
5634-
labels: [' ', 'Wed-AM', 'Wed-PM', ' ']
5633+
positions: ['2019-12-31 22:30', '2020-01-01 01:30', '2020-01-01 04:30', '2020-01-01 07:30', '2020-01-01 10:30', '2020-01-01 13:30', '2020-01-01 16:30', '2020-01-01 19:30', '2020-01-01 22:30', '2020-01-02 01:30'],
5634+
labels: [' ', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-AM', 'Wed-PM', 'Wed-PM', 'Wed-PM', 'Wed-PM', ' ']
56355635
},
56365636
{
56375637
formatter: '%M',
5638-
positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'],
5639-
labels: [' ', 'Wed-00', ' ']
5638+
positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 03:00', '2020-01-01 06:00', '2020-01-01 09:00', '2020-01-01 12:00', '2020-01-01 15:00', '2020-01-01 18:00', '2020-01-01 21:00', '2020-01-02'],
5639+
labels: [' ', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00']
56405640
},
56415641
{
56425642
formatter: '%S',
5643-
positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'],
5644-
labels: [' ', 'Wed-00', ' ']
5643+
positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 03:00', '2020-01-01 06:00', '2020-01-01 09:00', '2020-01-01 12:00', '2020-01-01 15:00', '2020-01-01 18:00', '2020-01-01 21:00', '2020-01-02'],
5644+
labels: [' ', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Wed-00', 'Thu-00']
56455645
},
56465646
{
56475647
formatter: '%L',
5648-
positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'],
5649-
labels: [' ', 'Wed-000', ' ']
5648+
positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 03:00', '2020-01-01 06:00', '2020-01-01 09:00', '2020-01-01 12:00', '2020-01-01 15:00', '2020-01-01 18:00', '2020-01-01 21:00', '2020-01-02'],
5649+
labels: [' ', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Wed-000', 'Thu-000']
56505650
},
56515651
{
56525652
formatter: '%f',
5653-
positions: ['2019-12-31 21:00', '2020-01-01 12:00', '2020-01-02 12:00'],
5654-
labels: [' ', 'Wed-0', ' ']
5653+
positions: ['2019-12-31 21:00', '2020-01-01', '2020-01-01 03:00', '2020-01-01 06:00', '2020-01-01 09:00', '2020-01-01 12:00', '2020-01-01 15:00', '2020-01-01 18:00', '2020-01-01 21:00', '2020-01-02'],
5654+
labels: [' ', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Wed-0', 'Thu-0']
56555655
}
56565656
].forEach(function(t) {
56575657
it('should respect time tickformat that includes ' + t.formatter, function(done) {
@@ -5921,38 +5921,38 @@ describe('Test axes', function() {
59215921
[
59225922
{
59235923
range: ['2020-12-14 08:00', '2022-12-14 08:00'],
5924-
positions: ['2020-12-06 10:26:47.1429', '2021-03-07 09:50:21.4286', '2021-06-06 16:26:47.1429', '2021-09-06 16:26:47.1429', '2021-12-07 09:50:21.4286', '2022-03-06 16:26:47.1429', '2022-06-06 16:26:47.1429', '2022-09-07 01:08:34.2857', '2022-12-07 01:08:34.2857'],
5925-
labels: [' ', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', 'Dec 2022']
5924+
positions: ['2020-12-15 18:00', '2021-03-16 11:15', '2021-06-16 11:15', '2021-09-16 11:15', '2021-12-16 11:15', '2022-03-16 11:15', '2022-06-16 11:15', '2022-09-16 11:15', '2022-12-16 11:15'],
5925+
labels: ['Dec 2020', 'Mar 2021', 'Jun 2021', 'Sep 2021', 'Dec 2021', 'Mar 2022', 'Jun 2022', 'Sep 2022', ' ']
59265926
},
59275927
{
59285928
range: ['2020-12-14 08:00', '2021-08-14 08:00'],
5929-
positions: ['2020-12-06 04:17:08.5714', '2020-12-27 22:00', '2021-01-24 22:00', '2021-02-21 22:00', '2021-03-21 22:00', '2021-04-18 22:00', '2021-05-16 22:00', '2021-06-13 22:00', '2021-07-11 22:00', '2021-08-08 22:00'],
5930-
labels: [' ', 'Dec 21<br>2020', 'Jan 18<br>2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', 'Aug 2']
5929+
positions: ['2020-12-06 12:00', '2021-01-04 06:00', '2021-02-01 06:00', '2021-03-01 06:00', '2021-03-29 06:00', '2021-04-26 06:00', '2021-05-24 06:00', '2021-06-21 06:00', '2021-07-19 06:00', '2021-08-16 06:00'],
5930+
labels: [' ', 'Dec 21<br>2020', 'Jan 18<br>2021', 'Feb 15', 'Mar 15', 'Apr 12', 'May 10', 'Jun 7', 'Jul 5', ' ']
59315931
},
59325932
{
59335933
range: ['2020-12-14 08:00', '2021-04-14 08:00'],
5934-
positions: ['2020-12-13 03:42:51.4286', '2020-12-21 11:42:51.4286', '2021-01-04 11:42:51.4286', '2021-01-18 11:42:51.4286', '2021-02-01 11:42:51.4286', '2021-02-15 11:42:51.4286', '2021-03-01 11:42:51.4286', '2021-03-15 11:42:51.4286', '2021-03-29 11:42:51.4286', '2021-04-12 11:42:51.4286'],
5934+
positions: ['2020-12-13 12:00', '2020-12-21 18:00', '2021-01-04 18:00', '2021-01-18 18:00', '2021-02-01 18:00', '2021-02-15 18:00', '2021-03-01 18:00', '2021-03-15 18:00', '2021-03-29 18:00', '2021-04-12 18:00'],
59355935
labels: [' ', 'Dec 21<br>2020', 'Jan 4<br>2021', 'Jan 18', 'Feb 1', 'Feb 15', 'Mar 1', 'Mar 15', 'Mar 29', 'Apr 12']
59365936
},
59375937
{
59385938
range: ['2020-12-14 08:00', '2021-02-14 08:00'],
5939-
positions: ['2020-12-13 03:42:51.4286', '2020-12-21 10:17:08.5714', '2020-12-28 10:17:08.5714', '2021-01-04 10:17:08.5714', '2021-01-11 10:17:08.5714', '2021-01-18 10:17:08.5714', '2021-01-25 10:17:08.5714', '2021-02-01 10:17:08.5714', '2021-02-08 11:42:51.4286', '2021-02-14 13:42:51.4286'],
5939+
positions: ['2020-12-13 12:00', '2020-12-21 18:00', '2020-12-28 18:00', '2021-01-04 18:00', '2021-01-11 18:00', '2021-01-18 18:00', '2021-01-25 18:00', '2021-02-01 18:00', '2021-02-08 18:00', '2021-02-14 20:00'],
59405940
labels: [' ', 'Dec 21<br>2020', 'Dec 28', 'Jan 4<br>2021', 'Jan 11', 'Jan 18', 'Jan 25', 'Feb 1', 'Feb 8', ' ']
59415941
},
59425942
{
59435943
range: ['2020-12-14 08:00', '2021-01-14 08:00'],
5944-
positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 18:00', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 09:08:34.2857', '2021-01-05 12:17:08.5714', '2021-01-07 18:00', '2021-01-11 12:17:08.5714', '2021-01-13 12:17:08.5714'],
5945-
labels: [' ', 'Dec 16<br>2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1<br>2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13']
5944+
positions: ['2020-12-14 12:00', '2020-12-16 18:00', '2020-12-18 18:00', '2020-12-22 18:00', '2020-12-24 18:00', '2020-12-28 18:00', '2020-12-30 18:00', '2021-01-01 18:00', '2021-01-05 18:00', '2021-01-07 18:00', '2021-01-11 18:00', '2021-01-13 18:00'],
5945+
labels: ['Dec 14<br>2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', 'Jan 1<br>2021', 'Jan 5', 'Jan 7', 'Jan 11', 'Jan 13']
59465946
},
59475947
{
59485948
range: ['2020-12-14 08:00', '2021-01-01 08:00'],
5949-
positions: ['2020-12-14 05:08:34.2857', '2020-12-16 12:17:08.5714', '2020-12-18 09:08:34.2857', '2020-12-22 12:17:08.5714', '2020-12-24 18:00', '2020-12-28 12:17:08.5714', '2020-12-30 12:17:08.5714', '2021-01-01 12:17:08.5714'],
5950-
labels: [' ', 'Dec 16<br>2020', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ' ']
5949+
positions: ['2020-12-14 12:00', '2020-12-16 18:00', '2020-12-18 18:00', '2020-12-22 18:00', '2020-12-24 18:00', '2020-12-28 18:00', '2020-12-30 18:00', '2021-01-01 18:00'],
5950+
labels: ['Dec 14<br>2020', 'Dec 16', 'Dec 18', 'Dec 22', 'Dec 24', 'Dec 28', 'Dec 30', ' ']
59515951
},
59525952
{
59535953
range: ['2020-12-14 08:00', '2020-12-22 08:00'],
5954-
positions: ['2020-12-14 04:51:25.7143', '2020-12-15 18:00', '2020-12-16 18:00', '2020-12-17 18:00', '2020-12-18 18:00', '2020-12-21 18:00', '2020-12-22 18:00'],
5955-
labels: [' ', '06:00<br>Dec 15, 2020', '06:00<br>Dec 16, 2020', '06:00<br>Dec 17, 2020', '06:00<br>Dec 18, 2020', '06:00<br>Dec 21, 2020', ' ']
5954+
positions: ['2020-12-14 12:00', '2020-12-15 18:00', '2020-12-16 18:00', '2020-12-17 18:00', '2020-12-18 18:00', '2020-12-21 18:00', '2020-12-22 18:00'],
5955+
labels: ['00:00<br>Dec 14, 2020', '06:00<br>Dec 15, 2020', '06:00<br>Dec 16, 2020', '06:00<br>Dec 17, 2020', '06:00<br>Dec 18, 2020', '06:00<br>Dec 21, 2020', ' ']
59565956
},
59575957
{
59585958
range: ['2020-12-14 08:00', '2020-12-18 08:00'],

0 commit comments

Comments
 (0)