Skip to content

Commit

Permalink
Update tooltip content and styling on update() (#6635)
Browse files Browse the repository at this point in the history
Update tooltip content and styling on update()
  • Loading branch information
RatherLogical authored and etimberg committed Oct 29, 2019
1 parent 7c66b2f commit 50fd869
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 20 deletions.
48 changes: 35 additions & 13 deletions src/core/core.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -504,8 +504,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
// after update.
me.tooltip.initialize();

// Last active contains items that were previously in the tooltip.
// When we reset the tooltip, we need to clear it
// Last active contains items that were previously hovered.
me.lastActive = [];

// Do this before render so that any plugins that need final scale updates can use it
Expand All @@ -522,6 +521,11 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
} else {
me.render(config);
}

// Replay last event from before update
if (me._lastEvent) {
me.eventHandler(me._lastEvent);
}
},

/**
Expand Down Expand Up @@ -693,14 +697,20 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
*/
transition: function(easingValue) {
var me = this;
var i, ilen;

for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
for (i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {
if (me.isDatasetVisible(i)) {
me.getDatasetMeta(i).controller.transition(easingValue);
}
}

me.tooltip.transition(easingValue);

if (me._lastEvent && me.animating) {
// If, during animation, element under mouse changes, let's react to that.
me.handleEvent(me._lastEvent);
}
},

/**
Expand Down Expand Up @@ -982,6 +992,25 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
}
},

/**
* @private
*/
_updateHoverStyles: function() {
var me = this;
var options = me.options || {};
var hoverOptions = options.hover;

// Remove styling for last active (even if it may still be active)
if (me.lastActive.length) {
me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
}

// Built-in hover styling
if (me.active.length && hoverOptions.mode) {
me.updateHoverStyle(me.active, hoverOptions.mode, true);
}
},

/**
* @private
*/
Expand Down Expand Up @@ -1049,8 +1078,10 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
// Find Active Elements for hover and tooltips
if (e.type === 'mouseout') {
me.active = [];
me._lastEvent = null;
} else {
me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);
me._lastEvent = e.type === 'click' ? null : e;
}

// Invoke onHover hook
Expand All @@ -1064,16 +1095,7 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
}
}

// Remove styling for last active (even if it may still be active)
if (me.lastActive.length) {
me.updateHoverStyle(me.lastActive, hoverOptions.mode, false);
}

// Built in hover styling
if (me.active.length && hoverOptions.mode) {
me.updateHoverStyle(me.active, hoverOptions.mode, true);
}

me._updateHoverStyles();
changed = !helpers.arrayEquals(me.active, me.lastActive);

// Remember Last Actives
Expand Down
27 changes: 24 additions & 3 deletions src/core/core.tooltip.js
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ defaults._set('global', {
labelColor: function(tooltipItem, chart) {
var meta = chart.getDatasetMeta(tooltipItem.datasetIndex);
var activeElement = meta.data[tooltipItem.index];
var view = activeElement._view;
var view = activeElement.$previousStyle || activeElement._view;
return {
borderColor: view.borderColor,
backgroundColor: view.backgroundColor
Expand Down Expand Up @@ -489,8 +489,25 @@ function getBeforeAfterBodyLines(callback) {

var exports = Element.extend({
initialize: function() {
this._model = getBaseModel(this._options);
this._lastActive = [];
var me = this;
me._model = getBaseModel(me._options);
me._view = {};
me._lastActive = [];
},

transition: function(easingValue) {
var me = this;
var options = me._options;

if (me._lastEvent && me._chart.animating) {
// Let's react to changes during animation
me._active = me._chart.getElementsAtEventForMode(me._lastEvent, options.mode, options);
me.update(true);
me.pivot();
me._lastActive = me.active;
}

Element.prototype.transition.call(me, easingValue);
},

// Get the title
Expand Down Expand Up @@ -985,8 +1002,12 @@ var exports = Element.extend({
// Find Active Elements for tooltips
if (e.type === 'mouseout') {
me._active = [];
me._lastEvent = null;
} else {
me._active = me._chart.getElementsAtEventForMode(e, options.mode, options);
if (e.type !== 'click') {
me._lastEvent = e.type === 'click' ? null : e;
}
if (options.reverse) {
me._active.reverse();
}
Expand Down
8 changes: 4 additions & 4 deletions test/specs/core.controller.tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -1142,7 +1142,7 @@ describe('Chart', function() {
expect(chart.tooltip._options).toEqual(jasmine.objectContaining(newTooltipConfig));
});

it ('should reset the tooltip on update', function() {
it ('should update the tooltip on update', function() {
var chart = acquireChart({
type: 'line',
data: {
Expand Down Expand Up @@ -1172,10 +1172,10 @@ describe('Chart', function() {
expect(chart.lastActive).toEqual([point]);
expect(tooltip._lastActive).toEqual([point]);

// Update and confirm tooltip is reset
// Update and confirm tooltip is updated
chart.update();
expect(chart.lastActive).toEqual([]);
expect(tooltip._lastActive).toEqual([]);
expect(chart.lastActive).toEqual([point]);
expect(tooltip._lastActive).toEqual([point]);
});

it ('should update the metadata', function() {
Expand Down

0 comments on commit 50fd869

Please sign in to comment.