Fix time scale computeOffsets (#7072)

This commit is contained in:
Ben McCann 2020-02-08 15:08:42 -08:00 committed by GitHub
parent f5655c511e
commit 12ea8d86ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 24 deletions

View File

@ -358,23 +358,23 @@ function generate(scale) {
* They add extra margins on the both sides by scaling down the original scale. * They add extra margins on the both sides by scaling down the original scale.
* Offsets are added when the `offset` option is true. * Offsets are added when the `offset` option is true.
*/ */
function computeOffsets(table, ticks, min, max, options) { function computeOffsets(table, timestamps, min, max, options) {
let start = 0; let start = 0;
let end = 0; let end = 0;
let first, last; let first, last;
if (options.offset && ticks.length) { if (options.offset && timestamps.length) {
first = interpolate(table, 'time', ticks[0], 'pos'); first = interpolate(table, 'time', timestamps[0], 'pos');
if (ticks.length === 1) { if (timestamps.length === 1) {
start = 1 - first; start = 1 - first;
} else { } else {
start = (interpolate(table, 'time', ticks[1], 'pos') - first) / 2; start = (interpolate(table, 'time', timestamps[1], 'pos') - first) / 2;
} }
last = interpolate(table, 'time', ticks[ticks.length - 1], 'pos'); last = interpolate(table, 'time', timestamps[timestamps.length - 1], 'pos');
if (ticks.length === 1) { if (timestamps.length === 1) {
end = last; end = last;
} else { } else {
end = (last - interpolate(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; end = (last - interpolate(table, 'time', timestamps[timestamps.length - 2], 'pos')) / 2;
} }
} }
@ -626,7 +626,7 @@ class TimeScale extends Scale {
me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined
: determineMajorUnit(me._unit); : determineMajorUnit(me._unit);
me._table = buildLookupTable(getTimestampsForTable(me), min, max, distribution); me._table = buildLookupTable(getTimestampsForTable(me), min, max, distribution);
me._offsets = computeOffsets(me._table, ticks, min, max, options); me._offsets = computeOffsets(me._table, getDataTimestamps(me), min, max, options);
if (options.reverse) { if (options.reverse) {
ticks.reverse(); ticks.reverse();

View File

@ -1317,7 +1317,7 @@ describe('Time scale tests', function() {
this.chart = window.acquireChart({ this.chart = window.acquireChart({
type: 'line', type: 'line',
data: { data: {
labels: ['2017', '2019', '2020', '2025'], labels: ['2017', '2018', '2019', '2020', '2021'],
datasets: [{data: [0, 1, 2, 3, 4]}] datasets: [{data: [0, 1, 2, 3, 4]}]
}, },
options: { options: {
@ -1325,7 +1325,8 @@ describe('Time scale tests', function() {
x: { x: {
type: 'time', type: 'time',
time: { time: {
parser: 'YYYY' parser: 'YYYY',
unit: 'year'
}, },
ticks: { ticks: {
source: source source: source
@ -1341,7 +1342,7 @@ describe('Time scale tests', function() {
var scale = this.chart.scales.x; var scale = this.chart.scales.x;
expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left); expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left);
expect(scale.getPixelForValue(moment('2025').valueOf())).toBeCloseToPixel(scale.left + scale.width); expect(scale.getPixelForValue(moment('2021').valueOf())).toBeCloseToPixel(scale.left + scale.width);
}); });
it ('should add offset from the edges if offset is true', function() { it ('should add offset from the edges if offset is true', function() {
@ -1357,7 +1358,7 @@ describe('Time scale tests', function() {
var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2); var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2);
expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + firstTickInterval / 2); expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + firstTickInterval / 2);
expect(scale.getPixelForValue(moment('2025').valueOf())).toBeCloseToPixel(scale.left + scale.width - lastTickInterval / 2); expect(scale.getPixelForValue(moment('2021').valueOf())).toBeCloseToPixel(scale.left + scale.width - lastTickInterval / 2);
}); });
it ('should not add offset if min and max extend the labels range', function() { it ('should not add offset if min and max extend the labels range', function() {
@ -1430,8 +1431,8 @@ describe('Time scale tests', function() {
this.chart = window.acquireChart({ this.chart = window.acquireChart({
type: 'line', type: 'line',
data: { data: {
labels: ['2017', '2019', '2020', '2025', '2042'], labels: ['2017', '2018', '2019', '2020', '2021'],
datasets: [{data: [0, 1, 2, 3, 4, 5]}] datasets: [{data: [0, 1, 2, 3, 4]}]
}, },
options: { options: {
scales: { scales: {
@ -1440,6 +1441,7 @@ describe('Time scale tests', function() {
reverse: true, reverse: true,
time: { time: {
parser: 'YYYY', parser: 'YYYY',
unit: 'year'
}, },
ticks: { ticks: {
source: 'labels', source: 'labels',
@ -1456,13 +1458,13 @@ describe('Time scale tests', function() {
it ('should reverse the labels', function() { it ('should reverse the labels', function() {
var scale = this.chart.scales.x; var scale = this.chart.scales.x;
expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + scale.width); expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + scale.width);
expect(scale.getPixelForValue(moment('2042').valueOf())).toBeCloseToPixel(scale.left); expect(scale.getPixelForValue(moment('2021').valueOf())).toBeCloseToPixel(scale.left);
}); });
it ('should reverse the values for pixels', function() { it ('should reverse the values for pixels', function() {
var scale = this.chart.scales.x; var scale = this.chart.scales.x;
expect(scale.getValueForPixel(scale.left)).toBeCloseToTime({ expect(scale.getValueForPixel(scale.left)).toBeCloseToTime({
value: moment('2042-01-01T00:00:00'), value: moment('2021-01-01T00:00:00'),
unit: 'hour', unit: 'hour',
}); });
expect(scale.getValueForPixel(scale.left + scale.width)).toBeCloseToTime({ expect(scale.getValueForPixel(scale.left + scale.width)).toBeCloseToTime({
@ -1480,11 +1482,11 @@ describe('Time scale tests', function() {
chart.update(); chart.update();
var numTicks = scale.ticks.length; var numTicks = scale.ticks.length;
var firstTickInterval = scale.getPixelForTick(1) - scale.getPixelForTick(0); var firstTickInterval = scale.getPixelForTick(numTicks - 2) - scale.getPixelForTick(numTicks - 1);
var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2); var lastTickInterval = scale.getPixelForTick(0) - scale.getPixelForTick(1);
expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + scale.width - lastTickInterval / 2); expect(scale.getPixelForValue(moment('2017').valueOf())).toBeCloseToPixel(scale.left + scale.width - lastTickInterval / 2);
expect(scale.getPixelForValue(moment('2042').valueOf())).toBeCloseToPixel(scale.left + firstTickInterval / 2); expect(scale.getPixelForValue(moment('2021').valueOf())).toBeCloseToPixel(scale.left + firstTickInterval / 2);
}); });
it ('should reverse the values for pixels if offset is true', function() { it ('should reverse the values for pixels if offset is true', function() {
@ -1496,12 +1498,12 @@ describe('Time scale tests', function() {
chart.update(); chart.update();
var numTicks = scale.ticks.length; var numTicks = scale.ticks.length;
var firstTickInterval = scale.getPixelForTick(1) - scale.getPixelForTick(0); var firstTickInterval = scale.getPixelForTick(numTicks - 2) - scale.getPixelForTick(numTicks - 1);
var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2); var lastTickInterval = scale.getPixelForTick(0) - scale.getPixelForTick(1);
expect(scale.getValueForPixel(scale.left + lastTickInterval / 2)).toBeCloseToTime({ expect(scale.getValueForPixel(scale.left + lastTickInterval / 2)).toBeCloseToTime({
value: moment('2042-01-01T00:00:00'), value: moment('2021-01-01T00:00:00'),
unit: 'hour', unit: 'year',
}); });
expect(scale.getValueForPixel(scale.left + scale.width - firstTickInterval / 2)).toBeCloseToTime({ expect(scale.getValueForPixel(scale.left + scale.width - firstTickInterval / 2)).toBeCloseToTime({
value: moment('2017-01-01T00:00:00'), value: moment('2017-01-01T00:00:00'),