diff --git a/src/core/core.controller.js b/src/core/core.controller.js index 03dfedb7196..241448dadd7 100644 --- a/src/core/core.controller.js +++ b/src/core/core.controller.js @@ -528,9 +528,7 @@ module.exports = function(Chart) { } me.drawDatasets(easingValue); - - // Finally draw the tooltip - me.tooltip.draw(); + me._drawTooltip(easingValue); plugins.notify(me, 'afterDraw', [easingValue]); }, @@ -595,6 +593,28 @@ module.exports = function(Chart) { plugins.notify(me, 'afterDatasetDraw', [args]); }, + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function(easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + plugins.notify(me, 'afterTooltipDraw', [args]); + }, + // Get the single element that was clicked on // @return : An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw getElementAtEvent: function(e) { diff --git a/src/core/core.plugin.js b/src/core/core.plugin.js index 399075b812c..0b7423a6904 100644 --- a/src/core/core.plugin.js +++ b/src/core/core.plugin.js @@ -323,6 +323,27 @@ module.exports = function(Chart) { * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. * @param {Object} options - The plugin options. */ + /** + * @method IPlugin#beforeTooltipDraw + * @desc Called before drawing the `tooltip`. If any plugin returns `false`, + * the tooltip drawing is cancelled until another `render` is triggered. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + * @returns {Boolean} `false` to cancel the chart tooltip drawing. + */ + /** + * @method IPlugin#afterTooltipDraw + * @desc Called after drawing the `tooltip`. Note that this hook will not + * be called if the tooltip drawing has been previously cancelled. + * @param {Chart} chart - The chart instance. + * @param {Object} args - The call arguments. + * @param {Object} args.tooltip - The tooltip. + * @param {Number} args.easingValue - The current animation value, between 0.0 and 1.0. + * @param {Object} options - The plugin options. + */ /** * @method IPlugin#beforeEvent * @desc Called before processing the specified `event`. If any plugin returns `false`, diff --git a/test/specs/core.controller.tests.js b/test/specs/core.controller.tests.js index 50a206bcfd2..fe73d02a0c2 100644 --- a/test/specs/core.controller.tests.js +++ b/test/specs/core.controller.tests.js @@ -884,6 +884,8 @@ describe('Chart', function() { 'beforeDatasetDraw', 'afterDatasetDraw', 'afterDatasetsDraw', + 'beforeTooltipDraw', + 'afterTooltipDraw', 'afterDraw', 'afterRender', ],