chobble-forms 0.7.1 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 771171d582d4bdb09d03fc7ac56a37ca4922d7ce9ee76f392c19c0667e2cd6d3
4
- data.tar.gz: e692e2d66579f14eae1099989efddef5a7358620653ac6ab7daaf3ffab151333
3
+ metadata.gz: 5278667464b4fb04d365ef198a36874fec3f5590680f705a18b0d5133776e201
4
+ data.tar.gz: 565d3f9a541a8e5aa5ce91fe0a2394afe2284c449103664785b5bca2a80123ef
5
5
  SHA512:
6
- metadata.gz: c7b53bd70bfa1063f24071b476a9789b43d79c0c539e033857b1331caf0456bb324fea113a93471bc0fef9b114c9b9004f52b10c0c3a82ef52c6a85e54b91e34
7
- data.tar.gz: f4b9fd0dedb8a2e0d133cf09f0dc0ab5e9e4b390cfeafe510b16424e9ec1037492fdec506db580447c61d6857597bb164d60c2b211fc019f1df58d1472f27202
6
+ metadata.gz: bc9e9c26ef8f0072faa78015d29783b1dd899269d82cc4a2f33f63311ba0714e7a4a20540a0c7e0d6723858070d722a06e19c939565c406eb6f3b81be27bef16
7
+ data.tar.gz: 3c869b047f9ae812878c8a7b1be78533a25bef9280fbd9b9860d2dfbc5aca51f01e85d33af9d54b8db750f64754765d6c95cd219f61196ff739246948487be93
@@ -7,11 +7,11 @@ module ChobbleForms
7
7
  module Helpers
8
8
  extend T::Sig
9
9
 
10
- SelectOption = T.type_alias {
10
+ SelectOption = T.type_alias do
11
11
  [String, T.any(String, Integer)]
12
- }
12
+ end
13
13
 
14
- LocalAssignValue = T.type_alias {
14
+ LocalAssignValue = T.type_alias do
15
15
  T.any(
16
16
  String,
17
17
  Symbol,
@@ -21,19 +21,32 @@ module ChobbleForms
21
21
  T::Array[SelectOption],
22
22
  T::Hash[Symbol, T.untyped]
23
23
  )
24
- }
24
+ end
25
25
 
26
- FieldSetupResult = T.type_alias {
26
+ FieldValue = T.type_alias do
27
+ T.nilable(T.any(
28
+ String,
29
+ Integer,
30
+ Float,
31
+ Date,
32
+ DateTime,
33
+ Time,
34
+ T::Boolean,
35
+ T.untyped
36
+ ))
37
+ end
38
+
39
+ FieldSetupResult = T.type_alias do
27
40
  {
28
41
  form_object: T.untyped,
29
42
  i18n_base: String,
30
- value: T.untyped,
43
+ value: FieldValue,
31
44
  prefilled: T::Boolean,
32
45
  field_label: String,
33
46
  field_hint: T.nilable(String),
34
47
  field_placeholder: T.nilable(String)
35
48
  }
36
- }
49
+ end
37
50
 
38
51
  sig { params(field: Symbol, local_assigns: T::Hash[Symbol, LocalAssignValue]).returns(FieldSetupResult) }
39
52
  def form_field_setup(field, local_assigns)
@@ -47,7 +60,7 @@ module ChobbleForms
47
60
  build_field_setup_result(field_translations, value, prefilled)
48
61
  end
49
62
 
50
- sig { params(form_object: T.untyped, field: Symbol).returns([T.untyped, T::Boolean]) }
63
+ sig { params(form_object: T.untyped, field: Symbol).returns([FieldValue, T::Boolean]) }
51
64
  def get_field_value_and_prefilled_status(form_object, field)
52
65
  return [nil, false] unless form_object&.object
53
66
 
@@ -91,7 +104,10 @@ module ChobbleForms
91
104
  }
92
105
  end
93
106
 
94
- sig { params(prefilled: T::Boolean, checked_value: T.untyped, expected_value: T.untyped).returns(T::Hash[Symbol, T::Boolean]) }
107
+ sig do
108
+ params(prefilled: T::Boolean, checked_value: T.untyped,
109
+ expected_value: T.untyped).returns(T::Hash[Symbol, T::Boolean])
110
+ end
95
111
  def radio_button_options(prefilled, checked_value, expected_value)
96
112
  (prefilled && checked_value == expected_value) ? {checked: true} : {}
97
113
  end
@@ -136,7 +152,11 @@ module ChobbleForms
136
152
  i18n_base = T.unsafe(instance_variable_get(:@_current_i18n_base))
137
153
 
138
154
  # Only strip _pass suffix for pass/fail fields, not _comment fields
139
- lookup_field = field.to_s.end_with?("_pass") ? FieldUtils.strip_field_suffix(field) : field
155
+ lookup_field = if field.to_s.end_with?("_pass")
156
+ FieldUtils.strip_field_suffix(field)
157
+ else
158
+ field
159
+ end
140
160
  fields_key = "#{i18n_base}.fields.#{lookup_field}"
141
161
  field_label = t(fields_key, raise: true)
142
162
 
@@ -152,7 +172,10 @@ module ChobbleForms
152
172
  }
153
173
  end
154
174
 
155
- sig { params(field_translations: T::Hash[Symbol, T.nilable(String)], value: T.untyped, prefilled: T::Boolean).returns(FieldSetupResult) }
175
+ sig do
176
+ params(field_translations: T::Hash[Symbol, T.nilable(String)], value: T.untyped,
177
+ prefilled: T::Boolean).returns(FieldSetupResult)
178
+ end
156
179
  def build_field_setup_result(field_translations, value, prefilled)
157
180
  form_obj = T.unsafe(instance_variable_get(:@_current_form))
158
181
  i18n_base = T.unsafe(instance_variable_get(:@_current_i18n_base))
@@ -168,21 +191,28 @@ module ChobbleForms
168
191
  )
169
192
  end
170
193
 
171
- sig { params(model: T.untyped, field: Symbol).returns({value: T.untyped, prefilled: T::Boolean}) }
172
- def resolve_field_value(model, field)
173
- field_str = field.to_s
194
+ sig { params(model: T.untyped, field: Symbol, raise_if_missing: T::Boolean).returns(T.untyped) }
195
+ def get_field_value_from_model(model, field, raise_if_missing: false)
196
+ return nil unless model
197
+
198
+ # Check for base field first (for fields like step_ramp_size that have a base value)
199
+ # Only check for _pass suffix if base field doesn't exist (for pass_fail_comment partials)
200
+ if model.respond_to?(field)
201
+ model.send(field)
202
+ elsif model.respond_to?("#{field}_pass")
203
+ model.send("#{field}_pass")
204
+ elsif raise_if_missing
205
+ available = model.attributes.keys.sort.join(", ")
206
+ raise "Field '#{field}' or '#{field}_pass' not found on " \
207
+ "#{model.class.name}. Available fields: #{available}"
208
+ end
209
+ end
174
210
 
175
- return {value: nil, prefilled: false} if field_str.include?("password")
211
+ sig { params(model: T.untyped, field: Symbol).returns({value: FieldValue, prefilled: T::Boolean}) }
212
+ def resolve_field_value(model, field)
213
+ return {value: nil, prefilled: false} if field.to_s.include?("password")
176
214
 
177
- # For composite partials, we receive the base field but need to check for suffixed fields
178
- # Check for _pass field first (in case both base and _pass exist)
179
- if model.respond_to?("#{field}_pass")
180
- current_value = model.send("#{field}_pass")
181
- elsif model.respond_to?(field)
182
- current_value = model.send(field)
183
- else
184
- raise "Field '#{field}' or '#{field}_pass' not found on #{model.class.name}. Available fields: #{model.attributes.keys.sort.join(", ")}"
185
- end
215
+ current_value = get_field_value_from_model(model, field, raise_if_missing: true)
186
216
 
187
217
  # Check if this field should not be prefilled based on excluded fields list
188
218
  excluded_fields = T.unsafe(instance_variable_get(:@_excluded_prefill_fields))
@@ -198,11 +228,7 @@ module ChobbleForms
198
228
  }
199
229
  end
200
230
 
201
- if field_str.end_with?("_id") && field_str != "id"
202
- resolve_association_value(model, field_str)
203
- else
204
- {value: current_value, prefilled: false}
205
- end
231
+ {value: current_value, prefilled: false}
206
232
  end
207
233
 
208
234
  sig { params(previous_inspection: T.untyped, current_model: T.untyped, field: Symbol).returns(T.untyped) }
@@ -212,7 +238,7 @@ module ChobbleForms
212
238
  elsif current_model.class.name.include?("Assessment")
213
239
  assessment_type = current_model.class.name.demodulize.underscore
214
240
  previous_model = previous_inspection.send(assessment_type)
215
- previous_model&.send(field)
241
+ get_field_value_from_model(previous_model, field, raise_if_missing: false)
216
242
  else
217
243
  previous_inspection.send(field)
218
244
  end
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module ChobbleForms
5
- VERSION = "0.7.1"
5
+ VERSION = "0.8.0"
6
6
  end
@@ -5,7 +5,16 @@
5
5
  # Get value from model object automatically
6
6
  model_object = setup[:form_object].object
7
7
  value = model_object.send(field) if model_object.respond_to?(field)
8
+
9
+ # Format dates and times nicely
10
+ formatted_value = if value.is_a?(DateTime) || value.is_a?(Time)
11
+ value.strftime("%B %-d, %Y - %H:%M")
12
+ elsif value.is_a?(Date)
13
+ value.strftime("%B %-d, %Y")
14
+ else
15
+ value
16
+ end
8
17
  %>
9
18
 
10
19
  <%= setup[:form_object].label field, setup[:field_label] %>
11
- <p><%= value %></p>
20
+ <p><%= formatted_value %></p>
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chobble-forms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chobble.com
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-08-16 00:00:00.000000000 Z
11
+ date: 2025-10-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails