Skip to content

Commit 858f7c2

Browse files
committed
fix #3255 - get automargin calls out of supplyDefaults
1 parent a25c5e3 commit 858f7c2

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
@@ -497,15 +497,8 @@ plots.supplyDefaults = function(gd, opts) {
497497
if(uids[uid] === 'old') delete tracePreGUI[uid];
498498
}
499499

500-
// TODO may return a promise
501-
plots.doAutoMargin(gd);
502-
503-
// set scale after auto margin routine
504-
var axList = axisIDs.list(gd);
505-
for(i = 0; i < axList.length; i++) {
506-
var ax = axList[i];
507-
ax.setScale();
508-
}
500+
// set up containers for margin calculations
501+
initMargins(newFullLayout);
509502

510503
// update object references in calcdata
511504
if(!skipUpdateCalc && oldCalcdata.length === newFullData.length) {
@@ -1686,7 +1679,20 @@ plots.allowAutoMargin = function(gd, id) {
16861679
gd._fullLayout._pushmarginIds[id] = 1;
16871680
};
16881681

1689-
function setupAutoMargin(fullLayout) {
1682+
function initMargins(fullLayout) {
1683+
var margin = fullLayout.margin;
1684+
1685+
if(!fullLayout._size) {
1686+
var gs = fullLayout._size = {
1687+
l: Math.round(margin.l),
1688+
r: Math.round(margin.r),
1689+
t: Math.round(margin.t),
1690+
b: Math.round(margin.b),
1691+
p: Math.round(margin.pad)
1692+
};
1693+
gs.w = Math.round(fullLayout.width) - gs.l - gs.r;
1694+
gs.h = Math.round(fullLayout.height) - gs.t - gs.b;
1695+
}
16901696
if(!fullLayout._pushmargin) fullLayout._pushmargin = {};
16911697
if(!fullLayout._pushmarginIds) fullLayout._pushmarginIds = {};
16921698
}
@@ -1709,8 +1715,6 @@ function setupAutoMargin(fullLayout) {
17091715
plots.autoMargin = function(gd, id, o) {
17101716
var fullLayout = gd._fullLayout;
17111717

1712-
setupAutoMargin(fullLayout);
1713-
17141718
var pushMargin = fullLayout._pushmargin;
17151719
var pushMarginIds = fullLayout._pushmarginIds;
17161720

@@ -1754,18 +1758,19 @@ plots.autoMargin = function(gd, id, o) {
17541758
plots.doAutoMargin = function(gd) {
17551759
var fullLayout = gd._fullLayout;
17561760
if(!fullLayout._size) fullLayout._size = {};
1757-
setupAutoMargin(fullLayout);
1761+
initMargins(fullLayout);
17581762

1759-
var gs = fullLayout._size,
1760-
oldmargins = JSON.stringify(gs);
1763+
var gs = fullLayout._size;
1764+
var oldmargins = JSON.stringify(gs);
1765+
var margin = fullLayout.margin;
17611766

17621767
// adjust margins for outside components
17631768
// fullLayout.margin is the requested margin,
17641769
// fullLayout._size has margins and plotsize after adjustment
1765-
var ml = Math.max(fullLayout.margin.l || 0, 0);
1766-
var mr = Math.max(fullLayout.margin.r || 0, 0);
1767-
var mt = Math.max(fullLayout.margin.t || 0, 0);
1768-
var mb = Math.max(fullLayout.margin.b || 0, 0);
1770+
var ml = margin.l;
1771+
var mr = margin.r;
1772+
var mt = margin.t;
1773+
var mb = margin.b;
17691774
var pushMargin = fullLayout._pushmargin;
17701775
var pushMarginIds = fullLayout._pushmarginIds;
17711776

@@ -1835,7 +1840,7 @@ plots.doAutoMargin = function(gd) {
18351840
gs.r = Math.round(mr);
18361841
gs.t = Math.round(mt);
18371842
gs.b = Math.round(mb);
1838-
gs.p = Math.round(fullLayout.margin.pad);
1843+
gs.p = Math.round(margin.pad);
18391844
gs.w = Math.round(fullLayout.width) - gs.l - gs.r;
18401845
gs.h = Math.round(fullLayout.height) - gs.t - gs.b;
18411846

test/jasmine/tests/heatmap_test.js

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

299299
fullTrace._extremes = {};
300300

301+
// clearCalc used to be (oddly enough) part of supplyDefaults.
302+
// Now it's in doCalcData, which we don't include in this partial pathway.
303+
fullLayout.xaxis.clearCalc();
304+
fullLayout.yaxis.clearCalc();
305+
301306
var out = Heatmap.calc(gd, fullTrace)[0];
302307
out._xcategories = fullLayout.xaxis._categories;
303308
out._ycategories = fullLayout.yaxis._categories;

test/jasmine/tests/plot_api_react_test.js

+45
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,51 @@ describe('@noCIdep Plotly.react', function() {
468468
.then(done);
469469
});
470470

471+
it('can change from scatter to category scatterpolar and back', function(done) {
472+
function scatter() {
473+
return {
474+
data: [{x: ['a', 'b'], y: [1, 2]}],
475+
layout: {width: 400, height: 400, margin: {r: 80, t: 20}}
476+
};
477+
}
478+
479+
function scatterpolar() {
480+
return {
481+
// the bug https://github.com/plotly/plotly.js/issues/3255
482+
// required all of this to change:
483+
// - type -> scatterpolar
484+
// - category theta
485+
// - margins changed
486+
data: [{type: 'scatterpolar', r: [1, 2, 3], theta: ['a', 'b', 'c']}],
487+
layout: {width: 400, height: 400, margin: {r: 80, t: 50}}
488+
};
489+
}
490+
491+
function countTraces(scatterTraces, polarTraces) {
492+
expect(document.querySelectorAll('.scatter').length)
493+
.toBe(scatterTraces + polarTraces);
494+
expect(document.querySelectorAll('.xy .scatter').length)
495+
.toBe(scatterTraces);
496+
expect(document.querySelectorAll('.polar .scatter').length)
497+
.toBe(polarTraces);
498+
}
499+
500+
Plotly.newPlot(gd, scatter())
501+
.then(function() {
502+
countTraces(1, 0);
503+
return Plotly.react(gd, scatterpolar());
504+
})
505+
.then(function() {
506+
countTraces(0, 1);
507+
return Plotly.react(gd, scatter());
508+
})
509+
.then(function() {
510+
countTraces(1, 0);
511+
})
512+
.catch(failTest)
513+
.then(done);
514+
});
515+
471516
it('can change data in candlesticks multiple times', function(done) {
472517
// test that we've fixed the original issue in
473518
// 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)