From 497464e1b9c396e49fe14364c863d3ba9504a9fd Mon Sep 17 00:00:00 2001 From: Akihiko Kusanagi Date: Mon, 10 Jun 2019 08:23:43 +0100 Subject: [PATCH 1/2] Fix getValueForPixel in time scale --- src/scales/scale.time.js | 16 ++++++++++------ test/specs/scale.time.tests.js | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 6 deletions(-) diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 1be680ef5ed..07ef0dd8d48 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -704,13 +704,14 @@ module.exports = Scale.extend({ */ getPixelForOffset: function(time) { var me = this; - var isReverse = me.options.ticks.reverse; + var offsets = me._offsets; var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; var pos = interpolate(me._table, 'time', time, 'pos'); - var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + var offset = size * (offsets.start + pos) / (offsets.start + 1 + offsets.end); - return isReverse ? start - offset : start + offset; + return me.options.ticks.reverse ? + (me._horizontal ? me.right : me.bottom) - offset : + (me._horizontal ? me.left : me.top) + offset; }, getPixelForValue: function(value, index, datasetIndex) { @@ -739,9 +740,12 @@ module.exports = Scale.extend({ getValueForPixel: function(pixel) { var me = this; + var offsets = me._offsets; var size = me._horizontal ? me.width : me.height; - var start = me._horizontal ? me.left : me.top; - var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var offset = me.options.ticks.reverse ? + (me._horizontal ? me.right : me.bottom) - pixel : + pixel - (me._horizontal ? me.left : me.top); + var pos = (size ? offset / size : 0) * (offsets.start + 1 + offsets.end) - offsets.start; var time = interpolate(me._table, 'pos', pos, 'time'); // DEPRECATION, we should return time directly diff --git a/test/specs/scale.time.tests.js b/test/specs/scale.time.tests.js index 39a920ccd26..367fa75defa 100755 --- a/test/specs/scale.time.tests.js +++ b/test/specs/scale.time.tests.js @@ -1512,6 +1512,18 @@ describe('Time scale tests', function() { expect(scale.getPixelForValue('2042')).toBeCloseToPixel(scale.left); }); + it ('should reverse the values for pixels', function() { + var scale = this.chart.chart.scales.x; + expect(scale.getValueForPixel(scale.left)).toBeCloseToTime({ + value: moment('2042-01-01T00:00:00'), + unit: 'hour', + }); + expect(scale.getValueForPixel(scale.left + scale.width)).toBeCloseToTime({ + value: moment('2017-01-01T00:00:00'), + unit: 'hour', + }); + }); + it ('should reverse the bars and add offsets if offset is true', function() { var chart = this.chart; var scale = chart.scales.x; @@ -1527,6 +1539,28 @@ describe('Time scale tests', function() { expect(scale.getPixelForValue('2017')).toBeCloseToPixel(scale.left + scale.width - lastTickInterval / 2); expect(scale.getPixelForValue('2042')).toBeCloseToPixel(scale.left + firstTickInterval / 2); }); + + it ('should reverse the values for pixels if offset is true', function() { + var chart = this.chart; + var scale = chart.scales.x; + var options = chart.options.scales.xAxes[0]; + + options.offset = true; + chart.update(); + + var numTicks = scale.ticks.length; + var firstTickInterval = scale.getPixelForTick(1) - scale.getPixelForTick(0); + var lastTickInterval = scale.getPixelForTick(numTicks - 1) - scale.getPixelForTick(numTicks - 2); + + expect(scale.getValueForPixel(scale.left + firstTickInterval / 2)).toBeCloseToTime({ + value: moment('2042-01-01T00:00:00'), + unit: 'hour', + }); + expect(scale.getValueForPixel(scale.left + scale.width - lastTickInterval / 2)).toBeCloseToTime({ + value: moment('2017-01-01T00:00:00'), + unit: 'hour', + }); + }); }); }); From 612f55ea4e6a758d571ff98e08e0b6f3a02fd282 Mon Sep 17 00:00:00 2001 From: Akihiko Kusanagi Date: Fri, 14 Jun 2019 13:23:12 +0200 Subject: [PATCH 2/2] Minor refactoring --- src/scales/scale.time.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scales/scale.time.js b/src/scales/scale.time.js index 07ef0dd8d48..de6b5f61808 100644 --- a/src/scales/scale.time.js +++ b/src/scales/scale.time.js @@ -401,7 +401,7 @@ function computeOffsets(table, ticks, min, max, options) { } } - return {start: start, end: end}; + return {start: start, end: end, factor: 1 / (start + 1 + end)}; } function ticksFromTimestamps(scale, values, majorUnit) { @@ -707,7 +707,7 @@ module.exports = Scale.extend({ var offsets = me._offsets; var size = me._horizontal ? me.width : me.height; var pos = interpolate(me._table, 'time', time, 'pos'); - var offset = size * (offsets.start + pos) / (offsets.start + 1 + offsets.end); + var offset = size * (offsets.start + pos) * offsets.factor; return me.options.ticks.reverse ? (me._horizontal ? me.right : me.bottom) - offset : @@ -745,7 +745,7 @@ module.exports = Scale.extend({ var offset = me.options.ticks.reverse ? (me._horizontal ? me.right : me.bottom) - pixel : pixel - (me._horizontal ? me.left : me.top); - var pos = (size ? offset / size : 0) * (offsets.start + 1 + offsets.end) - offsets.start; + var pos = offset / size / offsets.factor - offsets.start; var time = interpolate(me._table, 'pos', pos, 'time'); // DEPRECATION, we should return time directly