effective_datatables 2.1.15 → 2.1.16

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c6dfe9f0b9ba5357af62f40f291e1cb458fc0fb2
4
- data.tar.gz: 3ecaba062fc0c5050ea99b4cda86cf5aac2a8be5
3
+ metadata.gz: 66e34e1b67e2fc97fba5d01227d7878a55e3c102
4
+ data.tar.gz: 2a245701fa04c1baee5fd25458203a31836e847a
5
5
  SHA512:
6
- metadata.gz: 14988d2a7879a5bd388e02cab3243d0658cad0189f96188cb3e1f68b14fe06e00248900aa37dd74cbc445061404c4a75b6f8114c60bab2df329a11c78b7a9b2c
7
- data.tar.gz: 31b81c5aa261fe824376dcd4276e06cc57597ce84fd81ec65a3367de20cf3062646d76a843e66373d7de0cbba0e7d3e2dd552295241738157efc866d44c395a6
6
+ metadata.gz: 45e18b50fccd9e485b31e826141e9014cfd194288b78977cff12b4bdb875b9fba1543fc5a178a4d49532be0c86cda53ba2f44a2ad96b49c6d27eca496c86f82a
7
+ data.tar.gz: c99ffe12d35229644454a8ab5ee31a09ea86c2102fb2befb67b8d2edea5deca5524a35ba4bf6cd763ceb3029844dfe4060b9b7f8398cbbc33427819d2646af2e
@@ -2,7 +2,7 @@ module Effective
2
2
  class ActiveRecordDatatableTool
3
3
  attr_accessor :table_columns
4
4
 
5
- delegate :order_name, :order_direction, :page, :per_page, :search_column, :collection_class, :to => :@datatable
5
+ delegate :order_name, :order_direction, :page, :per_page, :search_column, :collection_class, :quote_sql, :to => :@datatable
6
6
 
7
7
  def initialize(datatable, table_columns)
8
8
  @datatable = datatable
@@ -21,13 +21,20 @@ module Effective
21
21
  return collection if order_column.blank?
22
22
 
23
23
  column = order_column[:column]
24
+ before = ''; after = ''
24
25
 
25
- if [:string, :text].include?(order_column[:type]) && order_column[:sql_as_column] != true
26
- collection.order("COALESCE(#{column}, '') #{order_direction}")
27
- elsif order_column[:type] == :belongs_to_polymorphic
28
- collection.order("(#{column.sub('_id"', '_type"')}, #{column}) #{order_direction}")
26
+ if postgres?
27
+ after = ' NULLS LAST'
28
+ elsif mysql?
29
+ before = "ISNULL(#{column}), "
30
+ end
31
+
32
+ if order_column[:type] == :belongs_to_polymorphic
33
+ collection.order("#{before}#{column.sub('_id', '_type')} #{order_direction}, #{column} #{order_direction}#{after}")
34
+ elsif order_column[:sql_as_column] == true
35
+ collection.order("#{column} #{order_direction}")
29
36
  else
30
- collection.order("COALESCE(#{column}, '') #{order_direction}")
37
+ collection.order("#{before}#{column} #{order_direction}#{after}")
31
38
  end
32
39
  end
33
40
 
@@ -49,14 +56,14 @@ module Effective
49
56
  if (table_column[:filter][:type] == :select && table_column[:filter][:fuzzy] != true) || sql_op != :where
50
57
  collection.public_send(sql_op, "#{column} = :term", term: term)
51
58
  else
52
- collection.public_send(sql_op, "#{column} ILIKE :term", term: "%#{term}%")
59
+ collection.public_send(sql_op, "#{column} #{ilike} :term", term: "%#{term}%")
53
60
  end
54
61
  when :belongs_to_polymorphic
55
62
  # our key will be something like Post_15, or Event_1
56
63
  (type, id) = term.split('_')
57
64
 
58
65
  if type.present? && id.present?
59
- collection.public_send(sql_op, "#{column} = :id AND #{column.sub('_id"', '_type"')} = :type", id: id, type: type)
66
+ collection.public_send(sql_op, "#{column} = :id AND #{column.sub('_id', '_type')} = :type", id: id, type: type)
60
67
  else
61
68
  collection
62
69
  end
@@ -85,7 +92,7 @@ module Effective
85
92
  when :effective_address
86
93
  ids = Effective::Address
87
94
  .where('addressable_type = ?', collection_class.name)
88
- .where('address1 ILIKE :term OR address2 ILIKE :term OR city ILIKE :term OR postal_code ILIKE :term OR state_code = :code OR country_code = :code', term: "%#{term}%", code: term)
95
+ .where("address1 #{ilike} :term OR address2 #{ilike} :term OR city #{ilike} :term OR postal_code #{ilike} :term OR state_code = :code OR country_code = :code", term: "%#{term}%", code: term)
89
96
  .pluck(:addressable_id)
90
97
 
91
98
  collection.public_send(sql_op, id: ids)
@@ -137,5 +144,21 @@ module Effective
137
144
  collection.page(page).per(per_page)
138
145
  end
139
146
 
147
+ protected
148
+
149
+ def postgres?
150
+ return @postgres unless @postgres.nil?
151
+ @postgres ||= (collection_class.connection.kind_of?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) rescue false)
152
+ end
153
+
154
+ def mysql?
155
+ return @mysql unless @mysql.nil?
156
+ @mysql ||= (collection_class.connection.kind_of?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) rescue false)
157
+ end
158
+
159
+ def ilike
160
+ @ilike ||= (postgres? ? 'ILIKE' : 'LIKE') # Only Postgres supports ILIKE, Mysql and Sqlite3 use LIKE
161
+ end
162
+
140
163
  end
141
164
  end
@@ -8,6 +8,10 @@ module Effective
8
8
  @table_columns = initialize_column_options(@table_columns)
9
9
  end
10
10
 
11
+ def quote_sql(name)
12
+ collection_class.connection.quote_column_name(name) rescue name
13
+ end
14
+
11
15
  protected
12
16
 
13
17
  def initialize_column_options(cols)
@@ -47,7 +51,7 @@ module Effective
47
51
  cols[name][:array_index] = index # The index of this column in the collection, regardless of hidden table_columns
48
52
  cols[name][:name] ||= name
49
53
  cols[name][:label] ||= name.titleize
50
- cols[name][:column] ||= (sql_table && sql_column) ? "\"#{sql_table.name}\".\"#{sql_column.name}\"" : name
54
+ cols[name][:column] ||= (sql_table && sql_column) ? "#{quote_sql(sql_table.name)}.#{quote_sql(sql_column.name)}" : name
51
55
  cols[name][:width] ||= nil
52
56
  cols[name][:sortable] = true if cols[name][:sortable].nil?
53
57
  cols[name][:visible] = true if cols[name][:visible].nil?
@@ -89,7 +93,7 @@ module Effective
89
93
  # EffectiveRoles, if you do table_column :roles, everything just works
90
94
  if name == 'roles' && defined?(EffectiveRoles) && collection.respond_to?(:with_role)
91
95
  cols[name][:sortable] = true
92
- cols[name][:column] = sql_table.present? ? "\"#{sql_table.name}\".\"roles_mask\"" : name
96
+ cols[name][:column] = sql_table.present? ? "#{quote_sql(sql_table.name)}.#{quote_sql('roles_mask')}" : name
93
97
  cols[name][:type] = :effective_roles
94
98
  end
95
99
 
@@ -1,3 +1,3 @@
1
1
  module EffectiveDatatables
2
- VERSION = '2.1.15'.freeze
2
+ VERSION = '2.1.16'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_datatables
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.15
4
+ version: 2.1.16
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect