Ensure scriptable context reflects updated data (#8765)

This commit is contained in:
Jukka Kurkela 2021-04-01 14:17:02 +03:00 committed by GitHub
parent d2c8402445
commit bc2c92e65c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 85 additions and 7 deletions

View File

@ -151,11 +151,11 @@ function getFirstScaleId(chart, axis) {
return Object.keys(scales).filter(key => scales[key].axis === axis).shift();
}
function createDatasetContext(parent, index, dataset) {
function createDatasetContext(parent, index) {
return Object.assign(Object.create(parent),
{
active: false,
dataset,
dataset: undefined,
datasetIndex: index,
index,
mode: 'default',
@ -164,12 +164,12 @@ function createDatasetContext(parent, index, dataset) {
);
}
function createDataContext(parent, index, point, raw, element) {
function createDataContext(parent, index, element) {
return Object.assign(Object.create(parent), {
active: false,
dataIndex: index,
parsed: point,
raw,
parsed: undefined,
raw: undefined,
element,
index,
mode: 'default',
@ -704,9 +704,13 @@ export default class DatasetController {
if (index >= 0 && index < me._cachedMeta.data.length) {
const element = me._cachedMeta.data[index];
context = element.$context ||
(element.$context = createDataContext(me.getContext(), index, me.getParsed(index), dataset.data[index], element));
(element.$context = createDataContext(me.getContext(), index, element));
context.parsed = me.getParsed(index);
context.raw = dataset.data[index];
} else {
context = me.$context || (me.$context = createDatasetContext(me.chart.getContext(), me.index, dataset));
context = me.$context ||
(me.$context = createDatasetContext(me.chart.getContext(), me.index));
context.dataset = dataset;
}
context.active = !!active;

View File

@ -881,4 +881,78 @@ describe('Chart.DatasetController', function() {
});
});
});
describe('getContext', function() {
it('should reflect updated data', function() {
var chart = acquireChart({
type: 'scatter',
data: {
datasets: [{
data: [{x: 1, y: 0}, {x: 2, y: '1'}]
}]
},
});
let meta = chart.getDatasetMeta(0);
expect(meta.controller.getContext(undefined, true, 'test')).toEqual(jasmine.objectContaining({
active: true,
datasetIndex: 0,
dataset: chart.data.datasets[0],
index: 0,
mode: 'test'
}));
expect(meta.controller.getContext(1, false, 'datatest')).toEqual(jasmine.objectContaining({
active: false,
datasetIndex: 0,
dataset: chart.data.datasets[0],
dataIndex: 1,
element: meta.data[1],
index: 1,
parsed: {x: 2, y: 1},
raw: {x: 2, y: '1'},
mode: 'datatest'
}));
chart.data.datasets[0].data[1].y = 5;
chart.update();
expect(meta.controller.getContext(1, false, 'datatest')).toEqual(jasmine.objectContaining({
active: false,
datasetIndex: 0,
dataset: chart.data.datasets[0],
dataIndex: 1,
element: meta.data[1],
index: 1,
parsed: {x: 2, y: 5},
raw: {x: 2, y: 5},
mode: 'datatest'
}));
chart.data.datasets = [{
data: [{x: 0, y: 0}, {x: 1, y: 1}]
}];
chart.update();
// meta is re-created when dataset is replaced
meta = chart.getDatasetMeta(0);
expect(meta.controller.getContext(undefined, false, 'test2')).toEqual(jasmine.objectContaining({
active: false,
datasetIndex: 0,
dataset: chart.data.datasets[0],
index: 0,
mode: 'test2'
}));
expect(meta.controller.getContext(1, true, 'datatest2')).toEqual(jasmine.objectContaining({
active: true,
datasetIndex: 0,
dataset: chart.data.datasets[0],
dataIndex: 1,
element: meta.data[1],
index: 1,
parsed: {x: 1, y: 1},
raw: {x: 1, y: 1},
mode: 'datatest2'
}));
});
});
});