Skip to content

Commit 5c17d6b

Browse files
committed
switch from flaglist to arrayOk string
1 parent 096674c commit 5c17d6b

File tree

3 files changed

+101
-74
lines changed

3 files changed

+101
-74
lines changed

src/components/modebar/attributes.js

+4-34
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,5 @@
11
'use strict';
22

3-
var modeBarButtons = require('./buttons');
4-
var buttonList = Object.keys(modeBarButtons);
5-
var backButtons = [
6-
'v1hovermode',
7-
'hoverclosest',
8-
'hovercompare',
9-
'togglehover',
10-
'togglespikelines',
11-
'drawclosedpath',
12-
'drawopenpath',
13-
'drawline',
14-
'drawrect',
15-
'drawcircle',
16-
'eraseshape',
17-
];
18-
19-
var foreButtons = [];
20-
var addToForeButtons = function(b) {
21-
if(backButtons.indexOf(b._cat || b.name) !== -1) return;
22-
// for convenience add lowercase shotname e.g. zoomin as well fullname zoomInGeo
23-
var name = b.name;
24-
var _cat = (b._cat || b.name).toLowerCase();
25-
if(foreButtons.indexOf(name) === -1) foreButtons.push(name);
26-
if(foreButtons.indexOf(_cat) === -1) foreButtons.push(_cat);
27-
};
28-
buttonList.forEach(function(k) {
29-
addToForeButtons(modeBarButtons[k]);
30-
});
31-
foreButtons.sort();
32-
333
module.exports = {
344
editType: 'modebar',
355

@@ -65,8 +35,8 @@ module.exports = {
6535
].join(' ')
6636
},
6737
add: {
68-
valType: 'flaglist',
69-
flags: backButtons,
38+
valType: 'string',
39+
arrayOk: true,
7040
dflt: '',
7141
editType: 'modebar',
7242
description: [
@@ -77,8 +47,8 @@ module.exports = {
7747
].join(' ')
7848
},
7949
remove: {
80-
valType: 'flaglist',
81-
flags: foreButtons,
50+
valType: 'string',
51+
arrayOk: true,
8252
dflt: '',
8353
editType: 'modebar',
8454
description: [

src/components/modebar/manage.js

+41-11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,39 @@ var isUnifiedHover = require('../fx/helpers').isUnifiedHover;
77

88
var createModeBar = require('./modebar');
99
var modeBarButtons = require('./buttons');
10+
var buttonList = Object.keys(modeBarButtons);
11+
12+
var DRAW_MODES = [
13+
'drawline',
14+
'drawopenpath',
15+
'drawclosedpath',
16+
'drawcircle',
17+
'drawrect',
18+
'eraseshape'
19+
];
20+
21+
var backButtons = [
22+
'v1hovermode',
23+
'hoverclosest',
24+
'hovercompare',
25+
'togglehover',
26+
'togglespikelines'
27+
].concat(DRAW_MODES);
28+
29+
var foreButtons = [];
30+
var addToForeButtons = function(b) {
31+
if(backButtons.indexOf(b._cat || b.name) !== -1) return;
32+
// for convenience add lowercase shotname e.g. zoomin as well fullname zoomInGeo
33+
var name = b.name;
34+
var _cat = (b._cat || b.name).toLowerCase();
35+
if(foreButtons.indexOf(name) === -1) foreButtons.push(name);
36+
if(foreButtons.indexOf(_cat) === -1) foreButtons.push(_cat);
37+
};
38+
buttonList.forEach(function(k) {
39+
addToForeButtons(modeBarButtons[k]);
40+
});
41+
foreButtons.sort();
42+
1043

1144
/**
1245
* ModeBar wrapper around 'create' and 'update',
@@ -58,15 +91,6 @@ module.exports = function manageModeBar(gd) {
5891
else fullLayout._modeBar = createModeBar(gd, buttonGroups);
5992
};
6093

61-
var DRAW_MODES = [
62-
'drawline',
63-
'drawopenpath',
64-
'drawclosedpath',
65-
'drawcircle',
66-
'drawrect',
67-
'eraseshape'
68-
];
69-
7094
// logic behind which buttons are displayed by default
7195
function getButtonGroups(gd) {
7296
var fullLayout = gd._fullLayout;
@@ -85,8 +109,14 @@ function getButtonGroups(gd) {
85109
return false;
86110
}
87111

112+
var layoutAdd = fullLayout.modebar.add;
113+
if(typeof layoutAdd === 'string') layoutAdd = [layoutAdd];
114+
115+
var layoutRemove = fullLayout.modebar.remove;
116+
if(typeof layoutRemove === 'string') layoutRemove = [layoutRemove];
117+
88118
var buttonsToAdd = context.modeBarButtonsToAdd.concat(
89-
fullLayout.modebar.add.split('+').filter(function(e) {
119+
layoutAdd.filter(function(e) {
90120
for(var i = 0; i < context.modeBarButtonsToRemove.length; i++) {
91121
if(match(e, context.modeBarButtonsToRemove[i])) return false;
92122
}
@@ -95,7 +125,7 @@ function getButtonGroups(gd) {
95125
);
96126

97127
var buttonsToRemove = context.modeBarButtonsToRemove.concat(
98-
fullLayout.modebar.remove.split('+').filter(function(e) {
128+
layoutRemove.filter(function(e) {
99129
for(var i = 0; i < context.modeBarButtonsToAdd.length; i++) {
100130
if(match(e, context.modeBarButtonsToAdd[i])) return false;
101131
}

test/jasmine/tests/modebar_test.js

+56-29
Original file line numberDiff line numberDiff line change
@@ -1573,7 +1573,7 @@ describe('ModeBar', function() {
15731573
.then(done, done.fail);
15741574
});
15751575

1576-
it('add predefined shape drawing and hover buttons via layout.modebar.add and template', function(done) {
1576+
it('add predefined shape drawing and hover buttons via layout.modebar.add', function(done) {
15771577
function countButtons() {
15781578
var modeBarEl = gd._fullLayout._modeBar.element;
15791579
return d3Select(modeBarEl).selectAll('a.modebar-btn').size();
@@ -1591,7 +1591,7 @@ describe('ModeBar', function() {
15911591
'drawcircle',
15921592
'drawrect',
15931593
'eraseshape'
1594-
].join('+'));
1594+
]);
15951595
})
15961596
.then(function() {
15971597
expect(countButtons()).toBe(initial + 6);
@@ -1605,7 +1605,7 @@ describe('ModeBar', function() {
16051605
'hovercompare',
16061606
'hoverclosest',
16071607
'togglespikelines'
1608-
].join('+'));
1608+
]);
16091609
})
16101610
.then(function() {
16111611
expect(countButtons()).toBe(initial + 3);
@@ -1618,7 +1618,7 @@ describe('ModeBar', function() {
16181618
return Plotly.relayout(gd, 'modebar.add', [
16191619
'v1hovermode',
16201620
'togglespikelines'
1621-
].join('+'));
1621+
]);
16221622
})
16231623
.then(function() {
16241624
expect(countButtons()).toBe(initial + 3);
@@ -1629,18 +1629,16 @@ describe('ModeBar', function() {
16291629
'togglehover',
16301630
'hovercompare',
16311631
'hoverclosest',
1632-
'eraseshape',
1633-
'eraseshape',
16341632
'eraseshape'
1635-
].join('+'));
1633+
]);
16361634
})
16371635
.then(function() {
16381636
expect(countButtons()).toBe(initial + 4, 'skip duplicates');
16391637

16401638
return Plotly.relayout(gd, 'modebar.add', [
16411639
'drawline',
16421640
'invalid'
1643-
].join('+'));
1641+
]);
16441642
})
16451643
.then(function() {
16461644
expect(countButtons()).toBe(initial + 1, 'skip invalid');
@@ -1649,11 +1647,6 @@ describe('ModeBar', function() {
16491647
})
16501648
.then(function() {
16511649
expect(countButtons()).toBe(initial);
1652-
1653-
return Plotly.relayout(gd, 'template.layout.modebar.add', 'v1hovermode');
1654-
})
1655-
.then(function() {
1656-
expect(countButtons()).toBe(initial + 2, 'via template');
16571650
})
16581651
.then(done, done.fail);
16591652
});
@@ -1679,7 +1672,7 @@ describe('ModeBar', function() {
16791672
'autoscale',
16801673
'resetscale',
16811674
'toimage',
1682-
].join('+'));
1675+
]);
16831676
})
16841677
.then(function() {
16851678
expect(countButtons()).toBe(initial - 9);
@@ -1699,30 +1692,64 @@ describe('ModeBar', function() {
16991692
'autoScale2d',
17001693
'resetScale2d',
17011694
'toImage',
1702-
].join('+'));
1695+
]);
17031696
})
17041697
.then(function() {
17051698
expect(countButtons()).toBe(initial - 9);
1699+
})
1700+
.then(done, done.fail);
1701+
});
17061702

1707-
return Plotly.relayout(gd, 'modebar.remove', '');
1703+
it('remove buttons using template', function(done) {
1704+
function countButtons() {
1705+
var modeBarEl = gd._fullLayout._modeBar.element;
1706+
return d3Select(modeBarEl).selectAll('a.modebar-btn').size();
1707+
}
1708+
1709+
var initial = 10;
1710+
Plotly.newPlot(gd, [{y: [1, 2]}], {
1711+
template: {
1712+
layout: {
1713+
modebar: {
1714+
remove: [
1715+
'zoom',
1716+
'zoomin',
1717+
'zoomout',
1718+
'pan',
1719+
'select',
1720+
'lasso',
1721+
'autoscale',
1722+
'resetscale',
1723+
'toimage',
1724+
]
1725+
}
1726+
}
1727+
}
17081728
})
17091729
.then(function() {
1710-
expect(countButtons()).toBe(initial);
1730+
expect(countButtons()).toBe(initial - 9);
1731+
})
1732+
.then(done, done.fail);
1733+
});
17111734

1712-
return Plotly.relayout(gd, 'template.layout.modebar.remove', [
1713-
'zoom',
1714-
'zoomin',
1715-
'zoomout',
1716-
'pan',
1717-
'select',
1718-
'lasso',
1719-
'autoscale',
1720-
'resetscale',
1721-
'toimage',
1722-
].join('+'));
1735+
it('add buttons using template', function(done) {
1736+
function countButtons() {
1737+
var modeBarEl = gd._fullLayout._modeBar.element;
1738+
return d3Select(modeBarEl).selectAll('a.modebar-btn').size();
1739+
}
1740+
1741+
var initial = 10;
1742+
Plotly.newPlot(gd, [{y: [1, 2]}], {
1743+
template: {
1744+
layout: {
1745+
modebar: {
1746+
add: 'drawcircle'
1747+
}
1748+
}
1749+
}
17231750
})
17241751
.then(function() {
1725-
expect(countButtons()).toBe(initial - 9);
1752+
expect(countButtons()).toBe(initial + 1);
17261753
})
17271754
.then(done, done.fail);
17281755
});

0 commit comments

Comments
 (0)