Fix crash with skipNull and uneven datasets (#10454)

This commit is contained in:
Jukka Kurkela 2022-06-29 14:46:48 +03:00 committed by GitHub
parent 58e736a0b9
commit e3b2b52790
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 36 additions and 21 deletions

View File

@ -390,29 +390,24 @@ export default class BarController extends DatasetController {
* @private
*/
_getStacks(last, dataIndex) {
const meta = this._cachedMeta;
const iScale = meta.iScale;
const metasets = iScale.getMatchingVisibleMetas(this._type);
const {iScale} = this._cachedMeta;
const metasets = iScale.getMatchingVisibleMetas(this._type)
.filter(meta => meta.controller.options.grouped);
const stacked = iScale.options.stacked;
const ilen = metasets.length;
const stacks = [];
let i, item;
for (i = 0; i < ilen; ++i) {
item = metasets[i];
const skipNull = (meta) => {
const parsed = meta.controller.getParsed(dataIndex);
const val = parsed && parsed[meta.vScale.axis];
if (!item.controller.options.grouped) {
continue;
if (isNullOrUndef(val) || isNaN(val)) {
return true;
}
};
if (typeof dataIndex !== 'undefined') {
const val = item.controller.getParsed(dataIndex)[
item.controller._cachedMeta.vScale.axis
];
if (isNullOrUndef(val) || isNaN(val)) {
continue;
}
for (const meta of metasets) {
if (dataIndex !== undefined && skipNull(meta)) {
continue;
}
// stacked | meta.stack
@ -420,11 +415,11 @@ export default class BarController extends DatasetController {
// false | x | x | x
// true | | x |
// undefined | | x | x
if (stacked === false || stacks.indexOf(item.stack) === -1 ||
(stacked === undefined && item.stack === undefined)) {
stacks.push(item.stack);
if (stacked === false || stacks.indexOf(meta.stack) === -1 ||
(stacked === undefined && meta.stack === undefined)) {
stacks.push(meta.stack);
}
if (item.index === last) {
if (meta.index === last) {
break;
}
}

View File

@ -1655,4 +1655,24 @@ describe('Chart.controllers.bar', function() {
expect(ctx.getCalls().filter(x => x.name === 'clip').length).toEqual(0);
});
});
it('should not crash with skipNull and uneven datasets', function() {
function unevenChart() {
window.acquireChart({
type: 'bar',
data: {
labels: [1, 2],
datasets: [
{data: [1, 2]},
{data: [1, 2, 3]},
]
},
options: {
skipNull: true,
}
});
}
expect(unevenChart).not.toThrow();
});
});