active_fields 0.1.0 → 0.2.0
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/.rspec +0 -1
- data/.rubocop.yml +3 -15
- data/CHANGELOG.md +7 -0
- data/Rakefile +7 -0
- data/app/models/active_fields/application_record.rb +7 -0
- data/app/models/active_fields/field/base.rb +17 -0
- data/{lib/active_fields/models → app/models/active_fields}/field/boolean.rb +4 -6
- data/{lib/active_fields/models → app/models/active_fields}/field/date.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/date_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/decimal.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/decimal_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/enum.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/enum_array.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/integer.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/integer_array.rb +4 -6
- data/{lib/active_fields/models → app/models/active_fields}/field/text.rb +6 -8
- data/{lib/active_fields/models → app/models/active_fields}/field/text_array.rb +4 -6
- data/app/models/active_fields/value.rb +15 -0
- data/{lib/active_fields/models/concerns/customizable.rb → app/models/concerns/active_fields/customizable_concern.rb} +6 -4
- data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/field_concern.rb +14 -3
- data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/value_concern.rb +7 -2
- data/config/routes.rb +4 -0
- data/{lib/generators/active_fields/install/templates/create_active_fields_tables.rb.tt → db/migrate/20240229230000_create_active_fields_tables.rb} +6 -4
- data/lib/active_fields/casters/boolean_caster.rb +0 -2
- data/lib/active_fields/casters/date_array_caster.rb +0 -2
- data/lib/active_fields/casters/date_caster.rb +0 -2
- data/lib/active_fields/casters/decimal_array_caster.rb +0 -2
- data/lib/active_fields/casters/decimal_caster.rb +0 -2
- data/lib/active_fields/casters/enum_array_caster.rb +0 -2
- data/lib/active_fields/casters/enum_caster.rb +0 -2
- data/lib/active_fields/casters/integer_array_caster.rb +0 -2
- data/lib/active_fields/casters/integer_caster.rb +1 -3
- data/lib/active_fields/casters/text_array_caster.rb +0 -2
- data/lib/active_fields/casters/text_caster.rb +0 -2
- data/lib/active_fields/config.rb +50 -0
- data/lib/active_fields/customizable_config.rb +24 -0
- data/lib/active_fields/engine.rb +13 -0
- data/lib/active_fields/has_active_fields.rb +19 -0
- data/lib/active_fields/validators/boolean_validator.rb +0 -2
- data/lib/active_fields/validators/date_array_validator.rb +0 -2
- data/lib/active_fields/validators/date_validator.rb +0 -2
- data/lib/active_fields/validators/decimal_array_validator.rb +0 -2
- data/lib/active_fields/validators/decimal_validator.rb +0 -2
- data/lib/active_fields/validators/enum_array_validator.rb +0 -2
- data/lib/active_fields/validators/enum_validator.rb +0 -2
- data/lib/active_fields/validators/integer_array_validator.rb +0 -2
- data/lib/active_fields/validators/integer_validator.rb +0 -2
- data/lib/active_fields/validators/text_array_validator.rb +0 -2
- data/lib/active_fields/validators/text_validator.rb +0 -2
- data/lib/active_fields/version.rb +1 -1
- data/lib/active_fields.rb +43 -7
- data/lib/tasks/active_fields_tasks.rake +6 -0
- metadata +52 -34
- data/lib/active_fields/models/concerns/concern.rb +0 -16
- data/lib/active_fields/models/field.rb +0 -27
- data/lib/active_fields/models/value.rb +0 -30
- data/lib/generators/active_fields/install/USAGE +0 -5
- data/lib/generators/active_fields/install/install_generator.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: aee118ed966e5912d28dcf8cb2d1db0cdd68d85f7d4fc3bcdf267cc5629c7ff3
|
4
|
+
data.tar.gz: 99009dea7a5f940034263a85f5f20f76b84911772677dfc69fe97380bd308563
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ca324370030b6028c6a579e4782f37d010e6e01dff7d75054220302e6a36e9aaf35acb30488513f723eadef183ba8fda590890db7bd5f654517ceb03ddfd2a82
|
7
|
+
data.tar.gz: df6501f049664003e9d02571c6f6652b8eaacf92718038e98eea1daae7ee08ddba92a028f737fac5d08042a410f06445ef996bcf418844099d4003d568a53ed5
|
data/.rspec
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
require:
|
2
|
+
# - rubocop-factory_bot
|
2
3
|
- rubocop-performance
|
3
4
|
- rubocop-rails
|
4
5
|
- rubocop-rake
|
5
6
|
- rubocop-rspec
|
6
|
-
- rubocop-
|
7
|
+
# - rubocop-rspec_rails
|
7
8
|
|
8
9
|
inherit_gem:
|
9
10
|
rubocop-shopify: rubocop.yml
|
@@ -13,7 +14,7 @@ AllCops:
|
|
13
14
|
TargetRailsVersion: 7.1
|
14
15
|
NewCops: enable
|
15
16
|
Exclude:
|
16
|
-
- "
|
17
|
+
- "spec/dummy/db/schema.rb"
|
17
18
|
|
18
19
|
Layout/EmptyLinesAroundAccessModifier:
|
19
20
|
EnforcedStyle: around
|
@@ -45,16 +46,3 @@ RSpec/ContextWording:
|
|
45
46
|
|
46
47
|
RSpec/MultipleExpectations:
|
47
48
|
Enabled: false
|
48
|
-
|
49
|
-
Rails/ApplicationRecord:
|
50
|
-
Enabled: false
|
51
|
-
|
52
|
-
Rails/Date:
|
53
|
-
Enabled: false
|
54
|
-
|
55
|
-
RSpec/FilePath:
|
56
|
-
Enabled: false
|
57
|
-
|
58
|
-
RSpec/SpecFilePathFormat:
|
59
|
-
Enabled: false
|
60
|
-
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.0] - 2024-06-13
|
4
|
+
|
5
|
+
- Rewrited as a Rails plugin!
|
6
|
+
- Custom field types support
|
7
|
+
- Global configuration options for changing field and value classes
|
8
|
+
- Per-model configuration option for enabling specific field types only
|
9
|
+
|
3
10
|
## [0.1.0] - 2024-05-19
|
4
11
|
|
5
12
|
- Initial release
|
data/Rakefile
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFields
|
4
|
+
module Field
|
5
|
+
# If the field base class has been changed, we should prevent this model from being loaded.
|
6
|
+
# Since we cannot remove it entirely, we will not add any functionality to it.
|
7
|
+
if ActiveFields.config.field_base_class_changed?
|
8
|
+
class Base; end
|
9
|
+
else
|
10
|
+
class Base < ApplicationRecord
|
11
|
+
self.table_name = "active_fields"
|
12
|
+
|
13
|
+
include FieldConcern
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Boolean < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Boolean < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :nullable
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -15,7 +13,7 @@ module ActiveFields
|
|
15
13
|
|
16
14
|
%i[required nullable].each do |column|
|
17
15
|
define_method(column) do
|
18
|
-
|
16
|
+
Casters::BooleanCaster.new.deserialize(super())
|
19
17
|
end
|
20
18
|
|
21
19
|
define_method(:"#{column}?") do
|
@@ -23,7 +21,7 @@ module ActiveFields
|
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Date < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Date < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::DateCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::DateCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class DateArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class DateArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,21 +16,21 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
%i[min max].each do |column|
|
30
28
|
define_method(column) do
|
31
|
-
|
29
|
+
Casters::DateCaster.new.deserialize(super())
|
32
30
|
end
|
33
31
|
|
34
32
|
define_method(:"#{column}=") do |other|
|
35
|
-
super(
|
33
|
+
super(Casters::DateCaster.new.serialize(other))
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Decimal < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Decimal < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::DecimalCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::DecimalCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class DecimalArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class DecimalArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,21 +16,21 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
29
27
|
%i[min max].each do |column|
|
30
28
|
define_method(column) do
|
31
|
-
|
29
|
+
Casters::DecimalCaster.new.deserialize(super())
|
32
30
|
end
|
33
31
|
|
34
32
|
define_method(:"#{column}=") do |other|
|
35
|
-
super(
|
33
|
+
super(Casters::DecimalCaster.new.serialize(other))
|
36
34
|
end
|
37
35
|
end
|
38
36
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Enum < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Enum < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :allowed_values
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -15,7 +13,7 @@ module ActiveFields
|
|
15
13
|
|
16
14
|
%i[required].each do |column|
|
17
15
|
define_method(column) do
|
18
|
-
|
16
|
+
Casters::BooleanCaster.new.deserialize(super())
|
19
17
|
end
|
20
18
|
|
21
19
|
define_method(:"#{column}?") do
|
@@ -23,17 +21,17 @@ module ActiveFields
|
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
30
28
|
%i[allowed_values].each do |column|
|
31
29
|
define_method(column) do
|
32
|
-
|
30
|
+
Casters::TextArrayCaster.new.deserialize(super())
|
33
31
|
end
|
34
32
|
|
35
33
|
define_method(:"#{column}=") do |other|
|
36
|
-
super(
|
34
|
+
super(Casters::TextArrayCaster.new.serialize(other))
|
37
35
|
end
|
38
36
|
end
|
39
37
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class EnumArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class EnumArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :allowed_values
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -17,21 +15,21 @@ module ActiveFields
|
|
17
15
|
|
18
16
|
%i[min_size max_size].each do |column|
|
19
17
|
define_method(column) do
|
20
|
-
|
18
|
+
Casters::IntegerCaster.new.deserialize(super())
|
21
19
|
end
|
22
20
|
|
23
21
|
define_method(:"#{column}=") do |other|
|
24
|
-
super(
|
22
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
25
23
|
end
|
26
24
|
end
|
27
25
|
|
28
26
|
%i[allowed_values].each do |column|
|
29
27
|
define_method(column) do
|
30
|
-
|
28
|
+
Casters::TextArrayCaster.new.deserialize(super())
|
31
29
|
end
|
32
30
|
|
33
31
|
define_method(:"#{column}=") do |other|
|
34
|
-
super(
|
32
|
+
super(Casters::TextArrayCaster.new.serialize(other))
|
35
33
|
end
|
36
34
|
end
|
37
35
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Integer < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Integer < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min, :max
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -16,7 +14,7 @@ module ActiveFields
|
|
16
14
|
|
17
15
|
%i[required].each do |column|
|
18
16
|
define_method(column) do
|
19
|
-
|
17
|
+
Casters::BooleanCaster.new.deserialize(super())
|
20
18
|
end
|
21
19
|
|
22
20
|
define_method(:"#{column}?") do
|
@@ -24,17 +22,17 @@ module ActiveFields
|
|
24
22
|
end
|
25
23
|
|
26
24
|
define_method(:"#{column}=") do |other|
|
27
|
-
super(
|
25
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
28
26
|
end
|
29
27
|
end
|
30
28
|
|
31
29
|
%i[min max].each do |column|
|
32
30
|
define_method(column) do
|
33
|
-
|
31
|
+
Casters::IntegerCaster.new.deserialize(super())
|
34
32
|
end
|
35
33
|
|
36
34
|
define_method(:"#{column}=") do |other|
|
37
|
-
super(
|
35
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
38
36
|
end
|
39
37
|
end
|
40
38
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class IntegerArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class IntegerArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min, :max
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -18,11 +16,11 @@ module ActiveFields
|
|
18
16
|
|
19
17
|
%i[min_size max_size min max].each do |column|
|
20
18
|
define_method(column) do
|
21
|
-
|
19
|
+
Casters::IntegerCaster.new.deserialize(super())
|
22
20
|
end
|
23
21
|
|
24
22
|
define_method(:"#{column}=") do |other|
|
25
|
-
super(
|
23
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
26
24
|
end
|
27
25
|
end
|
28
26
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class Text < ActiveFields
|
4
|
+
module Field
|
5
|
+
class Text < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :required, :min_length, :max_length
|
9
7
|
|
10
8
|
# attribute :required, :boolean, default: false
|
@@ -17,7 +15,7 @@ module ActiveFields
|
|
17
15
|
|
18
16
|
%i[required].each do |column|
|
19
17
|
define_method(column) do
|
20
|
-
|
18
|
+
Casters::BooleanCaster.new.deserialize(super())
|
21
19
|
end
|
22
20
|
|
23
21
|
define_method(:"#{column}?") do
|
@@ -25,17 +23,17 @@ module ActiveFields
|
|
25
23
|
end
|
26
24
|
|
27
25
|
define_method(:"#{column}=") do |other|
|
28
|
-
super(
|
26
|
+
super(Casters::BooleanCaster.new.serialize(other))
|
29
27
|
end
|
30
28
|
end
|
31
29
|
|
32
30
|
%i[min_length max_length].each do |column|
|
33
31
|
define_method(column) do
|
34
|
-
|
32
|
+
Casters::IntegerCaster.new.deserialize(super())
|
35
33
|
end
|
36
34
|
|
37
35
|
define_method(:"#{column}=") do |other|
|
38
|
-
super(
|
36
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
39
37
|
end
|
40
38
|
end
|
41
39
|
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "../field"
|
4
|
-
|
5
3
|
module ActiveFields
|
6
|
-
|
7
|
-
class TextArray < ActiveFields
|
4
|
+
module Field
|
5
|
+
class TextArray < ActiveFields.config.field_base_class
|
8
6
|
store_accessor :options, :min_size, :max_size, :min_length, :max_length
|
9
7
|
|
10
8
|
# attribute :min_size, :integer
|
@@ -19,11 +17,11 @@ module ActiveFields
|
|
19
17
|
|
20
18
|
%i[min_size max_size min_length max_length].each do |column|
|
21
19
|
define_method(column) do
|
22
|
-
|
20
|
+
Casters::IntegerCaster.new.deserialize(super())
|
23
21
|
end
|
24
22
|
|
25
23
|
define_method(:"#{column}=") do |other|
|
26
|
-
super(
|
24
|
+
super(Casters::IntegerCaster.new.serialize(other))
|
27
25
|
end
|
28
26
|
end
|
29
27
|
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActiveFields
|
4
|
+
# If value base class has been changed, we should prevent this model from being loaded.
|
5
|
+
# Since we cannot remove it entirely, we will not add any functionality to it.
|
6
|
+
if ActiveFields.config.value_class_changed?
|
7
|
+
class Value; end
|
8
|
+
else
|
9
|
+
class Value < ApplicationRecord
|
10
|
+
self.table_name = "active_fields_values"
|
11
|
+
|
12
|
+
include ValueConcern
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -1,20 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in that adds the active fields functionality to the ActiveRecord model
|
4
3
|
module ActiveFields
|
5
|
-
|
4
|
+
# Mix-in that adds the active fields functionality to the ActiveRecord model
|
5
|
+
module CustomizableConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
9
|
# active_values association for the owner record.
|
10
10
|
# We skip built-in autosave because it doesn't work if the owner record isn't changed.
|
11
11
|
# Instead, we implement our own autosave callback: `save_changed_active_values`.
|
12
|
+
# rubocop:disable Rails/ReflectionClassName
|
12
13
|
has_many :active_values,
|
13
|
-
class_name:
|
14
|
+
class_name: ActiveFields.config.value_class_name,
|
14
15
|
as: :customizable,
|
15
16
|
inverse_of: :customizable,
|
16
17
|
autosave: false,
|
17
18
|
dependent: :destroy
|
19
|
+
# rubocop:enable Rails/ReflectionClassName
|
18
20
|
|
19
21
|
# Firstly, we build active_values that hasn't been already created.
|
20
22
|
# Than, we set values for active_values whose values should be changed
|
@@ -35,7 +37,7 @@ module ActiveFields
|
|
35
37
|
end
|
36
38
|
|
37
39
|
def active_fields
|
38
|
-
ActiveFields
|
40
|
+
ActiveFields.config.field_base_class.for(model_name.name)
|
39
41
|
end
|
40
42
|
|
41
43
|
# Convert hash keys to strings for easier access by fields names.
|
data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/field_concern.rb
RENAMED
@@ -1,16 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in with a base logic for the active fields model
|
4
3
|
module ActiveFields
|
4
|
+
# Mix-in with a base logic for the active fields model
|
5
5
|
module FieldConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
|
+
# rubocop:disable Rails/ReflectionClassName
|
9
10
|
has_many :active_values,
|
10
|
-
class_name:
|
11
|
+
class_name: ActiveFields.config.value_class_name,
|
11
12
|
foreign_key: :active_field_id,
|
12
13
|
inverse_of: :active_field,
|
13
14
|
dependent: :destroy
|
15
|
+
# rubocop:enable Rails/ReflectionClassName
|
14
16
|
|
15
17
|
scope :for, ->(customizable_type) { where(customizable_type: customizable_type) }
|
16
18
|
|
@@ -18,6 +20,7 @@ module ActiveFields
|
|
18
20
|
validates :name, presence: true, uniqueness: { scope: :customizable_type }
|
19
21
|
validates :name, format: { with: /\A[a-z0-9_]+\z/ }, allow_blank: true
|
20
22
|
validate :validate_default_value
|
23
|
+
validate :validate_customizable_model_allows_type
|
21
24
|
|
22
25
|
after_create :add_field_to_records
|
23
26
|
after_initialize :set_defaults
|
@@ -68,9 +71,17 @@ module ActiveFields
|
|
68
71
|
end
|
69
72
|
end
|
70
73
|
|
74
|
+
def validate_customizable_model_allows_type
|
75
|
+
allowed_types = customizable_model.active_fields_config&.types || []
|
76
|
+
return true if ActiveFields.config.fields.values_at(*allowed_types).include?(type)
|
77
|
+
|
78
|
+
errors.add(:customizable_type, :inclusion)
|
79
|
+
false
|
80
|
+
end
|
81
|
+
|
71
82
|
def add_field_to_records
|
72
83
|
customizable_model.find_each do |record|
|
73
|
-
ActiveFields
|
84
|
+
ActiveFields.config.value_class.create!(active_field: self, customizable: record, value: default_value)
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
data/{lib/active_fields/models/concerns → app/models/concerns/active_fields}/value_concern.rb
RENAMED
@@ -1,13 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Mix-in with a base logic for the active fields value model
|
4
3
|
module ActiveFields
|
4
|
+
# Mix-in with a base logic for the active fields value model
|
5
5
|
module ValueConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
8
|
included do
|
9
9
|
belongs_to :customizable, polymorphic: true, optional: false, inverse_of: :active_values
|
10
|
-
|
10
|
+
# rubocop:disable Rails/ReflectionClassName
|
11
|
+
belongs_to :active_field,
|
12
|
+
class_name: ActiveFields.config.field_base_class_name,
|
13
|
+
optional: false,
|
14
|
+
inverse_of: :active_values
|
15
|
+
# rubocop:enable Rails/ReflectionClassName
|
11
16
|
|
12
17
|
validates :active_field_id, uniqueness: { scope: %i[customizable_id customizable_type] }
|
13
18
|
validate :validate_value
|
data/config/routes.rb
ADDED