admin_assistant 0.0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. data/README +3 -28
  2. data/Rakefile +18 -10
  3. data/init.rb +1 -0
  4. data/install.rb +5 -1
  5. data/lib/admin_assistant/active_record_column.rb +211 -0
  6. data/lib/admin_assistant/association_target.rb +35 -0
  7. data/lib/admin_assistant/belongs_to_column.rb +186 -0
  8. data/lib/admin_assistant/builder.rb +222 -35
  9. data/lib/admin_assistant/column.rb +266 -297
  10. data/lib/admin_assistant/default_search_column.rb +41 -0
  11. data/lib/admin_assistant/file_column_column.rb +73 -0
  12. data/lib/admin_assistant/form_view.rb +7 -68
  13. data/lib/admin_assistant/helper.rb +4 -2
  14. data/lib/admin_assistant/index.rb +101 -81
  15. data/lib/admin_assistant/paperclip_column.rb +45 -0
  16. data/lib/admin_assistant/polymorphic_belongs_to_column.rb +102 -0
  17. data/lib/admin_assistant/request/autocomplete.rb +47 -0
  18. data/lib/admin_assistant/request/base.rb +176 -0
  19. data/lib/admin_assistant/request/create.rb +27 -0
  20. data/lib/admin_assistant/request/destroy.rb +15 -0
  21. data/lib/admin_assistant/request/edit.rb +11 -0
  22. data/lib/admin_assistant/request/index.rb +26 -0
  23. data/lib/admin_assistant/request/new.rb +19 -0
  24. data/lib/admin_assistant/request/show.rb +24 -0
  25. data/lib/admin_assistant/request/update.rb +44 -0
  26. data/lib/admin_assistant/search.rb +82 -0
  27. data/lib/admin_assistant/show_view.rb +20 -0
  28. data/lib/admin_assistant/virtual_column.rb +61 -0
  29. data/lib/admin_assistant.rb +190 -85
  30. data/lib/javascripts/admin_assistant.js +253 -0
  31. data/lib/stylesheets/activescaffold.css +219 -0
  32. data/lib/stylesheets/default.css +119 -0
  33. data/lib/views/_polymorphic_field_search.html.erb +89 -0
  34. data/lib/views/_restricted_autocompleter.html.erb +53 -0
  35. data/lib/views/autocomplete.html.erb +11 -0
  36. data/lib/views/form.html.erb +6 -3
  37. data/lib/views/index.html.erb +53 -46
  38. data/lib/views/show.html.erb +19 -0
  39. data/vendor/ar_query/MIT-LICENSE +20 -0
  40. data/vendor/ar_query/README +0 -0
  41. data/vendor/ar_query/init.rb +1 -0
  42. data/vendor/ar_query/install.rb +1 -0
  43. data/vendor/ar_query/lib/ar_query.rb +137 -0
  44. data/vendor/ar_query/spec/ar_query_spec.rb +253 -0
  45. data/vendor/ar_query/tasks/ar_query_tasks.rake +0 -0
  46. data/vendor/ar_query/uninstall.rb +1 -0
  47. metadata +39 -16
  48. data/lib/admin_assistant/request.rb +0 -183
  49. data/lib/stylesheets/admin_assistant.css +0 -75
@@ -1,83 +1,163 @@
1
1
  class AdminAssistant
2
2
  class Column
3
- attr_accessor :custom_label
3
+ def blank?(search)
4
+ search.params["#{name}(blank)"] == '1'
5
+ end
4
6
 
5
- def view(action_view, opts = {})
6
- klass = self.class.const_get 'View'
7
- klass.new self, action_view, opts
7
+ def comparator(search)
8
+ search.params["#{name}(comparator)"]
8
9
  end
9
-
10
- class View < Delegator
11
- attr_reader :sort_order
12
-
13
- def initialize(column, action_view, opts)
14
- super(column)
15
- @column, @action_view, @opts = column, action_view, opts
16
- @input = opts[:input]
17
- @link_to_args = opts[:link_to_args]
18
- @search = opts[:search]
19
- @sort_order = opts[:sort_order]
10
+
11
+ def form_view(action_view, admin_assistant, opts = {})
12
+ view 'FormView', action_view, admin_assistant, opts
13
+ end
14
+
15
+ def index_view(action_view, admin_assistant, opts = {})
16
+ view 'IndexView', action_view, admin_assistant, opts
17
+ end
18
+
19
+ def search_view(action_view, admin_assistant, opts = {})
20
+ view 'SearchView', action_view, admin_assistant, opts
21
+ end
22
+
23
+ def show_view(action_view, admin_assistant, opts = {})
24
+ view 'ShowView', action_view, admin_assistant, opts
25
+ end
26
+
27
+ def verify_for_search
28
+ # nothing here, maybe implemented in subclasses
29
+ end
30
+
31
+ def view(view_class_name, action_view, admin_assistant, opts)
32
+ klass = begin
33
+ self.class.const_get view_class_name
34
+ rescue NameError
35
+ AdminAssistant::Column.const_get view_class_name
20
36
  end
21
-
22
- def __getobj__
23
- @column
37
+ klass.new self, action_view, admin_assistant, opts
38
+ end
39
+
40
+ module FormViewMethods
41
+ def description
42
+ @description
24
43
  end
25
44
 
26
- def __setobj__(column)
27
- @column = column
45
+ def after_html(rails_form)
46
+ after = render_from_custom_template("_after_#{name}_input", rails_form)
47
+ if after
48
+ after
49
+ else
50
+ helper_method = "after_#{name}_input"
51
+ if @action_view.respond_to?(helper_method)
52
+ @action_view.send(helper_method, rails_form.object)
53
+ end
54
+ end
28
55
  end
29
-
30
- def form_value(record)
31
- value_method = "#{@column.name}_value"
32
- if @action_view.respond_to?(value_method)
33
- @action_view.send value_method, record
56
+
57
+ def controller
58
+ @action_view.controller
59
+ end
60
+
61
+ def html(rails_form)
62
+ record = rails_form.object
63
+ hff = render_from_custom_template "_#{name}_input", rails_form
64
+ hff ||= html_from_helper_method(record)
65
+ hff ||= if @read_only
66
+ value record
67
+ elsif @write_once && @action_view.action_name == 'edit'
68
+ value record
34
69
  else
35
- field_value record
70
+ default_html rails_form
71
+ end
72
+ if ah = after_html(rails_form)
73
+ hff << ah
74
+ end
75
+ hff
76
+ end
77
+
78
+ def html_from_helper_method(record)
79
+ html_method = "#{name}_input"
80
+ if @action_view.respond_to?(html_method)
81
+ @action_view.send(html_method, record)
36
82
  end
37
83
  end
38
84
 
39
- def index_header_css_class
85
+ def render_from_custom_template(slug, rails_form)
86
+ abs_template_file = File.join(
87
+ RAILS_ROOT, 'app/views', controller.controller_path,
88
+ "#{slug}.html.erb"
89
+ )
90
+ if File.exist?(abs_template_file)
91
+ template = if RAILS_GEM_VERSION == '2.1.0'
92
+ File.join(controller.controller_path, "#{slug}.html.erb")
93
+ else
94
+ abs_template_file
95
+ end
96
+ varname = @model_class.name.underscore
97
+ @action_view.instance_variable_set(
98
+ "@#{varname}".to_sym, rails_form.object
99
+ )
100
+ @action_view.render(
101
+ :file => template,
102
+ :locals => {
103
+ varname.to_sym => rails_form.object,
104
+ :form => rails_form
105
+ }
106
+ )
107
+ end
108
+ end
109
+
110
+ def set_instance_variables_from_options(admin_assistant, opts)
111
+ setting = admin_assistant.form_settings[name.to_sym]
112
+ @clear_link = setting.clear_link
113
+ @description = setting.description
114
+ @datetime_select_options = setting.datetime_select_options || {}
115
+ @date_select_options = setting.date_select_options || {}
116
+ fum_name = name + '_url'
117
+ if @action_view.respond_to?(fum_name)
118
+ @file_url_method = @action_view.method(fum_name)
119
+ end
120
+ @image_size = setting.image_size
121
+ @input = setting.input
122
+ @polymorphic_types = admin_assistant[name.to_sym].polymorphic_types
123
+ @read_only = setting.read_only?
124
+ @select_options = setting.select_options || {}
125
+ unless @select_options.has_key?(:include_blank)
126
+ @select_options[:include_blank] = true
127
+ end
128
+ @text_area_options = setting.text_area_options || {}
129
+ @write_once = setting.write_once?
130
+ end
131
+ end
132
+
133
+ module IndexViewMethods
134
+ def header_css_class
40
135
  "sort #{sort_order}" if sort_order
41
136
  end
42
137
 
43
- def index_td_css_class
138
+ def td_css_class
44
139
  'sort' if sort_order
45
140
  end
46
141
 
47
- def index_html(record)
142
+ def unconfigured_html(record)
143
+ @action_view.send(:h, string(record))
144
+ end
145
+
146
+ def html(record)
48
147
  html_for_index_method = "#{name}_html_for_index"
49
148
  html = if @action_view.respond_to?(html_for_index_method)
50
149
  @action_view.send html_for_index_method, record
51
150
  elsif @link_to_args
52
151
  @action_view.link_to(
53
- @action_view.send(:h, index_value(record)),
152
+ @action_view.send(:h, string(record)),
54
153
  @link_to_args.call(record)
55
154
  )
56
155
  else
57
- @action_view.send(:h, index_value(record))
156
+ unconfigured_html(record)
58
157
  end
59
158
  html = '&nbsp;' if html.blank?
60
159
  html
61
160
  end
62
-
63
- def index_value(record)
64
- value_method = "#{@column.name}_value"
65
- if @action_view.respond_to?(value_method)
66
- @action_view.send value_method, record
67
- else
68
- field_value record
69
- end
70
- end
71
-
72
- def label
73
- if @column.custom_label
74
- @column.custom_label
75
- elsif @column.name.to_s == 'id'
76
- 'ID'
77
- else
78
- @column.name.to_s.capitalize.gsub(/_/, ' ')
79
- end
80
- end
81
161
 
82
162
  def next_sort_params
83
163
  name_for_sort = name
@@ -90,294 +170,183 @@ class AdminAssistant
90
170
  next_sort_order = nil
91
171
  end
92
172
  end
93
- {:sort => name_for_sort, :sort_order => next_sort_order}
94
- end
95
-
96
- def paperclip?
97
- @column.is_a?(PaperclipColumn)
173
+ @action_view.params.merge(
174
+ :sort => name_for_sort, :sort_order => next_sort_order
175
+ )
98
176
  end
99
177
 
100
- def sort_possible?
101
- @column.is_a?(ActiveRecordColumn) || @column.is_a?(BelongsToColumn)
178
+ def set_instance_variables_from_options(admin_assistant, opts)
179
+ index = opts[:index]
180
+ setting = admin_assistant.index_settings[name.to_sym]
181
+ @link_to_args = setting.link_to_args
182
+ @sort_order = index.sort_order if name == index.sort
183
+ @image_size = setting.image_size
184
+ @ajax_toggle_allowed = admin_assistant.update?
102
185
  end
103
186
  end
104
- end
105
-
106
- class ActiveRecordColumn < Column
107
- attr_accessor :search_terms
108
187
 
109
- def initialize(ar_column)
110
- @ar_column = ar_column
111
- end
112
-
113
- def add_to_query(ar_query)
114
- unless @search_terms.blank?
115
- ar_query.boolean_join = :and
116
- case sql_type
117
- when :boolean
118
- ar_query.condition_sqls << "#{name} = ?"
119
- ar_query.bind_vars << search_value
120
- else
121
- ar_query.condition_sqls << "#{name} like ?"
122
- ar_query.bind_vars << "%#{@search_terms}%"
188
+ module SearchViewMethods
189
+ def set_instance_variables_from_options(admin_assistant, opts)
190
+ setting = admin_assistant.search_settings[name.to_sym]
191
+ unless setting.comparators == false
192
+ @comparators = :all
123
193
  end
194
+ @search = opts[:search]
195
+ @blank_checkbox = setting.blank_checkbox
124
196
  end
125
197
  end
126
198
 
127
- def contains?(column_name)
128
- column_name.to_s == @ar_column.name
129
- end
130
-
131
- def name
132
- @ar_column.name
133
- end
134
-
135
- def search_value
136
- case sql_type
137
- when :boolean
138
- @search_terms.blank? ? nil : (@search_terms == 'true')
199
+ module SimpleColumnSearchViewMethods
200
+ include SearchViewMethods
201
+
202
+ def boolean_input(form)
203
+ opts = [['', nil]]
204
+ if @boolean_labels
205
+ opts << [@boolean_labels.first, true]
206
+ opts << [@boolean_labels.last, false]
139
207
  else
140
- @search_terms
141
- end
142
- end
143
-
144
- def sql_type
145
- @ar_column.type
146
- end
147
-
148
- class View < AdminAssistant::Column::View
149
- def initialize(column, action_view, opts)
150
- super
151
- @boolean_labels = opts[:boolean_labels]
208
+ opts << ['true', true]
209
+ opts << ['false', false]
210
+ end
211
+ form.select(name, opts)
152
212
  end
153
213
 
154
- def add_to_form(form)
155
- case @input || @column.sql_type
156
- when :text
157
- form.text_area name
158
- when :boolean
159
- form.check_box name
160
- when :datetime
161
- form.datetime_select name, :include_blank => true
162
- when :date
163
- form.date_select name, :include_blank => true
164
- when :us_state
165
- form.select(
166
- name, ordered_us_state_names_and_codes, :include_blank => true
167
- )
168
- else
169
- form.text_field name
214
+ def comparator_html(search)
215
+ selected_comparator = @column.comparator(search) || '='
216
+ option_tags = comparator_opts.map { |text, value|
217
+ opt = "<option value=\"#{value}\""
218
+ if selected_comparator == value
219
+ opt << " selected=\"selected\""
170
220
  end
171
- end
172
-
173
- def field_value(record)
174
- record.send(name) if record.respond_to?(name)
175
- end
176
-
177
- def index_value(record)
178
- value = super
179
- if @boolean_labels
180
- value = value ? @boolean_labels.first : @boolean_labels.last
181
- end
182
- value
221
+ opt << ">#{text}</option>"
222
+ }.join("\n")
223
+ @action_view.select_tag(
224
+ "search[#{name}(comparator)]", option_tags
225
+ )
183
226
  end
184
227
 
185
- def ordered_us_state_names_and_codes
186
- {
187
- 'Alabama' => 'AL', 'Alaska' => 'AK', 'Arizona' => 'AZ',
188
- 'Arkansas' => 'AR', 'California' => 'CA', 'Colorado' => 'CO',
189
- 'Connecticut' => 'CT', 'Delaware' => 'DE',
190
- 'District of Columbia' => 'DC', 'Florida' => 'FL', 'Georgia' => 'GA',
191
- 'Hawaii' => 'HI', 'Idaho' => 'ID', 'Illinois' => 'IL',
192
- 'Indiana' => 'IN', 'Iowa' => 'IA', 'Kansas' => 'KS',
193
- 'Kentucky' => 'KY', 'Louisiana' => 'LA', 'Maine' => 'ME',
194
- 'Maryland' => 'MD', 'Massachusetts' => 'MA', 'Michigan' => 'MI',
195
- 'Minnesota' => 'MN', 'Mississippi' => 'MS', 'Missouri' => 'MO',
196
- 'Montana' => 'MT', 'Nebraska' => 'NE', 'Nevada' => 'NV',
197
- 'New Hampshire' => 'NH', 'New Jersey' => 'NJ', 'New Mexico' => 'NM',
198
- 'New York' => 'NY', 'North Carolina' => 'NC', 'North Dakota' => 'ND',
199
- 'Ohio' => 'OH', 'Oklahoma' => 'OK', 'Oregon' => 'OR',
200
- 'Pennsylvania' => 'PA', 'Puerto Rico' => 'PR',
201
- 'Rhode Island' => 'RI', 'South Carolina' => 'SC',
202
- 'South Dakota' => 'SD', 'Tennessee' => 'TN', 'Texas' => 'TX',
203
- 'Utah' => 'UT', 'Vermont' => 'VT', 'Virginia' => 'VA',
204
- 'Washington' => 'WA', 'West Virginia' => 'WV', 'Wisconsin' => 'WI',
205
- 'Wyoming' => 'WY'
206
- }.sort_by { |name, code| name }
228
+ def comparator_opts
229
+ [
230
+ ['greater than', '>'], ['greater than or equal to', '>='],
231
+ ['equal to', '='], ['less than or equal to', '<='],
232
+ ['less than', '<']
233
+ ]
207
234
  end
208
235
 
209
- def search_html
210
- input = case @column.sql_type
236
+ def html(form)
237
+ input = ''
238
+ case @column.field_type
211
239
  when :boolean
212
- opts = [['', nil]]
213
- if @boolean_labels
214
- opts << [@boolean_labels.first, true]
215
- opts << [@boolean_labels.last, false]
216
- else
217
- opts << ['true', true]
218
- opts << ['false', false]
219
- end
220
- @action_view.select("search", name, opts)
240
+ input = boolean_input form
221
241
  else
222
- @action_view.text_field_tag("search[#{name}]", @search[name])
242
+ if @column.field_type == :integer && @comparators == :all
243
+ input << comparator_html(form.object) << ' '
244
+ end
245
+ input << form.text_field(name)
246
+ if @blank_checkbox
247
+ input << check_box_and_hidden_tags(
248
+ "search[#{name}(blank)]", @column.blank?(form.object)
249
+ )
250
+ input << "is blank"
251
+ end
223
252
  end
224
253
  "<p><label>#{label}</label> <br/>#{input}</p>"
225
254
  end
226
255
  end
227
- end
228
-
229
- class AdminAssistantColumn < Column
230
- attr_reader :name
231
-
232
- def initialize(name)
233
- @name = name.to_s
234
- end
235
-
236
- def contains?(column_name)
237
- column_name.to_s == @name
238
- end
239
-
240
- class View < AdminAssistant::Column::View
241
- def field_value(record)
242
- nil
243
- end
244
- end
245
- end
246
-
247
- class BelongsToColumn < Column
248
- def initialize(belongs_to_assoc)
249
- @belongs_to_assoc = belongs_to_assoc
250
- end
251
-
252
- def associated_class
253
- @belongs_to_assoc.klass
254
- end
255
-
256
- def association_foreign_key
257
- @belongs_to_assoc.association_foreign_key
258
- end
259
256
 
260
- def contains?(column_name)
261
- column_name.to_s == name
262
- end
263
-
264
- def default_name_method
265
- [:name, :title, :login, :username].detect { |m|
266
- associated_class.columns.any? { |column| column.name.to_s == m.to_s }
267
- }
268
- end
269
-
270
- def name
271
- @belongs_to_assoc.name.to_s
272
- end
273
-
274
- def order_sql_field
275
- sql = "#{@belongs_to_assoc.table_name}. "
276
- sql << if default_name_method
277
- default_name_method.to_s
278
- else
279
- @belongs_to_assoc.association_foreign_key
257
+ module ShowViewMethods
258
+ def html(record)
259
+ @action_view.send(:h, value(record))
280
260
  end
281
261
  end
282
-
283
- class View < AdminAssistant::Column::View
284
- def add_to_form(form)
285
- form.select(
286
- association_foreign_key,
287
- associated_class.
288
- find(:all).
289
- sort_by { |model| model.send(default_name_method) }.
290
- map { |model| [model.send(default_name_method), model.id] }
291
- )
262
+
263
+ class View
264
+ attr_reader :sort_order
265
+
266
+ def initialize(column, action_view, admin_assistant, opts = {})
267
+ @column, @action_view, @opts = column, action_view, opts
268
+ @model_class = admin_assistant.model_class
269
+ base_setting = admin_assistant[name]
270
+ @boolean_labels = base_setting.boolean_labels
271
+ fem_name = name + '_exists?'
272
+ if @action_view.respond_to?(fem_name)
273
+ @file_exists_method = @action_view.method(fem_name)
274
+ end
275
+ @label = base_setting.label
276
+ @polymorphic_types = base_setting.polymorphic_types
277
+ if respond_to?(:set_instance_variables_from_options)
278
+ set_instance_variables_from_options(admin_assistant, opts)
279
+ end
292
280
  end
293
-
294
- def field_value(record)
295
- assoc_value = record.send name
296
- if assoc_value.respond_to?(:name_for_admin_assistant)
297
- assoc_value.name_for_admin_assistant
298
- elsif assoc_value && default_name_method
299
- assoc_value.send default_name_method
281
+
282
+ def check_box_and_hidden_tags(input_name, value)
283
+ # Rails 2.3 wants the hidden tag to come before the checkbox, but it's
284
+ # the opposite for Rails 2.2 and 2.1
285
+ if RAILS_GEM_VERSION =~ /^2.3/
286
+ @action_view.send(:hidden_field_tag, input_name, '0') +
287
+ @action_view.send(:check_box_tag, input_name, '1', value)
288
+ else
289
+ @action_view.send(:check_box_tag, input_name, '1', value) +
290
+ @action_view.send(:hidden_field_tag, input_name, '0')
300
291
  end
301
292
  end
302
- end
303
- end
304
-
305
- class DefaultSearchColumn < Column
306
- attr_reader :terms
307
-
308
- def initialize(terms, model_class)
309
- @terms, @model_class = terms, model_class
310
- end
311
-
312
- def add_to_query(ar_query)
313
- unless @terms.blank?
314
- ar_query.boolean_join = :or
315
- searchable_columns.each do |column|
316
- ar_query.condition_sqls << "#{column.name} like ?"
317
- ar_query.bind_vars << "%#{@terms}%"
293
+
294
+ def label
295
+ if @label
296
+ @label
297
+ elsif @column.name.to_s == 'id'
298
+ 'ID'
299
+ else
300
+ @column.name.to_s.capitalize.gsub(/_/, ' ')
318
301
  end
319
302
  end
320
- end
321
-
322
- def searchable_columns
323
- @model_class.columns.select { |column|
324
- [:string, :text].include?(column.type)
325
- }
326
- end
327
-
328
- class View < AdminAssistant::Column::View
329
- def search_html
330
- @action_view.text_field_tag("search", @column.terms)
303
+
304
+ def name
305
+ @column.name
331
306
  end
332
- end
333
- end
334
-
335
- class FileColumnColumn < Column
336
- attr_reader :name
337
-
338
- def initialize(name)
339
- @name = name.to_s
340
- end
341
-
342
- def contains?(column_name)
343
- column_name.to_s == @name
344
- end
345
-
346
- class View < AdminAssistant::Column::View
347
- def add_to_form(form)
348
- form.file_field name
307
+
308
+ def paperclip?
309
+ @column.is_a?(PaperclipColumn)
349
310
  end
350
311
 
351
- def index_html(record)
352
- @action_view.instance_variable_set :@record, record
353
- @action_view.image_tag(
354
- @action_view.url_for_file_column('record', @column.name)
355
- )
312
+ def sort_possible?(total_entries)
313
+ @column.is_a?(ActiveRecordColumn) ||
314
+ (@column.is_a?(BelongsToColumn) && total_entries < 100_000)
315
+ end
316
+
317
+ def string(record)
318
+ string_method = "#{@column.name}_string"
319
+ if @action_view.respond_to?(string_method)
320
+ @action_view.send string_method, record
321
+ else
322
+ value = value(record)
323
+ if @boolean_labels
324
+ value ? @boolean_labels.first : @boolean_labels.last
325
+ else
326
+ value.to_s
327
+ end
328
+ end
329
+ end
330
+
331
+ def value(record)
332
+ record.send(name) if record.respond_to?(name)
356
333
  end
357
334
  end
358
- end
359
-
360
- class PaperclipColumn < Column
361
- attr_reader :name
362
335
 
363
- def initialize(name)
364
- @name = name.to_s
336
+ class FormView < View
337
+ include IndexViewMethods
338
+ end
339
+
340
+ class IndexView < View
341
+ include IndexViewMethods
365
342
  end
366
343
 
367
- def contains?(column_name)
368
- column_name.to_s == @name ||
369
- column_name.to_s =~
370
- /^#{@name}_(file_name|content_type|file_size|updated_at)$/
344
+ class SearchView < View
345
+ include SearchViewMethods
371
346
  end
372
347
 
373
- class View < AdminAssistant::Column::View
374
- def add_to_form(form)
375
- form.file_field name
376
- end
377
-
378
- def index_html(record)
379
- @action_view.image_tag record.send(@column.name).url
380
- end
348
+ class ShowView < View
349
+ include ShowViewMethods
381
350
  end
382
351
  end
383
352
  end
@@ -0,0 +1,41 @@
1
+ class AdminAssistant
2
+ class DefaultSearchColumn < Column
3
+ def initialize(model_class, opts)
4
+ @model_class = model_class
5
+ @fields_to_include = opts[:fields_to_include] || []
6
+ end
7
+
8
+ def add_to_query_condition(ar_query_condition, search)
9
+ unless search.params.blank?
10
+ ar_query_condition.ar_query.boolean_join = :and
11
+ ar_query_condition.boolean_join = :or
12
+ names_to_search = Model.new(@model_class).searchable_columns.map(
13
+ &:name
14
+ )
15
+ names_to_search.concat @fields_to_include
16
+ names_to_search.uniq.each do |field_name|
17
+ ar_query_condition.sqls << "LOWER(#{field_name}) like LOWER(?)"
18
+ ar_query_condition.bind_vars << "%#{search.params}%"
19
+ end
20
+ end
21
+ end
22
+
23
+ def attributes_for_search_object(search_params)
24
+ {}
25
+ end
26
+
27
+ def search_view(action_view, admin_assistant, opts={})
28
+ View.new self, action_view
29
+ end
30
+
31
+ class View
32
+ def initialize(column, action_view)
33
+ @column, @action_view = column, action_view
34
+ end
35
+
36
+ def html(form)
37
+ @action_view.text_field_tag("search", form.object.params)
38
+ end
39
+ end
40
+ end
41
+ end