Skip to content

Commit db37eb2

Browse files
kurkleetimberg
authored andcommitted
Hover styling for dataset in 'dataset' mode (chartjs#6527)
* Hover styling for dataset in 'dataset' mode
1 parent 0020c0a commit db37eb2

File tree

6 files changed

+93
-8
lines changed

6 files changed

+93
-8
lines changed

docs/charts/line.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ The line chart allows a number of properties to be specified for each dataset. T
5252
| [`borderWidth`](#line-styling) | `number` | Yes | - | `3`
5353
| [`cubicInterpolationMode`](#cubicinterpolationmode) | `string` | Yes | - | `'default'`
5454
| [`fill`](#line-styling) | <code>boolean&#124;string</code> | Yes | - | `true`
55+
| [`hoverBackgroundColor`](#line-styling) | [`Color`](../general/colors.md) | Yes | - | `undefined`
56+
| [`hoverBorderCapStyle`](#line-styling) | `string` | Yes | - | `undefined`
57+
| [`hoverBorderColor`](#line-styling) | [`Color`](../general/colors.md) | Yes | - | `undefined`
58+
| [`hoverBorderDash`](#line-styling) | `number[]` | Yes | - | `undefined`
59+
| [`hoverBorderDashOffset`](#line-styling) | `number` | Yes | - | `undefined`
60+
| [`hoverBorderJoinStyle`](#line-styling) | `string` | Yes | - | `undefined`
61+
| [`hoverBorderWidth`](#line-styling) | `number` | Yes | - | `undefined`
5562
| [`label`](#general) | `string` | - | - | `''`
5663
| [`lineTension`](#line-styling) | `number` | - | - | `0.4`
5764
| [`order`](#general) | `number` | - | - | `0`

docs/charts/radar.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,13 @@ The radar chart allows a number of properties to be specified for each dataset.
7474
| [`borderDashOffset`](#line-styling) | `number` | Yes | - | `0.0`
7575
| [`borderJoinStyle`](#line-styling) | `string` | Yes | - | `'miter'`
7676
| [`borderWidth`](#line-styling) | `number` | Yes | - | `3`
77+
| [`hoverBackgroundColor`](#line-styling) | [`Color`](../general/colors.md) | Yes | - | `undefined`
78+
| [`hoverBorderCapStyle`](#line-styling) | `string` | Yes | - | `undefined`
79+
| [`hoverBorderColor`](#line-styling) | [`Color`](../general/colors.md) | Yes | - | `undefined`
80+
| [`hoverBorderDash`](#line-styling) | `number[]` | Yes | - | `undefined`
81+
| [`hoverBorderDashOffset`](#line-styling) | `number` | Yes | - | `undefined`
82+
| [`hoverBorderJoinStyle`](#line-styling) | `string` | Yes | - | `undefined`
83+
| [`hoverBorderWidth`](#line-styling) | `number` | Yes | - | `undefined`
7784
| [`fill`](#line-styling) | <code>boolean&#124;string</code> | Yes | - | `true`
7885
| [`label`](#general) | `string` | - | - | `''`
7986
| [`order`](#general) | `number` | - | - | `0`

docs/general/options.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,6 @@ The context object contains the following properties:
4343
- `dataIndex`: index of the current data
4444
- `dataset`: dataset at index `datasetIndex`
4545
- `datasetIndex`: index of the current dataset
46+
- `hover`: true if hovered
4647

4748
**Important**: since the context can represent different types of entities (dataset, data, etc.), some properties may be `undefined` so be sure to test any context property before using it.

src/core/core.controller.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -989,15 +989,19 @@ helpers.extend(Chart.prototype, /** @lends Chart */ {
989989
},
990990

991991
updateHoverStyle: function(elements, mode, enabled) {
992-
var method = enabled ? 'setHoverStyle' : 'removeHoverStyle';
992+
var prefix = enabled ? 'set' : 'remove';
993993
var element, i, ilen;
994994

995995
for (i = 0, ilen = elements.length; i < ilen; ++i) {
996996
element = elements[i];
997997
if (element) {
998-
this.getDatasetMeta(element._datasetIndex).controller[method](element);
998+
this.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);
999999
}
10001000
}
1001+
1002+
if (mode === 'dataset') {
1003+
this.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();
1004+
}
10011005
},
10021006

10031007
/**

src/core/core.datasetController.js

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -356,29 +356,31 @@ helpers.extend(DatasetController.prototype, {
356356
/**
357357
* @private
358358
*/
359-
_resolveDatasetElementOptions: function(element) {
359+
_resolveDatasetElementOptions: function(element, hover) {
360360
var me = this;
361361
var chart = me.chart;
362362
var datasetOpts = me._config;
363363
var custom = element.custom || {};
364364
var options = chart.options.elements[me.datasetElementType.prototype._type] || {};
365365
var elementOptions = me._datasetElementOptions;
366366
var values = {};
367-
var i, ilen, key;
367+
var i, ilen, key, readKey;
368368

369369
// Scriptable options
370370
var context = {
371371
chart: chart,
372372
dataset: me.getDataset(),
373-
datasetIndex: me.index
373+
datasetIndex: me.index,
374+
hover: hover
374375
};
375376

376377
for (i = 0, ilen = elementOptions.length; i < ilen; ++i) {
377378
key = elementOptions[i];
379+
readKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;
378380
values[key] = resolve([
379-
custom[key],
380-
datasetOpts[key],
381-
options[key]
381+
custom[readKey],
382+
datasetOpts[readKey],
383+
options[readKey]
382384
], context);
383385
}
384386

@@ -468,6 +470,42 @@ helpers.extend(DatasetController.prototype, {
468470
model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);
469471
},
470472

473+
/**
474+
* @private
475+
*/
476+
_removeDatasetHoverStyle: function() {
477+
var element = this.getMeta().dataset;
478+
479+
if (element) {
480+
this.removeHoverStyle(element);
481+
}
482+
},
483+
484+
/**
485+
* @private
486+
*/
487+
_setDatasetHoverStyle: function() {
488+
var element = this.getMeta().dataset;
489+
var prev = {};
490+
var i, ilen, key, keys, hoverOptions, model;
491+
492+
if (!element) {
493+
return;
494+
}
495+
496+
model = element._model;
497+
hoverOptions = this._resolveDatasetElementOptions(element, true);
498+
499+
keys = Object.keys(hoverOptions);
500+
for (i = 0, ilen = keys.length; i < ilen; ++i) {
501+
key = keys[i];
502+
prev[key] = model[key];
503+
model[key] = hoverOptions[key];
504+
}
505+
506+
element.$previousStyle = prev;
507+
},
508+
471509
/**
472510
* @private
473511
*/

test/specs/controller.line.tests.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -895,6 +895,34 @@ describe('Chart.controllers.line', function() {
895895
expect(point._model.borderWidth).toBe(2);
896896
expect(point._model.radius).toBe(3);
897897
});
898+
899+
it ('should handle dataset hover styles defined via dataset properties', function() {
900+
var chart = this.chart;
901+
var point = chart.getDatasetMeta(0).data[0];
902+
var dataset = chart.getDatasetMeta(0).dataset;
903+
904+
Chart.helpers.merge(chart.data.datasets[0], {
905+
backgroundColor: '#AAA',
906+
borderColor: '#BBB',
907+
borderWidth: 6,
908+
hoverBackgroundColor: '#000',
909+
hoverBorderColor: '#111',
910+
hoverBorderWidth: 12
911+
});
912+
913+
chart.options.hover = {mode: 'dataset'};
914+
chart.update();
915+
916+
jasmine.triggerMouseEvent(chart, 'mousemove', point);
917+
expect(dataset._model.backgroundColor).toBe('#000');
918+
expect(dataset._model.borderColor).toBe('#111');
919+
expect(dataset._model.borderWidth).toBe(12);
920+
921+
jasmine.triggerMouseEvent(chart, 'mouseout', point);
922+
expect(dataset._model.backgroundColor).toBe('#AAA');
923+
expect(dataset._model.borderColor).toBe('#BBB');
924+
expect(dataset._model.borderWidth).toBe(6);
925+
});
898926
});
899927

900928
it('should allow 0 as a point border width', function() {

0 commit comments

Comments
 (0)