sortablecolumns 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +5 -0
- data/Manifest.txt +0 -0
- data/README.txt +4 -5
- data/Rakefile +0 -0
- data/lib/sortablecolumns.rb +1 -1
- data/lib/sortablecolumns/helpers.rb +0 -0
- data/lib/sortablecolumns/sortablecolumns.rb +229 -189
- data/test/col_def_test_yaml_files/person/dude/dude_report.yml +0 -0
- data/test/col_def_test_yaml_files/person/mysorter.yml +0 -0
- data/test/col_def_test_yaml_files/person/tacosorter.yml +0 -0
- data/test/sortablecolumns_test.rb +44 -0
- metadata +5 -4
data/History.txt
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
=== 0.1.5 / 2009-02-19
|
2
|
+
* Fixed bug 23868 - now works with Rails 2.2 - http://rubyforge.org/tracker/?atid=23868&group_id=6158&func=browse
|
3
|
+
* Added default_sorter as an option instead of creating a yaml file. Also able to generate default yaml output using
|
4
|
+
ModelName.default_col_defs
|
5
|
+
|
1
6
|
=== 0.1.4 / 2008-06-04
|
2
7
|
* Table heading (TH) urls now remove any parameter named "page". This is to support paginated tables
|
3
8
|
since, if a user is on a page other than 1, clicking on a column heading should sort all data and
|
data/Manifest.txt
CHANGED
File without changes
|
data/README.txt
CHANGED
@@ -6,8 +6,7 @@
|
|
6
6
|
|
7
7
|
SortableColumns is a Rails plugin that allows easy creation of sortable HTML tables as plain HTML or as a YUI DataTable (requires YUI4Rails plugin - http://rubyforge.org/projects/yui4rails/). Table column characteristics (e.g., default sort direction, data type, CSS attributes, and methods to wrap the output in) are defined in YAML files (more options to be added later, such auto-detecting the column types, using a hash, etc.). Multiple table column definitions can be created for a single model.
|
8
8
|
|
9
|
-
|
10
|
-
Download the example app here: http://www.bryandonovan.com/sortable_columns_example.tar.gz
|
9
|
+
Download an example app here: http://www.bryandonovan.com/sortable_columns_example.tar.gz
|
11
10
|
|
12
11
|
Also see: ActiveRecord::Acts::SortableColumns::ClassMethods#sortable_columns
|
13
12
|
|
@@ -26,12 +25,10 @@ Also see: ActiveRecord::Acts::SortableColumns::ClassMethods#sortable_columns
|
|
26
25
|
created in the SQL query.
|
27
26
|
* Test coverage for all current features.
|
28
27
|
|
29
|
-
=== Problems
|
30
|
-
* Doesn't yet support date formats (should be easy to implement though and will hopefully happen soon)
|
31
|
-
|
32
28
|
== SYNOPSIS:
|
33
29
|
* First, create a directory to store your column definitions YAML files. The default location SortableColumns will look is app/models/col_defs.
|
34
30
|
* Create a YAML file for the configuration of your table columns.
|
31
|
+
* NEW: You can now set a :sorter_name of :default_sorter which will guess the configuration of the model's table. You can also use ModelName.default_col_defs(:yaml) to generate YAML output with these same defaults.
|
35
32
|
* Call sortable_tables in your model
|
36
33
|
* Run query (get an ActiveRecord result set)
|
37
34
|
* Render table in your view
|
@@ -51,6 +48,8 @@ We're going to call this sorter "mysorter". This will be the name of the YAML f
|
|
51
48
|
|
52
49
|
class Person < ActiveRecord::Base
|
53
50
|
sortable_columns :mysorter
|
51
|
+
# or if you want to use the defaults:
|
52
|
+
# sortable_columns :default_sorter
|
54
53
|
|
55
54
|
# method to run query with sort options
|
56
55
|
def self.find_for_mysorter(options = {})
|
data/Rakefile
CHANGED
File without changes
|
data/lib/sortablecolumns.rb
CHANGED
File without changes
|
@@ -37,233 +37,273 @@ module ActiveRecord #:nodoc:
|
|
37
37
|
class_inheritable_reader :sorter_options
|
38
38
|
|
39
39
|
self.class_eval <<-END
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
end
|
59
|
-
return ret
|
60
|
-
end
|
61
|
-
return self.#{sorter_name}_print_text(col)
|
62
|
-
end
|
63
|
-
|
64
|
-
def self.#{sorter_name}_yaml_path
|
65
|
-
raise "RAILS_ROOT is not defined" unless defined?(RAILS_ROOT)
|
66
|
-
klass_name = Inflector.underscore(self.class_name)
|
67
|
-
file_name = "#{sorter_name}.yml"
|
68
|
-
if sorter_options[:subclass_name]
|
69
|
-
sub_path = File.join(klass_name, Inflector.underscore(sorter_options[:subclass_name]), file_name)
|
70
|
-
else
|
71
|
-
sub_path = File.join(klass_name, file_name)
|
72
|
-
end
|
73
|
-
if sorter_options[:path_prefix]
|
74
|
-
return File.join(RAILS_ROOT, sorter_options[:path_prefix], sub_path)
|
75
|
-
else
|
76
|
-
#defaults to col_defs subdirectory in app/models
|
77
|
-
return File.join(RAILS_ROOT, "app/models/col_defs", sub_path)
|
40
|
+
def self.#{sorter_name}_cols=(val)
|
41
|
+
@@#{sorter_name}_cols = val
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.#{sorter_name}_cols
|
45
|
+
@@#{sorter_name}_cols
|
46
|
+
end
|
47
|
+
cattr_accessor :#{sorter_name}_cols
|
48
|
+
|
49
|
+
def self.#{sorter_name}_col_defs
|
50
|
+
@@#{sorter_name}_cols ||= #{sorter_name}_initialize_col_defs
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.#{sorter_name}_col_text(obj, col)
|
54
|
+
if self.#{sorter_name}_in_resultset?(col)
|
55
|
+
ret = obj.send(col)
|
56
|
+
if ret == '' or ret.nil?
|
57
|
+
ret = " " #so empty TD cells still get displayed
|
78
58
|
end
|
79
|
-
|
80
|
-
|
81
|
-
|
59
|
+
return ret
|
60
|
+
end
|
61
|
+
return self.#{sorter_name}_print_text(col)
|
62
|
+
end
|
63
|
+
|
64
|
+
def self.#{sorter_name}_yaml_path
|
65
|
+
raise "RAILS_ROOT is not defined" unless defined?(RAILS_ROOT)
|
66
|
+
klass_name = ActiveSupport::Inflector.underscore(self.class_name)
|
67
|
+
file_name = "#{sorter_name}.yml"
|
68
|
+
if sorter_options[:subclass_name]
|
69
|
+
sub_path = File.join(klass_name, ActiveSupport::Inflector.underscore(sorter_options[:subclass_name]), file_name)
|
70
|
+
else
|
71
|
+
sub_path = File.join(klass_name, file_name)
|
72
|
+
end
|
73
|
+
if sorter_options[:path_prefix]
|
74
|
+
return File.join(RAILS_ROOT, sorter_options[:path_prefix], sub_path)
|
75
|
+
else
|
76
|
+
#defaults to col_defs subdirectory in app/models
|
77
|
+
return File.join(RAILS_ROOT, "app/models/col_defs", sub_path)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.#{sorter_name}_initialize_col_defs
|
82
|
+
if "#{sorter_name}" == 'default_sorter'
|
83
|
+
self.default_col_defs
|
84
|
+
else
|
82
85
|
YAML.load_file(#{sorter_name}_yaml_path)
|
83
86
|
end
|
87
|
+
end
|
84
88
|
|
85
|
-
|
86
|
-
|
87
|
-
|
89
|
+
def self.#{sorter_name}_col_def_hash
|
90
|
+
@@#{sorter_name}_col_def_hash ||= #{sorter_name}_initialize_col_def_hash
|
91
|
+
end
|
88
92
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
93
|
+
def self.#{sorter_name}_initialize_col_def_hash
|
94
|
+
col_def_hash = {}
|
95
|
+
#{sorter_name}_col_defs.each do |c|
|
96
|
+
c.keys.each do |key|
|
97
|
+
col_def_hash[key] = c[key]
|
95
98
|
end
|
96
|
-
col_def_hash
|
97
99
|
end
|
100
|
+
col_def_hash
|
101
|
+
end
|
98
102
|
|
99
|
-
|
100
|
-
|
101
|
-
|
103
|
+
def self.#{sorter_name}_col_keys_in_order
|
104
|
+
@@#{sorter_name}_col_keys_in_order ||= #{sorter_name}_initialize_col_keys_in_order
|
105
|
+
end
|
102
106
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
end
|
107
|
+
def self.#{sorter_name}_initialize_col_keys_in_order
|
108
|
+
cols = []
|
109
|
+
#{sorter_name}_col_defs.each do |hsh|
|
110
|
+
hsh.each do |key, sub_hash|
|
111
|
+
cols << key
|
109
112
|
end
|
110
|
-
cols
|
111
113
|
end
|
114
|
+
cols
|
115
|
+
end
|
112
116
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
+
def self.#{sorter_name}_heading(col)
|
118
|
+
return false if #{sorter_name}_col_def_hash[col]['heading'] == false
|
119
|
+
#{sorter_name}_col_def_hash[col]['heading'] || col.humanize
|
120
|
+
end
|
117
121
|
|
118
|
-
|
119
|
-
|
120
|
-
|
122
|
+
def self.#{sorter_name}_headings_in_order
|
123
|
+
@@#{sorter_name}_headings_in_order ||= #{sorter_name}_initialize_headings_in_order
|
124
|
+
end
|
121
125
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
end
|
127
|
-
headings
|
126
|
+
def self.#{sorter_name}_initialize_headings_in_order
|
127
|
+
headings = []
|
128
|
+
#{sorter_name}_col_keys_in_order.each do |key|
|
129
|
+
headings << #{sorter_name}_heading(key) if #{sorter_name}_heading(key)
|
128
130
|
end
|
131
|
+
headings
|
132
|
+
end
|
129
133
|
|
130
|
-
|
131
|
-
|
132
|
-
|
134
|
+
def self.#{sorter_name}_col_def(col)
|
135
|
+
#{sorter_name}_col_def_hash[col]
|
136
|
+
end
|
133
137
|
|
134
|
-
|
135
|
-
|
136
|
-
|
138
|
+
def self.#{sorter_name}_datatype(col)
|
139
|
+
#{sorter_name}_col_def_hash[col]['datatype']
|
140
|
+
end
|
137
141
|
|
138
|
-
|
139
|
-
|
140
|
-
|
142
|
+
def self.#{sorter_name}_sort_options(col)
|
143
|
+
#{sorter_name}_col_def_hash[col]['sort_options']
|
144
|
+
end
|
141
145
|
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def self.#{sorter_name}_print_options(col)
|
151
|
-
if #{sorter_name}_col_def_hash[col]
|
152
|
-
#{sorter_name}_col_def_hash[col]['print_options']
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def self.#{sorter_name}_td_class(col)
|
157
|
-
#{sorter_name}_col_def_hash[col]['td_class']
|
146
|
+
def self.#{sorter_name}_default_sort_dir(col)
|
147
|
+
if sort_ops = #{sorter_name}_col_def_hash[col]['sort_options']
|
148
|
+
sort_ops['default_dir'] ? sort_ops['default_dir'] : 'asc'
|
149
|
+
else
|
150
|
+
'asc'
|
158
151
|
end
|
152
|
+
end
|
159
153
|
|
160
|
-
|
161
|
-
|
154
|
+
def self.#{sorter_name}_print_options(col)
|
155
|
+
if #{sorter_name}_col_def_hash[col]
|
156
|
+
#{sorter_name}_col_def_hash[col]['print_options']
|
162
157
|
end
|
158
|
+
end
|
163
159
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
def self.#{sorter_name}_delimiter(col)
|
169
|
-
#{sorter_name}_col_def_hash[col]['delimiter'] || ","
|
170
|
-
end
|
171
|
-
|
172
|
-
def self.#{sorter_name}_separator(col)
|
173
|
-
#{sorter_name}_col_def_hash[col]['separator'] || "."
|
174
|
-
end
|
175
|
-
|
176
|
-
def self.#{sorter_name}_unit(col)
|
177
|
-
#{sorter_name}_col_def_hash[col]['unit'] || "$"
|
178
|
-
end
|
179
|
-
|
180
|
-
def self.#{sorter_name}_date_format(col)
|
181
|
-
format = #{sorter_name}_col_def_hash[col]['date_format']
|
182
|
-
unless format
|
183
|
-
datatype = #{sorter_name}_datatype(col)
|
184
|
-
if datatype.downcase == 'datetime'
|
185
|
-
format = "%Y-%m-%d %I:%M:%S"
|
186
|
-
else
|
187
|
-
format = "%Y-%m-%d"
|
188
|
-
end
|
189
|
-
end
|
190
|
-
format
|
191
|
-
end
|
160
|
+
def self.#{sorter_name}_td_class(col)
|
161
|
+
#{sorter_name}_col_def_hash[col]['td_class']
|
162
|
+
end
|
192
163
|
|
193
|
-
|
194
|
-
|
195
|
-
|
164
|
+
def self.#{sorter_name}_th_class(col)
|
165
|
+
#{sorter_name}_col_def_hash[col]['th_class']
|
166
|
+
end
|
196
167
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
return false if hsh.has_key?('heading') && hsh['heading'] == false
|
201
|
-
return true
|
202
|
-
end
|
168
|
+
def self.#{sorter_name}_precision(col)
|
169
|
+
#{sorter_name}_col_def_hash[col]['precision']
|
170
|
+
end
|
203
171
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
end
|
172
|
+
def self.#{sorter_name}_delimiter(col)
|
173
|
+
#{sorter_name}_col_def_hash[col]['delimiter'] || ","
|
174
|
+
end
|
208
175
|
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
end
|
176
|
+
def self.#{sorter_name}_separator(col)
|
177
|
+
#{sorter_name}_col_def_hash[col]['separator'] || "."
|
178
|
+
end
|
213
179
|
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
return true
|
218
|
-
end
|
180
|
+
def self.#{sorter_name}_unit(col)
|
181
|
+
#{sorter_name}_col_def_hash[col]['unit'] || "$"
|
182
|
+
end
|
219
183
|
|
220
|
-
|
221
|
-
|
222
|
-
|
184
|
+
def self.#{sorter_name}_date_format(col)
|
185
|
+
format = #{sorter_name}_col_def_hash[col]['date_format']
|
186
|
+
unless format
|
223
187
|
datatype = #{sorter_name}_datatype(col)
|
224
|
-
if datatype == '
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
if sort_dir == 'desc'
|
229
|
-
sort_ops = {:defaultDir => "YAHOO.widget.DataTable.CLASS_DESC"}
|
188
|
+
if datatype.downcase == 'datetime'
|
189
|
+
format = "%Y-%m-%d %I:%M:%S"
|
190
|
+
else
|
191
|
+
format = "%Y-%m-%d"
|
230
192
|
end
|
231
|
-
yui = {:key => col, :label => label, :sortable => sortable}
|
232
|
-
yui[:sortOptions] = sort_ops if sort_ops
|
233
|
-
yui[:formatter] = formatter if formatter
|
234
|
-
yui
|
235
193
|
end
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
194
|
+
format
|
195
|
+
end
|
196
|
+
|
197
|
+
def self.#{sorter_name}_print_text(col)
|
198
|
+
#{sorter_name}_col_def_hash[col]['print_text'] || ''
|
199
|
+
end
|
200
|
+
|
201
|
+
def self.#{sorter_name}_sortable?(col)
|
202
|
+
hsh = #{sorter_name}_col_def_hash[col]
|
203
|
+
return false if hsh.has_key?('sortable') && hsh['sortable'] == false
|
204
|
+
return false if hsh.has_key?('heading') && hsh['heading'] == false
|
205
|
+
return true
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.#{sorter_name}_link_options(col)
|
209
|
+
link_ops = #{sorter_name}_col_def_hash[col]['link_options']
|
210
|
+
return link_ops.symbolize_keys! if link_ops
|
211
|
+
end
|
212
|
+
|
213
|
+
def self.#{sorter_name}_link?(col)
|
214
|
+
return true if #{sorter_name}_link_options(col)
|
215
|
+
return false
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.#{sorter_name}_in_resultset?(col)
|
219
|
+
hsh = #{sorter_name}_col_def_hash[col]
|
220
|
+
return false if hsh.has_key?('in_resultset') && hsh['in_resultset'] == false
|
221
|
+
return true
|
222
|
+
end
|
223
|
+
|
224
|
+
def self.#{sorter_name}_col_def_for_yui(col)
|
225
|
+
label = #{sorter_name}_heading(col) ? #{sorter_name}_heading(col) : ''
|
226
|
+
sortable = #{sorter_name}_sortable?(col)
|
227
|
+
datatype = #{sorter_name}_datatype(col)
|
228
|
+
if datatype == 'number' or datatype == 'currency'
|
229
|
+
formatter = datatype
|
230
|
+
end
|
231
|
+
sort_dir = #{sorter_name}_default_sort_dir(col)
|
232
|
+
if sort_dir == 'desc'
|
233
|
+
sort_ops = {:defaultDir => "YAHOO.widget.DataTable.CLASS_DESC"}
|
234
|
+
end
|
235
|
+
yui = {:key => col, :label => label, :sortable => sortable}
|
236
|
+
yui[:sortOptions] = sort_ops if sort_ops
|
237
|
+
yui[:formatter] = formatter if formatter
|
238
|
+
yui
|
239
|
+
end
|
240
|
+
|
241
|
+
def self.#{sorter_name}_col_defs_for_yui
|
242
|
+
yui_col_defs = []
|
243
|
+
#{sorter_name}_col_keys_in_order.each do |col|
|
244
|
+
yui_col_defs << #{sorter_name}_col_def_for_yui(col)
|
245
|
+
end
|
246
|
+
yui_col_defs
|
247
|
+
end
|
248
|
+
|
249
|
+
def self.#{sorter_name}_field_def_for_yui(col)
|
250
|
+
datatype = #{sorter_name}_datatype(col)
|
251
|
+
yui_field_def = {:key => col}
|
252
|
+
if datatype == 'number'
|
253
|
+
yui_field_def[:parser] = "YAHOO.util.DataSource.parseNumber"
|
254
|
+
end
|
255
|
+
if datatype == 'currency'
|
256
|
+
yui_field_def[:parser] = "this.parseNumberFromCurrency"
|
257
|
+
end
|
258
|
+
yui_field_def
|
259
|
+
end
|
260
|
+
|
261
|
+
def self.#{sorter_name}_fields_for_yui
|
262
|
+
yui_fields = []
|
263
|
+
#{sorter_name}_col_keys_in_order.each do |col|
|
264
|
+
yui_fields << #{sorter_name}_field_def_for_yui(col)
|
265
|
+
end
|
266
|
+
yui_fields
|
267
|
+
end
|
268
|
+
|
269
|
+
|
270
|
+
def self.default_col_defs(output=:hsh)
|
271
|
+
col_arr = []
|
272
|
+
col_hsh = self.columns_hash
|
273
|
+
self.column_names.each do |col_name|
|
274
|
+
hsh = {}
|
275
|
+
col = col_hsh[col_name]
|
276
|
+
hsh[col.name] = {}
|
277
|
+
h = hsh[col.name]
|
278
|
+
h['heading'] = col.name.titleize
|
279
|
+
if col.limit && col.limit > 50
|
280
|
+
h['sortable'] = 'false'
|
241
281
|
end
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
def self.#{sorter_name}_field_def_for_yui(col)
|
246
|
-
datatype = #{sorter_name}_datatype(col)
|
247
|
-
yui_field_def = {:key => col}
|
248
|
-
if datatype == 'number'
|
249
|
-
yui_field_def[:parser] = "YAHOO.util.DataSource.parseNumber"
|
282
|
+
if col.type == :date
|
283
|
+
h['datatype'] = 'date'
|
250
284
|
end
|
251
|
-
if
|
252
|
-
|
285
|
+
if col.type == :datetime
|
286
|
+
h['datatype'] = 'datetime'
|
253
287
|
end
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
288
|
+
if col.type == :integer
|
289
|
+
h['datatype'] = 'number'
|
290
|
+
h['sort_options'] = {'default_dir' => 'asc'}
|
291
|
+
end
|
292
|
+
if col.name.match(/amt|cost|price|balance/)
|
293
|
+
h['datatype'] = 'currency'
|
294
|
+
h['sort_options'] = {'default_dir' => 'desc'}
|
295
|
+
elsif col.type == :decimal
|
296
|
+
h['datatype'] = 'number'
|
297
|
+
h['precision'] = 2
|
298
|
+
h['sort_options'] = {'default_dir' => 'asc'}
|
261
299
|
end
|
262
|
-
|
300
|
+
col_arr << hsh
|
263
301
|
end
|
302
|
+
return col_arr if output == :hsh
|
303
|
+
return col_arr.to_yaml
|
304
|
+
end
|
264
305
|
|
265
|
-
|
266
|
-
END
|
306
|
+
END
|
267
307
|
|
268
308
|
end #sortable_columns
|
269
309
|
end #ClassMethods
|
File without changes
|
File without changes
|
File without changes
|
@@ -45,6 +45,8 @@ class Person < ActiveRecord::Base
|
|
45
45
|
:path_prefix => "/test/col_def_test_yaml_files"
|
46
46
|
sortable_columns :tacosorter,
|
47
47
|
:path_prefix => "/test/col_def_test_yaml_files"
|
48
|
+
sortable_columns :default_sorter,
|
49
|
+
:path_prefix => "/test/col_def_test_yaml_files"
|
48
50
|
|
49
51
|
#Some mock methods. Normally we would have an AR object which could have been
|
50
52
|
#created by a find_by_sql query, which could include methods such as these.
|
@@ -300,6 +302,48 @@ class SortableColumnsTest< Test::Unit::TestCase
|
|
300
302
|
assert_equal expected, Person.mysorter_fields_for_yui
|
301
303
|
end
|
302
304
|
|
305
|
+
def test_default_yaml_col_defs_for_person
|
306
|
+
expected='---
|
307
|
+
- id:
|
308
|
+
sort_options:
|
309
|
+
default_dir: asc
|
310
|
+
datatype: number
|
311
|
+
heading: Id
|
312
|
+
- firstname:
|
313
|
+
heading: Firstname
|
314
|
+
sortable: "false"
|
315
|
+
- lastname:
|
316
|
+
heading: Lastname
|
317
|
+
sortable: "false"
|
318
|
+
- age:
|
319
|
+
sort_options:
|
320
|
+
default_dir: asc
|
321
|
+
datatype: number
|
322
|
+
heading: Age
|
323
|
+
- description:
|
324
|
+
heading: Description
|
325
|
+
sortable: "false"
|
326
|
+
- balance:
|
327
|
+
sort_options:
|
328
|
+
default_dir: desc
|
329
|
+
datatype: currency
|
330
|
+
heading: Balance
|
331
|
+
- created_at:
|
332
|
+
datatype: datetime
|
333
|
+
heading: Created At
|
334
|
+
- registered_at:
|
335
|
+
datatype: datetime
|
336
|
+
heading: Registered At'
|
337
|
+
|
338
|
+
default_col_defs = Person.default_col_defs(:yaml)
|
339
|
+
assert_equal YAML.load(expected), YAML.load(default_col_defs)
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_default_sorter_for_person
|
343
|
+
assert_equal 'number', Person.default_sorter_datatype('age')
|
344
|
+
assert_equal 'Balance', Person.default_sorter_heading('balance')
|
345
|
+
end
|
346
|
+
|
303
347
|
end
|
304
348
|
|
305
349
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sortablecolumns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Donovan - http://www.bryandonovan.com
|
@@ -9,17 +9,18 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2009-02-19 00:00:00 -08:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: hoe
|
17
|
+
type: :development
|
17
18
|
version_requirement:
|
18
19
|
version_requirements: !ruby/object:Gem::Requirement
|
19
20
|
requirements:
|
20
21
|
- - ">="
|
21
22
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.
|
23
|
+
version: 1.8.3
|
23
24
|
version:
|
24
25
|
description: Sortable HTML tables for Rails
|
25
26
|
email: b.dondo+rubyforge@gmail.com
|
@@ -66,7 +67,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
67
|
requirements: []
|
67
68
|
|
68
69
|
rubyforge_project: sortablecolumns
|
69
|
-
rubygems_version: 1.
|
70
|
+
rubygems_version: 1.3.1
|
70
71
|
signing_key:
|
71
72
|
specification_version: 2
|
72
73
|
summary: Sortable HTML tables for Rails
|