table-for 2.2.0 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -1
- data/Gemfile.lock +13 -3
- data/README.rdoc +137 -184
- data/VERSION +1 -1
- data/app/views/table_for/_table_for.html.erb +42 -39
- data/example.rdoc +138 -0
- data/example_table.png +0 -0
- data/lib/table_for.rb +10 -0
- data/lib/table_for/base.rb +3 -9
- data/lib/table_for/helper_methods.rb +88 -0
- data/lib/table_for/view_additions.rb +1 -53
- data/spec/integration/table_for_spec.rb +455 -455
- data/spec/spec_helper.rb +1 -0
- data/spec/table_for/helper_methods_spec.rb +96 -0
- data/spec/table_for/view_additions_spec.rb +0 -86
- data/table-for.gemspec +12 -5
- metadata +25 -5
data/example.rdoc
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
To run the example that generates this table:
|
2
|
+
{<img src="https://raw.github.com/hunterae/table-for/master/example_table.png">}[http://example.com]
|
3
|
+
|
4
|
+
In Gemfile:
|
5
|
+
gem "table-for", :git => "git@github.com:hunterae/table-for.git"
|
6
|
+
|
7
|
+
# To be able to generate an admin namespaced controller with a non-admin namespaced model
|
8
|
+
gem 'nifty-generators'
|
9
|
+
|
10
|
+
# To make things look a little nicer
|
11
|
+
gem 'therubyracer'
|
12
|
+
gem 'less-rails' #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS
|
13
|
+
gem 'twitter-bootstrap-rails'
|
14
|
+
|
15
|
+
# To paginate the list
|
16
|
+
gem 'will_paginate', '~> 3.0'
|
17
|
+
|
18
|
+
In seeds.rb:
|
19
|
+
User.create! :email => "hunterae@gmail.com", :first_name => "Andrew", :last_name => "Hunter"
|
20
|
+
User.create! :email => "todd@calltrackingmetrics.com", :first_name => "Todd", :last_name => "Fisher"
|
21
|
+
User.create! :email => "jon.phillips@livingsocial.com", :first_name => "Jon", :last_name => "Phillips"
|
22
|
+
|
23
|
+
From console:
|
24
|
+
bundle install
|
25
|
+
rails g nifty:scaffold Admin::User email:string first_name:string last_name:string
|
26
|
+
rails generate bootstrap:install less
|
27
|
+
rake db:create && rake db:migrate && rake db:seed && rake db:seed && rake db:seed && rake db:seed
|
28
|
+
rails s
|
29
|
+
|
30
|
+
In routes.rb:
|
31
|
+
namespace :admin do
|
32
|
+
resources :users do
|
33
|
+
collection do
|
34
|
+
match :sort, :to => :index, :via => [:get, :post]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
In users_controller.rb (index action)
|
40
|
+
@users = User.unscoped
|
41
|
+
if params[:order] && ["asc", "desc"].include?(params[:sort_mode])
|
42
|
+
order = params[:order].split(",").map {|o| "#{o} #{params[:sort_mode]}" }.join(", ")
|
43
|
+
@users = @users.order(order)
|
44
|
+
end
|
45
|
+
@users = @users.paginate(:per_page => 10, :page => params[:page])
|
46
|
+
|
47
|
+
In views/admin/users/index.html.erb
|
48
|
+
<%= table_for @users,
|
49
|
+
# Specifies the html classes to be applied to the table element
|
50
|
+
:table_html => { :class => "table table-hover table-bordered" },
|
51
|
+
|
52
|
+
# Specifies that all columns are sortable by default
|
53
|
+
:sortable => true,
|
54
|
+
|
55
|
+
# Specifies the url that header sort links use
|
56
|
+
:sort_url => sort_admin_users_path,
|
57
|
+
|
58
|
+
# Specifies the namespace for generating links using Rails routing
|
59
|
+
:link_namespace => :admin,
|
60
|
+
|
61
|
+
# Specifies the classes and ids to be applied to each data row
|
62
|
+
:data_row_html => {
|
63
|
+
# The class of each row will alternate between four Twitter bootstrap classes: "success", "error", "warning", "info"
|
64
|
+
:class => lambda { cycle('success', 'error', 'warning', 'info')},
|
65
|
+
|
66
|
+
# Specifies the id using a Proc for each data row as "user-ID_OF_USER_RECORD"
|
67
|
+
:id => lambda { |user| "user-#{user.id}" }
|
68
|
+
} do |table| %>
|
69
|
+
|
70
|
+
<%# Method 1 for creating a link: Create edit link dynamically by specifying the link_scope globally above as :admin and the link_action as :edit %>
|
71
|
+
<% table.column :data => "Modify", :link_action => :edit %>
|
72
|
+
|
73
|
+
<%# Method 2 for creating a link: Create an show link by providing a link_url Proc %>
|
74
|
+
<% table.column :data => "Show", :link_url => lambda { |user| admin_user_path(user) } %>
|
75
|
+
|
76
|
+
<%# Method 3 for creating a link: Rely on RESTful routes to generate the link %>
|
77
|
+
<% table.column :data => "Show 2.0", :link => true %>
|
78
|
+
|
79
|
+
<%# Outputs the email column of the user; override the default generated header for the column with "Email Address" %>
|
80
|
+
<% table.column :email, :header => "Email Address" %>
|
81
|
+
|
82
|
+
<%# Outputs the first name column of the user with the :downcase method applied to it %>
|
83
|
+
<% table.column :first_name, :formatter => :downcase %>
|
84
|
+
|
85
|
+
<%# Outputs the last name column of the user using formatter Proc to dynamically specify what is output in the data cell %>
|
86
|
+
<% table.column :last_name, :formatter => Proc.new { |last_name| last_name.upcase } %>
|
87
|
+
|
88
|
+
<%# Outputs the created at column of the user applying the strftime method with the argument "%m/%d/%y %I:%M %p" to it %>
|
89
|
+
<% table.column :created_at, :formatter => [:strftime, "%m/%d/%y %I:%M %p"] %>
|
90
|
+
|
91
|
+
<%#
|
92
|
+
Outputs the updated_at column of the user
|
93
|
+
Overrides the default generated header for the column with the dynamic result of calling it's Proc
|
94
|
+
Overrides the default sort-ability by specifying this column as non-sortable
|
95
|
+
Overrides the default header html with orange background color
|
96
|
+
Dynamically specifies the data for the column with a Proc
|
97
|
+
(Note also that the arguments to the Proc are optional and the data record can be accessed via "table.current_row" [or "table.current_record])")
|
98
|
+
%>
|
99
|
+
<% table.column :updated_at,
|
100
|
+
:header => Proc.new {
|
101
|
+
content_tag(:span, :class => "badge badge-success") do
|
102
|
+
"Last Updated"
|
103
|
+
end
|
104
|
+
},
|
105
|
+
:sortable => false,
|
106
|
+
:header_column_html => { :style => "background-color:orange" },
|
107
|
+
:data => Proc.new { time_ago_in_words table.current_row.updated_at } %>
|
108
|
+
|
109
|
+
<%#
|
110
|
+
The data for the column can also be provided via a block
|
111
|
+
Overrides the default generated header for the column with "Full Name" (will itself be overridden below)
|
112
|
+
Overrides the default sort field with "last_name" then "first_name"
|
113
|
+
%>
|
114
|
+
<% table.column :full_name, :header => "Full Name", :order => "last_name, first_name" do |user| %>
|
115
|
+
<%= "#{user.first_name} #{user.last_name}" %>
|
116
|
+
<% end %>
|
117
|
+
|
118
|
+
<%# Overrides the content for the header of the full_name column %>
|
119
|
+
<% table.header :full_name do |column, options| %>
|
120
|
+
<%= table.header_sort_link(column, options) do %>
|
121
|
+
<span class="label label-important">FULL NAME</span>
|
122
|
+
<% end %>
|
123
|
+
<% end %>
|
124
|
+
|
125
|
+
<%#
|
126
|
+
Method 3 (again) for creating a link: Rely on RESTful routes to generate the link, with a "delete" method
|
127
|
+
Applies a confirmation to the link
|
128
|
+
Specifies the data to display in the column as "Delete"
|
129
|
+
%>
|
130
|
+
<% table.column :data => "Delete", :link_method => :delete, :link_confirm => "Are you sure?" %>
|
131
|
+
|
132
|
+
<%# Adds a footer that spans all the columns of the table and shows pagination links for the table %>
|
133
|
+
<% table.footer do %>
|
134
|
+
<div class="pull-right">
|
135
|
+
<%= will_paginate @users %>
|
136
|
+
</div>
|
137
|
+
<% end %>
|
138
|
+
<% end %>
|
data/example_table.png
ADDED
Binary file
|
data/lib/table_for.rb
CHANGED
@@ -5,10 +5,20 @@ require "blocks"
|
|
5
5
|
module TableFor
|
6
6
|
autoload :Base, "table_for/base"
|
7
7
|
autoload :ViewAdditions, "table_for/view_additions"
|
8
|
+
autoload :HelperMethods, "table_for/helper_methods"
|
8
9
|
|
9
10
|
mattr_accessor :default_table_class
|
10
11
|
@@default_table_class = nil
|
11
12
|
|
13
|
+
mattr_accessor :render_thead_element
|
14
|
+
@@render_thead_element = true
|
15
|
+
|
16
|
+
mattr_accessor :render_tbody_element
|
17
|
+
@@render_tbody_element = true
|
18
|
+
|
19
|
+
mattr_accessor :render_tfoot_element
|
20
|
+
@@render_tfoot_element = true
|
21
|
+
|
12
22
|
# Default way to setup TableFor
|
13
23
|
def self.setup
|
14
24
|
yield self
|
data/lib/table_for/base.rb
CHANGED
@@ -2,18 +2,12 @@ require 'blocks'
|
|
2
2
|
|
3
3
|
module TableFor
|
4
4
|
class Base < Blocks::Base
|
5
|
+
include TableFor::HelperMethods::InstanceMethods
|
6
|
+
|
5
7
|
alias columns queued_blocks
|
6
8
|
alias column queue
|
7
9
|
|
8
10
|
attr_accessor :current_record
|
9
11
|
alias_method :current_row, :current_record
|
10
|
-
|
11
|
-
def header(name, options={}, &block)
|
12
|
-
define("#{name.to_s}_header", options, &block)
|
13
|
-
end
|
14
|
-
|
15
|
-
def set_current_record(record)
|
16
|
-
self.current_record = record
|
17
|
-
end
|
18
12
|
end
|
19
|
-
end
|
13
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
module TableFor
|
2
|
+
module HelperMethods
|
3
|
+
module InstanceMethods
|
4
|
+
def header(name, options={}, &block)
|
5
|
+
define("#{name.to_s}_header", options.reverse_merge(:header => true), &block)
|
6
|
+
end
|
7
|
+
|
8
|
+
def footer(options={}, &block)
|
9
|
+
define(:footer_content, options, &block)
|
10
|
+
end
|
11
|
+
|
12
|
+
def table_html(options)
|
13
|
+
if options[:table_html]
|
14
|
+
options[:table_html].reverse_merge!(:class => TableFor.default_table_class) if TableFor.default_table_class
|
15
|
+
options[:table_html]
|
16
|
+
elsif TableFor.default_table_class
|
17
|
+
{:class => TableFor.default_table_class}
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def header_column_html(column, options={})
|
22
|
+
header_column_html = call_each_hash_value_with_params(options[:header_column_html], column)
|
23
|
+
if options[:sortable]
|
24
|
+
order = options[:order] ? options[:order].to_s : column.name.to_s
|
25
|
+
sort_class = (view.params[:order] != order || view.params[:sort_mode] == "reset") ? "sorting" : (view.params[:sort_mode] == "desc" ? "sorting_desc" : "sorting_asc")
|
26
|
+
header_column_html[:class] = (header_column_html[:class] ? "#{header_column_html[:class]} #{sort_class}" : sort_class)
|
27
|
+
end
|
28
|
+
header_column_html
|
29
|
+
end
|
30
|
+
|
31
|
+
def header_cell_content(column, options={})
|
32
|
+
unless options[:header] == false
|
33
|
+
header_sort_link(column, options) do
|
34
|
+
if options[:header]
|
35
|
+
call_with_params options[:header], column
|
36
|
+
elsif column.anonymous
|
37
|
+
nil
|
38
|
+
else
|
39
|
+
column.name.to_s.titleize
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def cell_content(record, column, options={})
|
46
|
+
if options[:link_url] || options[:link_action] || options[:link_method] || options[:link_confirm] || options[:link]
|
47
|
+
url = options[:link_url] ? call_with_params(options[:link_url], record) : [options[:link_action], options[:link_namespace], record].flatten
|
48
|
+
end
|
49
|
+
|
50
|
+
if options[:formatter]
|
51
|
+
if options[:formatter].is_a?(Proc)
|
52
|
+
content = call_with_params(options[:formatter], record.send(column.name), options)
|
53
|
+
else
|
54
|
+
content = record.send(column.name).try(*options[:formatter])
|
55
|
+
end
|
56
|
+
elsif options[:data] || [:edit, :show, :delete].include?(column.name)
|
57
|
+
content = call_with_params(options[:data], record)
|
58
|
+
else
|
59
|
+
content = record.send(column.name)
|
60
|
+
end
|
61
|
+
|
62
|
+
if content.blank? || url.blank? || options[:link] == false
|
63
|
+
content
|
64
|
+
elsif url
|
65
|
+
view.link_to content, url, {:method => options[:link_method], :confirm => options[:link_confirm]}.merge(options[:link_html])
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def set_current_record(record)
|
70
|
+
self.current_record = record
|
71
|
+
end
|
72
|
+
|
73
|
+
def header_sort_link(column, options={}, &block)
|
74
|
+
if options[:sortable] && (options[:header] || !column.anonymous)
|
75
|
+
order = options[:order] ? options[:order].to_s : column.name.to_s
|
76
|
+
sort_mode = (view.params[:order] != order || view.params[:sort_mode] == "reset") ? "asc" : (view.params[:sort_mode] == "desc" ? "reset" : "desc")
|
77
|
+
parameters = view.params.merge(:order => order, :sort_mode => sort_mode)
|
78
|
+
parameters.delete(:action)
|
79
|
+
parameters.delete(:controller)
|
80
|
+
url = options[:sort_url] ? options[:sort_url] : ""
|
81
|
+
view.link_to view.capture(self, &block), "#{url}?#{parameters.to_query}"
|
82
|
+
else
|
83
|
+
view.capture(self, &block)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -2,59 +2,7 @@ module TableFor
|
|
2
2
|
module ViewAdditions
|
3
3
|
module ClassMethods
|
4
4
|
def table_for(records, options={}, &block)
|
5
|
-
TableFor::Base.new(self, options.merge(:variable => "table", :records => records
|
6
|
-
end
|
7
|
-
|
8
|
-
def table_for_header_html(column, options={})
|
9
|
-
header_html = call_each_hash_value_if_proc(options[:header_html], column)
|
10
|
-
if options[:sortable]
|
11
|
-
order = options[:order] ? options[:order].to_s : column.name.to_s
|
12
|
-
sort_class = (params[:order] != order || params[:sort_mode] == "reset") ? "sorting" : (params[:sort_mode] == "desc" ? "sorting_desc" : "sorting_asc")
|
13
|
-
header_html[:class] = (header_html[:class] ? "#{header_html[:class]} #{sort_class}" : sort_class)
|
14
|
-
end
|
15
|
-
header_html
|
16
|
-
end
|
17
|
-
|
18
|
-
def table_for_sort_link(column, options={})
|
19
|
-
order = options[:order] ? options[:order].to_s : column.name.to_s
|
20
|
-
label = (options[:label] ? options[:label] : column.name.to_s.titleize)
|
21
|
-
sort_mode = (params[:order] != order || params[:sort_mode] == "reset") ? "asc" : (params[:sort_mode] == "desc" ? "reset" : "desc")
|
22
|
-
parameters = params.merge(:order => order, :sort_mode => sort_mode)
|
23
|
-
parameters.delete(:action)
|
24
|
-
parameters.delete(:controller)
|
25
|
-
url = options[:sort_url] ? options[:sort_url] : ""
|
26
|
-
link_to label, "#{url}?#{parameters.to_query}"
|
27
|
-
end
|
28
|
-
|
29
|
-
def table_for_table_html(options)
|
30
|
-
if options[:table_html]
|
31
|
-
options[:table_html].merge!(:class => TableFor.default_table_class) if TableFor.default_table_class && !options[:table_html][:class]
|
32
|
-
options[:table_html]
|
33
|
-
elsif TableFor.default_table_class
|
34
|
-
{:class => TableFor.default_table_class}
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
def table_for_header_cell_data(column, options={})
|
39
|
-
unless options[:label] == false
|
40
|
-
if options[:sortable]
|
41
|
-
table_for_sort_link(column, options)
|
42
|
-
else
|
43
|
-
options[:label] ? options[:label] : column.name.to_s.titleize
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def table_for_cell_data(record, column, options)
|
49
|
-
if (options[:transformation])
|
50
|
-
if options[:transformation].is_a?(Proc)
|
51
|
-
call_if_proc(options[:transformation], record, column, options)
|
52
|
-
else
|
53
|
-
record.send(column.name).try(*options[:transformation])
|
54
|
-
end
|
55
|
-
else
|
56
|
-
record.send(column.name)
|
57
|
-
end
|
5
|
+
TableFor::Base.new(self, options.merge(:variable => "table", :records => records)).render_template("table_for/table_for", &block)
|
58
6
|
end
|
59
7
|
end
|
60
8
|
end
|
@@ -118,7 +118,7 @@ describe "table_for" do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
it "should be able to specify html attributes" do
|
121
|
-
buffer = @view.table_for @users[0,1], :
|
121
|
+
buffer = @view.table_for @users[0,1], :header_column_html => {:class => "sortable"} do |table|
|
122
122
|
table.column :first_name
|
123
123
|
end
|
124
124
|
xml = XmlSimple.xml_in(%%<table><thead><tr><th class="sortable">First Name</th></tr></thead><tbody><tr><td>Andrew</td></tr></tbody></table>%)
|
@@ -126,7 +126,7 @@ describe "table_for" do
|
|
126
126
|
end
|
127
127
|
|
128
128
|
it "should be able to dynamically specify column attributes" do
|
129
|
-
buffer = @view.table_for @users[0, 1], :
|
129
|
+
buffer = @view.table_for @users[0, 1], :header_column_html => {:class => lambda {@view.cycle("even", "odd")},
|
130
130
|
:id => lambda {|column| "#{column.name.to_s}_header"}} do |table|
|
131
131
|
table.column :email
|
132
132
|
table.column :first_name
|
@@ -149,85 +149,85 @@ describe "table_for" do
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
|
152
|
-
describe "edit_header block" do
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
describe "delete_header block" do
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
end
|
201
|
-
|
202
|
-
describe "show_header block" do
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
end
|
152
|
+
# describe "edit_header block" do
|
153
|
+
# it "should be able to replace the edit_header block" do
|
154
|
+
# @view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
155
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
156
|
+
# table.define :edit_header do
|
157
|
+
# "Edit"
|
158
|
+
# end
|
159
|
+
# table.column :edit
|
160
|
+
# end
|
161
|
+
#
|
162
|
+
# xml = XmlSimple.xml_in(%%
|
163
|
+
# <table>
|
164
|
+
# <thead><tr><th>Edit</th></tr></thead>
|
165
|
+
# <tbody>
|
166
|
+
# <tr>
|
167
|
+
# <td>
|
168
|
+
# <a href="/users/1/edit">Edit</a>
|
169
|
+
# </td>
|
170
|
+
# </tr>
|
171
|
+
# </tbody>
|
172
|
+
# </table>%)
|
173
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
174
|
+
# end
|
175
|
+
# end
|
176
|
+
#
|
177
|
+
# describe "delete_header block" do
|
178
|
+
# it "should be able to replace the delete_header block" do
|
179
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
180
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
181
|
+
# table.define :delete_header do
|
182
|
+
# "Delete"
|
183
|
+
# end
|
184
|
+
# table.column :delete
|
185
|
+
# end
|
186
|
+
#
|
187
|
+
# xml = XmlSimple.xml_in(%%
|
188
|
+
# <table>
|
189
|
+
# <thead><tr><th>Delete</th></tr></thead>
|
190
|
+
# <tbody>
|
191
|
+
# <tr>
|
192
|
+
# <td>
|
193
|
+
# <a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
194
|
+
# </td>
|
195
|
+
# </tr>
|
196
|
+
# </tbody>
|
197
|
+
# </table>%)
|
198
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
199
|
+
# end
|
200
|
+
# end
|
201
|
+
#
|
202
|
+
# describe "show_header block" do
|
203
|
+
# it "should be able to replace the show_header block" do
|
204
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
205
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
206
|
+
# table.define :show_header do
|
207
|
+
# "Show"
|
208
|
+
# end
|
209
|
+
# table.column :show
|
210
|
+
# end
|
211
|
+
#
|
212
|
+
# xml = XmlSimple.xml_in(%%
|
213
|
+
# <table>
|
214
|
+
# <thead><tr><th>Show</th></tr></thead>
|
215
|
+
# <tbody>
|
216
|
+
# <tr>
|
217
|
+
# <td>
|
218
|
+
# <a href="/users/1">Show</a>
|
219
|
+
# </td>
|
220
|
+
# </tr>
|
221
|
+
# </tbody>
|
222
|
+
# </table>%)
|
223
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
224
|
+
# end
|
225
|
+
# end
|
226
226
|
|
227
227
|
describe "column header contents block" do
|
228
|
-
it "should be able to override the
|
228
|
+
it "should be able to override the header for a particular column" do
|
229
229
|
buffer = @view.table_for @users[0,1] do |table|
|
230
|
-
table.column :email, :
|
230
|
+
table.column :email, :header => "Email Address"
|
231
231
|
end
|
232
232
|
|
233
233
|
xml = XmlSimple.xml_in(%%
|
@@ -238,15 +238,15 @@ describe "table_for" do
|
|
238
238
|
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
239
239
|
end
|
240
240
|
|
241
|
-
it "should be able to override the global defined
|
242
|
-
buffer = @view.table_for @users[0,1], :
|
243
|
-
table.column :email, :
|
241
|
+
it "should be able to override the global defined header for all columns" do
|
242
|
+
buffer = @view.table_for @users[0,1], :header => "My Default Header" do |table|
|
243
|
+
table.column :email, :header => "Email Address"
|
244
244
|
table.column :first_name
|
245
245
|
end
|
246
246
|
|
247
247
|
xml = XmlSimple.xml_in(%%
|
248
248
|
<table>
|
249
|
-
<thead><tr><th>Email Address</th><th>My Default
|
249
|
+
<thead><tr><th>Email Address</th><th>My Default Header</th></tr></thead>
|
250
250
|
<tbody><tr><td>andrew.hunter@livingsocial.com</td><td>Andrew</td></tr></tbody>
|
251
251
|
</table>%)
|
252
252
|
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
@@ -254,9 +254,9 @@ describe "table_for" do
|
|
254
254
|
|
255
255
|
it "should be able to override the definition for a particular column header block" do
|
256
256
|
buffer = @view.table_for @users[0,1] do |table|
|
257
|
-
table.column :email, :
|
257
|
+
table.column :email, :header => "Email Address"
|
258
258
|
table.define :email_header do |column, options|
|
259
|
-
"My Own Header (Replaced #{options[:
|
259
|
+
"My Own Header (Replaced #{options[:header]})"
|
260
260
|
end
|
261
261
|
end
|
262
262
|
|
@@ -270,9 +270,9 @@ describe "table_for" do
|
|
270
270
|
|
271
271
|
it "should be able to override the definition for a particular column header block using the table_for 'header' method" do
|
272
272
|
buffer = @view.table_for @users[0,1] do |table|
|
273
|
-
table.column :email, :
|
273
|
+
table.column :email, :header => "Email Address"
|
274
274
|
table.header :email do |column, options|
|
275
|
-
"My Own Header (Replaced #{options[:
|
275
|
+
"My Own Header (Replaced #{options[:header]})"
|
276
276
|
end
|
277
277
|
end
|
278
278
|
|
@@ -287,7 +287,7 @@ describe "table_for" do
|
|
287
287
|
it "should add a 'sorting' class to the 'th' element and a link around the header content if a column is sortable" do
|
288
288
|
@view.expects(:params).at_least_once.returns({})
|
289
289
|
buffer = @view.table_for @users[0,1] do |table|
|
290
|
-
table.column :email, :sortable => true, :
|
290
|
+
table.column :email, :sortable => true, :header_column_html => {:class => "email", :style => "color:red"}
|
291
291
|
end
|
292
292
|
xml = XmlSimple.xml_in(%%
|
293
293
|
<table>
|
@@ -396,12 +396,12 @@ describe "table_for" do
|
|
396
396
|
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
397
397
|
end
|
398
398
|
|
399
|
-
it "should allow a global
|
400
|
-
buffer = @view.table_for @users[0,1], :
|
399
|
+
it "should allow a global header_column_html option for all columns and the ability to override on a column by column basis" do
|
400
|
+
buffer = @view.table_for @users[0,1], :header_column_html => {:class => lambda {|column| "#{column.name}_header"}} do |table|
|
401
401
|
@view.expects(:params).at_least_once.returns({})
|
402
402
|
table.column :email, :sortable => true
|
403
|
-
table.column :first_name, :
|
404
|
-
table.column :last_name, :
|
403
|
+
table.column :first_name, :header_column_html => {:class => "my_header"}
|
404
|
+
table.column :last_name, :header_column_html => {:class => "my_other_header"}, :sortable => true
|
405
405
|
end
|
406
406
|
xml = XmlSimple.xml_in(%%
|
407
407
|
<table>
|
@@ -438,10 +438,10 @@ describe "table_for" do
|
|
438
438
|
end
|
439
439
|
end
|
440
440
|
|
441
|
-
describe "
|
442
|
-
it "should be able to replace the
|
441
|
+
describe "data_row block" do
|
442
|
+
it "should be able to replace the data_row block" do
|
443
443
|
buffer = @view.table_for @users do |table|
|
444
|
-
table.define :
|
444
|
+
table.define :data_row do |user|
|
445
445
|
"<tr><td>User #{user.first_name}</td></tr>".html_safe
|
446
446
|
end
|
447
447
|
table.column :first_name
|
@@ -460,7 +460,7 @@ describe "table_for" do
|
|
460
460
|
end
|
461
461
|
|
462
462
|
it "should be able to dynamically specify row attributes" do
|
463
|
-
buffer = @view.table_for @users, :
|
463
|
+
buffer = @view.table_for @users, :data_row_html => {:class => lambda {@view.cycle("even", "odd")},
|
464
464
|
:id => lambda {|user| "user-#{user.id}"}} do |table|
|
465
465
|
table.column :email
|
466
466
|
end
|
@@ -478,10 +478,10 @@ describe "table_for" do
|
|
478
478
|
end
|
479
479
|
end
|
480
480
|
|
481
|
-
describe "
|
482
|
-
it "should be able to replace the
|
481
|
+
describe "data_column block" do
|
482
|
+
it "should be able to replace the data_column block" do
|
483
483
|
buffer = @view.table_for @users[0, 1] do |table|
|
484
|
-
table.define :
|
484
|
+
table.define :data_column do |column, user, options|
|
485
485
|
"<td>#{column.name.to_s.titleize} value is #{user.send(column.name)}</td>".html_safe
|
486
486
|
end
|
487
487
|
table.column :email
|
@@ -504,7 +504,7 @@ describe "table_for" do
|
|
504
504
|
end
|
505
505
|
|
506
506
|
it "should be able to specify html attributes" do
|
507
|
-
buffer = @view.table_for @users[0,1], :
|
507
|
+
buffer = @view.table_for @users[0,1], :data_column_html => {:class => "data"} do |table|
|
508
508
|
table.column :first_name
|
509
509
|
end
|
510
510
|
xml = XmlSimple.xml_in(%%<table><thead><tr><th>First Name</th></tr></thead><tbody><tr><td class="data">Andrew</td></tr></tbody></table>%)
|
@@ -512,7 +512,7 @@ describe "table_for" do
|
|
512
512
|
end
|
513
513
|
|
514
514
|
it "should be able to dynamically specify column attributes" do
|
515
|
-
buffer = @view.table_for @users[0, 1], :
|
515
|
+
buffer = @view.table_for @users[0, 1], :data_column_html => {:class => lambda {@view.cycle("even", "odd")},
|
516
516
|
:id => lambda {|user, column| "#{column.name.to_s}_data"}} do |table|
|
517
517
|
table.column :email
|
518
518
|
table.column :first_name
|
@@ -535,9 +535,9 @@ describe "table_for" do
|
|
535
535
|
XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
536
536
|
end
|
537
537
|
|
538
|
-
it "should allow a global
|
539
|
-
buffer = @view.table_for @users[0,1], :
|
540
|
-
table.column :first_name, :
|
538
|
+
it "should allow a global data_column_html option for all columns and the ability to override on a column by column basis" do
|
539
|
+
buffer = @view.table_for @users[0,1], :data_column_html => {:class => lambda {|record, column| "#{column.name}_data"}} do |table|
|
540
|
+
table.column :first_name, :data_column_html => {:class => "my_data"}
|
541
541
|
table.column :last_name
|
542
542
|
end
|
543
543
|
xml = XmlSimple.xml_in(%%
|
@@ -554,362 +554,362 @@ describe "table_for" do
|
|
554
554
|
end
|
555
555
|
end
|
556
556
|
|
557
|
-
describe "edit block" do
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
end
|
649
|
-
|
650
|
-
describe "show block" do
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
717
|
-
|
718
|
-
|
719
|
-
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
|
733
|
-
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
end
|
742
|
-
|
743
|
-
describe "delete block" do
|
744
|
-
|
745
|
-
|
746
|
-
|
747
|
-
|
748
|
-
|
749
|
-
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
-
|
754
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
758
|
-
|
759
|
-
|
760
|
-
|
761
|
-
|
762
|
-
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
|
767
|
-
|
768
|
-
|
769
|
-
|
770
|
-
|
771
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
775
|
-
|
776
|
-
|
777
|
-
|
778
|
-
|
779
|
-
|
780
|
-
|
781
|
-
|
782
|
-
|
783
|
-
|
784
|
-
|
785
|
-
|
786
|
-
|
787
|
-
|
788
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
792
|
-
|
793
|
-
|
794
|
-
|
795
|
-
|
796
|
-
|
797
|
-
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
|
802
|
-
|
803
|
-
|
804
|
-
|
805
|
-
|
806
|
-
|
807
|
-
|
808
|
-
|
809
|
-
|
810
|
-
|
811
|
-
|
812
|
-
|
813
|
-
|
814
|
-
|
815
|
-
|
816
|
-
|
817
|
-
|
818
|
-
|
819
|
-
|
820
|
-
|
821
|
-
|
822
|
-
|
823
|
-
|
824
|
-
|
825
|
-
|
826
|
-
|
827
|
-
|
828
|
-
|
829
|
-
|
830
|
-
|
831
|
-
|
832
|
-
|
833
|
-
|
834
|
-
|
835
|
-
|
836
|
-
|
837
|
-
|
838
|
-
|
839
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
843
|
-
|
844
|
-
|
845
|
-
|
846
|
-
|
847
|
-
|
848
|
-
|
849
|
-
|
850
|
-
|
851
|
-
|
852
|
-
|
853
|
-
|
854
|
-
|
855
|
-
|
856
|
-
|
857
|
-
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
875
|
-
|
876
|
-
|
877
|
-
|
878
|
-
|
879
|
-
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
|
887
|
-
|
888
|
-
|
889
|
-
|
890
|
-
|
891
|
-
|
892
|
-
|
893
|
-
|
894
|
-
|
895
|
-
|
896
|
-
|
897
|
-
|
898
|
-
|
899
|
-
|
900
|
-
|
901
|
-
|
902
|
-
|
903
|
-
|
904
|
-
|
905
|
-
|
906
|
-
end
|
557
|
+
# describe "edit block" do
|
558
|
+
# it "should be able to replace the edit block" do
|
559
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
560
|
+
# table.define :edit do
|
561
|
+
# "Edit Link"
|
562
|
+
# end
|
563
|
+
# table.column :edit
|
564
|
+
# end
|
565
|
+
#
|
566
|
+
# xml = XmlSimple.xml_in(%%
|
567
|
+
# <table>
|
568
|
+
# <thead><tr><th></th></tr></thead>
|
569
|
+
# <tbody><tr><td>Edit Link</td></tr></tbody>
|
570
|
+
# </table>%)
|
571
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
572
|
+
# end
|
573
|
+
#
|
574
|
+
# it "should be able to create an edit column" do
|
575
|
+
# @view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
576
|
+
#
|
577
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
578
|
+
# table.column :edit
|
579
|
+
# end
|
580
|
+
#
|
581
|
+
# xml = XmlSimple.xml_in(%%
|
582
|
+
# <table>
|
583
|
+
# <thead><tr><th></th></tr></thead>
|
584
|
+
# <tbody><tr><td><a href="/users/1/edit">Edit</a></td></tr></tbody>
|
585
|
+
# </table>%)
|
586
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
587
|
+
# end
|
588
|
+
#
|
589
|
+
# it "should be able to update the label for an edit column" do
|
590
|
+
# @view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
591
|
+
#
|
592
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
593
|
+
# table.column :edit, :data => "Modify"
|
594
|
+
# end
|
595
|
+
#
|
596
|
+
# xml = XmlSimple.xml_in(%%
|
597
|
+
# <table>
|
598
|
+
# <thead><tr><th></th></tr></thead>
|
599
|
+
# <tbody><tr><td><a href="/users/1/edit">Modify</a></td></tr></tbody>
|
600
|
+
# </table>%)
|
601
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
602
|
+
# end
|
603
|
+
#
|
604
|
+
# it "should be able to specify the action for an edit column" do
|
605
|
+
# @view.expects(:modify_user_path).with(User.first).returns("/users/1/modify")
|
606
|
+
#
|
607
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
608
|
+
# table.column :edit, :action => :modify
|
609
|
+
# end
|
610
|
+
#
|
611
|
+
# xml = XmlSimple.xml_in(%%
|
612
|
+
# <table>
|
613
|
+
# <thead><tr><th></th></tr></thead>
|
614
|
+
# <tbody><tr><td><a href="/users/1/modify">Edit</a></td></tr></tbody>
|
615
|
+
# </table>%)
|
616
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
617
|
+
# end
|
618
|
+
#
|
619
|
+
# it "should be able to specify the scope for an edit column" do
|
620
|
+
# @view.expects(:edit_user_test_user_path).with(User.last, User.first).returns("/users/3/test/users/1/edit")
|
621
|
+
#
|
622
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
623
|
+
# table.column :edit, :scope => [User.last, :test]
|
624
|
+
# end
|
625
|
+
#
|
626
|
+
# xml = XmlSimple.xml_in(%%
|
627
|
+
# <table>
|
628
|
+
# <thead><tr><th></th></tr></thead>
|
629
|
+
# <tbody><tr><td><a href="/users/3/test/users/1/edit">Edit</a></td></tr></tbody>
|
630
|
+
# </table>%)
|
631
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
632
|
+
# end
|
633
|
+
#
|
634
|
+
# it "should be able to specify the html for an edit column" do
|
635
|
+
# @view.expects(:edit_user_path).with(User.first).returns("/users/1/edit")
|
636
|
+
#
|
637
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
638
|
+
# table.column :edit, :link_html => {:style => "color:red"}
|
639
|
+
# end
|
640
|
+
#
|
641
|
+
# xml = XmlSimple.xml_in(%%
|
642
|
+
# <table>
|
643
|
+
# <thead><tr><th></th></tr></thead>
|
644
|
+
# <tbody><tr><td><a href="/users/1/edit" style="color:red">Edit</a></td></tr></tbody>
|
645
|
+
# </table>%)
|
646
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
647
|
+
# end
|
648
|
+
# end
|
649
|
+
#
|
650
|
+
# describe "show block" do
|
651
|
+
# it "should be able to replace the show block" do
|
652
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
653
|
+
# table.define :show do
|
654
|
+
# "Show Link"
|
655
|
+
# end
|
656
|
+
# table.column :show
|
657
|
+
# end
|
658
|
+
#
|
659
|
+
# xml = XmlSimple.xml_in(%%
|
660
|
+
# <table>
|
661
|
+
# <thead><tr><th></th></tr></thead>
|
662
|
+
# <tbody><tr><td>Show Link</td></tr></tbody>
|
663
|
+
# </table>%)
|
664
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
665
|
+
# end
|
666
|
+
#
|
667
|
+
# it "should be able to create a show column" do
|
668
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
669
|
+
#
|
670
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
671
|
+
# table.column :show
|
672
|
+
# end
|
673
|
+
#
|
674
|
+
# xml = XmlSimple.xml_in(%%
|
675
|
+
# <table>
|
676
|
+
# <thead><tr><th></th></tr></thead>
|
677
|
+
# <tbody><tr><td><a href="/users/1">Show</a></td></tr></tbody>
|
678
|
+
# </table>%)
|
679
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
680
|
+
# end
|
681
|
+
#
|
682
|
+
# it "should be able to update the label for an show column" do
|
683
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
684
|
+
#
|
685
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
686
|
+
# table.column :show, :data => "Display"
|
687
|
+
# end
|
688
|
+
#
|
689
|
+
# xml = XmlSimple.xml_in(%%
|
690
|
+
# <table>
|
691
|
+
# <thead><tr><th></th></tr></thead>
|
692
|
+
# <tbody><tr><td><a href="/users/1">Display</a></td></tr></tbody>
|
693
|
+
# </table>%)
|
694
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
695
|
+
# end
|
696
|
+
#
|
697
|
+
# it "should be able to specify the action for an show column" do
|
698
|
+
# @view.expects(:display_user_path).with(User.first).returns("/users/1/display")
|
699
|
+
#
|
700
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
701
|
+
# table.column :show, :action => :display
|
702
|
+
# end
|
703
|
+
#
|
704
|
+
# xml = XmlSimple.xml_in(%%
|
705
|
+
# <table>
|
706
|
+
# <thead><tr><th></th></tr></thead>
|
707
|
+
# <tbody><tr><td><a href="/users/1/display">Show</a></td></tr></tbody>
|
708
|
+
# </table>%)
|
709
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
710
|
+
# end
|
711
|
+
#
|
712
|
+
# it "should be able to specify the scope for an show column" do
|
713
|
+
# @view.expects(:user_test_user_path).with(User.last, User.first).returns("/users/3/test/users/1")
|
714
|
+
#
|
715
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
716
|
+
# table.column :show, :scope => [User.last, :test]
|
717
|
+
# end
|
718
|
+
#
|
719
|
+
# xml = XmlSimple.xml_in(%%
|
720
|
+
# <table>
|
721
|
+
# <thead><tr><th></th></tr></thead>
|
722
|
+
# <tbody><tr><td><a href="/users/3/test/users/1">Show</a></td></tr></tbody>
|
723
|
+
# </table>%)
|
724
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
725
|
+
# end
|
726
|
+
#
|
727
|
+
# it "should be able to specify the html for an show column" do
|
728
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
729
|
+
#
|
730
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
731
|
+
# table.column :show, :link_html => {:style => "color:red"}
|
732
|
+
# end
|
733
|
+
#
|
734
|
+
# xml = XmlSimple.xml_in(%%
|
735
|
+
# <table>
|
736
|
+
# <thead><tr><th></th></tr></thead>
|
737
|
+
# <tbody><tr><td><a href="/users/1" style="color:red">Show</a></td></tr></tbody>
|
738
|
+
# </table>%)
|
739
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
740
|
+
# end
|
741
|
+
# end
|
742
|
+
#
|
743
|
+
# describe "delete block" do
|
744
|
+
# it "should be able to replace the delete block" do
|
745
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
746
|
+
# table.define :delete do
|
747
|
+
# "Delete Link"
|
748
|
+
# end
|
749
|
+
# table.column :delete
|
750
|
+
# end
|
751
|
+
#
|
752
|
+
# xml = XmlSimple.xml_in(%%
|
753
|
+
# <table>
|
754
|
+
# <thead><tr><th></th></tr></thead>
|
755
|
+
# <tbody><tr><td>Delete Link</td></tr></tbody>
|
756
|
+
# </table>%)
|
757
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
758
|
+
# end
|
759
|
+
#
|
760
|
+
# it "should be able to create a delete column" do
|
761
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
762
|
+
#
|
763
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
764
|
+
# table.column :delete
|
765
|
+
# end
|
766
|
+
#
|
767
|
+
# xml = XmlSimple.xml_in(%%
|
768
|
+
# <table>
|
769
|
+
# <thead><tr><th></th></tr></thead>
|
770
|
+
# <tbody>
|
771
|
+
# <tr>
|
772
|
+
# <td>
|
773
|
+
# <a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
774
|
+
# </td>
|
775
|
+
# </tr>
|
776
|
+
# </tbody>
|
777
|
+
# </table>%)
|
778
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
779
|
+
# end
|
780
|
+
#
|
781
|
+
# it "should be able to update the label for an delete column" do
|
782
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
783
|
+
#
|
784
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
785
|
+
# table.column :delete, :data => "Destroy"
|
786
|
+
# end
|
787
|
+
#
|
788
|
+
# xml = XmlSimple.xml_in(%%
|
789
|
+
# <table>
|
790
|
+
# <thead><tr><th></th></tr></thead>
|
791
|
+
# <tbody>
|
792
|
+
# <tr>
|
793
|
+
# <td>
|
794
|
+
# <a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Destroy</a>
|
795
|
+
# </td>
|
796
|
+
# </tr>
|
797
|
+
# </tbody>
|
798
|
+
# </table>%)
|
799
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
800
|
+
# end
|
801
|
+
#
|
802
|
+
# it "should be able to specify the action for an delete column" do
|
803
|
+
# @view.expects(:dispose_user_path).with(User.first).returns("/users/1/dispose")
|
804
|
+
#
|
805
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
806
|
+
# table.column :delete, :action => :dispose
|
807
|
+
# end
|
808
|
+
#
|
809
|
+
# xml = XmlSimple.xml_in(%%
|
810
|
+
# <table>
|
811
|
+
# <thead><tr><th></th></tr></thead>
|
812
|
+
# <tbody>
|
813
|
+
# <tr>
|
814
|
+
# <td>
|
815
|
+
# <a href="/users/1/dispose" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
816
|
+
# </td>
|
817
|
+
# </tr>
|
818
|
+
# </tbody>
|
819
|
+
# </table>%)
|
820
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
821
|
+
# end
|
822
|
+
#
|
823
|
+
# it "should be able to specify the scope for a delete column" do
|
824
|
+
# @view.expects(:user_test_user_path).with(User.last, User.first).returns("/users/3/test/users/1")
|
825
|
+
#
|
826
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
827
|
+
# table.column :delete, :scope => [User.last, :test]
|
828
|
+
# end
|
829
|
+
#
|
830
|
+
# xml = XmlSimple.xml_in(%%
|
831
|
+
# <table>
|
832
|
+
# <thead><tr><th></th></tr></thead>
|
833
|
+
# <tbody>
|
834
|
+
# <tr>
|
835
|
+
# <td>
|
836
|
+
# <a href="/users/3/test/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
837
|
+
# </td>
|
838
|
+
# </tr>
|
839
|
+
# </tbody>
|
840
|
+
# </table>%)
|
841
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
842
|
+
# end
|
843
|
+
#
|
844
|
+
# it "should be able to specify the html for a delete column" do
|
845
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
846
|
+
#
|
847
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
848
|
+
# table.column :delete, :link_html => {:style => "color:red"}
|
849
|
+
# end
|
850
|
+
#
|
851
|
+
# xml = XmlSimple.xml_in(%%
|
852
|
+
# <table>
|
853
|
+
# <thead><tr><th></th></tr></thead>
|
854
|
+
# <tbody>
|
855
|
+
# <tr>
|
856
|
+
# <td>
|
857
|
+
# <a href="/users/1" style="color:red" rel="nofollow" data-method="delete" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
858
|
+
# </td>
|
859
|
+
# </tr>
|
860
|
+
# </tbody>
|
861
|
+
# </table>%)
|
862
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
863
|
+
# end
|
864
|
+
#
|
865
|
+
# it "should be able to override the delete confirmation message for a delete link" do
|
866
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
867
|
+
#
|
868
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
869
|
+
# table.column :delete, :confirm => "Are you sure?"
|
870
|
+
# end
|
871
|
+
#
|
872
|
+
# xml = XmlSimple.xml_in(%%
|
873
|
+
# <table>
|
874
|
+
# <thead><tr><th></th></tr></thead>
|
875
|
+
# <tbody>
|
876
|
+
# <tr>
|
877
|
+
# <td>
|
878
|
+
# <a href="/users/1" rel="nofollow" data-method="delete" data-confirm="Are you sure?">Delete</a>
|
879
|
+
# </td>
|
880
|
+
# </tr>
|
881
|
+
# </tbody>
|
882
|
+
# </table>%)
|
883
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
884
|
+
# end
|
885
|
+
#
|
886
|
+
# it "should be able to override the method for a delete link" do
|
887
|
+
# @view.expects(:user_path).with(User.first).returns("/users/1")
|
888
|
+
#
|
889
|
+
# buffer = @view.table_for @users[0,1] do |table|
|
890
|
+
# table.column :delete, :method => :get
|
891
|
+
# end
|
892
|
+
#
|
893
|
+
# xml = XmlSimple.xml_in(%%
|
894
|
+
# <table>
|
895
|
+
# <thead><tr><th></th></tr></thead>
|
896
|
+
# <tbody>
|
897
|
+
# <tr>
|
898
|
+
# <td>
|
899
|
+
# <a href="/users/1" data-method="get" data-confirm="Are you sure you want to delete this User?">Delete</a>
|
900
|
+
# </td>
|
901
|
+
# </tr>
|
902
|
+
# </tbody>
|
903
|
+
# </table>%)
|
904
|
+
# XmlSimple.xml_in(buffer, 'NormaliseSpace' => 2).should eql xml
|
905
|
+
# end
|
906
|
+
# end
|
907
907
|
|
908
908
|
describe "column data contents block" do
|
909
909
|
it "should be able to replace an individual column data contents block" do
|
910
910
|
buffer = @view.table_for @users[0,1] do |table|
|
911
|
-
table.column :email, :
|
912
|
-
table.column :
|
911
|
+
table.column :email, :header => "Email Address"
|
912
|
+
table.column :header => "Full Name" do |user|
|
913
913
|
"#{user.first_name} #{user.last_name}"
|
914
914
|
end
|
915
915
|
end
|