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



389
390
391
392
393
394
395
396
# File 'lib/simple_search_filter/filter.rb', line 389

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



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

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

#default_order(order_by, order_dir) ⇒ Object

order



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

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



314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/simple_search_filter/filter.rb', line 314

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



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

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

#opposite_order_dir(order_dir) ⇒ Object



327
328
329
330
331
332
# File 'lib/simple_search_filter/filter.rb', line 327

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



274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/simple_search_filter/filter.rb', line 274

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



290
291
292
293
294
# File 'lib/simple_search_filter/filter.rb', line 290

def order= (value)
  @order = value

  session_save 'order', @order
end

#order_stringObject

where



351
352
353
354
355
356
357
358
359
360
361
# File 'lib/simple_search_filter/filter.rb', line 351

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

  "#{orderby} #{orderdir}"
end

#pageObject

page



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/simple_search_filter/filter.rb', line 243

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



259
260
261
262
263
# File 'lib/simple_search_filter/filter.rb', line 259

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



198
199
200
# File 'lib/simple_search_filter/filter.rb', line 198

def set(field_name,v)
  data[field_name.to_s] = @fields[field_name].fix_value(v)
end

#set_data_from_form(params) ⇒ Object



209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
# File 'lib/simple_search_filter/filter.rb', line 209

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

      if @fields[name].type==FilterField::TYPE_INT
        set name, (v.to_i rescue 0)
      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



296
297
298
299
300
301
# File 'lib/simple_search_filter/filter.rb', line 296

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



304
305
306
# File 'lib/simple_search_filter/filter.rb', line 304

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



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

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
# 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

  field_def_value(name) || v_def
end

#v_empty?(name) ⇒ Boolean

Returns:

  • (Boolean)


189
190
191
192
193
194
195
196
# File 'lib/simple_search_filter/filter.rb', line 189

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

  # if v == default value


end

#where_conditionsObject



365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
# File 'lib/simple_search_filter/filter.rb', line 365

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