diff --git a/src/components/modebar/buttons.js b/src/components/modebar/buttons.js index 468a90927f3..a496dd74f34 100644 --- a/src/components/modebar/buttons.js +++ b/src/components/modebar/buttons.js @@ -343,7 +343,7 @@ function handleCamera3d(gd, ev) { var button = ev.currentTarget; var attr = button.getAttribute('data-attr'); var fullLayout = gd._fullLayout; - var sceneIds = fullLayout._subplots.gl3d; + var sceneIds = fullLayout._subplots.gl3d || []; var aobj = {}; for(var i = 0; i < sceneIds.length; i++) { @@ -380,7 +380,7 @@ function getNextHover3d(gd, ev) { var button = ev.currentTarget; var val = button._previousVal; var fullLayout = gd._fullLayout; - var sceneIds = fullLayout._subplots.gl3d; + var sceneIds = fullLayout._subplots.gl3d || []; var axes = ['xaxis', 'yaxis', 'zaxis']; @@ -618,7 +618,7 @@ modeBarButtons.resetViewMapbox = { function resetView(gd, subplotType) { var fullLayout = gd._fullLayout; - var subplotIds = fullLayout._subplots[subplotType]; + var subplotIds = fullLayout._subplots[subplotType] || []; var aObj = {}; for(var i = 0; i < subplotIds.length; i++) { diff --git a/test/jasmine/tests/modebar_test.js b/test/jasmine/tests/modebar_test.js index 76247b141ca..eca3ff4ef5c 100644 --- a/test/jasmine/tests/modebar_test.js +++ b/test/jasmine/tests/modebar_test.js @@ -1342,6 +1342,56 @@ describe('ModeBar', function() { .then(done); }); }); + + describe('button toggleHover', function() { + it('ternary case', function(done) { + var gd = createGraphDiv(); + + function _run(msg) { + expect(gd._fullLayout.hovermode).toBe('closest', msg + '| pre'); + selectButton(gd._fullLayout._modeBar, 'toggleHover').click(); + expect(gd._fullLayout.hovermode).toBe(false, msg + '| after first click'); + selectButton(gd._fullLayout._modeBar, 'toggleHover').click(); + expect(gd._fullLayout.hovermode).toBe('closest', msg + '| after 2nd click'); + } + + Plotly.plot(gd, [ + {type: 'scatterternary', a: [1], b: [2], c: [3]} + ]) + .then(function() { + _run('base'); + + // mock for *cartesian* bundle + delete gd._fullLayout._subplots.gl3d; + + _run('cartesian bundle'); + }) + .catch(failTest) + .then(done); + }); + }); + + describe('button resetViews', function() { + it('ternary + geo case ', function(done) { + var gd = createGraphDiv(); + + Plotly.plot(gd, [ + {type: 'scatterternary', a: [1], b: [2], c: [3]}, + {type: 'scattergeo', lon: [10], lat: [20]} + ]) + .then(function() { + selectButton(gd._fullLayout._modeBar, 'resetViews').click(); + + // mock for custom geo + ternary bundle + delete gd._fullLayout._subplots.gl3d; + delete gd._fullLayout._subplots.mapbox; + + selectButton(gd._fullLayout._modeBar, 'resetViews').click(); + }) + .catch(failTest) + .then(done); + }); + }); }); describe('modebar styling', function() {