Skip to content

Commit e7f1478

Browse files
committed
Merge branch 'master' into config-opts-in-plot-schema
2 parents bed30cd + 7d67f80 commit e7f1478

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+871
-97
lines changed

src/components/colorbar/connect.js

+18-11
Original file line numberDiff line numberDiff line change
@@ -41,19 +41,26 @@ module.exports = function connectColorbar(gd, cd, moduleOpts) {
4141

4242
var trace = cd[0].trace;
4343
var cbId = 'cb' + trace.uid;
44-
var containerName = moduleOpts.container;
45-
var container = containerName ? trace[containerName] : trace;
44+
moduleOpts = Array.isArray(moduleOpts) ? moduleOpts : [moduleOpts];
4645

47-
gd._fullLayout._infolayer.selectAll('.' + cbId).remove();
48-
if(!container || !container.showscale) return;
46+
for(var i = 0; i < moduleOpts.length; i++) {
47+
var containerName = moduleOpts[i].container;
4948

50-
var cb = cd[0].t.cb = drawColorbar(gd, cbId);
49+
var container = containerName ? trace[containerName] : trace;
5150

52-
var scl = container.reversescale ?
53-
flipScale(container.colorscale) :
54-
container.colorscale;
51+
gd._fullLayout._infolayer.selectAll('.' + cbId).remove();
52+
if(!container || !container.showscale) continue;
5553

56-
cb.fillgradient(scl)
57-
.zrange([container[moduleOpts.min], container[moduleOpts.max]])
58-
.options(container.colorbar)();
54+
var cb = cd[0].t.cb = drawColorbar(gd, cbId);
55+
56+
var scl = container.reversescale ?
57+
flipScale(container.colorscale) :
58+
container.colorscale;
59+
60+
cb.fillgradient(scl)
61+
.zrange([container[moduleOpts[i].min], container[moduleOpts[i].max]])
62+
.options(container.colorbar)();
63+
64+
return;
65+
}
5966
};

src/components/legend/draw.js

+17-20
Original file line numberDiff line numberDiff line change
@@ -108,20 +108,20 @@ module.exports = function draw(gd) {
108108
traces.enter().append('g').attr('class', 'traces');
109109
traces.exit().remove();
110110

111-
traces.call(style, gd)
112-
.style('opacity', function(d) {
113-
var trace = d[0].trace;
114-
if(Registry.traceIs(trace, 'pie')) {
115-
return hiddenSlices.indexOf(d[0].label) !== -1 ? 0.5 : 1;
116-
} else {
117-
return trace.visible === 'legendonly' ? 0.5 : 1;
118-
}
119-
})
120-
.each(function() {
121-
d3.select(this)
122-
.call(drawTexts, gd, maxLength)
123-
.call(setupTraceToggle, gd);
124-
});
111+
traces.style('opacity', function(d) {
112+
var trace = d[0].trace;
113+
if(Registry.traceIs(trace, 'pie')) {
114+
return hiddenSlices.indexOf(d[0].label) !== -1 ? 0.5 : 1;
115+
} else {
116+
return trace.visible === 'legendonly' ? 0.5 : 1;
117+
}
118+
})
119+
.each(function() {
120+
d3.select(this)
121+
.call(drawTexts, gd, maxLength)
122+
.call(setupTraceToggle, gd);
123+
})
124+
.call(style, gd);
125125

126126
Lib.syncOrAsync([Plots.previousPromises,
127127
function() {
@@ -522,8 +522,7 @@ function computeTextDimensions(g, gd) {
522522
width = mathjaxBB.width;
523523

524524
Drawing.setTranslate(mathjaxGroup, 0, (height / 4));
525-
}
526-
else {
525+
} else {
527526
var text = g.select('.legendtext');
528527
var textLines = svgTextUtils.lineCount(text);
529528
var textNode = text.node();
@@ -535,12 +534,10 @@ function computeTextDimensions(g, gd) {
535534
// to avoid getBoundingClientRect
536535
var textY = lineHeight * (0.3 + (1 - textLines) / 2);
537536
svgTextUtils.positionText(text, constants.textOffsetX, textY);
538-
legendItem.lineHeight = lineHeight;
539537
}
540538

541-
height = Math.max(height, 16) + 3;
542-
543-
legendItem.height = height;
539+
legendItem.lineHeight = lineHeight;
540+
legendItem.height = Math.max(height, 16) + 3;
544541
legendItem.width = width;
545542
}
546543

src/components/legend/style.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ module.exports = function style(s, gd) {
3131
var height = d[0].height;
3232

3333
if(valign === 'middle' || !lineHeight || !height) {
34-
layers.attr('transform', null); // this here is a fun d3 trick to unset DOM attributes
34+
layers.attr('transform', null);
3535
} else {
3636
var factor = {top: 1, bottom: -1}[valign];
3737
var markerOffsetY = factor * (0.5 * (lineHeight - height + 3));

src/plot_api/helpers.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -318,11 +318,11 @@ exports.cleanData = function(data) {
318318
}
319319

320320
// scl->scale, reversescl->reversescale
321-
if('scl' in trace) {
321+
if('scl' in trace && !('colorscale' in trace)) {
322322
trace.colorscale = trace.scl;
323323
delete trace.scl;
324324
}
325-
if('reversescl' in trace) {
325+
if('reversescl' in trace && !('reversescale' in trace)) {
326326
trace.reversescale = trace.reversescl;
327327
delete trace.reversescl;
328328
}

src/plot_api/template_api.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,14 @@ var dfltConfig = require('./plot_config').dfltConfig;
2424
* Note: separated from the rest of templates because otherwise we get circular
2525
* references due to PlotSchema.
2626
*
27-
* @param {object|DOM element} figure: The figure to base the template on
27+
* @param {object|DOM element|string} figure: The figure to base the template on
2828
* should contain a trace array `figure.data`
2929
* and a layout object `figure.layout`
3030
* @returns {object} template: the extracted template - can then be used as
3131
* `layout.template` in another figure.
3232
*/
3333
exports.makeTemplate = function(figure) {
34+
figure = Lib.isPlainObject(figure) ? figure : Lib.getGraphDiv(figure);
3435
figure = Lib.extendDeep({_context: dfltConfig}, {data: figure.data, layout: figure.layout});
3536
Plots.supplyDefaults(figure);
3637
var data = figure.data || [];

src/plots/cartesian/dragbox.js

-9
Original file line numberDiff line numberDiff line change
@@ -430,17 +430,8 @@ function makeDragBox(gd, plotinfo, x, y, w, h, ns, ew) {
430430
return;
431431
}
432432

433-
var pc = gd.querySelector('.plotly');
434-
435433
recomputeAxisLists();
436434

437-
// if the plot has scrollbars (more than a tiny excess)
438-
// disable scrollzoom too.
439-
if(pc.scrollHeight - pc.clientHeight > 10 ||
440-
pc.scrollWidth - pc.clientWidth > 10) {
441-
return;
442-
}
443-
444435
clearTimeout(redrawTimer);
445436

446437
var wheelDelta = -e.deltaY;

src/plots/cartesian/position_defaults.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,11 @@ module.exports = function handlePositionDefaults(containerIn, containerOut, coer
7272
// in the axes popover to hide domain for the overlaying axis.
7373
// perhaps I should make a private version _domain that all axes get???
7474
var domain = coerce('domain', dfltDomain);
75-
if(domain[0] > domain[1] - 0.01) containerOut.domain = dfltDomain;
75+
76+
// according to https://www.npmjs.com/package/canvas-size
77+
// the minimum value of max canvas width across browsers and devices is 4096
78+
// which applied in the calculation below:
79+
if(domain[0] > domain[1] - 1 / 4096) containerOut.domain = dfltDomain;
7680
Lib.noneOrAll(containerIn.domain, containerOut.domain, dfltDomain);
7781
}
7882

src/traces/bar/defaults.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
7070

7171
handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout);
7272

73+
var lineColor = (traceOut.marker.line || {}).color;
74+
7375
// override defaultColor for error bars with defaultLine
7476
var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');
75-
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'y'});
76-
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'x', inherit: 'y'});
77+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'});
78+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'});
7779

7880
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
7981
};

src/traces/barpolar/attributes.js

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var extendFlat = require('../../lib/extend').extendFlat;
1213
var scatterPolarAttrs = require('../scatterpolar/attributes');
1314
var barAttrs = require('../bar/attributes');
@@ -69,6 +70,7 @@ module.exports = {
6970
marker: barAttrs.marker,
7071

7172
hoverinfo: scatterPolarAttrs.hoverinfo,
73+
hovertemplate: hovertemplateAttrs(),
7274

7375
selected: barAttrs.selected,
7476
unselected: barAttrs.unselected

src/traces/barpolar/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3333
coerce('width');
3434

3535
coerce('text');
36+
coerce('hovertemplate');
3637
// coerce('hovertext');
3738

3839
// var textPosition = coerce('textposition');

src/traces/barpolar/hover.js

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module.exports = function hoverPoints(pointData, xval, yval) {
6161
var _cdi = Lib.extendFlat({}, cdi, {r: cdi.s, theta: cdi.p});
6262
fillHoverText(cdi, trace, pointData);
6363
makeHoverPointText(_cdi, trace, subplot, pointData);
64+
pointData.hovertemplate = trace.hovertemplate;
6465
pointData.color = getTraceColor(trace, cdi);
6566
pointData.xLabelVal = pointData.yLabelVal = undefined;
6667

src/traces/choropleth/attributes.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var scatterGeoAttrs = require('../scattergeo/attributes');
1213
var colorscaleAttrs = require('../../components/colorscale/attributes');
1314
var colorbarAttrs = require('../../components/colorbar/attributes');
@@ -72,7 +73,8 @@ module.exports = extendFlat({
7273
hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {
7374
editType: 'calc',
7475
flags: ['location', 'z', 'text', 'name']
75-
})
76+
}),
77+
hovertemplate: hovertemplateAttrs(),
7678
},
7779

7880
colorscaleAttrs('', {

src/traces/choropleth/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3030
coerce('locationmode');
3131

3232
coerce('text');
33+
coerce('hovertemplate');
3334

3435
coerce('marker.line.color');
3536
coerce('marker.line.width');

src/traces/choropleth/hover.js

+5
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,18 @@ module.exports = function hoverPoints(pointData, xval, yval) {
4747
pointData.index = pt.index;
4848
pointData.location = pt.loc;
4949
pointData.z = pt.z;
50+
pointData.hovertemplate = pt.hovertemplate;
5051

5152
makeHoverInfo(pointData, trace, pt, geo.mockAxis);
5253

5354
return [pointData];
5455
};
5556

5657
function makeHoverInfo(pointData, trace, pt, axis) {
58+
if(trace.hovertemplate) {
59+
return;
60+
}
61+
5762
var hoverinfo = pt.hi || trace.hoverinfo;
5863

5964
var parts = (hoverinfo === 'all') ?

src/traces/histogram/defaults.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,12 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6262

6363
handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout);
6464

65+
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
66+
67+
var lineColor = (traceOut.marker.line || {}).color;
68+
6569
// override defaultColor for error bars with defaultLine
6670
var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');
67-
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'y'});
68-
errorBarsSupplyDefaults(traceIn, traceOut, Color.defaultLine, {axis: 'x', inherit: 'y'});
69-
70-
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
71+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'});
72+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'});
7173
};

src/traces/scatter/defaults.js

+5-2
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,17 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
7171
if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
7272
}
7373

74+
var lineColor = (traceOut.line || {}).color;
75+
var markerColor = (traceOut.marker || {}).color;
76+
7477
if(traceOut.fill === 'tonext' || traceOut.fill === 'toself') {
7578
dfltHoverOn.push('fills');
7679
}
7780
coerce('hoveron', dfltHoverOn.join('+') || 'points');
7881
if(traceOut.hoveron !== 'fills') coerce('hovertemplate');
7982
var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');
80-
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'y'});
81-
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'x', inherit: 'y'});
83+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'y'});
84+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'x', inherit: 'y'});
8285

8386
Lib.coerceSelectionMarkerOpacity(traceOut, coerce);
8487
};

src/traces/scatter/line_defaults.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ module.exports = function lineDefaults(traceIn, traceOut, defaultColor, layout,
1818
coerce('line.color', defaultColor);
1919

2020
if(hasColorscale(traceIn, 'line')) {
21-
colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'line.', cLetter: 'c', noScale: true});
21+
colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'line.', cLetter: 'c'});
2222
} else {
2323
var lineColorDflt = (isArrayOrTypedArray(markerColor) ? false : markerColor) || defaultColor;
2424
coerce('line.color', lineColorDflt);

src/traces/scatter3d/attributes.js

-3
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,6 @@ var lineAttrs = extendFlat({
3131
description: 'Sets the dash style of the lines.'
3232
}
3333
}, colorAttributes('line'));
34-
// not yet implemented
35-
delete lineAttrs.showscale;
36-
delete lineAttrs.colorbar;
3734

3835
function makeProjectionAttr(axLetter) {
3936
return {

src/traces/scatter3d/defaults.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
6262
}
6363

6464
var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');
65-
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'z'});
66-
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'y', inherit: 'z'});
67-
errorBarsSupplyDefaults(traceIn, traceOut, defaultColor, {axis: 'x', inherit: 'z'});
65+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'z'});
66+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'y', inherit: 'z'});
67+
errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'x', inherit: 'z'});
6868
};
6969

7070
function handleXYZDefaults(traceIn, traceOut, coerce, layout) {

src/traces/scatter3d/index.js

+11-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,17 @@ Scatter3D.plot = require('./convert');
1414
Scatter3D.attributes = require('./attributes');
1515
Scatter3D.markerSymbols = require('../../constants/gl3d_markers');
1616
Scatter3D.supplyDefaults = require('./defaults');
17-
Scatter3D.colorbar = require('../scatter/marker_colorbar');
17+
Scatter3D.colorbar = [
18+
{
19+
container: 'marker',
20+
min: 'cmin',
21+
max: 'cmax'
22+
}, {
23+
container: 'line',
24+
min: 'cmin',
25+
max: 'cmax'
26+
}
27+
];
1828
Scatter3D.calc = require('./calc');
1929

2030
Scatter3D.moduleType = 'trace';

src/traces/scattergeo/attributes.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
'use strict';
1010

11+
var hovertemplateAttrs = require('../../components/fx/hovertemplate_attributes');
1112
var scatterAttrs = require('../scatter/attributes');
1213
var plotAttrs = require('../../plots/attributes');
1314
var colorAttributes = require('../../components/colorscale/attributes');
@@ -122,5 +123,6 @@ module.exports = overrideAll({
122123

123124
hoverinfo: extendFlat({}, plotAttrs.hoverinfo, {
124125
flags: ['lon', 'lat', 'location', 'text', 'name']
125-
})
126+
}),
127+
hovertemplate: hovertemplateAttrs(),
126128
}, 'calc', 'nested');

src/traces/scattergeo/defaults.js

+1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
3333

3434
coerce('text');
3535
coerce('hovertext');
36+
coerce('hovertemplate');
3637
coerce('mode');
3738

3839
if(subTypes.hasLines(traceOut)) {

src/traces/scattergeo/hover.js

+5
Original file line numberDiff line numberDiff line change
@@ -66,11 +66,16 @@ module.exports = function hoverPoints(pointData, xval, yval) {
6666

6767
pointData.color = getTraceColor(trace, di);
6868
pointData.extraText = getExtraText(trace, di, geo.mockAxis, cd[0].t.labels);
69+
pointData.hovertemplate = trace.hovertemplate;
6970

7071
return [pointData];
7172
};
7273

7374
function getExtraText(trace, pt, axis, labels) {
75+
if(trace.hovertemplate) {
76+
return;
77+
}
78+
7479
var hoverinfo = pt.hi || trace.hoverinfo;
7580

7681
var parts = hoverinfo === 'all' ?

0 commit comments

Comments
 (0)