]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix determineUnitForFormatting floating point error (#6259)
authorBen McCann <322311+benmccann@users.noreply.github.com>
Fri, 10 May 2019 13:02:30 +0000 (06:02 -0700)
committerSimon Brunel <simonbrunel@users.noreply.github.com>
Fri, 10 May 2019 13:02:30 +0000 (15:02 +0200)
src/adapters/adapter.moment.js
src/scales/scale.time.js
test/specs/scale.time.tests.js

index 5d7c1f3103dbea643058751adbddc4d4c35e2802..435c474ad3b140e1312fd9aebec4cef7f3dc027d 100644 (file)
@@ -43,7 +43,7 @@ adapters._date.override(typeof moment === 'function' ? {
        },
 
        diff: function(max, min, unit) {
-               return moment.duration(moment(max).diff(moment(min))).as(unit);
+               return moment(max).diff(moment(min), unit);
        },
 
        startOf: function(time, unit, weekday) {
index 2e9c14b8e226a3c7aa61aae1dbdb42e6469cd937..ebe44c55bf1be35efd7d27e6fcb933b91054957f 100644 (file)
@@ -300,7 +300,7 @@ function determineUnitForFormatting(scale, ticks, minUnit, min, max) {
 
        for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) {
                unit = UNITS[i];
-               if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) {
+               if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length - 1) {
                        return unit;
                }
        }
index 616f5c40a8060da84f3aa16e7a630d3d46a075b0..5f80dd7b55119d22096d3f00210b35e461de84a8 100755 (executable)
@@ -315,6 +315,41 @@ describe('Time scale tests', function() {
                expect(ticks).toEqual(['Jan 1', 'Jan 2', 'Jan 3']);
        });
 
+       it('should correctly determine the unit', function() {
+               var date = moment('Jan 01 1990', 'MMM DD YYYY');
+               var data = [];
+               for (var i = 0; i < 60; i++) {
+                       data.push({x: date.valueOf(), y: Math.random()});
+                       date = date.clone().add(1, 'month');
+               }
+
+               var chart = window.acquireChart({
+                       type: 'line',
+                       data: {
+                               datasets: [{
+                                       xAxisID: 'xScale0',
+                                       data: data
+                               }],
+                       },
+                       options: {
+                               scales: {
+                                       xAxes: [{
+                                               id: 'xScale0',
+                                               type: 'time',
+                                               ticks: {
+                                                       source: 'data',
+                                                       autoSkip: true
+                                               }
+                                       }],
+                               }
+                       }
+               });
+
+               var scale = chart.scales.xScale0;
+
+               expect(scale._unit).toEqual('month');
+       });
+
        it('should build ticks based on the appropriate label capacity', function() {
                var mockData = {
                        labels: [