effective_resources 1.0.4 → 1.0.5
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/app/controllers/concerns/effective/crud_controller/permitted_params.rb +1 -1
- data/app/controllers/concerns/effective/crud_controller/save.rb +1 -3
- data/app/helpers/effective_resources_helper.rb +2 -1
- data/app/helpers/effective_resources_private_helper.rb +2 -2
- data/app/models/effective/attribute.rb +6 -11
- data/app/models/effective/resources/actions.rb +5 -1
- data/app/models/effective/resources/associations.rb +2 -1
- data/app/models/effective/resources/forms.rb +10 -2
- data/app/models/effective/resources/relation.rb +37 -19
- data/app/views/effective/resource/_actions_dropleft.html.haml +2 -2
- data/lib/effective_resources/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2ca1a9b6a0534a0caad17123408d88fdeea90ac
|
4
|
+
data.tar.gz: 309cb6aaf4f19f681fdd73964a223116923292f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1ec2cd136f7c917caa82dba82a140ef833f87a1e1aae1d060aa3f662de5092acbb2dc194dab2e5712cdd1edf74278d6449ded873bc89bf0140401778c8fad26f
|
7
|
+
data.tar.gz: fab0e5230b8ce493cb1355f4bca6aa90ef9c206abe266e73e8f1f9e1ea2e1c6919b7a846b7812fdc4d946aec01d96234ca283a9e0ea01c2e8e345e8bbfc6628d
|
@@ -72,7 +72,7 @@ module Effective
|
|
72
72
|
effective_resource.nested_resources.each do |nested|
|
73
73
|
if (nested_params = permitted_params_for(nested.klass)).present?
|
74
74
|
nested_params.insert(nested_params.rindex { |obj| !obj.kind_of?(Hash)} + 1, :_destroy)
|
75
|
-
permitted_params << { "#{nested.
|
75
|
+
permitted_params << { "#{nested.name}_attributes".to_sym => nested_params }
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -14,9 +14,7 @@ module Effective
|
|
14
14
|
|
15
15
|
on = ons[params[:commit].to_s] || ons[action] || ons[commit[:action]]
|
16
16
|
|
17
|
-
commit.reverse_merge
|
18
|
-
|
19
|
-
commit
|
17
|
+
on.present? ? commit.reverse_merge(on) : commit
|
20
18
|
end
|
21
19
|
|
22
20
|
# This calls the appropriate member action, probably save!, on the resource.
|
@@ -60,6 +60,7 @@ module EffectiveResourcesHelper
|
|
60
60
|
raise 'expected first argument to be an ActiveRecord::Base object or Array of objects' unless resource.kind_of?(ActiveRecord::Base) || resource.kind_of?(Class) || resource.kind_of?(Array)
|
61
61
|
raise 'expected attributes to be a Hash' unless atts.kind_of?(Hash)
|
62
62
|
|
63
|
+
btn_class = atts.delete(:btn_class)
|
63
64
|
locals = atts.delete(:locals) || {}
|
64
65
|
partial = atts.delete(:partial)
|
65
66
|
spacer_template = locals.delete(:spacer_template)
|
@@ -80,7 +81,7 @@ module EffectiveResourcesHelper
|
|
80
81
|
partial = (partial.presence || 'effective/resource/actions') + '.html'
|
81
82
|
|
82
83
|
# Assign Locals
|
83
|
-
locals = { resource: resource, effective_resource: effective_resource, namespace: namespace, actions: actions }.compact.merge(locals)
|
84
|
+
locals = { resource: resource, effective_resource: effective_resource, namespace: namespace, actions: actions, btn_class: btn_class.to_s }.compact.merge(locals)
|
84
85
|
|
85
86
|
# Render
|
86
87
|
if resource.kind_of?(Array)
|
@@ -24,12 +24,12 @@ module EffectiveResourcesPrivateHelper
|
|
24
24
|
|
25
25
|
# Replace resource name in any token strings
|
26
26
|
if opts.key?('data-confirm')
|
27
|
-
opts['data-confirm'].gsub
|
27
|
+
opts['data-confirm'] = opts['data-confirm'].gsub('@resource', (resource.to_s.presence || resource.class.name.gsub('::', ' ').underscore.gsub('_', ' ')).to_s)
|
28
28
|
end
|
29
29
|
|
30
30
|
# Assign class
|
31
31
|
opts[:class] ||= (
|
32
|
-
if opts['data-method'] == 'delete'
|
32
|
+
if opts['data-method'].to_s == 'delete'
|
33
33
|
'btn btn-danger'
|
34
34
|
elsif h.length == 0
|
35
35
|
'btn btn-primary'
|
@@ -34,7 +34,8 @@ module Effective
|
|
34
34
|
when :duration ; :duration
|
35
35
|
when :email ; :email
|
36
36
|
when :integer ; :integer
|
37
|
-
when :
|
37
|
+
when :percent ; :percent
|
38
|
+
when :percentage ; :percent
|
38
39
|
when :phone ; :phone
|
39
40
|
when :price ; :price
|
40
41
|
when :nil ; :nil
|
@@ -101,14 +102,8 @@ module Effective
|
|
101
102
|
EffectiveRoles.roles.include?(value.to_sym) ? value : EffectiveRoles.roles_for(value)
|
102
103
|
when :integer
|
103
104
|
(value.kind_of?(String) ? value.gsub(/\D/, '') : value).to_i
|
104
|
-
when :
|
105
|
-
|
106
|
-
if value.to_s.include?('.')
|
107
|
-
value = value.to_s.gsub(/[^0-9|\-|\.]/, '').to_f
|
108
|
-
value >= 1.0 ? (value / 100.0) : value
|
109
|
-
else
|
110
|
-
(value.to_s.gsub(/\D/, '').to_f / 100.0)
|
111
|
-
end
|
105
|
+
when :percent # Integer * 1000. Percentage to 3 digits.
|
106
|
+
value.kind_of?(Integer) ? value : (value.to_s.gsub(/[^0-9|\-|\.]/, '').to_f * 1000.0).round
|
112
107
|
when :phone
|
113
108
|
digits = value.to_s.gsub(/\D/, '').chars
|
114
109
|
digits = (digits.first == '1' ? digits[1..10] : digits[0..9]) # Throw away a leading 1
|
@@ -120,8 +115,8 @@ module Effective
|
|
120
115
|
(value.kind_of?(String) ? value.gsub(/\D/, '') : value).to_i
|
121
116
|
when :nil
|
122
117
|
value.presence
|
123
|
-
when :price
|
124
|
-
|
118
|
+
when :price # Integer * 100. Number of cents.
|
119
|
+
value.kind_of?(Integer) ? value : (value.to_s.gsub(/[^0-9|\-|\.]/, '').to_f * 100.0).round
|
125
120
|
when :string, :text, :email
|
126
121
|
value.to_s
|
127
122
|
when :belongs_to_polymorphic
|
@@ -36,6 +36,10 @@ module Effective
|
|
36
36
|
# Effective::Resource.new('admin/posts').action_path(:edit, Post.last) => '/admin/posts/3/edit'
|
37
37
|
# Will work for any action. Returns the real path
|
38
38
|
def action_path(action, resource = nil, opts = {})
|
39
|
+
if klass.nil? && resource.present? && initialized_name.kind_of?(ActiveRecord::Reflection::BelongsToReflection)
|
40
|
+
return Effective::Resource.new(resource, namespace: namespace).action_path(action, resource, opts)
|
41
|
+
end
|
42
|
+
|
39
43
|
return unless routes[action]
|
40
44
|
|
41
45
|
if resource.kind_of?(Hash)
|
@@ -43,7 +47,7 @@ module Effective
|
|
43
47
|
end
|
44
48
|
|
45
49
|
# edge case: Effective::Resource.new('admin/comments').action_path(:new, @post)
|
46
|
-
if resource
|
50
|
+
if resource && klass && !resource.kind_of?(klass)
|
47
51
|
if (bt = belongs_to(resource)).present? && instance.respond_to?("#{bt.name}=")
|
48
52
|
return routes[action].format(klass.new(bt.name => resource)).presence
|
49
53
|
end
|
@@ -45,7 +45,8 @@ module Effective
|
|
45
45
|
|
46
46
|
def nested_resources
|
47
47
|
return [] unless klass.respond_to?(:reflect_on_all_associations)
|
48
|
-
klass.reflect_on_all_associations(:has_many).select { |ass| ass.options[:autosave] }
|
48
|
+
klass.reflect_on_all_associations(:has_many).select { |ass| ass.options[:autosave] } +
|
49
|
+
klass.reflect_on_all_associations(:has_one).select { |ass| ass.options[:autosave] }
|
49
50
|
end
|
50
51
|
|
51
52
|
def associated(name)
|
@@ -8,8 +8,16 @@ module Effective
|
|
8
8
|
when :belongs_to
|
9
9
|
{ as: :select }.merge(search_form_field_collection(belongs_to(name)))
|
10
10
|
when :belongs_to_polymorphic
|
11
|
-
|
12
|
-
|
11
|
+
constant_pluralized = name.to_s.upcase
|
12
|
+
constant = name.to_s.pluralize.upcase
|
13
|
+
|
14
|
+
if defined?("#{klass.name}::#{constant}")
|
15
|
+
{ as: :select, polymorphic: true, collection: klass.const_get(constant) }
|
16
|
+
elsif defined?("#{klass.name}::#{constant_pluralized}")
|
17
|
+
{ as: :select, polymorphic: true, collection: klass.const_get(constant_pluralized) }
|
18
|
+
else
|
19
|
+
{ as: :string }
|
20
|
+
end
|
13
21
|
when :has_and_belongs_to_many
|
14
22
|
{ as: :select }.merge(search_form_field_collection(has_and_belongs_to_many(name)))
|
15
23
|
when :has_many
|
@@ -79,7 +79,9 @@ module Effective
|
|
79
79
|
when :belongs_to_polymorphic
|
80
80
|
(type, id) = term.split('_')
|
81
81
|
|
82
|
-
if
|
82
|
+
if term == 'nil'
|
83
|
+
relation.where(is_null("#{sql_column}_id")).where(is_null("#{sql_column}_type"))
|
84
|
+
elsif type.present? && id.present?
|
83
85
|
relation.where("#{sql_column}_id = ?", id).where("#{sql_column}_type = ?", type)
|
84
86
|
else
|
85
87
|
id ||= Effective::Attribute.new(:integer).parse(term)
|
@@ -133,8 +135,8 @@ module Effective
|
|
133
135
|
end
|
134
136
|
when :integer
|
135
137
|
relation.where("#{sql_column} = ?", term)
|
136
|
-
when :
|
137
|
-
relation.where("#{sql_column} = ?",
|
138
|
+
when :percent
|
139
|
+
relation.where("#{sql_column} = ?", term)
|
138
140
|
when :price
|
139
141
|
relation.where("#{sql_column} = ?", term)
|
140
142
|
when :string, :text, :email
|
@@ -193,38 +195,54 @@ module Effective
|
|
193
195
|
key = sql_column(klass.primary_key)
|
194
196
|
values = relation.pluck(association.source_reflection.klass.primary_key).uniq.compact
|
195
197
|
|
196
|
-
keys =
|
197
|
-
.where(
|
198
|
-
|
198
|
+
keys = if value == 'nil'
|
199
|
+
klass.where.not(klass.primary_key => klass.joins(association.name)).pluck(klass.primary_key)
|
200
|
+
else
|
201
|
+
klass.joins(association.name)
|
202
|
+
.where(association.name => { association.source_reflection.klass.primary_key => values })
|
203
|
+
.pluck(klass.primary_key)
|
204
|
+
end
|
199
205
|
elsif association.options[:through].present?
|
200
|
-
|
206
|
+
scope = association.through_reflection.klass.all
|
201
207
|
|
202
208
|
if association.source_reflection.options[:polymorphic]
|
203
209
|
reflected_klass = association.klass
|
210
|
+
scope = scope.where(association.source_reflection.foreign_type => reflected_klass.name)
|
204
211
|
else
|
205
212
|
reflected_klass = association.source_reflection.klass
|
206
213
|
end
|
207
214
|
|
208
|
-
values = relation.pluck(reflected_klass.primary_key).uniq.compact
|
209
|
-
|
210
|
-
scope = association.through_reflection.klass.where(association.source_reflection.foreign_key => values)
|
211
|
-
|
212
|
-
if association.source_reflection.options[:polymorphic]
|
213
|
-
scope = scope.where(association.source_reflection.foreign_type => reflected_klass.name)
|
214
|
-
end
|
215
|
-
|
216
215
|
if association.through_reflection.macro == :belongs_to
|
217
216
|
key = association.through_reflection.foreign_key
|
218
|
-
|
217
|
+
pluck_key = association.through_reflection.klass.primary_key
|
219
218
|
else
|
220
|
-
|
219
|
+
key = sql_column(klass.primary_key)
|
220
|
+
pluck_key = association.through_reflection.foreign_key
|
221
221
|
end
|
222
|
+
|
223
|
+
if value == 'nil'
|
224
|
+
keys = klass.where.not(klass.primary_key => scope.pluck(pluck_key)).pluck(klass.primary_key)
|
225
|
+
else
|
226
|
+
keys = scope.where(association.source_reflection.foreign_key => relation).pluck(pluck_key)
|
227
|
+
end
|
228
|
+
|
222
229
|
elsif association.macro == :has_many
|
223
230
|
key = sql_column(klass.primary_key)
|
224
|
-
|
231
|
+
|
232
|
+
keys = if value == 'nil'
|
233
|
+
klass.where.not(klass.primary_key => resource.klass.pluck(association.foreign_key)).pluck(klass.primary_key)
|
234
|
+
else
|
235
|
+
relation.pluck(association.foreign_key)
|
236
|
+
end
|
237
|
+
|
225
238
|
elsif association.macro == :has_one
|
226
239
|
key = sql_column(klass.primary_key)
|
227
|
-
|
240
|
+
|
241
|
+
keys = if value == 'nil'
|
242
|
+
klass.where.not(klass.primary_key => resource.klass.pluck(association.foreign_key)).pluck(klass.primary_key)
|
243
|
+
else
|
244
|
+
relation.pluck(association.foreign_key)
|
245
|
+
end
|
228
246
|
end
|
229
247
|
|
230
248
|
"#{key} IN (#{(keys.uniq.compact.presence || [0]).join(',')})"
|
@@ -1,6 +1,6 @@
|
|
1
|
-
= dropdown(variation: :dropleft) do
|
1
|
+
= dropdown(variation: :dropleft, btn_class: btn_class) do
|
2
2
|
- permitted_resource_actions(resource, actions).each do |label, opts|
|
3
|
-
= dropdown_link_to(label, (effective_resource.action_path(opts[:action], resource) || '#'), opts.except(:action, :class))
|
3
|
+
= dropdown_link_to(label, (effective_resource.action_path(opts[:action], resource) || '#'), opts.except(:action, :class).merge(btn_class: btn_class))
|
4
4
|
|
5
5
|
= instance_exec(resource, &format_block) if local_assigns[:format_block]
|
6
6
|
= yield(resource) if block_given?
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: effective_resources
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Code and Effect
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-10-
|
11
|
+
date: 2018-10-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|