From 7a1390611410167ee7a576c32dc3bf369112eed0 Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Wed, 29 Jun 2022 16:44:51 +0300 Subject: [PATCH] Fix options update when changing to shared opts (#10451) --- src/controllers/controller.bar.js | 6 +--- src/controllers/controller.bubble.js | 8 ++--- src/controllers/controller.doughnut.js | 5 +-- src/controllers/controller.line.js | 6 +--- src/core/core.datasetController.js | 12 +++++++ .../radius/scriptable-to-value.js | 32 ++++++++++++++++++ .../radius/scriptable-to-value.png | Bin 0 -> 7275 bytes 7 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 test/fixtures/controller.line/radius/scriptable-to-value.js create mode 100644 test/fixtures/controller.line/radius/scriptable-to-value.png diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index cc047e4a6..557bffbd8 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -350,11 +350,7 @@ export default class BarController extends DatasetController { const base = vScale.getBasePixel(); const horizontal = vScale.isHorizontal(); const ruler = this._getRuler(); - const firstOpts = this.resolveDataElementOptions(start, mode); - const sharedOptions = this.getSharedOptions(firstOpts); - const includeOptions = this.includeOptions(mode, sharedOptions); - - this.updateSharedOptions(sharedOptions, mode, firstOpts); + const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode); for (let i = start; i < start + count; i++) { const parsed = this.getParsed(i); diff --git a/src/controllers/controller.bubble.js b/src/controllers/controller.bubble.js index 1b0241fca..67ceb2a06 100644 --- a/src/controllers/controller.bubble.js +++ b/src/controllers/controller.bubble.js @@ -85,9 +85,7 @@ export default class BubbleController extends DatasetController { updateElements(points, start, count, mode) { const reset = mode === 'reset'; const {iScale, vScale} = this._cachedMeta; - const firstOpts = this.resolveDataElementOptions(start, mode); - const sharedOptions = this.getSharedOptions(firstOpts); - const includeOptions = this.includeOptions(mode, sharedOptions); + const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode); const iAxis = iScale.axis; const vAxis = vScale.axis; @@ -101,7 +99,7 @@ export default class BubbleController extends DatasetController { properties.skip = isNaN(iPixel) || isNaN(vPixel); if (includeOptions) { - properties.options = this.resolveDataElementOptions(i, point.active ? 'active' : mode); + properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode); if (reset) { properties.options.radius = 0; @@ -110,8 +108,6 @@ export default class BubbleController extends DatasetController { this.updateElement(point, i, properties, mode); } - - this.updateSharedOptions(sharedOptions, mode, firstOpts); } /** diff --git a/src/controllers/controller.doughnut.js b/src/controllers/controller.doughnut.js index 2be27615b..848432bba 100644 --- a/src/controllers/controller.doughnut.js +++ b/src/controllers/controller.doughnut.js @@ -170,9 +170,7 @@ export default class DoughnutController extends DatasetController { const animateScale = reset && animationOpts.animateScale; const innerRadius = animateScale ? 0 : this.innerRadius; const outerRadius = animateScale ? 0 : this.outerRadius; - const firstOpts = this.resolveDataElementOptions(start, mode); - const sharedOptions = this.getSharedOptions(firstOpts); - const includeOptions = this.includeOptions(mode, sharedOptions); + const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode); let startAngle = this._getRotation(); let i; @@ -199,7 +197,6 @@ export default class DoughnutController extends DatasetController { this.updateElement(arc, i, properties, mode); } - this.updateSharedOptions(sharedOptions, mode, firstOpts); } calculateTotal() { diff --git a/src/controllers/controller.line.js b/src/controllers/controller.line.js index 7fe2efecb..9e799cd55 100644 --- a/src/controllers/controller.line.js +++ b/src/controllers/controller.line.js @@ -49,9 +49,7 @@ export default class LineController extends DatasetController { updateElements(points, start, count, mode) { const reset = mode === 'reset'; const {iScale, vScale, _stacked, _dataset} = this._cachedMeta; - const firstOpts = this.resolveDataElementOptions(start, mode); - const sharedOptions = this.getSharedOptions(firstOpts); - const includeOptions = this.includeOptions(mode, sharedOptions); + const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode); const iAxis = iScale.axis; const vAxis = vScale.axis; const {spanGaps, segment} = this.options; @@ -84,8 +82,6 @@ export default class LineController extends DatasetController { prevParsed = parsed; } - - this.updateSharedOptions(sharedOptions, mode, firstOpts); } /** diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 85cc50e91..a2f031f9e 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -840,6 +840,18 @@ export default class DatasetController { return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled; } + /** + * @todo v4, rename to getSharedOptions and remove excess functions + */ + _getSharedOptions(start, mode) { + const firstOpts = this.resolveDataElementOptions(start, mode); + const previouslySharedOptions = this._sharedOptions; + const sharedOptions = this.getSharedOptions(firstOpts); + const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions); + this.updateSharedOptions(sharedOptions, mode, firstOpts); + return {sharedOptions, includeOptions}; + } + /** * Utility for updating an element with new properties, using animations when appropriate. * @protected diff --git a/test/fixtures/controller.line/radius/scriptable-to-value.js b/test/fixtures/controller.line/radius/scriptable-to-value.js new file mode 100644 index 000000000..9492ccf56 --- /dev/null +++ b/test/fixtures/controller.line/radius/scriptable-to-value.js @@ -0,0 +1,32 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: ['A', 'B', 'C'], + datasets: [{ + data: [12, 19, 3] + }] + }, + options: { + animation: { + duration: 0 + }, + backgroundColor: 'red', + radius: () => 20, + scales: { + x: {display: false}, + y: {display: false} + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + }, + run: (chart) => { + chart.options.radius = 5; + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.line/radius/scriptable-to-value.png b/test/fixtures/controller.line/radius/scriptable-to-value.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e3b21d711a6e6219646084b002ef2a4bafffa2 GIT binary patch literal 7275 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 literal 0 Hc-jL100001 -- 2.47.2