tablematic 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tablematic/builder.rb +28 -25
- data/lib/tablematic/version.rb +1 -1
- metadata +1 -2
- data/README.rdoc +0 -193
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff87b7cf2c25b91af52a594265c19461c8338a6f
|
4
|
+
data.tar.gz: e31f2f45bd8a39448b0f1e6122b80d60d3a4af0f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e37ca023feeeb9f78f3e6427bf2fbd4ee1aad20c53336437f08525e29572296807b027fb05e69d28ee32a9d218841048b20e7fcc41fae40de9ed712d90264937
|
7
|
+
data.tar.gz: 31381754bc0407801b5ded6f17302b2185e409edbb27ebad509ab6fff33875a2ec40dc93659d2b03fbcaa6260a468acd5c1a099ae5b40ca6a0d982282700c63b
|
data/lib/tablematic/builder.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
module TableHelper
|
2
2
|
class TableBuilder
|
3
|
+
extend Forwardable
|
4
|
+
def_delegators :@view_context, :concat, :content_tag, :capture
|
5
|
+
|
3
6
|
def initialize(records, attr, opts={})
|
4
7
|
@records = records
|
5
8
|
@attr = attr
|
@@ -10,14 +13,11 @@ module TableHelper
|
|
10
13
|
end
|
11
14
|
|
12
15
|
def build(view_context, &block)
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
def output_buffer=(other)
|
16
|
+
@view_context = view_context
|
17
|
+
content_tag(:table, class: table_classes) do
|
18
|
+
emit_html_heading +
|
19
|
+
emit_html_rows(&block)
|
20
|
+
end.html_safe
|
21
21
|
end
|
22
22
|
|
23
23
|
protected
|
@@ -28,28 +28,31 @@ module TableHelper
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def emit_html_heading
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
content_tag(:thead) do
|
32
|
+
content_tag(:tr) do
|
33
|
+
@attr.each do |attribute|
|
34
|
+
css_classes = "#{attribute_css_class(attribute)} #{attribute_type_css_class(attribute)}"
|
35
|
+
concat(content_tag(:th, column_heading_for(attribute), class: css_classes))
|
36
|
+
end
|
37
|
+
end
|
34
38
|
end
|
35
|
-
result += "</tr></thead>"
|
36
39
|
end
|
37
40
|
|
38
|
-
def emit_html_rows(
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
41
|
+
def emit_html_rows(&block)
|
42
|
+
content_tag(:tbody) do
|
43
|
+
@records.each_with_index do |record,i|
|
44
|
+
columns = ''
|
45
|
+
@attr.each do |attribute|
|
46
|
+
message = attribute.is_a?(Hash) ? attribute.keys.first.to_sym : attribute.to_sym
|
47
|
+
value = record.send(message).to_s
|
48
|
+
columns << content_tag(:td, value, class: "#{attribute_css_class(attribute)} #{attribute_type_css_class(attribute)}")
|
49
|
+
end
|
50
|
+
columns += capture(record, &block) if block_given?
|
51
|
+
|
52
|
+
odd_even = i % 2 == 0 ? "#{@namespace}even" : "#{@namespace}odd"
|
53
|
+
concat(content_tag(:tr, columns.html_safe, class: odd_even))
|
48
54
|
end
|
49
|
-
result += append_to_rows
|
50
|
-
result += "</tr>"
|
51
55
|
end
|
52
|
-
result += "</tbody>"
|
53
56
|
end
|
54
57
|
|
55
58
|
def attribute_css_class(attribute_name)
|
data/lib/tablematic/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tablematic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Desjardins
|
@@ -88,7 +88,6 @@ extensions: []
|
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
90
|
- MIT-LICENSE
|
91
|
-
- README.rdoc
|
92
91
|
- Rakefile
|
93
92
|
- lib/tablematic.rb
|
94
93
|
- lib/tablematic/builder.rb
|
data/README.rdoc
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
# Tablematic
|
2
|
-
|
3
|
-
## Introduction
|
4
|
-
There are a bunch of other Rails table generators out there. This is mine.
|
5
|
-
|
6
|
-
Tabletastic is a gem to help quickly emit tabular data in a Rails web
|
7
|
-
view. I created it because 1) I found myself doing this all the time, and
|
8
|
-
it seemed like I could make it generic and package it as a gem, and 2)
|
9
|
-
companies always want to see open source code samples when you apply
|
10
|
-
for jobs, so it made sense to create some!
|
11
|
-
|
12
|
-
## Installation
|
13
|
-
(Eventually, when I put this on rubygems) in your Rails project, Gemfile:
|
14
|
-
gem "tablematic"
|
15
|
-
|
16
|
-
## Usage
|
17
|
-
The simplest use of tablematic is to invoke the helper method with a
|
18
|
-
variable that contains a collection of ActiveRecord objects, thusly:
|
19
|
-
|
20
|
-
```erb
|
21
|
-
<%= table_for(@posts) %>
|
22
|
-
```
|
23
|
-
|
24
|
-
Let's say you have a table named posts, and it contains the following
|
25
|
-
data:
|
26
|
-
|
27
|
-
|
28
|
-
|id|created_at|updated_at|added_by |title |content|
|
29
|
-
|--|----------|----------|-------------|---------------|-------|
|
30
|
-
| 1|2015-08-06|2015-08-06|Lisa Marie |Elvis had a Twin|On January 8, 1935, Elvis Aron (later spelled Aaron) Presley was born at his parents' two-room house in East Tupelo, Mississippi, about 35 minutes after his identical twin brother, Jesse Garon, who was stillborn.|
|
31
|
-
| 2|2015-08-06|2015-08-06|Priscilla |Graceland |In 1957, when he was just 22, Elvis shelled out $102,500 for Graceland, the Memphis mansion that served as his home base for two decades.|
|
32
|
-
| 3|2015-08-06|2015-08-06|Elvis Himself|Col. Tom Barker |Elvis's future manager immigrated illegally to America as a young man, where he reinvented himself as Tom Parker and claimed to be from West Virginia. He worked as a pitchman for traveling carnivals, followed by stints as dog catcher and pet cemetery founder, among other occupations, then managed the careers of several country music singers.|
|
33
|
-
|
34
|
-
_Note: Check the unit tests for more Elvis Facts(tm)_
|
35
|
-
|
36
|
-
Calling table_for on the table above would generate a table that looks like this:
|
37
|
-
|
38
|
-
```html
|
39
|
-
<table class=' tablematic'>
|
40
|
-
<thead>
|
41
|
-
<tr>
|
42
|
-
<th class='id integer'>Id</th>
|
43
|
-
<th class='created_at datetime'>Created at</th>
|
44
|
-
<th class='updated_at datetime'>Updated at</th>
|
45
|
-
<th class='added_by string'>Added by</th>
|
46
|
-
<th class='title string'>Title</th>
|
47
|
-
<th class='content text'>Content</th>
|
48
|
-
</tr>
|
49
|
-
</thead>
|
50
|
-
<tbody>
|
51
|
-
<tr class='even'>
|
52
|
-
<td class='id integer'>1</td>
|
53
|
-
<td class='created_at datetime'>2015-08-06 12:04:05 UTC</td>
|
54
|
-
<td class='updated_at datetime'>2015-08-06 12:04:05 UTC</td>
|
55
|
-
<td class='added_by string'>Lisa Marie</td>
|
56
|
-
<td class='title string'>Elvis had a Twin</td>
|
57
|
-
<td class='content text'>On January 8, 1935, Elvis Aron (later spelled Aaron) Presley was born at his parents’ two-room house in East Tupelo, Mississippi, about 35 minutes after his identical twin brother, Jesse Garon, who was stillborn.</td>
|
58
|
-
</tr>
|
59
|
-
<tr class='odd'>
|
60
|
-
<td class='id integer'>2</td>
|
61
|
-
<td class='created_at datetime'>2015-08-06 12:04:05 UTC</td>
|
62
|
-
<td class='updated_at datetime'>2015-08-06 12:04:05 UTC</td>
|
63
|
-
<td class='added_by string'>Priscilla</td>
|
64
|
-
<td class='title string'>Graceland</td>
|
65
|
-
<td class='content text'>In 1957, when he was just 22, Elvis shelled out $102,500 for Graceland, the Memphis mansion that served as his home base for two decades.</td>
|
66
|
-
</tr>
|
67
|
-
<tr class='even'>
|
68
|
-
<td class='id integer'>3</td>
|
69
|
-
<td class='created_at datetime'>2015-08-06 12:04:05 UTC</td>
|
70
|
-
<td class='updated_at datetime'>2015-08-06 12:04:05 UTC</td>
|
71
|
-
<td class='added_by string'>Elvis Himself</td>
|
72
|
-
<td class='title string'>Col. Tom Barker</td>
|
73
|
-
<td class='content text'>Elvis’s future manager immigrated illegally to America as a young man, where he reinvented himself as Tom Parker and claimed to be from West Virginia. He worked as a pitchman for traveling carnivals, followed by stints as dog catcher and pet cemetery founder, among other occupations, then managed the careers of several country music singers.</td>
|
74
|
-
</tr>
|
75
|
-
</tbody>
|
76
|
-
</table>
|
77
|
-
```
|
78
|
-
|
79
|
-
Interesting stuff above:
|
80
|
-
* It auto-generates odd/even classes on the rows in case you want to use them for styling
|
81
|
-
* It also includes the parameter name and datatype on each column in case that's useful for styling (e.g., you might want to make integers align right).
|
82
|
-
* Tables have the tablematic class by default.
|
83
|
-
|
84
|
-
### Customizing output
|
85
|
-
The defaults are probably not exactly what you need, so you can tweak things as needed by
|
86
|
-
supplying options in an hash as the second parameter to table_for. Here are some of the
|
87
|
-
supported options:
|
88
|
-
|
89
|
-
#### table_class:
|
90
|
-
A string or array of strings to use as class name(s) on the table. This is handy if you're
|
91
|
-
using a CSS framework like bootstrap:
|
92
|
-
|
93
|
-
```erb
|
94
|
-
<%= table_for(@posts, table_class: 'table table-condensed') %>
|
95
|
-
```
|
96
|
-
|
97
|
-
yields
|
98
|
-
|
99
|
-
```html
|
100
|
-
<table class="tablematic table table-condensed">
|
101
|
-
...
|
102
|
-
```
|
103
|
-
|
104
|
-
#### attributes:
|
105
|
-
Limits the output to only those attributes included in the array. E.g.,
|
106
|
-
|
107
|
-
```erb
|
108
|
-
<%= table_for(@posts, attributes: [:title, :content]) %>
|
109
|
-
```
|
110
|
-
|
111
|
-
You can also specify the column header names this way by making the
|
112
|
-
array elements into hashes where the key is the attribute name and
|
113
|
-
the value is the title:
|
114
|
-
|
115
|
-
```erb
|
116
|
-
<%= table_for(@posts, attributes: [{title: 'A cool title'}, {content: 'Awesome content'}]) %>
|
117
|
-
```
|
118
|
-
|
119
|
-
### Code Blocks for additional per-row output
|
120
|
-
Let's say you want to include links to Edit or Delete actions on each row along
|
121
|
-
with the table values. Anything that is supplied in a block to the table_for
|
122
|
-
method will be appended to the end of each row that is generated. For example,
|
123
|
-
|
124
|
-
```erb
|
125
|
-
<% table_for(@posts) do |post| %>
|
126
|
-
<td><%= link_to "Edit", edit_post_path(post) %></td>
|
127
|
-
<% end %>
|
128
|
-
```
|
129
|
-
|
130
|
-
will generate the following:
|
131
|
-
|
132
|
-
```html
|
133
|
-
<table class=' tablematic'>
|
134
|
-
<thead>
|
135
|
-
<tr>
|
136
|
-
<th class='id integer'>Id</th>
|
137
|
-
<th class='created_at datetime'>Created at</th>
|
138
|
-
<th class='updated_at datetime'>Updated at</th>
|
139
|
-
<th class='added_by string'>Added by</th>
|
140
|
-
<th class='title string'>Title</th>
|
141
|
-
<th class='content text'>Content</th>
|
142
|
-
<th></th>
|
143
|
-
</tr>
|
144
|
-
</thead>
|
145
|
-
<tbody>
|
146
|
-
<tr class='even'>
|
147
|
-
<td class='id integer'>1</td>
|
148
|
-
<td class='created_at datetime'>2015-08-06 12:04:05 UTC</td>
|
149
|
-
<td class='updated_at datetime'>2015-08-06 12:04:05 UTC</td>
|
150
|
-
<td class='added_by string'>Lisa Marie</td>
|
151
|
-
<td class='title string'>Elvis had a Twin</td>
|
152
|
-
<td class='content text'>On January 8, 1935, Elvis Aron (later spelled Aaron) Presley was born at his parents’ two-room house in East Tupelo, Mississippi, about 35 minutes after his identical twin brother, Jesse Garon, who was stillborn.</td>
|
153
|
-
<td><a href="/posts/1/edit">Edit</a></td>
|
154
|
-
</tr>
|
155
|
-
...
|
156
|
-
```
|
157
|
-
|
158
|
-
### Global Configuration
|
159
|
-
Right now there's only one option you can configure globally - I'm working
|
160
|
-
on that. Here's how you do it - in an initializer, plop the following code:
|
161
|
-
|
162
|
-
```ruby
|
163
|
-
Tablematic.configure do |config|
|
164
|
-
config.table_class = 'table table-condensed'
|
165
|
-
end
|
166
|
-
```
|
167
|
-
|
168
|
-
This will make the default CSS classes on every generated table include the
|
169
|
-
table and table-condensed classes, so you don't have to specify it explicitly
|
170
|
-
everywhere you use the helper.
|
171
|
-
|
172
|
-
## TODO
|
173
|
-
* Upload to rubygems and become FOSS famous.
|
174
|
-
* Setup TravisCI
|
175
|
-
* Change string additions to use << instead because string addition is expensive (or better yet use content_tag).
|
176
|
-
* An exclude option to easily exclude columns, including at the global level.
|
177
|
-
* Integration specs for better testing w/ Rails.
|
178
|
-
* Maybe it'd be cool to have optional footers with totals? Might be wonky w/ pagination.
|
179
|
-
* A way to specify column headings when you're including additional stuff in a block.
|
180
|
-
* A way to specify that generate class names should use hyphens instead of underscores
|
181
|
-
* Configurable class namespaces, some of that stuff is already there just haven't finished it.
|
182
|
-
* Make it work w/ regular old arrays of hashes as well as AR.
|
183
|
-
|
184
|
-
## Note on Patches/Pull Requests
|
185
|
-
* Fork the project.
|
186
|
-
* Make your feature addition or bug fix.
|
187
|
-
* Add specs for it.
|
188
|
-
* Commit.
|
189
|
-
* Send me a pull request. Bonus points for topic branches.
|
190
|
-
|
191
|
-
## Copyright
|
192
|
-
Copyright 2015 Mike Desjardins. See MIT-LICENSE for details.
|
193
|
-
|