Skip to content

Commit 090a9f1

Browse files
committed
drop all interactivity from staticPlot tables
1 parent 6d174ca commit 090a9f1

File tree

3 files changed

+64
-21
lines changed

3 files changed

+64
-21
lines changed

src/traces/table/data_preparation_helper.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ module.exports = function calc(gd, trace) {
5858
var maxLineWidth = Math.max(arrayMax(trace.header.line.width), arrayMax(trace.cells.line.width));
5959

6060
var calcdata = {
61-
key: trace.index,
61+
// include staticPlot in the key so if it changes we delete and redraw
62+
key: trace.uid + gd._context.staticPlot,
6263
translateX: domain.x[0] * gd._fullLayout._size.w,
6364
translateY: gd._fullLayout._size.h * (1 - domain.y[1]),
6465
size: gd._fullLayout._size,

src/traces/table/plot.js

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ var splitData = require('./data_split_helpers');
2020
var Color = require('../../components/color');
2121

2222
module.exports = function plot(gd, wrappedTraceHolders) {
23+
var dynamic = !gd._context.staticPlot;
2324

2425
var table = gd._fullLayout._paper.selectAll('.' + c.cn.table)
2526
.data(wrappedTraceHolders.map(function(wrappedTraceHolder) {
@@ -51,22 +52,30 @@ module.exports = function plot(gd, wrappedTraceHolders) {
5152
var tableControlView = table.selectAll('.' + c.cn.tableControlView)
5253
.data(gup.repeat, gup.keyFun);
5354

54-
tableControlView.enter()
55+
var cvEnter = tableControlView.enter()
5556
.append('g')
5657
.classed(c.cn.tableControlView, true)
57-
.style('box-sizing', 'content-box')
58-
.on('mousemove', function(d) {tableControlView.filter(function(dd) {return d === dd;}).call(renderScrollbarKit, gd);})
59-
.on('mousewheel', function(d) {
60-
if(d.scrollbarState.wheeling) return;
61-
d.scrollbarState.wheeling = true;
62-
var noChange = makeDragRow(gd, tableControlView, null, d.scrollY + d3.event.deltaY)(d);
63-
if(!noChange) {
64-
d3.event.stopPropagation();
65-
d3.event.preventDefault();
66-
}
67-
d.scrollbarState.wheeling = false;
68-
})
69-
.call(renderScrollbarKit, gd, true);
58+
.style('box-sizing', 'content-box');
59+
if(dynamic) {
60+
cvEnter
61+
.on('mousemove', function(d) {
62+
tableControlView
63+
.filter(function(dd) {return d === dd;})
64+
.call(renderScrollbarKit, gd);
65+
})
66+
.on('mousewheel', function(d) {
67+
if(d.scrollbarState.wheeling) return;
68+
d.scrollbarState.wheeling = true;
69+
var newY = d.scrollY + d3.event.deltaY;
70+
var noChange = makeDragRow(gd, tableControlView, null, newY)(d);
71+
if(!noChange) {
72+
d3.event.stopPropagation();
73+
d3.event.preventDefault();
74+
}
75+
d.scrollbarState.wheeling = false;
76+
})
77+
.call(renderScrollbarKit, gd, true);
78+
}
7079

7180
tableControlView
7281
.attr('transform', function(d) {return 'translate(' + d.size.l + ' ' + d.size.t + ')';});
@@ -98,9 +107,10 @@ module.exports = function plot(gd, wrappedTraceHolders) {
98107

99108
yColumn.exit().remove();
100109

101-
yColumn
102-
.attr('transform', function(d) {return 'translate(' + d.x + ' 0)';})
103-
.call(d3.behavior.drag()
110+
yColumn.attr('transform', function(d) {return 'translate(' + d.x + ' 0)';});
111+
112+
if(dynamic) {
113+
yColumn.call(d3.behavior.drag()
104114
.origin(function(d) {
105115
var movedColumn = d3.select(this);
106116
easeColumn(movedColumn, d, -c.uplift);
@@ -139,6 +149,7 @@ module.exports = function plot(gd, wrappedTraceHolders) {
139149
columnMoved(gd, p, p.columns.map(function(dd) {return dd.xIndex;}));
140150
})
141151
);
152+
}
142153

143154
yColumn.each(function(d) {
144155
Drawing.setClipUrl(d3.select(this), columnBoundaryClipKey(gd, d), gd);
@@ -160,8 +171,8 @@ module.exports = function plot(gd, wrappedTraceHolders) {
160171
var headerColumnBlock = columnBlock.filter(headerBlock);
161172
var cellsColumnBlock = columnBlock.filter(cellsBlock);
162173

163-
cellsColumnBlock
164-
.call(d3.behavior.drag()
174+
if(dynamic) {
175+
cellsColumnBlock.call(d3.behavior.drag()
165176
.origin(function(d) {
166177
d3.event.stopPropagation();
167178
return d;
@@ -171,6 +182,7 @@ module.exports = function plot(gd, wrappedTraceHolders) {
171182
// fixme emit plotly notification
172183
})
173184
);
185+
}
174186

175187
// initial rendering: header is rendered first, as it may may have async LaTeX (show header first)
176188
// but blocks are _entered_ the way they are due to painter's algo (header on top)

test/jasmine/tests/table_test.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,37 @@ describe('table', function() {
490490
});
491491

492492
it('does not scroll any tables with staticPlot', function(done) {
493-
// TODO
493+
var allTableControls = document.querySelectorAll('.' + cn.tableControlView);
494+
var bigCenter = getCenter(allTableControls[1]);
495+
496+
var mock = Lib.extendDeep({}, mockMulti);
497+
498+
// make sure initially with staticPlot: false, scrolling works
499+
// (copied from previous test)
500+
scroll(bigCenter, 20);
501+
assertBubbledEvents(0);
502+
scroll(bigCenter, -40);
503+
assertBubbledEvents(0);
504+
505+
Plotly.react(gd, mock.data, mock.layout, {staticPlot: true})
506+
.then(function() {
507+
// now the same scrolls bubble
508+
scroll(bigCenter, 20);
509+
assertBubbledEvents(1);
510+
scroll(bigCenter, -40);
511+
assertBubbledEvents(1);
512+
513+
return Plotly.react(gd, mock.data, mock.layout, {staticPlot: false});
514+
})
515+
.then(function() {
516+
// scroll works again!
517+
scroll(bigCenter, 20);
518+
assertBubbledEvents(0);
519+
scroll(bigCenter, -40);
520+
assertBubbledEvents(0);
521+
})
522+
.catch(failTest)
523+
.then(done);
494524
});
495525
});
496526
});

0 commit comments

Comments
 (0)