Skip to content

Commit 3dee25c

Browse files
committed
use handleArrayContainerDefaults for various array containers:
rangeselector.buttons updatemenus.buttons parcoords & splom.dimensions (and DRY these a bit)
1 parent 86e09bb commit 3dee25c

File tree

7 files changed

+134
-159
lines changed

7 files changed

+134
-159
lines changed

src/components/rangeselector/defaults.js

+19-27
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
var Lib = require('../../lib');
1212
var Color = require('../color');
1313
var Template = require('../../plot_api/plot_template');
14+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
1415

1516
var attributes = require('./attributes');
1617
var buttonAttrs = require('./button_attributes');
@@ -25,7 +26,11 @@ module.exports = function handleDefaults(containerIn, containerOut, layout, coun
2526
return Lib.coerce(selectorIn, selectorOut, attributes, attr, dflt);
2627
}
2728

28-
var buttons = buttonsDefaults(selectorIn, selectorOut, calendar);
29+
var buttons = handleArrayContainerDefaults(selectorIn, selectorOut, {
30+
name: 'buttons',
31+
handleItemDefaults: buttonDefaults,
32+
calendar: calendar
33+
});
2934

3035
var visible = coerce('visible', buttons.length > 0);
3136
if(!visible) return;
@@ -46,43 +51,30 @@ module.exports = function handleDefaults(containerIn, containerOut, layout, coun
4651
coerce('borderwidth');
4752
};
4853

49-
function buttonsDefaults(containerIn, containerOut, calendar) {
50-
var buttonsIn = containerIn.buttons || [],
51-
buttonsOut = containerOut.buttons = [];
52-
53-
var buttonIn, buttonOut;
54+
function buttonDefaults(buttonIn, buttonOut, selectorOut, opts, itemOpts) {
55+
var calendar = opts.calendar;
5456

5557
function coerce(attr, dflt) {
5658
return Lib.coerce(buttonIn, buttonOut, buttonAttrs, attr, dflt);
5759
}
5860

59-
for(var i = 0; i < buttonsIn.length; i++) {
60-
buttonIn = buttonsIn[i];
61-
buttonOut = {};
62-
63-
var visible = coerce('visible', Lib.isPlainObject(buttonIn));
61+
var visible = coerce('visible', !itemOpts.itemIsNotPlainObject);
6462

65-
if(visible) {
66-
var step = coerce('step');
67-
if(step !== 'all') {
68-
if(calendar && calendar !== 'gregorian' && (step === 'month' || step === 'year')) {
69-
buttonOut.stepmode = 'backward';
70-
}
71-
else {
72-
coerce('stepmode');
73-
}
74-
75-
coerce('count');
63+
if(visible) {
64+
var step = coerce('step');
65+
if(step !== 'all') {
66+
if(calendar && calendar !== 'gregorian' && (step === 'month' || step === 'year')) {
67+
buttonOut.stepmode = 'backward';
68+
}
69+
else {
70+
coerce('stepmode');
7671
}
7772

78-
coerce('label');
73+
coerce('count');
7974
}
8075

81-
buttonOut._index = i;
82-
buttonsOut.push(buttonOut);
76+
coerce('label');
8377
}
84-
85-
return buttonsOut;
8678
}
8779

8880
function getPosDflt(containerOut, layout, counterAxes) {

src/components/updatemenus/defaults.js

+12-24
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,10 @@ function menuDefaults(menuIn, menuOut, layoutOut) {
3333
return Lib.coerce(menuIn, menuOut, attributes, attr, dflt);
3434
}
3535

36-
var buttons = buttonsDefaults(menuIn, menuOut);
36+
var buttons = handleArrayContainerDefaults(menuIn, menuOut, {
37+
name: 'buttons',
38+
handleItemDefaults: buttonDefaults
39+
});
3740

3841
var visible = coerce('visible', buttons.length > 0);
3942
if(!visible) return;
@@ -62,32 +65,17 @@ function menuDefaults(menuIn, menuOut, layoutOut) {
6265
coerce('borderwidth');
6366
}
6467

65-
function buttonsDefaults(menuIn, menuOut) {
66-
var buttonsIn = menuIn.buttons || [],
67-
buttonsOut = menuOut.buttons = [];
68-
69-
var buttonIn, buttonOut;
70-
68+
function buttonDefaults(buttonIn, buttonOut, selectorOut, opts, itemOpts) {
7169
function coerce(attr, dflt) {
7270
return Lib.coerce(buttonIn, buttonOut, buttonAttrs, attr, dflt);
7371
}
7472

75-
for(var i = 0; i < buttonsIn.length; i++) {
76-
buttonIn = buttonsIn[i];
77-
buttonOut = {};
78-
79-
var visible = coerce('visible', Lib.isPlainObject(buttonIn) &&
80-
(buttonIn.method === 'skip' || Array.isArray(buttonIn.args)));
81-
if(visible) {
82-
coerce('method');
83-
coerce('args');
84-
coerce('label');
85-
coerce('execute');
86-
}
87-
88-
buttonOut._index = i;
89-
buttonsOut.push(buttonOut);
73+
var visible = coerce('visible', !itemOpts.itemIsNotPlainObject &&
74+
(buttonIn.method === 'skip' || Array.isArray(buttonIn.args)));
75+
if(visible) {
76+
coerce('method');
77+
coerce('args');
78+
coerce('label');
79+
coerce('execute');
9080
}
91-
92-
return buttonsOut;
9381
}

src/traces/parcoords/defaults.js

+36-57
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,15 @@
99
'use strict';
1010

1111
var Lib = require('../../lib');
12-
var attributes = require('./attributes');
1312
var hasColorscale = require('../../components/colorscale/has_colorscale');
1413
var colorscaleDefaults = require('../../components/colorscale/defaults');
15-
var maxDimensionCount = require('./constants').maxDimensionCount;
1614
var handleDomainDefaults = require('../../plots/domain').defaults;
15+
var handleArrayContainerDefaults = require('../../plots/array_container_defaults');
16+
17+
var attributes = require('./attributes');
1718
var axisBrush = require('./axisbrush');
19+
var maxDimensionCount = require('./constants').maxDimensionCount;
20+
var mergeLength = require('./merge_length');
1821

1922
function handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce) {
2023
var lineColor = coerce('line.color', defaultColor);
@@ -26,90 +29,66 @@ function handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce) {
2629
// TODO: I think it would be better to keep showing lines beyond the last line color
2730
// but I'm not sure what color to give these lines - probably black or white
2831
// depending on the background color?
29-
traceOut._length = Math.min(traceOut._length, lineColor.length);
32+
return lineColor.length;
3033
}
3134
else {
3235
traceOut.line.color = defaultColor;
3336
}
3437
}
38+
return Infinity;
3539
}
3640

37-
function dimensionsDefaults(traceIn, traceOut) {
38-
var dimensionsIn = traceIn.dimensions || [],
39-
dimensionsOut = traceOut.dimensions = [];
40-
41-
var dimensionIn, dimensionOut, i;
42-
var commonLength = Infinity;
43-
44-
if(dimensionsIn.length > maxDimensionCount) {
45-
Lib.log('parcoords traces support up to ' + maxDimensionCount + ' dimensions at the moment');
46-
dimensionsIn.splice(maxDimensionCount);
47-
}
48-
41+
function dimensionDefaults(dimensionIn, dimensionOut, traceOut, opts, itemOpts) {
4942
function coerce(attr, dflt) {
5043
return Lib.coerce(dimensionIn, dimensionOut, attributes.dimensions, attr, dflt);
5144
}
5245

53-
for(i = 0; i < dimensionsIn.length; i++) {
54-
dimensionIn = dimensionsIn[i];
55-
dimensionOut = {};
56-
57-
if(!Lib.isPlainObject(dimensionIn)) {
58-
continue;
59-
}
60-
61-
var values = coerce('values');
62-
var visible = coerce('visible');
63-
if(!(values && values.length)) {
64-
visible = dimensionOut.visible = false;
65-
}
66-
67-
if(visible) {
68-
coerce('label');
69-
coerce('tickvals');
70-
coerce('ticktext');
71-
coerce('tickformat');
72-
coerce('range');
73-
74-
coerce('multiselect');
75-
var constraintRange = coerce('constraintrange');
76-
if(constraintRange) {
77-
dimensionOut.constraintrange = axisBrush.cleanRanges(constraintRange, dimensionOut);
78-
}
46+
var values = coerce('values');
47+
var visible = coerce('visible');
48+
if(!(values && values.length && !itemOpts.itemIsNotPlainObject)) {
49+
visible = dimensionOut.visible = false;
50+
}
7951

80-
commonLength = Math.min(commonLength, values.length);
52+
if(visible) {
53+
coerce('label');
54+
coerce('tickvals');
55+
coerce('ticktext');
56+
coerce('tickformat');
57+
coerce('range');
58+
59+
coerce('multiselect');
60+
var constraintRange = coerce('constraintrange');
61+
if(constraintRange) {
62+
dimensionOut.constraintrange = axisBrush.cleanRanges(constraintRange, dimensionOut);
8163
}
82-
83-
dimensionOut._index = i;
84-
dimensionsOut.push(dimensionOut);
8564
}
86-
87-
traceOut._length = commonLength;
88-
89-
return dimensionsOut;
9065
}
9166

9267
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
9368
function coerce(attr, dflt) {
9469
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
9570
}
9671

97-
var dimensions = dimensionsDefaults(traceIn, traceOut);
72+
var dimensionsIn = traceIn.dimensions;
73+
if(Array.isArray(dimensionsIn) && dimensionsIn.length > maxDimensionCount) {
74+
Lib.log('parcoords traces support up to ' + maxDimensionCount + ' dimensions at the moment');
75+
dimensionsIn.splice(maxDimensionCount);
76+
}
77+
78+
var dimensions = handleArrayContainerDefaults(traceIn, traceOut, {
79+
name: 'dimensions',
80+
handleItemDefaults: dimensionDefaults
81+
});
9882

99-
handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce);
83+
var len = handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce);
10084

10185
handleDomainDefaults(traceOut, layout, coerce);
10286

10387
if(!Array.isArray(dimensions) || !dimensions.length) {
10488
traceOut.visible = false;
10589
}
10690

107-
// since we're not slicing uneven arrays anymore, stash the length in each dimension
108-
// but we can't do this in dimensionsDefaults (yet?) because line.color can also
109-
// truncate
110-
for(var i = 0; i < dimensions.length; i++) {
111-
if(dimensions[i].visible) dimensions[i]._length = traceOut._length;
112-
}
91+
mergeLength(traceOut, dimensions, 'values', len);
11392

11493
// make default font size 10px (default is 12),
11594
// scale linearly with global font size

src/traces/parcoords/merge_length.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/**
2+
* Copyright 2012-2018, Plotly, Inc.
3+
* All rights reserved.
4+
*
5+
* This source code is licensed under the MIT license found in the
6+
* LICENSE file in the root directory of this source tree.
7+
*/
8+
9+
'use strict';
10+
11+
/**
12+
* mergeLength: set trace length as the minimum of all dimension data lengths
13+
* and propagates this length into each dimension
14+
*
15+
* @param {object} traceOut: the fullData trace
16+
* @param {Array(object)} dimensions: array of dimension objects
17+
* @param {string} dataAttr: the attribute of each dimension containing the data
18+
* @param {integer} len: an already-existing length from other attributes
19+
*/
20+
module.exports = function(traceOut, dimensions, dataAttr, len) {
21+
if(!len) len = Infinity;
22+
var i, dimi;
23+
for(i = 0; i < dimensions.length; i++) {
24+
dimi = dimensions[i];
25+
if(dimi.visible) len = Math.min(len, dimi[dataAttr].length);
26+
}
27+
if(len === Infinity) len = 0;
28+
29+
traceOut._length = len;
30+
for(i = 0; i < dimensions.length; i++) {
31+
dimi = dimensions[i];
32+
if(dimi.visible) dimi._length = len;
33+
}
34+
35+
return len;
36+
};

src/traces/splom/defaults.js

+14-40
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,30 @@
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 subTypes = require('../scatter/subtypes');
1516
var handleMarkerDefaults = require('../scatter/marker_defaults');
17+
var mergeLength = require('../parcoords/merge_length');
1618
var OPEN_RE = /-open/;
1719

1820
module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
1921
function coerce(attr, dflt) {
2022
return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);
2123
}
2224

23-
var dimLength = handleDimensionsDefaults(traceIn, traceOut);
25+
var dimensions = handleArrayContainerDefaults(traceIn, traceOut, {
26+
name: 'dimensions',
27+
handleItemDefaults: dimensionDefaults
28+
});
2429

2530
var showDiag = coerce('diagonal.visible');
2631
var showUpper = coerce('showupperhalf');
2732
var showLower = coerce('showlowerhalf');
2833

34+
var dimLength = mergeLength(traceOut, dimensions, 'values');
35+
2936
if(!dimLength || (!showDiag && !showUpper && !showLower)) {
3037
traceOut.visible = false;
3138
return;
@@ -44,51 +51,18 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
4451
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
4552
};
4653

47-
function handleDimensionsDefaults(traceIn, traceOut) {
48-
var dimensionsIn = traceIn.dimensions;
49-
if(!Array.isArray(dimensionsIn)) return 0;
50-
51-
var dimLength = dimensionsIn.length;
52-
var commonLength = 0;
53-
var dimensionsOut = traceOut.dimensions = new Array(dimLength);
54-
var dimIn;
55-
var dimOut;
56-
var i;
57-
54+
function dimensionDefaults(dimIn, dimOut, traceOut, opts, itemOpts) {
5855
function coerce(attr, dflt) {
5956
return Lib.coerce(dimIn, dimOut, attributes.dimensions, attr, dflt);
6057
}
6158

62-
for(i = 0; i < dimLength; i++) {
63-
dimIn = dimensionsIn[i];
64-
dimOut = dimensionsOut[i] = {};
59+
coerce('label');
60+
coerce('visible');
61+
var values = coerce('values');
6562

66-
// coerce label even if dimensions may be `visible: false`,
67-
// to fill in axis title defaults
68-
coerce('label');
69-
70-
// wait until plot step to filter out visible false dimensions
71-
var visible = coerce('visible');
72-
if(!visible) continue;
73-
74-
var values = coerce('values');
75-
if(!values || !values.length) {
76-
dimOut.visible = false;
77-
continue;
78-
}
79-
80-
commonLength = Math.max(commonLength, values.length);
81-
dimOut._index = i;
82-
}
83-
84-
for(i = 0; i < dimLength; i++) {
85-
dimOut = dimensionsOut[i];
86-
if(dimOut.visible) dimOut._length = commonLength;
63+
if(!(values && values.length && !itemOpts.itemIsNotPlainObject)) {
64+
dimOut.visible = false;
8765
}
88-
89-
traceOut._length = commonLength;
90-
91-
return dimensionsOut.length;
9266
}
9367

9468
function handleAxisDefaults(traceIn, traceOut, layout, coerce) {

0 commit comments

Comments
 (0)