Skip to content

Commit 2897167

Browse files
authored
Merge pull request #1118 from plotly/frame-extend-with-nulls
Make frame with nulls clear items & array containers
2 parents 88dbc9d + 5de6ff0 commit 2897167

File tree

19 files changed

+398
-104
lines changed

19 files changed

+398
-104
lines changed

src/components/annotations/annotation_defaults.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@ var Axes = require('../../plots/cartesian/axes');
1616
var attributes = require('./attributes');
1717

1818

19-
module.exports = function handleAnnotationDefaults(annIn, fullLayout) {
20-
var annOut = {};
19+
module.exports = function handleAnnotationDefaults(annIn, annOut, fullLayout, opts, itemOpts) {
20+
opts = opts || {};
21+
itemOpts = itemOpts || {};
2122

2223
function coerce(attr, dflt) {
2324
return Lib.coerce(annIn, annOut, attributes, attr, dflt);
2425
}
2526

26-
var visible = coerce('visible');
27+
var visible = coerce('visible', !itemOpts.itemIsNotPlainObject);
2728

2829
if(!visible) return annOut;
2930

src/components/annotations/defaults.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@
99

1010
'use strict';
1111

12+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1213
var handleAnnotationDefaults = require('./annotation_defaults');
1314

1415

1516
module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {
16-
var containerIn = layoutIn.annotations || [],
17-
containerOut = layoutOut.annotations = [];
17+
var opts = {
18+
name: 'annotations',
19+
handleItemDefaults: handleAnnotationDefaults
20+
};
1821

19-
for(var i = 0; i < containerIn.length; i++) {
20-
var annIn = containerIn[i] || {},
21-
annOut = handleAnnotationDefaults(annIn, layoutOut);
22-
23-
containerOut.push(annOut);
24-
}
22+
handleArrayContainerDefaults(layoutIn, layoutOut, opts);
2523
};

src/components/annotations/draw.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ function drawOne(gd, index, opt, value) {
242242
optionsIn[axLetter] = position;
243243
}
244244

245-
var options = handleAnnotationDefaults(optionsIn, fullLayout);
245+
var options = {};
246+
handleAnnotationDefaults(optionsIn, options, fullLayout);
246247
fullLayout.annotations[index] = options;
247248

248249
var xa = Axes.getFromId(gd, options.xref),

src/components/images/defaults.js

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,20 @@
88

99
'use strict';
1010

11-
var Axes = require('../../plots/cartesian/axes');
1211
var Lib = require('../../lib');
13-
var attributes = require('./attributes');
12+
var Axes = require('../../plots/cartesian/axes');
13+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1414

15+
var attributes = require('./attributes');
1516
var name = 'images';
1617

1718
module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {
18-
var contIn = Array.isArray(layoutIn[name]) ? layoutIn[name] : [],
19-
contOut = layoutOut[name] = [];
19+
var opts = {
20+
name: name,
21+
handleItemDefaults: imageDefaults
22+
};
2023

21-
for(var i = 0; i < contIn.length; i++) {
22-
var itemIn = contIn[i] || {},
23-
itemOut = {};
24-
25-
imageDefaults(itemIn, itemOut, layoutOut);
26-
27-
contOut.push(itemOut);
28-
}
24+
handleArrayContainerDefaults(layoutIn, layoutOut, opts);
2925
};
3026

3127

src/components/shapes/defaults.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@
99

1010
'use strict';
1111

12+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1213
var handleShapeDefaults = require('./shape_defaults');
1314

1415

1516
module.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {
16-
var containerIn = layoutIn.shapes || [],
17-
containerOut = layoutOut.shapes = [];
17+
var opts = {
18+
name: 'shapes',
19+
handleItemDefaults: handleShapeDefaults
20+
};
1821

19-
for(var i = 0; i < containerIn.length; i++) {
20-
var shapeIn = containerIn[i] || {},
21-
shapeOut = handleShapeDefaults(shapeIn, layoutOut);
22-
23-
containerOut.push(shapeOut);
24-
}
22+
handleArrayContainerDefaults(layoutIn, layoutOut, opts);
2523
};

src/components/shapes/draw.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,8 @@ function updateShape(gd, index, opt, value) {
232232
optionsIn[posAttr] = position;
233233
}
234234

235-
var options = handleShapeDefaults(optionsIn, gd._fullLayout);
235+
var options = {};
236+
handleShapeDefaults(optionsIn, options, gd._fullLayout);
236237
gd._fullLayout.shapes[index] = options;
237238

238239
var clipAxes;

src/components/shapes/shape_defaults.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ var Axes = require('../../plots/cartesian/axes');
1515
var attributes = require('./attributes');
1616
var helpers = require('./helpers');
1717

18-
module.exports = function handleShapeDefaults(shapeIn, fullLayout) {
19-
var shapeOut = {};
18+
19+
module.exports = function handleShapeDefaults(shapeIn, shapeOut, fullLayout, opts, itemOpts) {
20+
opts = opts || {};
21+
itemOpts = itemOpts || {};
2022

2123
function coerce(attr, dflt) {
2224
return Lib.coerce(shapeIn, shapeOut, attributes, attr, dflt);
2325
}
2426

25-
var visible = coerce('visible');
27+
var visible = coerce('visible', !itemOpts.itemIsNotPlainObject);
2628

2729
if(!visible) return shapeOut;
2830

src/components/sliders/defaults.js

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'use strict';
1010

1111
var Lib = require('../../lib');
12+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1213

1314
var attributes = require('./attributes');
1415
var constants = require('./constants');
@@ -18,23 +19,12 @@ var stepAttrs = attributes.steps;
1819

1920

2021
module.exports = function slidersDefaults(layoutIn, layoutOut) {
21-
var contIn = Array.isArray(layoutIn[name]) ? layoutIn[name] : [],
22-
contOut = layoutOut[name] = [];
22+
var opts = {
23+
name: name,
24+
handleItemDefaults: sliderDefaults
25+
};
2326

24-
for(var i = 0; i < contIn.length; i++) {
25-
var sliderIn = contIn[i] || {},
26-
sliderOut = {};
27-
28-
sliderDefaults(sliderIn, sliderOut, layoutOut);
29-
30-
// used on button click to update the 'active' field
31-
sliderOut._input = sliderIn;
32-
33-
// used to determine object constancy
34-
sliderOut._index = i;
35-
36-
contOut.push(sliderOut);
37-
}
27+
handleArrayContainerDefaults(layoutIn, layoutOut, opts);
3828
};
3929

4030
function sliderDefaults(sliderIn, sliderOut, layoutOut) {

src/components/updatemenus/defaults.js

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'use strict';
1010

1111
var Lib = require('../../lib');
12+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1213

1314
var attributes = require('./attributes');
1415
var constants = require('./constants');
@@ -18,23 +19,12 @@ var buttonAttrs = attributes.buttons;
1819

1920

2021
module.exports = function updateMenusDefaults(layoutIn, layoutOut) {
21-
var contIn = Array.isArray(layoutIn[name]) ? layoutIn[name] : [],
22-
contOut = layoutOut[name] = [];
22+
var opts = {
23+
name: name,
24+
handleItemDefaults: menuDefaults
25+
};
2326

24-
for(var i = 0; i < contIn.length; i++) {
25-
var menuIn = contIn[i] || {},
26-
menuOut = {};
27-
28-
menuDefaults(menuIn, menuOut, layoutOut);
29-
30-
// used on button click to update the 'active' field
31-
menuOut._input = menuIn;
32-
33-
// used to determine object constancy
34-
menuOut._index = i;
35-
36-
contOut.push(menuOut);
37-
}
27+
handleArrayContainerDefaults(layoutIn, layoutOut, opts);
3828
};
3929

4030
function menuDefaults(menuIn, menuOut, layoutOut) {

src/plot_api/helpers.js

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,12 @@ exports.cleanLayout = function(layout) {
102102
}
103103
}
104104

105-
if(layout.annotations !== undefined && !Array.isArray(layout.annotations)) {
106-
Lib.warn('Annotations must be an array.');
107-
delete layout.annotations;
108-
}
109-
var annotationsLen = (layout.annotations || []).length;
105+
var annotationsLen = Array.isArray(layout.annotations) ? layout.annotations.length : 0;
110106
for(i = 0; i < annotationsLen; i++) {
111107
var ann = layout.annotations[i];
108+
109+
if(!Lib.isPlainObject(ann)) continue;
110+
112111
if(ann.ref) {
113112
if(ann.ref === 'paper') {
114113
ann.xref = 'paper';
@@ -120,17 +119,17 @@ exports.cleanLayout = function(layout) {
120119
}
121120
delete ann.ref;
122121
}
122+
123123
cleanAxRef(ann, 'xref');
124124
cleanAxRef(ann, 'yref');
125125
}
126126

127-
if(layout.shapes !== undefined && !Array.isArray(layout.shapes)) {
128-
Lib.warn('Shapes must be an array.');
129-
delete layout.shapes;
130-
}
131-
var shapesLen = (layout.shapes || []).length;
127+
var shapesLen = Array.isArray(layout.shapes) ? layout.shapes.length : 0;
132128
for(i = 0; i < shapesLen; i++) {
133129
var shape = layout.shapes[i];
130+
131+
if(!Lib.isPlainObject(shape)) continue;
132+
134133
cleanAxRef(shape, 'xref');
135134
cleanAxRef(shape, 'yref');
136135
}

0 commit comments

Comments
 (0)