Skip to content

Commit d6f3a7b

Browse files
authored
Refactored table layouts (#278)
* #269 - Failing tests for refactored table layouts * #269 - Refactored table layouts
1 parent 725beed commit d6f3a7b

File tree

4 files changed

+106
-13
lines changed

4 files changed

+106
-13
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
{
7777
"displayName": "test",
7878
"testMatch": [
79-
"<rootDir>/test/*.js"
79+
"<rootDir>/test/**/*.js"
8080
]
8181
},
8282
{

src/layout-manager.js

+22-12
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,33 @@ const Cell = require('./cell');
22
const { ColSpanCell, RowSpanCell } = Cell;
33

44
(function () {
5+
function next(alloc, col) {
6+
if (alloc[col] > 0) {
7+
return next(alloc, col + 1);
8+
}
9+
return col;
10+
}
11+
512
function layoutTable(table) {
13+
let alloc = {};
614
table.forEach(function (row, rowIndex) {
7-
let prevCell = null;
8-
row.forEach(function (cell, columnIndex) {
15+
let col = 0;
16+
row.forEach(function (cell) {
917
cell.y = rowIndex;
10-
cell.x = prevCell ? prevCell.x + 1 : columnIndex;
11-
for (let y = rowIndex; y >= 0; y--) {
12-
let row2 = table[y];
13-
let xMax = y === rowIndex ? columnIndex : row2.length;
14-
for (let x = 0; x < xMax; x++) {
15-
let cell2 = row2[x];
16-
while (cellsConflict(cell, cell2)) {
17-
cell.x++;
18-
}
18+
// Avoid erroneous call to next() on first row
19+
cell.x = rowIndex ? next(alloc, col) : col;
20+
const rowSpan = cell.rowSpan || 1;
21+
const colSpan = cell.colSpan || 1;
22+
if (rowSpan > 1) {
23+
for (let cs = 0; cs < colSpan; cs++) {
24+
alloc[cell.x + cs] = rowSpan;
1925
}
20-
prevCell = cell;
2126
}
27+
col = cell.x + colSpan;
28+
});
29+
Object.keys(alloc).forEach((idx) => {
30+
alloc[idx]--;
31+
if (alloc[idx] < 1) delete alloc[idx];
2232
});
2333
});
2434
}

test/issues/269-test.js

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const Table = require('../..');
2+
3+
test('it renders rowSpan correctly', () => {
4+
let table = new Table({ style: { border: [], head: [] } });
5+
table.push([{ rowSpan: 3, content: 'A1' }, 'B1', 'C1'], [{ rowSpan: 2, content: 'B2' }, 'C2'], ['C3']);
6+
let expected = [
7+
'┌────┬────┬────┐',
8+
'│ A1 │ B1 │ C1 │',
9+
'│ ├────┼────┤',
10+
'│ │ B2 │ C2 │',
11+
'│ │ ├────┤',
12+
'│ │ │ C3 │',
13+
'└────┴────┴────┘',
14+
];
15+
expect(table.toString()).toEqual(expected.join('\n'));
16+
});

test/table-test.js

+67
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,73 @@ describe('@api Table ', function () {
6262

6363
expect(table.toString()).toEqual(expected.join('\n'));
6464
});
65+
66+
it('supports complex layouts', () => {
67+
let table = new Table({ style: { border: [], head: [] } });
68+
table.push(
69+
[{ content: 'TOP', colSpan: 9, hAlign: 'center' }],
70+
[
71+
{ content: 'TL', rowSpan: 4, vAlign: 'center' },
72+
{ content: 'A1', rowSpan: 3 },
73+
'B1',
74+
'C1',
75+
{ content: 'D1', rowSpan: 3, vAlign: 'center' },
76+
'E1',
77+
'F1',
78+
{ content: 'G1', rowSpan: 3 },
79+
{ content: 'TR', rowSpan: 4, vAlign: 'center' },
80+
],
81+
[{ rowSpan: 2, content: 'B2' }, 'C2', { rowSpan: 2, colSpan: 2, content: 'E2' }],
82+
['C3'],
83+
[{ content: 'A2', colSpan: 7, hAlign: 'center' }],
84+
[{ content: 'CLEAR', colSpan: 9, hAlign: 'center' }],
85+
[
86+
{ content: 'BL', rowSpan: 4, vAlign: 'center' },
87+
{ content: 'A3', colSpan: 7, hAlign: 'center' },
88+
{ content: 'BR', rowSpan: 4, vAlign: 'center' },
89+
],
90+
[
91+
{ content: 'A4', colSpan: 3, hAlign: 'center' },
92+
{ content: 'D2', rowSpan: 2, vAlign: 'center' },
93+
{ content: 'E3', colSpan: 2, hAlign: 'center' },
94+
{ content: 'G2', rowSpan: 3, vAlign: 'center' },
95+
],
96+
[
97+
{ content: 'A5', rowSpan: 2, vAlign: 'center' },
98+
{ content: 'B3', colSpan: 2, hAlign: 'center' },
99+
{ content: 'E4', rowSpan: 2, vAlign: 'center' },
100+
{ content: 'F3', rowSpan: 2, vAlign: 'center' },
101+
],
102+
['B4', { content: 'C4', colSpan: 2, hAlign: 'center' }],
103+
[{ content: 'BOTTOM', colSpan: 9, hAlign: 'center' }]
104+
);
105+
let expected = [
106+
'┌────────────────────────────────────────────┐',
107+
'│ TOP │',
108+
'├────┬────┬────┬────┬────┬────┬────┬────┬────┤',
109+
'│ │ A1 │ B1 │ C1 │ │ E1 │ F1 │ G1 │ │',
110+
'│ │ ├────┼────┤ ├────┴────┤ │ │',
111+
'│ │ │ B2 │ C2 │ D1 │ E2 │ │ │',
112+
'│ TL │ │ ├────┤ │ │ │ TR │',
113+
'│ │ │ │ C3 │ │ │ │ │',
114+
'│ ├────┴────┴────┴────┴─────────┴────┤ │',
115+
'│ │ A2 │ │',
116+
'├────┴──────────────────────────────────┴────┤',
117+
'│ CLEAR │',
118+
'├────┬──────────────────────────────────┬────┤',
119+
'│ │ A3 │ │',
120+
'│ ├──────────────┬────┬─────────┬────┤ │',
121+
'│ │ A4 │ │ E3 │ │ │',
122+
'│ BL ├────┬─────────┤ D2 ├────┬────┤ │ BR │',
123+
'│ │ │ B3 │ │ │ │ G2 │ │',
124+
'│ │ A5 ├────┬────┴────┤ E4 │ F3 │ │ │',
125+
'│ │ │ B4 │ C4 │ │ │ │ │',
126+
'├────┴────┴────┴─────────┴────┴────┴────┴────┤',
127+
'│ BOTTOM │',
128+
'└────────────────────────────────────────────┘',
129+
];
130+
expect(table.toString()).toEqual(expected.join('\n'));
131+
});
65132
});
66133

67134
/*

0 commit comments

Comments
 (0)