easy_filter 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/CHANGELOG.md +6 -0
- data/README.md +3 -3
- data/app/views/easy_filter/_field_array.html.erb +7 -7
- data/app/views/easy_filter/_field_datetime.html.erb +2 -2
- data/app/views/easy_filter/_field_text.html.erb +1 -1
- data/lib/easy_filter/model_additions.rb +17 -5
- data/lib/easy_filter/version.rb +1 -1
- data/lib/easy_filter/view_helpers.rb +23 -21
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
M2NjMDMyOThkZmJlMjA1Nzk5ZmZjODJlZTdjZWE1M2EzZjhmM2M1NQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
YTViNzNkYjQwZGQ2ZDlhOGFiOGNlOTNkZmViNTVlNjQ0OGMwOTc4NQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODFmZGFjOTMxODNiNTk2OTRkYjYyYWMwOWMyZGM1Y2Q3ZTE2MDM2NDYwNDU4
|
10
|
+
ZWEwODM1YTYxMTY0Y2VjZGI4OTNhYjk3Y2M3YjE0NDIxZjY5ZDY3ZTFkYWNl
|
11
|
+
YzI4NTFmYjRkMjUxYTEwMzkxMmJlOThiYzZkZWFkNmE4ZDE4MTg=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YzU5YjA2OTdlZjA0OTcxZmFhYWI4MWIyNjBkM2ZhNmFkN2FkMWMxOTM0YmE0
|
14
|
+
NjBkY2Q2OGU0OGZkMzc1MjdmOWVjMDJkOGRkNGIxMWY3MTJhNGFkM2E3Zjgy
|
15
|
+
NTBiZTE3NjAyMTI0Y2M1MThjMmM4ZDhhNDllY2QwN2I5OWI4NDg=
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -48,10 +48,10 @@ EasyFilter works on ActiveRecord::Relation. You can chain with any other module
|
|
48
48
|
|
49
49
|
You can define an `Array` of `Hash` and EasyFilter will generate a dropdown automaticly.
|
50
50
|
|
51
|
-
Code in
|
51
|
+
Code in helper:
|
52
52
|
|
53
53
|
```ruby
|
54
|
-
def
|
54
|
+
def model_statuses
|
55
55
|
[
|
56
56
|
{ code: 'A', name: 'Status A', color: :default},
|
57
57
|
{ code: 'B', name: 'Status B', color: :info},
|
@@ -62,7 +62,7 @@ end
|
|
62
62
|
|
63
63
|
In view:
|
64
64
|
|
65
|
-
<%= easy_filter ModelClass, [:name, :expiry_date,
|
65
|
+
<%= easy_filter ModelClass, [:name, :expiry_date, {field: :status, items: model_statuses, label: t(:lable)}] %>
|
66
66
|
|
67
67
|
#### Advanced parameters
|
68
68
|
|
@@ -1,19 +1,19 @@
|
|
1
1
|
<div class="dropdown">
|
2
|
-
<%= hidden_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:exact]}#{
|
3
|
-
<% button_text = "<span>#{
|
2
|
+
<%= hidden_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:exact]}#{filter[:field]}", request.params["#{filter_prefixes[:main]}#{filter_prefixes[:exact]}#{filter[:field]}"]) %>
|
3
|
+
<% button_text = "<span>#{filter[:label]}</span>" %>
|
4
4
|
|
5
|
-
<%
|
6
|
-
if request.params["#{filter_prefixes[:main]}#{filter_prefixes[:exact]}#{
|
5
|
+
<% filter[:items].each do |item|
|
6
|
+
if request.params["#{filter_prefixes[:main]}#{filter_prefixes[:exact]}#{filter[:field]}"] == item[:code]
|
7
7
|
button_text = "<span class=\"label label-#{item[:color]}\">#{item[:name]}</span>"
|
8
8
|
break
|
9
9
|
end
|
10
10
|
end %>
|
11
11
|
|
12
|
-
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownFilterButton-<%=
|
12
|
+
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownFilterButton-<%= filter[:field] %>" data-toggle="dropdown"><%= button_text.html_safe %>
|
13
13
|
<span class="caret"></span></button>
|
14
14
|
|
15
|
-
<ul class="dropdown-menu dropdown-filter" aria-labelledby="dropdownFilterButton-<%=
|
16
|
-
<%
|
15
|
+
<ul class="dropdown-menu dropdown-filter" aria-labelledby="dropdownFilterButton-<%= filter[:field] %>">
|
16
|
+
<% filter[:items].each do |item| %>
|
17
17
|
<li role="presentation"><a role="menuitem" tabindex="-1" data-target="<%= item[:code] %>"><span class="label label-<%= item[:color]%>"><%= item[:name] %></span></a></li>
|
18
18
|
<% end %>
|
19
19
|
</ul>
|
@@ -1,2 +1,2 @@
|
|
1
|
-
<%= text_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:from]}#{
|
2
|
-
<%= text_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:to]}#{
|
1
|
+
<%= text_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:from]}#{filter[:field]}", request.params["#{filter_prefixes[:main]}#{filter_prefixes[:from]}#{filter[:field]}"], class: 'form-control datepicker', placeholder: filter[:label]) %>
|
2
|
+
<%= text_field_tag("#{filter_prefixes[:main]}#{filter_prefixes[:to]}#{filter[:field]}", request.params["#{filter_prefixes[:main]}#{filter_prefixes[:to]}#{filter[:field]}"], class: 'form-control datepicker', placeholder: filter[:label]) %>
|
@@ -1 +1 @@
|
|
1
|
-
<%= text_field_tag("#{filter_prefixes[:main]}#{
|
1
|
+
<%= text_field_tag("#{filter_prefixes[:main]}#{filter[:field]}", request.params["#{filter_prefixes[:main]}#{filter[:field]}"], class: 'form-control', placeholder: filter[:label]) %>
|
@@ -1,6 +1,11 @@
|
|
1
1
|
module EasyFilter
|
2
2
|
# Define methods for ActiveRecord
|
3
3
|
module ModelAdditions
|
4
|
+
# 'easy_filter' for ActiveRecor models to filter result based on a filter hash
|
5
|
+
# or HTTP parameters.
|
6
|
+
#
|
7
|
+
# @params [Hash] filter parameters hash
|
8
|
+
# @prefixes [Hash] filter parameter prefixes mainly for prefixing HTML input elements
|
4
9
|
def easy_filter(params, prefixes = { main: 'filter_',
|
5
10
|
from: 'from_',
|
6
11
|
to: 'to_',
|
@@ -18,7 +23,9 @@ module EasyFilter
|
|
18
23
|
params[prefixes[:sort]] ||= 'id'
|
19
24
|
params[prefixes[:direction]] ||= 'desc'
|
20
25
|
|
21
|
-
sort_column =
|
26
|
+
sort_column = add_model params[prefixes[:sort]]
|
27
|
+
# TODO included model fields not in 'column_names'. Somehow need to check if given column name valid
|
28
|
+
# sort_column = column_names.include?(params[prefixes[:sort]]) ? params[prefixes[:sort]] : add_model('id')
|
22
29
|
sort_direction = %w(asc desc).include?(params[prefixes[:direction]]) ? params[prefixes[:direction]] : 'desc'
|
23
30
|
|
24
31
|
filter.order("#{sort_column} #{sort_direction}")
|
@@ -28,16 +35,16 @@ module EasyFilter
|
|
28
35
|
|
29
36
|
def add_where(filter, field, value, prefixes)
|
30
37
|
if field.start_with?(prefixes[:from])
|
31
|
-
filter.where("#{del_prefix(field, prefixes[:from])} >= ?", value)
|
38
|
+
filter.where("#{add_model(del_prefix(field, prefixes[:from]))} >= ?", value)
|
32
39
|
|
33
40
|
elsif field.start_with?(prefixes[:to])
|
34
|
-
filter.where("#{del_prefix(field, prefixes[:to])} <= ?", value)
|
41
|
+
filter.where("#{add_model(del_prefix(field, prefixes[:to]))} <= ?", value)
|
35
42
|
|
36
43
|
elsif field.start_with?(prefixes[:exact])
|
37
|
-
filter.where("#{del_prefix(field, prefixes[:exact])} = ?", value)
|
44
|
+
filter.where("#{add_model(del_prefix(field, prefixes[:exact]))} = ?", value)
|
38
45
|
|
39
46
|
else
|
40
|
-
filter.where("#{field} like ?", "%#{value}%")
|
47
|
+
filter.where("#{add_model(field)} like ?", "%#{value}%")
|
41
48
|
end
|
42
49
|
end
|
43
50
|
|
@@ -45,5 +52,10 @@ module EasyFilter
|
|
45
52
|
return name.gsub(prefix, '').to_s if name.start_with?(prefix)
|
46
53
|
name
|
47
54
|
end
|
55
|
+
|
56
|
+
def add_model(field)
|
57
|
+
return self.quoted_table_name + '.' + field unless field.include? '.'
|
58
|
+
field
|
59
|
+
end
|
48
60
|
end
|
49
61
|
end
|
data/lib/easy_filter/version.rb
CHANGED
@@ -17,53 +17,55 @@ module EasyFilter
|
|
17
17
|
form = render_easy 'form_open', prefixes, model_class
|
18
18
|
|
19
19
|
filters.each do |filter|
|
20
|
-
|
21
|
-
form += render_easy 'form_field_open', prefixes
|
20
|
+
f = determine_column filter, model_class
|
21
|
+
form += render_easy 'form_field_open', prefixes
|
22
22
|
|
23
|
-
case col_type
|
23
|
+
case f[:col_type]
|
24
24
|
when :datetime
|
25
|
-
form += render_easy 'field_datetime', prefixes,
|
25
|
+
form += render_easy 'field_datetime', prefixes, f
|
26
26
|
|
27
27
|
when :array
|
28
|
-
form += render_easy 'field_array', prefixes,
|
28
|
+
form += render_easy 'field_array', prefixes, f
|
29
29
|
|
30
30
|
else
|
31
|
-
form += render_easy 'field_text', prefixes,
|
31
|
+
form += render_easy 'field_text', prefixes, f
|
32
32
|
end
|
33
33
|
|
34
|
-
form += render_easy 'form_field_close', prefixes
|
34
|
+
form += render_easy 'form_field_close', prefixes
|
35
35
|
end
|
36
36
|
|
37
|
-
form += render_easy 'buttons', prefixes
|
38
|
-
form += render_easy 'form_close', prefixes
|
37
|
+
form += render_easy 'buttons', prefixes
|
38
|
+
form += render_easy 'form_close', prefixes
|
39
39
|
end
|
40
40
|
|
41
41
|
private
|
42
42
|
|
43
43
|
def determine_column(filter, model_class)
|
44
|
-
|
45
|
-
|
44
|
+
filter = {field: filter.to_s} if filter.is_a?(Symbol) || filter.is_a?(String)
|
45
|
+
p "debug:"
|
46
|
+
p filter[:field]
|
47
|
+
filter[:field] = filter[:field].to_s
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
49
|
+
filter[:label] ||= t("activerecord.attributes.#{model_class.name.downcase}.#{filter[:field]}")
|
50
|
+
|
51
|
+
unless filter[:items].nil?
|
52
|
+
filter[:col_type] = :array
|
50
53
|
else
|
51
54
|
model_class.columns.each do |column|
|
52
|
-
if column.name ==
|
53
|
-
col_type = column.type
|
55
|
+
if column.name == filter[:field]
|
56
|
+
filter[:col_type] = column.type
|
54
57
|
break
|
55
58
|
end
|
56
59
|
end
|
57
60
|
end
|
58
|
-
|
61
|
+
|
62
|
+
filter
|
59
63
|
end
|
60
64
|
|
61
|
-
def render_easy(name, prefixes,
|
65
|
+
def render_easy(name, prefixes, filter = nil)
|
62
66
|
render partial: "easy_filter/#{name}",
|
63
67
|
locals: { filter_prefixes: prefixes,
|
64
|
-
|
65
|
-
filter_col_name: col_name,
|
66
|
-
elements: elements }
|
68
|
+
filter: filter }
|
67
69
|
end
|
68
70
|
end
|
69
71
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_filter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Kepes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|