filter_form 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/filter_form/input_builder.rb +59 -0
- data/lib/filter_form/inputs/base.rb +34 -0
- data/lib/filter_form/inputs/belongs_to_eq.rb +36 -0
- data/lib/filter_form/inputs/date_eq.rb +13 -0
- data/lib/filter_form/inputs/integer_eq.rb +6 -0
- data/lib/filter_form/inputs/string.rb +19 -0
- data/lib/filter_form/inputs/string_cont.rb +6 -0
- data/lib/filter_form/simple_form/form_builder.rb +4 -3
- data/lib/filter_form/version.rb +1 -1
- metadata +8 -2
- data/lib/filter_form/input.rb +0 -113
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9426e908a32ac701218c4ba33aaaadef4e6575cb
|
4
|
+
data.tar.gz: 78121225fa25f3cf8008e5677f16403c7d0497e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1e2ec010b96b771e578d82f082392f1f9ee1543c1610e7ecf050e84611382b4d546213b559720403cee58c2aba5a0358df3b30ed15e76816774cdc31197063a2
|
7
|
+
data.tar.gz: 2a48d297c0ef88a01d1c9cb66cd2f1952a62e78830a91b4caf43d23e7aa8a6a9f0e7bc606618750d1423d413bf07a85cd8825bd2ce4481d93e8a3585e1af067b
|
data/README.md
CHANGED
@@ -45,7 +45,7 @@ For `string` attribute (like name) it will automatically create a text input wit
|
|
45
45
|
|
46
46
|
For `integer` type (age) it will set predicate `eq`.
|
47
47
|
|
48
|
-
For association's `foreign key` (city_id) it will automatically build a select tag.
|
48
|
+
For association's belongs_to `foreign key` (city_id) it will automatically build a select tag.
|
49
49
|
|
50
50
|
For `date` and `datetime` (birthday) it will automatically add jQuery [datepicker](http://jqueryui.com/datepicker/) and set predicate `eq`.
|
51
51
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'filter_form/inputs/base'
|
2
|
+
require 'filter_form/inputs/string'
|
3
|
+
|
4
|
+
require 'filter_form/inputs/belongs_to_eq'
|
5
|
+
require 'filter_form/inputs/string_cont'
|
6
|
+
require 'filter_form/inputs/integer_eq'
|
7
|
+
require 'filter_form/inputs/date_eq'
|
8
|
+
|
9
|
+
module FilterForm
|
10
|
+
class InputBuilder
|
11
|
+
include ActiveModel::Model
|
12
|
+
|
13
|
+
attr_accessor :attribute_name, :object
|
14
|
+
|
15
|
+
def build
|
16
|
+
"FilterForm::Inputs::#{ input_type.camelize }".constantize.new(attribute_name: attribute_name, object: object)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def input_type
|
22
|
+
"#{ type }_#{ predicate }"
|
23
|
+
end
|
24
|
+
|
25
|
+
def predicate
|
26
|
+
case attribute_type
|
27
|
+
when :string
|
28
|
+
:cont
|
29
|
+
else
|
30
|
+
:eq
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def type
|
35
|
+
case attribute_type
|
36
|
+
when :string
|
37
|
+
:string
|
38
|
+
when :integer
|
39
|
+
:integer
|
40
|
+
when :datetime, :date
|
41
|
+
:date
|
42
|
+
when :belongs_to
|
43
|
+
:belongs_to
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def association_belongs_to?
|
48
|
+
object.klass.reflections[attribute_name] && object.klass.reflections[attribute_name].belongs_to?
|
49
|
+
end
|
50
|
+
|
51
|
+
def attribute_type
|
52
|
+
if association_belongs_to?
|
53
|
+
:belongs_to
|
54
|
+
else
|
55
|
+
object.klass.columns_hash[attribute_name.to_s].type
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module FilterForm
|
2
|
+
module Inputs
|
3
|
+
class Base
|
4
|
+
include ActiveModel::Model
|
5
|
+
|
6
|
+
attr_accessor :attribute_name, :object
|
7
|
+
|
8
|
+
def options
|
9
|
+
{
|
10
|
+
required: false,
|
11
|
+
input_html: { name: input_name }
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def input_name
|
18
|
+
"q[#{ attribute_name }_#{ predicate }]"
|
19
|
+
end
|
20
|
+
|
21
|
+
def input_value
|
22
|
+
object_condition.values.first.value if object_condition
|
23
|
+
end
|
24
|
+
|
25
|
+
def predicate
|
26
|
+
self.class.to_s.underscore.split('_').last
|
27
|
+
end
|
28
|
+
|
29
|
+
def object_condition
|
30
|
+
object.base.conditions.select { |c| c.a.first.name == attribute_name.to_s }.first
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module FilterForm
|
2
|
+
module Inputs
|
3
|
+
class BelongsToEq < FilterForm::Inputs::Base
|
4
|
+
def options
|
5
|
+
super.merge(additional_options)
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def additional_options
|
11
|
+
{
|
12
|
+
as: :select,
|
13
|
+
collection: collection,
|
14
|
+
include_blank: true,
|
15
|
+
selected: input_value
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
def object_condition
|
20
|
+
object.base.conditions.select { |c| c.a.first.name == custom_attribute_name }.first
|
21
|
+
end
|
22
|
+
|
23
|
+
def collection
|
24
|
+
attribute_name.to_s.camelize.constantize.all
|
25
|
+
end
|
26
|
+
|
27
|
+
def input_name
|
28
|
+
"q[#{ custom_attribute_name }_#{ predicate }]"
|
29
|
+
end
|
30
|
+
|
31
|
+
def custom_attribute_name
|
32
|
+
"#{ attribute_name }_id"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module FilterForm
|
2
|
+
module Inputs
|
3
|
+
class String < FilterForm::Inputs::Base
|
4
|
+
def options
|
5
|
+
result = super.merge(as: :string)
|
6
|
+
result[:input_html].merge!(additional_input_options)
|
7
|
+
result
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
def additional_input_options
|
13
|
+
{
|
14
|
+
value: input_value
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,10 +1,11 @@
|
|
1
|
-
require 'filter_form/
|
1
|
+
require 'filter_form/input_builder'
|
2
2
|
|
3
3
|
module SimpleForm
|
4
4
|
class FormBuilder < ActionView::Helpers::FormBuilder
|
5
5
|
def filter_input(attribute_name, options = {}, &block)
|
6
|
-
|
7
|
-
|
6
|
+
filter_form_input = FilterForm::InputBuilder.new(attribute_name: attribute_name, object: object).build
|
7
|
+
|
8
|
+
options.reverse_merge!(filter_form_input.options)
|
8
9
|
|
9
10
|
input(attribute_name, options, &block)
|
10
11
|
end
|
data/lib/filter_form/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: filter_form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evgeny Li
|
@@ -95,7 +95,13 @@ files:
|
|
95
95
|
- lib/assets/javascripts/filter_form.js.coffee
|
96
96
|
- lib/filter_form.rb
|
97
97
|
- lib/filter_form/form_helper.rb
|
98
|
-
- lib/filter_form/
|
98
|
+
- lib/filter_form/input_builder.rb
|
99
|
+
- lib/filter_form/inputs/base.rb
|
100
|
+
- lib/filter_form/inputs/belongs_to_eq.rb
|
101
|
+
- lib/filter_form/inputs/date_eq.rb
|
102
|
+
- lib/filter_form/inputs/integer_eq.rb
|
103
|
+
- lib/filter_form/inputs/string.rb
|
104
|
+
- lib/filter_form/inputs/string_cont.rb
|
99
105
|
- lib/filter_form/simple_form/form_builder.rb
|
100
106
|
- lib/filter_form/version.rb
|
101
107
|
homepage: https://github.com/exAspArk/filter_form
|
data/lib/filter_form/input.rb
DELETED
@@ -1,113 +0,0 @@
|
|
1
|
-
module FilterForm
|
2
|
-
class Input
|
3
|
-
DATE_CLASS = 'filter_form_date'
|
4
|
-
|
5
|
-
include ActiveModel::Model
|
6
|
-
|
7
|
-
attr_accessor :attribute_name, :object
|
8
|
-
|
9
|
-
def options
|
10
|
-
result = default_options
|
11
|
-
|
12
|
-
case type
|
13
|
-
when :select
|
14
|
-
result.merge!(select_options)
|
15
|
-
else
|
16
|
-
result[:input_html].merge!(value: input_value)
|
17
|
-
end
|
18
|
-
|
19
|
-
case attribute_type
|
20
|
-
when :datetime, :date
|
21
|
-
result[:input_html].merge!(class: DATE_CLASS)
|
22
|
-
end
|
23
|
-
|
24
|
-
result
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def default_options
|
30
|
-
{
|
31
|
-
as: type,
|
32
|
-
required: false,
|
33
|
-
input_html: { name: input_name }
|
34
|
-
}
|
35
|
-
end
|
36
|
-
|
37
|
-
# Select options ------------------------------------------------------------
|
38
|
-
|
39
|
-
def select_options
|
40
|
-
{
|
41
|
-
collection: collection,
|
42
|
-
include_blank: true,
|
43
|
-
selected: selected
|
44
|
-
}
|
45
|
-
end
|
46
|
-
|
47
|
-
def collection
|
48
|
-
if reference_attribute?
|
49
|
-
attribute_name.to_s.gsub('_id', '').camelize.constantize.all
|
50
|
-
else
|
51
|
-
object.klass.pluck(attribute_name).uniq
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def selected
|
56
|
-
if object_condition.present?
|
57
|
-
input_value
|
58
|
-
else
|
59
|
-
false
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
# ---------------------------------------------------------------------------
|
64
|
-
|
65
|
-
def input_name
|
66
|
-
"q[#{ input_attribute_name }]"
|
67
|
-
end
|
68
|
-
|
69
|
-
def type
|
70
|
-
return :select if reference_attribute?
|
71
|
-
|
72
|
-
case attribute_type
|
73
|
-
when :string, :integer, :datetime, :date
|
74
|
-
:string
|
75
|
-
when :float
|
76
|
-
:float
|
77
|
-
when :boolean
|
78
|
-
:radio_buttons
|
79
|
-
else
|
80
|
-
:select
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def input_value
|
85
|
-
object_condition.values.first.value if object_condition
|
86
|
-
end
|
87
|
-
|
88
|
-
def reference_attribute?
|
89
|
-
attribute_name.to_s.end_with?('_id')
|
90
|
-
end
|
91
|
-
|
92
|
-
def object_condition
|
93
|
-
object.base.conditions.select { |c| c.a.first.name == attribute_name.to_s }.first
|
94
|
-
end
|
95
|
-
|
96
|
-
def input_attribute_name
|
97
|
-
"#{ attribute_name }_#{ predicate_name }"
|
98
|
-
end
|
99
|
-
|
100
|
-
def attribute_type
|
101
|
-
object.klass.columns_hash[attribute_name.to_s].type
|
102
|
-
end
|
103
|
-
|
104
|
-
def predicate_name
|
105
|
-
case attribute_type
|
106
|
-
when :string
|
107
|
-
'cont'
|
108
|
-
else
|
109
|
-
'eq'
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|