]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Assign unique scale IDs (#6291)
authorAkihiko Kusanagi <nagi@nagi-p.com>
Sun, 9 Jun 2019 07:45:12 +0000 (15:45 +0800)
committerGitHub <noreply@github.com>
Sun, 9 Jun 2019 07:45:12 +0000 (15:45 +0800)
src/core/core.controller.js
test/specs/core.controller.tests.js

index 168d40b494057833910853a0e284bf48da26f917..5349fb5f72de6166877710ccfc739799f8fb2c0f 100644 (file)
@@ -137,6 +137,19 @@ function updateConfig(chart) {
        chart.tooltip.initialize();
 }
 
+function nextAvailableScaleId(axesOpts, prefix, index) {
+       var id;
+       var hasId = function(obj) {
+               return obj.id === id;
+       };
+
+       do {
+               id = prefix + index++;
+       } while (helpers.findIndex(axesOpts, hasId) >= 0);
+
+       return id;
+}
+
 function positionIsHorizontal(position) {
        return position === 'top' || position === 'bottom';
 }
@@ -295,11 +308,15 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
                var scaleOptions = options.scale;
 
                helpers.each(scalesOptions.xAxes, function(xAxisOptions, index) {
-                       xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index);
+                       if (!xAxisOptions.id) {
+                               xAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);
+                       }
                });
 
                helpers.each(scalesOptions.yAxes, function(yAxisOptions, index) {
-                       yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index);
+                       if (!yAxisOptions.id) {
+                               yAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);
+                       }
                });
 
                if (scaleOptions) {
index 2fb982276eea6693cbb2b9236b1a5f3bc28f5ad3..010235f477419cedec9b751dfa052a602949473a 100644 (file)
@@ -1059,6 +1059,23 @@ describe('Chart', function() {
                        expect(yScale.options.ticks.max).toBe(10);
                });
 
+               it ('should assign unique scale IDs', function() {
+                       var chart = acquireChart({
+                               type: 'line',
+                               options: {
+                                       scales: {
+                                               xAxes: [{id: 'x-axis-0'}, {}, {}],
+                                               yAxes: [{id: 'y-axis-1'}, {}, {}]
+                                       }
+                               }
+                       });
+
+                       expect(Object.keys(chart.scales).sort()).toEqual([
+                               'x-axis-0', 'x-axis-1', 'x-axis-2',
+                               'y-axis-1', 'y-axis-2', 'y-axis-3'
+                       ]);
+               });
+
                it ('should remove discarded scale', function() {
                        var chart = acquireChart({
                                type: 'line',