Skip to content

Commit 6c88c38

Browse files
committed
Format the label in the time scale tooltip
1 parent 92d033b commit 6c88c38

File tree

2 files changed

+133
-2
lines changed

2 files changed

+133
-2
lines changed

src/scales/scale.time.js

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,27 @@ function ticksFromTimestamps(values, majorUnit) {
403403
return ticks;
404404
}
405405

406+
function determineLabelFormat(data, timeOpts) {
407+
var i, momentDate, hasTime;
408+
var ilen = data.length;
409+
410+
// find the label with the most parts (milliseconds, minutes, etc.)
411+
// format all labels with the same level of detail as the most specific label
412+
for (i = 0; i < ilen; i++) {
413+
momentDate = momentify(data[i], timeOpts);
414+
if (momentDate.millisecond() !== 0) {
415+
return 'MMM D, YYYY h:mm:ss.SSS a';
416+
}
417+
if (momentDate.second() !== 0 || momentDate.minute() !== 0 || momentDate.hour() !== 0) {
418+
hasTime = true;
419+
}
420+
}
421+
if (hasTime) {
422+
return 'MMM D, YYYY h:mm:ss a';
423+
}
424+
return 'MMM D, YYYY';
425+
}
426+
406427
module.exports = function(Chart) {
407428

408429
var defaultConfig = {
@@ -621,6 +642,7 @@ module.exports = function(Chart) {
621642
me._majorUnit = determineMajorUnit(me._unit);
622643
me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution);
623644
me._offsets = computeOffsets(me._table, ticks, min, max, options);
645+
me._labelFormat = determineLabelFormat(me._timestamps.data, timeOpts);
624646

625647
return ticksFromTimestamps(ticks, me._majorUnit);
626648
},
@@ -636,10 +658,13 @@ module.exports = function(Chart) {
636658
label = me.getRightValue(value);
637659
}
638660
if (timeOpts.tooltipFormat) {
639-
label = momentify(label, timeOpts).format(timeOpts.tooltipFormat);
661+
return momentify(label, timeOpts).format(timeOpts.tooltipFormat);
662+
}
663+
if (typeof label === 'string') {
664+
return label;
640665
}
641666

642-
return label;
667+
return momentify(label, timeOpts).format(me._labelFormat);
643668
},
644669

645670
/**

test/specs/scale.time.tests.js

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,112 @@ describe('Time scale tests', function() {
584584
expect(xScale.getLabelForIndex(6, 0)).toBe('2015-01-10T12:00');
585585
});
586586

587+
it('should get the correct label when time is specified as a string', function() {
588+
var chart = window.acquireChart({
589+
type: 'line',
590+
data: {
591+
datasets: [{
592+
xAxisID: 'xScale0',
593+
data: [{t: '2015-01-01T20:00:00', y: 10}, {t: '2015-01-02T21:00:00', y: 3}]
594+
}],
595+
},
596+
options: {
597+
scales: {
598+
xAxes: [{
599+
id: 'xScale0',
600+
type: 'time',
601+
position: 'bottom'
602+
}],
603+
}
604+
}
605+
});
606+
607+
var xScale = chart.scales.xScale0;
608+
expect(xScale.getLabelForIndex(0, 0)).toBeTruthy();
609+
expect(xScale.getLabelForIndex(0, 0)).toBe('2015-01-01T20:00:00');
610+
});
611+
612+
it('should get the correct label for a timestamp with milliseconds', function() {
613+
var chart = window.acquireChart({
614+
type: 'line',
615+
data: {
616+
datasets: [{
617+
xAxisID: 'xScale0',
618+
data: [{t: 1515469457180, y: 10}, {t: 1515469458180, y: 3}]
619+
}],
620+
},
621+
options: {
622+
scales: {
623+
xAxes: [{
624+
id: 'xScale0',
625+
type: 'time',
626+
position: 'bottom'
627+
}],
628+
}
629+
}
630+
});
631+
632+
var xScale = chart.scales.xScale0;
633+
var label = xScale.getLabelForIndex(0, 0);
634+
expect(label).toMatch(/^Jan \d+, 2018 \d{1,2}:\d{2}:\d{2}.\d{3} (am|pm)$/);
635+
});
636+
637+
it('should get the correct label for a timestamp with time', function() {
638+
var chart = window.acquireChart({
639+
type: 'line',
640+
data: {
641+
datasets: [{
642+
xAxisID: 'xScale0',
643+
data: [
644+
{t: +new Date('2018-01-08 05:14:23'), y: 10},
645+
{t: +new Date('2018-01-09 06:17:43'), y: 3}
646+
]
647+
}],
648+
},
649+
options: {
650+
scales: {
651+
xAxes: [{
652+
id: 'xScale0',
653+
type: 'time',
654+
position: 'bottom'
655+
}],
656+
}
657+
}
658+
});
659+
660+
var xScale = chart.scales.xScale0;
661+
var label = xScale.getLabelForIndex(0, 0);
662+
expect(label).toMatch(/^Jan \d+, 2018 \d{1,2}:\d{2}:\d{2} (am|pm)$/);
663+
});
664+
665+
it('should get the correct label for a timestamp representing a date', function() {
666+
var chart = window.acquireChart({
667+
type: 'line',
668+
data: {
669+
datasets: [{
670+
xAxisID: 'xScale0',
671+
data: [
672+
{t: +new Date('2018-01-08 00:00:00'), y: 10},
673+
{t: +new Date('2018-01-09 00:00:00'), y: 3}
674+
]
675+
}],
676+
},
677+
options: {
678+
scales: {
679+
xAxes: [{
680+
id: 'xScale0',
681+
type: 'time',
682+
position: 'bottom'
683+
}],
684+
}
685+
}
686+
});
687+
688+
var xScale = chart.scales.xScale0;
689+
var label = xScale.getLabelForIndex(0, 0);
690+
expect(label).toMatch(/^Jan \d+, 2018$/);
691+
});
692+
587693
it('should get the correct pixel for only one data in the dataset', function() {
588694
var chart = window.acquireChart({
589695
type: 'line',

0 commit comments

Comments
 (0)