diff --git a/src/components/modebar/manage.js b/src/components/modebar/manage.js index 89e9ce3a6c1..f4a43c9ce9e 100644 --- a/src/components/modebar/manage.js +++ b/src/components/modebar/manage.js @@ -146,6 +146,9 @@ function getButtonGroups(gd, buttonsToRemove, buttonsToAdd, showSendToCloud) { if(hasCartesian) { hoverGroup = ['toggleSpikelines', 'hoverClosestCartesian', 'hoverCompareCartesian']; } + if(hasNoHover(fullLayout)) { + hoverGroup = []; + } if((hasCartesian || hasGL2D) && !allAxesFixed) { zoomGroup = ['zoomIn2d', 'zoomOut2d', 'autoScale2d']; @@ -216,6 +219,14 @@ function isSelectable(fullData) { return selectable; } +// check whether all plot modules in fullLayout are noHover +function hasNoHover(fullLayout) { + for(var i = 0; i < fullLayout._basePlotModules.length; i++) { + if(!Registry.traceIs(fullLayout._basePlotModules[i].name, 'noHover')) return false; + } + return true; +} + function appendButtonsToGroups(groups, buttons) { if(buttons.length) { if(Array.isArray(buttons[0])) { diff --git a/test/jasmine/tests/modebar_test.js b/test/jasmine/tests/modebar_test.js index 60d08a664fb..05caf3f35f4 100644 --- a/test/jasmine/tests/modebar_test.js +++ b/test/jasmine/tests/modebar_test.js @@ -41,6 +41,7 @@ describe('ModeBar', function() { _modebardiv: d3.select(getMockModeBarTree()), _has: Plots._hasPlotType, _subplots: {xaxis: xaxes || [], yaxis: yaxes || []}, + _basePlotModules: [], modebar: { orientation: 'h', bgcolor: 'rgba(255,255,255,0.7)', @@ -719,6 +720,35 @@ describe('ModeBar', function() { checkButtons(modeBar, buttons, 1); }); + it('creates mode bar without hover button when all traces are noHover', function() { + var buttons = getButtons([ + ['toImage'] + ]); + + var gd = getMockGraphInfo(); + gd._fullLayout._basePlotModules = [{ name: 'indicator' }]; + + manageModeBar(gd); + var modeBar = gd._fullLayout._modeBar; + + checkButtons(modeBar, buttons, 1); + }); + + it('creates mode bar with hover button even in the presence of one noHover trace', function() { + var buttons = getButtons([ + ['toImage'], + ['hoverClosestPie'] + ]); + + var gd = getMockGraphInfo(); + gd._fullLayout._basePlotModules = [{ name: 'indicator' }, {name: 'pie'}]; + + manageModeBar(gd); + var modeBar = gd._fullLayout._modeBar; + + checkButtons(modeBar, buttons, 1); + }); + it('throws an error if modeBarButtonsToRemove isn\'t an array', function() { var gd = getMockGraphInfo(); gd._context.modeBarButtonsToRemove = 'not gonna work';