]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix function support on _fallback (#8545)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Mon, 1 Mar 2021 17:19:55 +0000 (19:19 +0200)
committerGitHub <noreply@github.com>
Mon, 1 Mar 2021 17:19:55 +0000 (12:19 -0500)
src/helpers/helpers.config.js
test/specs/helpers.config.tests.js

index 96c0f8c93049024028a1800df6baeb0106925e57..ad005bff176ba8569c84fde63bdc811ab3f3a7c7 100644 (file)
@@ -245,14 +245,15 @@ function resolveFallback(fallback, prop, value) {
   return isFunction(fallback) ? fallback(prop, value) : fallback;
 }
 
-const getScope = (key, parent) => key === true ? parent : resolveObjectKey(parent, key);
+const getScope = (key, parent) => key === true ? parent
+  : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;
 
 function addScopes(set, parentScopes, key, parentFallback) {
   for (const parent of parentScopes) {
     const scope = getScope(key, parent);
     if (scope) {
       set.add(scope);
-      const fallback = scope._fallback;
+      const fallback = resolveFallback(scope._fallback, key, scope);
       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.
index 48e046a90c2537595a9000b53fdd517d333b8b59..e3ace633570ec331d6a7b8af2d350240008b29b4 100644 (file)
@@ -128,6 +128,37 @@ describe('Chart.helpers.config', function() {
         });
       });
 
+      it('should support _fallback as function', function() {
+        const descriptors = {
+          _fallback: (prop, value) => prop === 'hover' && value.shouldFall && 'interaction',
+        };
+        const defaults = {
+          interaction: {
+            mode: 'test',
+            priority: 'fall'
+          },
+          hover: {
+            priority: 'main'
+          }
+        };
+        const options = {
+          interaction: {
+            a: 1
+          },
+          hover: {
+            shouldFall: true,
+            b: 2
+          }
+        };
+        const resolver = _createResolver([options, defaults, descriptors]);
+        expect(resolver.hover).toEqualOptions({
+          mode: 'test',
+          priority: 'main',
+          a: 1,
+          b: 2
+        });
+      });
+
       it('should not fallback by default', function() {
         const defaults = {
           hover: {