From 6d3a1c5fa6ed1ff957ce08feb71ef9ad4a8f88c2 Mon Sep 17 00:00:00 2001 From: Jacco van den Berg <39033624+LeeLenaleee@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:56:53 +0100 Subject: [PATCH] Feature/active elements on top (#9920) * add flag to draw active items on top * add documentation and types * remove redundent check * added test * resolve linting errors * increase tollerance * remove axes for better test, hope no tolerance needed --- docs/charts/bubble.md | 2 + docs/charts/line.md | 2 + src/core/core.datasetController.js | 3 +- src/core/core.defaults.js | 1 + .../drawActiveElementsOnTop-false.js | 41 ++++++++++++++++++ .../drawActiveElementsOnTop-false.png | Bin 0 -> 7324 bytes types/index.esm.d.ts | 5 +++ 7 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 test/fixtures/core.interaction/drawActiveElementsOnTop-false.js create mode 100644 test/fixtures/core.interaction/drawActiveElementsOnTop-false.png diff --git a/docs/charts/bubble.md b/docs/charts/bubble.md index 61710badf..328612729 100644 --- a/docs/charts/bubble.md +++ b/docs/charts/bubble.md @@ -63,6 +63,7 @@ The bubble chart allows a number of properties to be specified for each dataset. | [`pointStyle`](#styling) | [`pointStyle`](../configuration/elements.md#types) | Yes | Yes | `'circle'` | [`rotation`](#styling) | `number` | Yes | Yes | `0` | [`radius`](#styling) | `number` | Yes | Yes | `3` +| [`drawActiveElementsOnTop`](#styling) | `boolean` | Yes | Yes | `true` All these values, if `undefined`, fallback to the scopes described in [option resolution](../general/options) @@ -86,6 +87,7 @@ The style of each bubble can be controlled with the following properties: | `pointStyle` | bubble [shape style](../configuration/elements.md#point-styles). | `rotation` | bubble rotation (in degrees). | `radius` | bubble radius (in pixels). +| `drawActiveElementsOnTop` | Draw the active bubbles of a dataset over the other bubbles of the dataset All these values, if `undefined`, fallback to the associated [`elements.point.*`](../configuration/elements.md#point-configuration) options. diff --git a/docs/charts/line.md b/docs/charts/line.md index 819799fe9..cf0787b9f 100644 --- a/docs/charts/line.md +++ b/docs/charts/line.md @@ -84,6 +84,7 @@ The line chart allows a number of properties to be specified for each dataset. T | [`tension`](#line-styling) | `number` | - | - | `0` | [`xAxisID`](#general) | `string` | - | - | first x axis | [`yAxisID`](#general) | `string` | - | - | first y axis +| [`drawActiveElementsOnTop`](#point-styling) | `boolean` | Yes | Yes | `true` All these values, if `undefined`, fallback to the scopes described in [option resolution](../general/options) @@ -112,6 +113,7 @@ The style of each point can be controlled with the following properties: | `pointRadius` | The radius of the point shape. If set to 0, the point is not rendered. | `pointRotation` | The rotation of the point in degrees. | `pointStyle` | Style of the point. [more...](../configuration/elements.md#point-styles) +| `drawActiveElementsOnTop` | Draw the active points of a dataset over the other points of the dataset All these values, if `undefined`, fallback first to the dataset options then to the associated [`elements.point.*`](../configuration/elements.md#point-configuration) options. diff --git a/src/core/core.datasetController.js b/src/core/core.datasetController.js index 8ba52e169..b6c6778d9 100644 --- a/src/core/core.datasetController.js +++ b/src/core/core.datasetController.js @@ -678,6 +678,7 @@ export default class DatasetController { const active = []; const start = this._drawStart || 0; const count = this._drawCount || (elements.length - start); + const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop; let i; if (meta.dataset) { @@ -689,7 +690,7 @@ export default class DatasetController { if (element.hidden) { continue; } - if (element.active) { + if (element.active && drawActiveElementsOnTop) { active.push(element); } else { element.draw(ctx, area); diff --git a/src/core/core.defaults.js b/src/core/core.defaults.js index eb0092894..9817e7aba 100644 --- a/src/core/core.defaults.js +++ b/src/core/core.defaults.js @@ -73,6 +73,7 @@ export class Defaults { this.scale = undefined; this.scales = {}; this.showLine = true; + this.drawActiveElementsOnTop = true; this.describe(_descriptors); } diff --git a/test/fixtures/core.interaction/drawActiveElementsOnTop-false.js b/test/fixtures/core.interaction/drawActiveElementsOnTop-false.js new file mode 100644 index 000000000..718555315 --- /dev/null +++ b/test/fixtures/core.interaction/drawActiveElementsOnTop-false.js @@ -0,0 +1,41 @@ +module.exports = { + config: { + type: 'bubble', + data: { + datasets: [{ + data: [ + {x: 1, y: 1, r: 80}, + {x: 1, y: 1, r: 20} + ], + drawActiveElementsOnTop: false, + backgroundColor: (ctx) => (ctx.dataIndex === 1 ? 'red' : 'blue'), + hoverBackgroundColor: 'yellow', + hoverRadius: 0, + }] + }, + options: { + scales: { + x: { + display: false + }, + y: { + display: false + }, + }, + plugins: { + tooltip: false, + legend: false + }, + } + }, + options: { + canvas: { + width: 256, + height: 256 + }, + async run(chart) { + const point = chart.getDatasetMeta(0).data[0]; + await jasmine.triggerMouseEvent(chart, 'click', {y: point.y, x: point.x + 25}); + } + } +}; diff --git a/test/fixtures/core.interaction/drawActiveElementsOnTop-false.png b/test/fixtures/core.interaction/drawActiveElementsOnTop-false.png new file mode 100644 index 0000000000000000000000000000000000000000..ecfe37700db1281fdd9e7e2bcbb7a7cbd5079599 GIT binary patch literal 7324 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 n157XstJwdl`2T3d3roGV19*`HZa?