Class: SimpleSearchFilter::Filter

Inherits:
Object
  • Object
show all
Defined in:
lib/simple_search_filter/filter.rb

Constant Summary collapse

SEARCH_METHOD_GET =
:get
SEARCH_METHOD_POST_AND_REDIRECT =
:post_and_redirect
DEFAULT_SEARCH_METHOD =
SEARCH_METHOD_GET

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(_session, _prefix, opt = {}) ⇒ Filter

Returns a new instance of Filter.



18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/simple_search_filter/filter.rb', line 18

def initialize(_session, _prefix, opt={})
  @prefix = _prefix
  @session = _session

  @fields ||={}

  @options = opt
  @options||={}

  # init data

  data()
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_sym, *arguments, &block) ⇒ Object



400
401
402
403
404
405
406
407
# File 'lib/simple_search_filter/filter.rb', line 400

def method_missing(method_sym, *arguments, &block)
  # the first argument is a Symbol, so you need to_s it if you want to pattern match

  if @fields.has_key? method_sym
    v(method_sym)
  else
    super
  end
end

Instance Attribute Details

#dataObject

values



14
15
16
# File 'lib/simple_search_filter/filter.rb', line 14

def data
  @data
end

#fieldsObject

array of FilterField



13
14
15
# File 'lib/simple_search_filter/filter.rb', line 13

def fields
  @fields
end

#prefixObject

session prefix



12
13
14
# File 'lib/simple_search_filter/filter.rb', line 12

def prefix
  @prefix
end

Instance Method Details

#add_field(f) ⇒ Object

fields



48
49
50
51
52
# File 'lib/simple_search_filter/filter.rb', line 48

def add_field(f)
  #@fields[f[:name]] = f

  @fields[f.name] = f

end

#add_field_autocomplete(name, type, formtype, opt = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/simple_search_filter/filter.rb', line 58

def add_field_autocomplete(name, type, formtype, opt={})
  search_by = opt[:search_by] || :text

  if search_by==:id
    # filter by id


    # id field

    opt_id = opt.clone
    opt_id[:default_value] = 0
    opt_id[:ignore_value] = 0
    opt_id[:condition] = FilterField::QUERY_CONDITION_EQUAL

    add_field FilterField.new(:"#{name}_id", FilterField::TYPE_INT, FilterField::FORM_TYPE_EMPTY, opt_id)

    # text field

    opt_text = opt.clone
    opt_text[:default_value] = ''
    opt_text[:ignore_value] = ''
    opt_text[:condition] = FilterField::QUERY_CONDITION_EMPTY

    add_field FilterField.new(name,type, formtype, opt_text)

  else
    # filter by text

    add_field FilterField.new(name,type, formtype, opt)
  end

end

#add_fields_from_array(a) ⇒ Object



54
55
56
# File 'lib/simple_search_filter/filter.rb', line 54

def add_fields_from_array(a)
  a.each{|fa| add_field fa}
end

#clear_dataObject



211
212
213
214
# File 'lib/simple_search_filter/filter.rb', line 211

def clear_data
  @data = {}
  session_save 'data', @data
end

#default_order(order_by, order_dir) ⇒ Object

order



281
282
283
# File 'lib/simple_search_filter/filter.rb', line 281

def default_order(order_by, order_dir)
  set_default_order order_by, order_dir
end

#field(name, type, formtype, opt = {}) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/simple_search_filter/filter.rb', line 32

def field(name, type, formtype, opt={})
  if formtype.to_s==FilterField::FORM_TYPE_AUTOCOMPLETE
    add_field_autocomplete(name, type, formtype, opt)
  else
    add_field FilterField.new(name,type, formtype, opt)
  end

end

#field_def_value(name) ⇒ Object



89
90
91
92
93
94
95
# File 'lib/simple_search_filter/filter.rb', line 89

def field_def_value(name)
  name = name.to_sym

  return nil if @fields[name].nil?

  @fields[name].default_value
end

#form_methodObject



130
131
132
# File 'lib/simple_search_filter/filter.rb', line 130

def form_method
  search_method_get? ? :get : :post
end

#get_opposite_order_dir_for_column(name) ⇒ Object



325
326
327
328
329
330
331
332
333
334
335
336
# File 'lib/simple_search_filter/filter.rb', line 325

def get_opposite_order_dir_for_column(name)
  name = name.to_s

  ord = order
  return 'asc' if ord.empty?

  if ord[0][0].to_s == name
    return opposite_order_dir(ord[0][1])
  end

  return 'asc'
end

#get_orderObject



319
320
321
322
# File 'lib/simple_search_filter/filter.rb', line 319

def get_order
  order[0] if order.count>0
  order[0]
end

#opposite_order_dir(order_dir) ⇒ Object



338
339
340
341
342
343
# File 'lib/simple_search_filter/filter.rb', line 338

def opposite_order_dir(order_dir)
  order_dir = order_dir.to_s
  return 'asc' if order_dir=='desc'
  return 'desc' if order_dir=='asc'
  'asc'
end

#optionsObject

options



102
103
104
# File 'lib/simple_search_filter/filter.rb', line 102

def options
  @options || {}
end

#orderObject



285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/simple_search_filter/filter.rb', line 285

def order
  return @order unless @order.nil?

  # from session

  @v_sess = session_get 'order', nil
  @order = @v_sess unless @v_sess.nil?

  #

  @order ||= []

  session_save 'order', @order

  #

  @order
end

#order=(value) ⇒ Object



301
302
303
304
305
# File 'lib/simple_search_filter/filter.rb', line 301

def order= (value)
  @order = value

  session_save 'order', @order
end

#order_stringObject

where



362
363
364
365
366
367
368
369
370
371
372
# File 'lib/simple_search_filter/filter.rb', line 362

def order_string
  o = order
  if o.empty?
    orderby = 'id'
    orderdir = 'asc'
  else
    orderby, orderdir = order[0]
  end

  "#{orderby} #{orderdir}"
end

#pageObject

page



254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'lib/simple_search_filter/filter.rb', line 254

def page
  return @page unless @page.nil?

  # from session

  @v_sess = session_get 'page', nil
  @page = @v_sess unless @v_sess.nil?

  #

  @page ||= 1

  session_save 'page', @page

  #

  @page
end

#page=(value) ⇒ Object



270
271
272
273
274
# File 'lib/simple_search_filter/filter.rb', line 270

def page=(value)
  @page = value.to_i

  session_save 'page', @page
end

#page_param_nameObject



134
135
136
# File 'lib/simple_search_filter/filter.rb', line 134

def page_param_name
  options[:page_param_name] || SimpleSearchFilter.page_default_param_name
end

#search_methodObject



106
107
108
109
110
# File 'lib/simple_search_filter/filter.rb', line 106

def search_method
  options[:search_method] ||= DEFAULT_SEARCH_METHOD

  options[:search_method]
end

#search_method_get?Boolean

Returns:

  • (Boolean)


112
113
114
# File 'lib/simple_search_filter/filter.rb', line 112

def search_method_get?
  search_method == SEARCH_METHOD_GET
end

#search_method_post_and_redirect?Boolean

Returns:

  • (Boolean)


116
117
118
# File 'lib/simple_search_filter/filter.rb', line 116

def search_method_post_and_redirect?
  search_method == SEARCH_METHOD_POST_AND_REDIRECT
end

#search_urlObject



125
126
127
# File 'lib/simple_search_filter/filter.rb', line 125

def search_url
  options[:search_url]
end

#session_get(name, def_value) ⇒ Object

sessions



144
145
146
# File 'lib/simple_search_filter/filter.rb', line 144

def session_get(name, def_value)
  @session[prefix+name] || def_value
end

#session_save(name, v) ⇒ Object



148
149
150
# File 'lib/simple_search_filter/filter.rb', line 148

def session_save(name, v)
  @session[prefix+name] = v
end

#set(field_name, v) ⇒ Object



202
203
204
205
206
207
# File 'lib/simple_search_filter/filter.rb', line 202

def set(field_name,v)
  field = @fields[field_name]
  vv = field.nil? ? v : field.fix_value(v)
  data[field_name.to_s] = vv

end

#set_data_from_form(params) ⇒ Object



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/simple_search_filter/filter.rb', line 216

def set_data_from_form(params)
  # search for fields like filter[XXX]

  params.each do |k, v|
    name = k.to_sym

    #if f =~ /^filter\[([^\]]+)\]$/

      #name = Regexp.last_match(1)


      next unless @fields.has_key? name

      t = @fields[name].type
      if t==FilterField::TYPE_INT
        set name, (v.to_i rescue 0)
      elsif t==FilterField::TYPE_BOOLEAN
        set name, FilterField.fix_value_boolean(v)
      else
        set name, v
      end

    #end

  end

  # default values from fields

  @fields.each do |k, f|
    name = k.to_s
    next if @data.has_key? name

    set name, field_def_value(name)
  end

end

#set_default_order(order_by, order_dir) ⇒ Object



307
308
309
310
311
312
# File 'lib/simple_search_filter/filter.rb', line 307

def set_default_order(order_by, order_dir)
  return false if !order.nil? && !order.empty?

  set_order(order_by, order_dir)

end

#set_order(order_by, order_dir) ⇒ Object



315
316
317
# File 'lib/simple_search_filter/filter.rb', line 315

def set_order(order_by, order_dir)
  self.order = [[order_by, order_dir]]
end

#urlObject



121
122
123
# File 'lib/simple_search_filter/filter.rb', line 121

def url
  options[:url] || options[:search_url]
end

#url_params_for_sortable_column(name) ⇒ Object



347
348
349
350
351
352
353
354
# File 'lib/simple_search_filter/filter.rb', line 347

def url_params_for_sortable_column(name)
  p = {}
  p[:cmd] = 'order'
  p[:orderby] = name.to_s
  p[:orderdir] = get_opposite_order_dir_for_column(name)

  p
end

#v(name, v_def = nil) ⇒ Object



178
179
180
181
182
183
184
185
186
187
188
189
190
# File 'lib/simple_search_filter/filter.rb', line 178

def v(name, v_def=nil)
  name = name.to_s

  if (data.has_key? name)
  #&& (!data[name].nil?) && (!data[name].blank?)

    return data[name]
  end

  v = field_def_value(name)
  return v unless v.nil?

  v_def
end

#v_empty?(name) ⇒ Boolean

Returns:

  • (Boolean)


193
194
195
196
197
198
199
200
# File 'lib/simple_search_filter/filter.rb', line 193

def v_empty?(name)
  if (data.has_key? name) && (!data[name].nil?)
    return true
  end

  # if v == default value


end

#where_conditionsObject



376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
# File 'lib/simple_search_filter/filter.rb', line 376

def where_conditions
  w_string = '1=1 '
  w_values = []

  @fields.each do |name, f|
    val = v(name)

    next if val.nil?

    w_field = f.make_where(val)
    next if w_field.nil?

    w_cond, w_value = w_field

    w_string << " AND #{w_cond} "
    w_values << w_value
  end

  [w_string, *w_values]
end