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.



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

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

  @fields ||={}

  @options = opt
  @options||={}

  # init data

  data()
end

Instance Attribute Details

#dataObject

values



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

def data
  @data
end

#fieldsObject

array of FilterField



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

def fields
  @fields
end

#prefixObject

session prefix



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

def prefix
  @prefix
end

Instance Method Details

#add_field(f) ⇒ Object

fields



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

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

  @fields[f.name] = f

end

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



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
86
87
# File 'lib/simple_search_filter/filter.rb', line 59

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

    id_name = field_name_for_id_autocomplete(name).to_sym
    add_field FilterField.new(id_name, 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



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

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

#clear_allObject



215
216
217
218
219
# File 'lib/simple_search_filter/filter.rb', line 215

def clear_all
  self.page=1
  clear_order
  clear_data
end

#clear_dataObject



221
222
223
224
225
# File 'lib/simple_search_filter/filter.rb', line 221

def clear_data
  data.clear

  session_save 'data', @data
end

#clear_orderObject



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

def clear_order
  self.order = @order_default
end

#default_order(order_by, order_dir) ⇒ Object

order



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

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

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



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

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



94
95
96
97
98
99
100
# File 'lib/simple_search_filter/filter.rb', line 94

def field_def_value(name)
  name = name.to_sym

  return nil if @fields[name].nil?

  @fields[name].default_value
end

#field_name_for_id_autocomplete(name) ⇒ Object



90
91
92
# File 'lib/simple_search_filter/filter.rb', line 90

def field_name_for_id_autocomplete(name)
  "#{name}_id"
end

#form_methodObject



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

def form_method
  search_method_get? ? :get : :post
end

#get_opposite_order_dir_for_column(name) ⇒ Object



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

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



333
334
335
336
# File 'lib/simple_search_filter/filter.rb', line 333

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

#opposite_order_dir(order_dir) ⇒ Object



356
357
358
359
360
361
# File 'lib/simple_search_filter/filter.rb', line 356

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



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

def options
  @options || {}
end

#orderObject



296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
# File 'lib/simple_search_filter/filter.rb', line 296

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



312
313
314
315
316
# File 'lib/simple_search_filter/filter.rb', line 312

def order= (value)
  @order = value

  session_save 'order', @order
end

#order_stringObject

where



380
381
382
383
384
385
386
387
388
389
390
# File 'lib/simple_search_filter/filter.rb', line 380

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

  "#{orderby} #{orderdir}"
end

#pageObject

page



265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'lib/simple_search_filter/filter.rb', line 265

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



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

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

  session_save 'page', @page
end

#page_param_nameObject



139
140
141
# File 'lib/simple_search_filter/filter.rb', line 139

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

#search_methodObject



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

def search_method
  options[:search_method] ||= DEFAULT_SEARCH_METHOD

  options[:search_method]
end

#search_method_get?Boolean

Returns:

  • (Boolean)


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

def search_method_get?
  search_method == SEARCH_METHOD_GET
end

#search_method_post_and_redirect?Boolean

Returns:

  • (Boolean)


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

def search_method_post_and_redirect?
  search_method == SEARCH_METHOD_POST_AND_REDIRECT
end

#search_urlObject



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

def search_url
  options[:search_url]
end

#session_get(name, def_value) ⇒ Object

sessions



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

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

#session_save(name, v) ⇒ Object



153
154
155
# File 'lib/simple_search_filter/filter.rb', line 153

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

#set(field_name, v) ⇒ Object



207
208
209
210
211
212
# File 'lib/simple_search_filter/filter.rb', line 207

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

  data.set(field_name, vv)
end

#set_data_from_form(params) ⇒ Object



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/simple_search_filter/filter.rb', line 227

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.v_exist? name

    set name, field_def_value(name)
  end

end

#set_default_order(order_by, order_dir) ⇒ Object



318
319
320
321
322
323
324
325
326
# File 'lib/simple_search_filter/filter.rb', line 318

def set_default_order(order_by, order_dir)
  @order_default = [[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



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

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

#urlObject



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

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

#url_params_for_sortable_column(name) ⇒ Object



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

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



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

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

  res = data.v(name, field_def_value(name))
  return res unless res.nil?

  v_def
end

#v_empty?(name) ⇒ Boolean

Returns:

  • (Boolean)


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

def v_empty?(name)
  data.v_empty?(name)
end

#where_conditionsObject



394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
# File 'lib/simple_search_filter/filter.rb', line 394

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