datagrid 1.6.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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