From 2e608344bccc7f87008596155b5a220d0a819e38 Mon Sep 17 00:00:00 2001 From: kurkle Date: Tue, 28 Jun 2022 23:54:56 +0300 Subject: [PATCH] Fix options update when changing to shared opts --- 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 e2b45bde3fd..1a70b82bdad 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 1b0241fcae6..67ceb2a0620 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 2be27615bcd..848432bba60 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 7fe2efecbcb..9e799cd5567 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 85cc50e9162..a2f031f9e09 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 00000000000..9492ccf56ce --- /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 HcmV?d00001