]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix getValueForPixel in time scale (#6328)
authorAkihiko Kusanagi <nagi@nagi-p.com>
Sat, 22 Jun 2019 13:56:31 +0000 (21:56 +0800)
committerEvert Timberg <evert.timberg@gmail.com>
Sat, 22 Jun 2019 13:56:31 +0000 (09:56 -0400)
* Fix getValueForPixel in time scale

* Minor refactoring

src/scales/scale.time.js
test/specs/scale.time.tests.js

index e0e12f52bf2db28c4c164f359a25a6f0951869ee..0f6348bc433c6ce35e4abeb11a2d0daf8e1f1a70 100644 (file)
@@ -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 setMajorTicks(scale, ticks, map, majorUnit) {
@@ -723,13 +723,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.factor;
 
-               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) {
@@ -758,9 +759,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 = offset / size / offsets.factor - offsets.start;
                var time = interpolate(me._table, 'pos', pos, 'time');
 
                // DEPRECATION, we should return time directly
index a380253fa308ea0a4e6de4e996680355dfd9d014..8939dcb78a70f1048e0232d9931ba63c93a87799 100755 (executable)
@@ -1517,6 +1517,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;
@@ -1532,6 +1544,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',
+                               });
+                       });
                });
        });