table-for 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +3 -0
- data/VERSION +1 -1
- data/app/views/table_for/_table_for.html.erb +3 -1
- data/lib/table_for/view_additions.rb +0 -1
- data/spec/integration/table_for_spec.rb +155 -8
- data/spec/table_for/view_additions_spec.rb +147 -0
- metadata +37 -7
data/CHANGELOG.rdoc
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
@@ -84,7 +84,9 @@
|
|
84
84
|
<% end %>
|
85
85
|
|
86
86
|
<% table.define :delete, :action => nil, :link_html => {}, :link_label => "Delete" do |record, column, options| %>
|
87
|
-
|
87
|
+
<% confirm = options[:confirm] ? options[:confirm] : "Are you sure you want to delete this #{record.class.to_s.titleize}?" %>
|
88
|
+
<% method = options[:method] ? options[:method] : "delete" %>
|
89
|
+
<%= link_to options[:link_label], [options[:action], options[:scope], record].flatten, {:method => method, :confirm => confirm}.merge(options[:link_html]) %>
|
88
90
|
<% end %>
|
89
91
|
|
90
92
|
<% table.columns.each do |column| %>
|
@@ -19,7 +19,6 @@ module TableFor
|
|
19
19
|
if options[:sortable]
|
20
20
|
order = options[:order] ? options[:order].to_s : column.name.to_s
|
21
21
|
sort_class = (params[:order] != order || params[:sort_mode] == "reset") ? "sorting" : (params[:sort_mode] == "desc" ? "sorting_desc" : "sorting_asc")
|
22
|
-
header_html = {} if header_html.nil?
|
23
22
|
header_html[:class] = (header_html[:class] ? "#{header_html[:class]} #{sort_class}" : sort_class)
|
24
23
|
end
|
25
24
|
header_html
|
@@ -164,15 +164,78 @@ describe "table_for" do
|
|
164
164
|
end
|
165
165
|
|
166
166
|
describe "edit_header block" do
|
167
|
-
it "should be able to replace the edit_header block"
|
167
|
+
it "should be able to replace the edit_header block" do
|
168
|
+
@view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
169
|
+
buffer = @view.table_for @users[0,1] do |table|
|
170
|
+
table.define :edit_header do
|
171
|
+
"Edit"
|
172
|
+
end
|
173
|
+
table.column :edit
|
174
|
+
end
|
175
|
+
|
176
|
+
xml = XmlSimple.xml_in(%%
|
177
|
+
<table>
|
178
|
+
<thead><tr><th>Edit</th></tr></thead>
|
179
|
+
<tbody>
|
180
|
+
<tr>
|
181
|
+
<td>
|
182
|
+
<a href="/users/1/edit">Edit</a>
|
183
|
+
</td>
|
184
|
+
</tr>
|
185
|
+
</tbody>
|
186
|
+
</table>%)
|
187
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
188
|
+
end
|
168
189
|
end
|
169
190
|
|
170
191
|
describe "delete_header block" do
|
171
|
-
it "should be able to replace the delete_header block"
|
192
|
+
it "should be able to replace the delete_header block" do
|
193
|
+
@view.expects(:user_path).with(User.first).returns("/users/1")
|
194
|
+
buffer = @view.table_for @users[0,1] do |table|
|
195
|
+
table.define :delete_header do
|
196
|
+
"Delete"
|
197
|
+
end
|
198
|
+
table.column :delete
|
199
|
+
end
|
200
|
+
|
201
|
+
xml = XmlSimple.xml_in(%%
|
202
|
+
<table>
|
203
|
+
<thead><tr><th>Delete</th></tr></thead>
|
204
|
+
<tbody>
|
205
|
+
<tr>
|
206
|
+
<td>
|
207
|
+
<a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
208
|
+
</td>
|
209
|
+
</tr>
|
210
|
+
</tbody>
|
211
|
+
</table>%)
|
212
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
213
|
+
end
|
172
214
|
end
|
173
215
|
|
174
216
|
describe "show_header block" do
|
175
|
-
it "should be able to replace the show_header block"
|
217
|
+
it "should be able to replace the show_header block" do
|
218
|
+
@view.expects(:user_path).with(User.first).returns("/users/1")
|
219
|
+
buffer = @view.table_for @users[0,1] do |table|
|
220
|
+
table.define :show_header do
|
221
|
+
"Show"
|
222
|
+
end
|
223
|
+
table.column :show
|
224
|
+
end
|
225
|
+
|
226
|
+
xml = XmlSimple.xml_in(%%
|
227
|
+
<table>
|
228
|
+
<thead><tr><th>Show</th></tr></thead>
|
229
|
+
<tbody>
|
230
|
+
<tr>
|
231
|
+
<td>
|
232
|
+
<a href="/users/1">Show</a>
|
233
|
+
</td>
|
234
|
+
</tr>
|
235
|
+
</tbody>
|
236
|
+
</table>%)
|
237
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
238
|
+
end
|
176
239
|
end
|
177
240
|
|
178
241
|
describe "column header contents block" do
|
@@ -544,7 +607,22 @@ describe "table_for" do
|
|
544
607
|
end
|
545
608
|
|
546
609
|
describe "edit block" do
|
547
|
-
it "should be able to replace the edit block"
|
610
|
+
it "should be able to replace the edit block" do
|
611
|
+
buffer = @view.table_for @users[0,1] do |table|
|
612
|
+
table.define :edit do
|
613
|
+
"Edit Link"
|
614
|
+
end
|
615
|
+
table.column :edit
|
616
|
+
end
|
617
|
+
|
618
|
+
xml = XmlSimple.xml_in(%%
|
619
|
+
<table>
|
620
|
+
<thead><tr><th></th></tr></thead>
|
621
|
+
<tbody><tr><td>Edit Link</td></tr></tbody>
|
622
|
+
</table>%)
|
623
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
624
|
+
end
|
625
|
+
|
548
626
|
it "should be able to create an edit column" do
|
549
627
|
@view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
550
628
|
|
@@ -622,7 +700,22 @@ describe "table_for" do
|
|
622
700
|
end
|
623
701
|
|
624
702
|
describe "show block" do
|
625
|
-
it "should be able to replace the show block"
|
703
|
+
it "should be able to replace the show block" do
|
704
|
+
buffer = @view.table_for @users[0,1] do |table|
|
705
|
+
table.define :show do
|
706
|
+
"Show Link"
|
707
|
+
end
|
708
|
+
table.column :show
|
709
|
+
end
|
710
|
+
|
711
|
+
xml = XmlSimple.xml_in(%%
|
712
|
+
<table>
|
713
|
+
<thead><tr><th></th></tr></thead>
|
714
|
+
<tbody><tr><td>Show Link</td></tr></tbody>
|
715
|
+
</table>%)
|
716
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
717
|
+
end
|
718
|
+
|
626
719
|
it "should be able to create a show column" do
|
627
720
|
@view.expects(:user_path).with(User.first).returns("/users/1")
|
628
721
|
|
@@ -700,7 +793,22 @@ describe "table_for" do
|
|
700
793
|
end
|
701
794
|
|
702
795
|
describe "delete block" do
|
703
|
-
it "should be able to replace the delete block"
|
796
|
+
it "should be able to replace the delete block" do
|
797
|
+
buffer = @view.table_for @users[0,1] do |table|
|
798
|
+
table.define :delete do
|
799
|
+
"Delete Link"
|
800
|
+
end
|
801
|
+
table.column :delete
|
802
|
+
end
|
803
|
+
|
804
|
+
xml = XmlSimple.xml_in(%%
|
805
|
+
<table>
|
806
|
+
<thead><tr><th></th></tr></thead>
|
807
|
+
<tbody><tr><td>Delete Link</td></tr></tbody>
|
808
|
+
</table>%)
|
809
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
810
|
+
end
|
811
|
+
|
704
812
|
it "should be able to create a delete column" do
|
705
813
|
@view.expects(:user_path).with(User.first).returns("/users/1")
|
706
814
|
|
@@ -806,8 +914,47 @@ describe "table_for" do
|
|
806
914
|
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
807
915
|
end
|
808
916
|
|
809
|
-
it "should be able to override the delete message for a delete link"
|
810
|
-
|
917
|
+
it "should be able to override the delete confirmation message for a delete link" do
|
918
|
+
@view.expects(:user_path).with(User.first).returns("/users/1")
|
919
|
+
|
920
|
+
buffer = @view.table_for @users[0,1] do |table|
|
921
|
+
table.column :delete, :confirm => "Are you sure?"
|
922
|
+
end
|
923
|
+
|
924
|
+
xml = XmlSimple.xml_in(%%
|
925
|
+
<table>
|
926
|
+
<thead><tr><th></th></tr></thead>
|
927
|
+
<tbody>
|
928
|
+
<tr>
|
929
|
+
<td>
|
930
|
+
<a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure?">Delete</a>
|
931
|
+
</td>
|
932
|
+
</tr>
|
933
|
+
</tbody>
|
934
|
+
</table>%)
|
935
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
936
|
+
end
|
937
|
+
|
938
|
+
it "should be able to override the method for a delete link" do
|
939
|
+
@view.expects(:user_path).with(User.first).returns("/users/1")
|
940
|
+
|
941
|
+
buffer = @view.table_for @users[0,1] do |table|
|
942
|
+
table.column :delete, :method => :get
|
943
|
+
end
|
944
|
+
|
945
|
+
xml = XmlSimple.xml_in(%%
|
946
|
+
<table>
|
947
|
+
<thead><tr><th></th></tr></thead>
|
948
|
+
<tbody>
|
949
|
+
<tr>
|
950
|
+
<td>
|
951
|
+
<a href="/users/1" data-method="get" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
952
|
+
</td>
|
953
|
+
</tr>
|
954
|
+
</tbody>
|
955
|
+
</table>%)
|
956
|
+
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
957
|
+
end
|
811
958
|
end
|
812
959
|
|
813
960
|
describe "column data contents block" do
|
@@ -0,0 +1,147 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe TableFor::ViewAdditions do
|
4
|
+
before(:each) do
|
5
|
+
@view_class = Class.new
|
6
|
+
@view = @view_class.new
|
7
|
+
@view_class.send(:include, ActionView::Helpers::TextHelper)
|
8
|
+
@view_class.send(:include, TableFor::ViewAdditions::ClassMethods)
|
9
|
+
@records = [OpenStruct.new(:id => 1)]
|
10
|
+
@column = stub(:name => :my_column)
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "table_for method" do
|
14
|
+
it "should call render on the TableFor::Base instance" do
|
15
|
+
TableFor::Base.expects(:new).returns(mock(:render => ""))
|
16
|
+
@view.table_for(@records)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should pass the view as the first parameter to TableFor::Base initialization" do
|
20
|
+
TableFor::Base.expects(:new).with {|view, options| view == @view}.returns(mock(:render => ""))
|
21
|
+
@view.table_for(@records)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "should default the template to render" do
|
25
|
+
TableFor::Base.expects(:new).with {|view, options| options[:template] == "table_for/table_for"}.returns(mock(:render => ""))
|
26
|
+
@view.table_for(@records)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should default the variable to 'table' to render" do
|
30
|
+
TableFor::Base.expects(:new).with {|view, options| options[:variable] == "table"}.returns(mock(:render => ""))
|
31
|
+
@view.table_for(@records)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should default the records to the collection passed in" do
|
35
|
+
TableFor::Base.expects(:new).with {|view, options| options[:records] == @records}.returns(mock(:render => ""))
|
36
|
+
@view.table_for(@records)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should add any runtime options to the options initialized for TableFor::Base" do
|
40
|
+
TableFor::Base.expects(:new).with {|view, options| options[:option1] == 1 && options[:option2] == "2"}.returns(mock(:render => ""))
|
41
|
+
@view.table_for(@records, :option1 => 1, :option2 => "2")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "table_for_evaluated_options method" do
|
46
|
+
it "should evaluate any proc options" do
|
47
|
+
proc1 = lambda {@view.cycle("even", "odd")}
|
48
|
+
proc2 = lambda {@view.cycle("one", "two")}
|
49
|
+
evaluated_options = @view.table_for_evaluated_options(:class => proc1, :id => proc2, :style => "color:red")
|
50
|
+
evaluated_options[:class].should eql "even"
|
51
|
+
evaluated_options[:id].should eql "one"
|
52
|
+
evaluated_options[:style].should eql "color:red"
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should pass any additional arguments to evaluated procs" do
|
56
|
+
proc1 = lambda { |param1, param2| "user_#{param1}_#{param2}"}
|
57
|
+
evaluated_options = @view.table_for_evaluated_options(1, 2, :class => proc1)
|
58
|
+
evaluated_options[:class].should eql "user_1_2"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "table_for_header_html method" do
|
63
|
+
it "should return nil if header_html is not passed in" do
|
64
|
+
header_html = @view.table_for_header_html(@column)
|
65
|
+
header_html.should eql({})
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should evaluate any procs for header_html" do
|
69
|
+
header_html = @view.table_for_header_html(@column, :header_html => {:class => lambda {|column| "#{column.name}_header"}})
|
70
|
+
header_html[:class].should eql "#{@column.name}_header"
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should join the 'sorting' class with any other header_html class provided" do
|
74
|
+
@view.expects(:params).returns({})
|
75
|
+
header_html = @view.table_for_header_html(@column, :header_html => {:class => "c1 c2"}, :sortable => true)
|
76
|
+
header_html[:class].should eql "c1 c2 sorting"
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should add a 'sorting' class to the header_html class if a column is sortable" do
|
80
|
+
@view.expects(:params).returns({})
|
81
|
+
header_html = @view.table_for_header_html(@column, :sortable => true)
|
82
|
+
header_html[:class].should eql "sorting"
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should add a 'sorting_asc' class to the header_html class if a column is sortable and it is already sorted in asc order" do
|
86
|
+
@view.expects(:params).at_least_once.returns(:order => @column.name.to_s, :sort_mode => "asc")
|
87
|
+
header_html = @view.table_for_header_html(@column, :sortable => true)
|
88
|
+
header_html[:class].should eql "sorting_asc"
|
89
|
+
end
|
90
|
+
|
91
|
+
it "should add a 'sorting_desc' class to the header_html class if a column is sortable and it is already sorted in desc order" do
|
92
|
+
@view.expects(:params).at_least_once.returns(:order => @column.name.to_s, :sort_mode => "desc")
|
93
|
+
header_html = @view.table_for_header_html(@column, :sortable => true)
|
94
|
+
header_html[:class].should eql "sorting_desc"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should add a 'sorting' class to the header_html class if a column is sortable and it is reset mode" do
|
98
|
+
@view.expects(:params).at_least_once.returns(:order => @column.name.to_s, :sort_mode => "reset")
|
99
|
+
header_html = @view.table_for_header_html(@column, :sortable => true)
|
100
|
+
header_html[:class].should eql "sorting"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
describe "table_for_sort_link method" do
|
105
|
+
it "should be able to generate a sort link for a column if that column is sortable" do
|
106
|
+
@view.expects(:params).at_least_once.returns({})
|
107
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "?order=#{@column.name}&sort_mode=asc").returns "my link"
|
108
|
+
@view.table_for_sort_link(@column).should eql "my link"
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should be able to generate a sort link for a column if that column is sortable and it is already sorted in asc order" do
|
112
|
+
@view.expects(:params).at_least_once.returns(:order => @column.name.to_s, :sort_mode => "asc")
|
113
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "?order=#{@column.name}&sort_mode=desc").returns "my link"
|
114
|
+
@view.table_for_sort_link(@column).should eql "my link"
|
115
|
+
end
|
116
|
+
|
117
|
+
it "should be able to generate a sort link for a column if that column is sortable and it is already sorted in desc order" do
|
118
|
+
@view.expects(:params).at_least_once.returns(:order => @column.name.to_s, :sort_mode => "desc")
|
119
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "?order=#{@column.name}&sort_mode=reset").returns "my link"
|
120
|
+
@view.table_for_sort_link(@column).should eql "my link"
|
121
|
+
end
|
122
|
+
|
123
|
+
it "should be able specify the label for a sort link" do
|
124
|
+
@view.expects(:params).at_least_once.returns({})
|
125
|
+
@view.expects(:link_to).with("My Label", "?order=#{@column.name}&sort_mode=asc").returns "my link"
|
126
|
+
@view.table_for_sort_link(@column, :label => "My Label").should eql "my link"
|
127
|
+
end
|
128
|
+
|
129
|
+
it "should be able specify the sort_url for a sort link" do
|
130
|
+
@view.expects(:params).at_least_once.returns({})
|
131
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "/users?order=#{@column.name}&sort_mode=asc").returns "my link"
|
132
|
+
@view.table_for_sort_link(@column, :sort_url => "/users").should eql "my link"
|
133
|
+
end
|
134
|
+
|
135
|
+
it "should be able specify the order field for a sort link" do
|
136
|
+
@view.expects(:params).at_least_once.returns({})
|
137
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "?order=first_name%2Clast_name&sort_mode=asc").returns "my link"
|
138
|
+
@view.table_for_sort_link(@column, :order => "first_name,last_name").should eql "my link"
|
139
|
+
end
|
140
|
+
|
141
|
+
it "should remove the action and controller params when generating the url" do
|
142
|
+
@view.expects(:params).at_least_once.returns(:controller => "users", :action => "show")
|
143
|
+
@view.expects(:link_to).with(@column.name.to_s.titleize, "?order=#{@column.name}&sort_mode=asc").returns "my link"
|
144
|
+
@view.table_for_sort_link(@column).should eql "my link"
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: table-for
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 19
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
+
- 1
|
8
9
|
- 0
|
9
|
-
|
10
|
-
version: 1.0.0
|
10
|
+
version: 1.1.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Andrew Hunter
|
@@ -37,14 +37,14 @@ dependencies:
|
|
37
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
38
38
|
none: false
|
39
39
|
requirements:
|
40
|
-
- - "
|
40
|
+
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
hash:
|
42
|
+
hash: 7
|
43
43
|
segments:
|
44
44
|
- 3
|
45
|
-
- 1
|
46
45
|
- 0
|
47
|
-
|
46
|
+
- 0
|
47
|
+
version: 3.0.0
|
48
48
|
prerelease: false
|
49
49
|
type: :runtime
|
50
50
|
requirement: *id002
|
@@ -120,6 +120,34 @@ dependencies:
|
|
120
120
|
prerelease: false
|
121
121
|
type: :development
|
122
122
|
requirement: *id007
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
name: jeweler
|
125
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
hash: 3
|
131
|
+
segments:
|
132
|
+
- 0
|
133
|
+
version: "0"
|
134
|
+
prerelease: false
|
135
|
+
type: :development
|
136
|
+
requirement: *id008
|
137
|
+
- !ruby/object:Gem::Dependency
|
138
|
+
name: jeweler
|
139
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
141
|
+
requirements:
|
142
|
+
- - ">="
|
143
|
+
- !ruby/object:Gem::Version
|
144
|
+
hash: 3
|
145
|
+
segments:
|
146
|
+
- 0
|
147
|
+
version: "0"
|
148
|
+
prerelease: false
|
149
|
+
type: :development
|
150
|
+
requirement: *id009
|
123
151
|
description: table-for is a table builder for an array of objects, easily allowing overriding of how any aspect of the table is generated
|
124
152
|
email: hunterae@gmail.com
|
125
153
|
executables: []
|
@@ -129,6 +157,7 @@ extensions: []
|
|
129
157
|
extra_rdoc_files:
|
130
158
|
- README.rdoc
|
131
159
|
files:
|
160
|
+
- CHANGELOG.rdoc
|
132
161
|
- README.rdoc
|
133
162
|
- Rakefile
|
134
163
|
- VERSION
|
@@ -140,6 +169,7 @@ files:
|
|
140
169
|
- rails/init.rb
|
141
170
|
- spec/integration/table_for_spec.rb
|
142
171
|
- spec/spec_helper.rb
|
172
|
+
- spec/table_for/view_additions_spec.rb
|
143
173
|
has_rdoc: true
|
144
174
|
homepage: http://github.com/hunterae/table-for
|
145
175
|
licenses: []
|