]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Correctly handle stacked groups when not adjacent (#4937)
authorjcopperfield <33193571+jcopperfield@users.noreply.github.com>
Tue, 14 Nov 2017 09:33:36 +0000 (10:33 +0100)
committerSimon Brunel <simonbrunel@users.noreply.github.com>
Tue, 14 Nov 2017 09:33:36 +0000 (10:33 +0100)
Only the dataset index was used for indexing the stack

src/controllers/controller.bar.js

index ae4aee45d178f1aaa6389d61db90359d2ecb5828..b811c6f05b1ef849cc25b729efa403bfa2b42c32 100644 (file)
@@ -201,10 +201,12 @@ module.exports = function(Chart) {
                },
 
                /**
-                * Returns the effective number of stacks based on groups and bar visibility.
+                * Returns the stacks based on groups and bar visibility.
+                * @param {Number} [last] - The dataset index
+                * @returns {Array} The stack list
                 * @private
                 */
-               getStackCount: function(last) {
+               _getStacks: function(last) {
                        var me = this;
                        var chart = me.chart;
                        var scale = me.getIndexScale();
@@ -223,15 +225,33 @@ module.exports = function(Chart) {
                                }
                        }
 
-                       return stacks.length;
+                       return stacks;
+               },
+
+               /**
+                * Returns the effective number of stacks based on groups and bar visibility.
+                * @private
+                */
+               getStackCount: function() {
+                       return this._getStacks().length;
                },
 
                /**
                 * Returns the stack index for the given dataset based on groups and bar visibility.
+                * @param {Number} [datasetIndex] - The dataset index
+                * @param {String} [name] - The stack name to find
+                * @returns {Number} The stack index
                 * @private
                 */
-               getStackIndex: function(datasetIndex) {
-                       return this.getStackCount(datasetIndex) - 1;
+               getStackIndex: function(datasetIndex, name) {
+                       var stacks = this._getStacks(datasetIndex);
+                       var index = (name !== undefined)
+                               ? stacks.indexOf(name)
+                               : -1; // indexOf returns -1 if element is not present
+
+                       return (index === -1)
+                               ? stacks.length - 1
+                               : index;
                },
 
                /**
@@ -312,7 +332,8 @@ module.exports = function(Chart) {
                calculateBarIndexPixels: function(datasetIndex, index, ruler) {
                        var me = this;
                        var options = ruler.scale.options;
-                       var stackIndex = me.getStackIndex(datasetIndex);
+                       var meta = me.getMeta();
+                       var stackIndex = me.getStackIndex(datasetIndex, meta.stack);
                        var pixels = ruler.pixels;
                        var base = pixels[index];
                        var length = pixels.length;