From 9e10bb5805395c8134678d2d21d6856b4e0313c6 Mon Sep 17 00:00:00 2001 From: kurkle Date: Wed, 21 Jul 2021 10:51:11 +0300 Subject: [PATCH 1/2] Bar: add 'middle' option for borderSkipped --- docs/charts/bar.md | 1 + docs/configuration/elements.md | 2 +- src/controllers/controller.bar.js | 66 +++++++++++++++++- src/elements/element.bar.js | 38 +--------- .../controller.bar/borderSkipped/middle.js | 38 ++++++++++ .../controller.bar/borderSkipped/middle.png | Bin 0 -> 11207 bytes 6 files changed, 106 insertions(+), 39 deletions(-) create mode 100644 test/fixtures/controller.bar/borderSkipped/middle.js create mode 100644 test/fixtures/controller.bar/borderSkipped/middle.png diff --git a/docs/charts/bar.md b/docs/charts/bar.md index 71473b41dd0..00358e849e2 100644 --- a/docs/charts/bar.md +++ b/docs/charts/bar.md @@ -157,6 +157,7 @@ Options are: * `'start'` * `'end'` +* `'middle'` (only valid on stacked bars: the borders between bars are skipped) * `'bottom'` * `'left'` * `'top'` diff --git a/docs/configuration/elements.md b/docs/configuration/elements.md index cc050b64d3d..a8ec4f1789d 100644 --- a/docs/configuration/elements.md +++ b/docs/configuration/elements.md @@ -77,7 +77,7 @@ Namespace: `options.elements.bar`, global bar options: `Chart.defaults.elements. | `backgroundColor` | [`Color`](/general/colors.md) | `Chart.defaults.backgroundColor` | Bar fill color. | `borderWidth` | `number` | `0` | Bar stroke width. | `borderColor` | [`Color`](/general/colors.md) | `Chart.defaults.borderColor` | Bar stroke color. -| `borderSkipped` | `string` | `'start'` | Skipped (excluded) border: `'start'`, `'end'`, `'bottom'`, `'left'`, `'top'` or `'right'`. +| `borderSkipped` | `string` | `'start'` | Skipped (excluded) border: `'start'`, `'end'`, `'middle'`, `'bottom'`, `'left'`, `'top'`, `'right'` or `false`. | `borderRadius` | `number`\|`object` | `0` | The bar border radius (in pixels). | [`pointStyle`](#point-styles) | `string`\|`Image` | `'circle'` | Style of the point for legend. diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index 1ab4f2217fb..5a0158a3531 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -177,6 +177,67 @@ function barSign(size, vScale, actualBase) { return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); } +function setBorderSkipped(properties, options, stack, index) { + let edge = options.borderSkipped; + const res = {}; + + if (!edge) { + properties.borderSkipped = res; + return; + } + + let reverse, start, end, top, bottom; + if (properties.horizontal) { + reverse = properties.base > properties.x; + start = 'left'; + end = 'right'; + } else { + reverse = properties.base < properties.y; + start = 'bottom'; + end = 'top'; + } + if (reverse) { + top = 'end'; + bottom = 'start'; + } else { + top = 'start'; + bottom = 'end'; + } + + if (edge === 'middle' && stack) { + properties.enableBorderRadius = true; + if ((stack._top || 0) === index) { + edge = top; + } else if ((stack._bottom || 0) === index) { + edge = bottom; + } else { + res[parseEdge(bottom, start, end, reverse)] = true; + edge = top; + } + } + + res[parseEdge(edge, start, end, reverse)] = true; + properties.borderSkipped = res; +} + +function parseEdge(edge, a, b, reverse) { + if (reverse) { + edge = swap(edge, a, b); + edge = startEnd(edge, b, a); + } else { + edge = startEnd(edge, a, b); + } + return edge; +} + +function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; +} + +function startEnd(v, start, end) { + return v === 'start' ? start : v === 'end' ? end : v; +} + export default class BarController extends DatasetController { /** @@ -278,7 +339,7 @@ export default class BarController extends DatasetController { updateElements(bars, start, count, mode) { const me = this; const reset = mode === 'reset'; - const vScale = me._cachedMeta.vScale; + const {index, _cachedMeta: {vScale}} = me; const base = vScale.getBasePixel(); const horizontal = vScale.isHorizontal(); const ruler = me._getRuler(); @@ -297,7 +358,7 @@ export default class BarController extends DatasetController { const properties = { horizontal, base: vpixels.base, - enableBorderRadius: !stack || isFloatBar(parsed._custom) || (me.index === stack._top || me.index === stack._bottom), + enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom), x: horizontal ? vpixels.head : ipixels.center, y: horizontal ? ipixels.center : vpixels.head, height: horizontal ? ipixels.size : Math.abs(vpixels.size), @@ -307,6 +368,7 @@ export default class BarController extends DatasetController { if (includeOptions) { properties.options = sharedOptions || me.resolveDataElementOptions(i, bars[i].active ? 'active' : mode); } + setBorderSkipped(properties, properties.options || bars[i].options, stack, index); me.updateElement(bars[i], i, properties, mode); } } diff --git a/src/elements/element.bar.js b/src/elements/element.bar.js index fc7ebd46b59..049a8984f0f 100644 --- a/src/elements/element.bar.js +++ b/src/elements/element.bar.js @@ -32,47 +32,13 @@ function getBarBounds(bar, useFinalPosition) { return {left, top, right, bottom}; } -function parseBorderSkipped(bar) { - let edge = bar.options.borderSkipped; - const res = {}; - - if (!edge) { - return res; - } - - edge = bar.horizontal - ? parseEdge(edge, 'left', 'right', bar.base > bar.x) - : parseEdge(edge, 'bottom', 'top', bar.base < bar.y); - - res[edge] = true; - return res; -} - -function parseEdge(edge, a, b, reverse) { - if (reverse) { - edge = swap(edge, a, b); - edge = startEnd(edge, b, a); - } else { - edge = startEnd(edge, a, b); - } - return edge; -} - -function swap(orig, v1, v2) { - return orig === v1 ? v2 : orig === v2 ? v1 : orig; -} - -function startEnd(v, start, end) { - return v === 'start' ? start : v === 'end' ? end : v; -} - function skipOrLimit(skip, value, min, max) { return skip ? 0 : _limitValue(value, min, max); } function parseBorderWidth(bar, maxW, maxH) { const value = bar.options.borderWidth; - const skip = parseBorderSkipped(bar); + const skip = bar.borderSkipped; const o = toTRBL(value); return { @@ -88,7 +54,7 @@ function parseBorderRadius(bar, maxW, maxH) { const value = bar.options.borderRadius; const o = toTRBLCorners(value); const maxR = Math.min(maxW, maxH); - const skip = parseBorderSkipped(bar); + const skip = bar.borderSkipped; // If the value is an object, assume the user knows what they are doing // and apply as directed. diff --git a/test/fixtures/controller.bar/borderSkipped/middle.js b/test/fixtures/controller.bar/borderSkipped/middle.js new file mode 100644 index 00000000000..f93c73a4e90 --- /dev/null +++ b/test/fixtures/controller.bar/borderSkipped/middle.js @@ -0,0 +1,38 @@ +module.exports = { + threshold: 0.01, + config: { + type: 'bar', + data: { + labels: [0, 1, 2, 3, 4, 5], + datasets: [ + { + backgroundColor: 'red', + data: [12, 19, 12, 5, 4, 12], + }, + { + backgroundColor: 'green', + data: [12, 19, -4, 5, 8, 3], + }, + { + backgroundColor: 'blue', + data: [7, 11, -12, 12, 0, -7], + } + ] + }, + options: { + borderRadius: Number.MAX_VALUE, + borderSkipped: 'middle', + borderWidth: 2, + scales: { + x: {display: false, stacked: true}, + y: {display: false, stacked: true} + } + } + }, + options: { + canvas: { + height: 256, + width: 512 + } + } +}; diff --git a/test/fixtures/controller.bar/borderSkipped/middle.png b/test/fixtures/controller.bar/borderSkipped/middle.png new file mode 100644 index 0000000000000000000000000000000000000000..89796e0ca51fcaacbb8a872c1debef2ad1c4505c GIT binary patch literal 11207 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 YM2yb4eU{sJ36XxTsA^xXxQGq?4+l%e_W%F@ literal 0 HcmV?d00001 From d17d1888e86bf22e4a68e15994f55f92bb0ee465 Mon Sep 17 00:00:00 2001 From: kurkle Date: Wed, 21 Jul 2021 11:04:21 +0300 Subject: [PATCH 2/2] Split in 2 --- src/controllers/controller.bar.js | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/controllers/controller.bar.js b/src/controllers/controller.bar.js index 5a0158a3531..49b7b5e25ba 100644 --- a/src/controllers/controller.bar.js +++ b/src/controllers/controller.bar.js @@ -177,15 +177,7 @@ function barSign(size, vScale, actualBase) { return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1); } -function setBorderSkipped(properties, options, stack, index) { - let edge = options.borderSkipped; - const res = {}; - - if (!edge) { - properties.borderSkipped = res; - return; - } - +function borderProps(properties) { let reverse, start, end, top, bottom; if (properties.horizontal) { reverse = properties.base > properties.x; @@ -203,6 +195,19 @@ function setBorderSkipped(properties, options, stack, index) { top = 'start'; bottom = 'end'; } + return {start, end, reverse, top, bottom}; +} + +function setBorderSkipped(properties, options, stack, index) { + let edge = options.borderSkipped; + const res = {}; + + if (!edge) { + properties.borderSkipped = res; + return; + } + + const {start, end, reverse, top, bottom} = borderProps(properties); if (edge === 'middle' && stack) { properties.enableBorderRadius = true;