From 92e39a295d2133226fcefeb9ec7b57d810b771fe Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Tue, 20 Jul 2021 15:45:18 +0300 Subject: [PATCH] Apply segment styles with only single segment (#9447) --- src/helpers/helpers.segment.js | 14 +++++---- .../controller.line/segments/single.js | 27 ++++++++++++++++++ .../controller.line/segments/single.png | Bin 0 -> 5291 bytes 3 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 test/fixtures/controller.line/segments/single.js create mode 100644 test/fixtures/controller.line/segments/single.png diff --git a/src/helpers/helpers.segment.js b/src/helpers/helpers.segment.js index 13063f019d3..215c73207ba 100644 --- a/src/helpers/helpers.segment.js +++ b/src/helpers/helpers.segment.js @@ -244,14 +244,15 @@ export function _computeSegments(line, segmentOptions) { const loop = !!line._loop; const {start, end} = findStartAndEnd(points, count, loop, spanGaps); + const baseStyle = readStyle(line.options); if (spanGaps === true) { - return splitByStyles([{start, end, loop}], points, segmentOptions); + return splitByStyles([{start, end, loop}], points, baseStyle, segmentOptions); } const max = end < start ? end + count : end; const completeLoop = !!line._fullLoop && start === 0 && end === count - 1; - return splitByStyles(solidSegments(points, start, max, completeLoop), points, segmentOptions); + return splitByStyles(solidSegments(points, start, max, completeLoop), points, baseStyle, segmentOptions); } /** @@ -260,11 +261,11 @@ export function _computeSegments(line, segmentOptions) { * @param {object} [segmentOptions] * @return {Segment[]} */ -function splitByStyles(segments, points, segmentOptions) { +function splitByStyles(segments, points, baseStyle, segmentOptions) { if (!segmentOptions || !segmentOptions.setContext || !points) { return segments; } - return doSplitByStyles(segments, points, segmentOptions); + return doSplitByStyles(segments, points, baseStyle, segmentOptions); } /** @@ -273,14 +274,15 @@ function splitByStyles(segments, points, segmentOptions) { * @param {object} [segmentOptions] * @return {Segment[]} */ -function doSplitByStyles(segments, points, segmentOptions) { +function doSplitByStyles(segments, points, baseStyle, segmentOptions) { const count = points.length; const result = []; let start = segments[0].start; let i = start; for (const segment of segments) { - let prevStyle, style; + let prevStyle = baseStyle; let prev = points[start % count]; + let style; for (i = start + 1; i <= segment.end; i++) { const pt = points[i % count]; style = readStyle(segmentOptions.setContext({type: 'segment', p0: prev, p1: pt})); diff --git a/test/fixtures/controller.line/segments/single.js b/test/fixtures/controller.line/segments/single.js new file mode 100644 index 00000000000..c825dd9ca6b --- /dev/null +++ b/test/fixtures/controller.line/segments/single.js @@ -0,0 +1,27 @@ +module.exports = { + config: { + type: 'line', + data: { + labels: ['a', 'b', 'c', 'd', 'e', 'f'], + datasets: [{ + data: [1, 2, 3, 3, 2, 1], + borderColor: 'black', + segment: { + borderColor: 'red', + } + }] + }, + options: { + scales: { + x: {display: false}, + y: {display: false} + } + } + }, + options: { + canvas: { + width: 256, + height: 256 + } + } +}; diff --git a/test/fixtures/controller.line/segments/single.png b/test/fixtures/controller.line/segments/single.png new file mode 100644 index 0000000000000000000000000000000000000000..e9c80ea2d27cc787a8eeaf83918f1b6a9e23ed72 GIT binary patch literal 5291 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 n%zEeizHeXq<2q6fzs!hHy6