Skip to content

Commit a554ea6

Browse files
committed
Merge branch 'master' into PR #1214
* Conflicts: src/components/updatemenus/draw.js src/components/updatemenus/scrollbox.js src/lib/index.js test/jasmine/tests/cartesian_test.js test/jasmine/tests/updatemenus_test.js
2 parents 89c615d + dc76217 commit a554ea6

Some content is hidden

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

44 files changed

+1206
-506
lines changed

devtools/test_dashboard/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
<script type="text/javascript" src="../../dist/extras/mathjax/MathJax.js?config=TeX-AMS-MML_SVG"></script>
2323
<script id="source" type="text/javascript" src="../../build/plotly.js"></script>
24+
<script type="text/javascript" src="../../test/image/strict-d3.js" charset="utf-8"></script>
2425
<script type="text/javascript" src="../../build/test_dashboard-bundle.js"></script>
2526
</body>
2627
</html>

src/components/annotations/draw.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ function drawOne(gd, index, opt, value) {
480480
annTextBG.call(Drawing.setRect, borderwidth / 2, borderwidth / 2,
481481
outerwidth - borderwidth, outerheight - borderwidth);
482482

483-
annTextGroupInner.call(Lib.setTranslate,
483+
annTextGroupInner.call(Drawing.setTranslate,
484484
Math.round(annPosPx.x.text - outerwidth / 2),
485485
Math.round(annPosPx.y.text - outerheight / 2));
486486

@@ -601,7 +601,7 @@ function drawOne(gd, index, opt, value) {
601601
dragElement.init({
602602
element: arrowDrag.node(),
603603
prepFn: function() {
604-
var pos = Lib.getTranslate(annTextGroupInner);
604+
var pos = Drawing.getTranslate(annTextGroupInner);
605605

606606
annx0 = pos.x;
607607
anny0 = pos.y;
@@ -617,7 +617,7 @@ function drawOne(gd, index, opt, value) {
617617
var annxy0 = applyTransform(annx0, anny0),
618618
xcenter = annxy0[0] + dx,
619619
ycenter = annxy0[1] + dy;
620-
annTextGroupInner.call(Lib.setTranslate, xcenter, ycenter);
620+
annTextGroupInner.call(Drawing.setTranslate, xcenter, ycenter);
621621

622622
update[annbase + '.x'] = xa ?
623623
xa.p2r(xa.r2p(options.x) + dx) :

src/components/colorscale/calc.js

+20-7
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,12 @@ module.exports = function calc(trace, vals, containerStr, cLetter) {
2727
inputContainer = trace._input;
2828
}
2929

30-
var auto = container[cLetter + 'auto'],
31-
min = container[cLetter + 'min'],
32-
max = container[cLetter + 'max'],
30+
var autoAttr = cLetter + 'auto',
31+
minAttr = cLetter + 'min',
32+
maxAttr = cLetter + 'max',
33+
auto = container[autoAttr],
34+
min = container[minAttr],
35+
max = container[maxAttr],
3336
scl = container.colorscale;
3437

3538
if(auto !== false || min === undefined) {
@@ -45,11 +48,21 @@ module.exports = function calc(trace, vals, containerStr, cLetter) {
4548
max += 0.5;
4649
}
4750

48-
container[cLetter + 'min'] = min;
49-
container[cLetter + 'max'] = max;
51+
container[minAttr] = min;
52+
container[maxAttr] = max;
5053

51-
inputContainer[cLetter + 'min'] = min;
52-
inputContainer[cLetter + 'max'] = max;
54+
inputContainer[minAttr] = min;
55+
inputContainer[maxAttr] = max;
56+
57+
/*
58+
* If auto was explicitly false but min or max was missing,
59+
* we filled in the missing piece here but later the trace does
60+
* not look auto.
61+
* Otherwise make sure the trace still looks auto as far as later
62+
* changes are concerned.
63+
*/
64+
inputContainer[autoAttr] = (auto !== false ||
65+
(min === undefined && max === undefined));
5366

5467
if(container.autocolorscale) {
5568
if(min * max < 0) scl = scales.RdBu;

src/components/drawing/index.js

+104-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ drawing.translatePoint = function(d, sel, xa, ya) {
5151
var x = d.xp || xa.c2p(d.x),
5252
y = d.yp || ya.c2p(d.y);
5353

54-
if(isNumeric(x) && isNumeric(y)) {
54+
if(isNumeric(x) && isNumeric(y) && sel.node()) {
5555
// for multiline text this works better
5656
if(sel.node().nodeName === 'text') {
5757
sel.attr('x', x).attr('y', y);
@@ -112,6 +112,7 @@ drawing.lineGroupStyle = function(s, lw, lc, ld) {
112112
};
113113

114114
drawing.dashLine = function(s, dash, lineWidth) {
115+
lineWidth = +lineWidth || 0;
115116
var dlw = Math.max(lineWidth, 3);
116117

117118
if(dash === 'solid') dash = '';
@@ -575,3 +576,105 @@ drawing.setClipUrl = function(s, localId) {
575576

576577
s.attr('clip-path', 'url(' + url + ')');
577578
};
579+
580+
drawing.getTranslate = function(element) {
581+
// Note the separator [^\d] between x and y in this regex
582+
// We generally use ',' but IE will convert it to ' '
583+
var re = /.*\btranslate\((-?\d*\.?\d*)[^-\d]*(-?\d*\.?\d*)[^\d].*/,
584+
getter = element.attr ? 'attr' : 'getAttribute',
585+
transform = element[getter]('transform') || '';
586+
587+
var translate = transform.replace(re, function(match, p1, p2) {
588+
return [p1, p2].join(' ');
589+
})
590+
.split(' ');
591+
592+
return {
593+
x: +translate[0] || 0,
594+
y: +translate[1] || 0
595+
};
596+
};
597+
598+
drawing.setTranslate = function(element, x, y) {
599+
600+
var re = /(\btranslate\(.*?\);?)/,
601+
getter = element.attr ? 'attr' : 'getAttribute',
602+
setter = element.attr ? 'attr' : 'setAttribute',
603+
transform = element[getter]('transform') || '';
604+
605+
x = x || 0;
606+
y = y || 0;
607+
608+
transform = transform.replace(re, '').trim();
609+
transform += ' translate(' + x + ', ' + y + ')';
610+
transform = transform.trim();
611+
612+
element[setter]('transform', transform);
613+
614+
return transform;
615+
};
616+
617+
drawing.getScale = function(element) {
618+
619+
var re = /.*\bscale\((\d*\.?\d*)[^\d]*(\d*\.?\d*)[^\d].*/,
620+
getter = element.attr ? 'attr' : 'getAttribute',
621+
transform = element[getter]('transform') || '';
622+
623+
var translate = transform.replace(re, function(match, p1, p2) {
624+
return [p1, p2].join(' ');
625+
})
626+
.split(' ');
627+
628+
return {
629+
x: +translate[0] || 1,
630+
y: +translate[1] || 1
631+
};
632+
};
633+
634+
drawing.setScale = function(element, x, y) {
635+
636+
var re = /(\bscale\(.*?\);?)/,
637+
getter = element.attr ? 'attr' : 'getAttribute',
638+
setter = element.attr ? 'attr' : 'setAttribute',
639+
transform = element[getter]('transform') || '';
640+
641+
x = x || 1;
642+
y = y || 1;
643+
644+
transform = transform.replace(re, '').trim();
645+
transform += ' scale(' + x + ', ' + y + ')';
646+
transform = transform.trim();
647+
648+
element[setter]('transform', transform);
649+
650+
return transform;
651+
};
652+
653+
drawing.setPointGroupScale = function(selection, x, y) {
654+
var t, scale, re;
655+
656+
x = x || 1;
657+
y = y || 1;
658+
659+
if(x === 1 && y === 1) {
660+
scale = '';
661+
} else {
662+
// The same scale transform for every point:
663+
scale = ' scale(' + x + ',' + y + ')';
664+
}
665+
666+
// A regex to strip any existing scale:
667+
re = /\s*sc.*/;
668+
669+
selection.each(function() {
670+
// Get the transform:
671+
t = (this.getAttribute('transform') || '').replace(re, '');
672+
t += scale;
673+
t = t.trim();
674+
675+
// Append the scale transform
676+
this.setAttribute('transform', t);
677+
});
678+
679+
return scale;
680+
};

src/components/legend/draw.js

+12-12
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ module.exports = function draw(gd) {
196196

197197
// Set size and position of all the elements that make up a legend:
198198
// legend, background and border, scroll box and scroll bar
199-
Lib.setTranslate(legend, lx, ly);
199+
Drawing.setTranslate(legend, lx, ly);
200200

201201
var scrollBarYMax = legendHeight -
202202
constants.scrollBarHeight -
@@ -214,7 +214,7 @@ module.exports = function draw(gd) {
214214
y: opts.borderwidth / 2
215215
});
216216

217-
Lib.setTranslate(scrollBox, 0, 0);
217+
Drawing.setTranslate(scrollBox, 0, 0);
218218

219219
clipPath.select('rect').attr({
220220
width: legendWidth - 2 * opts.borderwidth,
@@ -289,7 +289,7 @@ module.exports = function draw(gd) {
289289
function scrollHandler(scrollBarY, scrollBoxY) {
290290
scrollBox
291291
.attr('data-scroll', scrollBoxY)
292-
.call(Lib.setTranslate, 0, scrollBoxY);
292+
.call(Drawing.setTranslate, 0, scrollBoxY);
293293

294294
scrollBar.call(
295295
Drawing.setRect,
@@ -311,7 +311,7 @@ module.exports = function draw(gd) {
311311
dragElement.init({
312312
element: legend.node(),
313313
prepFn: function() {
314-
var transform = Lib.getTranslate(legend);
314+
var transform = Drawing.getTranslate(legend);
315315

316316
x0 = transform.x;
317317
y0 = transform.y;
@@ -320,7 +320,7 @@ module.exports = function draw(gd) {
320320
var newX = x0 + dx,
321321
newY = y0 + dy;
322322

323-
Lib.setTranslate(legend, newX, newY);
323+
Drawing.setTranslate(legend, newX, newY);
324324

325325
xf = dragElement.align(newX, 0, gs.l, gs.l + gs.w, opts.xanchor);
326326
yf = dragElement.align(newY, 0, gs.t + gs.h, gs.t, opts.yanchor);
@@ -384,7 +384,7 @@ function drawTexts(g, gd) {
384384
var transforms = legendItem.trace.transforms,
385385
direction = transforms[transforms.length - 1].direction;
386386

387-
astr = direction + '.legenditem.name';
387+
astr = direction + '.name';
388388
}
389389
else astr = 'name';
390390

@@ -464,7 +464,7 @@ function computeTextDimensions(g, gd) {
464464
height = mathjaxBB.height;
465465
width = mathjaxBB.width;
466466

467-
Lib.setTranslate(mathjaxGroup, 0, (height / 4));
467+
Drawing.setTranslate(mathjaxGroup, 0, (height / 4));
468468
}
469469
else {
470470
var text = g.selectAll('.legendtext'),
@@ -496,7 +496,7 @@ function computeLegendDimensions(gd, groups, traces) {
496496
if(helpers.isVertical(opts)) {
497497
if(isGrouped) {
498498
groups.each(function(d, i) {
499-
Lib.setTranslate(this, 0, i * opts.tracegroupgap);
499+
Drawing.setTranslate(this, 0, i * opts.tracegroupgap);
500500
});
501501
}
502502

@@ -508,7 +508,7 @@ function computeLegendDimensions(gd, groups, traces) {
508508
textHeight = legendItem.height,
509509
textWidth = legendItem.width;
510510

511-
Lib.setTranslate(this,
511+
Drawing.setTranslate(this,
512512
borderwidth,
513513
(5 + borderwidth + opts.height + textHeight / 2));
514514

@@ -559,7 +559,7 @@ function computeLegendDimensions(gd, groups, traces) {
559559
}
560560

561561
groups.each(function(d, i) {
562-
Lib.setTranslate(this, groupXOffsets[i], 0);
562+
Drawing.setTranslate(this, groupXOffsets[i], 0);
563563
});
564564

565565
groups.each(function() {
@@ -571,7 +571,7 @@ function computeLegendDimensions(gd, groups, traces) {
571571
var legendItem = d[0],
572572
textHeight = legendItem.height;
573573

574-
Lib.setTranslate(this,
574+
Drawing.setTranslate(this,
575575
0,
576576
(5 + borderwidth + groupHeight + textHeight / 2));
577577

@@ -626,7 +626,7 @@ function computeLegendDimensions(gd, groups, traces) {
626626
maxTraceHeight = 0;
627627
}
628628

629-
Lib.setTranslate(this,
629+
Drawing.setTranslate(this,
630630
(borderwidth + offsetX),
631631
(5 + borderwidth + legendItem.height / 2) + rowHeight);
632632

src/components/modebar/modebar.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ proto.createButton = function(config) {
147147
}
148148

149149
button.setAttribute('data-toggle', config.toggle || false);
150-
if(config.toggle) button.classList.add('active');
150+
if(config.toggle) d3.select(button).classed('active', true);
151151

152152
button.appendChild(this.createIcon(config.icon || Icons.question));
153153
button.setAttribute('data-gravity', config.gravity || 'n');

src/components/sliders/draw.js

+7-8
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
var d3 = require('d3');
1313

1414
var Plots = require('../../plots/plots');
15-
var Lib = require('../../lib');
1615
var Color = require('../color');
1716
var Drawing = require('../drawing');
1817
var svgTextUtils = require('../../lib/svg_text_utils');
@@ -252,7 +251,7 @@ function drawSlider(gd, sliderGroup, sliderOpts) {
252251
.call(drawGrip, gd, sliderOpts);
253252

254253
// Position the rectangle:
255-
Lib.setTranslate(sliderGroup, sliderOpts.lx + sliderOpts.pad.l, sliderOpts.ly + sliderOpts.pad.t);
254+
Drawing.setTranslate(sliderGroup, sliderOpts.lx + sliderOpts.pad.l, sliderOpts.ly + sliderOpts.pad.t);
256255

257256
sliderGroup.call(setGripPosition, sliderOpts, sliderOpts.active / (sliderOpts.steps.length - 1), false);
258257
sliderGroup.call(drawCurrentValue, sliderOpts);
@@ -305,7 +304,7 @@ function drawCurrentValue(sliderGroup, sliderOpts, valueOverride) {
305304
.text(str)
306305
.call(svgTextUtils.convertToTspans);
307306

308-
Lib.setTranslate(text, x0, sliderOpts.currentValueHeight);
307+
Drawing.setTranslate(text, x0, sliderOpts.currentValueHeight);
309308

310309
return text;
311310
}
@@ -366,7 +365,7 @@ function drawLabelGroup(sliderGroup, sliderOpts) {
366365

367366
item.call(drawLabel, d, sliderOpts);
368367

369-
Lib.setTranslate(item,
368+
Drawing.setTranslate(item,
370369
normalizedValueToPosition(sliderOpts, d.fraction),
371370
constants.tickOffset + sliderOpts.ticklen + sliderOpts.labelHeight + constants.labelOffset + sliderOpts.currentValueTotalHeight
372371
);
@@ -489,7 +488,7 @@ function drawTicks(sliderGroup, sliderOpts) {
489488
.attr({height: isMajor ? sliderOpts.ticklen : sliderOpts.minorticklen})
490489
.call(Color.fill, isMajor ? sliderOpts.tickcolor : sliderOpts.tickcolor);
491490

492-
Lib.setTranslate(item,
491+
Drawing.setTranslate(item,
493492
normalizedValueToPosition(sliderOpts, i / (sliderOpts.steps.length - 1)) - 0.5 * sliderOpts.tickwidth,
494493
(isMajor ? constants.tickOffset : constants.minorTickOffset) + sliderOpts.currentValueTotalHeight
495494
);
@@ -526,7 +525,7 @@ function setGripPosition(sliderGroup, sliderOpts, position, doTransition) {
526525
.ease(sliderOpts.transition.easing);
527526
}
528527

529-
// Lib.setTranslate doesn't work here becasue of the transition duck-typing.
528+
// Drawing.setTranslate doesn't work here becasue of the transition duck-typing.
530529
// It's also not necessary because there are no other transitions to preserve.
531530
el.attr('transform', 'translate(' + (x - constants.gripWidth * 0.5) + ',' + (sliderOpts.currentValueTotalHeight) + ')');
532531
}
@@ -558,7 +557,7 @@ function drawTouchRect(sliderGroup, gd, sliderOpts) {
558557
.call(Color.fill, sliderOpts.bgcolor)
559558
.attr('opacity', 0);
560559

561-
Lib.setTranslate(rect, 0, sliderOpts.currentValueTotalHeight);
560+
Drawing.setTranslate(rect, 0, sliderOpts.currentValueTotalHeight);
562561
}
563562

564563
function drawRail(sliderGroup, sliderOpts) {
@@ -581,7 +580,7 @@ function drawRail(sliderGroup, sliderOpts) {
581580
.call(Color.fill, sliderOpts.bgcolor)
582581
.style('stroke-width', sliderOpts.borderwidth + 'px');
583582

584-
Lib.setTranslate(rect,
583+
Drawing.setTranslate(rect,
585584
constants.railInset,
586585
(sliderOpts.inputAreaWidth - constants.railWidth) * 0.5 + sliderOpts.currentValueTotalHeight
587586
);

0 commit comments

Comments
 (0)