diff --git a/src/traces/barpolar/attributes.js b/src/traces/barpolar/attributes.js index 2c9fd9ad38a..0bc594a2878 100644 --- a/src/traces/barpolar/attributes.js +++ b/src/traces/barpolar/attributes.js @@ -8,6 +8,7 @@ 'use strict'; +var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes'); var extendFlat = require('../../lib/extend').extendFlat; var scatterPolarAttrs = require('../scatterpolar/attributes'); var barAttrs = require('../bar/attributes'); @@ -69,6 +70,7 @@ module.exports = { marker: barAttrs.marker, hoverinfo: scatterPolarAttrs.hoverinfo, + hovertemplate: hovertemplateAttrs(), selected: barAttrs.selected, unselected: barAttrs.unselected diff --git a/src/traces/barpolar/defaults.js b/src/traces/barpolar/defaults.js index 7b612931771..6619d60056c 100644 --- a/src/traces/barpolar/defaults.js +++ b/src/traces/barpolar/defaults.js @@ -33,6 +33,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('width'); coerce('text'); + coerce('hovertemplate'); // coerce('hovertext'); // var textPosition = coerce('textposition'); diff --git a/src/traces/barpolar/hover.js b/src/traces/barpolar/hover.js index b6ea706b59f..2719f16725e 100644 --- a/src/traces/barpolar/hover.js +++ b/src/traces/barpolar/hover.js @@ -61,6 +61,7 @@ module.exports = function hoverPoints(pointData, xval, yval) { var _cdi = Lib.extendFlat({}, cdi, {r: cdi.s, theta: cdi.p}); fillHoverText(cdi, trace, pointData); makeHoverPointText(_cdi, trace, subplot, pointData); + pointData.hovertemplate = trace.hovertemplate; pointData.color = getTraceColor(trace, cdi); pointData.xLabelVal = pointData.yLabelVal = undefined; diff --git a/src/traces/scatterpolar/attributes.js b/src/traces/scatterpolar/attributes.js index cd7a5b1fb8a..d1a2b86fce5 100644 --- a/src/traces/scatterpolar/attributes.js +++ b/src/traces/scatterpolar/attributes.js @@ -8,6 +8,7 @@ 'use strict'; +var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes'); var extendFlat = require('../../lib/extend').extendFlat; var scatterAttrs = require('../scatter/attributes'); var plotAttrs = require('../../plots/attributes'); @@ -130,6 +131,7 @@ module.exports = { flags: ['r', 'theta', 'text', 'name'] }), hoveron: scatterAttrs.hoveron, + hovertemplate: hovertemplateAttrs(), selected: scatterAttrs.selected, unselected: scatterAttrs.unselected diff --git a/src/traces/scatterpolar/defaults.js b/src/traces/scatterpolar/defaults.js index 5b34b17e95d..81f7178549a 100644 --- a/src/traces/scatterpolar/defaults.js +++ b/src/traces/scatterpolar/defaults.js @@ -35,6 +35,7 @@ function supplyDefaults(traceIn, traceOut, defaultColor, layout) { coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines'); coerce('text'); coerce('hovertext'); + if(traceOut.hoveron !== 'fills') coerce('hovertemplate'); if(subTypes.hasLines(traceOut)) { handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce); diff --git a/src/traces/scatterpolar/hover.js b/src/traces/scatterpolar/hover.js index e20791af0b5..ea52df6b1ee 100644 --- a/src/traces/scatterpolar/hover.js +++ b/src/traces/scatterpolar/hover.js @@ -32,41 +32,44 @@ function hoverPoints(pointData, xval, yval, hovermode) { newPointData.xLabelVal = undefined; newPointData.yLabelVal = undefined; makeHoverPointText(cdi, trace, subplot, newPointData); - + newPointData.hovertemplate = trace.hovertemplate; return scatterPointData; } function makeHoverPointText(cdi, trace, subplot, pointData) { + var radialAxis = subplot.radialAxis; var angularAxis = subplot.angularAxis; - var hoverinfo = cdi.hi || trace.hoverinfo; - var parts = hoverinfo.split('+'); - var text = []; - radialAxis._hovertitle = 'r'; angularAxis._hovertitle = 'θ'; + var hoverinfo = cdi.hi || trace.hoverinfo; + var text = []; function textPart(ax, val) { text.push(ax._hovertitle + ': ' + Axes.tickText(ax, val, 'hover').text); } - if(parts.indexOf('all') !== -1) parts = ['r', 'theta', 'text']; - if(parts.indexOf('r') !== -1) { - textPart(radialAxis, radialAxis.c2l(cdi.r)); - } - if(parts.indexOf('theta') !== -1) { - var theta = cdi.theta; - textPart( - angularAxis, - angularAxis.thetaunit === 'degrees' ? Lib.rad2deg(theta) : theta - ); - } - if(parts.indexOf('text') !== -1 && pointData.text) { - text.push(pointData.text); - delete pointData.text; - } + if(!trace.hovertemplate) { + var parts = hoverinfo.split('+'); + + if(parts.indexOf('all') !== -1) parts = ['r', 'theta', 'text']; + if(parts.indexOf('r') !== -1) { + textPart(radialAxis, radialAxis.c2l(cdi.r)); + } + if(parts.indexOf('theta') !== -1) { + var theta = cdi.theta; + textPart( + angularAxis, + angularAxis.thetaunit === 'degrees' ? Lib.rad2deg(theta) : theta + ); + } + if(parts.indexOf('text') !== -1 && pointData.text) { + text.push(pointData.text); + delete pointData.text; + } - pointData.extraText = text.join('
'); + pointData.extraText = text.join('
'); + } } module.exports = { diff --git a/src/traces/scatterpolargl/attributes.js b/src/traces/scatterpolargl/attributes.js index 840deec22b5..14ebb4568da 100644 --- a/src/traces/scatterpolargl/attributes.js +++ b/src/traces/scatterpolargl/attributes.js @@ -23,6 +23,7 @@ module.exports = { text: scatterPolarAttrs.text, hovertext: scatterPolarAttrs.hovertext, + hovertemplate: scatterPolarAttrs.hovertemplate, line: scatterGlAttrs.line, connectgaps: scatterGlAttrs.connectgaps, diff --git a/src/traces/scatterpolargl/defaults.js b/src/traces/scatterpolargl/defaults.js index c68c5732f65..3f534d7a207 100644 --- a/src/traces/scatterpolargl/defaults.js +++ b/src/traces/scatterpolargl/defaults.js @@ -35,6 +35,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('mode', len < PTS_LINESONLY ? 'lines+markers' : 'lines'); coerce('text'); coerce('hovertext'); + if(traceOut.hoveron !== 'fills') coerce('hovertemplate'); if(subTypes.hasLines(traceOut)) { handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce); diff --git a/src/traces/scatterternary/attributes.js b/src/traces/scatterternary/attributes.js index 9326d58d202..439259f7897 100644 --- a/src/traces/scatterternary/attributes.js +++ b/src/traces/scatterternary/attributes.js @@ -8,6 +8,7 @@ 'use strict'; +var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes'); var scatterAttrs = require('../scatter/attributes'); var plotAttrs = require('../../plots/attributes'); var colorAttributes = require('../../components/colorscale/attributes'); @@ -147,4 +148,5 @@ module.exports = { flags: ['a', 'b', 'c', 'text', 'name'] }), hoveron: scatterAttrs.hoveron, + hovertemplate: hovertemplateAttrs(), }; diff --git a/src/traces/scatterternary/defaults.js b/src/traces/scatterternary/defaults.js index eb57b8df677..fce16c7cdd8 100644 --- a/src/traces/scatterternary/defaults.js +++ b/src/traces/scatterternary/defaults.js @@ -61,6 +61,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout coerce('text'); coerce('hovertext'); + if(traceOut.hoveron !== 'fills') coerce('hovertemplate'); var defaultMode = len < constants.PTS_LINESONLY ? 'lines+markers' : 'lines'; coerce('mode', defaultMode); diff --git a/src/traces/scatterternary/hover.js b/src/traces/scatterternary/hover.js index 37711ff893f..eaf0ad26421 100644 --- a/src/traces/scatterternary/hover.js +++ b/src/traces/scatterternary/hover.js @@ -52,19 +52,18 @@ module.exports = function hoverPoints(pointData, xval, yval, hovermode) { var trace = newPointData.trace; var ternary = newPointData.subplot; var hoverinfo = cdi.hi || trace.hoverinfo; - var parts = hoverinfo.split('+'); var text = []; - function textPart(ax, val) { text.push(ax._hovertitle + ': ' + Axes.tickText(ax, val, 'hover').text); } - - if(parts.indexOf('all') !== -1) parts = ['a', 'b', 'c']; - if(parts.indexOf('a') !== -1) textPart(ternary.aaxis, cdi.a); - if(parts.indexOf('b') !== -1) textPart(ternary.baxis, cdi.b); - if(parts.indexOf('c') !== -1) textPart(ternary.caxis, cdi.c); - + if(!trace.hovertemplate) { + var parts = hoverinfo.split('+'); + if(parts.indexOf('all') !== -1) parts = ['a', 'b', 'c']; + if(parts.indexOf('a') !== -1) textPart(ternary.aaxis, cdi.a); + if(parts.indexOf('b') !== -1) textPart(ternary.baxis, cdi.b); + if(parts.indexOf('c') !== -1) textPart(ternary.caxis, cdi.c); + } newPointData.extraText = text.join('
'); - + newPointData.hovertemplate = trace.hovertemplate; return scatterPointData; }; diff --git a/test/jasmine/tests/barpolar_test.js b/test/jasmine/tests/barpolar_test.js index 46c8c46f2d6..76bf9bc943d 100644 --- a/test/jasmine/tests/barpolar_test.js +++ b/test/jasmine/tests/barpolar_test.js @@ -115,6 +115,22 @@ describe('Test barpolar hover:', function() { extraText: 'r: 1
θ: 0°', color: '#1f77b4' } + }, { + desc: 'hovertemplate', + traces: [{ + r: [1, 2, 3], + theta: [0, 90, 180], + hovertemplate: 'tpl', + }], + xval: 1, + yval: 0, + exp: { + index: 0, + x: 263.33, + y: 200, + hovertemplate: 'tpl', + color: '#1f77b4' + } }, { desc: 'with custom text scalar', traces: [{ diff --git a/test/jasmine/tests/scatterpolar_test.js b/test/jasmine/tests/scatterpolar_test.js index ebbd574c753..7d99919c375 100644 --- a/test/jasmine/tests/scatterpolar_test.js +++ b/test/jasmine/tests/scatterpolar_test.js @@ -109,6 +109,14 @@ describe('Test scatterpolar hover:', function() { desc: 'base', nums: 'r: 4.022892\nθ: 128.342°', name: 'Trial 3' + }, { + desc: 'with hovertemplate', + patch: function(fig) { + fig.data[2].hovertemplate = 'template %{r} %{theta}'; + return fig; + }, + nums: 'template 4.02289202968 128.342009045', + name: 'Trial 3' }, { desc: '(no labels - out of sector)', patch: function(fig) { diff --git a/test/jasmine/tests/scatterpolargl_test.js b/test/jasmine/tests/scatterpolargl_test.js index a19d245285e..f56bdfe34d9 100644 --- a/test/jasmine/tests/scatterpolargl_test.js +++ b/test/jasmine/tests/scatterpolargl_test.js @@ -44,6 +44,14 @@ describe('Test scatterpolargl hover:', function() { desc: 'base', nums: 'r: 3.886013\nθ: 125.2822°', name: 'Trial 3' + }, { + desc: 'with hovertemplate', + patch: function(fig) { + fig.data[2].hovertemplate = 'template %{r} %{theta}'; + return fig; + }, + nums: 'template 3.88601339194 125.282157112', + name: 'Trial 3' }, { desc: '(no labels - out of sector)', patch: function(fig) { diff --git a/test/jasmine/tests/scatterternary_test.js b/test/jasmine/tests/scatterternary_test.js index d5e10ae289d..068da83dc1d 100644 --- a/test/jasmine/tests/scatterternary_test.js +++ b/test/jasmine/tests/scatterternary_test.js @@ -402,6 +402,22 @@ describe('scatterternary hover', function() { .then(done); }); + it('should pass along hovertemplate on hover', function(done) { + var xval = 0.42; + var yval = 0.37; + var hovermode = 'closest'; + var scatterPointData; + Plotly.restyle(gd, { + hovertemplate: 'tpl' + }) + .then(function() { + scatterPointData = _hover(gd, xval, yval, hovermode); + expect(scatterPointData[0].hovertemplate).toEqual('tpl'); + }) + .catch(failTest) + .then(done); + }); + }); describe('Test scatterternary *cliponaxis*', function() {