Skip to content

Commit 7ed8681

Browse files
committed
add Lib.coerceHoverinfo shortcut
- which handles the 1-vs-multi-trace dflt logic for all trace types - call it once (!) during defaults - call it again during fx/calc to coerce arrayOk hoverinfo items
1 parent b649b11 commit 7ed8681

File tree

12 files changed

+49
-45
lines changed

12 files changed

+49
-45
lines changed

src/components/fx/calc.js

+2-19
Original file line numberDiff line numberDiff line change
@@ -10,31 +10,14 @@
1010

1111
var Lib = require('../../lib');
1212
var Registry = require('../../registry');
13-
var baseAttrs = require('../../plots/attributes');
1413

1514
module.exports = function calc(gd) {
1615
var calcdata = gd.calcdata;
1716
var fullLayout = gd._fullLayout;
1817

19-
function makeCoerceHoverInfo(fullTrace) {
20-
var moduleAttrs = fullTrace._module.attributes;
21-
var attrs = moduleAttrs.hoverinfo ?
22-
{hoverinfo: moduleAttrs.hoverinfo} :
23-
baseAttrs;
24-
var valObj = attrs.hoverinfo;
25-
var dflt;
26-
27-
if(fullLayout._dataLength === 1) {
28-
var flags = valObj.dflt === 'all' ?
29-
valObj.flags.slice() :
30-
valObj.dflt.split('+');
31-
32-
flags.splice(flags.indexOf('name'), 1);
33-
dflt = flags.join('+');
34-
}
35-
18+
function makeCoerceHoverInfo(trace) {
3619
return function(val) {
37-
return Lib.coerce({hoverinfo: val}, {}, attrs, 'hoverinfo', dflt);
20+
return Lib.coerceHoverinfo({hoverinfo: val}, {_module: trace._module}, fullLayout);
3821
};
3922
}
4023

src/lib/coerce.js

+30
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
var isNumeric = require('fast-isnumeric');
1313
var tinycolor = require('tinycolor2');
1414

15+
var baseTraceAttrs = require('../plots/attributes');
1516
var getColorscale = require('../components/colorscale/get_scale');
1617
var colorscaleNames = Object.keys(require('../components/colorscale/scales'));
1718
var nestedProperty = require('./nested_property');
@@ -338,6 +339,35 @@ exports.coerceFont = function(coerce, attr, dfltObj) {
338339
return out;
339340
};
340341

342+
/** Coerce shortcut for 'hoverinfo'
343+
* handling 1-vs-multi-trace dflt logic
344+
*
345+
* @param {object} traceIn : user trace object
346+
* @param {object} traceOut : full trace object (requires _module ref)
347+
* @param {object} layoutOut : full layout object (require _dataLength ref)
348+
* @return {any} : the coerced value
349+
*/
350+
exports.coerceHoverinfo = function(traceIn, traceOut, layoutOut) {
351+
var moduleAttrs = traceOut._module.attributes;
352+
var attrs = moduleAttrs.hoverinfo ?
353+
{hoverinfo: moduleAttrs.hoverinfo} :
354+
baseTraceAttrs;
355+
356+
var valObj = attrs.hoverinfo;
357+
var dflt;
358+
359+
if(layoutOut._dataLength === 1) {
360+
var flags = valObj.dflt === 'all' ?
361+
valObj.flags.slice() :
362+
valObj.dflt.split('+');
363+
364+
flags.splice(flags.indexOf('name'), 1);
365+
dflt = flags.join('+');
366+
}
367+
368+
return exports.coerce(traceIn, traceOut, attrs, 'hoverinfo', dflt);
369+
};
370+
341371
exports.validate = function(value, opts) {
342372
var valObject = exports.valObjects[opts.valType];
343373

src/lib/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ lib.valObjects = coerceModule.valObjects;
3131
lib.coerce = coerceModule.coerce;
3232
lib.coerce2 = coerceModule.coerce2;
3333
lib.coerceFont = coerceModule.coerceFont;
34+
lib.coerceHoverinfo = coerceModule.coerceHoverinfo;
3435
lib.validate = coerceModule.validate;
3536

3637
var datesModule = require('./dates');
@@ -355,7 +356,6 @@ lib.noneOrAll = function(containerIn, containerOut, attrList) {
355356
* @param {object} cd : calcdata trace
356357
* @param {string} cdAttr : calcdata key
357358
* @param {function} [fn] : optional function to apply to each array item
358-
*
359359
*/
360360
lib.mergeArray = function(traceAttr, cd, cdAttr, fn) {
361361
fn = fn || lib.identity;

src/plots/plots.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -865,9 +865,6 @@ plots.supplyTraceDefaults = function(traceIn, traceOutIndex, layout, traceInInde
865865
var _module = plots.getModule(traceOut);
866866
traceOut._module = _module;
867867

868-
// gets overwritten in pie, geo and ternary modules
869-
coerce('hoverinfo', (layout._dataLength === 1) ? 'x+y+z+text' : undefined);
870-
871868
if(plots.traceIs(traceOut, 'showLegend')) {
872869
coerce('showlegend');
873870
coerce('legendgroup');
@@ -880,7 +877,10 @@ plots.supplyTraceDefaults = function(traceIn, traceOutIndex, layout, traceInInde
880877

881878
// TODO add per-base-plot-module trace defaults step
882879

883-
if(_module) _module.supplyDefaults(traceIn, traceOut, defaultColor, layout);
880+
if(_module) {
881+
_module.supplyDefaults(traceIn, traceOut, defaultColor, layout);
882+
Lib.coerceHoverinfo(traceIn, traceOut, layout);
883+
}
884884

885885
if(!plots.traceIs(traceOut, 'noOpacity')) coerce('opacity');
886886

src/traces/choropleth/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,4 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4848
colorscaleDefaults(
4949
traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'}
5050
);
51-
52-
coerce('hoverinfo', (layout._dataLength === 1) ? 'location+z+text' : undefined);
5351
};

src/traces/pie/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4747
var textInfo = coerce('textinfo', Array.isArray(textData) ? 'text+percent' : 'percent');
4848
coerce('hovertext');
4949

50-
coerce('hoverinfo', (layout._dataLength === 1) ? 'label+text+value+percent' : undefined);
51-
5250
if(textInfo && textInfo !== 'none') {
5351
var textPosition = coerce('textposition'),
5452
hasBoth = Array.isArray(textPosition) || textPosition === 'auto',

src/traces/sankey/defaults.js

-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ var Color = require('../../components/color');
1515
var tinycolor = require('tinycolor2');
1616

1717
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
18-
1918
function coerce(attr, dflt) {
2019
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
2120
}
@@ -45,8 +44,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4544
'rgba(0, 0, 0, 0.2)';
4645
}));
4746

48-
coerce('hoverinfo', layout._dataLength === 1 ? 'label+text+value+percent' : undefined);
49-
5047
coerce('domain.x');
5148
coerce('domain.y');
5249
coerce('orientation');

src/traces/scattercarpet/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
8282
if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
8383
}
8484

85-
coerce('hoverinfo', (layout._dataLength === 1) ? 'a+b+text' : undefined);
86-
8785
if(traceOut.fill === 'tonext' || traceOut.fill === 'toself') {
8886
dfltHoverOn.push('fills');
8987
}

src/traces/scattergeo/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
5252
if(traceOut.fill !== 'none') {
5353
handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
5454
}
55-
56-
coerce('hoverinfo', (layout._dataLength === 1) ? 'lon+lat+location+text' : undefined);
5755
};
5856

5957
function handleLonLatLocDefaults(traceIn, traceOut, coerce) {

src/traces/scattermapbox/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6363
if(traceOut.fill !== 'none') {
6464
handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
6565
}
66-
67-
coerce('hoverinfo', (layout._dataLength === 1) ? 'lon+lat+text' : undefined);
6866
};
6967

7068
function handleLonLatDefaults(traceIn, traceOut, coerce) {

src/traces/scatterternary/defaults.js

-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,6 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
9595
if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
9696
}
9797

98-
coerce('hoverinfo', (layout._dataLength === 1) ? 'a+b+c+text' : undefined);
99-
10098
if(traceOut.fill === 'tonext' || traceOut.fill === 'toself') {
10199
dfltHoverOn.push('fills');
102100
}

test/jasmine/tests/scatterternary_test.js

+12-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
var Plotly = require('@lib');
2+
var Plots = require('@src/plots/plots');
23
var Lib = require('@src/lib');
34
var ScatterTernary = require('@src/traces/scatterternary');
45

@@ -135,28 +136,33 @@ describe('scatterternary defaults', function() {
135136
expect(traceOut.b).toEqual([1]);
136137
expect(traceOut.c).toEqual([1]);
137138
});
139+
138140
it('should include \'name\' in \'hoverinfo\' default if multi trace graph', function() {
139141
traceIn = {
142+
type: 'scatterternary',
140143
a: [1, 2, 3],
141144
b: [1, 2, 3],
142145
c: [1, 2, 3]
143146
};
144-
layout._dataLength = 2;
145147

146-
supplyDefaults(traceIn, traceOut, defaultColor, layout);
147-
expect(traceOut.hoverinfo).toBe('all');
148+
var gd = {data: [traceIn, {}]};
149+
Plots.supplyDefaults(gd);
150+
151+
expect(gd._fullData[0].hoverinfo).toBe('all');
148152
});
149153

150154
it('should not include \'name\' in \'hoverinfo\' default if single trace graph', function() {
151155
traceIn = {
156+
type: 'scatterternary',
152157
a: [1, 2, 3],
153158
b: [1, 2, 3],
154159
c: [1, 2, 3]
155160
};
156-
layout._dataLength = 1;
157161

158-
supplyDefaults(traceIn, traceOut, defaultColor, layout);
159-
expect(traceOut.hoverinfo).toBe('a+b+c+text');
162+
var gd = {data: [traceIn]};
163+
Plots.supplyDefaults(gd);
164+
165+
expect(gd._fullData[0].hoverinfo).toBe('a+b+c+text');
160166
});
161167

162168
it('should correctly assign \'hoveron\' default', function() {

0 commit comments

Comments
 (0)