phlexi-form 0.8.0 → 0.8.2
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/lib/phlexi/form/builder.rb +12 -20
- data/lib/phlexi/form/components/association_base.rb +64 -0
- data/lib/phlexi/form/components/belongs_to.rb +7 -7
- data/lib/phlexi/form/components/concerns/accepts_choices.rb +2 -10
- data/lib/phlexi/form/components/has_many.rb +7 -7
- data/lib/phlexi/form/grouped_choices_mapper.rb +7 -2
- data/lib/phlexi/form/options/choices.rb +1 -24
- data/lib/phlexi/form/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5436d0872cd013770ac81aecaf6cd805b44762f5bd32bb3d4a95c6f9d3e936d1
|
4
|
+
data.tar.gz: dfddac5493ba78744bcc1956e8a7445579a6599631c4f4c00e74d9aa5f3ecd67
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1fe41d20bf2b26c29e71ebb932576a4b49751773f60c1d365cd6ad3f01a70dcda7e6dec894418654718fdf2514d860d92e2fad4d25254bbf7fb65151a5f0fefa
|
7
|
+
data.tar.gz: f32c8922f62bb618034a40dff29554d2171b5b46459c8200388a7162f0072360b5c0091c2fd9bace45923e17b73e086b98b49afe7e2d2be6ff211552f5dd7f47
|
data/lib/phlexi/form/builder.rb
CHANGED
@@ -175,11 +175,23 @@ module Phlexi
|
|
175
175
|
raise NotImplementedError, "has_one associations are NOT supported"
|
176
176
|
end
|
177
177
|
|
178
|
+
def polymorphic_has_one_tag(**, &)
|
179
|
+
# TODO: this requires a grouped_select component
|
180
|
+
# see: Plutonium::Core::Fields::Inputs::PolymorphicBelongsToAssociationInput
|
181
|
+
raise NotImplementedError, "polymorphic has_one associations are not YET supported"
|
182
|
+
end
|
183
|
+
|
178
184
|
def has_many_tag(**, &)
|
179
185
|
create_component(Components::HasMany, :has_many, **, &)
|
180
186
|
end
|
181
187
|
alias_method :has_and_belongs_to_many_tag, :has_many_tag
|
182
188
|
|
189
|
+
def polymorphic_has_many_tag(**, &)
|
190
|
+
# TODO: this requires a grouped_select component
|
191
|
+
# see: Plutonium::Core::Fields::Inputs::PolymorphicBelongsToAssociationInput
|
192
|
+
raise NotImplementedError, "polymorphic has_many associations are not YET supported"
|
193
|
+
end
|
194
|
+
|
183
195
|
def input_array_tag(**, &)
|
184
196
|
create_component(Components::InputArray, :array, **, &)
|
185
197
|
end
|
@@ -276,26 +288,6 @@ module Phlexi
|
|
276
288
|
theme_key = attributes.delete(:theme) || theme_key
|
277
289
|
mix({class: themed(theme_key, self)}, attributes)
|
278
290
|
end
|
279
|
-
|
280
|
-
def determine_initial_value(value)
|
281
|
-
return value unless value == NIL_VALUE
|
282
|
-
|
283
|
-
determine_value_from_association || super
|
284
|
-
end
|
285
|
-
|
286
|
-
def determine_value_from_association
|
287
|
-
return unless association_reflection.present?
|
288
|
-
|
289
|
-
value = object.public_send(key)
|
290
|
-
case association_reflection.macro
|
291
|
-
when :has_many, :has_and_belongs_to_many
|
292
|
-
value&.map { |v| v.public_send(association_reflection.klass.primary_key) }
|
293
|
-
when :belongs_to, :has_one
|
294
|
-
value&.public_send(association_reflection.klass.primary_key)
|
295
|
-
else
|
296
|
-
raise ArgumentError, "Unsupported association type: #{association_reflection.macro}"
|
297
|
-
end
|
298
|
-
end
|
299
291
|
end
|
300
292
|
end
|
301
293
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Phlexi
|
4
|
+
module Form
|
5
|
+
module Components
|
6
|
+
class AssociationBase < Select
|
7
|
+
protected
|
8
|
+
|
9
|
+
delegate :association_reflection, to: :field
|
10
|
+
|
11
|
+
def build_association_attributes
|
12
|
+
raise NotImplementedError, "#{self.class}#build_association_attributes"
|
13
|
+
end
|
14
|
+
|
15
|
+
def choices
|
16
|
+
raise NotImplementedError, "#{self.class}#choices"
|
17
|
+
end
|
18
|
+
|
19
|
+
def selected?(option)
|
20
|
+
case association_reflection.macro
|
21
|
+
when :belongs_to, :has_one
|
22
|
+
singular_field_value.to_s == option.to_s
|
23
|
+
when :has_many, :has_and_belongs_to_many
|
24
|
+
collection_field_value.any? { |item| item.to_s == option.to_s }
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def singular_field_value
|
29
|
+
@singular_field_value ||= field.value&.public_send(association_reflection.klass.primary_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
def collection_field_value
|
33
|
+
@collection_field_value ||= field.value&.map { |v| v.public_send(association_reflection.klass.primary_key) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_attributes
|
37
|
+
build_association_attributes
|
38
|
+
super
|
39
|
+
end
|
40
|
+
|
41
|
+
def choices_from_association(klass)
|
42
|
+
relation = klass.all
|
43
|
+
|
44
|
+
if association_reflection.respond_to?(:scope) && association_reflection.scope
|
45
|
+
relation = if association_reflection.scope.parameters.any?
|
46
|
+
association_reflection.klass.instance_exec(object, &association_reflection.scope)
|
47
|
+
else
|
48
|
+
association_reflection.klass.instance_exec(&association_reflection.scope)
|
49
|
+
end
|
50
|
+
else
|
51
|
+
order = association_reflection.options[:order]
|
52
|
+
conditions = association_reflection.options[:conditions]
|
53
|
+
conditions = object.instance_exec(&conditions) if conditions.respond_to?(:call)
|
54
|
+
|
55
|
+
relation = relation.where(conditions) if relation.respond_to?(:where) && conditions.present?
|
56
|
+
relation = relation.order(order) if relation.respond_to?(:order)
|
57
|
+
end
|
58
|
+
|
59
|
+
relation
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -3,17 +3,17 @@
|
|
3
3
|
module Phlexi
|
4
4
|
module Form
|
5
5
|
module Components
|
6
|
-
class BelongsTo <
|
6
|
+
class BelongsTo < AssociationBase
|
7
7
|
protected
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def choices
|
10
|
+
@choices ||= begin
|
11
|
+
collection = choices_from_association(association_reflection.klass)
|
12
|
+
build_choice_mapper(collection)
|
13
|
+
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
16
|
+
def build_association_attributes
|
17
17
|
attributes.fetch(:input_param) do
|
18
18
|
attributes[:input_param] = if association_reflection.respond_to?(:options) && association_reflection.options[:foreign_key]
|
19
19
|
association_reflection.options[:foreign_key]
|
@@ -24,17 +24,9 @@ module Phlexi
|
|
24
24
|
|
25
25
|
def selected?(option)
|
26
26
|
if attributes[:multiple]
|
27
|
-
|
27
|
+
Array(field.value).any? { |item| item.to_s == option.to_s }
|
28
28
|
else
|
29
|
-
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def field_value
|
34
|
-
if attributes[:multiple]
|
35
|
-
Array(field.value)
|
36
|
-
else
|
37
|
-
field.value
|
29
|
+
field.value.to_s == option.to_s
|
38
30
|
end
|
39
31
|
end
|
40
32
|
|
@@ -3,17 +3,17 @@
|
|
3
3
|
module Phlexi
|
4
4
|
module Form
|
5
5
|
module Components
|
6
|
-
class HasMany <
|
6
|
+
class HasMany < AssociationBase
|
7
7
|
protected
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
9
|
+
def choices
|
10
|
+
@choices ||= begin
|
11
|
+
collection = choices_from_association(association_reflection.klass)
|
12
|
+
build_choice_mapper(collection)
|
13
|
+
end
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
16
|
+
def build_association_attributes
|
17
17
|
attributes.fetch(:input_param) {
|
18
18
|
attributes[:input_param] = :"#{association_reflection.name.to_s.singularize}_ids"
|
19
19
|
}
|
@@ -17,6 +17,13 @@ module Phlexi
|
|
17
17
|
grouped_choices.each(&)
|
18
18
|
end
|
19
19
|
|
20
|
+
# @return [Array<String>] An array of all choice values.
|
21
|
+
def values
|
22
|
+
@values ||= grouped_choices.values.flat_map(&:values)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
20
27
|
def grouped_choices
|
21
28
|
@grouped_choices ||= materialize_grouped_choices(@collection)
|
22
29
|
end
|
@@ -34,8 +41,6 @@ module Phlexi
|
|
34
41
|
end
|
35
42
|
end
|
36
43
|
|
37
|
-
private
|
38
|
-
|
39
44
|
def array_to_grouped_hash(array)
|
40
45
|
sample = array.first
|
41
46
|
if group_method == :last && sample.is_a?(Array) && sample.size == 2
|
@@ -20,30 +20,7 @@ module Phlexi
|
|
20
20
|
return object.class.defined_enums.fetch(key.to_s).keys if object.class.defined_enums.key?(key.to_s)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def choices_from_association
|
27
|
-
return unless association_reflection
|
28
|
-
|
29
|
-
relation = association_reflection.klass.all
|
30
|
-
|
31
|
-
if association_reflection.respond_to?(:scope) && association_reflection.scope
|
32
|
-
relation = if association_reflection.scope.parameters.any?
|
33
|
-
association_reflection.klass.instance_exec(object, &association_reflection.scope)
|
34
|
-
else
|
35
|
-
association_reflection.klass.instance_exec(&association_reflection.scope)
|
36
|
-
end
|
37
|
-
else
|
38
|
-
order = association_reflection.options[:order]
|
39
|
-
conditions = association_reflection.options[:conditions]
|
40
|
-
conditions = object.instance_exec(&conditions) if conditions.respond_to?(:call)
|
41
|
-
|
42
|
-
relation = relation.where(conditions) if relation.respond_to?(:where) && conditions.present?
|
43
|
-
relation = relation.order(order) if relation.respond_to?(:order)
|
44
|
-
end
|
45
|
-
|
46
|
-
relation
|
23
|
+
choices_from_validator
|
47
24
|
end
|
48
25
|
|
49
26
|
def choices_from_validator
|
data/lib/phlexi/form/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: phlexi-form
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stefan Froelich
|
@@ -205,6 +205,7 @@ files:
|
|
205
205
|
- lib/phlexi/form.rb
|
206
206
|
- lib/phlexi/form/base.rb
|
207
207
|
- lib/phlexi/form/builder.rb
|
208
|
+
- lib/phlexi/form/components/association_base.rb
|
208
209
|
- lib/phlexi/form/components/base.rb
|
209
210
|
- lib/phlexi/form/components/belongs_to.rb
|
210
211
|
- lib/phlexi/form/components/checkbox.rb
|