Skip to content

Commit 5cca8d3

Browse files
bpostlethwaitealexcjohnson
authored andcommitted
templates - big commit implementing most of it, coerce-level integration
1 parent 3dee25c commit 5cca8d3

29 files changed

+637
-100
lines changed

src/components/colorbar/defaults.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
'use strict';
1111

1212
var Lib = require('../../lib');
13+
var Template = require('../../plot_api/plot_template');
14+
1315
var handleTickValueDefaults = require('../../plots/cartesian/tick_value_defaults');
1416
var handleTickMarkDefaults = require('../../plots/cartesian/tick_mark_defaults');
1517
var handleTickLabelDefaults = require('../../plots/cartesian/tick_label_defaults');
@@ -18,7 +20,7 @@ var attributes = require('./attributes');
1820

1921

2022
module.exports = function colorbarDefaults(containerIn, containerOut, layout) {
21-
var colorbarOut = containerOut.colorbar = {},
23+
var colorbarOut = Template.newContainer(containerOut, 'colorbar'),
2224
colorbarIn = containerIn.colorbar || {};
2325

2426
function coerce(attr, dflt) {

src/components/errorbars/defaults.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,15 @@ var isNumeric = require('fast-isnumeric');
1212

1313
var Registry = require('../../registry');
1414
var Lib = require('../../lib');
15+
var Template = require('../../plot_api/plot_template');
1516

1617
var attributes = require('./attributes');
1718

1819

1920
module.exports = function(traceIn, traceOut, defaultColor, opts) {
20-
var objName = 'error_' + opts.axis,
21-
containerOut = traceOut[objName] = {},
22-
containerIn = traceIn[objName] || {};
21+
var objName = 'error_' + opts.axis;
22+
var containerOut = Template.newContainer(traceOut, objName);
23+
var containerIn = traceIn[objName] || {};
2324

2425
function coerce(attr, dflt) {
2526
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);

src/components/grid/index.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ var Lib = require('../../lib');
1212
var counterRegex = require('../../lib/regex').counter;
1313
var domainAttrs = require('../../plots/domain').attributes;
1414
var cartesianIdRegex = require('../../plots/cartesian/constants').idRegex;
15+
var Template = require('../../plot_api/plot_template');
1516

1617
var gridAttrs = {
1718
rows: {
@@ -201,7 +202,7 @@ function sizeDefaults(layoutIn, layoutOut) {
201202
if(hasXaxes) dfltColumns = xAxes.length;
202203
}
203204

204-
var gridOut = {};
205+
var gridOut = Template.newContainer(layoutOut, 'grid');
205206

206207
function coerce(attr, dflt) {
207208
return Lib.coerce(gridIn, gridOut, gridAttrs, attr, dflt);
@@ -210,7 +211,10 @@ function sizeDefaults(layoutIn, layoutOut) {
210211
var rows = coerce('rows', dfltRows);
211212
var columns = coerce('columns', dfltColumns);
212213

213-
if(!(rows * columns > 1)) return;
214+
if(!(rows * columns > 1)) {
215+
delete layoutOut.grid;
216+
return;
217+
}
214218

215219
if(!hasSubplotGrid && !hasXaxes && !hasYaxes) {
216220
var useDefaultSubplots = coerce('pattern') === 'independent';
@@ -234,8 +238,6 @@ function sizeDefaults(layoutIn, layoutOut) {
234238
x: fillGridPositions('x', coerce, dfltGapX, dfltSideX, columns),
235239
y: fillGridPositions('y', coerce, dfltGapY, dfltSideY, rows, reversed)
236240
};
237-
238-
layoutOut.grid = gridOut;
239241
}
240242

241243
// coerce x or y sizing attributes and return an array of domains for this direction

src/components/legend/defaults.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
var Registry = require('../../registry');
1313
var Lib = require('../../lib');
14+
var Template = require('../../plot_api/plot_template');
1415

1516
var attributes = require('./attributes');
1617
var basePlotLayoutAttributes = require('../../plots/layout_attributes');
@@ -19,7 +20,6 @@ var helpers = require('./helpers');
1920

2021
module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
2122
var containerIn = layoutIn.legend || {};
22-
var containerOut = {};
2323

2424
var visibleTraces = 0;
2525
var defaultOrder = 'normal';
@@ -47,16 +47,16 @@ module.exports = function legendDefaults(layoutIn, layoutOut, fullData) {
4747
}
4848
}
4949

50-
function coerce(attr, dflt) {
51-
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
52-
}
53-
5450
var showLegend = Lib.coerce(layoutIn, layoutOut,
5551
basePlotLayoutAttributes, 'showlegend', visibleTraces > 1);
5652

5753
if(showLegend === false) return;
5854

59-
layoutOut.legend = containerOut;
55+
var containerOut = Template.newContainer(layoutOut, 'legend');
56+
57+
function coerce(attr, dflt) {
58+
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
59+
}
6060

6161
coerce('bgcolor', layoutOut.paper_bgcolor);
6262
coerce('bordercolor');

src/components/rangeslider/defaults.js

+10-7
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,11 @@
99
'use strict';
1010

1111
var Lib = require('../../lib');
12+
var Template = require('../../plot_api/plot_template');
13+
var axisIds = require('../../plots/cartesian/axis_ids');
14+
1215
var attributes = require('./attributes');
1316
var oppAxisAttrs = require('./oppaxis_attributes');
14-
var axisIds = require('../../plots/cartesian/axis_ids');
1517

1618
module.exports = function handleDefaults(layoutIn, layoutOut, axName) {
1719
var axIn = layoutIn[axName];
@@ -25,13 +27,14 @@ module.exports = function handleDefaults(layoutIn, layoutOut, axName) {
2527
}
2628

2729
var containerIn = axIn.rangeslider;
28-
var containerOut = axOut.rangeslider = {};
30+
var containerOut = Template.newContainer(axOut, 'rangeslider');
2931

3032
function coerce(attr, dflt) {
3133
return Lib.coerce(containerIn, containerOut, attributes, attr, dflt);
3234
}
3335

34-
function coerceRange(rangeContainerIn, rangeContainerOut, attr, dflt) {
36+
var rangeContainerIn, rangeContainerOut;
37+
function coerceRange(attr, dflt) {
3538
return Lib.coerce(rangeContainerIn, rangeContainerOut, oppAxisAttrs, attr, dflt);
3639
}
3740

@@ -59,8 +62,8 @@ module.exports = function handleDefaults(layoutIn, layoutOut, axName) {
5962
for(var i = 0; i < yNames.length; i++) {
6063
var yName = yNames[i];
6164

62-
var rangeContainerIn = containerIn[yName] || {};
63-
var rangeContainerOut = containerOut[yName] = {};
65+
rangeContainerIn = containerIn[yName] || {};
66+
rangeContainerOut = Template.newContainer(containerOut, yName, 'yaxis');
6467

6568
var yAxOut = layoutOut[yName];
6669

@@ -69,9 +72,9 @@ module.exports = function handleDefaults(layoutIn, layoutOut, axName) {
6972
rangemodeDflt = 'fixed';
7073
}
7174

72-
var rangeMode = coerceRange(rangeContainerIn, rangeContainerOut, 'rangemode', rangemodeDflt);
75+
var rangeMode = coerceRange('rangemode', rangemodeDflt);
7376
if(rangeMode !== 'match') {
74-
coerceRange(rangeContainerIn, rangeContainerOut, 'range', yAxOut.range.slice());
77+
coerceRange('range', yAxOut.range.slice());
7578
}
7679
yAxOut._rangesliderAutorange = (rangeMode === 'auto');
7780
}

src/lib/coerce.js

+27-10
Original file line numberDiff line numberDiff line change
@@ -343,12 +343,12 @@ exports.valObjectMeta = {
343343
return false;
344344
}
345345
for(var j = 0; j < v[i].length; j++) {
346-
if(!exports.validate(v[i][j], arrayItems ? items[i][j] : items)) {
346+
if(!validate(v[i][j], arrayItems ? items[i][j] : items)) {
347347
return false;
348348
}
349349
}
350350
}
351-
else if(!exports.validate(v[i], arrayItems ? items[i] : items)) return false;
351+
else if(!validate(v[i], arrayItems ? items[i] : items)) return false;
352352
}
353353

354354
return true;
@@ -369,10 +369,17 @@ exports.valObjectMeta = {
369369
* as a convenience, returns the value it finally set
370370
*/
371371
exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt) {
372-
var opts = nestedProperty(attributes, attribute).get(),
373-
propIn = nestedProperty(containerIn, attribute),
374-
propOut = nestedProperty(containerOut, attribute),
375-
v = propIn.get();
372+
var opts = nestedProperty(attributes, attribute).get();
373+
var propIn = nestedProperty(containerIn, attribute);
374+
var propOut = nestedProperty(containerOut, attribute);
375+
var v = propIn.get();
376+
377+
var template = containerOut._template;
378+
if(v === undefined && template) {
379+
v = nestedProperty(template, attribute).get();
380+
// already used the template value, so short-circuit the second check
381+
template = 0;
382+
}
376383

377384
if(dflt === undefined) dflt = opts.dflt;
378385

@@ -387,9 +394,18 @@ exports.coerce = function(containerIn, containerOut, attributes, attribute, dflt
387394
return v;
388395
}
389396

390-
exports.valObjectMeta[opts.valType].coerceFunction(v, propOut, dflt, opts);
397+
var coerceFunction = exports.valObjectMeta[opts.valType].coerceFunction;
398+
coerceFunction(v, propOut, dflt, opts);
391399

392-
return propOut.get();
400+
var out = propOut.get();
401+
// in case v was provided but invalid, try the template again so it still
402+
// overrides the regular default
403+
if(template && out === dflt && !validate(v, opts)) {
404+
v = nestedProperty(template, attribute).get();
405+
coerceFunction(v, propOut, dflt, opts);
406+
out = propOut.get();
407+
}
408+
return out;
393409
};
394410

395411
/**
@@ -486,7 +502,7 @@ exports.coerceSelectionMarkerOpacity = function(traceOut, coerce) {
486502
coerce('unselected.marker.opacity', usmoDflt);
487503
};
488504

489-
exports.validate = function(value, opts) {
505+
function validate(value, opts) {
490506
var valObjectDef = exports.valObjectMeta[opts.valType];
491507

492508
if(opts.arrayOk && isArrayOrTypedArray(value)) return true;
@@ -503,4 +519,5 @@ exports.validate = function(value, opts) {
503519

504520
valObjectDef.coerceFunction(value, propMock, failed, opts);
505521
return out !== failed;
506-
};
522+
}
523+
exports.validate = validate;

src/plot_api/index.js

+1
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,4 @@ exports.setPlotConfig = main.setPlotConfig;
3131
exports.toImage = require('./to_image');
3232
exports.validate = require('./validate');
3333
exports.downloadImage = require('../snapshot/download');
34+
exports.makeTemplate = require('./make_template');

0 commit comments

Comments
 (0)