1 |
|
2 | (function() {
|
3 | var RowStream, addSort, bean, createRowElement, normalizeColumns, stringToElement, templates;
|
4 |
|
5 | templates = require('./templates');
|
6 |
|
7 | RowStream = require('./row-stream');
|
8 |
|
9 | bean = require('bean');
|
10 |
|
11 | stringToElement = function(str) {
|
12 | var clean, div, els;
|
13 | clean = str.replace(/(^\s+)|(\s+$)/g, '');
|
14 | div = document.createElement('div');
|
15 | div.innerHTML = clean;
|
16 | els = div.childNodes;
|
17 | if (els.length === 1) {
|
18 | return els[0];
|
19 | } else {
|
20 | return els;
|
21 | }
|
22 | };
|
23 |
|
24 | createRowElement = function(str) {
|
25 | var tr;
|
26 | tr = document.createElement('tr');
|
27 | tr.innerHTML = str;
|
28 | return tr;
|
29 | };
|
30 |
|
31 | module.exports = function(columns, objStream) {
|
32 | var $table, $tbody, html, rowStream;
|
33 | normalizeColumns(columns);
|
34 | html = templates.table.render({
|
35 | columns: columns
|
36 | });
|
37 | $table = stringToElement(html);
|
38 | $tbody = $table.querySelector('tbody');
|
39 | rowStream = RowStream(columns);
|
40 | objStream.pipe(rowStream);
|
41 | rowStream.on('data', function(cells) {
|
42 | var tr;
|
43 | html = templates.row.render({
|
44 | cells: cells
|
45 | });
|
46 | tr = createRowElement(html);
|
47 | return $tbody.appendChild(tr);
|
48 | });
|
49 | addSort($table);
|
50 | return {
|
51 | el: $table
|
52 | };
|
53 | };
|
54 |
|
55 | normalizeColumns = function(columns) {
|
56 | var column, _i, _len, _results;
|
57 | _results = [];
|
58 | for (_i = 0, _len = columns.length; _i < _len; _i++) {
|
59 | column = columns[_i];
|
60 | _results.push(column.title != null ? column.title : column.title = column.property);
|
61 | }
|
62 | return _results;
|
63 | };
|
64 |
|
65 | addSort = function(table) {
|
66 | var curSort, reverse, tbody;
|
67 | tbody = table.querySelector('tbody');
|
68 | curSort = null;
|
69 | reverse = false;
|
70 | return bean.on(table, 'click', 'th', function(event) {
|
71 | var className, el, row, rows, _i, _j, _len, _len1, _ref, _results;
|
72 | el = this;
|
73 | className = el.getAttribute('class');
|
74 | rows = [];
|
75 | _ref = tbody.childNodes;
|
76 | for (_i = 0, _len = _ref.length; _i < _len; _i++) {
|
77 | el = _ref[_i];
|
78 | rows.push(el);
|
79 | }
|
80 | if (className === curSort) {
|
81 | reverse = !reverse;
|
82 | } else {
|
83 | reverse = false;
|
84 | }
|
85 | rows.sort(function(a, b) {
|
86 | var av, bv, r, _ref1;
|
87 | _ref1 = [a, b].map(function(cell) {
|
88 | var err, val;
|
89 | val = cell.querySelector('.' + className).dataset.value;
|
90 | try {
|
91 | return JSON.parse(val);
|
92 | } catch (_error) {
|
93 | err = _error;
|
94 | return val;
|
95 | }
|
96 | }), av = _ref1[0], bv = _ref1[1];
|
97 | if (reverse) {
|
98 | r = -1;
|
99 | } else {
|
100 | r = 1;
|
101 | }
|
102 | if (av > bv) {
|
103 | return 1 * r;
|
104 | }
|
105 | if (bv > av) {
|
106 | return -1 * r;
|
107 | }
|
108 | return 0;
|
109 | });
|
110 | curSort = className;
|
111 | tbody.innerHTML = '';
|
112 | _results = [];
|
113 | for (_j = 0, _len1 = rows.length; _j < _len1; _j++) {
|
114 | row = rows[_j];
|
115 | _results.push(tbody.appendChild(row));
|
116 | }
|
117 | return _results;
|
118 | });
|
119 | };
|
120 |
|
121 | }).call(this);
|