formwandler 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8a45d189660c8aace9e7271c8d9dc110962a75954c538b8e0ffc29c882f0cde4
4
- data.tar.gz: 85d1558cfd2507a7bbf57cb4c21f5c41f205df3230a49e408d4333e2c9fa40ed
3
+ metadata.gz: c58985c9314b2ee1dbeb4372f7c0554eb16322c27767daaf227ae6be46b8b61e
4
+ data.tar.gz: cc39146f7953edc67dc131ec87e48d54b6631882f2457b565744ebabb602ab92
5
5
  SHA512:
6
- metadata.gz: 136d046b2a96878ecdc22c39a8e1c4ff400a8e211d063397ad8e1d38aed2ddcf30e342e50c21292f6fbfbbefc809569be90fcd13c897d0c9bb5b05b1bdf280bc
7
- data.tar.gz: f9fdf3e938ec7476755097233005a173c8b6ef68f4d8ec2ff24cd33edc1b300885f9a36392a09ba86de0516d38c7caa102bf2381cbd96b98886ad145906ca2f8
6
+ metadata.gz: 55eeb2ca00dcf309f9eaa60a57326fb5feb3f684a5ddf2fcaf889e551b03048f60863570a97f4fa6b886b13bc9a27b01839d1ef751506158a010569d6f7b4cf4
7
+ data.tar.gz: 593380319ef6ac9e31a74ac204aa0ac9f88b402ff077a23caa0b67c3a4ae0d526814f6c18b15057953858c5db0fc4bcecd3434c4f0bec201359a6b09b67ac723
@@ -14,7 +14,7 @@ module Formwandler
14
14
  def value=(new_value)
15
15
  new_value = transform_value(new_value, field_definition.in_transformation)
16
16
  if model_instance
17
- model_instance.public_send("#{field_definition.source}=", new_value)
17
+ model_instance.public_send("#{source}=", new_value)
18
18
  else
19
19
  @value = new_value
20
20
  end
@@ -25,7 +25,7 @@ module Formwandler
25
25
  end
26
26
 
27
27
  def raw_value
28
- model_instance ? model_instance.public_send(field_definition.source) : @value
28
+ model_instance ? model_instance.public_send(source) : @value
29
29
  end
30
30
 
31
31
  def hidden?
@@ -40,6 +40,10 @@ module Formwandler
40
40
  _evaluate_field_definition_value(:disabled)
41
41
  end
42
42
 
43
+ def readonly?
44
+ _evaluate_field_definition_value(:readonly)
45
+ end
46
+
43
47
  def options
44
48
  all_options - hidden_options
45
49
  end
@@ -5,13 +5,41 @@ require_relative 'field_value_transformer'
5
5
  module Formwandler
6
6
  class FieldDefinition
7
7
  attr_reader :name
8
- attr_accessor :hidden, :disabled, :default, :delocalize, :model, :source, :options, :array
8
+ attr_accessor :hidden, :disabled, :readonly, :default, :delocalize, :model, :model_class, :source, :options, :array
9
9
 
10
10
  def initialize(name)
11
11
  @name = name
12
12
  set_defaults
13
13
  end
14
14
 
15
+ def model=(model)
16
+ set_model model, model
17
+ end
18
+
19
+ def model_class=(symbol_or_class)
20
+ @model_class =
21
+ if symbol_or_class.nil?
22
+ nil
23
+ elsif symbol_or_class.is_a?(Symbol)
24
+ symbol_or_class.to_s.classify.constantize rescue nil
25
+ elsif symbol_or_class < ActiveRecord::Base || symbol_or_class < ActiveModel::Model
26
+ symbol_or_class
27
+ else
28
+ fail 'The model class must be nil, a symbol or a descendant of ActiveModel::Model or ActiveRecord::Base.'
29
+ end
30
+ end
31
+
32
+ def configure(opts)
33
+ model = opts[:model]
34
+ model_class = opts[:model_class] || model
35
+ set_model model, model_class
36
+ opts.except(:model, :model_class).each do |key, value|
37
+ send("#{key}=", value)
38
+ rescue NoMethodError
39
+ raise ArgumentError, "Invalid option #{key}"
40
+ end
41
+ end
42
+
15
43
  def hide_option(name, value = true)
16
44
  hidden_options[name.to_s] = value
17
45
  end
@@ -39,12 +67,19 @@ module Formwandler
39
67
  def set_defaults
40
68
  @hidden = false
41
69
  @disabled = false
70
+ @readonly = false
42
71
  @default = nil
43
72
  @delocalize = nil
44
73
  @model = nil
74
+ @model_class = nil
45
75
  @source = name
46
76
  @options = nil
47
77
  @array = false
48
78
  end
79
+
80
+ def set_model(model, model_class)
81
+ @model = model
82
+ self.model_class = model_class
83
+ end
49
84
  end
50
85
  end
@@ -14,17 +14,23 @@ module Formwandler
14
14
  ActiveModel::Name.new(self, nil, name.chomp('Form').underscore)
15
15
  end
16
16
 
17
+ def human_attribute_name(attr, options = {})
18
+ field_definition = @field_definitions.fetch(attr) { nil }
19
+ if options[:default].nil? && field_definition && field_definition.model_class
20
+ not_found = '__formwandler_not_found__'
21
+ model_translation = field_definition.model_class.human_attribute_name(field_definition.source, default: not_found)
22
+ options[:default] = model_translation unless model_translation == not_found
23
+ end
24
+ super(attr, options)
25
+ end
26
+
17
27
  def field_definitions
18
28
  @field_definitions ||= {}
19
29
  end
20
30
 
21
31
  def field(name, opts = {}, &block)
22
32
  field_definition = field_definitions[name] ||= FieldDefinition.new(name)
23
- opts.each do |key, value|
24
- field_definition.public_send("#{key}=", value)
25
- rescue NoMethodError
26
- raise ArgumentError, "Invalid option #{key}"
27
- end
33
+ field_definition.configure(opts)
28
34
  field_definition.instance_exec(&block) if block_given?
29
35
 
30
36
  attribute_accessor(name)
@@ -83,22 +89,14 @@ module Formwandler
83
89
  fields.select { |field| field.model == model }
84
90
  end
85
91
 
86
- def models_valid?
87
- all_valid = true
88
- models.each do |name, model|
89
- all_valid = false if model.invalid?
90
- next if model.valid?
91
- fields_for_model(name).each do |field|
92
- model.errors[field.source].each do |error_message|
93
- errors.add(field.name, error_message)
94
- end
95
- end
96
- end
97
- all_valid
92
+ def valid?
93
+ form_valid = super
94
+ models_valid = models_valid?
95
+ form_valid && models_valid
98
96
  end
99
97
 
100
98
  def submit
101
- if valid? && models_valid?
99
+ if valid?
102
100
  ActiveRecord::Base.transaction do
103
101
  save_models!
104
102
  end
@@ -125,6 +123,21 @@ module Formwandler
125
123
  assign_attributes permitted_params
126
124
  end
127
125
 
126
+ def models_valid?
127
+ all_valid = true
128
+ models.each do |name, model|
129
+ next if model.valid?
130
+
131
+ all_valid = false
132
+ fields_for_model(name).each do |field|
133
+ model.errors[field.source].each do |error_message|
134
+ errors.add(field.name, error_message) unless errors.messages[field.source].include? error_message
135
+ end
136
+ end
137
+ end
138
+ all_valid
139
+ end
140
+
128
141
  def save_models!
129
142
  models.sort_by do |(name, _model)|
130
143
  self.class.model_save_order&.index(name) || self.class.model_save_order&.size
@@ -140,11 +153,11 @@ module Formwandler
140
153
  end
141
154
 
142
155
  def permitted_params
143
- controller.params.require(model_name.param_key).permit(*visible_fields).delocalize(delocalizations)
156
+ controller.params.require(model_name.param_key).permit(*permitted_fields).delocalize(delocalizations)
144
157
  end
145
158
 
146
- def visible_fields
147
- fields.reject(&:hidden?).map do |field|
159
+ def permitted_fields
160
+ fields.reject(&:disabled?).map do |field|
148
161
  field.array? ? {field.name => []} : field.name
149
162
  end
150
163
  end
@@ -6,22 +6,18 @@ module Formwandler
6
6
 
7
7
  class_methods do
8
8
  def load_form(opts = {})
9
- before_action :_formwandler_load_form, opts
10
- end
11
-
12
- def skip_load_form(opts = {})
13
- skip_before_action :_formwandler_load_form, opts
9
+ before_action(opts.except(:models)) do
10
+ if opts.fetch(:models, true)
11
+ models = {inferred_resource_name.to_sym => instance_variable_get("@#{inferred_resource_name}")}.compact
12
+ end
13
+ form_instance = form_class.new(models: models || {}, controller: self)
14
+ instance_variable_set("@#{form_instance_name}", form_instance)
15
+ end
14
16
  end
15
17
  end
16
18
 
17
19
  private
18
20
 
19
- def _formwandler_load_form
20
- models = {inferred_resource_name.to_sym => instance_variable_get("@#{inferred_resource_name}")}.compact
21
- form_instance = form_class.new(models: models, controller: self)
22
- instance_variable_set("@#{form_instance_name}", form_instance)
23
- end
24
-
25
21
  def form_class_name
26
22
  "#{namespace}::#{inferred_resource_name.camelize}Form"
27
23
  end
@@ -1,3 +1,3 @@
1
1
  module Formwandler
2
- VERSION = '0.6.0'
2
+ VERSION = '0.8.2'
3
3
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: formwandler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.8.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stefan Bilharz
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-09 00:00:00.000000000 Z
11
+ date: 2020-09-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5'
19
+ version: 5.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '5'
26
+ version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: delocalize
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +86,14 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.3'
89
+ version: '1.4'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.3'
96
+ version: '1.4'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: byebug
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -127,7 +127,7 @@ homepage: https://github.com/sbilharz/formwandler
127
127
  licenses:
128
128
  - MIT
129
129
  metadata: {}
130
- post_install_message:
130
+ post_install_message:
131
131
  rdoc_options: []
132
132
  require_paths:
133
133
  - lib
@@ -142,9 +142,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
142
142
  - !ruby/object:Gem::Version
143
143
  version: '0'
144
144
  requirements: []
145
- rubyforge_project:
146
- rubygems_version: 2.7.6
147
- signing_key:
145
+ rubygems_version: 3.1.2
146
+ signing_key:
148
147
  specification_version: 4
149
148
  summary: Form objects for rails
150
149
  test_files: []