/
problems.js
57 lines (53 loc) · 1.22 KB
/
problems.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
var React = require("react");
var {Table, Glyphicon} = require("react-bootstrap");
var {Type, Node} = require("./base");
var {View} = require("./workbench");
var glyphmap = {
error: "ban-circle",
warning: "warning-sign",
}
class Problems {
constructor() {
this._problemList = [];
}
add(problem) {
problem = {...problem, fragment: `problem_${this._problemList.length}`};
this._problemList.push(problem);
return problem;
}
empty() {
return this._problemList.length == 0;
}
mapProblems(fn) {
return this._problemList.map(fn);
}
render() {
var rows = [
for ({level, msg, fragment} of this._problemList)
if (level !== "info")
<tr>
<td className={`problem-msg problem-${level}`}>
<Glyphicon glyph={glyphmap[level]}/>
{" "}
<a href={"#" + fragment}>{msg}</a>
</td>
</tr>
]
// TODO: Add <col> elements
return <Table className="problems"><tbody>
{
rows.length === 0 ?
<tr><td>
<div className="validate validate-info">(no entries)</div>
</td></tr> :
{rows}
}
</tbody></Table>;
}
}
function VProblems({problems}) {
return new View("problems", function renderProblems() {
return problems.render();
});
}
module.exports = {VProblems, Problems};