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 +4 -4
- data/lib/chobble_forms/helpers.rb +56 -30
- data/lib/chobble_forms/version.rb +1 -1
- data/views/chobble_forms/_display_field.html.erb +10 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5278667464b4fb04d365ef198a36874fec3f5590680f705a18b0d5133776e201
|
|
4
|
+
data.tar.gz: 565d3f9a541a8e5aa5ce91fe0a2394afe2284c449103664785b5bca2a80123ef
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
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:
|
|
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([
|
|
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
|
|
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")
|
|
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
|
|
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
|
|
172
|
-
def
|
|
173
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
@@ -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><%=
|
|
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.
|
|
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-
|
|
11
|
+
date: 2025-10-13 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: rails
|