From 4af9851584d70023e2f4443e0a0eef0fe11e55f3 Mon Sep 17 00:00:00 2001 From: Shubham Aggarwal <67068685+shubham242k@users.noreply.github.com> Date: Sat, 4 Sep 2021 23:13:34 +0530 Subject: [PATCH] Ensure that controllers derived from the bar controller work correct in stacked charts (#9587) * change parameter of functions * argument and parameter change in DatasetController.js * changing variable name to proper convention * Update controller.bar.js --- src/controllers/controller.bar.js | 15 ++++++++------- src/core/core.datasetController.js | 8 ++++---- test/specs/core.datasetController.tests.js | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index e97f174f4..a14631067 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -4,13 +4,13 @@ import { valueOrDefault, resolveObjectKey, sign, defined } from '../helpers'; -function getAllScaleValues(scale) { +function getAllScaleValues(scale, type) { if (!scale._cache.$bar) { - const metas = scale.getMatchingVisibleMetas('bar'); + const visibleMetas = scale.getMatchingVisibleMetas(type); let values = []; - for (let i = 0, ilen = metas.length; i < ilen; i++) { - values = values.concat(metas[i].controller.getAllParsedValues(scale)); + for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) { + values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale)); } scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b)); } @@ -21,8 +21,9 @@ function getAllScaleValues(scale) { * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. * @private */ -function computeMinSampleSize(scale) { - const values = getAllScaleValues(scale); +function computeMinSampleSize(meta) { + const scale = meta.iScale; + const values = getAllScaleValues(scale, meta.type); let min = scale._length; let i, ilen, curr, prev; const updateMinAndPrev = () => { @@ -479,7 +480,7 @@ export default class BarController extends DatasetController { } const barThickness = opts.barThickness; - const min = barThickness || computeMinSampleSize(iScale); + const min = barThickness || computeMinSampleSize(meta); return { min, diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 812ee96bc..05919714b 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -128,8 +128,8 @@ function getOrCreateStack(stacks, stackKey, indexValue) { return subStack[indexValue] || (subStack[indexValue] = {}); } -function getLastIndexInStack(stack, vScale, positive) { - for (const meta of vScale.getMatchingVisibleMetas('bar').reverse()) { +function getLastIndexInStack(stack, vScale, positive, type) { + for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) { const value = stack[meta.index]; if ((positive && value > 0) || (!positive && value < 0)) { return meta.index; @@ -156,8 +156,8 @@ function updateStacks(controller, parsed) { stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index); stack[datasetIndex] = value; - stack._top = getLastIndexInStack(stack, vScale, true); - stack._bottom = getLastIndexInStack(stack, vScale, false); + stack._top = getLastIndexInStack(stack, vScale, true, meta.type); + stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type); } } diff --git a/test/specs/core.datasetController.tests.js b/test/specs/core.datasetController.tests.js index 372655c0a..3f08d209e 100644 --- a/test/specs/core.datasetController.tests.js +++ b/test/specs/core.datasetController.tests.js @@ -829,7 +829,7 @@ describe('Chart.DatasetController', function() { }); var meta = chart.getDatasetMeta(0); - expect(meta._parsed[0]._stacks).toEqual(jasmine.objectContaining({y: {0: 10, 1: 20, _top: null, _bottom: null}})); + expect(meta._parsed[0]._stacks).toEqual(jasmine.objectContaining({y: {0: 10, 1: 20, _top: 1, _bottom: null}})); }); describe('resolveDataElementOptions', function() { -- 2.47.2