Skip to content

Commit 9037720

Browse files
authored
Merge pull request #2314 from plotly/partial-table-attribs
Table `values` may be left unspecified
2 parents aae3929 + c786ade commit 9037720

File tree

4 files changed

+73
-18
lines changed

4 files changed

+73
-18
lines changed

src/traces/table/constants.js

+14-13
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,27 @@
99
'use strict';
1010

1111
module.exports = {
12-
maxDimensionCount: 60,
13-
overdrag: 45,
1412
cellPad: 8,
13+
columnExtentOffset: 10,
14+
columnTitleOffset: 28,
15+
emptyHeaderHeight: 16,
1516
latexCheck: /^\$.*\$$/,
16-
wrapSplitCharacter: ' ',
17-
wrapSpacer: ' ',
18-
lineBreaker: '<br>',
19-
uplift: 5,
2017
goldenRatio: 1.618,
21-
columnTitleOffset: 28,
22-
columnExtentOffset: 10,
23-
transitionEase: 'cubic-out',
24-
transitionDuration: 100,
25-
releaseTransitionEase: 'cubic-out',
18+
lineBreaker: '<br>',
19+
maxDimensionCount: 60,
20+
overdrag: 45,
2621
releaseTransitionDuration: 120,
27-
scrollbarWidth: 8,
22+
releaseTransitionEase: 'cubic-out',
2823
scrollbarCaptureWidth: 18,
29-
scrollbarOffset: 5,
3024
scrollbarHideDelay: 1000,
3125
scrollbarHideDuration: 1000,
26+
scrollbarOffset: 5,
27+
scrollbarWidth: 8,
28+
transitionDuration: 100,
29+
transitionEase: 'cubic-out',
30+
uplift: 5,
31+
wrapSpacer: ' ',
32+
wrapSplitCharacter: ' ',
3233
cn: {
3334
// general class names
3435
table: 'table',

src/traces/table/data_preparation_helper.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,17 @@ var isNumeric = require('fast-isnumeric');
1414

1515
// pure functions, don't alter but passes on `gd` and parts of `trace` without deep copying
1616
module.exports = function calc(gd, trace) {
17+
var cellsValues = trace.cells.values;
18+
var slicer = function(a) {
19+
return a.slice(trace.header.values.length, a.length);
20+
};
1721
var headerValues = trace.header.values.map(function(c) {
1822
return Array.isArray(c) ? c : [c];
19-
});
20-
var cellsValues = trace.cells.values;
23+
}).concat(slicer(cellsValues).map(function() {return [''];}));
2124
var domain = trace.domain;
2225
var groupWidth = Math.floor(gd._fullLayout._size.w * (domain.x[1] - domain.x[0]));
2326
var groupHeight = Math.floor(gd._fullLayout._size.h * (domain.y[1] - domain.y[0]));
24-
var headerRowHeights = headerValues.length ? headerValues[0].map(function() {return trace.header.height;}) : [];
27+
var headerRowHeights = trace.header.values.length ? headerValues[0].map(function() {return trace.header.height;}) : [c.emptyHeaderHeight];
2528
var rowHeights = cellsValues.length ? cellsValues[0].map(function() {return trace.cells.height;}) : [];
2629
var headerHeight = headerRowHeights.reduce(function(a, b) {return a + b;}, 0);
2730
var scrollHeight = groupHeight - headerHeight;
@@ -31,7 +34,7 @@ module.exports = function calc(gd, trace) {
3134
var headerRowBlocks = makeRowBlock(anchorToHeaderRowBlock, []);
3235
var rowBlocks = makeRowBlock(anchorToRowBlock, headerRowBlocks);
3336
var uniqueKeys = {};
34-
var columnOrder = trace._fullInput.columnorder;
37+
var columnOrder = trace._fullInput.columnorder.concat(slicer(cellsValues.map(function(d, i) {return i;})));
3538
var columnWidths = headerValues.map(function(d, i) {
3639
var value = Array.isArray(trace.columnwidth) ?
3740
trace.columnwidth[Math.min(i, trace.columnwidth.length - 1)] :

src/traces/table/data_split_helpers.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ exports.splitToPanels = function(d) {
5151

5252
exports.splitToCells = function(d) {
5353
var fromTo = rowFromTo(d);
54-
return d.values.slice(fromTo[0], fromTo[1]).map(function(v, i) {
54+
return (d.values || []).slice(fromTo[0], fromTo[1]).map(function(v, i) {
5555
// By keeping identical key, a DOM node removal, creation and addition is spared, important when visible
5656
// grid has a lot of elements (quadratic with xcol/ycol count).
5757
// But it has to be busted when `svgUtil.convertToTspans` is used as it reshapes cell subtrees asynchronously,

test/jasmine/tests/table_test.js

+51
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,57 @@ describe('table', function() {
206206
});
207207
});
208208

209+
describe('Rendering with partial attribute support', function() {
210+
var mockCopy,
211+
gd;
212+
213+
afterEach(destroyGraphDiv);
214+
215+
it('`Plotly.plot` should render all the columns even if no cell contents were supplied yet', function(done) {
216+
gd = createGraphDiv();
217+
mockCopy = Lib.extendDeep({}, mock);
218+
delete mockCopy.data[0].cells;
219+
Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() {
220+
expect(gd.data.length).toEqual(1);
221+
expect(gd.data[0].header.values.length).toEqual(7);
222+
expect(document.querySelectorAll('.' + cn.yColumn).length).toEqual(7);
223+
expect(document.querySelectorAll('.' + cn.columnCell).length).toEqual(7 * 2); // both column rows to render
224+
done();
225+
});
226+
});
227+
228+
it('`Plotly.plot` should render all columns even if no header contents were supplied yet', function(done) {
229+
gd = createGraphDiv();
230+
mockCopy = Lib.extendDeep({}, mock);
231+
delete mockCopy.data[0].header;
232+
Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() {
233+
expect(gd.data.length).toEqual(1);
234+
expect(gd.data[0].cells.values.length).toEqual(7);
235+
expect(document.querySelectorAll('.' + cn.yColumn).length).toEqual(7);
236+
expect(document.querySelectorAll('.' + cn.columnCell).length).toEqual(7 * 29);
237+
expect(document.querySelectorAll('#header').length).toEqual(7);
238+
expect(document.querySelectorAll('#header .' + cn.columnCell).length).toEqual(7);
239+
expect(document.querySelector('#header .' + cn.columnCell + ' text').textContent).toEqual('');
240+
done();
241+
});
242+
});
243+
244+
it('`Plotly.plot` should render all the column headers even if not all header values were supplied', function(done) {
245+
gd = createGraphDiv();
246+
mockCopy = Lib.extendDeep({}, mock);
247+
mockCopy.data[0].header.values = ['A', 'S', 'D']; // doesn't cover all 7 columns
248+
Plotly.plot(gd, mockCopy.data, mockCopy.layout).then(function() {
249+
expect(gd.data.length).toEqual(1);
250+
expect(gd.data[0].cells.values.length).toEqual(7);
251+
expect(document.querySelectorAll('.' + cn.yColumn).length).toEqual(7);
252+
expect(document.querySelectorAll('#header').length).toEqual(7);
253+
expect(document.querySelectorAll('#header .' + cn.columnCell).length).toEqual(7);
254+
expect(document.querySelector('#header .' + cn.columnCell + ' text').textContent).toEqual('A');
255+
done();
256+
});
257+
});
258+
});
259+
209260
describe('basic use and basic data restyling', function() {
210261
var mockCopy,
211262
gd;

0 commit comments

Comments
 (0)