Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/axes/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ There are a number of config callbacks that can be used to change parameters in
| `beforeDataLimits` | `axis` | Callback that runs before data limits are determined.
| `afterDataLimits` | `axis` | Callback that runs after data limits are determined.
| `beforeBuildTicks` | `axis` | Callback that runs before ticks are created.
| `afterBuildTicks` | `axis` | Callback that runs after ticks are created. Useful for filtering ticks.
| `afterBuildTicks` | `axis`, `ticks` | Callback that runs after ticks are created. Useful for filtering ticks. Should return the filtered ticks.
| `beforeTickToLabelConversion` | `axis` | Callback that runs before ticks are converted into strings.
| `afterTickToLabelConversion` | `axis` | Callback that runs after ticks are converted into strings.
| `beforeCalculateTickRotation` | `axis` | Callback that runs before tick rotation is determined.
Expand Down
14 changes: 11 additions & 3 deletions src/core/core.scale.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,8 @@ module.exports = Element.extend({
// we still support no return (`this.ticks` internally set by calling this method).
ticks = me.buildTicks() || [];

me.afterBuildTicks();
// Allow modification of ticks in callback.
ticks = me.afterBuildTicks(ticks) || ticks;

me.beforeTickToLabelConversion();

Expand Down Expand Up @@ -287,8 +288,15 @@ module.exports = Element.extend({
helpers.callback(this.options.beforeBuildTicks, [this]);
},
buildTicks: helpers.noop,
afterBuildTicks: function() {
helpers.callback(this.options.afterBuildTicks, [this]);
afterBuildTicks: function(ticks) {
var me = this;
// ticks is empty for old axis implementations here
if (helpers.isArray(ticks) && ticks.length) {
return helpers.callback(me.options.afterBuildTicks, [me, ticks]);
}
// Support old implementations (that modified `this.ticks` directly in buildTicks)
me.ticks = helpers.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;
return ticks;
},

beforeTickToLabelConversion: function() {
Expand Down
95 changes: 95 additions & 0 deletions test/specs/core.scale.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -341,4 +341,99 @@ describe('Core.scale', function() {
});
});
});

describe('afterBuildTicks', function() {
it('should allow filtering of ticks', function() {
var labels = ['tick1', 'tick2', 'tick3', 'tick4', 'tick5'];
var chart = window.acquireChart({
type: 'line',
options: {
scales: {
xAxes: [{
id: 'x',
type: 'category',
labels: labels,
afterBuildTicks: function(axis, ticks) {
return ticks.slice(1);
}
}]
}
}
});

var scale = chart.scales.x;
expect(scale.ticks).toEqual(labels.slice(1));
});

it('should allow filtering of ticks (for new implementation of buildTicks)', function() {
var chart = window.acquireChart({
type: 'line',
data: {
labels: ['2016', '2017', '2018']
},
options: {
scales: {
xAxes: [{
id: 'x',
type: 'time',
time: {
parser: 'YYYY'
},
ticks: {
source: 'labels'
},
afterBuildTicks: function(axis, ticks) {
return ticks.slice(1);
}
}]
}
}
});

var scale = chart.scales.x;
expect(scale.ticks.length).toEqual(2);
});

it('should allow no return value from callback', function() {
var labels = ['tick1', 'tick2', 'tick3', 'tick4', 'tick5'];
var chart = window.acquireChart({
type: 'line',
options: {
scales: {
xAxes: [{
id: 'x',
type: 'category',
labels: labels,
afterBuildTicks: function() { }
}]
}
}
});

var scale = chart.scales.x;
expect(scale.ticks).toEqual(labels);
});

it('should allow empty ticks', function() {
var labels = ['tick1', 'tick2', 'tick3', 'tick4', 'tick5'];
var chart = window.acquireChart({
type: 'line',
options: {
scales: {
xAxes: [{
id: 'x',
type: 'category',
labels: labels,
afterBuildTicks: function() {
return [];
}
}]
}
}
});

var scale = chart.scales.x;
expect(scale.ticks.length).toBe(0);
});
});
});