});
}
- /**
- * Updates the given metaset with the given dataset index. Ensures it's stored at that index
- * in the _metasets array by swapping with the metaset at that index if necessary.
- * @param {Object} meta - the dataset metadata
- * @param {number} index - the dataset index
- * @private
- */
- _updateMetasetIndex(meta, index) {
- const metasets = this._metasets;
- const oldIndex = meta.index;
- if (oldIndex !== index) {
- metasets[oldIndex] = metasets[index];
- metasets[index] = meta;
- meta.index = index;
- }
- }
-
/**
* @private
*/
const numData = me.data.datasets.length;
const numMeta = metasets.length;
+ metasets.sort((a, b) => a.index - b.index);
if (numMeta > numData) {
for (let i = numData; i < numMeta; ++i) {
me._destroyDatasetMeta(i);
meta.type = type;
meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options);
meta.order = dataset.order || 0;
- me._updateMetasetIndex(meta, i);
+ meta.index = i;
meta.label = '' + dataset.label;
meta.visible = me.isDatasetVisible(i);
let meta = metasets.filter(x => x && x._dataset === dataset).pop();
if (!meta) {
- meta = metasets[datasetIndex] = {
+ meta = {
type: null,
data: [],
dataset: null,
_parsed: [],
_sorted: false
};
+ metasets.push(meta);
}
return meta;
expect(metasets[2].order).toEqual(4);
expect(metasets[3].order).toEqual(3);
});
+ it('should update properly when dataset locations are swapped', function() {
+ const orig = this.chart.data.datasets;
+ this.chart.data.datasets = [orig[0], orig[2], orig[1], orig[3]];
+ this.chart.update();
+ let metasets = this.chart._metasets;
+ expect(metasets[0].label).toEqual('1');
+ expect(metasets[1].label).toEqual('3');
+ expect(metasets[2].label).toEqual('2');
+ expect(metasets[3].label).toEqual('4');
+
+ this.chart.data.datasets = [{label: 'new', order: 10}, orig[3], orig[2], orig[1], orig[0]];
+ this.chart.update();
+ metasets = this.chart._metasets;
+ expect(metasets[0].label).toEqual('new');
+ expect(metasets[1].label).toEqual('4');
+ expect(metasets[2].label).toEqual('3');
+ expect(metasets[3].label).toEqual('2');
+ expect(metasets[4].label).toEqual('1');
+
+ this.chart.data.datasets = [orig[3], orig[2], orig[1], {label: 'new', order: 10}];
+ this.chart.update();
+ metasets = this.chart._metasets;
+ expect(metasets[0].label).toEqual('4');
+ expect(metasets[1].label).toEqual('3');
+ expect(metasets[2].label).toEqual('2');
+ expect(metasets[3].label).toEqual('new');
+ });
});
describe('data visibility', function() {