datagrid 1.8.1 → 2.0.0.pre.alpha
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 +31 -7
- data/{Readme.markdown → README.md} +46 -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 -5
- 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 -8
- data/lib/datagrid/active_model.rb +9 -17
- data/lib/datagrid/base.rb +39 -0
- data/lib/datagrid/column_names_attribute.rb +12 -12
- data/lib/datagrid/columns/column.rb +155 -133
- data/lib/datagrid/columns.rb +495 -282
- data/lib/datagrid/configuration.rb +23 -10
- data/lib/datagrid/core.rb +184 -150
- data/lib/datagrid/deprecated_object.rb +20 -0
- data/lib/datagrid/drivers/abstract_driver.rb +13 -25
- data/lib/datagrid/drivers/active_record.rb +24 -26
- data/lib/datagrid/drivers/array.rb +26 -17
- data/lib/datagrid/drivers/mongo_mapper.rb +15 -14
- data/lib/datagrid/drivers/mongoid.rb +16 -18
- 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 -142
- 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 -27
- data/lib/datagrid/filters/float_filter.rb +16 -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 +234 -106
- data/lib/datagrid/form_builder.rb +116 -128
- data/lib/datagrid/generators/scaffold.rb +185 -0
- data/lib/datagrid/generators/views.rb +20 -0
- data/lib/datagrid/helper.rb +397 -22
- data/lib/datagrid/ordering.rb +81 -87
- data/lib/datagrid/rspec.rb +8 -12
- data/lib/datagrid/utils.rb +42 -38
- data/lib/datagrid/version.rb +3 -1
- data/lib/datagrid.rb +18 -28
- data/templates/base.rb.erb +33 -7
- data/templates/grid.rb.erb +1 -1
- metadata +18 -19
- 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,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Datagrid
|
2
4
|
module Drivers
|
3
5
|
# @!visibility private
|
4
6
|
class Array < AbstractDriver
|
5
|
-
|
6
7
|
def self.match?(scope)
|
7
|
-
!Datagrid::Drivers::ActiveRecord.match?(scope) && (
|
8
|
+
!Datagrid::Drivers::ActiveRecord.match?(scope) && (
|
9
|
+
scope.is_a?(::Array) || scope.is_a?(Enumerator) ||
|
10
|
+
(defined?(::ActiveRecord::Result) && scope.is_a?(::ActiveRecord::Result))
|
11
|
+
)
|
8
12
|
end
|
9
13
|
|
10
14
|
def to_scope(scope)
|
@@ -13,15 +17,16 @@ module Datagrid
|
|
13
17
|
|
14
18
|
def where(scope, attribute, value)
|
15
19
|
scope.select do |object|
|
16
|
-
object
|
20
|
+
get(object, attribute) == value
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
20
24
|
def asc(scope, order)
|
21
25
|
return scope unless order
|
22
26
|
return scope if order.empty?
|
27
|
+
|
23
28
|
scope.sort_by do |object|
|
24
|
-
object
|
29
|
+
get(object, order)
|
25
30
|
end
|
26
31
|
end
|
27
32
|
|
@@ -29,7 +34,7 @@ module Datagrid
|
|
29
34
|
asc(scope, order).reverse
|
30
35
|
end
|
31
36
|
|
32
|
-
def default_order(
|
37
|
+
def default_order(_scope, column_name)
|
33
38
|
column_name
|
34
39
|
end
|
35
40
|
|
@@ -39,38 +44,36 @@ module Datagrid
|
|
39
44
|
|
40
45
|
def greater_equal(scope, field, value)
|
41
46
|
scope.select do |object|
|
42
|
-
|
43
|
-
compare_value.respond_to?(:>=) && compare_value >= value
|
47
|
+
get(object, field) >= value
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
47
51
|
def less_equal(scope, field, value)
|
48
52
|
scope.select do |object|
|
49
|
-
|
50
|
-
compare_value.respond_to?(:<=) && compare_value <= value
|
53
|
+
get(object, field) <= value
|
51
54
|
end
|
52
55
|
end
|
53
56
|
|
54
|
-
def
|
57
|
+
def scope_has_column?(scope, column_name)
|
55
58
|
scope.any? && scope.first.respond_to?(column_name)
|
56
59
|
end
|
57
60
|
|
58
|
-
def
|
59
|
-
|
60
|
-
timestamp_class?(scope.first
|
61
|
+
def timestamp_column?(scope, column_name)
|
62
|
+
scope_has_column?(scope, column_name) &&
|
63
|
+
timestamp_class?(get(scope.first, column_name).class)
|
61
64
|
end
|
62
65
|
|
63
66
|
def contains(scope, field, value)
|
64
67
|
scope.select do |object|
|
65
|
-
object
|
68
|
+
get(object, field).to_s.include?(value)
|
66
69
|
end
|
67
70
|
end
|
68
71
|
|
69
|
-
def column_names(
|
72
|
+
def column_names(_scope)
|
70
73
|
[]
|
71
74
|
end
|
72
75
|
|
73
|
-
def batch_each(scope,
|
76
|
+
def batch_each(scope, _batch_size, &block)
|
74
77
|
scope.each(&block)
|
75
78
|
end
|
76
79
|
|
@@ -78,9 +81,15 @@ module Datagrid
|
|
78
81
|
asset
|
79
82
|
end
|
80
83
|
|
81
|
-
def can_preload?(
|
84
|
+
def can_preload?(_scope, _association)
|
82
85
|
false
|
83
86
|
end
|
87
|
+
|
88
|
+
protected
|
89
|
+
|
90
|
+
def get(object, property)
|
91
|
+
object.is_a?(Hash) ? object[property] : object.public_send(property)
|
92
|
+
end
|
84
93
|
end
|
85
94
|
end
|
86
95
|
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 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
|
|
@@ -60,10 +60,11 @@ module Datagrid
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def normalized_column_type(scope, field)
|
63
|
-
type = to_scope(scope).klass.fields[field.to_s]
|
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
|