govuk_elements_form_builder 1.0.0 → 1.1.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
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 09e273646a0e9edb0788ac45e25409e98a8a815f
|
4
|
+
data.tar.gz: aa0abb864b6b38852ac96005461c204ab031e9c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59ad72a527811abca00667b6f8457d790310b3e8d230509f56883b0b60c6218a87356ed2618a48f8fc324fca78e13e65102e16035c7bf62ae28afe87a367b31b
|
7
|
+
data.tar.gz: 1fdea4d35a4ce12392e26eeedef890d07261422d995bf43236d30a40bd27b24e6023a142c8077b857687cbaddce846da0c8543841282f0b3a1ad550eab1d0699
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module GovukElementsFormBuilder
|
2
|
+
#
|
3
|
+
# This class is intended to be a proxy for a FormBuilder object, and accumulate
|
4
|
+
# multiple form elements rendered inside a block. Its main reason for existence is
|
5
|
+
# to enable the following syntax when rendering revealing panels:
|
6
|
+
#
|
7
|
+
# f.radio_button_fieldset :asked_for_help do |fieldset|
|
8
|
+
# fieldset.radio_input(GenericYesNo::YES) do |radio|
|
9
|
+
# # Here, `radio` is a `BlockBuffer` instance, delegating all methods to
|
10
|
+
# # a `FormBuilder` instance, but doing the accumulation/concatenation.
|
11
|
+
# radio.text_field(:help_party)
|
12
|
+
# radio.text_field(:another_field)
|
13
|
+
# [...]
|
14
|
+
# end
|
15
|
+
# fieldset.radio_input(GenericYesNo::NO)
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
class BlockBuffer
|
19
|
+
delegate :safe_concat, :send, to: :@form_object
|
20
|
+
|
21
|
+
def initialize(form_object)
|
22
|
+
@form_object = form_object
|
23
|
+
end
|
24
|
+
|
25
|
+
def method_missing(method, *args, &block)
|
26
|
+
safe_concat send(method, *args, &block)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -5,9 +5,12 @@ module GovukElementsFormBuilder
|
|
5
5
|
add_error_to_html_tag! html_tag, instance
|
6
6
|
end
|
7
7
|
|
8
|
-
delegate :content_tag, :tag, :safe_join, to: :@template
|
8
|
+
delegate :content_tag, :tag, :safe_join, :safe_concat, :capture, to: :@template
|
9
9
|
delegate :errors, to: :@object
|
10
10
|
|
11
|
+
# Used to propagate the fieldset outer element attribute to the inner elements
|
12
|
+
attr_accessor :current_fieldset_attribute
|
13
|
+
|
11
14
|
# Ensure fields_for yields a GovukElementsFormBuilder.
|
12
15
|
def fields_for record_name, record_object = nil, fields_options = {}, &block
|
13
16
|
super record_name, record_object, fields_options.merge(builder: self.class), &block
|
@@ -41,27 +44,27 @@ module GovukElementsFormBuilder
|
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
44
|
-
def radio_button_fieldset attribute, options={}
|
47
|
+
def radio_button_fieldset attribute, options={}, &block
|
45
48
|
content_tag :div,
|
46
49
|
class: form_group_classes(attribute),
|
47
50
|
id: form_group_id(attribute) do
|
48
51
|
content_tag :fieldset, fieldset_options(attribute, options) do
|
49
52
|
safe_join([
|
50
|
-
fieldset_legend(attribute),
|
51
|
-
radio_inputs(attribute, options)
|
53
|
+
fieldset_legend(attribute, options),
|
54
|
+
block_given? ? capture(self, &block) : radio_inputs(attribute, options)
|
52
55
|
], "\n")
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
56
59
|
|
57
|
-
def check_box_fieldset legend_key, attributes, options={}
|
60
|
+
def check_box_fieldset legend_key, attributes, options={}, &block
|
58
61
|
content_tag :div,
|
59
62
|
class: form_group_classes(attributes),
|
60
63
|
id: form_group_id(attributes) do
|
61
64
|
content_tag :fieldset, fieldset_options(attributes, options) do
|
62
65
|
safe_join([
|
63
|
-
fieldset_legend(legend_key),
|
64
|
-
check_box_inputs(attributes)
|
66
|
+
fieldset_legend(legend_key, options),
|
67
|
+
block_given? ? capture(self, &block) : check_box_inputs(attributes, options)
|
65
68
|
], "\n")
|
66
69
|
end
|
67
70
|
end
|
@@ -82,48 +85,88 @@ module GovukElementsFormBuilder
|
|
82
85
|
|
83
86
|
end
|
84
87
|
|
88
|
+
# The following method will generate revealing panel markup and internally call the
|
89
|
+
# `radio_inputs` private method. It is not intended to be used outside a
|
90
|
+
# fieldset tag (at the moment, `radio_button_fieldset`).
|
91
|
+
#
|
92
|
+
def radio_input choice, options = {}, &block
|
93
|
+
fieldset_attribute = self.current_fieldset_attribute
|
94
|
+
|
95
|
+
panel = if block_given? || options.key?(:panel_id)
|
96
|
+
panel_id = options.delete(:panel_id) { [fieldset_attribute, choice, 'panel'].join('_') }
|
97
|
+
options.merge!('data-target': panel_id)
|
98
|
+
revealing_panel(panel_id, flush: false, &block) if block_given?
|
99
|
+
end
|
100
|
+
|
101
|
+
option = radio_inputs(
|
102
|
+
fieldset_attribute,
|
103
|
+
options.merge(choices: [choice])
|
104
|
+
).first + "\n"
|
105
|
+
|
106
|
+
safe_concat([option, panel].join)
|
107
|
+
end
|
108
|
+
|
109
|
+
# The following method will generate revealing panel markup and internally call the
|
110
|
+
# `check_box_inputs` private method. It is not intended to be used outside a
|
111
|
+
# fieldset tag (at the moment, `check_box_fieldset`).
|
112
|
+
#
|
113
|
+
def check_box_input attribute, options = {}, &block
|
114
|
+
panel = if block_given? || options.key?(:panel_id)
|
115
|
+
panel_id = options.delete(:panel_id) { [attribute, 'panel'].join('_') }
|
116
|
+
options.merge!('data-target': panel_id)
|
117
|
+
revealing_panel(panel_id, flush: false, &block) if block_given?
|
118
|
+
end
|
119
|
+
|
120
|
+
checkbox = check_box_inputs([attribute], options).first + "\n"
|
121
|
+
|
122
|
+
safe_concat([checkbox, panel].join)
|
123
|
+
end
|
124
|
+
|
125
|
+
def revealing_panel panel_id, options = {}, &block
|
126
|
+
panel = content_tag(
|
127
|
+
:div, class: 'panel panel-border-narrow js-hidden', id: panel_id
|
128
|
+
) { block.call(BlockBuffer.new(self)) } + "\n"
|
129
|
+
|
130
|
+
options.fetch(:flush, true) ? safe_concat(panel) : panel
|
131
|
+
end
|
132
|
+
|
85
133
|
private
|
86
134
|
|
135
|
+
# Given an attributes hash that could include any number of arbitrary keys, this method
|
136
|
+
# ensure we merge one or more 'default' attributes into the hash, creating the keys if
|
137
|
+
# don't exist, or merging the defaults if the keys already exists.
|
138
|
+
# It supports strings or arrays as values.
|
139
|
+
#
|
140
|
+
def merge_attributes attributes, default:
|
141
|
+
hash = attributes || {}
|
142
|
+
hash.merge(default) { |_key, oldval, newval| Array(newval) + Array(oldval) }
|
143
|
+
end
|
144
|
+
|
87
145
|
def set_field_classes! options, attribute
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
else
|
96
|
-
options[:class] = text_field_class
|
97
|
-
end
|
146
|
+
default_classes = ['form-control']
|
147
|
+
default_classes << 'form-control-error' if error_for?(attribute)
|
148
|
+
|
149
|
+
options ||= {}
|
150
|
+
options.merge!(
|
151
|
+
merge_attributes(options, default: {class: default_classes})
|
152
|
+
)
|
98
153
|
end
|
99
154
|
|
100
155
|
def set_label_classes! options
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
options[:label_options]
|
105
|
-
|
106
|
-
[text_field_class, options[:label_options][:class]]
|
107
|
-
when Array
|
108
|
-
options[:label_options][:class].unshift text_field_class
|
109
|
-
else
|
110
|
-
options[:label_options][:class] = text_field_class
|
111
|
-
end
|
112
|
-
else
|
113
|
-
options ||= {}
|
114
|
-
options[:label_options] ||= {}
|
115
|
-
options[:label_options][:class] = text_field_class
|
116
|
-
end
|
117
|
-
|
156
|
+
options ||= {}
|
157
|
+
options[:label_options] ||= {}
|
158
|
+
options[:label_options].merge!(
|
159
|
+
merge_attributes(options[:label_options], default: {class: 'form-label'})
|
160
|
+
)
|
118
161
|
end
|
119
162
|
|
120
|
-
def check_box_inputs attributes
|
163
|
+
def check_box_inputs attributes, options
|
121
164
|
attributes.map do |attribute|
|
122
165
|
input = check_box(attribute)
|
123
166
|
label = label(attribute) do |tag|
|
124
167
|
localized_label("#{attribute}")
|
125
168
|
end
|
126
|
-
content_tag :div, class:
|
169
|
+
content_tag :div, {class: 'multiple-choice'}.merge(options.slice(:class, :'data-target')) do
|
127
170
|
input + label
|
128
171
|
end
|
129
172
|
end
|
@@ -142,18 +185,18 @@ module GovukElementsFormBuilder
|
|
142
185
|
end
|
143
186
|
text
|
144
187
|
end
|
145
|
-
content_tag :div, class:
|
188
|
+
content_tag :div, {class: 'multiple-choice'}.merge(options.slice(:class, :'data-target')) do
|
146
189
|
input + label
|
147
190
|
end
|
148
191
|
end
|
149
192
|
end
|
150
193
|
|
151
|
-
def fieldset_legend attribute
|
194
|
+
def fieldset_legend attribute, options
|
152
195
|
legend = content_tag(:legend) do
|
153
196
|
tags = [content_tag(
|
154
197
|
:span,
|
155
198
|
fieldset_text(attribute),
|
156
|
-
class: 'form-label-bold'
|
199
|
+
merge_attributes(options[:legend_options], default: {class: 'form-label-bold'})
|
157
200
|
)]
|
158
201
|
|
159
202
|
if error_for? attribute
|
@@ -172,7 +215,9 @@ module GovukElementsFormBuilder
|
|
172
215
|
legend.html_safe
|
173
216
|
end
|
174
217
|
|
175
|
-
def fieldset_options
|
218
|
+
def fieldset_options attribute, options
|
219
|
+
self.current_fieldset_attribute = attribute
|
220
|
+
|
176
221
|
fieldset_options = {}
|
177
222
|
fieldset_options[:class] = 'inline' if options[:inline] == true
|
178
223
|
fieldset_options
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: govuk_elements_form_builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alistair Laing
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-01-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rails
|
@@ -163,6 +163,7 @@ files:
|
|
163
163
|
- Rakefile
|
164
164
|
- app/helpers/govuk_elements_errors_helper.rb
|
165
165
|
- lib/govuk_elements_form_builder.rb
|
166
|
+
- lib/govuk_elements_form_builder/block_buffer.rb
|
166
167
|
- lib/govuk_elements_form_builder/components/error_summary.rb
|
167
168
|
- lib/govuk_elements_form_builder/form_builder.rb
|
168
169
|
- lib/govuk_elements_form_builder/version.rb
|