1 | templates = require './templates'
|
2 | RowStream = require './row-stream'
|
3 | bean = require 'bean'
|
4 |
|
5 | stringToElement = (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 |
|
17 | createRowElement = (str) ->
|
18 | tr = document.createElement 'tr'
|
19 | tr.innerHTML = str
|
20 | return tr
|
21 |
|
22 | module.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 |
|
43 | normalizeColumns = (columns) ->
|
44 | for column in columns
|
45 | column.title ?= column.property
|
46 |
|
47 |
|
48 | addSort = (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 |