| `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.
// 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();
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() {
});
});
});
+
+ 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);
+ });
+ });
});