Enable bounds option to all cartesian axes (#8060)

This commit is contained in:
Jukka Kurkela 2020-11-16 22:01:47 +02:00 committed by GitHub
parent 0c515c0e67
commit a35dade663
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 106 additions and 9 deletions

View File

@ -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,

View File

@ -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);
me.min = Math.max(me._userMin || 0, 0);
me.max = Math.min(me._userMax || max, max);
if (me.options.bounds === 'ticks') {
if (!minDefined) {
min = 0;
}
if (!maxDefined) {
max = me.getLabels().length - 1;
}
}
me.min = min;
me.max = max;
}
buildTicks() {

View File

@ -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();

View File

@ -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();

View File

@ -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);
});
});

View File

@ -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',

View File

@ -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);
});
});