effective_datatables 2.3.1 → 2.3.2
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1a04998ee9c940102f9df4a951d72bce9e4df41
|
4
|
+
data.tar.gz: 8344057c6f04c15bdf157b1e712634a3ffcaf73d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49182f2222e7299401a32bbc36ed197fe3e4e3ed08d3811f4b0136f3e99216172ae6240bde97b255ed9aec62b1702c785494da8f69a610f834da6699a432d951
|
7
|
+
data.tar.gz: 827c9fdd9c2ed56210216634e480e1a857283a67d59005dda710ac59fb3db237ca9e4a718dbfa1553583cc80d3fbb83fded0aaaae24611796ade1b1f62e6af84
|
@@ -100,6 +100,38 @@ module Effective
|
|
100
100
|
klass.where(conditions.join(' OR '), term: "%#{term}%", num: term.to_i).joins(inverse.name).pluck(inverse.foreign_key)
|
101
101
|
end
|
102
102
|
|
103
|
+
collection.public_send(sql_op, id: ids)
|
104
|
+
|
105
|
+
when :has_and_belongs_to_many
|
106
|
+
reflection = collection.klass.reflect_on_association(table_column[:name].to_sym)
|
107
|
+
raise "unable to find #{collection.klass.name} :has_and_belongs_to_many :#{table_column[:name]} association" unless reflection
|
108
|
+
|
109
|
+
obj = reflection.build_association({})
|
110
|
+
klass = obj.class
|
111
|
+
|
112
|
+
inverse = reflection.inverse_of || klass.reflect_on_association(collection.table_name) || obj.class.reflect_on_association(collection.table_name.singularize)
|
113
|
+
raise "unable to find #{klass.name} has_and_belongs_to_many :#{collection.table_name} or belongs_to :#{collection.table_name.singularize} associations" unless inverse
|
114
|
+
|
115
|
+
ids = if [:select, :grouped_select].include?(table_column[:filter][:type])
|
116
|
+
# Treat the search term as one or more IDs
|
117
|
+
inverse_ids = term.split(',').map { |term| (term = term.to_i) == 0 ? nil : term }.compact
|
118
|
+
return collection unless inverse_ids.present?
|
119
|
+
|
120
|
+
klass.where(id: inverse_ids).flat_map { |klass| (klass.send(inverse.name).pluck(:id) rescue []) }
|
121
|
+
else
|
122
|
+
# Treat the search term as a string.
|
123
|
+
|
124
|
+
klass_columns = if (table_column[:column] == klass.table_name) # No custom column has been defined
|
125
|
+
klass.columns.map { |col| col.name if col.text? }.compact # Search all database text? columns
|
126
|
+
else
|
127
|
+
[table_column[:column].gsub("#{klass.table_name}.", '')] # table_column :order_items, column: 'order_items.title'
|
128
|
+
end
|
129
|
+
|
130
|
+
conditions = klass_columns.map { |col_name| "#{klass.table_name}.#{col_name} #{ilike} :term" }
|
131
|
+
|
132
|
+
klass.where(conditions.join(' OR '), term: "%#{term}%", num: term.to_i).flat_map { |klass| (klass.send(inverse.name).pluck(:id) rescue []) }
|
133
|
+
end
|
134
|
+
|
103
135
|
collection.public_send(sql_op, id: ids)
|
104
136
|
when :obfuscated_id
|
105
137
|
if (deobfuscated_id = collection.deobfuscate(term)) == term # We weren't able to deobfuscate it, so this is an Invalid ID
|
@@ -30,11 +30,18 @@ module Effective
|
|
30
30
|
retval
|
31
31
|
end
|
32
32
|
|
33
|
-
# has_manys
|
34
|
-
has_manys =
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
# Figure out has_manys and has_many_belongs_to_many's
|
34
|
+
has_manys = {}
|
35
|
+
has_and_belongs_to_manys = {}
|
36
|
+
|
37
|
+
(collection.klass.reflect_on_all_associations() rescue []).each do |reflect|
|
38
|
+
if reflect.macro == :has_many
|
39
|
+
klass = reflect.klass || (reflect.build_association({}).class)
|
40
|
+
has_manys[reflect.name.to_s] = { klass: klass }
|
41
|
+
elsif reflect.macro == :has_and_belongs_to_many
|
42
|
+
klass = reflect.klass || (reflect.build_association({}).class)
|
43
|
+
has_and_belongs_to_manys[reflect.name.to_s] = { klass: klass }
|
44
|
+
end
|
38
45
|
end
|
39
46
|
|
40
47
|
table_columns = cols.each_with_index do |(name, _), index|
|
@@ -68,6 +75,8 @@ module Effective
|
|
68
75
|
end
|
69
76
|
elsif has_manys.key?(name)
|
70
77
|
:has_many
|
78
|
+
elsif has_and_belongs_to_manys.key?(name)
|
79
|
+
:has_and_belongs_to_many
|
71
80
|
elsif cols[name][:bulk_actions_column]
|
72
81
|
:bulk_actions_column
|
73
82
|
elsif name.include?('_address') && (collection_class.new rescue nil).respond_to?(:effective_addresses)
|
@@ -105,7 +114,7 @@ module Effective
|
|
105
114
|
cols[name][:sql_as_column] = true
|
106
115
|
end
|
107
116
|
|
108
|
-
cols[name][:filter] = initialize_table_column_filter(cols[name], belong_tos[name], has_manys[name])
|
117
|
+
cols[name][:filter] = initialize_table_column_filter(cols[name], belong_tos[name], has_manys[name], has_and_belongs_to_manys[name])
|
109
118
|
|
110
119
|
if cols[name][:partial]
|
111
120
|
cols[name][:partial_local] ||= (sql_table.try(:name) || cols[name][:partial].split('/').last(2).first.presence || 'obj').singularize.to_sym
|
@@ -127,7 +136,7 @@ module Effective
|
|
127
136
|
end
|
128
137
|
end
|
129
138
|
|
130
|
-
def initialize_table_column_filter(column, belongs_to, has_many)
|
139
|
+
def initialize_table_column_filter(column, belongs_to, has_many, has_and_belongs_to_manys)
|
131
140
|
filter = column[:filter]
|
132
141
|
col_type = column[:type]
|
133
142
|
sql_column = column[:column].to_s.upcase
|
@@ -181,6 +190,18 @@ module Effective
|
|
181
190
|
end
|
182
191
|
)
|
183
192
|
}
|
193
|
+
when :has_and_belongs_to_many
|
194
|
+
{
|
195
|
+
type: :select,
|
196
|
+
multiple: true,
|
197
|
+
values: (
|
198
|
+
if has_and_belongs_to_manys[:klass].respond_to?(:datatables_filter)
|
199
|
+
Proc.new { has_and_belongs_to_manys[:klass].datatables_filter }
|
200
|
+
else
|
201
|
+
Proc.new { has_and_belongs_to_manys[:klass].all.map { |obj| [obj.to_s, obj.id] }.sort { |x, y| x[0] <=> y[0] } }
|
202
|
+
end
|
203
|
+
)
|
204
|
+
}
|
184
205
|
when :effective_address
|
185
206
|
{type: :string}
|
186
207
|
when :effective_roles
|
@@ -119,7 +119,9 @@ module Effective
|
|
119
119
|
elsif opts[:type] == :belongs_to_polymorphic
|
120
120
|
(obj.send(name) rescue nil)
|
121
121
|
elsif opts[:type] == :has_many
|
122
|
-
(obj.send(name).
|
122
|
+
(obj.send(name).map { |obj| obj.to_s }.join('<br>') rescue BLANK)
|
123
|
+
elsif opts[:type] == :has_and_belongs_to_many
|
124
|
+
(obj.send(name).map { |obj| obj.to_s }.join('<br>') rescue BLANK)
|
123
125
|
elsif opts[:type] == :bulk_actions_column
|
124
126
|
BLANK
|
125
127
|
elsif opts[:type] == :obfuscated_id
|