sorting_table_for 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ # CHANGELOG
2
+
3
+ ### Version 0.1.2 _(November 02, 2010)_
4
+
5
+ * Problem with date
6
+
7
+ ### Version 0.1.1 _(November 02, 2010)_
8
+
9
+ * Add documentation
10
+ * Fix a bug with sort options
11
+
12
+ ### Version 0.1.0 _(October 29, 2010)_
13
+
14
+ * Initial commit
@@ -12,11 +12,18 @@ SortingTableFor is a Rails TableBuilder made to easily create table or sort a ta
12
12
 
13
13
  ## Installation
14
14
 
15
- Install with git
15
+ In Rails 3, add this to your Gemfile.
16
+
17
+ gem "sorting_table_for"
18
+
19
+ In Rails 2, add this to your environment.rb file.
20
+
21
+ config.gem "sorting_table_for"
22
+
23
+ Alternatively, you can install it as a plugin.
24
+
25
+ rails plugin install git://github.com/arkownz/sorting_table_for.git
16
26
 
17
- cd your_rails_app
18
- cd vendor/plugins
19
- git clone git://github.com/arkownz/sorting_table_for.git
20
27
 
21
28
  ## Usage
22
29
 
data/TODO ADDED
@@ -0,0 +1,4 @@
1
+ New Version :
2
+
3
+ √ - Add comment in code
4
+ - Add spec for routes
@@ -2,29 +2,46 @@
2
2
 
3
3
  module SortingTableModelScope
4
4
 
5
+ # Include the methods in models
5
6
  def self.included(base)
6
7
  base.extend(SingletonMethods)
7
8
  end
8
9
 
9
10
  module SingletonMethods
10
-
11
+
12
+ # Return a scope of the object with an order
13
+ #
14
+ # === Usage
15
+ #
16
+ # sorting_table(the params) - Sorting by the given parameters
17
+ # sorting_table(the params, column name) - Sort by the column name with direction ascending, if no parameters
18
+ # sorting_table(the params, column name, direction) - Sort by the column name with the given direction, if no parameters
19
+ #
20
+ # === Exemples
21
+ #
22
+ # User.sorting_table(params)
23
+ # User.sorting_table(params, :username)
24
+ # User.sorting_table(params, :username, :desc)
25
+ #
11
26
  def sorting_table(*args)
12
27
  raise ArgumentError, 'sorting_table: Too many arguments (max : 3)' if args.size > 3
13
28
  sort_table_param = get_sorting_table_params(args)
14
29
  return scoped({}) if !sort_table_param and args.size == 1
15
30
  sort, direction = get_sort_and_direction(sort_table_param, args)
16
31
  return scoped({}) if !sort or !valid_column?(sort) or !valid_direction?(direction)
17
- return scoped({ :order => "#{sort} #{direction}" })
32
+ scoped({ :order => "#{sort} #{direction}" })
18
33
  end
19
34
 
20
35
  private
21
-
36
+
37
+ # Return the params for sorting table
22
38
  def get_sorting_table_params(args)
23
- return nil unless args.first.is_a? Hash
39
+ return nil unless args.first.is_a? Hash
24
40
  return nil unless args.first.has_key? SortingTableFor::TableBuilder.params_sort_table.to_s
25
41
  args.first[SortingTableFor::TableBuilder.params_sort_table.to_s]
26
42
  end
27
-
43
+
44
+ # Parse the params and return the column name and the direction
28
45
  def get_sort_and_direction(sort_table_param, args)
29
46
  if sort_table_param
30
47
  key = sort_table_param.keys.first rescue nil
@@ -37,10 +54,12 @@ module SortingTableModelScope
37
54
  return args[1], args[2]
38
55
  end
39
56
 
57
+ # Return true if the column name exist
40
58
  def valid_column?(column)
41
59
  column_names.include? column.to_s.downcase
42
60
  end
43
61
 
62
+ # Return true if the direction exist
44
63
  def valid_direction?(direction)
45
64
  %[asc desc].include? direction.to_s.downcase
46
65
  end
@@ -6,6 +6,24 @@ require 'sorting_table_for/tools'
6
6
 
7
7
  module SortingTableFor
8
8
 
9
+ # Method sorting_table_for with builder => SortingTableFor::TableBuilder
10
+ #
11
+ # # Exemples :
12
+ # <% sorting_table_for @users do |table| %>
13
+ # <% end %>
14
+ #
15
+ # <% sorting_table_for @users do |table| %>
16
+ # <%= table.headers %>
17
+ # <%= table.columns %>
18
+ # <% end %>
19
+ #
20
+ # === Options
21
+ #
22
+ # * :builder - Set a table builder (default: SortingTableFor::TableBuilder)
23
+ # * :html - Set html options (id, class, ...)
24
+ # * :remote_link - To set actions link with ajax (true or false)
25
+ # * :remote_sort - To set link for sorting with ajax (true of false)
26
+ #
9
27
  def sorting_table_for(object_or_array, *args)
10
28
  raise ArgumentError, 'Missing block' unless block_given?
11
29
  options = args.extract_options!
@@ -4,10 +4,13 @@ module SortingTableFor
4
4
  module I18n
5
5
  class << self
6
6
 
7
+ # Set options to create a default scope
7
8
  def set_options(params, model_name, namespace)
8
9
  @params, @model_name, @namespace = params, model_name, namespace
9
10
  end
10
11
 
12
+ # Translate
13
+ # Add a default scope if option scope isn't defined
11
14
  def translate(attribute, options = {}, action_header = false)
12
15
  if !options.has_key? :scope
13
16
  options[:scope] = create_scope
@@ -18,7 +21,8 @@ module SortingTableFor
18
21
  alias :t :translate
19
22
 
20
23
  private
21
-
24
+
25
+ # Return an array with the scope based on option: SortingTableFor::TableBuilder.i18n_default_scope
22
26
  def create_scope
23
27
  return TableBuilder.i18n_default_scope.collect do |scope_value|
24
28
  case scope_value.to_sym
@@ -33,8 +33,101 @@ module SortingTableFor
33
33
  @lines = []
34
34
  end
35
35
 
36
- ## Headers
37
-
36
+ # Create a header with the name of the columns (th) around thead and tr.
37
+ # It can be called with or without a block, or with a list of columns.
38
+ # By default it will add the default actions (edit, delete).
39
+ # Also by default it will add a link to sort to the column.
40
+ # These two exemples are equivalent:
41
+ #
42
+ # # With a block:
43
+ # <% sorting_table_for @users do |table| %>
44
+ # <%= table.headers do %>
45
+ # <%= table.header :username %>
46
+ # <%= table.header :firstname %>
47
+ # <% end %>
48
+ # <% end %>
49
+ #
50
+ # # With a list:
51
+ # <% sorting_table_for @users do |table| %>
52
+ # <%= table.headers :username, :firstname %>
53
+ # <% end %>
54
+ #
55
+ # # Output:
56
+ # <table class='sorting_table_for'>
57
+ # <thead>
58
+ # <tr>
59
+ # <th class='cur-sort-not'><a href='/my_link?table_sort[username]=asc'>...</a></th>
60
+ # <th class='cur-sort-not'><a href='/my_link?table_sort[firstname]=asc'>...</a></th>
61
+ # <th>Edit</th>
62
+ # <th>Delete</th>
63
+ # </tr>
64
+ # </thead>
65
+ # </table>
66
+ #
67
+ # === Quick Headers
68
+ #
69
+ # When called without a block or a list, the headers are rendered for each column in
70
+ # the model's database table and the default actions (edit, delete), and the links to sort.
71
+ #
72
+ # <% sorting_table_for @users do |table| %>
73
+ # <%= table.headers %>
74
+ # <% end %>
75
+ #
76
+ # === Options
77
+ #
78
+ # All options are passed down to the fieldser HTML attribtues (id, class, title, ...) expect
79
+ # for option sort.
80
+ #
81
+ # # Html option:
82
+ # <% sorting_table_for @users do |table| do %>
83
+ # <%= table.headers :username, :firstname, :html => { :class => 'my_class', :id => 'my_id' }
84
+ # <% end %>
85
+ #
86
+ # # Sort option:
87
+ # <% sorting_table_for @users do |table| do %>
88
+ # <%= table.headers :sort => false %>
89
+ # <% end %>
90
+ #
91
+ # === I18n
92
+ #
93
+ # For each column contained in the model's database table, the name is set with the I18n translation.
94
+ # The translation are scoped by option 'i18n_default_scope' defined in your options.
95
+ #
96
+ # # Exemple of I18n options for header:
97
+ # SortingTableFor::TableBuilder.i18n_default_scope = [:controller, :action]
98
+ #
99
+ # # Ouput:
100
+ # I18n.t(:username, :scope => [:current_controller, :current_action]) => en.current_controller.current_action.username
101
+ #
102
+ # === Actions
103
+ #
104
+ # The option 'default_actions' contained the actions to add by default to the table. The header's actions
105
+ # are not sortable. The name of action is set with I18n translation.
106
+ # It's possible to add a value in the scope for header by option 'i18n_add_header_action_scope'
107
+ #
108
+ # # Exemple of default_actions:
109
+ # SortingTableFor::TableBuilder.default_actions = [:edit]
110
+ # SortingTableFor::TableBuilder.i18n_add_header_action_scope = :header
111
+ #
112
+ # # Ouput:
113
+ # I18n.t(:edit, :scope => [:current_controller, :current_action, :header]) => en.current_controller.current_action.header.edit
114
+ #
115
+ # === Sorting
116
+ #
117
+ # The link for sorting is set if the column is contained in the model's database table. the link for sorting
118
+ # is set with the current url, the builder adds a param 'table_sort'.
119
+ #
120
+ # # Exemple for column username:
121
+ # current url: /my_link
122
+ # param sort: /my_link?table_sort[username]=asc
123
+ #
124
+ # the name of the param is set by option: TableSortingFor::TableBuilder.params_sort_table
125
+ #
126
+ # === Values
127
+ #
128
+ # the values given to headers could be anything. Only the symbols are set with I18n translation.
129
+ # If you give other types (string, image, ...) there won't have sorting and I18n translation.
130
+ #
38
131
  def headers(*args, &block)
39
132
  column_options, html_options = get_column_and_html_options( args.extract_options! )
40
133
  if block_given?
@@ -46,6 +139,45 @@ module SortingTableFor
46
139
  render_thead
47
140
  end
48
141
 
142
+ # Create a cell of header, to have more control.
143
+ # It can be called with or without a block.
144
+ # The three exemples are equivalent:
145
+ #
146
+ # # Without block (I18n and sorting)
147
+ # <% sorting_table_for @users do |table| %>
148
+ # <%= table.headers do %>
149
+ # <%= table.header :username %>
150
+ # <% end %>
151
+ # <% end %>
152
+ #
153
+ # # With string (no I18n and no sorting)
154
+ # <% sorting_table_for @users do |table| %>
155
+ # <%= table.headers do %>
156
+ # <%= table.header 'hello_my_header' %>
157
+ # <% end %>
158
+ # <% end %>
159
+ #
160
+ # # With a block and image (no I18n and no sorting)
161
+ # <% sorting_table_for @users do |table| %>
162
+ # <%= table.headers do %>
163
+ # <%= table.header do %>
164
+ # <%= image_tag('rails.png') %>
165
+ # <% end %>
166
+ # <% end %>
167
+ # <% end %>
168
+ #
169
+ # === Options
170
+ #
171
+ # * :sort - true of false to add or not sorting
172
+ # * :html - Hash options: class, id, ...
173
+ #
174
+ # === Values
175
+ #
176
+ # the values given to header can be anything. Only the symbols are set with I18n translation.
177
+ # If you give other types (string, image, ...) there won't have sorting and I18n translation.
178
+ #
179
+ # With block there won't have sorting and translation.
180
+ #
49
181
  def header(*args, &block)
50
182
  if block_given?
51
183
  block = @@template.capture(&block)
@@ -56,8 +188,137 @@ module SortingTableFor
56
188
  nil
57
189
  end
58
190
 
59
- ## Columns
60
-
191
+ # Create the content of table with the values of collection (td) around tbody and tr.
192
+ # It can be called with or without a block, or with a list of columns.
193
+ # By default it will add the default actions (edit, delete).
194
+ # The method columns return the current object of the collection.
195
+ # These three exemples are equivalent:
196
+ #
197
+ # # With a list:
198
+ # <% sorting_table_for @users do |table| %>
199
+ # <%= table.columns :username, :firstname %>
200
+ # <% end %>
201
+ #
202
+ # # With a block:
203
+ # <% sorting_table_for @users do |table| %>
204
+ # <%= table.columns do %>
205
+ # <%= table.column :username %>
206
+ # <%= table.column :firstname %>
207
+ # <% end %>
208
+ # <% end %>
209
+ #
210
+ # # With a block and current object:
211
+ # <% sorting_table_for @users do |table| %>
212
+ # <%= table.columns do |user| %>
213
+ # <%= table.column user.username %>
214
+ # <%= table.column user.firstname %>
215
+ # <% end %>
216
+ # <% end %>
217
+ #
218
+ # # Output:
219
+ # <table class='sorting_table_for'>
220
+ # <tbody>
221
+ # <tr>
222
+ # <td>...</td>
223
+ # <td>...</td>
224
+ # <td><a href='/users/1/edit'>Edit<a></td>
225
+ # <td><a href='/users/1'>Delete</a></td>
226
+ # </tr>
227
+ # ...
228
+ # </tbody>
229
+ # </table>
230
+ #
231
+ # === Quick Columns
232
+ #
233
+ # When called without a block or a list, the columns are rendered for each column in
234
+ # the model's database table and the default actions (edit, delete).
235
+ #
236
+ # <% sorting_table_for @users do |table| %>
237
+ # <%= table.columns %>
238
+ # <% end %>
239
+ #
240
+ # === Options
241
+ #
242
+ # * :html - Hash options: class, id, ...
243
+ # * :actions - Set actions to render
244
+ # * :only - Columns only to render
245
+ # * :except - Columns to not render
246
+ #
247
+ # # Exemples:
248
+ # <% sorting_table_for @users do |table| %>
249
+ # <%= table.columns :username, :actions => [:edit, :delete] %>
250
+ # <% end %>
251
+ #
252
+ # <% sorting_table for @users do |table| %>
253
+ # <%= table.columns :except => [:created_at, :updated_at] %>
254
+ # <% end %>
255
+ #
256
+ # === I18n
257
+ #
258
+ # For each action, the name is set with the I18n translation.
259
+ #
260
+ # # Exemple of i18n_default_scope:
261
+ # SortingTableFor::TableBuilder.i18n_default_scope = [:controller, :action]
262
+ #
263
+ # # Ouput:
264
+ # I18n.t(:edit, :scope => [:current_controller, :current_action]) => en.current_controller.current_action.edit
265
+ #
266
+ # === Actions
267
+ #
268
+ # The option 'default_actions' contains the actions to add by default to the table. The link to actions
269
+ # is set by the collection sent to the method sorting_table_for.
270
+ # The name of action is set with I18n translation.
271
+ #
272
+ # # Exemple of default_actions:
273
+ # SortingTableFor::TableBuilder.default_actions = [:edit]
274
+ #
275
+ # # Ouput:
276
+ # link_to( I18n.t(:edit, :scope => [:current_controller, :current_action]), [:edit, user]) => /users/1/edit
277
+ #
278
+ # For action :delete the builder set a confirm message with I18n translation.
279
+ #
280
+ # # the I18n confirm message:
281
+ # I18n.t(:confirm_delete, :scope => [:current_controller, :current_action])
282
+ #
283
+ # === Total entries
284
+ #
285
+ # The first tr of the columns are the number of results in the collection. The line appears if
286
+ # option 'show_total_entries' is set to true.
287
+ #
288
+ # # Exemple of option:
289
+ # SortingTableFor::TableBuilder.show_total_entries = true
290
+ #
291
+ # # Exemple:
292
+ # <% sorting_table_for @users do |table| %>
293
+ # <%= table.columns :username, :firstname %>
294
+ # <% end %>
295
+ #
296
+ # # Ouput:
297
+ # <table class='sorting_table_for'>
298
+ # <tbody>
299
+ # <tr>
300
+ # <td colspan='2' class='total-entries'>Total Entries: 42</td>
301
+ # </tr>
302
+ # <tr>
303
+ # <td>...</td>
304
+ # <td>...</td>
305
+ # </tr>
306
+ # ...
307
+ # </tbody>
308
+ # </table>
309
+ #
310
+ # A colspan is added by default with the number of columns.
311
+ # Total entries are compatible with the plugin 'will_paginate'.
312
+ # The total entries text if defined by I18n translation.
313
+ #
314
+ # # I18n translation:
315
+ # I18n.t(:total_entries, :scope => :sorting_table_for, :value => total_entries)
316
+ #
317
+ # === Values
318
+ #
319
+ # the values given to columns can be anything. Only the symbols are the values of the collection.
320
+ # If you give other types (string, image, ...) there won't be interpreted.
321
+ #
61
322
  def columns(*args, &block)
62
323
  column_options, html_options = get_column_and_html_options( args.extract_options! )
63
324
  @collection.each do |object|
@@ -71,7 +332,58 @@ module SortingTableFor
71
332
  end
72
333
  render_tbody
73
334
  end
74
-
335
+
336
+ # Create a cell of column, to have more control.
337
+ # It can be called with or without a block.
338
+ # The three exemples are equivalent:
339
+ #
340
+ # # Without block
341
+ # <% sorting_table_for @users do |table| %>
342
+ # <%= table.columns do %>
343
+ # <%= table.column :username %>
344
+ # <% end %>
345
+ # <% end %>
346
+ #
347
+ # # With current object
348
+ # <% sorting_table_for @users do |table| %>
349
+ # <%= table.columns do |user| %>
350
+ # <%= table.column user.username %>
351
+ # <% end %>
352
+ # <% end %>
353
+ #
354
+ # # With a block and current object
355
+ # <% sorting_table_for @users do |table| %>
356
+ # <%= table.columns do |user| %>
357
+ # <%= table.column do %>
358
+ # <%= user.username %>
359
+ # <% end %>
360
+ # <% end %>
361
+ # <% end %>
362
+ #
363
+ # === Options
364
+ #
365
+ # * :html - Hash options: class, id, ...
366
+ # * :as - Force to render a type (:date, :time, :currency)
367
+ # * :format - Set the I18n localization format for :date or :time (:default, :short, ...)
368
+ # * :action - Set an action
369
+ #
370
+ # # Exemple:
371
+ # <% sorting_table_for @users do |table| %>
372
+ # <%= table.colums do |user| %>
373
+ # <%= table.column :username, :html => { :class => 'my_class', :id => 'my_id' }
374
+ # <%= table.column user.username, :action => :show %>
375
+ # <%= table.column user.created_at, :as => :date, :format => :short %>
376
+ # <%= table.column :action => :edit %>
377
+ # <% end %>
378
+ # <% end %>
379
+ #
380
+ # === Values
381
+ #
382
+ # the values given to column can be anything. Only the symbols are set with I18n translation.
383
+ # If you give other types (string, image, ...) there won't be interpreted.
384
+ #
385
+ # With block the value won't be interpreted.
386
+ #
75
387
  def column(*args, &block)
76
388
  if block_given?
77
389
  block = @@template.capture(&block)
@@ -84,20 +396,22 @@ module SortingTableFor
84
396
 
85
397
  protected
86
398
 
87
- # This function is a copy from Formtastic: http://github.com/justinfrench/formtastic
399
+ # Return the name of the model
88
400
  def model_name(object)
89
401
  object.present? ? object.class.name : object.to_s.classify
90
402
  end
91
403
 
92
404
  private
93
-
405
+
406
+ # Return the balise thead and its content
94
407
  def render_thead
95
408
  if @header_line
96
409
  return Tools::html_safe(content_tag(:thead, @header_line.render_line))
97
410
  end
98
411
  ''
99
412
  end
100
-
413
+
414
+ # Return the balise tbody and its content
101
415
  def render_tbody
102
416
  if @lines and @lines.size > 0
103
417
  return Tools::html_safe(content_tag(:tbody, render_total_entries + Tools::html_safe(@lines.collect { |line| line.render_line }.join)))
@@ -105,10 +419,14 @@ module SortingTableFor
105
419
  ''
106
420
  end
107
421
 
422
+ # Set default global options
423
+ # Set sort to true if the value isn't defined in options
108
424
  def set_default_global_options
109
- @@options[:sort] = true unless @@options.has_key? :sort
425
+ @@options[:sort] = true if !defined?(@@options[:sort]) or !@@options.has_key? :sort
110
426
  end
111
427
 
428
+ # Calculate the total entries
429
+ # Return a tr and td with a colspan of total entries
112
430
  def render_total_entries
113
431
  if self.show_total_entries
114
432
  total_entries = @collection.total_entries rescue @collection.size
@@ -117,18 +435,13 @@ module SortingTableFor
117
435
  ''
118
436
  end
119
437
 
438
+ # Return options and html options
120
439
  def get_column_and_html_options(options)
121
440
  return options, options.delete(:html) || {}
122
441
  end
123
442
 
124
443
  end
125
444
 
126
- ##
127
- ## Format Lines
128
- ##
129
- ##
130
- ##
131
-
132
445
  class FormatLine < TableBuilder
133
446
 
134
447
  def initialize(args, column_options = {}, html_options = {}, object = nil, type = nil)
@@ -140,10 +453,13 @@ module SortingTableFor
140
453
  end
141
454
  end
142
455
 
143
- def add_cell(object, args, type =nil, block = nil)
456
+ # Create a new cell with the class FormatCell
457
+ # Add the object in @cells
458
+ def add_cell(object, args, type = nil, block = nil)
144
459
  @cells << FormatCell.new(object, args, type, block)
145
460
  end
146
461
 
462
+ # Return a tr line based on the type (:thead or :tbody)
147
463
  def render_line
148
464
  if @type == :thead
149
465
  header = content_tag(:tr, Tools::html_safe(@cells.collect { |cell| cell.render_cell_thead }.join), @html_options)
@@ -152,17 +468,19 @@ module SortingTableFor
152
468
  end
153
469
  end
154
470
 
471
+ # Return a string with the total of cells
155
472
  def total_cells
156
473
  @cells.size.to_s
157
474
  end
158
475
 
159
476
  protected
160
477
 
161
- # This function is a copy from Formtastic: http://github.com/justinfrench/formtastic
478
+ # Return each column in the model's database table
162
479
  def content_columns
163
480
  model_name(@object).constantize.content_columns.collect { |c| c.name.to_sym }.compact rescue []
164
481
  end
165
482
 
483
+ # Return true if the column is in the model's database table
166
484
  def model_have_column?(column)
167
485
  model_name(@object).constantize.content_columns.each do |model_column|
168
486
  return true if model_column.name == column.to_s
@@ -170,12 +488,16 @@ module SortingTableFor
170
488
  false
171
489
  end
172
490
 
491
+ # Return true if the column is in the model's database table
173
492
  def can_sort_column?(column)
174
493
  model_have_column?(column)
175
494
  end
176
495
 
177
496
  private
178
497
 
498
+ # Call after headers or columns with no attributes (table.headers)
499
+ # Create all the cells based on each column in the model's database table
500
+ # Create cell's actions based on option default_actions or on actions given (:actions => [:edit])
179
501
  def create_cells
180
502
  @attributes.each { |ask| add_cell(@object, ask) }
181
503
  if @args.empty?
@@ -185,6 +507,7 @@ module SortingTableFor
185
507
  end
186
508
  end
187
509
 
510
+ # Return an Array of all actions given to headers or columns (:actions => [:edit, :delete])
188
511
  def get_column_actions
189
512
  if @column_options.has_key? :actions
190
513
  if @column_options[:actions].is_a?(Array)
@@ -196,6 +519,7 @@ module SortingTableFor
196
519
  []
197
520
  end
198
521
 
522
+ # Return an Array of the columns based on options :only or :except
199
523
  def get_columns
200
524
  if @column_options.has_key? :only
201
525
  return @column_options[:only] if @column_options[:only].is_a?(Array)
@@ -210,12 +534,6 @@ module SortingTableFor
210
534
 
211
535
  end
212
536
 
213
- ##
214
- ## Format Cells
215
- ##
216
- ##
217
- ##
218
-
219
537
  class FormatCell < FormatLine
220
538
 
221
539
  def initialize(object, args, type = nil, block = nil)
@@ -234,6 +552,7 @@ module SortingTableFor
234
552
  @can_sort = true if @options and @options[:sort] and can_sort_column?(@ask)
235
553
  end
236
554
 
555
+ # Return a td with the formated value or action for columns
237
556
  def render_cell_tbody
238
557
  if @type == :action
239
558
  cell_value = action_link_to(@ask)
@@ -246,6 +565,7 @@ module SortingTableFor
246
565
  content_tag(:td, cell_value, @html_options)
247
566
  end
248
567
 
568
+ # Return a td with the formated value or action for headers
249
569
  def render_cell_thead
250
570
  if @ask
251
571
  cell_value = (@ask.is_a?(Symbol)) ? I18n.t(@ask, {}, true) : @ask
@@ -262,16 +582,23 @@ module SortingTableFor
262
582
 
263
583
  private
264
584
 
585
+ # Return options and html options for a cell
265
586
  def get_cell_and_html_options(options)
266
587
  return options, options.delete(:html) || {}
267
588
  end
268
589
 
590
+ # Set default options for cell
591
+ # Set an empty hash if no html options
592
+ # Set an empty hash if no options
593
+ # Set sort to true if no options sort
269
594
  def set_default_options
270
595
  @html_options = {} unless defined? @html_options
271
596
  @options = {} unless defined? @options
272
- @options[:sort] = @@options[:sort] or true if !@options.has_key? :sort
597
+ @options[:sort] = @@options[:sort] if !@options.has_key? :sort
273
598
  end
274
599
 
600
+ # Create the link for actions
601
+ # Set the I18n translation or the given block for the link's name
275
602
  def action_link_to(action, block = nil)
276
603
  object_or_array = @@object_or_array.clone
277
604
  object_or_array.push @object
@@ -286,10 +613,14 @@ module SortingTableFor
286
613
  end
287
614
  end
288
615
 
616
+ # Create sorting link
289
617
  def sort_link_to(name)
290
618
  create_link_to(name, sort_url, @@options[:sort_remote])
291
619
  end
292
620
 
621
+ # Create the link based on object
622
+ # Set an ajax link if option link_remote is set to true
623
+ # Compatible with rails 2 and 3.
293
624
  def create_link_to(block, url, remote, method = nil, confirm = nil)
294
625
  if remote and Tools::rails3?
295
626
  return @@template.link_to(block, url, :method => method, :confirm => confirm, :remote => true)
@@ -300,12 +631,17 @@ module SortingTableFor
300
631
  @@template.link_to(block, url, :method => method, :confirm => confirm)
301
632
  end
302
633
 
634
+ # Return a string with html class of sorting for headers
635
+ # The html class is based on option: SortingTableFor::TableBuilder.html_sorting_class
303
636
  def sorting_html_class
304
637
  return TableBuilder.html_sorting_class.first if current_sorting.nil?
305
638
  return TableBuilder.html_sorting_class.second if current_sorting == :asc
306
639
  TableBuilder.html_sorting_class.third
307
640
  end
308
641
 
642
+ # Return an url for sorting
643
+ # Add the param sorting_table[name]=direction to the url
644
+ # Add the default direction: :asc
309
645
  def sort_url
310
646
  url_params = @@params.clone
311
647
  if url_params.has_key? TableBuilder.params_sort_table
@@ -319,6 +655,7 @@ module SortingTableFor
319
655
  @@template.url_for(url_params)
320
656
  end
321
657
 
658
+ # Return a symbol of the current sorting (:asc, :desc, nil)
322
659
  def current_sorting
323
660
  if @@params.has_key? TableBuilder.params_sort_table and @@params[TableBuilder.params_sort_table].has_key? @ask
324
661
  return @@params[TableBuilder.params_sort_table][@ask].to_sym
@@ -326,12 +663,14 @@ module SortingTableFor
326
663
  nil
327
664
  end
328
665
 
666
+ # Return a symbol, the inverse of the current sorting
329
667
  def inverse_sorting
330
668
  return :asc if current_sorting.nil?
331
669
  return :desc if current_sorting == :asc
332
670
  :asc
333
671
  end
334
672
 
673
+ # Return the formated cell's value
335
674
  def format_cell_value(value, attribute = nil)
336
675
  unless (ret_value = format_cell_value_as_ask(value)).nil?
337
676
  return ret_value
@@ -339,6 +678,7 @@ module SortingTableFor
339
678
  format_cell_value_as_type(value, attribute)
340
679
  end
341
680
 
681
+ # Format the value if option :as is set
342
682
  def format_cell_value_as_ask(value)
343
683
  return nil if !@options or @options.empty? or !@options.has_key?(:as)
344
684
  return case @options[:as]
@@ -349,6 +689,7 @@ module SortingTableFor
349
689
  end
350
690
  end
351
691
 
692
+ # Format the value based on value's type
352
693
  def format_cell_value_as_type(value, attribute)
353
694
  if value.is_a?(Time) or value.is_a?(Date)
354
695
  return ::I18n.l(value, :format => @options[:format] || TableBuilder.i18n_default_format_date)
@@ -26,7 +26,7 @@ describe SortingTableFor, :type => :helper do
26
26
  html.should have_comp_tag("th", :count => 11)
27
27
  end
28
28
  end
29
-
29
+
30
30
  it "should add sorting class on th" do
31
31
  helper.sorting_table_for(@users) do |table|
32
32
  table.headers.should have_comp_tag("th[class='cur-sort-not']", :count => 9)
@@ -181,7 +181,7 @@ describe SortingTableFor, :type => :helper do
181
181
  table.header :price
182
182
  end
183
183
  html.should_not have_comp_tag("th[class=cur-sort-not]")
184
- end
184
+ end
185
185
  end
186
186
 
187
187
  it "should not sort on select columns" do
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sorting_table_for
3
3
  version: !ruby/object:Gem::Version
4
- hash: 27
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
7
  - 1
9
- - 0
10
- version: 0.1.0
8
+ - 2
9
+ version: 0.1.2
11
10
  platform: ruby
12
11
  authors:
13
12
  - Thomas Floch
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-10-30 00:00:00 +02:00
17
+ date: 2010-11-02 00:00:00 +01:00
19
18
  default_executable:
20
19
  dependencies: []
21
20
 
@@ -25,8 +24,8 @@ executables: []
25
24
 
26
25
  extensions: []
27
26
 
28
- extra_rdoc_files: []
29
-
27
+ extra_rdoc_files:
28
+ - README.mdown
30
29
  files:
31
30
  - lib/model/sorting_table_model_scope.rb
32
31
  - lib/sorting_table_for/i18n.rb
@@ -45,17 +44,19 @@ files:
45
44
  - spec/locales/test_rails3.yml
46
45
  - spec/model/sorting_table_model_scope_spec.rb
47
46
  - spec/spec_helper.rb
47
+ - CHANGELOG.mdown
48
48
  - MIT-LICENSE
49
49
  - Rakefile
50
50
  - README.mdown
51
+ - TODO
51
52
  - init.rb
52
53
  has_rdoc: true
53
54
  homepage: http://github.com/arkownz/sorting_table_for
54
55
  licenses: []
55
56
 
56
57
  post_install_message:
57
- rdoc_options: []
58
-
58
+ rdoc_options:
59
+ - --charset=UTF-8
59
60
  require_paths:
60
61
  - lib
61
62
  required_ruby_version: !ruby/object:Gem::Requirement
@@ -63,7 +64,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
63
64
  requirements:
64
65
  - - ">="
65
66
  - !ruby/object:Gem::Version
66
- hash: 3
67
67
  segments:
68
68
  - 0
69
69
  version: "0"
@@ -72,7 +72,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- hash: 19
76
75
  segments:
77
76
  - 1
78
77
  - 3