forked from speced/respec
-
Notifications
You must be signed in to change notification settings - Fork 1
/
table.js
137 lines (115 loc) · 3.49 KB
/
table.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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
Data Tables
Along with histograms, bars, lines, and scatters, a simple data table can take you far.
We often just want to look at numbers, organized as a table, where columns are variables,
and rows are data points. Sometimes we want a cell to have a small graphic as the main
column element, in which case we want small multiples. sometimes we want to
var table = New data_table(data)
.target('div#data-table')
.title({accessor: 'point_name', align: 'left'})
.description({accessor: 'description'})
.number({accessor: ''})
*/
function data_table(args){
this.args = args;
this.args.standard_col = {width:150, font_size:12};
this.args.columns = [];
this.target = function(){
var target = arguments[0];
this.args.target = target;
return this;
}
this.title = function(){
var args = merge_with_defaults(clone(arguments[0]), clone(this.args.standard_col));
args.type='title';
this.args.columns.push(args);
return this;
}
this.text = function(){
var args = merge_with_defaults(clone(arguments[0]), clone(this.args.standard_col));
args.type='text';
this.args.columns.push(args);
return this;
}
this.bullet = function(){
/*
text label
main value
comparative measure
any number of ranges
additional args:
no title
xmin, xmax
format: percentage
xax_formatter
*/
return this;
}
this.sparkline = function(){
return this;
}
this.number = function(){
var args = merge_with_defaults(clone(arguments[0]), clone(this.args.standard_col));
args.type='number';
this.args.columns.push(args);
return this;
}
this.display = function(){
var this_column;
var args = this.args;
chart_title(args);
var target = args.target;
var table = d3.select(target).append('table').classed('data-table', true);
var colgroup = table.append('colgroup');
var thead = table.append('thead').classed('data-table-thead', true);
var tbody = table.append('tbody');
var tr, th, td_accessor, td_type, th_text, td_text, td;
var col;
tr = thead.append('tr').classed('header-row', true);
for (var h=0;h<args.columns.length;h++){
var this_col = args.columns[h];
td_type = this_col.type;
th_text=this_col.label;
th_text =th_text == undefined ? '' : th_text;
tr.append('th')
.classed('data-table-th', true)
.style('width', this_col.width)
.style('text-align', td_type=='title' ? 'left' : 'right')
.text(th_text);
}
for (var h=0;h<args.columns.length;h++){
col = colgroup.append('col');
if (args.columns[h].type=='number'){
col.attr('align', 'char').attr('char', '.');
}
}
for (var i=0;i<args.data.length;i++){
tr = tbody.append('tr');
for (var j=0;j<args.columns.length;j++){
td_accessor = args.columns[j].accessor;
td_text = args.data[i][td_accessor];
td_type = args.columns[j].type;
td = tr.append('td')
.classed('data-table', true)
.classed('table-number', td_type=='number')
.classed('table-title', td_type=='type')
.classed('table-text', td_type=='text')
.style('width', args.columns[j].width)
.style('font-size', args.columns[j].font_size)
.style('text-align', td_type=='title' || td_type=='text' ? 'left' : 'right');
if (td_type=='title'){
td.append('div').text(td_text);
if (args.columns[j].hasOwnProperty('secondary_accessor')){
td.append('div')
.text(args.data[i][args.columns[j].secondary_accessor])
.classed("secondary-title", true)
}
} else {
td.text(td_text);
}
}
}
return this;
}
return this;
}