mirror of
https://github.com/chartjs/Chart.js.git
synced 2026-03-23 08:36:52 +01:00
Support nested scriptable options for datasets (#9758)
* Support nested scriptable options for datasets
This commit is contained in:
@@ -371,12 +371,18 @@ function getResolver(resolverCache, scopes, prefixes) {
|
||||
return cached;
|
||||
}
|
||||
|
||||
const hasFunction = value => isObject(value)
|
||||
&& Object.keys(value).reduce((acc, key) => acc || isFunction(value[key]), false);
|
||||
|
||||
function needContext(proxy, names) {
|
||||
const {isScriptable, isIndexable} = _descriptors(proxy);
|
||||
|
||||
for (const prop of names) {
|
||||
if ((isScriptable(prop) && isFunction(proxy[prop]))
|
||||
|| (isIndexable(prop) && isArray(proxy[prop]))) {
|
||||
const scriptable = isScriptable(prop);
|
||||
const indexable = isIndexable(prop);
|
||||
const value = (indexable || scriptable) && proxy[prop];
|
||||
if ((scriptable && (isFunction(value) || hasFunction(value)))
|
||||
|| (indexable && isArray(value))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import PluginService from './core.plugins';
|
||||
import registry from './core.registry';
|
||||
import Config, {determineAxis, getIndexAxis} from './core.config';
|
||||
import {retinaScale, _isDomSupported} from '../helpers/helpers.dom';
|
||||
import {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined} from '../helpers/helpers.core';
|
||||
import {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction} from '../helpers/helpers.core';
|
||||
import {clearCanvas, clipArea, unclipArea, _isPointInArea} from '../helpers/helpers.canvas';
|
||||
// @ts-ignore
|
||||
import {version} from '../../package.json';
|
||||
@@ -536,14 +536,12 @@ class Chart {
|
||||
* @private
|
||||
*/
|
||||
_updateDatasets(mode) {
|
||||
const isFunction = typeof mode === 'function';
|
||||
|
||||
if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {
|
||||
this._updateDataset(i, isFunction ? mode({datasetIndex: i}) : mode);
|
||||
this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);
|
||||
}
|
||||
|
||||
this.notifyPlugins('afterDatasetsUpdate', {mode});
|
||||
|
||||
@@ -897,6 +897,28 @@ describe('Chart.DatasetController', function() {
|
||||
expect(opts0.$shared).not.toBeTrue();
|
||||
expect(Object.isFrozen(opts0)).toBeFalse();
|
||||
});
|
||||
|
||||
it('should support nested scriptable options', function() {
|
||||
const chart = acquireChart({
|
||||
type: 'line',
|
||||
data: {
|
||||
datasets: [{
|
||||
data: [100, 120, 130],
|
||||
fill: {
|
||||
value: (ctx) => ctx.type === 'dataset' ? 75 : 0
|
||||
}
|
||||
}]
|
||||
},
|
||||
});
|
||||
|
||||
const controller = chart.getDatasetMeta(0).controller;
|
||||
const opts = controller.resolveDatasetElementOptions();
|
||||
expect(opts).toEqualOptions({
|
||||
fill: {
|
||||
value: 75
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('_resolveAnimations', function() {
|
||||
|
||||
Reference in New Issue
Block a user