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;
}
}
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';
* @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});
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() {