From 6adf4d96f64d7914a5572eba1b16edc097910fd9 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 4 Jul 2023 15:00:10 -0400 Subject: [PATCH 1/5] fix per legend traceorder defaults --- src/components/legend/defaults.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index ea14eeaaa55..20f7f83b66b 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -41,8 +41,12 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { var legendReallyHasATrace = false; var defaultOrder = 'normal'; - for(var i = 0; i < fullData.length; i++) { - trace = fullData[i]; + var allLegendItems = fullData.filter(function(d) { + return legendId === (d.legend || 'legend'); + }); + + for(var i = 0; i < allLegendItems.length; i++) { + trace = allLegendItems[i]; if(!trace.visible) continue; From 2f899c083faf3577b2516ddfa819e6974bd3d47d Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 4 Jul 2023 15:20:03 -0400 Subject: [PATCH 2/5] add traceorder tests for multi legends --- test/jasmine/tests/legend_test.js | 81 +++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/test/jasmine/tests/legend_test.js b/test/jasmine/tests/legend_test.js index 3b939a2c3f4..54232bee1c0 100644 --- a/test/jasmine/tests/legend_test.js +++ b/test/jasmine/tests/legend_test.js @@ -123,6 +123,31 @@ describe('legend defaults', function() { expect(layoutOut.legend.traceorder).toEqual('reversed'); }); + it('should default traceorder to reversed for stack bar charts | multi-legend case', function() { + fullData = allShown([ + {type: 'scatter'}, + {legend: 'legend2', type: 'bar', visible: 'legendonly'}, + {legend: 'legend2', type: 'bar', visible: 'legendonly'}, + {legend: 'legend2', type: 'scatter'}, + {legend: 'legend3', type: 'scatter'} + ]); + + layoutOut.legend2 = {}; + layoutOut.legend3 = {}; + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('normal'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + + layoutOut.barmode = 'stack'; + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('reversed'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + }); + it('should default traceorder to reversed for filled tonext scatter charts', function() { fullData = allShown([ {type: 'scatter'}, @@ -148,6 +173,30 @@ describe('legend defaults', function() { expect(layoutOut.legend.traceorder).toEqual('grouped+reversed'); }); + it('should default traceorder to grouped when a group is present | multi-legend case', function() { + fullData = allShown([ + {type: 'scatter'}, + {legend: 'legend2', type: 'scatter', legendgroup: 'group'}, + {legend: 'legend2', type: 'scatter'}, + {legend: 'legend3', type: 'scatter'} + ]); + + layoutOut.legend2 = {}; + layoutOut.legend3 = {}; + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('grouped'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + + fullData[1].fill = 'tonextx'; + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('reversed+grouped'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + }); + it('does not consider invisible traces for traceorder default', function() { fullData = allShown([ {type: 'bar', visible: false}, @@ -169,6 +218,38 @@ describe('legend defaults', function() { expect(layoutOut.legend.traceorder).toEqual('normal'); }); + it('does not consider invisible traces for traceorder default | multi-legend case', function() { + fullData = allShown([ + {type: 'scatter'}, + {legend: 'legend2', type: 'bar', visible: false}, + {legend: 'legend2', type: 'bar', visible: false}, + {legend: 'legend2', type: 'scatter'}, + {legend: 'legend3', type: 'scatter'}, + ]); + + layoutOut.legend2 = {}; + layoutOut.legend3 = {}; + + layoutOut.barmode = 'stack'; + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('normal'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + + fullData = allShown([ + {type: 'scatter'}, + {legend: 'legend2', type: 'scatter', legendgroup: 'group', visible: false}, + {legend: 'legend2', type: 'scatter'}, + {legend: 'legend3', type: 'scatter'} + ]); + + supplyLayoutDefaults(layoutIn, layoutOut, fullData); + expect(layoutOut.legend.traceorder).toEqual('normal'); + expect(layoutOut.legend2.traceorder).toEqual('normal'); + expect(layoutOut.legend3.traceorder).toEqual('normal'); + }); + it('should default orientation to vertical', function() { supplyLayoutDefaults(layoutIn, layoutOut, []); expect(layoutOut.legend.orientation).toEqual('v'); From 513fcfc77466f6781676becac8aabb6fecf6d159 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 4 Jul 2023 15:50:59 -0400 Subject: [PATCH 3/5] fix refrences to multi legend containers --- src/components/legend/defaults.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index 20f7f83b66b..2a274480d87 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -94,7 +94,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { legendReallyHasATrace && legendTraceCount > 1); // delete legend - if(showLegend === false) layoutOut.legend = undefined; + if(showLegend === false) layoutOut[legendId] = undefined; if(showLegend === false && !containerIn.uirevision) return; @@ -170,7 +170,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { }, 'y'); coerce('traceorder', defaultOrder); - if(helpers.isGrouped(layoutOut.legend)) coerce('tracegroupgap'); + if(helpers.isGrouped(layoutOut[legendId])) coerce('tracegroupgap'); coerce('entrywidth'); coerce('entrywidthmode'); From f309b5f3ab84c0e2ee7af1d1635a74db4d4e72a2 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 4 Jul 2023 17:21:37 -0400 Subject: [PATCH 4/5] show legend2, legend3, etc when having one legend item or more --- src/components/legend/defaults.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/legend/defaults.js b/src/components/legend/defaults.js index 2a274480d87..19f24beec7b 100644 --- a/src/components/legend/defaults.js +++ b/src/components/legend/defaults.js @@ -91,7 +91,7 @@ function groupDefaults(legendId, layoutIn, layoutOut, fullData) { var showLegend = Lib.coerce(layoutIn, layoutOut, basePlotLayoutAttributes, 'showlegend', - legendReallyHasATrace && legendTraceCount > 1); + legendReallyHasATrace && (legendTraceCount > (legendId === 'legend' ? 1 : 0))); // delete legend if(showLegend === false) layoutOut[legendId] = undefined; From f0ebd1f00584cdf2056295436eb5d0c81df93221 Mon Sep 17 00:00:00 2001 From: Mojtaba Samimi Date: Tue, 4 Jul 2023 18:24:44 -0400 Subject: [PATCH 5/5] draftlog for PR 6664 --- draftlogs/6664_fix.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 draftlogs/6664_fix.md diff --git a/draftlogs/6664_fix.md b/draftlogs/6664_fix.md new file mode 100644 index 00000000000..d70107b43ed --- /dev/null +++ b/draftlogs/6664_fix.md @@ -0,0 +1 @@ + - Fix per legend traceorder defaults and legend groups when having multiple legends [[#6664](https://github.com/plotly/plotly.js/pull/6664)]