]> git.ipfire.org Git - thirdparty/Chart.js.git/commitdiff
Fix setting options in array of objects (#9062)
authorJukka Kurkela <jukka.kurkela@gmail.com>
Wed, 12 May 2021 20:08:17 +0000 (23:08 +0300)
committerGitHub <noreply@github.com>
Wed, 12 May 2021 20:08:17 +0000 (23:08 +0300)
* Fix setting options in array of objects

* CC

src/helpers/helpers.config.js
test/specs/helpers.config.tests.js

index 1c70d7a780c28b35b9a9329b41a32dc7dee8c291..a3625984daada08fcc2eed57fc49296f9053cec2 100644 (file)
@@ -290,13 +290,8 @@ function createSubResolver(parentScopes, resolver, prop, value) {
       return false;
     }
   }
-  return _createResolver([...set], [''], rootScopes, fallback, () => {
-    const parent = resolver._getTarget();
-    if (!(prop in parent)) {
-      parent[prop] = {};
-    }
-    return parent[prop];
-  });
+  return _createResolver([...set], [''], rootScopes, fallback,
+    () => subGetTarget(resolver, prop, value));
 }
 
 function addScopesFromKey(set, allScopes, key, fallback) {
@@ -306,6 +301,19 @@ function addScopesFromKey(set, allScopes, key, fallback) {
   return key;
 }
 
+function subGetTarget(resolver, prop, value) {
+  const parent = resolver._getTarget();
+  if (!(prop in parent)) {
+    parent[prop] = {};
+  }
+  const target = parent[prop];
+  if (isArray(target) && isObject(value)) {
+    // For array of objects, the object is used to store updated values
+    return value;
+  }
+  return target;
+}
+
 function _resolveWithPrefixes(prop, prefixes, scopes, proxy) {
   let value;
   for (const prefix of prefixes) {
index 2c2da96359be8313d0947220f39065bef20de964..811d386d303c09cbd8e4cde0dece8a0ccc3256ec 100644 (file)
@@ -752,6 +752,23 @@ describe('Chart.helpers.config', function() {
       expect(fn()).toEqual('ok');
     });
 
+    it('should properly set value to object in array of objects', function() {
+      const defaults = {};
+      const options = {
+        annotations: [{
+          value: 10
+        }, {
+          value: 20
+        }]
+      };
+      const resolver = _attachContext(_createResolver([options, defaults]), {test: true});
+      expect(resolver.annotations[0].value).toEqual(10);
+
+      resolver.annotations[0].value = 15;
+      expect(options.annotations[0].value).toEqual(15);
+      expect(options.annotations[1].value).toEqual(20);
+    });
+
     describe('_indexable and _scriptable', function() {
       it('should default to true', function() {
         const options = {