effective_datatables 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/app/models/effective/active_record_datatable_tool.rb +19 -18
- data/app/models/effective/effective_datatable/options.rb +13 -4
- data/app/models/effective/effective_datatable/rendering.rb +19 -14
- data/lib/effective_datatables/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e5dd14893bb1a01f311ccb678ab2ab199177d7c6
|
4
|
+
data.tar.gz: 0dca76ae65b7c576ccdb3bdb2eba5e30ab00b44d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34f5a501b53fa8be7ce46dd44522b045534e4c8e6c51c68c2b77f03e3326b09bf8d7fdea6e7fb27949607b4b5e9dd3a21d7f49bee22fea48b62bbb2ec635f5fc
|
7
|
+
data.tar.gz: f2bf133e9d2b309d4eb199a61fbb402138c7f945879796832237541b36759592728486497269d2b4448b9437e8f12edbc9f4980d0297f849583c44f252523ea1
|
data/README.md
CHANGED
@@ -346,6 +346,7 @@ Some additional, lesser used options include:
|
|
346
346
|
|
347
347
|
```ruby
|
348
348
|
:filter => {:fuzzy => true} # Will use an ILIKE/includes rather than = when filtering. Use this for selects.
|
349
|
+
:filter => {sql_operation => :having} # Will use .having() instead of .where() to handle aggregate columns (autodetected)
|
349
350
|
```
|
350
351
|
|
351
352
|
### Rendering Options
|
@@ -38,13 +38,14 @@ module Effective
|
|
38
38
|
|
39
39
|
def search_column_with_defaults(collection, table_column, term)
|
40
40
|
column = table_column[:column]
|
41
|
+
sql_op = table_column[:filter][:sql_operation] || :where # only other option is :having
|
41
42
|
|
42
43
|
case table_column[:type]
|
43
44
|
when :string, :text
|
44
|
-
if table_column[:filter][:type] == :select && table_column[:filter][:fuzzy] != true
|
45
|
-
collection.
|
45
|
+
if (table_column[:filter][:type] == :select && table_column[:filter][:fuzzy] != true) || sql_op != :where
|
46
|
+
collection.public_send(sql_op, "#{column} = :term", term: term)
|
46
47
|
else
|
47
|
-
collection.
|
48
|
+
collection.public_send(sql_op, "#{column} ILIKE :term", term: "%#{term}%")
|
48
49
|
end
|
49
50
|
when :has_many
|
50
51
|
inverse_ids = term.split(',').map { |term| (term = term.to_i) == 0 ? nil : term }.compact
|
@@ -61,7 +62,15 @@ module Effective
|
|
61
62
|
|
62
63
|
ids = klass.where(id: inverse_ids).joins(inverse.name).pluck(inverse.foreign_key)
|
63
64
|
|
64
|
-
collection.
|
65
|
+
collection.public_send(sql_op, id: ids)
|
66
|
+
when :obfuscated_id
|
67
|
+
if (deobfuscated_id = collection.deobfuscate(term)) == term # We weren't able to deobfuscate it, so this is an Invalid ID
|
68
|
+
collection.public_send(sql_op, "#{column} = :term", term: 0)
|
69
|
+
else
|
70
|
+
collection.public_send(sql_op, "#{column} = :term", term: deobfuscated_id)
|
71
|
+
end
|
72
|
+
when :effective_roles
|
73
|
+
collection.with_role(term)
|
65
74
|
when :datetime, :date
|
66
75
|
begin
|
67
76
|
digits = term.scan(/(\d+)/).flatten.map(&:to_i)
|
@@ -84,29 +93,21 @@ module Effective
|
|
84
93
|
end_at = start_at
|
85
94
|
end
|
86
95
|
|
87
|
-
collection.
|
96
|
+
collection.public_send(sql_op, "#{column} >= :start_at AND #{column} <= :end_at", start_at: start_at, end_at: end_at)
|
88
97
|
rescue => e
|
89
98
|
collection
|
90
99
|
end
|
91
|
-
when :obfuscated_id
|
92
|
-
if (deobfuscated_id = collection.deobfuscate(term)) == term # We weren't able to deobfuscate it, so this is an Invalid ID
|
93
|
-
collection.where("#{column} = :term", term: 0)
|
94
|
-
else
|
95
|
-
collection.where("#{column} = :term", term: deobfuscated_id)
|
96
|
-
end
|
97
|
-
when :effective_roles
|
98
|
-
collection.with_role(term)
|
99
100
|
when :integer
|
100
|
-
collection.
|
101
|
+
collection.public_send(sql_op, "#{column} = :term", term: term.to_i)
|
101
102
|
when :year
|
102
|
-
collection.
|
103
|
+
collection.public_send(sql_op, "EXTRACT(YEAR FROM #{column}) = :term", term: term.to_i)
|
103
104
|
when :price
|
104
105
|
price_in_cents = (term.gsub(/[^0-9|\.]/, '').to_f * 100.0).to_i
|
105
|
-
collection.
|
106
|
+
collection.public_send(sql_op, "#{column} = :term", term: price_in_cents)
|
106
107
|
when :currency
|
107
|
-
collection.
|
108
|
+
collection.public_send(sql_op, "#{column} = :term", term: term.gsub(/[^0-9|\.]/, '').to_f)
|
108
109
|
else
|
109
|
-
collection.
|
110
|
+
collection.public_send(sql_op, "#{column} = :term", term: term)
|
110
111
|
end
|
111
112
|
end
|
112
113
|
|
@@ -87,7 +87,7 @@ module Effective
|
|
87
87
|
cols[name][:sql_as_column] = true
|
88
88
|
end
|
89
89
|
|
90
|
-
cols[name][:filter] = initialize_table_column_filter(cols[name]
|
90
|
+
cols[name][:filter] = initialize_table_column_filter(cols[name], belong_tos[name], has_manys[name])
|
91
91
|
|
92
92
|
if cols[name][:partial]
|
93
93
|
cols[name][:partial_local] ||= (sql_table.try(:name) || cols[name][:partial].split('/').last(2).first.presence || 'obj').singularize.to_sym
|
@@ -102,7 +102,11 @@ module Effective
|
|
102
102
|
|
103
103
|
end
|
104
104
|
|
105
|
-
def initialize_table_column_filter(
|
105
|
+
def initialize_table_column_filter(column, belongs_to, has_many)
|
106
|
+
filter = column[:filter]
|
107
|
+
col_type = column[:type]
|
108
|
+
sql_column = column[:column].to_s.upcase
|
109
|
+
|
106
110
|
return {type: :null} if filter == false
|
107
111
|
|
108
112
|
filter = {type: filter.to_sym} if filter.kind_of?(String)
|
@@ -111,17 +115,22 @@ module Effective
|
|
111
115
|
# This is a fix for passing filter[:selected] == false, it needs to be 'false'
|
112
116
|
filter[:selected] = filter[:selected].to_s unless filter[:selected].nil?
|
113
117
|
|
118
|
+
# Check if this is an aggregate column
|
119
|
+
if ['SUM(', 'COUNT(', 'MAX(', 'MIN(', 'AVG('].any? { |str| sql_column.include?(str) }
|
120
|
+
filter[:sql_operation] = :having
|
121
|
+
end
|
122
|
+
|
114
123
|
case col_type
|
115
124
|
when :belongs_to
|
116
125
|
{
|
117
126
|
type: :select,
|
118
|
-
values: Proc.new { belongs_to[:klass].all.map { |obj| [obj.to_s, obj.id] }.sort { |x, y| x[
|
127
|
+
values: Proc.new { belongs_to[:klass].all.map { |obj| [obj.to_s, obj.id] }.sort { |x, y| x[0] <=> y[0] } }
|
119
128
|
}
|
120
129
|
when :has_many
|
121
130
|
{
|
122
131
|
type: :select,
|
123
132
|
multiple: true,
|
124
|
-
values: Proc.new { has_many[:klass].all.map { |obj| [obj.to_s, obj.id] }.sort { |x, y| x[
|
133
|
+
values: Proc.new { has_many[:klass].all.map { |obj| [obj.to_s, obj.id] }.sort { |x, y| x[0] <=> y[0] } }
|
125
134
|
}
|
126
135
|
when :effective_roles
|
127
136
|
{type: :select, values: EffectiveRoles.roles}
|
@@ -95,27 +95,32 @@ module Effective
|
|
95
95
|
elsif opts[:type] == :belongs_to
|
96
96
|
(obj.send(name) rescue nil).to_s
|
97
97
|
elsif opts[:type] == :has_many
|
98
|
-
objs = (obj.send(name).map
|
98
|
+
objs = (obj.send(name).map { |x| x.to_s }.sort rescue [])
|
99
99
|
objs.length == 1 ? objs.first : (opts[:sentence] ? objs.to_sentence : objs.join('<br>'))
|
100
100
|
elsif opts[:type] == :obfuscated_id
|
101
101
|
(obj.send(:to_param) rescue nil).to_s
|
102
102
|
elsif opts[:type] == :effective_roles
|
103
103
|
(obj.send(:roles) rescue []).join(', ')
|
104
|
-
elsif opts[:type] == :datetime
|
105
|
-
(obj.send(name).strftime(EffectiveDatatables.datetime_format) rescue nil)
|
106
|
-
elsif opts[:type] == :date
|
107
|
-
(obj.send(name).strftime(EffectiveDatatables.date_format) rescue nil)
|
108
|
-
elsif opts[:type] == :price
|
109
|
-
# This is price_to_currency from effective_form_inputs retyped...
|
110
|
-
price = ((obj.send(name) || 0) rescue 0)
|
111
|
-
raise 'column type: price expects an Integer representing the number of cents' unless price.kind_of?(Integer)
|
112
|
-
number_to_currency(price / 100.0)
|
113
|
-
elsif opts[:type] == :currency
|
114
|
-
number_to_currency(((obj.send(name) || 0) rescue 0))
|
115
104
|
else
|
116
|
-
|
105
|
+
# Normal value, but we still may want to format it
|
106
|
+
value = (obj.send(name) rescue nil) || (obj[name] rescue nil) || (obj[opts[:array_index]] rescue nil)
|
107
|
+
|
108
|
+
case opts[:type]
|
109
|
+
when :datetime
|
110
|
+
value.strftime(EffectiveDatatables.datetime_format) rescue nil
|
111
|
+
when :date
|
112
|
+
value.strftime(EffectiveDatatables.date_format) rescue nil
|
113
|
+
when :price
|
114
|
+
# This is an integer value, "number of cents"
|
115
|
+
value ||= 0
|
116
|
+
raise 'column type: price expects an Integer representing the number of cents' unless value.kind_of?(Integer)
|
117
|
+
number_to_currency(value / 100.0)
|
118
|
+
when :currency
|
119
|
+
number_to_currency(value || 0)
|
120
|
+
else
|
121
|
+
value
|
122
|
+
end
|
117
123
|
end
|
118
|
-
|
119
124
|
end
|
120
125
|
end
|
121
126
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_datatables
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-08-
|
11
|
+
date: 2015-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|