sortablecolumns 0.1.1 → 0.1.2
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 -1
- data/README.txt +20 -0
- data/lib/sortablecolumns.rb +1 -1
- data/lib/sortablecolumns/helpers.rb +16 -0
- data/lib/sortablecolumns/sortablecolumns.rb +13 -1
- data/test/col_def_test_yaml_files/person/dude/dude_report.yml +18 -0
- data/test/col_def_test_yaml_files/person/tacosorter.yml +5 -0
- data/test/sortablecolumns_test.rb +71 -8
- metadata +4 -5
- data/bin/sortable_columns +0 -0
data/History.txt
CHANGED
data/Manifest.txt
CHANGED
data/README.txt
CHANGED
@@ -64,6 +64,10 @@ In model:
|
|
64
64
|
end
|
65
65
|
|
66
66
|
YAML file:
|
67
|
+
|
68
|
+
The YAML file needs to be in an ordered format (i.e., it gets loaded into Ruby as an Array). The order
|
69
|
+
of the columns in the YAML file determines their display order when rendered as HTML.
|
70
|
+
|
67
71
|
-
|
68
72
|
firstname:
|
69
73
|
heading: First
|
@@ -104,6 +108,11 @@ YAML file:
|
|
104
108
|
delimiter: " "
|
105
109
|
unit: £
|
106
110
|
td_class: right
|
111
|
+
-
|
112
|
+
created_at:
|
113
|
+
heading: Create Date
|
114
|
+
datatype: datetime
|
115
|
+
date_format: "%m/%d/%Y at %I:%M%p"
|
107
116
|
-
|
108
117
|
edit:
|
109
118
|
in_resultset: false
|
@@ -129,6 +138,17 @@ YAML file:
|
|
129
138
|
confirm: Are you sure?
|
130
139
|
|
131
140
|
In the link_options, use obj_id to specify that the current object's id field should be used.
|
141
|
+
You can also have extra parameters in the url that are attributes in the resultset.
|
142
|
+
e.g.
|
143
|
+
-
|
144
|
+
print_view:
|
145
|
+
heading: Print
|
146
|
+
link_options:
|
147
|
+
controller: dudes
|
148
|
+
action: print_view
|
149
|
+
person_id: person_id
|
150
|
+
|
151
|
+
...where person_id is a field (method) in the result set that will be invoked.
|
132
152
|
|
133
153
|
In the controller:
|
134
154
|
|
data/lib/sortablecolumns.rb
CHANGED
@@ -32,6 +32,13 @@ module Sortablecolumns
|
|
32
32
|
:unit => unit, :separator => separator, :delimiter => delimiter)
|
33
33
|
end
|
34
34
|
|
35
|
+
if datatype == 'datetime' or datatype == 'date'
|
36
|
+
if txt.respond_to?(:strftime)
|
37
|
+
format = klass.send("#{sorter}_date_format",col)
|
38
|
+
txt = txt.strftime(format)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
35
42
|
do_link = klass.send("#{sorter}_link?",col)
|
36
43
|
|
37
44
|
if do_link
|
@@ -47,6 +54,15 @@ module Sortablecolumns
|
|
47
54
|
extras = link_ops.delete(:extras)
|
48
55
|
txt = link_to(txt, link_ops, extras)
|
49
56
|
else
|
57
|
+
if link_ops.size > 2
|
58
|
+
# cycle through link_ops, other than controller, action, and id,
|
59
|
+
# and check if the option value is a method for this object. If not,
|
60
|
+
# assign the value directly in the url.
|
61
|
+
ops = link_ops.reject{|key,val| key == :controller or key == :action or key == :id}
|
62
|
+
ops.each do |key, val|
|
63
|
+
link_ops[key] = obj.send(val) if obj.respond_to?(val)
|
64
|
+
end
|
65
|
+
end
|
50
66
|
txt = link_to(txt, link_ops)
|
51
67
|
end
|
52
68
|
elsif link_ops[:url]
|
@@ -57,7 +57,6 @@ module ActiveRecord #:nodoc:
|
|
57
57
|
|
58
58
|
def self.#{sorter_name}_yaml_path
|
59
59
|
raise "RAILS_ROOT is not defined" unless defined?(RAILS_ROOT)
|
60
|
-
#klass_name = self.class_name.downcase
|
61
60
|
klass_name = Inflector.underscore(self.class_name)
|
62
61
|
file_name = "#{sorter_name}.yml"
|
63
62
|
if sorter_options[:subclass_name]
|
@@ -172,6 +171,19 @@ module ActiveRecord #:nodoc:
|
|
172
171
|
#{sorter_name}_col_def_hash[col]['unit'] || "$"
|
173
172
|
end
|
174
173
|
|
174
|
+
def self.#{sorter_name}_date_format(col)
|
175
|
+
format = #{sorter_name}_col_def_hash[col]['date_format']
|
176
|
+
unless format
|
177
|
+
datatype = #{sorter_name}_datatype(col)
|
178
|
+
if datatype.downcase == 'datetime'
|
179
|
+
format = "%Y-%m-%d %I:%M:%S"
|
180
|
+
else
|
181
|
+
format = "%Y-%m-%d"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
format
|
185
|
+
end
|
186
|
+
|
175
187
|
def self.#{sorter_name}_print_text(col)
|
176
188
|
#{sorter_name}_col_def_hash[col]['print_text'] || ''
|
177
189
|
end
|
@@ -22,3 +22,21 @@
|
|
22
22
|
wrappers:
|
23
23
|
- truncate: 5
|
24
24
|
- simple_format
|
25
|
+
-
|
26
|
+
print_view:
|
27
|
+
in_resultset: false
|
28
|
+
heading: false
|
29
|
+
print_text: Print
|
30
|
+
link_options:
|
31
|
+
controller: dudes
|
32
|
+
action: print_view
|
33
|
+
person_id: person_id
|
34
|
+
-
|
35
|
+
created_at:
|
36
|
+
heading: Create Date
|
37
|
+
datatype: datetime
|
38
|
+
date_format: "%m/%d/%Y at %I:%M%p"
|
39
|
+
-
|
40
|
+
registered_at:
|
41
|
+
heading: Registration Date
|
42
|
+
datatype: datetime
|
@@ -25,6 +25,8 @@ def setup_db
|
|
25
25
|
t.column :age, :integer
|
26
26
|
t.column :description, :string
|
27
27
|
t.column :balance, :decimal
|
28
|
+
t.column :created_at, :datetime
|
29
|
+
t.column :registered_at, :datetime
|
28
30
|
end
|
29
31
|
end
|
30
32
|
end
|
@@ -57,6 +59,10 @@ class Person < ActiveRecord::Base
|
|
57
59
|
def calories
|
58
60
|
1200
|
59
61
|
end
|
62
|
+
|
63
|
+
def packaged_on
|
64
|
+
Date.new(2008,01,03)
|
65
|
+
end
|
60
66
|
end
|
61
67
|
|
62
68
|
class Dude < Person
|
@@ -66,6 +72,10 @@ class Dude < Person
|
|
66
72
|
def dudename
|
67
73
|
firstname
|
68
74
|
end
|
75
|
+
|
76
|
+
def person_id
|
77
|
+
id
|
78
|
+
end
|
69
79
|
end
|
70
80
|
|
71
81
|
class SubPerson < Person
|
@@ -154,23 +164,34 @@ class SortableColumnsTest< Test::Unit::TestCase
|
|
154
164
|
end
|
155
165
|
|
156
166
|
def test_dude_col_def_hash
|
157
|
-
expected = {"
|
167
|
+
expected = {"registered_at"=>{"heading"=>"Registration Date", "datatype"=>"datetime"},
|
168
|
+
"print_view"=>
|
169
|
+
{"link_options"=>
|
170
|
+
{"action"=>"print_view", "controller"=>"dudes", "person_id"=>"person_id"},
|
171
|
+
"in_resultset"=>false,
|
172
|
+
"heading"=>false,
|
173
|
+
"print_text"=>"Print"},
|
174
|
+
"lastname"=>{"heading"=>"Last", "datatype"=>"string"},
|
158
175
|
"description"=>
|
159
176
|
{"print_options"=>{"wrappers"=>[{"truncate"=>5}, "simple_format"]},
|
160
177
|
"sortable"=>false,
|
161
178
|
"heading"=>"Description",
|
162
179
|
"datatype"=>"string"},
|
163
180
|
"dudename"=>
|
164
|
-
{"link_options"=>{
|
181
|
+
{"link_options"=>{"object_url"=>true},
|
165
182
|
"heading"=>"Dudename",
|
166
183
|
"datatype"=>"string"},
|
167
|
-
"age"=>{"heading"=>"Age", "datatype"=>"number"}
|
184
|
+
"age"=>{"heading"=>"Age", "datatype"=>"number"},
|
185
|
+
"created_at"=>
|
186
|
+
{"date_format"=>"%m/%d/%Y at %I:%M%p",
|
187
|
+
"heading"=>"Create Date",
|
188
|
+
"datatype"=>"datetime"}}
|
168
189
|
assert_equal expected, Dude.dude_report_col_def_hash
|
169
190
|
end
|
170
191
|
|
171
192
|
def test_col_keys_in_order
|
172
193
|
assert_equal ['firstname','lastname','age','description','balance','edit','delete'], Person.mysorter_col_keys_in_order
|
173
|
-
assert_equal ['type','meat','calories'], Person.tacosorter_col_keys_in_order
|
194
|
+
assert_equal ['type','meat','calories','packaged_on'], Person.tacosorter_col_keys_in_order
|
174
195
|
end
|
175
196
|
|
176
197
|
def test_heading
|
@@ -182,10 +203,11 @@ class SortableColumnsTest< Test::Unit::TestCase
|
|
182
203
|
end
|
183
204
|
|
184
205
|
def test_headings_in_order
|
185
|
-
assert_equal
|
186
|
-
|
206
|
+
assert_equal ['Taco Type','Meat','Calories','Packaged On'], Person.tacosorter_headings_in_order
|
207
|
+
#should not include the print field in headings:
|
208
|
+
assert_equal ['Dudename','Last','Age','Description', 'Create Date', 'Registration Date'], Dude.dude_report_headings_in_order
|
187
209
|
#should not include the edit field in headings:
|
188
|
-
assert_equal
|
210
|
+
assert_equal ['First','Last','Age','Description','Balance'], Person.mysorter_headings_in_order
|
189
211
|
end
|
190
212
|
|
191
213
|
def test_datatype
|
@@ -237,6 +259,13 @@ class SortableColumnsTest< Test::Unit::TestCase
|
|
237
259
|
assert_equal ".", Person.mysorter_separator('age')
|
238
260
|
end
|
239
261
|
|
262
|
+
def test_date_format
|
263
|
+
assert_equal "%m/%d/%Y at %I:%M%p" , Dude.dude_report_date_format('created_at')
|
264
|
+
#default:
|
265
|
+
assert_equal "%Y-%m-%d %I:%M:%S", Dude.dude_report_date_format('registered_at')
|
266
|
+
assert_equal "%m/%d/%Y", Person.tacosorter_date_format('packaged_on')
|
267
|
+
end
|
268
|
+
|
240
269
|
def test_default_sort_dir
|
241
270
|
assert_equal "desc", Person.mysorter_default_sort_dir('age')
|
242
271
|
assert_equal 'asc', Person.mysorter_default_sort_dir('firstname')
|
@@ -319,8 +348,10 @@ class SortablecolumnsHelperTest < Test::Unit::TestCase
|
|
319
348
|
@person2 = Person.create(:firstname => "Joe", :lastname => "Shmoe", :age => 54,
|
320
349
|
:balance => '12.00', :description => "Joe rocks")
|
321
350
|
|
351
|
+
created_at = DateTime.new(2008,4,28,9,26)
|
352
|
+
registered_at = DateTime.new(2008,5,1,7,30)
|
322
353
|
@dude = Dude.create(:firstname => "The Dude", :lastname => "Lebowski", :age => 45,
|
323
|
-
:description => "The Dude Speaks")
|
354
|
+
:description => "The Dude Speaks", :created_at => created_at, :registered_at => registered_at)
|
324
355
|
|
325
356
|
@expected_person_row = "<tr><td class=\"left\"><a href=\"http://test.host/people/show/1\">Billy</a></td><td>Jones</td><td class=\"center\">24</td><td class=\"left\"><p>Billy is an awesome guy.\n<br />However, he is also a punk. <a href=\"http://www.google.com\">www.google.com</a></p></td><td class=\"right\">£1 234,57</td><td><a href=\"http://test.host/people/edit/1\">Edit</a></td><td><a href=\"http://test.host/people/destroy/1\" onclick=\"if (confirm('Are you sure?')) { var f = document.createElement('form'); f.style.display = 'none'; this.parentNode.appendChild(f); f.method = 'POST'; f.action = this.href;var m = document.createElement('input'); m.setAttribute('type', 'hidden'); m.setAttribute('name', '_method'); m.setAttribute('value', 'delete'); f.appendChild(m);f.submit(); };return false;\">Delete</a></td></tr>"
|
326
357
|
@expected_person_row_alternate = @expected_person_row.gsub(/<tr>/, "<tr class=\"even\">")
|
@@ -379,6 +410,38 @@ class SortablecolumnsHelperTest < Test::Unit::TestCase
|
|
379
410
|
assert_equal "<td><a href=\"http://test.host/foods/calories?foo=bar\">1200.00</a></td>", @view.print_col(@person, :tacosorter, :calories)
|
380
411
|
end
|
381
412
|
|
413
|
+
def test_print_col_dude_print_view
|
414
|
+
#testing if we can have extra parameters in the url, and those params are attributes in the resultset
|
415
|
+
# e.g.
|
416
|
+
#-
|
417
|
+
#print_view:
|
418
|
+
# heading: Print
|
419
|
+
# link_options:
|
420
|
+
# controller: dudes
|
421
|
+
# action: print_view
|
422
|
+
# person_id: person_id
|
423
|
+
#
|
424
|
+
# Where person_id is a field in the result set (in this test, there's a mock method instead)
|
425
|
+
|
426
|
+
expected = "<td><a href=\"http://test.host/dudes/print_view?person_id=#{@dude.id}\">Print</a></td>"
|
427
|
+
assert_equal expected, @view.print_col(@dude, :dude_report, :print_view)
|
428
|
+
end
|
429
|
+
|
430
|
+
def test_print_col_dude_created_at
|
431
|
+
expected = "<td>04/28/2008 at 09:26AM</td>"
|
432
|
+
assert_equal expected, @view.print_col(@dude, :dude_report, :created_at)
|
433
|
+
end
|
434
|
+
|
435
|
+
def test_print_col_dude_registered_at
|
436
|
+
expected = "<td>2008-05-01 07:30:00</td>"
|
437
|
+
assert_equal expected, @view.print_col(@dude, :dude_report, :registered_at)
|
438
|
+
end
|
439
|
+
|
440
|
+
def test_print_col_person_packaged_on
|
441
|
+
expected = "<td>01/03/2008</td>"
|
442
|
+
assert_equal expected, @view.print_col(@person, :tacosorter, :packaged_on)
|
443
|
+
end
|
444
|
+
|
382
445
|
def test_print_col_edit
|
383
446
|
expected = "<td><a href=\"http://test.host/people/edit/#{@person.id}\">Edit</a></td>"
|
384
447
|
assert_equal expected, @view.print_col(@person, :mysorter, :edit)
|
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.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Donovan - http://www.bryandonovan.com
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-05-01 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -23,8 +23,8 @@ dependencies:
|
|
23
23
|
version:
|
24
24
|
description: Sortable HTML tables for Rails
|
25
25
|
email: b.dondo+rubyforge@gmail.com
|
26
|
-
executables:
|
27
|
-
|
26
|
+
executables: []
|
27
|
+
|
28
28
|
extensions: []
|
29
29
|
|
30
30
|
extra_rdoc_files:
|
@@ -36,7 +36,6 @@ files:
|
|
36
36
|
- Manifest.txt
|
37
37
|
- README.txt
|
38
38
|
- Rakefile
|
39
|
-
- bin/sortable_columns
|
40
39
|
- lib/sortablecolumns.rb
|
41
40
|
- lib/sortablecolumns/helpers.rb
|
42
41
|
- lib/sortablecolumns/sortablecolumns.rb
|
data/bin/sortable_columns
DELETED
File without changes
|