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