datagrid 1.6.3 → 1.8.0

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.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -1
  3. data/Readme.markdown +11 -11
  4. data/app/views/datagrid/_enum_checkboxes.html.erb +2 -2
  5. data/app/views/datagrid/_form.html.erb +2 -3
  6. data/app/views/datagrid/_order_for.html.erb +2 -2
  7. data/app/views/datagrid/_range_filter.html.erb +3 -3
  8. data/datagrid.gemspec +10 -14
  9. data/lib/datagrid/active_model.rb +25 -29
  10. data/lib/datagrid/column_names_attribute.rb +11 -9
  11. data/lib/datagrid/columns/column.rb +10 -8
  12. data/lib/datagrid/columns.rb +142 -176
  13. data/lib/datagrid/configuration.rb +6 -1
  14. data/lib/datagrid/core.rb +63 -30
  15. data/lib/datagrid/drivers/abstract_driver.rb +2 -1
  16. data/lib/datagrid/drivers/active_record.rb +4 -3
  17. data/lib/datagrid/drivers/array.rb +2 -1
  18. data/lib/datagrid/drivers/mongo_mapper.rb +2 -1
  19. data/lib/datagrid/drivers/mongoid.rb +3 -2
  20. data/lib/datagrid/drivers/sequel.rb +8 -3
  21. data/lib/datagrid/drivers.rb +2 -1
  22. data/lib/datagrid/engine.rb +3 -2
  23. data/lib/datagrid/filters/base_filter.rb +8 -4
  24. data/lib/datagrid/filters/boolean_filter.rb +2 -1
  25. data/lib/datagrid/filters/composite_filters.rb +8 -12
  26. data/lib/datagrid/filters/dynamic_filter.rb +1 -1
  27. data/lib/datagrid/filters/extended_boolean_filter.rb +2 -1
  28. data/lib/datagrid/filters/select_options.rb +34 -1
  29. data/lib/datagrid/filters.rb +52 -30
  30. data/lib/datagrid/form_builder.rb +53 -35
  31. data/lib/datagrid/helper.rb +43 -61
  32. data/lib/datagrid/locale/en.yml +5 -1
  33. data/lib/datagrid/ordering.rb +15 -15
  34. data/lib/datagrid/renderer.rb +71 -15
  35. data/lib/datagrid/rspec.rb +4 -4
  36. data/lib/datagrid/scaffold.rb +1 -1
  37. data/lib/datagrid/utils.rb +1 -0
  38. data/lib/datagrid/version.rb +1 -1
  39. data/lib/datagrid.rb +2 -1
  40. data/templates/grid.rb.erb +1 -1
  41. data/templates/index.html.erb +1 -1
  42. metadata +8 -9
  43. data/lib/datagrid/filters/boolean_enum_filter.rb +0 -17
@@ -5,7 +5,6 @@ module Datagrid
5
5
 
6
6
  require "datagrid/filters/base_filter"
7
7
  require "datagrid/filters/enum_filter"
8
- require "datagrid/filters/boolean_enum_filter"
9
8
  require "datagrid/filters/extended_boolean_filter"
10
9
  require "datagrid/filters/boolean_filter"
11
10
  require "datagrid/filters/date_filter"
@@ -18,24 +17,23 @@ module Datagrid
18
17
  require "datagrid/filters/dynamic_filter"
19
18
 
20
19
  FILTER_TYPES = {
21
- :date => Filters::DateFilter,
22
- :datetime => Filters::DateTimeFilter,
23
- :string => Filters::StringFilter,
24
- :default => Filters::DefaultFilter,
25
- :eboolean => Filters::BooleanEnumFilter ,
26
- :xboolean => Filters::ExtendedBooleanFilter ,
27
- :boolean => Filters::BooleanFilter ,
28
- :integer => Filters::IntegerFilter,
29
- :enum => Filters::EnumFilter,
30
- :float => Filters::FloatFilter,
31
- :dynamic => Filters::DynamicFilter
20
+ date: Filters::DateFilter,
21
+ datetime: Filters::DateTimeFilter,
22
+ string: Filters::StringFilter,
23
+ default: Filters::DefaultFilter,
24
+ xboolean: Filters::ExtendedBooleanFilter ,
25
+ boolean: Filters::BooleanFilter ,
26
+ integer: Filters::IntegerFilter,
27
+ enum: Filters::EnumFilter,
28
+ float: Filters::FloatFilter,
29
+ dynamic: Filters::DynamicFilter
32
30
  }
33
31
 
34
- class DefaultFilterScope
35
- end
32
+ DEFAULT_FILTER_BLOCK = Object.new
36
33
 
37
- def self.included(base) #:nodoc:
38
- base.extend ClassMethods
34
+ # @!visibility private
35
+ def self.included(base)
36
+ base.extend ClassMethods
39
37
  base.class_eval do
40
38
 
41
39
  include Datagrid::Core
@@ -44,14 +42,19 @@ module Datagrid
44
42
  self.filters_array = []
45
43
 
46
44
  end
47
- base.send :include, InstanceMethods
48
- end # self.included
45
+ base.include InstanceMethods
46
+ end
49
47
 
50
48
  module ClassMethods
51
49
 
52
50
  # Returns filter definition object by name
53
51
  def filter_by_name(attribute)
54
- return attribute if attribute.is_a?(Datagrid::Filters::BaseFilter)
52
+ if attribute.is_a?(Datagrid::Filters::BaseFilter)
53
+ unless ancestors.include?(attribute.grid_class)
54
+ raise "#{attribute.grid_class}##{attribute.name} filter doen't belong to #{self.class}"
55
+ end
56
+ return attribute
57
+ end
55
58
  self.filters.find do |filter|
56
59
  filter.name == attribute.to_sym
57
60
  end
@@ -90,7 +93,8 @@ module Datagrid
90
93
  # Accepts a block or a symbol with an instance method name
91
94
  # * <tt>:unless</tt> - specify the reverse condition when the filter can be dislayed and used.
92
95
  # Accepts a block or a symbol with an instance method name
93
- # * <tt>:input_options</tt> - options passed when rendering html input tag attributes
96
+ # * <tt>:input_options</tt> - options passed when rendering html input tag attributes.
97
+ # Use <tt>input_options.type</tt> to control input type including <tt>textarea</tt>.
94
98
  # * <tt>:label_options</tt> - options passed when rendering html label tag attributes
95
99
  #
96
100
  # See: https://github.com/bogdan/datagrid/wiki/Filters for examples
@@ -108,7 +112,7 @@ module Datagrid
108
112
  end
109
113
 
110
114
  def default_filter
111
- DefaultFilterScope.new
115
+ DEFAULT_FILTER_BLOCK
112
116
  end
113
117
 
114
118
  def inspect
@@ -132,11 +136,12 @@ module Datagrid
132
136
  "#{filter.name}: #{filter.type}"
133
137
  end.join(", ")
134
138
  end
135
- end # ClassMethods
139
+ end
136
140
 
137
141
  module InstanceMethods
138
142
 
139
- def initialize(*args, &block) # :nodoc:
143
+ # @!visibility private
144
+ def initialize(*args, &block)
140
145
  self.filters_array = self.class.filters_array.clone
141
146
  self.filters_array.each do |filter|
142
147
  self[filter.name] = filter.default(self)
@@ -144,7 +149,8 @@ module Datagrid
144
149
  super(*args, &block)
145
150
  end
146
151
 
147
- def assets # :nodoc:
152
+ # @!visibility private
153
+ def assets
148
154
  apply_filters(super, filters)
149
155
  end
150
156
 
@@ -178,11 +184,18 @@ module Datagrid
178
184
  # Returns select options for specific filter or filter name
179
185
  # If given filter doesn't support select options raises `ArgumentError`
180
186
  def select_options(filter)
181
- filter = filter_by_name(filter)
182
- unless filter.class.included_modules.include?(::Datagrid::Filters::SelectOptions)
183
- raise ::Datagrid::ArgumentError, "#{filter.name} with type #{FILTER_TYPES.invert[filter.class].inspect} can not have select options"
184
- end
185
- filter.select(self)
187
+ find_select_filter(filter).select(self)
188
+ end
189
+
190
+ # Sets all options as selected for a filter that has options
191
+ def select_all(filter)
192
+ filter = find_select_filter(filter)
193
+ self[filter.name] = select_values(filter)
194
+ end
195
+
196
+ # Returns all values that can be set to a filter with select options
197
+ def select_values(filter)
198
+ find_select_filter(filter).select_values(self)
186
199
  end
187
200
 
188
201
  def default_filter
@@ -198,12 +211,21 @@ module Datagrid
198
211
 
199
212
  protected
200
213
 
214
+ def find_select_filter(filter)
215
+ filter = filter_by_name(filter)
216
+ unless filter.class.included_modules.include?(::Datagrid::Filters::SelectOptions)
217
+ raise ::Datagrid::ArgumentError,
218
+ "#{self.class.name}##{filter.name} with type #{FILTER_TYPES.invert[filter.class].inspect} can not have select options"
219
+ end
220
+ filter
221
+ end
222
+
201
223
  def apply_filters(current_scope, filters)
202
224
  filters.inject(current_scope) do |result, filter|
203
225
  filter.apply(self, result, filter_value(filter))
204
226
  end
205
227
  end
206
- end # InstanceMethods
228
+ end
207
229
 
208
230
  end
209
231
  end
@@ -2,30 +2,42 @@ require "action_view"
2
2
 
3
3
  module Datagrid
4
4
  module FormBuilder
5
-
6
- # Returns a form input html for the corresponding filter name
7
- def datagrid_filter(filter_or_attribute, options = {}, &block)
5
+ # @param filter_or_attribute [Datagrid::Filters::BaseFilter, String, Symbol] filter object or filter name
6
+ # @param options [Hash] options of rails form input helper
7
+ # @return [String] a form input html for the corresponding filter name
8
+ # * <tt>select</tt> for enum, xboolean filter types
9
+ # * <tt>check_box</tt> for boolean filter type
10
+ # * <tt>text_field</tt> for other filter types
11
+ def datagrid_filter(filter_or_attribute, partials: nil, **options, &block)
8
12
  filter = datagrid_get_filter(filter_or_attribute)
9
- options = {
13
+ self.send(
14
+ filter.form_builder_helper_name, filter,
10
15
  **filter.input_options,
11
16
  **add_html_classes(options, filter.name, datagrid_filter_html_class(filter)),
12
- }
13
- # Prevent partials option from appearing in HTML attributes
14
- options.delete(:partials) # Legacy option
15
- self.send(filter.form_builder_helper_name, filter, options, &block)
17
+ &block
18
+ )
16
19
  end
17
20
 
18
- # Returns a form label html for the corresponding filter name
21
+ # @param filter_or_attribute [Datagrid::Filters::BaseFilter, String, Symbol] filter object or filter name
22
+ # @param text [String, nil] label text, defaults to <tt>filter.header</tt>
23
+ # @param options [Hash] options of rails <tt>label</tt> helper
24
+ # @return [String] a form label html for the corresponding filter name
19
25
  def datagrid_label(filter_or_attribute, text = nil, **options, &block)
20
26
  filter = datagrid_get_filter(filter_or_attribute)
21
27
  label(filter.name, text || filter.header, **filter.label_options, **options, &block)
22
28
  end
23
29
 
24
- protected
25
- def datagrid_boolean_enum_filter(attribute_or_filter, options = {})
26
- datagrid_enum_filter(attribute_or_filter, options)
30
+ def datagrid_filter_input(attribute_or_filter, **options)
31
+ filter = datagrid_get_filter(attribute_or_filter)
32
+ value = object.filter_value_as_string(filter)
33
+ if options[:type]&.to_sym == :textarea
34
+ text_area filter.name, value: value, **options, type: nil
35
+ else
36
+ text_field filter.name, value: value, **options
37
+ end
27
38
  end
28
39
 
40
+ protected
29
41
  def datagrid_extended_boolean_filter(attribute_or_filter, options = {})
30
42
  datagrid_enum_filter(attribute_or_filter, options)
31
43
  end
@@ -43,27 +55,25 @@ module Datagrid
43
55
  end
44
56
 
45
57
  def datagrid_default_filter(attribute_or_filter, options = {})
46
- filter = datagrid_get_filter(attribute_or_filter)
47
- text_field filter.name, value: object.filter_value_as_string(filter), **options
58
+ datagrid_filter_input(attribute_or_filter, **options)
48
59
  end
49
60
 
50
61
  def datagrid_enum_filter(attribute_or_filter, options = {}, &block)
51
62
  filter = datagrid_get_filter(attribute_or_filter)
52
63
  if filter.checkboxes?
53
- partial = partial_path('enum_checkboxes')
54
64
  options = add_html_classes(options, 'checkboxes')
55
65
  elements = object.select_options(filter).map do |element|
56
66
  text, value = @template.send(:option_text_and_value, element)
57
67
  checked = enum_checkbox_checked?(filter, value)
58
68
  [value, text, checked]
59
69
  end
60
- @template.render(
61
- :partial => partial,
62
- :locals => {
63
- :elements => elements,
64
- :form => self,
65
- :filter => filter,
66
- :options => options,
70
+ render_partial(
71
+ 'enum_checkboxes',
72
+ {
73
+ elements: elements,
74
+ form: self,
75
+ filter: filter,
76
+ options: options,
67
77
  }
68
78
  )
69
79
  else
@@ -105,21 +115,26 @@ module Datagrid
105
115
  filter = datagrid_get_filter(attribute_or_filter)
106
116
  input_name = "#{object_name}[#{filter.name.to_s}][]"
107
117
  field, operation, value = object.filter_value(filter)
108
- options = options.merge(:name => input_name)
118
+ options = options.merge(name: input_name)
109
119
  field_input = dynamic_filter_select(
110
120
  filter.name,
111
121
  object.select_options(filter) || [],
112
122
  {
113
- :include_blank => filter.include_blank,
114
- :prompt => filter.prompt,
115
- :include_hidden => false,
116
- :selected => field
123
+ include_blank: filter.include_blank,
124
+ prompt: filter.prompt,
125
+ include_hidden: false,
126
+ selected: field
117
127
  },
118
128
  add_html_classes(options, "field")
119
129
  )
120
130
  operation_input = dynamic_filter_select(
121
131
  filter.name, filter.operations_select,
122
- {:include_blank => false, :include_hidden => false, :prompt => false, :selected => operation },
132
+ {
133
+ include_blank: false,
134
+ include_hidden: false,
135
+ prompt: false,
136
+ selected: operation,
137
+ },
123
138
  add_html_classes(options, "operation")
124
139
  )
125
140
  value_input = text_field(filter.name, **add_html_classes(options, "value"), value: value)
@@ -141,20 +156,19 @@ module Datagrid
141
156
  def datagrid_range_filter(type, attribute_or_filter, options = {})
142
157
  filter = datagrid_get_filter(attribute_or_filter)
143
158
  if filter.range?
144
- partial = partial_path('range_filter')
145
- options = options.merge(:multiple => true)
159
+ options = options.merge(multiple: true)
146
160
  from_options = datagrid_range_filter_options(object, filter, :from, options)
147
161
  to_options = datagrid_range_filter_options(object, filter, :to, options)
148
- @template.render :partial => partial, :locals => {
149
- :from_options => from_options, :to_options => to_options, :filter => filter, :form => self
162
+ render_partial 'range_filter', {
163
+ from_options: from_options, to_options: to_options, filter: filter, form: self
150
164
  }
151
165
  else
152
- datagrid_default_filter(filter, options)
166
+ datagrid_filter_input(filter, **options)
153
167
  end
154
168
  end
155
169
 
156
170
  def datagrid_range_filter_options(object, filter, type, options)
157
- type_method_map = {:from => :first, :to => :last}
171
+ type_method_map = {from: :first, to: :last}
158
172
  options = add_html_classes(options, type)
159
173
  options[:value] = filter.format(object[filter.name].try(type_method_map[type]))
160
174
  # In case of datagrid ranged filter
@@ -172,7 +186,7 @@ module Datagrid
172
186
  end
173
187
 
174
188
  def datagrid_string_filter(attribute_or_filter, options = {})
175
- datagrid_default_filter(attribute_or_filter, options)
189
+ datagrid_range_filter(:string, attribute_or_filter, options)
176
190
  end
177
191
 
178
192
  def datagrid_float_filter(attribute_or_filter, options = {})
@@ -211,6 +225,10 @@ module Datagrid
211
225
  File.join('datagrid', name)
212
226
  end
213
227
 
228
+ def render_partial(name, locals)
229
+ @template.render partial: partial_path(name), locals: locals
230
+ end
231
+
214
232
  class Error < StandardError
215
233
  end
216
234
  end
@@ -4,30 +4,28 @@ require "action_view"
4
4
  module Datagrid
5
5
  module Helper
6
6
 
7
- # Returns individual cell value from the given grid, column name and model
8
- # Allows to render custom HTML layout for grid data
9
- #
7
+ # @param grid [Datagrid] grid object
8
+ # @param column [Datagrid::Columns::Column, String, Symbol] column name
9
+ # @param model [Object] an object from grid scope
10
+ # @return [Object] individual cell value from the given grid, column name and model
11
+ # @example
10
12
  # <ul>
11
13
  # <% @grid.columns.each do |column|
12
14
  # <li><%= column.header %>: <%= datagrid_value(@grid, column.name, @resource %></li>
13
15
  # <% end %>
14
16
  # </ul>
15
- #
16
- def datagrid_value(grid, column_name, model)
17
- datagrid_renderer.format_value(grid, column_name, model)
17
+ def datagrid_value(grid, column, model)
18
+ datagrid_renderer.format_value(grid, column, model)
18
19
  end
19
20
 
20
- def datagrid_format_value(grid, column_name, model) #:nodoc:
21
- datagrid_value(grid, column_name, model)
21
+ # @!visibility private
22
+ def datagrid_format_value(grid, column, model)
23
+ datagrid_value(grid, column, model)
22
24
  end
23
25
 
24
26
  # Renders html table with columns defined in grid class.
25
27
  # In the most common used you need to pass paginated collection
26
28
  # to datagrid table because datagrid do not have pagination compatibilities:
27
- #
28
- # assets = grid.assets.page(params[:page])
29
- # datagrid_table(grid, assets, options)
30
- #
31
29
  # Supported options:
32
30
  #
33
31
  # * <tt>:html</tt> - hash of attributes for <table> tag
@@ -38,6 +36,12 @@ module Datagrid
38
36
  # and needs different columns. Default: all defined columns.
39
37
  # * <tt>:partials</tt> - Path for partials lookup.
40
38
  # Default: 'datagrid'.
39
+ # @param grid [Datagrid] grid object
40
+ # @param assets [Array] objects from grid scope
41
+ # @return [String] table tag HTML markup
42
+ # @example
43
+ # assets = grid.assets.page(params[:page])
44
+ # datagrid_table(grid, assets, options)
41
45
  def datagrid_table(grid, assets = grid.assets, **options)
42
46
  datagrid_renderer.table(grid, assets, **options)
43
47
  end
@@ -48,8 +52,13 @@ module Datagrid
48
52
  #
49
53
  # * <tt>:order</tt> - display ordering controls built-in into header
50
54
  # Default: true
55
+ # * <tt>:columns</tt> - Array of column names to display.
56
+ # Used in case when same grid class is used in different places
57
+ # and needs different columns. Default: all defined columns.
51
58
  # * <tt>:partials</tt> - Path for partials lookup.
52
59
  # Default: 'datagrid'.
60
+ # @param grid [Datagrid] grid object
61
+ # @return [String] HTML table header tag markup
53
62
  def datagrid_header(grid, options = {})
54
63
  datagrid_renderer.header(grid, options)
55
64
  end
@@ -66,6 +75,7 @@ module Datagrid
66
75
  # * <tt>:partials</tt> - Path for partials lookup.
67
76
  # Default: 'datagrid'.
68
77
  #
78
+ # @example
69
79
  # = datagrid_rows(grid) # Generic table rows Layout
70
80
  #
71
81
  # = datagrid_rows(grid) do |row| # Custom Layout
@@ -93,73 +103,45 @@ module Datagrid
93
103
  # * <tt>:partials</tt> - Path for form partial lookup.
94
104
  # Default: 'datagrid'.
95
105
  # * All options supported by Rails <tt>form_for</tt> helper
106
+ # @param grid [Datagrid] grid object
107
+ # @return [String] form HTML tag markup
96
108
  def datagrid_form_for(grid, options = {})
97
109
  datagrid_renderer.form_for(grid, options)
98
110
  end
99
111
 
100
112
  # Provides access to datagrid columns data.
101
- #
102
- # # Suppose that <tt>grid</tt> has first_name and last_name columns
113
+ # Used in case you want to build html table completelly manually
114
+ # @param grid [Datagrid] grid object
115
+ # @param asset [Object] object from grid scope
116
+ # @param block [Proc] block with Datagrid::Helper::HtmlRow as an argument returning a HTML markup as a String
117
+ # @return [Datagrid::Helper::HtmlRow, String] captured HTML markup if block given otherwise row object
118
+ # @example
119
+ # # Suppose that grid has first_name and last_name columns
103
120
  # <%= datagrid_row(grid, user) do |row| %>
104
121
  # <tr>
105
122
  # <td><%= row.first_name %></td>
106
123
  # <td><%= row.last_name %></td>
107
124
  # </tr>
108
125
  # <% end %>
109
- #
110
- # Used in case you want to build html table completelly manually
111
- def datagrid_row(grid, asset, &block)
112
- HtmlRow.new(self, grid, asset).tap do |row|
113
- if block_given?
114
- return capture(row, &block)
115
- end
116
- end
126
+ # @example
127
+ # <% row = datagrid_row(grid, user) %>
128
+ # First Name: <%= row.first_name %>
129
+ # Last Name: <%= row.last_name %>
130
+ # @example
131
+ # <%= datagrid_row(grid, user, columns: [:first_name, :last_name, :actions]) %>
132
+ def datagrid_row(grid, asset, **options, &block)
133
+ datagrid_renderer.row(grid, asset, **options, &block)
117
134
  end
118
135
 
119
136
  # Generates an ascending or descending order url for the given column
137
+ # @param grid [Datagrid] grid object
138
+ # @param column [Datagrid::Columns::Column, String, Symbol] column name
139
+ # @param descending [Boolean] specifies order direction. Ascending if false, otherwise descending.
140
+ # @return [String] order layout HTML markup
120
141
  def datagrid_order_path(grid, column, descending)
121
142
  datagrid_renderer.order_path(grid, column, descending, request)
122
143
  end
123
144
 
124
- # Represents a datagrid row that provides access to column values for the given asset
125
- #
126
- # row = datagrid_row(grid, user)
127
- # row.first_name # => "<strong>Bogdan</strong>"
128
- # row.grid # => Grid object
129
- # row.asset # => User object
130
- class HtmlRow
131
-
132
- include Enumerable
133
-
134
- attr_reader :grid, :asset
135
-
136
- def initialize(context, grid, asset) # :nodoc:
137
- @context = context
138
- @grid = grid
139
- @asset = asset
140
- end
141
-
142
- # Return a column value for given column name
143
- def get(column)
144
- @context.datagrid_value(@grid, column, @asset)
145
- end
146
-
147
- # Iterates over all column values that are available in the row
148
- def each
149
- @grid.columns.each do |column|
150
- yield(get(column))
151
- end
152
- end
153
-
154
- protected
155
- def method_missing(method, *args, &blk)
156
- if column = @grid.column_by_name(method)
157
- get(column)
158
- else
159
- super
160
- end
161
- end
162
- end
163
145
 
164
146
  protected
165
147
 
@@ -2,22 +2,26 @@ en:
2
2
  datagrid:
3
3
  no_results:
4
4
  "――"
5
+
5
6
  table:
6
7
  order:
7
8
  asc: "↑"
8
9
  desc: "↓"
9
10
  no_columns: "No columns selected"
11
+
10
12
  form:
11
13
  search: "Search"
12
14
  reset: "Reset"
15
+
13
16
  filters:
14
17
  xboolean:
15
18
  "yes": "Yes"
16
19
  "no": "No"
17
-
18
20
  dynamic:
19
21
  operations:
20
22
  ">=": "≥"
21
23
  "<=": "≤"
22
24
  "=": "="
23
25
  "=~": "≈"
26
+ range:
27
+ separator: " - "
@@ -1,10 +1,12 @@
1
1
  require "datagrid/columns"
2
2
 
3
3
  module Datagrid
4
+ # Raised when grid order value is incorrect
4
5
  class OrderUnsupported < StandardError
5
6
  end
6
7
  module Ordering
7
8
 
9
+ # @!visibility private
8
10
  def self.included(base)
9
11
  base.extend ClassMethods
10
12
  base.class_eval do
@@ -25,39 +27,38 @@ module Datagrid
25
27
  alias descending? descending
26
28
 
27
29
  end
28
- base.send :include, InstanceMethods
29
- end # self.included
30
+ base.include InstanceMethods
31
+ end
30
32
 
33
+ # @!visibility private
31
34
  module ClassMethods
32
-
33
35
  def order_unsupported(name, reason)
34
36
  raise Datagrid::OrderUnsupported, "Can not sort #{self.inspect} by ##{name}: #{reason}"
35
37
  end
36
-
37
- end # ClassMethods
38
+ end
38
39
 
39
40
  module InstanceMethods
40
41
 
41
- def assets # :nodoc:
42
+ # @!visibility private
43
+ def assets
42
44
  check_order_valid!
43
45
  apply_order(super)
44
46
  end
45
47
 
46
- # Returns a column definition that is currently used to order assets
47
- #
48
+ # @return [Datagrid::Columns::Column, nil] a column definition that is currently used to order assets
49
+ # @example
48
50
  # class MyGrid
49
51
  # scope { Model }
50
52
  # column(:id)
51
53
  # column(:name)
52
54
  # end
53
- # MyGrid.new(:order => "name").order_column # => #<Column name: "name", ...>
54
- #
55
+ # MyGrid.new(order: "name").order_column # => #<Column name: "name", ...>
55
56
  def order_column
56
- order && column_by_name(order)
57
+ order ? column_by_name(order) : nil
57
58
  end
58
59
 
59
- # Returns true if given grid is ordered by given column.
60
- # <tt>column</tt> can be given as name or as column object
60
+ # @param column [String, Datagrid::Columns::Column]
61
+ # @return [Boolean] true if given grid is ordered by given column.
61
62
  def ordered_by?(column)
62
63
  order_column == column_by_name(column)
63
64
  end
@@ -127,7 +128,6 @@ module Datagrid
127
128
  self.class.order_unsupported(order_column.name, "Order option proc can not handle more than one argument")
128
129
  end
129
130
  end
130
- end # InstanceMethods
131
-
131
+ end
132
132
  end
133
133
  end