-
Notifications
You must be signed in to change notification settings - Fork 774
/
th-has-data-cells-evaluate.js
82 lines (69 loc) · 2.2 KB
/
th-has-data-cells-evaluate.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import * as tableUtils from '../../commons/table';
import { sanitize } from '../../commons/text';
function thHasDataCellsEvaluate(node) {
const cells = tableUtils.getAllCells(node);
const checkResult = this;
// Get a list of all headers reffed to in this rule
let reffedHeaders = [];
cells.forEach(cell => {
const headers = cell.getAttribute('headers');
if (headers) {
reffedHeaders = reffedHeaders.concat(headers.split(/\s+/));
}
const ariaLabel = cell.getAttribute('aria-labelledby');
if (ariaLabel) {
reffedHeaders = reffedHeaders.concat(ariaLabel.split(/\s+/));
}
});
// Get all the headers
const headers = cells.filter(cell => {
if (sanitize(cell.textContent) === '') {
return false;
}
return (
cell.nodeName.toUpperCase() === 'TH' ||
['rowheader', 'columnheader'].indexOf(cell.getAttribute('role')) !== -1
);
});
const tableGrid = tableUtils.toGrid(node);
let out = true;
headers.forEach(header => {
if (
header.getAttribute('id') &&
reffedHeaders.includes(header.getAttribute('id'))
) {
return;
}
const pos = tableUtils.getCellPosition(header, tableGrid);
// ensure column header has at least 1 non-header cell and that the cell is
// not pointing to a different header
let hasCell = false;
if (tableUtils.isColumnHeader(header)) {
hasCell = tableUtils
.traverse('down', pos, tableGrid)
.find(
cell =>
!tableUtils.isColumnHeader(cell) &&
tableUtils.getHeaders(cell, tableGrid).includes(header)
);
}
// ensure row header has at least 1 non-header cell and that the cell is not
// pointing to a different header
if (!hasCell && tableUtils.isRowHeader(header)) {
hasCell = tableUtils
.traverse('right', pos, tableGrid)
.find(
cell =>
!tableUtils.isRowHeader(cell) &&
tableUtils.getHeaders(cell, tableGrid).includes(header)
);
}
// report the node as having failed
if (!hasCell) {
checkResult.relatedNodes(header);
}
out = out && hasCell;
});
return out ? true : undefined;
}
export default thHasDataCellsEvaluate;