diff --git a/src/controllers/controller.bubble.js b/src/controllers/controller.bubble.js index eb770260c3d..1b0241fcae6 100644 --- a/src/controllers/controller.bubble.js +++ b/src/controllers/controller.bubble.js @@ -1,5 +1,5 @@ import DatasetController from '../core/core.datasetController'; -import {resolveObjectKey, valueOrDefault} from '../helpers/helpers.core'; +import {valueOrDefault} from '../helpers/helpers.core'; export default class BubbleController extends DatasetController { initialize() { @@ -7,22 +7,40 @@ export default class BubbleController extends DatasetController { super.initialize(); } + /** + * Parse array of primitive values + * @protected + */ + parsePrimitiveData(meta, data, start, count) { + const parsed = super.parsePrimitiveData(meta, data, start, count); + for (let i = 0; i < parsed.length; i++) { + parsed[i]._custom = this.resolveDataElementOptions(i + start).radius; + } + return parsed; + } + + /** + * Parse array of arrays + * @protected + */ + parseArrayData(meta, data, start, count) { + const parsed = super.parseArrayData(meta, data, start, count); + for (let i = 0; i < parsed.length; i++) { + const item = data[start + i]; + parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius); + } + return parsed; + } + /** * Parse array of objects * @protected */ parseObjectData(meta, data, start, count) { - const {xScale, yScale} = meta; - const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing; - const parsed = []; - let i, ilen, item; - for (i = start, ilen = start + count; i < ilen; ++i) { - item = data[i]; - parsed.push({ - x: xScale.parse(resolveObjectKey(item, xAxisKey), i), - y: yScale.parse(resolveObjectKey(item, yAxisKey), i), - _custom: item && item.r && +item.r - }); + const parsed = super.parseObjectData(meta, data, start, count); + for (let i = 0; i < parsed.length; i++) { + const item = data[start + i]; + parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius); } return parsed; } @@ -31,11 +49,11 @@ export default class BubbleController extends DatasetController { * @protected */ getMaxOverflow() { - const {data, _parsed} = this._cachedMeta; + const data = this._cachedMeta.data; let max = 0; for (let i = data.length - 1; i >= 0; --i) { - max = Math.max(max, data[i].size() / 2, _parsed[i]._custom); + max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2); } return max > 0 && max; } diff --git a/test/fixtures/controller.bubble/clip.png b/test/fixtures/controller.bubble/clip.png index 6ce0ce1247c..7214e4e209c 100644 Binary files a/test/fixtures/controller.bubble/clip.png and b/test/fixtures/controller.bubble/clip.png differ diff --git a/test/fixtures/controller.bubble/hover-radius-zero.js b/test/fixtures/controller.bubble/hover-radius-zero.js new file mode 100644 index 00000000000..3628577710b --- /dev/null +++ b/test/fixtures/controller.bubble/hover-radius-zero.js @@ -0,0 +1,48 @@ +module.exports = { + config: { + type: 'bubble', + data: { + labels: [2, 2, 2, 2], + datasets: [{ + data: [ + [1, 1], + [1, 2], + [1, 3, 20], + [1, 4, 20] + ] + }, { + data: [1, 2, 3, 4] + }, { + data: [{x: 3, y: 1}, {x: 3, y: 2}, {x: 3, y: 3, r: 15}, {x: 3, y: 4, r: 15}] + }] + }, + options: { + events: [], + radius: 10, + hoverRadius: 0, + backgroundColor: 'blue', + hoverBackgroundColor: 'red', + scales: { + x: {display: false, bounds: 'data'}, + y: {display: false} + }, + layout: { + padding: 24 + } + } + }, + options: { + canvas: { + height: 256, + width: 256 + }, + run(chart) { + chart.setActiveElements([ + {datasetIndex: 0, index: 1}, {datasetIndex: 0, index: 2}, + {datasetIndex: 1, index: 1}, {datasetIndex: 1, index: 2}, + {datasetIndex: 2, index: 1}, {datasetIndex: 2, index: 2}, + ]); + chart.update(); + } + } +}; diff --git a/test/fixtures/controller.bubble/hover-radius-zero.png b/test/fixtures/controller.bubble/hover-radius-zero.png new file mode 100644 index 00000000000..d86d7ddcaee Binary files /dev/null and b/test/fixtures/controller.bubble/hover-radius-zero.png differ diff --git a/test/fixtures/controller.bubble/padding.png b/test/fixtures/controller.bubble/padding.png index 6a03d5c08dc..583120e4819 100644 Binary files a/test/fixtures/controller.bubble/padding.png and b/test/fixtures/controller.bubble/padding.png differ diff --git a/test/fixtures/controller.bubble/point-style.png b/test/fixtures/controller.bubble/point-style.png index d949141d81d..1957aba0956 100644 Binary files a/test/fixtures/controller.bubble/point-style.png and b/test/fixtures/controller.bubble/point-style.png differ diff --git a/test/fixtures/controller.bubble/radius-data.png b/test/fixtures/controller.bubble/radius-data.png index ac819c21e45..d565dbdcffa 100644 Binary files a/test/fixtures/controller.bubble/radius-data.png and b/test/fixtures/controller.bubble/radius-data.png differ diff --git a/test/fixtures/core.scale/border-behind-elements.png b/test/fixtures/core.scale/border-behind-elements.png index d3f37719d7e..f4a9e019b53 100644 Binary files a/test/fixtures/core.scale/border-behind-elements.png and b/test/fixtures/core.scale/border-behind-elements.png differ