UNPKG

1.72 kBtext/coffeescriptView Raw
1templates = require './templates'
2RowStream = require './row-stream'
3bean = require 'bean'
4
5stringToElement = (str) ->
6 clean = str.replace /(^\s+)|(\s+$)/g, ''
7 div = document.createElement 'div'
8 div.innerHTML = clean
9
10 els = div.childNodes
11
12 if els.length is 1
13 return els[0]
14 else
15 return els
16
17createRowElement = (str) ->
18 tr = document.createElement 'tr'
19 tr.innerHTML = str
20 return tr
21
22module.exports = (columns, objStream) ->
23 normalizeColumns columns
24
25 html = templates.table.render columns: columns
26
27 $table = stringToElement html
28 $tbody = $table.querySelector 'tbody'
29
30 rowStream = RowStream columns
31 objStream.pipe rowStream
32
33 rowStream.on 'data', (cells) ->
34
35 html = templates.row.render cells: cells
36 tr = createRowElement html
37 $tbody.appendChild tr
38
39 addSort $table
40
41 return el: $table
42
43normalizeColumns = (columns) ->
44 for column in columns
45 column.title ?= column.property
46
47
48addSort = (table) ->
49 tbody = table.querySelector 'tbody'
50 curSort = null
51 reverse = false
52
53 bean.on table, 'click', 'th', (event) ->
54 el = this
55 className = el.getAttribute 'class'
56 rows = []
57 rows.push el for el in tbody.childNodes
58
59
60 if className is curSort
61 reverse = not reverse
62 else
63 reverse = false
64
65 rows.sort (a, b) ->
66 [av, bv] = [a, b].map (cell) ->
67 val = cell.querySelector('.'+className).dataset.value
68 try
69 return JSON.parse val
70 catch err
71 return val
72
73 if reverse
74 r = -1
75 else
76 r = 1
77
78 return 1*r if av > bv
79 return -1*r if bv > av
80 return 0
81
82 curSort = className
83
84 tbody.innerHTML = ''
85 for row in rows
86 tbody.appendChild row
\No newline at end of file