table_on_steroids 0.1.1.7 → 0.1.1.8

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
  SHA256:
3
- metadata.gz: cab4f42deed0c3f15ab7b961d1894ebd095e4027db8538818d1536e1028cedb5
4
- data.tar.gz: d0034c6bbd8c45d0134afadd91f61bfc717b8be30176049e7241ddf5cd40dec8
3
+ metadata.gz: e597331d8b98c9be9e068e59619f0227be2a6468d6dff1c3220d418d34951574
4
+ data.tar.gz: 8bec801c4b6a262b544bdaa8391d9ca74465af8bd11b58f2246b3d2662147f18
5
5
  SHA512:
6
- metadata.gz: d2f2d88f83663a65b6d0d87e2f56ef251b72bacaf949698d23cb97d74609aa59ef1ca5a04b89bb70326241c463ee3527b008f903ebb7a3865c9e9436d97926a2
7
- data.tar.gz: 84c1d3b4cc10b9b8afd456777a840274e0fe6b6628797b21d64a61eb24a32da29d2f1e8a6b6307c2fd5ecd739407cf4621a4e54624c9dd3f9fa6c562360e7e66
6
+ metadata.gz: 361a777ad599f401c5f41cc26583c1209d2f0341fd0181094f731398b0059ea047e9a1ad6f15bcdc5e1283cc15e5599fdcc18d4243f3ecadfd7e44cdb52795b9
7
+ data.tar.gz: 5530d6af19d153462dc298d82713b07b1de4b256726f5a9c23fe88eeb1fee7d2bf8c1ad620ddd97f704840d2159581d27f3f3ab141552177347eb23cec714b69
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  #####
2
- # The knowledge sharing concern permits creates a fast way to display,
3
- # filter and order data of a specific object.
4
+ # The knowledge sharing concern permits creates a fast way to display,
5
+ # filter and order data of a specific object.
4
6
  # To make it work:
5
7
  # In the Object controller, include TableOnSteroid and add this private methods:
6
8
 
@@ -9,11 +11,11 @@
9
11
  # 'key_defining_column_1' => {
10
12
  # label: 'Label 1', >> the column label
11
13
  # type: 'filter', >> can be 'filter', 'order' or nothing if no operations
12
- # multiselect: true, >> OPTIONAL in case of a filter
14
+ # multiselect: true, >> OPTIONAL in case of a filter
13
15
  # select_values: ['Option 1','Option 2'], >> in case of a filter, the options to select
14
16
  # filter_lambda: -> (objects, value) { .. } >> A lambda defining the filter if applicable
15
17
  # order_lambda: -> (objects) { .. }, >> A lambda defining the order if applicable
16
- # value_lambda: -> (object) { .. } >> A lambda defining the value in the table
18
+ # value_lambda: -> (object) { .. } >> A lambda defining the value in the table
17
19
  # },
18
20
  # 'key_defining_column_2' => {
19
21
  # ...
@@ -36,67 +38,70 @@ module TableOnSteroids
36
38
  included do
37
39
  OBJECTS_PER_PAGE = 50
38
40
  end
39
-
40
- def filter_and_order(objects, columns_on_steroid, global_search=nil, include_counts=false, all_pages=false, table_on_steroids=nil )
41
+
42
+ def filter_and_order(objects, columns_on_steroid, global_search = nil, include_counts = false, all_pages = false, table_on_steroids = nil)
41
43
  # execute the global search if you have one
42
- if(params[:search].present?)
43
- objects = global_search.call(objects,params[:search]) if global_search
44
- objects = all_column_search(objects, columns_on_steroid, params[:search], table_on_steroids) if !global_search
44
+ if params[:search].present?
45
+ objects = global_search.call(objects, params[:search]) if global_search
46
+ objects = all_column_search(objects, columns_on_steroid, params[:search], table_on_steroids) unless global_search
45
47
  end
46
48
 
47
- [:activerecord, :array].each do |t|
48
-
49
- #column search
50
- objects = objects_where(objects, columns_on_steroid, t)
49
+ %i[activerecord array].each do |t|
50
+ # column search
51
+ objects = objects_where(objects, columns_on_steroid, t)
51
52
 
52
- #apply filters
53
+ # apply filters
53
54
  if params[:filters].present?
54
- params[:filters].each_pair do | k, v |
55
+ params[:filters].each_pair do |k, v|
55
56
  filter = columns_on_steroid[k]
56
57
  next unless filter.present? && filter[t].present?
58
+
57
59
  objects = filter[t][:filter_lambda].call(objects, v)
58
60
  end
59
61
  end
60
62
 
61
- #order
62
- if params[:knowledge] && params[:knowledge] && params[:knowledge][:order].present? && (object_order = columns_on_steroid[params[:knowledge][:order]]).present?
63
- if(object_order[t] && object_order[t][:order_lambda])
64
- objects = objects.reorder(nil) if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
63
+ # order
64
+ if params[:knowledge] && params[:knowledge] && params[:knowledge][:order].present? && (object_order = columns_on_steroid[params[:knowledge][:order]]).present?
65
+ if object_order[t] && object_order[t][:order_lambda]
66
+ objects = objects.reorder(nil) if objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation)
65
67
  objects = object_order[t][:order_lambda].call(objects)
66
68
  end
67
- elsif ( object_order = columns_on_steroid.select{ |c,v| v[t] && v[t][:default_order] }.first&.last).present?
68
- if(object_order[t] && object_order[t][:order_lambda])
69
- objects = objects.reorder(nil) if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
69
+ elsif (object_order = columns_on_steroid.select { |_c, v| v[t] && v[t][:default_order] }.first&.last).present?
70
+ if object_order[t] && object_order[t][:order_lambda]
71
+ objects = objects.reorder(nil) if objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation)
70
72
  objects = object_order[t][:order_lambda].call(objects)
71
73
  end
72
- elsif(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
73
- #objects = objects.order('created_at desc')
74
+ elsif objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation)
75
+ # objects = objects.order('created_at desc')
74
76
  end
75
-
76
77
  end
77
78
 
78
- #pagination
79
+ # pagination
79
80
  return (include_counts ? [objects, 1, objects.count] : objects) if all_pages
80
- if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
81
- objects = objects.page(params[:page]).per(OBJECTS_PER_PAGE)
81
+
82
+ # GO to specific object page
83
+ page = get_page(objects, params, table_on_steroids)
84
+
85
+ if objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation)
86
+ objects = objects.page(page).per(OBJECTS_PER_PAGE)
82
87
  total_pages = objects.total_pages
83
88
  total_count = objects.total_count
84
- else
85
- objects = Kaminari.paginate_array(objects).page(params[:page]).per(OBJECTS_PER_PAGE)
89
+ else
90
+ objects = Kaminari.paginate_array(objects).page(page).per(OBJECTS_PER_PAGE)
86
91
  total_pages = objects.total_pages
87
92
  total_count = objects.total_count
88
93
  end
89
- include_counts ? [objects, total_pages, total_count] : objects
94
+ include_counts ? [objects, total_pages, total_count, page] : objects
90
95
  end
91
-
96
+
92
97
  def table_csv(objects, columns_on_steroid)
93
98
  titles = []
94
99
  csvs = CSV.generate do |csv|
95
- columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each{ |c,v| ((v[:download_label].present?) ? titles.push(*v[:download_label]) : titles << v[:label]) }
100
+ columns_on_steroid.select { |_c, v| v[:download_value_lambda].present? }.each { |_c, v| (v[:download_label].present? ? titles.push(*v[:download_label]) : titles << v[:label]) }
96
101
  csv << titles
97
102
  objects.each do |o|
98
103
  vals = []
99
- columns_on_steroid.select{ |c,v| v[:download_value_lambda].present? }.each do |c,v|
104
+ columns_on_steroid.select { |_c, v| v[:download_value_lambda].present? }.each do |_c, v|
100
105
  vals.push(*v[:download_value_lambda].call(o))
101
106
  end
102
107
  csv << vals
@@ -104,104 +109,121 @@ module TableOnSteroids
104
109
  end
105
110
  end
106
111
 
107
- def all_column_search(objects, columns_on_steroid, query, table_on_steroids=nil)
112
+ def all_column_search(objects, columns_on_steroid, query, table_on_steroids = nil)
108
113
  global_active_record_search_key = table_on_steroids&.dig(:global_active_record_search_key) || :id
109
114
  global_array_search_key_index = table_on_steroids&.dig(:global_array_search_key_index) || 0
110
- global_search_key = ((objects && objects[0].is_a?(Array)) ? global_array_search_key_index : global_active_record_search_key)
115
+ global_search_key = (objects && objects[0].is_a?(Array) ? global_array_search_key_index : global_active_record_search_key)
111
116
  global_search_key_params = {}
112
117
  matched_object_keys = []
113
118
 
114
- [:activerecord, :array].each do |t|
115
- columns_on_steroid.each do |key, value|
116
- if(value[t].present? && ((value[t][:search_lambda].present? && !["date","integer"].include?(value[:datatype])) || value[t][:global_search_lambda].present?))
117
- if(value[t][:global_search_lambda].present?)
118
- objects_returned = value[t][:global_search_lambda].call(objects, query)
119
- else
120
- objects_returned = value[t][:search_lambda].call(objects, query)
121
- end
122
- objects_returned.each{|o| matched_object_keys << o[global_search_key] } if(objects_returned)
123
- end
119
+ %i[activerecord array].each do |t|
120
+ columns_on_steroid.each do |_key, value|
121
+ next unless value[t].present? && ((value[t][:search_lambda].present? && !%w[date integer].include?(value[:datatype])) || value[t][:global_search_lambda].present?)
122
+
123
+ objects_returned = if value[t][:global_search_lambda].present?
124
+ value[t][:global_search_lambda].call(objects, query)
125
+ else
126
+ value[t][:search_lambda].call(objects, query)
127
+ end
128
+ objects_returned&.each { |o| matched_object_keys << o[global_search_key] }
124
129
  end
125
130
  end
126
131
 
127
- if(objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation))
132
+ if objects.is_a?(ActiveRecord::Base) || objects.is_a?(ActiveRecord::Relation)
128
133
  global_search_key_params[global_active_record_search_key] = matched_object_keys.uniq
129
134
  objects = objects.where(global_search_key_params)
130
- elsif(objects.is_a?(Array))
131
- objects = objects.select{|o| o if(matched_object_keys.uniq.include?(o[global_search_key]))}
135
+ elsif objects.is_a?(Array)
136
+ objects = objects.select { |o| o if matched_object_keys.uniq.include?(o[global_search_key]) }
132
137
  end
133
138
  end
134
-
135
-
139
+
136
140
  def objects_where(objects, columns_on_steroid, t)
137
- columns_on_steroid.select{
138
- |c,v| v[t] && v[t][:search_lambda].present? }.each{
139
- |c,v|
140
- if(params["search_operator_" + c]) # (v[:datatype].present? && ['date','integer'].include?(v[:datatype]))
141
- objects = v[t][:search_lambda].call(objects, params["search_" + c], params["search_operator_" + c]) if(params["search_" + c] && !params["search_" + c].blank?)
142
- else
143
- objects = v[t][:search_lambda].call(objects, params["search_" + c]) if(params["search_" + c] && !params["search_" + c].blank?)
144
- end
145
- }
141
+ columns_on_steroid.select do |_c, v|
142
+ v[t] && v[t][:search_lambda].present?
143
+ end .each do |c, v|
144
+ if params['search_operator_' + c] # (v[:datatype].present? && ['date','integer'].include?(v[:datatype]))
145
+ objects = v[t][:search_lambda].call(objects, params['search_' + c], params['search_operator_' + c]) if params['search_' + c] && !params['search_' + c].blank?
146
+ else
147
+ objects = v[t][:search_lambda].call(objects, params['search_' + c]) if params['search_' + c] && !params['search_' + c].blank?
148
+ end
149
+ end
146
150
  objects
147
151
  end
148
152
 
149
153
  def objects_where_date(objects, column, value, operator)
150
154
  case operator
151
- when "<",">=" then
152
- return objects.where((column + ' ' + operator + ' ?'), (value + " 00:00:00") )
153
- when ">","<=" then
154
- return objects.where((column + ' ' + operator + ' ?'), (value + " 23:59:59") )
155
- when "=" then
156
- return objects.where((column + ' between ? and ?'), (value + " 00:00:00"), (value + " 23:59:59") )
155
+ when '<', '>='
156
+ objects.where((column + ' ' + operator + ' ?'), (value + ' 00:00:00'))
157
+ when '>', '<='
158
+ objects.where((column + ' ' + operator + ' ?'), (value + ' 23:59:59'))
159
+ when '='
160
+ objects.where((column + ' between ? and ?'), (value + ' 00:00:00'), (value + ' 23:59:59'))
157
161
  end
158
162
  end
159
163
 
160
164
  def objects_where_ruby_date(object, column, value, operator)
161
165
  value = Date.strptime(value, '%m/%d/%Y').midnight
162
166
  case operator
163
- when "<" then
167
+ when '<'
164
168
  return object.send(column) < value
165
- when ">" then
169
+ when '>'
166
170
  return object.send(column) > value + 1.days - 1.seconds
167
- when "=" then
171
+ when '='
168
172
  return ((object.send(column) > value) && (object.send(column) < (value + 1.days - 1.seconds)))
169
173
  end
170
174
  end
171
175
 
172
176
  def object_where_integer(integer, operator, value)
173
177
  case operator
174
- when "<",">=" then
175
- return integer.to_f < value.to_f
176
- when "=" then
177
- return integer.to_f == value.to_f
178
- when ">" then
179
- return integer.to_f > value.to_f
178
+ when '<', '>='
179
+ integer.to_f < value.to_f
180
+ when '='
181
+ integer.to_f == value.to_f
182
+ when '>'
183
+ integer.to_f > value.to_f
180
184
  end
181
185
  end
182
186
 
183
- #save for later
187
+ # save for later
184
188
  def objects_where_or(objects, columns_on_steroid)
185
- where_sql = ""
189
+ where_sql = ''
186
190
  values = []
187
-
188
- #search all columns
189
- if(!query.blank?)
190
- where_sql += columns_on_steroid.select{
191
- |c,v| v[:or_where_sql].present? }.map{
192
- |c,v| v[:or_where_sql].map{
193
- |w| w[:where] }.join(" or ") }.join(" or ")
194
-
195
- columns_on_steroid.select{
196
- |c,v| v[:or_where_sql].present? }.map{
197
- |c,v| v[:or_where_sql].each{
198
- |w| values << ((w[:value]) ? w[:value] : ("%" + query + "%")) }}
199
-
200
- where_sql = ("(" + where_sql + ")") if !where_sql.blank?
191
+
192
+ # search all columns
193
+ unless query.blank?
194
+ where_sql += columns_on_steroid.select do |_c, v|
195
+ v[:or_where_sql].present?
196
+ end .map do |_c, v|
197
+ v[:or_where_sql].map do |w|
198
+ w[:where]
199
+ end .join(' or ')
200
+ end .join(' or ')
201
+
202
+ columns_on_steroid.select do |_c, v|
203
+ v[:or_where_sql].present?
204
+ end .map do |_c, v|
205
+ v[:or_where_sql].each do |w|
206
+ values << (w[:value] || ('%' + query + '%'))
207
+ end
208
+ end
209
+
210
+ where_sql = ('(' + where_sql + ')') unless where_sql.blank?
201
211
 
202
212
  objects = objects.where(where_sql, *values)
203
213
  end
204
214
  objects
205
215
  end
216
+
217
+ def get_page(objects, params, table_on_steroids)
218
+ active_record_object_fetch_opts = table_on_steroids&.dig(:active_record_object_fetch_opts)
219
+ key_lambda = table_on_steroids&.dig(:key_lambda)
220
+ return params[:page] unless active_record_object_fetch_opts && key_lambda
221
+
222
+ object = objects.where(active_record_object_fetch_opts).first
223
+ return params[:page] unless object
224
+
225
+ index = objects.index { |o| key_lambda.call(o) == key_lambda.call(object) }
226
+ index ? index / OBJECTS_PER_PAGE + 1 : params[:page]
227
+ end
206
228
  end
207
229
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module TableOnSteroids
2
- VERSION = '0.1.1.7'
4
+ VERSION = '0.1.1.8'
3
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: table_on_steroids
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1.7
4
+ version: 0.1.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marieke Gueye
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2019-09-16 00:00:00.000000000 Z
12
+ date: 2019-10-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bootstrap-datepicker-rails