filter_form 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|