From 8dfcf1c443d4f783699dd53679f174d0309f3d9d Mon Sep 17 00:00:00 2001 From: stockiNail Date: Thu, 9 Feb 2023 15:26:11 +0100 Subject: [PATCH] Use maxTicksLimit option to calculate the labels size on ticks (#11069) * Use maxTicksLimit option to calculate the labels size on ticks * apply review --- src/core/core.scale.js | 10 +++-- .../max-ticks-limit-norotation.js | 37 ++++++++++++++++++ .../max-ticks-limit-norotation.png | Bin 0 -> 18046 bytes 3 files changed, 43 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/scale.category/max-ticks-limit-norotation.js create mode 100644 test/fixtures/scale.category/max-ticks-limit-norotation.png diff --git a/src/core/core.scale.js b/src/core/core.scale.js index 562ab21b6..50ddca872 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -8,6 +8,7 @@ import {autoSkip} from './core.scale.autoskip.js'; const reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align; const offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset; +const getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength); /** * @typedef { import('./core.controller.js').default } Chart @@ -585,7 +586,7 @@ export default class Scale extends Element { calculateLabelRotation() { const options = this.options; const tickOpts = options.ticks; - const numTicks = this.ticks.length; + const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit); const minRotation = tickOpts.minRotation || 0; const maxRotation = tickOpts.maxRotation; let labelRotation = minRotation; @@ -803,7 +804,7 @@ export default class Scale extends Element { ticks = sample(ticks, sampleSize); } - this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length); + this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit); } return labelSizes; @@ -815,15 +816,16 @@ export default class Scale extends Element { * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }} * @private */ - _computeLabelSizes(ticks, length) { + _computeLabelSizes(ticks, length, maxTicksLimit) { const {ctx, _longestTextCache: caches} = this; const widths = []; const heights = []; + const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit)); let widestLabelSize = 0; let highestLabelSize = 0; let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel; - for (i = 0; i < length; ++i) { + for (i = 0; i < length; i += increment) { label = ticks[i].label; tickFont = this._resolveTickFontOptions(i); ctx.font = fontString = tickFont.string; diff --git a/test/fixtures/scale.category/max-ticks-limit-norotation.js b/test/fixtures/scale.category/max-ticks-limit-norotation.js new file mode 100644 index 000000000..d9c86c537 --- /dev/null +++ b/test/fixtures/scale.category/max-ticks-limit-norotation.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/10856', + config: { + type: 'bar', + data: { + datasets: [{ + data + }], + labels + }, + options: { + scales: { + x: { + ticks: { + display: true, + 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-norotation.png b/test/fixtures/scale.category/max-ticks-limit-norotation.png new file mode 100644 index 0000000000000000000000000000000000000000..063f06d1a965f5361efc6a7e759daa7ce489ff73 GIT binary patch literal 18046 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 literal 0 Hc-jL100001 -- 2.47.3