diff --git a/docs/axes/README.md b/docs/axes/README.md index 90b2525e79e..3eb5592147f 100644 --- a/docs/axes/README.md +++ b/docs/axes/README.md @@ -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. diff --git a/src/core/core.scale.js b/src/core/core.scale.js index 690491fbc60..4718b2226d6 100644 --- a/src/core/core.scale.js +++ b/src/core/core.scale.js @@ -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(); @@ -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 (ticks.length) { + return helpers.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementatios (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; }, beforeTickToLabelConversion: function() { diff --git a/test/specs/core.scale.tests.js b/test/specs/core.scale.tests.js index 3cbd0cbe6d0..130232caa1b 100644 --- a/test/specs/core.scale.tests.js +++ b/test/specs/core.scale.tests.js @@ -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); + }); + }); });