From a8d083ac24b6d6d06508fd34e27494a1c028013e Mon Sep 17 00:00:00 2001 From: Jukka Kurkela Date: Fri, 18 Jun 2021 21:11:55 +0300 Subject: [PATCH] Apply maxTicksLimit to grid when ticks are hidden (#9277) --- src/core/core.scale.js | 6 ++- .../scale.category/max-ticks-limit-a.js | 37 ++++++++++++++++++ .../scale.category/max-ticks-limit-a.png | Bin 0 -> 13234 bytes .../scale.category/max-ticks-limit-b.js | 37 ++++++++++++++++++ .../scale.category/max-ticks-limit-b.png | Bin 0 -> 14219 bytes 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/scale.category/max-ticks-limit-a.js create mode 100644 test/fixtures/scale.category/max-ticks-limit-a.png create mode 100644 test/fixtures/scale.category/max-ticks-limit-b.js create mode 100644 test/fixtures/scale.category/max-ticks-limit-b.png diff --git a/src/core/core.scale.js b/src/core/core.scale.js index a640d332a..b6113f794 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -1,6 +1,6 @@ import Element from './core.element'; import {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas'; -import {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject} from '../helpers/helpers.core'; +import {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core'; import {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math'; import {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras'; import {toFont, toPadding, _addGrace} from '../helpers/helpers.options'; @@ -1072,7 +1072,9 @@ export default class Scale extends Element { x2 = chartArea.right; } - for (i = 0; i < ticksLength; ++i) { + const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength); + const step = Math.max(1, Math.ceil(ticksLength / limit)); + for (i = 0; i < ticksLength; i += step) { const optsAtIndex = grid.setContext(me.getContext(i)); const lineWidth = optsAtIndex.lineWidth; diff --git a/test/fixtures/scale.category/max-ticks-limit-a.js b/test/fixtures/scale.category/max-ticks-limit-a.js new file mode 100644 index 000000000..9a89bcb9c --- /dev/null +++ b/test/fixtures/scale.category/max-ticks-limit-a.js @@ -0,0 +1,37 @@ +const data = Array.from({length: 42}, (_, i) => i + 1); +const labels = data.map(v => 'tick' + v); + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/7302', + config: { + type: 'bar', + data: { + datasets: [{ + data + }], + labels + }, + options: { + scales: { + x: { + ticks: { + display: false, + maxTicksLimit: 7 + }, + grid: { + color: 'red' + } + }, + y: {display: false} + }, + layout: { + padding: { + right: 2 + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/scale.category/max-ticks-limit-a.png b/test/fixtures/scale.category/max-ticks-limit-a.png new file mode 100644 index 0000000000000000000000000000000000000000..8b0c7b8f898dc41555fa6ab86bf696c4f13fb672 GIT binary patch literal 13234 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 literal 0 HcmV?d00001 diff --git a/test/fixtures/scale.category/max-ticks-limit-b.js b/test/fixtures/scale.category/max-ticks-limit-b.js new file mode 100644 index 000000000..21654fd6a --- /dev/null +++ b/test/fixtures/scale.category/max-ticks-limit-b.js @@ -0,0 +1,37 @@ +const data = Array.from({length: 42}, (_, i) => i + 1); +const labels = data.map(v => 'tick' + v); + +module.exports = { + description: 'https://github.com/chartjs/Chart.js/issues/7302', + config: { + type: 'bar', + data: { + datasets: [{ + data + }], + labels + }, + options: { + scales: { + x: { + ticks: { + display: false, + maxTicksLimit: 6 + }, + grid: { + color: 'red' + } + }, + y: {display: false} + }, + layout: { + padding: { + right: 2 + } + } + } + }, + options: { + spriteText: true + } +}; diff --git a/test/fixtures/scale.category/max-ticks-limit-b.png b/test/fixtures/scale.category/max-ticks-limit-b.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f1a9516275177fb25f4952799c4b0612900d71 GIT binary patch literal 14219 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%0DKjO2d>C5#7&7LtP)H;i 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