simple_form_ransack 0.0.11 → 0.0.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/simple_form_ransack_helper.rb +6 -4
- data/config/locales/da.yml +9 -0
- data/config/locales/en.yml +9 -0
- data/lib/simple_form_ransack.rb +12 -0
- data/lib/simple_form_ransack/attribute_inspector.rb +26 -26
- data/lib/simple_form_ransack/form_proxy.rb +10 -102
- data/lib/simple_form_ransack/input_manipulator.rb +176 -0
- data/lib/simple_form_ransack/version.rb +1 -1
- metadata +27 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 006388474436da19f6fdddf9f5d8841df249294d
|
4
|
+
data.tar.gz: 6b3c4b4d309a654566c72e3c963fad0389c4e19f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48d2f85c01f488af2caf19b92525ec86faf7e52f04573f3261bf7bf8a44f3efb3eff7521085968dfaace16b2b677da981342d5064b3221c79f96ee3b1e96b80e
|
7
|
+
data.tar.gz: 098d43e27853fc4fb77a8b5b41f8f7a456f2a145eeecf4252d6ad422a1d29a34292884555337786d4dcb4eec880242c053f2686eed34c0ce5165747f4008633d
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module SimpleFormRansackHelper
|
2
|
-
def simple_search_form_for(
|
2
|
+
def simple_search_form_for(ransack, *args)
|
3
3
|
if args.last.is_a?(Hash)
|
4
4
|
opts = args.pop
|
5
5
|
else
|
@@ -10,14 +10,16 @@ module SimpleFormRansackHelper
|
|
10
10
|
opts[:method] = "get" unless opts[:method]
|
11
11
|
args << opts
|
12
12
|
|
13
|
-
model_class =
|
13
|
+
model_class = ransack.klass
|
14
14
|
sample_model = model_class.new
|
15
15
|
|
16
|
+
search_key = ransack.context.search_key
|
17
|
+
|
16
18
|
simple_form_for(sample_model, *args) do |form|
|
17
19
|
form_proxy = SimpleFormRansack::FormProxy.new(
|
18
|
-
|
20
|
+
ransack: ransack,
|
19
21
|
form: form,
|
20
|
-
params: params
|
22
|
+
params: params[search_key] || {}
|
21
23
|
)
|
22
24
|
|
23
25
|
yield form_proxy
|
data/lib/simple_form_ransack.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
module SimpleFormRansack
|
2
2
|
autoload :AttributeInspector, "simple_form_ransack/attribute_inspector"
|
3
|
+
autoload :InputManipulator, "simple_form_ransack/input_manipulator"
|
3
4
|
autoload :FormProxy, "simple_form_ransack/form_proxy"
|
5
|
+
|
6
|
+
def self.locale_files
|
7
|
+
files = []
|
8
|
+
|
9
|
+
I18n.available_locales.each do |locale|
|
10
|
+
path = "#{File.realpath("#{File.dirname(__FILE__)}/../config/locales")}/#{locale}.yml"
|
11
|
+
files << File.realpath(path) if File.exist?(path)
|
12
|
+
end
|
13
|
+
|
14
|
+
files
|
15
|
+
end
|
4
16
|
end
|
5
17
|
|
6
18
|
require_relative "../app/helpers/simple_form_ransack_helper"
|
@@ -2,10 +2,11 @@
|
|
2
2
|
class SimpleFormRansack::AttributeInspector
|
3
3
|
def initialize(args)
|
4
4
|
@args = args
|
5
|
-
@ransack_name = args
|
5
|
+
@ransack_name = args.fetch(:name)
|
6
6
|
@name_parts = @ransack_name.to_s.split("_")
|
7
|
-
@instance = args
|
8
|
-
@clazz = args
|
7
|
+
@instance = args.fetch(:instance)
|
8
|
+
@clazz = args.fetch(:clazz)
|
9
|
+
@as = args.fetch(:as)
|
9
10
|
@debug = args[:debug]
|
10
11
|
|
11
12
|
@generated_name_classes = []
|
@@ -13,9 +14,7 @@ class SimpleFormRansack::AttributeInspector
|
|
13
14
|
@current_clazz = @clazz
|
14
15
|
@name_builtup = []
|
15
16
|
|
16
|
-
|
17
|
-
|
18
|
-
research unless has_attribute_directly
|
17
|
+
research unless attribute_directly?
|
19
18
|
end
|
20
19
|
|
21
20
|
# Loop through the name parts and inspectors reflections with it.
|
@@ -26,15 +25,9 @@ class SimpleFormRansack::AttributeInspector
|
|
26
25
|
# The last part should be the attribute name.
|
27
26
|
if index == @name_parts.length - 1
|
28
27
|
attribute_result = attribute_by_builtup
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
@attribute = attribute_result.fetch(:name)
|
33
|
-
break
|
34
|
-
else
|
35
|
-
puts "Not found: #{@name_builtup.join("_")}" if @debug
|
36
|
-
next
|
37
|
-
end
|
28
|
+
next unless attribute_result
|
29
|
+
@attribute = attribute_result.fetch(:name)
|
30
|
+
break
|
38
31
|
end
|
39
32
|
|
40
33
|
# Try next - maybe next key need to be added? (which is common!)
|
@@ -42,12 +35,8 @@ class SimpleFormRansack::AttributeInspector
|
|
42
35
|
next unless reflection_result
|
43
36
|
|
44
37
|
@name_builtup = []
|
45
|
-
name = reflection_result.fetch(:name)
|
46
38
|
reflection = reflection_result.fetch(:reflection)
|
47
39
|
|
48
|
-
puts "Name: #{name}" if @debug
|
49
|
-
puts "Reflection: #{reflection}" if @debug
|
50
|
-
|
51
40
|
@current_clazz = reflection.klass
|
52
41
|
@generated_name_classes << {clazz: @current_clazz, reflection: reflection}
|
53
42
|
end
|
@@ -61,27 +50,34 @@ class SimpleFormRansack::AttributeInspector
|
|
61
50
|
|
62
51
|
# Generates the complicated label and returns it.
|
63
52
|
def generated_label
|
64
|
-
|
53
|
+
@generated_label = ""
|
65
54
|
|
66
55
|
if @generated_name_classes.last
|
67
56
|
clazz = @generated_name_classes.last.fetch(:clazz)
|
68
57
|
reflection = @generated_name_classes.last.fetch(:reflection)
|
69
58
|
|
70
59
|
if reflection.collection?
|
71
|
-
|
60
|
+
@generated_label << clazz.model_name.human(count: 2)
|
72
61
|
else
|
73
|
-
|
62
|
+
@generated_label << clazz.model_name.human
|
74
63
|
end
|
75
64
|
end
|
76
65
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
name
|
66
|
+
add_id_to_generated_label
|
67
|
+
@generated_label
|
81
68
|
end
|
82
69
|
|
83
70
|
private
|
84
71
|
|
72
|
+
def add_id_to_generated_label
|
73
|
+
if @attribute == "id" && @as != "string"
|
74
|
+
# Don't add "id" to label, because it is being shown as a collection
|
75
|
+
else
|
76
|
+
@generated_label << " " unless @generated_label.empty?
|
77
|
+
@generated_label << @current_clazz.human_attribute_name(@attribute).to_s.downcase
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
85
81
|
def reflection_by_builtup
|
86
82
|
total_name = @name_builtup.join("_")
|
87
83
|
result = @current_clazz.reflections.find { |name, _reflection| name.to_s == total_name }
|
@@ -95,4 +91,8 @@ private
|
|
95
91
|
return {name: result} if result
|
96
92
|
false
|
97
93
|
end
|
94
|
+
|
95
|
+
def attribute_directly?
|
96
|
+
@clazz.attribute_names.find { |name| name.to_s == @ransack_name.to_s }
|
97
|
+
end
|
98
98
|
end
|
@@ -14,9 +14,9 @@ class SimpleFormRansack::FormProxy
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def initialize(args)
|
17
|
-
@
|
18
|
-
@object = @
|
19
|
-
@class = @
|
17
|
+
@ransack = args.fetch(:ransack)
|
18
|
+
@object = @ransack.object
|
19
|
+
@class = @ransack.klass
|
20
20
|
@params = args.fetch(:params)
|
21
21
|
@form = args.fetch(:form)
|
22
22
|
|
@@ -24,109 +24,17 @@ class SimpleFormRansack::FormProxy
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def input(name, *args)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
attribute_name = real_name(name)
|
34
|
-
as = as_from_opts(attribute_name, opts)
|
35
|
-
input_html = opts.delete(:input_html) || {}
|
36
|
-
set_value(as, name, opts, input_html)
|
37
|
-
set_name(as, name, input_html)
|
38
|
-
set_label(attribute_name, opts, input_html)
|
27
|
+
input_manipulator = SimpleFormRansack::InputManipulator.new(
|
28
|
+
name: name,
|
29
|
+
args: args,
|
30
|
+
params: @params,
|
31
|
+
class: @class
|
32
|
+
)
|
39
33
|
|
40
|
-
|
41
|
-
opts[:input_html] = input_html
|
42
|
-
args << opts
|
43
|
-
@form.input(attribute_name, *args)
|
34
|
+
@form.input(input_manipulator.attribute_name, *args)
|
44
35
|
end
|
45
36
|
|
46
37
|
def method_missing(method_name, *args, &blk)
|
47
38
|
@form.__send__(method_name, *args, &blk)
|
48
39
|
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
def set_label(attribute_name, opts, _input_html)
|
53
|
-
unless opts.key?(:label)
|
54
|
-
attribute_inspector = ::SimpleFormRansack::AttributeInspector.new(
|
55
|
-
name: attribute_name,
|
56
|
-
instance: @object,
|
57
|
-
clazz: @class
|
58
|
-
)
|
59
|
-
|
60
|
-
if attribute_inspector.generated_label?
|
61
|
-
opts[:label] = attribute_inspector.generated_label
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def set_name(as, name, input_html)
|
67
|
-
return if input_html.key?(:name)
|
68
|
-
|
69
|
-
input_html[:name] = "q[#{name}]"
|
70
|
-
input_html[:name] << "[]" if as == "check_boxes"
|
71
|
-
end
|
72
|
-
|
73
|
-
def set_value(as, name, opts, input_html)
|
74
|
-
if as == "select"
|
75
|
-
unless opts.key?(:selected)
|
76
|
-
if @params[name]
|
77
|
-
opts[:selected] = @params[name]
|
78
|
-
else
|
79
|
-
opts[:selected] = ""
|
80
|
-
end
|
81
|
-
end
|
82
|
-
elsif as == "check_boxes" || as == "radio_buttons"
|
83
|
-
unless opts.key?(:checked)
|
84
|
-
if @params[name]
|
85
|
-
opts[:checked] = @params[name]
|
86
|
-
else
|
87
|
-
opts[:checked] = ""
|
88
|
-
end
|
89
|
-
end
|
90
|
-
elsif as == "boolean"
|
91
|
-
unless input_html.key?(:checked)
|
92
|
-
input_html[:checked] = ("checked" if @params[name] == "1")
|
93
|
-
end
|
94
|
-
else
|
95
|
-
unless input_html.key?(:value)
|
96
|
-
if @params[name]
|
97
|
-
input_html[:value] = @params[name]
|
98
|
-
else
|
99
|
-
input_html[:value] = ""
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def as_list?(opts)
|
106
|
-
return true if as_from_opts(opts) == "select"
|
107
|
-
false
|
108
|
-
end
|
109
|
-
|
110
|
-
def as_from_opts(attribute_name, opts)
|
111
|
-
if opts[:as].present?
|
112
|
-
return opts.fetch(:as).to_s
|
113
|
-
elsif opts[:collection] || attribute_name.end_with?("country")
|
114
|
-
return "select"
|
115
|
-
end
|
116
|
-
|
117
|
-
column = @class.columns_hash[attribute_name]
|
118
|
-
return "boolean" if column && column.type == :boolean
|
119
|
-
|
120
|
-
"text"
|
121
|
-
end
|
122
|
-
|
123
|
-
def real_name(name)
|
124
|
-
match = name.to_s.match(SimpleFormRansack::FormProxy.predicates_regex)
|
125
|
-
|
126
|
-
if match
|
127
|
-
return match[1]
|
128
|
-
else
|
129
|
-
raise "Couldn't figure out attribute name from: #{name}"
|
130
|
-
end
|
131
|
-
end
|
132
40
|
end
|
@@ -0,0 +1,176 @@
|
|
1
|
+
class SimpleFormRansack::InputManipulator
|
2
|
+
attr_reader :args
|
3
|
+
|
4
|
+
def initialize(args)
|
5
|
+
@args = args.fetch(:args)
|
6
|
+
@name = args.fetch(:name)
|
7
|
+
@params = args.fetch(:params)
|
8
|
+
@class = args.fetch(:class)
|
9
|
+
|
10
|
+
if @args.last.is_a?(Hash)
|
11
|
+
@opts = @args.pop
|
12
|
+
else
|
13
|
+
@opts = {}
|
14
|
+
end
|
15
|
+
|
16
|
+
@input_html = @opts[:input_html] || {}
|
17
|
+
|
18
|
+
calculate_name
|
19
|
+
calculate_as
|
20
|
+
|
21
|
+
set_values
|
22
|
+
end
|
23
|
+
|
24
|
+
def attribute_name
|
25
|
+
@attribute_name || @name
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def set_values
|
31
|
+
@opts[:required] = false unless @opts.key?(:required)
|
32
|
+
@opts[:input_html] = @input_html
|
33
|
+
|
34
|
+
set_value
|
35
|
+
set_name
|
36
|
+
set_label if @attribute_name && !@opts.key?(:label)
|
37
|
+
|
38
|
+
@args << @opts
|
39
|
+
end
|
40
|
+
|
41
|
+
def calculate_name
|
42
|
+
match = @name.to_s.match(SimpleFormRansack::FormProxy.predicates_regex)
|
43
|
+
return unless match
|
44
|
+
|
45
|
+
@attribute_name = match[1]
|
46
|
+
@match_type = match[2]
|
47
|
+
|
48
|
+
@name_parts = @attribute_name.split(/_(or|and)_/)
|
49
|
+
@name_parts_length = @name_parts.length
|
50
|
+
end
|
51
|
+
|
52
|
+
def calculate_as
|
53
|
+
column = @class.columns_hash[@attribute_name]
|
54
|
+
|
55
|
+
if @opts[:as].present?
|
56
|
+
@as = @opts.fetch(:as).to_s
|
57
|
+
elsif @opts[:collection]
|
58
|
+
@as = "select"
|
59
|
+
elsif @attribute_name.to_s.end_with?("country")
|
60
|
+
@as = "country"
|
61
|
+
elsif column && column.type == :boolean
|
62
|
+
@as = "boolean"
|
63
|
+
end
|
64
|
+
|
65
|
+
@as ||= "string"
|
66
|
+
end
|
67
|
+
|
68
|
+
def set_name
|
69
|
+
@input_html[:id] = "q_#{@name}"
|
70
|
+
|
71
|
+
return if @input_html.key?(:name)
|
72
|
+
|
73
|
+
@input_html[:name] = "q[#{@name}]"
|
74
|
+
@input_html[:name] << "[]" if @as == "check_boxes"
|
75
|
+
end
|
76
|
+
|
77
|
+
def set_label
|
78
|
+
label_parts = []
|
79
|
+
|
80
|
+
@name_parts.each_with_index do |attribute_name_part, index|
|
81
|
+
if attribute_name_part == "and" || attribute_name_part == "or"
|
82
|
+
label_parts << add_between_label(index, attribute_name_part) unless label_parts.empty?
|
83
|
+
next
|
84
|
+
end
|
85
|
+
|
86
|
+
label = label_part(attribute_name_part)
|
87
|
+
|
88
|
+
if label
|
89
|
+
label[0] = label[0].downcase if label_parts.any?
|
90
|
+
label_parts << label
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
label_from_parts(label_parts)
|
95
|
+
end
|
96
|
+
|
97
|
+
def add_between_label(index, attribute_name_part)
|
98
|
+
if index == @name_parts_length - 2
|
99
|
+
" #{I18n.t("simple_form_ransack.words.#{attribute_name_part}")} "
|
100
|
+
else
|
101
|
+
", "
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def label_from_parts(label_parts)
|
106
|
+
return if label_parts.empty?
|
107
|
+
|
108
|
+
@opts[:label] = label_parts.join
|
109
|
+
prepend_label_for = %w(cont gteq lteq)
|
110
|
+
|
111
|
+
return unless prepend_label_for.include?(@match_type)
|
112
|
+
@opts[:label] << " #{I18n.t("simple_form_ransack.match_types.#{@match_type}")}"
|
113
|
+
end
|
114
|
+
|
115
|
+
def label_part(attribute_name_part)
|
116
|
+
attribute_inspector = ::SimpleFormRansack::AttributeInspector.new(
|
117
|
+
name: attribute_name_part,
|
118
|
+
instance: @object,
|
119
|
+
clazz: @class,
|
120
|
+
as: @as
|
121
|
+
)
|
122
|
+
|
123
|
+
if attribute_inspector.generated_label?
|
124
|
+
attribute_inspector.generated_label
|
125
|
+
else
|
126
|
+
@class.human_attribute_name(attribute_name_part)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def set_value
|
131
|
+
if @as == "select" || @as == "country"
|
132
|
+
set_value_for_select
|
133
|
+
elsif @as == "check_boxes" || @as == "radio_buttons"
|
134
|
+
set_value_for_checked
|
135
|
+
elsif @as == "boolean"
|
136
|
+
set_value_for_boolean
|
137
|
+
else
|
138
|
+
set_value_for_input
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def set_value_for_select
|
143
|
+
return if @opts.key?(:selected)
|
144
|
+
|
145
|
+
if @params[@name]
|
146
|
+
@opts[:selected] = @params[@name]
|
147
|
+
else
|
148
|
+
@opts[:selected] = ""
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def set_value_for_checked
|
153
|
+
return if @opts.key?(:checked)
|
154
|
+
|
155
|
+
if @params[@name]
|
156
|
+
@opts[:checked] = @params[@name]
|
157
|
+
else
|
158
|
+
@opts[:checked] = ""
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def set_value_for_boolean
|
163
|
+
return if @input_html.key?(:checked)
|
164
|
+
@input_html[:checked] = ("checked" if @params[@name] == "1")
|
165
|
+
end
|
166
|
+
|
167
|
+
def set_value_for_input
|
168
|
+
return if @input_html.key?(:value)
|
169
|
+
|
170
|
+
if @params[@name]
|
171
|
+
@input_html[:value] = @params[@name]
|
172
|
+
else
|
173
|
+
@input_html[:value] = ""
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: simple_form_ransack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.12
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kasper Johansen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,34 +24,48 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: capybara
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.6.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.6.0
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sqlite3
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
30
44
|
requirements:
|
31
|
-
- -
|
45
|
+
- - '='
|
32
46
|
- !ruby/object:Gem::Version
|
33
|
-
version:
|
47
|
+
version: 1.3.9
|
34
48
|
type: :development
|
35
49
|
prerelease: false
|
36
50
|
version_requirements: !ruby/object:Gem::Requirement
|
37
51
|
requirements:
|
38
|
-
- -
|
52
|
+
- - '='
|
39
53
|
- !ruby/object:Gem::Version
|
40
|
-
version:
|
54
|
+
version: 1.3.9
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rspec-rails
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
44
58
|
requirements:
|
45
|
-
- -
|
59
|
+
- - '='
|
46
60
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
61
|
+
version: 3.4.0
|
48
62
|
type: :development
|
49
63
|
prerelease: false
|
50
64
|
version_requirements: !ruby/object:Gem::Requirement
|
51
65
|
requirements:
|
52
|
-
- -
|
66
|
+
- - '='
|
53
67
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
68
|
+
version: 3.4.0
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: factory_girl_rails
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -175,9 +189,12 @@ files:
|
|
175
189
|
- MIT-LICENSE
|
176
190
|
- Rakefile
|
177
191
|
- app/helpers/simple_form_ransack_helper.rb
|
192
|
+
- config/locales/da.yml
|
193
|
+
- config/locales/en.yml
|
178
194
|
- lib/simple_form_ransack.rb
|
179
195
|
- lib/simple_form_ransack/attribute_inspector.rb
|
180
196
|
- lib/simple_form_ransack/form_proxy.rb
|
197
|
+
- lib/simple_form_ransack/input_manipulator.rb
|
181
198
|
- lib/simple_form_ransack/version.rb
|
182
199
|
- lib/tasks/simple_form_ransack_tasks.rake
|
183
200
|
homepage: https://www.github.com/kaspernj/simple_form_ransack
|