From c1b6ff20090671bfb94c9c9eb6950c891207f753 Mon Sep 17 00:00:00 2001 From: nickmelnikov82 Date: Thu, 5 May 2022 13:14:40 +0300 Subject: [PATCH 1/4] Fix modeBarButtons issue. --- src/components/modebar/manage.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/components/modebar/manage.js b/src/components/modebar/manage.js index e75c1c34409..0f66335e91a 100644 --- a/src/components/modebar/manage.js +++ b/src/components/modebar/manage.js @@ -8,6 +8,7 @@ var isUnifiedHover = require('../fx/helpers').isUnifiedHover; var createModeBar = require('./modebar'); var modeBarButtons = require('./buttons'); var DRAW_MODES = require('./constants').DRAW_MODES; +var cloneDeep = require('lodash').cloneDeep; /** * ModeBar wrapper around 'create' and 'update', @@ -44,7 +45,7 @@ module.exports = function manageModeBar(gd) { ].join(' ')); } - var customButtons = context.modeBarButtons; + var customButtons = cloneDeep(context.modeBarButtons); var buttonGroups; if(Array.isArray(customButtons) && customButtons.length) { From dfc146d765a18a5050f1f8d5bea4625b5d92f4b1 Mon Sep 17 00:00:00 2001 From: nickmelnikov82 Date: Thu, 5 May 2022 16:27:20 +0300 Subject: [PATCH 2/4] Fixed lodash usage. --- src/components/modebar/manage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/modebar/manage.js b/src/components/modebar/manage.js index 0f66335e91a..fdd2b4daf7e 100644 --- a/src/components/modebar/manage.js +++ b/src/components/modebar/manage.js @@ -8,7 +8,7 @@ var isUnifiedHover = require('../fx/helpers').isUnifiedHover; var createModeBar = require('./modebar'); var modeBarButtons = require('./buttons'); var DRAW_MODES = require('./constants').DRAW_MODES; -var cloneDeep = require('lodash').cloneDeep; +var extendDeep = require('../../lib').extendDeep; /** * ModeBar wrapper around 'create' and 'update', @@ -45,7 +45,7 @@ module.exports = function manageModeBar(gd) { ].join(' ')); } - var customButtons = cloneDeep(context.modeBarButtons); + var customButtons = extendDeep([], context.modeBarButtons); var buttonGroups; if(Array.isArray(customButtons) && customButtons.length) { From 8c2ea1cca5416953ac2dd66297b05e142f18462f Mon Sep 17 00:00:00 2001 From: nickmelnikov82 Date: Thu, 5 May 2022 18:42:20 +0300 Subject: [PATCH 3/4] Added test and draftlog. --- draftlogs/6177_fix.md | 1 + test/jasmine/tests/modebar_test.js | 9 +++++++++ 2 files changed, 10 insertions(+) create mode 100644 draftlogs/6177_fix.md diff --git a/draftlogs/6177_fix.md b/draftlogs/6177_fix.md new file mode 100644 index 00000000000..39ae6c03d41 --- /dev/null +++ b/draftlogs/6177_fix.md @@ -0,0 +1 @@ + - Fix modeBarButtons mutate the input, issue [[#1157](https://github.com/plotly/dash/issues/1157)] \ No newline at end of file diff --git a/test/jasmine/tests/modebar_test.js b/test/jasmine/tests/modebar_test.js index d4f60d1147c..05e310cca48 100644 --- a/test/jasmine/tests/modebar_test.js +++ b/test/jasmine/tests/modebar_test.js @@ -996,6 +996,15 @@ describe('ModeBar', function() { expect(countButtons(gd._fullLayout._modeBar)) .toEqual(initialButtonCount + 6); }); + + it('sets up buttons without changing the input', function() { + var config = [['toImage']]; + var gd = setupGraphInfo(); + gd._context.modeBarButtons = config; + manageModeBar(gd); + expect(config).toEqual([['toImage']]); + expect(countButtons(gd._fullLayout._modeBar)).toEqual(2); + }); }); describe('modebar on clicks', function() { From 77383de62237828210028a339e4db6955ff7aee1 Mon Sep 17 00:00:00 2001 From: nickmelnikov82 Date: Mon, 9 May 2022 10:41:14 +0300 Subject: [PATCH 4/4] Move deep copy inside fillCustomButton function. --- draftlogs/6177_fix.md | 2 +- src/components/modebar/manage.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/draftlogs/6177_fix.md b/draftlogs/6177_fix.md index 39ae6c03d41..8f22a15adb7 100644 --- a/draftlogs/6177_fix.md +++ b/draftlogs/6177_fix.md @@ -1 +1 @@ - - Fix modeBarButtons mutate the input, issue [[#1157](https://github.com/plotly/dash/issues/1157)] \ No newline at end of file + - Fix custom modebar buttons mutate the input [[#6177](https://github.com/plotly/plotly.js/pull/6177)] \ No newline at end of file diff --git a/src/components/modebar/manage.js b/src/components/modebar/manage.js index fdd2b4daf7e..a6e89f9cf2a 100644 --- a/src/components/modebar/manage.js +++ b/src/components/modebar/manage.js @@ -45,7 +45,7 @@ module.exports = function manageModeBar(gd) { ].join(' ')); } - var customButtons = extendDeep([], context.modeBarButtons); + var customButtons = context.modeBarButtons; var buttonGroups; if(Array.isArray(customButtons) && customButtons.length) { @@ -331,7 +331,9 @@ function appendButtonsToGroups(groups, buttons) { } // fill in custom buttons referring to default mode bar buttons -function fillCustomButton(customButtons) { +function fillCustomButton(originalModeBarButtons) { + var customButtons = extendDeep([], originalModeBarButtons); + for(var i = 0; i < customButtons.length; i++) { var buttonGroup = customButtons[i];