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



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

def clear_all
  self.page=1
  clear_order
  clear_data
end

#clear_dataObject



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

def clear_data
  data.clear

  session_save 'data', @data
end

#clear_orderObject



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

def clear_order
  self.order = @order_default
end

#data_save_to_sessionObject



188
189
190
# File 'lib/simple_search_filter/filter.rb', line 188

def data_save_to_session
  session_save('data', @data.values)
end

#default_order(order_by, order_dir) ⇒ Object

order



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

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



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

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



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

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

#opposite_order_dir(order_dir) ⇒ Object



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

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



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

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



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

def order= (value)
  @order = value

  session_save 'order', @order
end

#order_stringObject

where



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

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

  "#{orderby} #{orderdir}"
end

#pageObject

page



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

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



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

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



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

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



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

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



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

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



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

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



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

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



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

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)


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

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

#where_conditionsObject



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

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