From: Jukka Kurkela Date: Mon, 16 Nov 2020 20:01:47 +0000 (+0200) Subject: Enable bounds option to all cartesian axes (#8060) X-Git-Tag: v3.0.0-beta.7~36 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a35dade663fd9c17eb9b367fe8a5cd7c12efde12;p=thirdparty%2FChart.js.git Enable bounds option to all cartesian axes (#8060) --- diff --git a/src/core/core.scale.js b/src/core/core.scale.js index bad77d4c7..ddec88a2e 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -17,6 +17,15 @@ defaults.set('scale', { reverse: false, beginAtZero: false, + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 3.0.0 + */ + bounds: 'ticks', + // grid line settings gridLines: { display: true, diff --git a/src/scales/scale.category.js b/src/scales/scale.category.js index d61d4c5ff..4824dbe9c 100644 --- a/src/scales/scale.category.js +++ b/src/scales/scale.category.js @@ -27,10 +27,20 @@ export default class CategoryScale extends Scale { determineDataLimits() { const me = this; - const max = me.getLabels().length - 1; + const {minDefined, maxDefined} = me.getUserBounds(); + let {min, max} = me.getMinMax(true); + + if (me.options.bounds === 'ticks') { + if (!minDefined) { + min = 0; + } + if (!maxDefined) { + max = me.getLabels().length - 1; + } + } - me.min = Math.max(me._userMin || 0, 0); - me.max = Math.min(me._userMax || max, max); + me.min = min; + me.max = max; } buildTicks() { diff --git a/src/scales/scale.linearbase.js b/src/scales/scale.linearbase.js index 8155240d6..1f26e0093 100644 --- a/src/scales/scale.linearbase.js +++ b/src/scales/scale.linearbase.js @@ -203,9 +203,11 @@ export default class LinearScaleBase extends Scale { }; const ticks = generateTicks(numericGeneratorOptions, me); - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - _setMinAndMaxByKey(ticks, me, 'value'); + // At this point, we need to update our max and min given the tick values, + // since we probably have expanded the range of the scale + if (opts.bounds === 'ticks') { + _setMinAndMaxByKey(ticks, me, 'value'); + } if (opts.reverse) { ticks.reverse(); diff --git a/src/scales/scale.logarithmic.js b/src/scales/scale.logarithmic.js index 40983febd..955496408 100644 --- a/src/scales/scale.logarithmic.js +++ b/src/scales/scale.logarithmic.js @@ -124,9 +124,11 @@ export default class LogarithmicScale extends Scale { }; const ticks = generateTicks(generationOptions, me); - // At this point, we need to update our max and min given the tick values since we have expanded the - // range of the scale - _setMinAndMaxByKey(ticks, me, 'value'); + // At this point, we need to update our max and min given the tick values, + // since we probably have expanded the range of the scale + if (opts.bounds === 'ticks') { + _setMinAndMaxByKey(ticks, me, 'value'); + } if (opts.reverse) { ticks.reverse(); diff --git a/test/specs/scale.category.tests.js b/test/specs/scale.category.tests.js index 97183a822..fec12cac6 100644 --- a/test/specs/scale.category.tests.js +++ b/test/specs/scale.category.tests.js @@ -475,4 +475,33 @@ describe('Category scale tests', function() { expect(yScale.getPixelForValue(3)).toBeCloseToPixel(426); expect(yScale.getPixelForValue(4)).toBeCloseToPixel(538); }); + + it('Should bound to ticks/data', function() { + var chart = window.acquireChart({ + type: 'line', + data: { + labels: ['a', 'b', 'c', 'd'], + datasets: [{ + data: {b: 1, c: 99} + }] + }, + options: { + scales: { + x: { + type: 'category', + bounds: 'data' + } + } + } + }); + + expect(chart.scales.x.min).toEqual(1); + expect(chart.scales.x.max).toEqual(2); + + chart.options.scales.x.bounds = 'ticks'; + chart.update(); + + expect(chart.scales.x.min).toEqual(0); + expect(chart.scales.x.max).toEqual(3); + }); }); diff --git a/test/specs/scale.linear.tests.js b/test/specs/scale.linear.tests.js index 36014eabf..e7b5d055d 100644 --- a/test/specs/scale.linear.tests.js +++ b/test/specs/scale.linear.tests.js @@ -759,6 +759,28 @@ describe('Linear Scale', function() { expect(getLabels(chart.scales.y)).toEqual(['0.3', '0.8', '1.3', '1.8', '2.3', '2.8']); }); + it('Should bound to data', function() { + var chart = window.acquireChart({ + type: 'line', + data: { + labels: ['a', 'b'], + datasets: [{ + data: [1, 99] + }] + }, + options: { + scales: { + y: { + bounds: 'data' + } + } + } + }); + + expect(chart.scales.y.min).toEqual(1); + expect(chart.scales.y.max).toEqual(99); + }); + it('Should build labels using the user supplied callback', function() { var chart = window.acquireChart({ type: 'bar', diff --git a/test/specs/scale.logarithmic.tests.js b/test/specs/scale.logarithmic.tests.js index c6a4b960b..332860fe5 100644 --- a/test/specs/scale.logarithmic.tests.js +++ b/test/specs/scale.logarithmic.tests.js @@ -1142,4 +1142,27 @@ describe('Logarithmic Scale tests', function() { expect(chart.scales.y.min).toBe(10); expect(chart.scales.y.max).toBe(100); }); + + it('Should bound to data', function() { + var chart = window.acquireChart({ + type: 'line', + data: { + labels: ['a', 'b'], + datasets: [{ + data: [1.1, 99] + }] + }, + options: { + scales: { + y: { + type: 'logarithmic', + bounds: 'data' + } + } + } + }); + + expect(chart.scales.y.min).toEqual(1.1); + expect(chart.scales.y.max).toEqual(99); + }); });