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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -1
- data/Readme.markdown +11 -11
- data/app/views/datagrid/_enum_checkboxes.html.erb +2 -2
- data/app/views/datagrid/_form.html.erb +2 -3
- data/app/views/datagrid/_order_for.html.erb +2 -2
- data/app/views/datagrid/_range_filter.html.erb +3 -3
- data/datagrid.gemspec +10 -14
- data/lib/datagrid/active_model.rb +25 -29
- data/lib/datagrid/column_names_attribute.rb +11 -9
- data/lib/datagrid/columns/column.rb +10 -8
- data/lib/datagrid/columns.rb +142 -176
- data/lib/datagrid/configuration.rb +6 -1
- data/lib/datagrid/core.rb +63 -30
- data/lib/datagrid/drivers/abstract_driver.rb +2 -1
- data/lib/datagrid/drivers/active_record.rb +4 -3
- data/lib/datagrid/drivers/array.rb +2 -1
- data/lib/datagrid/drivers/mongo_mapper.rb +2 -1
- data/lib/datagrid/drivers/mongoid.rb +3 -2
- data/lib/datagrid/drivers/sequel.rb +8 -3
- data/lib/datagrid/drivers.rb +2 -1
- data/lib/datagrid/engine.rb +3 -2
- data/lib/datagrid/filters/base_filter.rb +8 -4
- data/lib/datagrid/filters/boolean_filter.rb +2 -1
- data/lib/datagrid/filters/composite_filters.rb +8 -12
- data/lib/datagrid/filters/dynamic_filter.rb +1 -1
- data/lib/datagrid/filters/extended_boolean_filter.rb +2 -1
- data/lib/datagrid/filters/select_options.rb +34 -1
- data/lib/datagrid/filters.rb +52 -30
- data/lib/datagrid/form_builder.rb +53 -35
- data/lib/datagrid/helper.rb +43 -61
- data/lib/datagrid/locale/en.yml +5 -1
- data/lib/datagrid/ordering.rb +15 -15
- data/lib/datagrid/renderer.rb +71 -15
- data/lib/datagrid/rspec.rb +4 -4
- data/lib/datagrid/scaffold.rb +1 -1
- data/lib/datagrid/utils.rb +1 -0
- data/lib/datagrid/version.rb +1 -1
- data/lib/datagrid.rb +2 -1
- data/templates/grid.rb.erb +1 -1
- data/templates/index.html.erb +1 -1
- metadata +8 -9
- data/lib/datagrid/filters/boolean_enum_filter.rb +0 -17
data/lib/datagrid/filters.rb
CHANGED
@@ -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
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
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
|
-
|
35
|
-
end
|
32
|
+
DEFAULT_FILTER_BLOCK = Object.new
|
36
33
|
|
37
|
-
|
38
|
-
|
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.
|
48
|
-
end
|
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
|
-
|
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
|
-
|
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
|
139
|
+
end
|
136
140
|
|
137
141
|
module InstanceMethods
|
138
142
|
|
139
|
-
|
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
|
-
|
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
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
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
|
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
|
-
#
|
7
|
-
|
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
|
-
|
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
|
-
|
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
|
-
#
|
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
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
:
|
64
|
-
:
|
65
|
-
:
|
66
|
-
:
|
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(:
|
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
|
-
:
|
114
|
-
:
|
115
|
-
:
|
116
|
-
:
|
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
|
-
{
|
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
|
-
|
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
|
-
|
149
|
-
:
|
162
|
+
render_partial 'range_filter', {
|
163
|
+
from_options: from_options, to_options: to_options, filter: filter, form: self
|
150
164
|
}
|
151
165
|
else
|
152
|
-
|
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 = {:
|
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
|
-
|
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
|
data/lib/datagrid/helper.rb
CHANGED
@@ -4,30 +4,28 @@ require "action_view"
|
|
4
4
|
module Datagrid
|
5
5
|
module Helper
|
6
6
|
|
7
|
-
#
|
8
|
-
#
|
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
|
-
|
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
|
-
|
21
|
-
|
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
|
-
#
|
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
|
-
#
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
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
|
|
data/lib/datagrid/locale/en.yml
CHANGED
@@ -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: " - "
|
data/lib/datagrid/ordering.rb
CHANGED
@@ -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.
|
29
|
-
end
|
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
|
-
|
42
|
+
# @!visibility private
|
43
|
+
def assets
|
42
44
|
check_order_valid!
|
43
45
|
apply_order(super)
|
44
46
|
end
|
45
47
|
|
46
|
-
#
|
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(:
|
54
|
-
#
|
55
|
+
# MyGrid.new(order: "name").order_column # => #<Column name: "name", ...>
|
55
56
|
def order_column
|
56
|
-
order
|
57
|
+
order ? column_by_name(order) : nil
|
57
58
|
end
|
58
59
|
|
59
|
-
#
|
60
|
-
#
|
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
|
131
|
-
|
131
|
+
end
|
132
132
|
end
|
133
133
|
end
|