datagrid 1.8.2 → 2.0.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/.yardopts +2 -0
- data/CHANGELOG.md +11 -1
- data/{Readme.markdown → README.md} +44 -29
- data/app/assets/stylesheets/datagrid.css +145 -0
- data/app/views/datagrid/_enum_checkboxes.html.erb +5 -3
- data/app/views/datagrid/_form.html.erb +4 -4
- data/app/views/datagrid/_head.html.erb +26 -3
- data/app/views/datagrid/_range_filter.html.erb +5 -3
- data/app/views/datagrid/_row.html.erb +12 -1
- data/app/views/datagrid/_table.html.erb +4 -4
- data/datagrid.gemspec +8 -7
- data/lib/datagrid/active_model.rb +9 -17
- data/lib/datagrid/base.rb +39 -0
- data/lib/datagrid/column_names_attribute.rb +9 -11
- data/lib/datagrid/columns/column.rb +155 -133
- data/lib/datagrid/columns.rb +325 -115
- data/lib/datagrid/configuration.rb +33 -4
- data/lib/datagrid/core.rb +89 -54
- data/lib/datagrid/deprecated_object.rb +20 -0
- data/lib/datagrid/drivers/abstract_driver.rb +12 -23
- data/lib/datagrid/drivers/active_record.rb +24 -26
- data/lib/datagrid/drivers/array.rb +22 -14
- data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
- data/lib/datagrid/drivers/mongoid.rb +15 -17
- data/lib/datagrid/drivers/sequel.rb +14 -19
- data/lib/datagrid/drivers.rb +2 -1
- data/lib/datagrid/engine.rb +11 -3
- data/lib/datagrid/filters/base_filter.rb +166 -143
- data/lib/datagrid/filters/boolean_filter.rb +19 -5
- data/lib/datagrid/filters/date_filter.rb +33 -35
- data/lib/datagrid/filters/date_time_filter.rb +24 -16
- data/lib/datagrid/filters/default_filter.rb +9 -3
- data/lib/datagrid/filters/dynamic_filter.rb +151 -105
- data/lib/datagrid/filters/enum_filter.rb +43 -19
- data/lib/datagrid/filters/extended_boolean_filter.rb +39 -31
- data/lib/datagrid/filters/float_filter.rb +15 -5
- data/lib/datagrid/filters/integer_filter.rb +21 -10
- data/lib/datagrid/filters/ranged_filter.rb +66 -45
- data/lib/datagrid/filters/select_options.rb +58 -49
- data/lib/datagrid/filters/string_filter.rb +9 -4
- data/lib/datagrid/filters.rb +204 -79
- data/lib/datagrid/form_builder.rb +116 -128
- data/lib/datagrid/generators/scaffold.rb +184 -0
- data/lib/datagrid/generators/views.rb +20 -0
- data/lib/datagrid/helper.rb +436 -69
- data/lib/datagrid/ordering.rb +26 -29
- data/lib/datagrid/rspec.rb +6 -10
- data/lib/datagrid/utils.rb +37 -30
- data/lib/datagrid/version.rb +3 -1
- data/lib/datagrid.rb +8 -28
- data/templates/base.rb.erb +6 -4
- data/templates/grid.rb.erb +1 -1
- metadata +17 -17
- data/app/assets/stylesheets/datagrid.sass +0 -134
- data/lib/datagrid/filters/composite_filters.rb +0 -49
- data/lib/datagrid/renderer.rb +0 -157
- data/lib/datagrid/scaffold.rb +0 -129
- data/lib/tasks/datagrid_tasks.rake +0 -15
- data/templates/controller.rb.erb +0 -6
- data/templates/index.html.erb +0 -5
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Datagrid
|
2
4
|
module Drivers
|
3
5
|
# @!visibility private
|
4
6
|
class MongoMapper < AbstractDriver
|
5
|
-
|
6
7
|
def self.match?(scope)
|
7
8
|
return false unless defined?(::MongoMapper)
|
9
|
+
|
8
10
|
if scope.is_a?(Class)
|
9
11
|
scope.ancestors.include?(::MongoMapper::Document)
|
10
12
|
else
|
@@ -29,31 +31,31 @@ module Datagrid
|
|
29
31
|
end
|
30
32
|
|
31
33
|
def default_order(scope, column_name)
|
32
|
-
|
34
|
+
scope_has_column?(scope, column_name) ? column_name : nil
|
33
35
|
end
|
34
36
|
|
35
37
|
def greater_equal(scope, field, value)
|
36
|
-
scope.where(field => {"$gte" => value})
|
38
|
+
scope.where(field => { "$gte" => value })
|
37
39
|
end
|
38
40
|
|
39
41
|
def less_equal(scope, field, value)
|
40
|
-
scope.where(field => {"$lte" => value})
|
42
|
+
scope.where(field => { "$lte" => value })
|
41
43
|
end
|
42
44
|
|
43
|
-
def
|
45
|
+
def scope_has_column?(scope, column_name)
|
44
46
|
scope.key?(column_name)
|
45
47
|
end
|
46
48
|
|
47
|
-
def
|
48
|
-
#TODO implement the support
|
49
|
+
def timestamp_column?(_scope, _column_name)
|
50
|
+
# TODO: implement the support
|
49
51
|
false
|
50
52
|
end
|
51
53
|
|
52
|
-
def contains(
|
54
|
+
def contains(_scope, field, value)
|
53
55
|
scope(field => Regexp.compile(Regexp.escape(value)))
|
54
56
|
end
|
55
57
|
|
56
|
-
def column_names(
|
58
|
+
def column_names(_scope)
|
57
59
|
[] # TODO: implement support
|
58
60
|
end
|
59
61
|
|
@@ -62,10 +64,9 @@ module Datagrid
|
|
62
64
|
loop do
|
63
65
|
batch = scope.skip(current_page * batch_size).limit(batch_size).to_a
|
64
66
|
return if batch.empty?
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
current_page+=1
|
67
|
+
|
68
|
+
scope.skip(current_page * batch_size).limit(batch_size).each(&block)
|
69
|
+
current_page += 1
|
69
70
|
end
|
70
71
|
end
|
71
72
|
|
@@ -77,7 +78,7 @@ module Datagrid
|
|
77
78
|
raise NotImplementedError
|
78
79
|
end
|
79
80
|
|
80
|
-
def can_preload?(
|
81
|
+
def can_preload?(_scope, _association)
|
81
82
|
false
|
82
83
|
end
|
83
84
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Datagrid
|
2
4
|
module Drivers
|
3
5
|
# @!visibility private
|
4
6
|
class Mongoid < AbstractDriver
|
5
|
-
|
6
7
|
def self.match?(scope)
|
7
8
|
return false unless defined?(::Mongoid)
|
9
|
+
|
8
10
|
if scope.is_a?(Class)
|
9
11
|
scope.ancestors.include?(::Mongoid::Document)
|
10
12
|
else
|
@@ -21,9 +23,7 @@ module Datagrid
|
|
21
23
|
end
|
22
24
|
|
23
25
|
def where(scope, attribute, value)
|
24
|
-
if value.is_a?(Range)
|
25
|
-
value = {"$gte" => value.first, "$lte" => value.last}
|
26
|
-
end
|
26
|
+
value = { "$gte" => value.first, "$lte" => value.last } if value.is_a?(Range)
|
27
27
|
scope.where(attribute => value)
|
28
28
|
end
|
29
29
|
|
@@ -36,18 +36,18 @@ module Datagrid
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def default_order(scope, column_name)
|
39
|
-
|
39
|
+
scope_has_column?(scope, column_name) ? column_name : nil
|
40
40
|
end
|
41
41
|
|
42
42
|
def greater_equal(scope, field, value)
|
43
|
-
scope.where(field => {"$gte" => value})
|
43
|
+
scope.where(field => { "$gte" => value })
|
44
44
|
end
|
45
45
|
|
46
46
|
def less_equal(scope, field, value)
|
47
|
-
scope.where(field => {"$lte" => value})
|
47
|
+
scope.where(field => { "$lte" => value })
|
48
48
|
end
|
49
49
|
|
50
|
-
def
|
50
|
+
def scope_has_column?(scope, column_name)
|
51
51
|
column_names(scope).include?(column_name.to_s)
|
52
52
|
end
|
53
53
|
|
@@ -62,8 +62,9 @@ module Datagrid
|
|
62
62
|
def normalized_column_type(scope, field)
|
63
63
|
type = to_scope(scope).klass.fields[field.to_s]&.type
|
64
64
|
return nil unless type
|
65
|
+
|
65
66
|
{
|
66
|
-
[BigDecimal
|
67
|
+
[BigDecimal, String, Symbol, Range, Array, Hash] => :string,
|
67
68
|
[::Mongoid::Boolean] => :boolean,
|
68
69
|
|
69
70
|
[Date] => :date,
|
@@ -76,7 +77,7 @@ module Datagrid
|
|
76
77
|
}.each do |keys, value|
|
77
78
|
return value if keys.include?(type)
|
78
79
|
end
|
79
|
-
|
80
|
+
:string
|
80
81
|
end
|
81
82
|
|
82
83
|
def batch_each(scope, batch_size, &block)
|
@@ -84,10 +85,9 @@ module Datagrid
|
|
84
85
|
loop do
|
85
86
|
batch = scope.skip(current_page * batch_size).limit(batch_size).to_a
|
86
87
|
return if batch.empty?
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
current_page+=1
|
88
|
+
|
89
|
+
scope.skip(current_page * batch_size).limit(batch_size).each(&block)
|
90
|
+
current_page += 1
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -100,10 +100,8 @@ module Datagrid
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def can_preload?(scope, association)
|
103
|
-
!!
|
103
|
+
!!scope.klass.reflect_on_association(association)
|
104
104
|
end
|
105
|
-
|
106
105
|
end
|
107
106
|
end
|
108
107
|
end
|
109
|
-
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Datagrid
|
2
4
|
module Drivers
|
3
5
|
# @!visibility private
|
4
6
|
class Sequel < AbstractDriver
|
5
|
-
|
6
7
|
def self.match?(scope)
|
7
8
|
return false unless defined?(::Sequel)
|
9
|
+
|
8
10
|
if scope.is_a?(Class)
|
9
11
|
scope.ancestors.include?(::Sequel::Model)
|
10
12
|
else
|
@@ -14,11 +16,8 @@ module Datagrid
|
|
14
16
|
|
15
17
|
def to_scope(scope)
|
16
18
|
return scope if scope.is_a?(::Sequel::Dataset)
|
17
|
-
scope.where({})
|
18
|
-
end
|
19
19
|
|
20
|
-
|
21
|
-
super
|
20
|
+
scope.where({})
|
22
21
|
end
|
23
22
|
|
24
23
|
def where(scope, attribute, value)
|
@@ -33,12 +32,8 @@ module Datagrid
|
|
33
32
|
scope.order(::Sequel.desc(::Sequel.lit(order)))
|
34
33
|
end
|
35
34
|
|
36
|
-
def reverse_order(scope)
|
37
|
-
super
|
38
|
-
end
|
39
|
-
|
40
35
|
def default_order(scope, column_name)
|
41
|
-
|
36
|
+
scope_has_column?(scope, column_name) ? ::Sequel.lit(prefix_table_name(scope, column_name)) : nil
|
42
37
|
end
|
43
38
|
|
44
39
|
def greater_equal(scope, field, value)
|
@@ -49,7 +44,7 @@ module Datagrid
|
|
49
44
|
scope.where(::Sequel.lit("#{prefix_table_name(scope, field)} <= ?", value))
|
50
45
|
end
|
51
46
|
|
52
|
-
def
|
47
|
+
def scope_has_column?(scope, column_name)
|
53
48
|
scope.columns.include?(column_name.to_sym)
|
54
49
|
end
|
55
50
|
|
@@ -65,13 +60,14 @@ module Datagrid
|
|
65
60
|
def normalized_column_type(scope, field)
|
66
61
|
type = column_type(scope, field)
|
67
62
|
return nil unless type
|
63
|
+
|
68
64
|
{
|
69
|
-
[
|
70
|
-
[
|
71
|
-
[
|
65
|
+
%i[string blob time] => :string,
|
66
|
+
%i[integer primary_key] => :integer,
|
67
|
+
%i[float decimal] => :float,
|
72
68
|
[:date] => :date,
|
73
69
|
[:datetime] => :timestamp,
|
74
|
-
[:boolean] => :boolean
|
70
|
+
[:boolean] => :boolean,
|
75
71
|
}.each do |keys, value|
|
76
72
|
return value if keys.include?(type)
|
77
73
|
end
|
@@ -96,18 +92,17 @@ module Datagrid
|
|
96
92
|
end
|
97
93
|
|
98
94
|
def can_preload?(scope, association)
|
99
|
-
!!
|
95
|
+
!!scope.model.association_reflection(association)
|
100
96
|
end
|
101
97
|
|
102
|
-
|
103
98
|
protected
|
104
99
|
|
105
100
|
def prefix_table_name(scope, field)
|
106
|
-
|
101
|
+
scope_has_column?(scope, field) ? [to_scope(scope).row_proc.table_name, field].join(".") : field
|
107
102
|
end
|
108
103
|
|
109
104
|
def column_type(scope, field)
|
110
|
-
|
105
|
+
scope_has_column?(scope, field) ? to_scope(scope).row_proc.db_schema[field.to_sym][:type] : nil
|
111
106
|
end
|
112
107
|
end
|
113
108
|
end
|
data/lib/datagrid/drivers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "datagrid/drivers/abstract_driver"
|
2
4
|
require "datagrid/drivers/active_record"
|
3
5
|
require "datagrid/drivers/array"
|
@@ -5,7 +7,6 @@ require "datagrid/drivers/mongoid"
|
|
5
7
|
require "datagrid/drivers/mongo_mapper"
|
6
8
|
require "datagrid/drivers/sequel"
|
7
9
|
|
8
|
-
|
9
10
|
module Datagrid
|
10
11
|
# @!visibility private
|
11
12
|
module Drivers
|
data/lib/datagrid/engine.rb
CHANGED
@@ -1,12 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "rails/engine"
|
4
|
+
require "datagrid/helper"
|
5
|
+
require "datagrid/form_builder"
|
2
6
|
|
3
7
|
module Datagrid
|
4
|
-
# @!private
|
8
|
+
# @!visibility private
|
5
9
|
class Engine < ::Rails::Engine
|
10
|
+
def self.extend_modules
|
11
|
+
ActionView::Base.include(Datagrid::Helper)
|
12
|
+
ActionView::Helpers::FormBuilder.include(Datagrid::FormBuilder)
|
13
|
+
end
|
14
|
+
|
6
15
|
initializer "datagrid.helpers" do
|
7
|
-
#TODO: check why it doesn't work
|
8
16
|
ActiveSupport.on_load :action_view do
|
9
|
-
|
17
|
+
Engine.extend_modules
|
10
18
|
end
|
11
19
|
end
|
12
20
|
end
|
@@ -1,184 +1,207 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# An error raise when datagrid filter is defined incorrectly and
|
2
4
|
# causes filtering chain to be broken
|
3
|
-
|
5
|
+
module Datagrid
|
6
|
+
class FilteringError < StandardError
|
7
|
+
end
|
4
8
|
end
|
5
9
|
|
6
|
-
|
7
|
-
|
10
|
+
module Datagrid
|
11
|
+
module Filters
|
12
|
+
class BaseFilter
|
13
|
+
attr_accessor :grid_class, :options, :block, :name
|
8
14
|
|
9
|
-
|
10
|
-
|
15
|
+
def initialize(grid_class, name, **options, &block)
|
16
|
+
self.grid_class = grid_class
|
17
|
+
self.name = name.to_sym
|
18
|
+
self.options = options
|
19
|
+
self.block = block
|
20
|
+
end
|
11
21
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
self.options = options
|
16
|
-
self.block = block || default_filter_block
|
17
|
-
end
|
22
|
+
def parse(value)
|
23
|
+
raise NotImplementedError, "#parse(value) suppose to be overwritten"
|
24
|
+
end
|
18
25
|
|
19
|
-
|
20
|
-
|
21
|
-
|
26
|
+
def default_input_options
|
27
|
+
{ type: "text" }
|
28
|
+
end
|
22
29
|
|
23
|
-
|
24
|
-
|
25
|
-
|
30
|
+
def unapplicable_value?(value)
|
31
|
+
value.nil? ? !allow_nil? : value.blank? && !allow_blank?
|
32
|
+
end
|
26
33
|
|
27
|
-
|
28
|
-
|
34
|
+
def apply(grid_object, scope, value)
|
35
|
+
return scope if unapplicable_value?(value)
|
29
36
|
|
30
|
-
|
37
|
+
result = execute(value, scope, grid_object)
|
31
38
|
|
32
|
-
|
33
|
-
if result == Datagrid::Filters::DEFAULT_FILTER_BLOCK
|
34
|
-
result = default_filter(value, scope, grid_object)
|
35
|
-
end
|
36
|
-
unless grid_object.driver.match?(result)
|
37
|
-
raise Datagrid::FilteringError, "Can not apply #{name.inspect} filter: result #{result.inspect} no longer match #{grid_object.driver.class}."
|
38
|
-
end
|
39
|
+
return scope unless result
|
39
40
|
|
40
|
-
|
41
|
-
|
41
|
+
result = default_filter(value, scope) if result == Datagrid::Filters::DEFAULT_FILTER_BLOCK
|
42
|
+
unless grid_object.driver.match?(result)
|
43
|
+
raise(
|
44
|
+
Datagrid::FilteringError,
|
45
|
+
"Filter #{name.inspect} unapplicable: result no longer match #{grid_object.driver.class}.",
|
46
|
+
)
|
47
|
+
end
|
42
48
|
|
43
|
-
|
44
|
-
if multiple?
|
45
|
-
return nil if value.nil?
|
46
|
-
normalize_multiple_value(value).map do |v|
|
47
|
-
parse(v)
|
49
|
+
result
|
48
50
|
end
|
49
|
-
elsif value.is_a?(Array)
|
50
|
-
raise Datagrid::ArgumentError, "#{grid_class}##{name} filter can not accept Array argument. Use :multiple option."
|
51
|
-
else
|
52
|
-
parse(value)
|
53
|
-
end
|
54
|
-
end
|
55
51
|
|
56
|
-
|
57
|
-
|
58
|
-
|
52
|
+
def parse_values(value)
|
53
|
+
if multiple?
|
54
|
+
return nil if value.nil?
|
55
|
+
|
56
|
+
return normalize_multiple_value(value).map do |v|
|
57
|
+
parse(v)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
case value
|
62
|
+
when Array
|
63
|
+
raise Datagrid::ArgumentError,
|
64
|
+
"#{grid_class}##{name} filter can not accept Array argument. Use :multiple option."
|
65
|
+
when Range
|
66
|
+
raise Datagrid::ArgumentError,
|
67
|
+
"#{grid_class}##{name} filter can not accept Range argument. Use :range option."
|
68
|
+
else
|
69
|
+
parse(value)
|
70
|
+
end
|
71
|
+
end
|
59
72
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
else
|
64
|
-
Datagrid::Utils.translate_from_namespace(:filters, grid_class, name)
|
65
|
-
end
|
66
|
-
end
|
73
|
+
def separator
|
74
|
+
options[:multiple].is_a?(String) ? options[:multiple] : default_separator
|
75
|
+
end
|
67
76
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
default
|
76
|
-
end
|
77
|
-
end
|
77
|
+
def header
|
78
|
+
if (header = options[:header])
|
79
|
+
Datagrid::Utils.callable(header)
|
80
|
+
else
|
81
|
+
Datagrid::Utils.translate_from_namespace(:filters, grid_class, name)
|
82
|
+
end
|
83
|
+
end
|
78
84
|
|
79
|
-
|
80
|
-
|
81
|
-
|
85
|
+
def default(object)
|
86
|
+
default = options[:default]
|
87
|
+
if default.is_a?(Symbol)
|
88
|
+
object.send(default)
|
89
|
+
elsif default.respond_to?(:call)
|
90
|
+
Datagrid::Utils.apply_args(object, &default)
|
91
|
+
else
|
92
|
+
default
|
93
|
+
end
|
94
|
+
end
|
82
95
|
|
83
|
-
|
84
|
-
|
85
|
-
|
96
|
+
def multiple?
|
97
|
+
options[:multiple]
|
98
|
+
end
|
86
99
|
|
87
|
-
|
88
|
-
|
89
|
-
|
100
|
+
def range?
|
101
|
+
false
|
102
|
+
end
|
90
103
|
|
91
|
-
|
92
|
-
|
93
|
-
|
104
|
+
def allow_nil?
|
105
|
+
options.key?(:allow_nil) ? options[:allow_nil] : options[:allow_blank]
|
106
|
+
end
|
94
107
|
|
95
|
-
|
96
|
-
|
97
|
-
|
108
|
+
def allow_blank?
|
109
|
+
options[:allow_blank]
|
110
|
+
end
|
98
111
|
|
99
|
-
|
100
|
-
|
101
|
-
|
112
|
+
def input_options
|
113
|
+
options[:input_options] || {}
|
114
|
+
end
|
102
115
|
|
103
|
-
|
104
|
-
|
105
|
-
|
116
|
+
def label_options
|
117
|
+
options[:label_options] || {}
|
118
|
+
end
|
106
119
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
filter.default_filter(value, scope, grid)
|
111
|
-
end
|
112
|
-
end
|
120
|
+
def form_builder_helper_name
|
121
|
+
self.class.form_builder_helper_name
|
122
|
+
end
|
113
123
|
|
114
|
-
|
115
|
-
|
116
|
-
|
124
|
+
def self.form_builder_helper_name
|
125
|
+
:"datagrid_#{to_s.demodulize.underscore}"
|
126
|
+
end
|
117
127
|
|
118
|
-
|
119
|
-
|
120
|
-
|
128
|
+
def supports_range?
|
129
|
+
self.class.ancestors.include?(::Datagrid::Filters::RangedFilter)
|
130
|
+
end
|
121
131
|
|
122
|
-
|
123
|
-
|
124
|
-
|
132
|
+
def format(value)
|
133
|
+
value&.to_s
|
134
|
+
end
|
125
135
|
|
126
|
-
|
127
|
-
|
128
|
-
if is_a?(klass)
|
129
|
-
return type
|
136
|
+
def dummy?
|
137
|
+
options[:dummy]
|
130
138
|
end
|
131
|
-
end
|
132
|
-
raise "wtf is #{inspect}"
|
133
|
-
end
|
134
139
|
|
135
|
-
|
136
|
-
|
137
|
-
|
140
|
+
def type
|
141
|
+
Datagrid::Filters::FILTER_TYPES.each do |type, klass|
|
142
|
+
return type if is_a?(klass)
|
143
|
+
end
|
144
|
+
raise "wtf is #{inspect}"
|
145
|
+
end
|
138
146
|
|
139
|
-
|
147
|
+
def enabled?(grid)
|
148
|
+
::Datagrid::Utils.process_availability(grid, options[:if], options[:unless])
|
149
|
+
end
|
140
150
|
|
141
|
-
|
142
|
-
|
143
|
-
|
151
|
+
def enum_checkboxes?
|
152
|
+
false
|
153
|
+
end
|
144
154
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
else
|
149
|
-
Datagrid::Utils.apply_args(value, scope, grid_object, &block)
|
150
|
-
end
|
151
|
-
end
|
155
|
+
def default_scope?
|
156
|
+
!block
|
157
|
+
end
|
152
158
|
|
153
|
-
|
154
|
-
case value
|
155
|
-
when String
|
156
|
-
value.split(separator)
|
157
|
-
when Range
|
158
|
-
[value.begin, value.end]
|
159
|
-
when Array
|
160
|
-
value
|
161
|
-
else
|
162
|
-
Array.wrap(value)
|
163
|
-
end
|
164
|
-
end
|
159
|
+
protected
|
165
160
|
|
166
|
-
|
167
|
-
|
168
|
-
|
161
|
+
def default_filter_where(scope, value)
|
162
|
+
driver.where(scope, name, value)
|
163
|
+
end
|
169
164
|
|
170
|
-
|
171
|
-
|
172
|
-
|
165
|
+
def execute(value, scope, grid_object)
|
166
|
+
if block&.arity == 1
|
167
|
+
scope.instance_exec(value, &block)
|
168
|
+
elsif block
|
169
|
+
Datagrid::Utils.apply_args(value, scope, grid_object, &block)
|
170
|
+
else
|
171
|
+
default_filter(value, scope)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def normalize_multiple_value(value)
|
176
|
+
case value
|
177
|
+
when String
|
178
|
+
value.split(separator)
|
179
|
+
when Range
|
180
|
+
[value.begin, value.end]
|
181
|
+
when Array
|
182
|
+
value
|
183
|
+
else
|
184
|
+
Array.wrap(value)
|
185
|
+
end
|
186
|
+
end
|
173
187
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
188
|
+
def default_separator
|
189
|
+
","
|
190
|
+
end
|
191
|
+
|
192
|
+
def driver
|
193
|
+
grid_class.driver
|
194
|
+
end
|
195
|
+
|
196
|
+
def default_filter(value, scope)
|
197
|
+
return nil if dummy?
|
198
|
+
|
199
|
+
if !driver.scope_has_column?(scope, name) && scope.respond_to?(name, true)
|
200
|
+
scope.public_send(name, value)
|
201
|
+
else
|
202
|
+
default_filter_where(scope, value)
|
203
|
+
end
|
204
|
+
end
|
180
205
|
end
|
181
206
|
end
|
182
|
-
|
183
207
|
end
|
184
|
-
|
@@ -1,9 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "datagrid/utils"
|
2
|
-
# @!visibility private
|
3
|
-
class Datagrid::Filters::BooleanFilter < Datagrid::Filters::BaseFilter
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
module Datagrid
|
6
|
+
module Filters
|
7
|
+
class BooleanFilter < Datagrid::Filters::BaseFilter
|
8
|
+
# @!visibility private
|
9
|
+
def initialize(grid, name, **opts)
|
10
|
+
super
|
11
|
+
options[:default] ||= false
|
12
|
+
end
|
8
13
|
|
14
|
+
def default_input_options
|
15
|
+
{ **super, type: "checkbox" }
|
16
|
+
end
|
17
|
+
|
18
|
+
def parse(value)
|
19
|
+
Datagrid::Utils.booleanize(value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
9
23
|
end
|