Skip to content

Commit a05c881

Browse files
committed
fix #3255 - get automargin calls out of supplyDefaults
1 parent 50ca29e commit a05c881

File tree

6 files changed

+89
-29
lines changed

6 files changed

+89
-29
lines changed

src/components/rangeslider/draw.js

+5
Original file line numberDiff line numberDiff line change
@@ -445,6 +445,11 @@ function drawRangePlot(rangeSlider, gd, axisOpts, opts) {
445445
var xa = mockFigure._fullLayout.xaxis;
446446
var ya = mockFigure._fullLayout[oppAxisName];
447447

448+
xa.clearCalc();
449+
xa.setScale();
450+
ya.clearCalc();
451+
ya.setScale();
452+
448453
var plotinfo = {
449454
id: id,
450455
plotgroup: plotgroup,

src/plots/plots.js

+25-20
Original file line numberDiff line numberDiff line change
@@ -479,15 +479,8 @@ plots.supplyDefaults = function(gd, opts) {
479479
// relink functions and _ attributes to promote consistency between plots
480480
relinkPrivateKeys(newFullLayout, oldFullLayout);
481481

482-
// TODO may return a promise
483-
plots.doAutoMargin(gd);
484-
485-
// set scale after auto margin routine
486-
var axList = axisIDs.list(gd);
487-
for(i = 0; i < axList.length; i++) {
488-
var ax = axList[i];
489-
ax.setScale();
490-
}
482+
// set up containers for margin calculations
483+
initMargins(newFullLayout);
491484

492485
// update object references in calcdata
493486
if(!skipUpdateCalc && oldCalcdata.length === newFullData.length) {
@@ -1651,7 +1644,20 @@ plots.allowAutoMargin = function(gd, id) {
16511644
gd._fullLayout._pushmarginIds[id] = 1;
16521645
};
16531646

1654-
function setupAutoMargin(fullLayout) {
1647+
function initMargins(fullLayout) {
1648+
var margin = fullLayout.margin;
1649+
1650+
if(!fullLayout._size) {
1651+
var gs = fullLayout._size = {
1652+
l: Math.round(margin.l),
1653+
r: Math.round(margin.r),
1654+
t: Math.round(margin.t),
1655+
b: Math.round(margin.b),
1656+
p: Math.round(margin.pad)
1657+
};
1658+
gs.w = Math.round(fullLayout.width) - gs.l - gs.r;
1659+
gs.h = Math.round(fullLayout.height) - gs.t - gs.b;
1660+
}
16551661
if(!fullLayout._pushmargin) fullLayout._pushmargin = {};
16561662
if(!fullLayout._pushmarginIds) fullLayout._pushmarginIds = {};
16571663
}
@@ -1674,8 +1680,6 @@ function setupAutoMargin(fullLayout) {
16741680
plots.autoMargin = function(gd, id, o) {
16751681
var fullLayout = gd._fullLayout;
16761682

1677-
setupAutoMargin(fullLayout);
1678-
16791683
var pushMargin = fullLayout._pushmargin;
16801684
var pushMarginIds = fullLayout._pushmarginIds;
16811685

@@ -1719,18 +1723,19 @@ plots.autoMargin = function(gd, id, o) {
17191723
plots.doAutoMargin = function(gd) {
17201724
var fullLayout = gd._fullLayout;
17211725
if(!fullLayout._size) fullLayout._size = {};
1722-
setupAutoMargin(fullLayout);
1726+
initMargins(fullLayout);
17231727

1724-
var gs = fullLayout._size,
1725-
oldmargins = JSON.stringify(gs);
1728+
var gs = fullLayout._size;
1729+
var oldmargins = JSON.stringify(gs);
1730+
var margin = fullLayout.margin;
17261731

17271732
// adjust margins for outside components
17281733
// fullLayout.margin is the requested margin,
17291734
// fullLayout._size has margins and plotsize after adjustment
1730-
var ml = Math.max(fullLayout.margin.l || 0, 0);
1731-
var mr = Math.max(fullLayout.margin.r || 0, 0);
1732-
var mt = Math.max(fullLayout.margin.t || 0, 0);
1733-
var mb = Math.max(fullLayout.margin.b || 0, 0);
1735+
var ml = margin.l;
1736+
var mr = margin.r;
1737+
var mt = margin.t;
1738+
var mb = margin.b;
17341739
var pushMargin = fullLayout._pushmargin;
17351740
var pushMarginIds = fullLayout._pushmarginIds;
17361741

@@ -1800,7 +1805,7 @@ plots.doAutoMargin = function(gd) {
18001805
gs.r = Math.round(mr);
18011806
gs.t = Math.round(mt);
18021807
gs.b = Math.round(mb);
1803-
gs.p = Math.round(fullLayout.margin.pad);
1808+
gs.p = Math.round(margin.pad);
18041809
gs.w = Math.round(fullLayout.width) - gs.l - gs.r;
18051810
gs.h = Math.round(fullLayout.height) - gs.t - gs.b;
18061811

test/jasmine/tests/heatmap_test.js

+5
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,11 @@ describe('heatmap calc', function() {
303303

304304
fullTrace._extremes = {};
305305

306+
// clearCalc used to be (oddly enough) part of supplyDefaults.
307+
// Now it's in doCalcData, which we don't include in this partial pathway.
308+
fullLayout.xaxis.clearCalc();
309+
fullLayout.yaxis.clearCalc();
310+
306311
var out = Heatmap.calc(gd, fullTrace)[0];
307312
out._xcategories = fullLayout.xaxis._categories;
308313
out._ycategories = fullLayout.yaxis._categories;

test/jasmine/tests/plot_api_test.js

+45
Original file line numberDiff line numberDiff line change
@@ -3087,6 +3087,51 @@ describe('Test plot api', function() {
30873087
.then(done);
30883088
});
30893089

3090+
it('can change from scatter to category scatterpolar and back', function(done) {
3091+
function scatter() {
3092+
return {
3093+
data: [{x: ['a', 'b'], y: [1, 2]}],
3094+
layout: {width: 400, height: 400, margin: {r: 80, t: 20}}
3095+
};
3096+
}
3097+
3098+
function scatterpolar() {
3099+
return {
3100+
// the bug https://github.com/plotly/plotly.js/issues/3255
3101+
// required all of this to change:
3102+
// - type -> scatterpolar
3103+
// - category theta
3104+
// - margins changed
3105+
data: [{type: 'scatterpolar', r: [1, 2, 3], theta: ['a', 'b', 'c']}],
3106+
layout: {width: 400, height: 400, margin: {r: 80, t: 50}}
3107+
};
3108+
}
3109+
3110+
function countTraces(scatterTraces, polarTraces) {
3111+
expect(document.querySelectorAll('.scatter').length)
3112+
.toBe(scatterTraces + polarTraces);
3113+
expect(document.querySelectorAll('.xy .scatter').length)
3114+
.toBe(scatterTraces);
3115+
expect(document.querySelectorAll('.polar .scatter').length)
3116+
.toBe(polarTraces);
3117+
}
3118+
3119+
Plotly.newPlot(gd, scatter())
3120+
.then(function() {
3121+
countTraces(1, 0);
3122+
return Plotly.react(gd, scatterpolar());
3123+
})
3124+
.then(function() {
3125+
countTraces(0, 1);
3126+
return Plotly.react(gd, scatter());
3127+
})
3128+
.then(function() {
3129+
countTraces(1, 0);
3130+
})
3131+
.catch(failTest)
3132+
.then(done);
3133+
});
3134+
30903135
it('can change data in candlesticks multiple times', function(done) {
30913136
// test that we've fixed the original issue in
30923137
// https://github.com/plotly/plotly.js/issues/2510

test/jasmine/tests/plots_test.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,9 @@ describe('Test Plots', function() {
8383
expect(gd._fullLayout.someFunc).toBe(oldFullLayout.someFunc);
8484

8585
expect(gd._fullLayout.xaxis.c2p)
86-
.not.toBe(oldFullLayout.xaxis.c2p, '(set during ax.setScale');
86+
.not.toBe(oldFullLayout.xaxis.c2p, '(set during setConvert)');
8787
expect(gd._fullLayout.yaxis._m)
88-
.not.toBe(oldFullLayout.yaxis._m, '(set during ax.setScale');
88+
.toBe(oldFullLayout.yaxis._m, '(we don\'t run ax.setScale here)');
8989
});
9090

9191
it('should include the correct reference to user data', function() {

test/jasmine/tests/splom_test.js

+7-7
Original file line numberDiff line numberDiff line change
@@ -820,11 +820,11 @@ describe('Test splom interactions:', function() {
820820

821821
function _assert(msg, exp) {
822822
var splomScenes = gd._fullLayout._splomScenes;
823-
var ids = Object.keys(splomScenes);
823+
var ids = gd._fullData.map(function(trace) { return trace.uid; });
824824

825825
for(var i = 0; i < 3; i++) {
826826
var drawFn = splomScenes[ids[i]].draw;
827-
expect(drawFn).toHaveBeenCalledTimes(exp[i], msg + ' - trace ' + i);
827+
expect(drawFn.calls.count()).toBe(exp[i], msg + ' - trace ' + i);
828828
drawFn.calls.reset();
829829
}
830830
}
@@ -869,7 +869,7 @@ describe('Test splom interactions:', function() {
869869

870870
methods.forEach(function(m) { spyOn(Plots, m).and.callThrough(); });
871871

872-
function assetsFnCall(msg, exp) {
872+
function assertFnCall(msg, exp) {
873873
methods.forEach(function(m) {
874874
expect(Plots[m]).toHaveBeenCalledTimes(exp[m], msg);
875875
Plots[m].calls.reset();
@@ -879,7 +879,7 @@ describe('Test splom interactions:', function() {
879879
spyOn(Lib, 'log');
880880

881881
Plotly.plot(gd, fig).then(function() {
882-
assetsFnCall('base', {
882+
assertFnCall('base', {
883883
cleanPlot: 1, // called once from inside Plots.supplyDefaults
884884
supplyDefaults: 1,
885885
doCalcdata: 1
@@ -892,9 +892,9 @@ describe('Test splom interactions:', function() {
892892
return Plotly.relayout(gd, {width: 4810, height: 3656});
893893
})
894894
.then(function() {
895-
assetsFnCall('after', {
896-
cleanPlot: 4, // 3 three from supplyDefaults, once in drawFramework
897-
supplyDefaults: 3, // 1 from relayout, 1 from automargin, 1 in drawFramework
895+
assertFnCall('after', {
896+
cleanPlot: 3, // 2 from supplyDefaults, once in drawFramework
897+
supplyDefaults: 2, // 1 from relayout, 1 in drawFramework
898898
doCalcdata: 1 // once in drawFramework
899899
});
900900
assertDims('after', 4810, 3656);

0 commit comments

Comments
 (0)