Skip to content

Commit e63bab4

Browse files
authored
Merge pull request #909 from plotly/legend-visibility-toggle
Fix legend trace toggle background on restyles
2 parents 2eccfbd + 34475d5 commit e63bab4

File tree

3 files changed

+101
-17
lines changed

3 files changed

+101
-17
lines changed

src/components/legend/draw.js

+34-11
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,6 @@ function setupTraceToggle(g, gd) {
429429

430430
function computeTextDimensions(g, gd) {
431431
var legendItem = g.data()[0][0],
432-
bg = g.selectAll('.legendtoggle'),
433432
mathjaxGroup = g.select('g[class*=math-group]'),
434433
opts = gd._fullLayout.legend,
435434
lineHeight = opts.font.size * 1.3,
@@ -466,8 +465,6 @@ function computeTextDimensions(g, gd) {
466465

467466
height = Math.max(height, 16) + 3;
468467

469-
bg.attr({x: 0, y: -height / 2, height: height});
470-
471468
legendItem.height = height;
472469
legendItem.width = width;
473470
}
@@ -508,12 +505,21 @@ function computeLegendDimensions(gd, groups, traces) {
508505
opts.height += (opts._lgroupsLength - 1) * opts.tracegroupgap;
509506
}
510507

511-
traces.selectAll('.legendtoggle')
512-
.attr('width', (gd._context.editable ? 0 : opts.width) + 40);
513-
514508
// make sure we're only getting full pixels
515509
opts.width = Math.ceil(opts.width);
516510
opts.height = Math.ceil(opts.height);
511+
512+
traces.each(function(d) {
513+
var legendItem = d[0],
514+
bg = d3.select(this).select('.legendtoggle');
515+
516+
bg.call(Drawing.setRect,
517+
0,
518+
-legendItem.height / 2,
519+
(gd._context.editable ? 0 : opts.width) + 40,
520+
legendItem.height
521+
);
522+
});
517523
}
518524
else if(isGrouped) {
519525
opts.width = 0;
@@ -564,8 +570,17 @@ function computeLegendDimensions(gd, groups, traces) {
564570
opts.width = Math.ceil(opts.width);
565571
opts.height = Math.ceil(opts.height);
566572

567-
traces.selectAll('.legendtoggle')
568-
.attr('width', (gd._context.editable ? 0 : opts.width));
573+
traces.each(function(d) {
574+
var legendItem = d[0],
575+
bg = d3.select(this).select('.legendtoggle');
576+
577+
bg.call(Drawing.setRect,
578+
0,
579+
-legendItem.height / 2,
580+
(gd._context.editable ? 0 : opts.width),
581+
legendItem.height
582+
);
583+
});
569584
}
570585
else {
571586
opts.width = 0;
@@ -581,7 +596,6 @@ function computeLegendDimensions(gd, groups, traces) {
581596
});
582597

583598
traces.each(function(d) {
584-
585599
var legendItem = d[0],
586600
traceWidth = maxTraceWidth,
587601
traceGap = opts.tracegroupgap || 5;
@@ -613,8 +627,17 @@ function computeLegendDimensions(gd, groups, traces) {
613627
opts.width = Math.ceil(opts.width);
614628
opts.height = Math.ceil(opts.height);
615629

616-
traces.selectAll('.legendtoggle')
617-
.attr('width', (gd._context.editable ? 0 : opts.width));
630+
traces.each(function(d) {
631+
var legendItem = d[0],
632+
bg = d3.select(this).select('.legendtoggle');
633+
634+
bg.call(Drawing.setRect,
635+
0,
636+
-legendItem.height / 2,
637+
(gd._context.editable ? 0 : opts.width),
638+
legendItem.height
639+
);
640+
});
618641
}
619642
}
620643

src/traces/bar/arrays_to_calcdata.js

+10-6
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,16 @@ var mergeArray = require('../../lib').mergeArray;
1515
// arrayOk attributes, merge them into calcdata array
1616
module.exports = function arraysToCalcdata(cd) {
1717
var trace = cd[0].trace,
18-
marker = trace.marker,
19-
markerLine = marker.line;
18+
marker = trace.marker;
2019

2120
mergeArray(trace.text, cd, 'tx');
22-
mergeArray(marker.opacity, cd, 'mo');
23-
mergeArray(marker.color, cd, 'mc');
24-
mergeArray(markerLine.color, cd, 'mlc');
25-
mergeArray(markerLine.width, cd, 'mlw');
21+
22+
if(marker && marker.line) {
23+
var markerLine = marker.line;
24+
25+
mergeArray(marker.opacity, cd, 'mo');
26+
mergeArray(marker.color, cd, 'mc');
27+
mergeArray(markerLine.color, cd, 'mlc');
28+
mergeArray(markerLine.width, cd, 'mlw');
29+
}
2630
};

test/jasmine/tests/legend_test.js

+57
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var anchorUtils = require('@src/components/legend/anchor_utils');
1010
var d3 = require('d3');
1111
var createGraphDiv = require('../assets/create_graph_div');
1212
var destroyGraphDiv = require('../assets/destroy_graph_div');
13+
var customMatchers = require('../assets/custom_matchers');
1314

1415

1516
describe('legend defaults', function() {
@@ -563,3 +564,59 @@ describe('legend orientation change:', function() {
563564
});
564565
});
565566
});
567+
568+
describe('legend restyle update', function() {
569+
'use strict';
570+
571+
beforeAll(function() {
572+
jasmine.addMatchers(customMatchers);
573+
});
574+
575+
afterEach(destroyGraphDiv);
576+
577+
it('should update trace toggle background rectangle', function(done) {
578+
var mock = require('@mocks/0.json'),
579+
mockCopy = Lib.extendDeep({}, mock),
580+
gd = createGraphDiv();
581+
582+
mockCopy.data[0].visible = false;
583+
mockCopy.data[0].showlegend = false;
584+
mockCopy.data[1].visible = false;
585+
mockCopy.data[1].showlegend = false;
586+
587+
function countLegendItems() {
588+
return d3.select(gd).selectAll('rect.legendtoggle').size();
589+
}
590+
591+
function assertTraceToggleRect() {
592+
var nodes = d3.selectAll('rect.legendtoggle');
593+
594+
nodes.each(function() {
595+
var node = d3.select(this);
596+
597+
expect(node.attr('x')).toEqual('0');
598+
expect(node.attr('y')).toEqual('-9.5');
599+
expect(node.attr('height')).toEqual('19');
600+
601+
var w = +node.attr('width');
602+
expect(Math.abs(w - 160)).toBeLessThan(10);
603+
});
604+
}
605+
606+
Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() {
607+
expect(countLegendItems()).toEqual(1);
608+
assertTraceToggleRect();
609+
610+
return Plotly.restyle(gd, 'visible', [true, false, false]);
611+
}).then(function() {
612+
expect(countLegendItems()).toEqual(0);
613+
614+
return Plotly.restyle(gd, 'showlegend', [true, false, false]);
615+
}).then(function() {
616+
expect(countLegendItems()).toEqual(1);
617+
assertTraceToggleRect();
618+
619+
done();
620+
});
621+
});
622+
});

0 commit comments

Comments
 (0)