diff --git a/src/helpers/helpers.config.js b/src/helpers/helpers.config.js index 4d27f9e5b02..154d42a4969 100644 --- a/src/helpers/helpers.config.js +++ b/src/helpers/helpers.config.js @@ -251,12 +251,12 @@ function resolveFallback(fallback, prop, value) { const getScope = (key, parent) => key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined; -function addScopes(set, parentScopes, key, parentFallback) { +function addScopes(set, parentScopes, key, parentFallback, value) { for (const parent of parentScopes) { const scope = getScope(key, parent); if (scope) { set.add(scope); - const fallback = resolveFallback(scope._fallback, key, scope); + const fallback = resolveFallback(scope._fallback, key, value); if (defined(fallback) && fallback !== key && fallback !== parentFallback) { // When we reach the descriptor that defines a new _fallback, return that. // The fallback will resume to that new scope. @@ -277,12 +277,12 @@ function createSubResolver(parentScopes, resolver, prop, value) { const allScopes = [...parentScopes, ...rootScopes]; const set = new Set(); set.add(value); - let key = addScopesFromKey(set, allScopes, prop, fallback || prop); + let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value); if (key === null) { return false; } if (defined(fallback) && fallback !== prop) { - key = addScopesFromKey(set, allScopes, fallback, key); + key = addScopesFromKey(set, allScopes, fallback, key, value); if (key === null) { return false; } @@ -291,9 +291,9 @@ function createSubResolver(parentScopes, resolver, prop, value) { () => subGetTarget(resolver, prop, value)); } -function addScopesFromKey(set, allScopes, key, fallback) { +function addScopesFromKey(set, allScopes, key, fallback, item) { while (key) { - key = addScopes(set, allScopes, key, fallback); + key = addScopes(set, allScopes, key, fallback, item); } return key; } diff --git a/test/specs/helpers.config.tests.js b/test/specs/helpers.config.tests.js index 58e295b580b..151bad76126 100644 --- a/test/specs/helpers.config.tests.js +++ b/test/specs/helpers.config.tests.js @@ -652,6 +652,46 @@ describe('Chart.helpers.config', function() { }); }); + it('should call _fallback with proper value from array when descriptor is object', function() { + const spy = jasmine.createSpy('fallback'); + const descriptors = { + items: { + _fallback: spy + } + }; + const options = { + items: [{test: true}] + }; + const resolver = _createResolver([options, descriptors]); + const opts = _attachContext(resolver, {dymmy: true}); + const item0 = opts.items[0]; + expect(item0.test).toEqual(true); + expect(spy).toHaveBeenCalledWith('items', options.items[0]); + }); + + it('should call _fallback with proper value from array when descriptor and defaults are objects', function() { + const spy = jasmine.createSpy('fallback'); + const descriptors = { + items: { + _fallback: spy + } + }; + const defaults = { + items: { + type: 'defaultType' + } + }; + const options = { + items: [{test: true}] + }; + const resolver = _createResolver([options, defaults, descriptors]); + const opts = _attachContext(resolver, {dymmy: true}); + const item0 = opts.items[0]; + console.warn(opts._proxy._scopes); + expect(item0.test).toEqual(true); + expect(spy).toHaveBeenCalledWith('items', options.items[0]); + }); + it('should support overriding options', function() { const options = { fn1: ctx => ctx.index,