katalyst-govuk-formbuilder 1.9.4 → 1.10.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/README.md +3 -7
- data/lib/katalyst/govuk/formbuilder/builder.rb +197 -0
- data/lib/katalyst/govuk/formbuilder/containers/fieldset_context.rb +19 -0
- data/lib/katalyst/govuk/formbuilder/elements/label.rb +38 -0
- data/lib/katalyst/govuk/formbuilder/elements/legend.rb +32 -0
- data/lib/katalyst/govuk/formbuilder/elements/rich_text_area.rb +56 -0
- data/lib/katalyst/govuk/formbuilder/engine.rb +14 -1
- data/lib/katalyst/govuk/formbuilder/extensions.rb +10 -173
- data/lib/katalyst/govuk/formbuilder/traits/label.rb +33 -0
- data/lib/katalyst/govuk/formbuilder.rb +2 -8
- metadata +9 -5
- data/lib/govuk_design_system_formbuilder/elements/check_box_field.rb +0 -48
- data/lib/govuk_design_system_formbuilder/elements/rich_text_area.rb +0 -107
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c0eb24c54218d311069b79c4c1dfbdae928f8938b3cefd113b0c66187441954
|
4
|
+
data.tar.gz: 3099bab9d5bfd1260352993790cb55d7b2a8459cbd71c4568552914f9725aea9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29bc78afaf0b337a021ff90b11d254110ce65bf244df77e3222e3c8b7ae3a5fe833b3a261ee322911854b4b738c8da684d5bdb559b76761bbedb6e9a11bfb1e6
|
7
|
+
data.tar.gz: 7f88be3d8f4b304e562dbc2d6d2594b8fc938f3f202ca27f2c336254dea0b1c52ec1fc58783d206073e8679d263736a6a9f308a108c8f48e5171adb3edc490d1
|
data/README.md
CHANGED
@@ -23,7 +23,7 @@ Or install it yourself as:
|
|
23
23
|
|
24
24
|
Add the stylesheet to your default layout:
|
25
25
|
|
26
|
-
```
|
26
|
+
```erb
|
27
27
|
<%= stylesheet_link_tag "katalyst/govuk/formbuilder" %>
|
28
28
|
```
|
29
29
|
|
@@ -32,7 +32,7 @@ Some GOVUK components require javascript enhancements
|
|
32
32
|
|
33
33
|
You can use the provided helper to load the formbuilder esm from importmaps and enhance your form:
|
34
34
|
|
35
|
-
```
|
35
|
+
```erb
|
36
36
|
<%= form_with ... %>
|
37
37
|
<%= govuk_formbuilder_init %>
|
38
38
|
```
|
@@ -49,11 +49,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/kataly
|
|
49
49
|
|
50
50
|
## Release
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
```bash
|
55
|
-
bundle exec rake release
|
56
|
-
```
|
52
|
+
Tag the release version and push to CI.
|
57
53
|
|
58
54
|
## License
|
59
55
|
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Katalyst
|
4
|
+
module GOVUK
|
5
|
+
module Formbuilder
|
6
|
+
module Builder
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
|
9
|
+
included do
|
10
|
+
# Overwrite GOVUK default to set small to true
|
11
|
+
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_radio_buttons_fieldset
|
12
|
+
def govuk_radio_buttons_fieldset(attribute_name, hint: {}, legend: {}, caption: {}, inline: false,
|
13
|
+
small: true, form_group: {}, **kwargs, &block)
|
14
|
+
GOVUKDesignSystemFormBuilder::Containers::RadioButtonsFieldset.new(
|
15
|
+
self, object_name, attribute_name,
|
16
|
+
hint:, legend:, caption:, inline:, small:, form_group:,
|
17
|
+
**kwargs, &block
|
18
|
+
).html
|
19
|
+
end
|
20
|
+
|
21
|
+
# Overwrite GOVUK default to set small to true
|
22
|
+
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_collection_check_boxes
|
23
|
+
def govuk_collection_check_boxes(attribute_name, collection, value_method, text_method, hint_method = nil,
|
24
|
+
hint: {}, legend: {}, caption: {}, small: true, form_group: {},
|
25
|
+
include_hidden: config.default_collection_check_boxes_include_hidden,
|
26
|
+
**kwargs, &block)
|
27
|
+
GOVUKDesignSystemFormBuilder::Elements::CheckBoxes::Collection.new(
|
28
|
+
self,
|
29
|
+
object_name,
|
30
|
+
attribute_name,
|
31
|
+
collection,
|
32
|
+
value_method:,
|
33
|
+
text_method:,
|
34
|
+
hint_method:,
|
35
|
+
hint:,
|
36
|
+
legend:,
|
37
|
+
caption:,
|
38
|
+
small:,
|
39
|
+
form_group:,
|
40
|
+
include_hidden:,
|
41
|
+
**kwargs,
|
42
|
+
&block
|
43
|
+
).html
|
44
|
+
end
|
45
|
+
|
46
|
+
# Overwrite GOVUK default to set small to true
|
47
|
+
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_check_boxes_fieldset
|
48
|
+
def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint: {}, small: true, form_group: {},
|
49
|
+
multiple: true, **kwargs, &block)
|
50
|
+
GOVUKDesignSystemFormBuilder::Containers::CheckBoxesFieldset.new(
|
51
|
+
self,
|
52
|
+
object_name,
|
53
|
+
attribute_name,
|
54
|
+
hint:,
|
55
|
+
legend:,
|
56
|
+
caption:,
|
57
|
+
small:,
|
58
|
+
form_group:,
|
59
|
+
multiple:,
|
60
|
+
**kwargs,
|
61
|
+
&block
|
62
|
+
).html
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Generates a check box within a fieldset to be used as a boolean toggle for a single attribute.
|
67
|
+
# The values are 1 (toggled on), and 0 (toggled off).
|
68
|
+
#
|
69
|
+
# @param attribute_name [Symbol] The name of the attribute
|
70
|
+
# @param small [Boolean] controls whether small check boxes are used instead of regular-sized ones
|
71
|
+
# @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+. When a +Proc+
|
72
|
+
# is supplied the hint will be wrapped in a +div+ instead of a +span+
|
73
|
+
# @option hint text [String] the hint text
|
74
|
+
# @option hint kwargs [Hash] additional arguments are applied as attributes to the hint
|
75
|
+
# @param link_errors [Boolean] controls whether this checkbox should be linked to from {#govuk_error_summary}
|
76
|
+
# @option label text [String] the label text
|
77
|
+
# @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
|
78
|
+
# @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
|
79
|
+
# @option label hidden [Boolean] control the visibility of the label. Hidden labels will be read by
|
80
|
+
# screenreaders
|
81
|
+
# @option label kwargs [Hash] additional arguments are applied as attributes on the +label+ element
|
82
|
+
# @option kwargs [Hash] kwargs additional arguments are applied as attributes to the +input+ element
|
83
|
+
# @param block [Block] any HTML passed in will form the contents of the fieldset
|
84
|
+
# @return [ActiveSupport::SafeBuffer] HTML output
|
85
|
+
#
|
86
|
+
# @example A single check box for terms and conditions
|
87
|
+
# = f.govuk_check_box_field :terms_agreed,
|
88
|
+
# link_errors: true,
|
89
|
+
# label: { text: 'Do you agree with our terms and conditions?' },
|
90
|
+
# hint: { text: 'You will not be able to proceed unless you do' }
|
91
|
+
#
|
92
|
+
def govuk_check_box_field(attribute_name, value = 1, unchecked_value = 0,
|
93
|
+
small: true, hint: {}, label: {}, link_errors: false, **kwargs, &block)
|
94
|
+
govuk_check_boxes_fieldset(attribute_name, legend: nil, multiple: false, small:) do
|
95
|
+
fieldset_context.pop # undo push from fieldset extension, labels should be bold unless already nested
|
96
|
+
checkbox = govuk_check_box(attribute_name, value, unchecked_value,
|
97
|
+
hint:,
|
98
|
+
label:,
|
99
|
+
link_errors:,
|
100
|
+
multiple: false,
|
101
|
+
exclusive: false,
|
102
|
+
**kwargs, &block)
|
103
|
+
fieldset_context.push attribute_name # restore push from fieldset
|
104
|
+
checkbox
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
# Overwrite GOVUK default to set small to true
|
109
|
+
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_collection_radio_buttons
|
110
|
+
def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method = nil,
|
111
|
+
hint_method = nil, hint: {}, legend: {}, caption: {}, inline: false,
|
112
|
+
small: true, bold_labels: nil,
|
113
|
+
include_hidden: config.default_collection_radio_buttons_include_hidden,
|
114
|
+
form_group: {}, **, &)
|
115
|
+
GOVUKDesignSystemFormBuilder::Elements::Radios::Collection.new(
|
116
|
+
self,
|
117
|
+
object_name,
|
118
|
+
attribute_name,
|
119
|
+
collection,
|
120
|
+
value_method:,
|
121
|
+
text_method:,
|
122
|
+
hint_method:,
|
123
|
+
hint:,
|
124
|
+
legend:,
|
125
|
+
caption:,
|
126
|
+
inline:,
|
127
|
+
small:,
|
128
|
+
bold_labels:,
|
129
|
+
form_group:,
|
130
|
+
include_hidden:,
|
131
|
+
**,
|
132
|
+
&
|
133
|
+
).html
|
134
|
+
end
|
135
|
+
|
136
|
+
# Generates a pair of +trix-toolbar+ and +trix-editor+ elements with a label, optional hint.
|
137
|
+
# Requires action-text to be correctly setup in the application
|
138
|
+
#
|
139
|
+
# @param attribute_name [Symbol] The name of the attribute
|
140
|
+
# @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+. When a +Proc+
|
141
|
+
# is supplied the hint will be wrapped in a +div+ instead of a +span+
|
142
|
+
# @option hint text [String] the hint text
|
143
|
+
# @option hint kwargs [Hash] additional arguments are applied as attributes to the hint
|
144
|
+
# @param label [Hash,Proc] configures or sets the associated label content
|
145
|
+
# @option label text [String] the label text
|
146
|
+
# @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
|
147
|
+
# @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
|
148
|
+
# @option label hidden [Boolean] control the visibility of the label. Hidden labels will still be read by screen
|
149
|
+
# readers
|
150
|
+
# @option label kwargs [Hash] additional arguments are applied as attributes on the +label+ element
|
151
|
+
# @param caption [Hash] configures or sets the caption content which is inserted above the label
|
152
|
+
# @option caption text [String] the caption text
|
153
|
+
# @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
|
154
|
+
# @option caption kwargs [Hash] additional arguments are applied as attributes on the caption +span+ element
|
155
|
+
# @option kwargs [Hash] kwargs additional arguments are applied as attributes to the +trix-editor+ element.
|
156
|
+
# This is picked up and handled by the action-text gem
|
157
|
+
# @param form_group [Hash] configures the form group
|
158
|
+
# @option form_group classes [Array,String] sets the form group's classes
|
159
|
+
# @option form_group kwargs [Hash] additional attributes added to the form group
|
160
|
+
# @param block [Block] arbitrary HTML that will be rendered between the hint and the input
|
161
|
+
# @return [ActiveSupport::SafeBuffer] HTML output
|
162
|
+
#
|
163
|
+
# @example A rich text area with injected content
|
164
|
+
# = f.govuk_rich_text_area :description,
|
165
|
+
# label: { text: 'Where did the incident take place?' } do
|
166
|
+
#
|
167
|
+
# p.govuk-inset-text
|
168
|
+
# | If you don't know exactly leave this section blank
|
169
|
+
#
|
170
|
+
# @example A rich text area with the label supplied as a proc
|
171
|
+
# = f.govuk_rich_text_area :instructions,
|
172
|
+
# label: -> { tag.h3("How do you set it up?") }
|
173
|
+
#
|
174
|
+
# @example A rich text area with a custom direct upload url and a custom stimulus controller
|
175
|
+
# = f.govuk_rich_text_area :description,
|
176
|
+
# data: {
|
177
|
+
# direct_upload_url: direct_uploads_url,
|
178
|
+
# controller: "content--editor--trix",
|
179
|
+
# action: "trix-initialize->content--editor--trix#trixInitialize",
|
180
|
+
# }
|
181
|
+
#
|
182
|
+
def govuk_rich_text_area(attribute_name, hint: {}, label: {}, caption: {}, form_group: {}, **, &)
|
183
|
+
GOVUKDesignSystemFormBuilder::Elements::RichTextArea.new(
|
184
|
+
self, object_name, attribute_name,
|
185
|
+
hint:, label:, caption:, form_group:, **, &
|
186
|
+
).html
|
187
|
+
end
|
188
|
+
|
189
|
+
# Keep track of whether we are inside a fieldset
|
190
|
+
# This allows labels to default to bold ("s") normally but use the default otherwise
|
191
|
+
def fieldset_context
|
192
|
+
@fieldset_context ||= []
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Katalyst
|
4
|
+
module GOVUK
|
5
|
+
module Formbuilder
|
6
|
+
module Containers
|
7
|
+
module FieldsetContext
|
8
|
+
def initialize(builder, object_name = nil, attribute_name = nil, &)
|
9
|
+
builder.fieldset_context << attribute_name
|
10
|
+
|
11
|
+
super
|
12
|
+
|
13
|
+
builder.fieldset_context.pop
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "govuk_design_system_formbuilder"
|
4
|
+
|
5
|
+
module Katalyst
|
6
|
+
module GOVUK
|
7
|
+
module Formbuilder
|
8
|
+
module Elements
|
9
|
+
# Extend Elements::Label to add support for human_attribute_name as a fallback
|
10
|
+
module Label
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
def retrieve_text(option_text, hidden)
|
15
|
+
text = option_text.presence ||
|
16
|
+
localised_text(:label).presence ||
|
17
|
+
human_attribute_name.presence ||
|
18
|
+
@attribute_name.to_s.humanize.capitalize.presence
|
19
|
+
|
20
|
+
if hidden
|
21
|
+
tag.span(text, class: %(#{brand}-visually-hidden))
|
22
|
+
else
|
23
|
+
text
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def human_attribute_name
|
29
|
+
return unless @object_name.present? && @attribute_name.present?
|
30
|
+
return unless @builder.object&.class.respond_to?(:human_attribute_name)
|
31
|
+
|
32
|
+
@builder.object.class.human_attribute_name(@attribute_name)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "govuk_design_system_formbuilder"
|
4
|
+
|
5
|
+
module Katalyst
|
6
|
+
module GOVUK
|
7
|
+
module Formbuilder
|
8
|
+
module Elements
|
9
|
+
# Extend Elements::Legend to add support for human_attribute_name as a fallback
|
10
|
+
module Legend
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
def retrieve_text(supplied_text)
|
15
|
+
supplied_text.presence ||
|
16
|
+
localised_text(:legend).presence ||
|
17
|
+
human_attribute_name.presence ||
|
18
|
+
@attribute_name.to_s.humanize.capitalize.presence
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def human_attribute_name
|
23
|
+
return unless @object_name.present? && @attribute_name.present?
|
24
|
+
return unless @builder.object&.class.respond_to?(:human_attribute_name)
|
25
|
+
|
26
|
+
@builder.object.class.human_attribute_name(@attribute_name)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "govuk_design_system_formbuilder"
|
4
|
+
|
5
|
+
module Katalyst
|
6
|
+
module GOVUK
|
7
|
+
module Formbuilder
|
8
|
+
module Elements
|
9
|
+
class RichTextArea < GOVUKDesignSystemFormBuilder::Base
|
10
|
+
using GOVUKDesignSystemFormBuilder::PrefixableArray
|
11
|
+
|
12
|
+
include GOVUKDesignSystemFormBuilder::Traits::Error
|
13
|
+
include GOVUKDesignSystemFormBuilder::Traits::Hint
|
14
|
+
include GOVUKDesignSystemFormBuilder::Traits::Label
|
15
|
+
include GOVUKDesignSystemFormBuilder::Traits::Supplemental
|
16
|
+
include GOVUKDesignSystemFormBuilder::Traits::HTMLAttributes
|
17
|
+
include GOVUKDesignSystemFormBuilder::Traits::HTMLClasses
|
18
|
+
|
19
|
+
def initialize(builder, object_name, attribute_name, hint:, label:, caption:, form_group:, **kwargs, &)
|
20
|
+
super(builder, object_name, attribute_name, &)
|
21
|
+
|
22
|
+
@label = label
|
23
|
+
@caption = caption
|
24
|
+
@hint = hint
|
25
|
+
@form_group = form_group
|
26
|
+
@html_attributes = kwargs
|
27
|
+
end
|
28
|
+
|
29
|
+
def html
|
30
|
+
GOVUKDesignSystemFormBuilder::Containers::FormGroup.new(*bound, **@form_group).html do
|
31
|
+
safe_join([label_element, supplemental_content, hint_element, error_element, rich_text_area])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def rich_text_area
|
38
|
+
@builder.rich_text_area(@attribute_name, **attributes(@html_attributes))
|
39
|
+
end
|
40
|
+
|
41
|
+
def classes
|
42
|
+
build_classes(%(richtextarea), %(richtextarea--error) => has_errors?).prefix(brand)
|
43
|
+
end
|
44
|
+
|
45
|
+
def options
|
46
|
+
{
|
47
|
+
id: field_id(link_errors: true),
|
48
|
+
class: classes,
|
49
|
+
aria: { describedby: combine_references(hint_id, error_id, supplemental_id) },
|
50
|
+
}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -1,10 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "active_support/inflector"
|
4
|
+
require "govuk_design_system_formbuilder"
|
5
|
+
|
3
6
|
module Katalyst
|
4
7
|
module GOVUK
|
5
8
|
module Formbuilder
|
6
|
-
# Engine is responsible for adding assets to load path
|
7
9
|
class Engine < ::Rails::Engine
|
10
|
+
ActiveSupport::Inflector.inflections(:en) do |inflect|
|
11
|
+
inflect.acronym "GOVUK"
|
12
|
+
end
|
13
|
+
|
14
|
+
config.eager_load_namespaces << Katalyst::GOVUK::Formbuilder
|
15
|
+
config.paths.add("lib", autoload_once: true)
|
16
|
+
|
8
17
|
initializer "katalyst-govuk-formbuilder.assets" do
|
9
18
|
config.after_initialize do |app|
|
10
19
|
if app.config.respond_to?(:assets)
|
@@ -14,6 +23,10 @@ module Katalyst
|
|
14
23
|
end
|
15
24
|
end
|
16
25
|
|
26
|
+
initializer "katalyst-govuk-formbuilder.extensions" do
|
27
|
+
GOVUKDesignSystemFormBuilder::Builder.include(Formbuilder::Extensions)
|
28
|
+
end
|
29
|
+
|
17
30
|
initializer "katalyst-govuk-formbuilder.importmap", before: "importmap" do |app|
|
18
31
|
if app.config.respond_to?(:importmap)
|
19
32
|
app.config.importmap.paths << root.join("config/importmap.rb")
|
@@ -6,181 +6,18 @@ module Katalyst
|
|
6
6
|
module GOVUK
|
7
7
|
module Formbuilder
|
8
8
|
module Extensions
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
module GOVUKDesignSystemFormBuilder
|
24
|
-
module Builder
|
25
|
-
# Keep track of whether we are inside a fieldset
|
26
|
-
# This allows labels to default to bold ("s") normally but use the default otherwise
|
27
|
-
def fieldset_context
|
28
|
-
@fieldset_context ||= []
|
29
|
-
end
|
30
|
-
|
31
|
-
# Overwrite GOVUK default to set small to true
|
32
|
-
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_collection_radio_buttons
|
33
|
-
def govuk_collection_radio_buttons(attribute_name, collection, value_method, text_method = nil, hint_method = nil,
|
34
|
-
hint: {}, legend: {}, caption: {}, inline: false, small: true, bold_labels: nil,
|
35
|
-
include_hidden: config.default_collection_radio_buttons_include_hidden,
|
36
|
-
form_group: {}, **kwargs, &block)
|
37
|
-
Elements::Radios::Collection.new(
|
38
|
-
self,
|
39
|
-
object_name,
|
40
|
-
attribute_name,
|
41
|
-
collection,
|
42
|
-
value_method:,
|
43
|
-
text_method:,
|
44
|
-
hint_method:,
|
45
|
-
hint:,
|
46
|
-
legend:,
|
47
|
-
caption:,
|
48
|
-
inline:,
|
49
|
-
small:,
|
50
|
-
bold_labels:,
|
51
|
-
form_group:,
|
52
|
-
include_hidden:,
|
53
|
-
**kwargs,
|
54
|
-
&block
|
55
|
-
).html
|
56
|
-
end
|
57
|
-
|
58
|
-
# Overwrite GOVUK default to set small to true
|
59
|
-
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_radio_buttons_fieldset
|
60
|
-
def govuk_radio_buttons_fieldset(attribute_name, hint: {}, legend: {}, caption: {}, inline: false, small: true,
|
61
|
-
form_group: {}, **kwargs, &block)
|
62
|
-
Containers::RadioButtonsFieldset.new(self, object_name, attribute_name,
|
63
|
-
hint:, legend:, caption:, inline:, small:, form_group:,
|
64
|
-
**kwargs, &block).html
|
65
|
-
end
|
66
|
-
|
67
|
-
# Overwrite GOVUK default to set small to true
|
68
|
-
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_collection_check_boxes
|
69
|
-
def govuk_collection_check_boxes(attribute_name, collection, value_method, text_method, hint_method = nil,
|
70
|
-
hint: {}, legend: {}, caption: {}, small: true, form_group: {},
|
71
|
-
include_hidden: config.default_collection_check_boxes_include_hidden,
|
72
|
-
**kwargs, &block)
|
73
|
-
Elements::CheckBoxes::Collection.new(
|
74
|
-
self,
|
75
|
-
object_name,
|
76
|
-
attribute_name,
|
77
|
-
collection,
|
78
|
-
value_method:,
|
79
|
-
text_method:,
|
80
|
-
hint_method:,
|
81
|
-
hint:,
|
82
|
-
legend:,
|
83
|
-
caption:,
|
84
|
-
small:,
|
85
|
-
form_group:,
|
86
|
-
include_hidden:,
|
87
|
-
**kwargs,
|
88
|
-
&block
|
89
|
-
).html
|
90
|
-
end
|
91
|
-
|
92
|
-
# Overwrite GOVUK default to set small to true
|
93
|
-
# @see GOVUKDesignSystemFormBuilder::Builder#govuk_check_boxes_fieldset
|
94
|
-
def govuk_check_boxes_fieldset(attribute_name, legend: {}, caption: {}, hint: {}, small: true, form_group: {},
|
95
|
-
multiple: true, **kwargs, &block)
|
96
|
-
Containers::CheckBoxesFieldset.new(
|
97
|
-
self,
|
98
|
-
object_name,
|
99
|
-
attribute_name,
|
100
|
-
hint:,
|
101
|
-
legend:,
|
102
|
-
caption:,
|
103
|
-
small:,
|
104
|
-
form_group:,
|
105
|
-
multiple:,
|
106
|
-
**kwargs,
|
107
|
-
&block
|
108
|
-
).html
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
# Extend Traits::Label set the default size to small for non-nested labels.
|
113
|
-
module Traits
|
114
|
-
module Label
|
115
|
-
private
|
116
|
-
|
117
|
-
def label_content
|
118
|
-
default = @builder.fieldset_context.count.positive? ? {} : { size: "s" }
|
119
|
-
|
120
|
-
case @label
|
121
|
-
when Hash
|
122
|
-
default.merge(@label)
|
123
|
-
when Proc
|
124
|
-
default.merge(content: @label)
|
125
|
-
else
|
126
|
-
fail(ArgumentError, %(label must be a Proc or Hash))
|
9
|
+
extend ActiveSupport::Concern
|
10
|
+
|
11
|
+
included do
|
12
|
+
GOVUKDesignSystemFormBuilder::Builder.include(Builder)
|
13
|
+
GOVUKDesignSystemFormBuilder::Elements::Label.include(Elements::Label)
|
14
|
+
GOVUKDesignSystemFormBuilder::Elements::Legend.include(Elements::Legend)
|
15
|
+
GOVUKDesignSystemFormBuilder::Traits::Label.include(Traits::Label)
|
16
|
+
GOVUKDesignSystemFormBuilder::Containers::Fieldset.include(Containers::FieldsetContext)
|
17
|
+
GOVUKDesignSystemFormBuilder::Containers::CheckBoxesFieldset.include(Containers::FieldsetContext)
|
18
|
+
GOVUKDesignSystemFormBuilder::Containers::RadioButtonsFieldset.include(Containers::FieldsetContext)
|
127
19
|
end
|
128
20
|
end
|
129
21
|
end
|
130
22
|
end
|
131
|
-
|
132
|
-
# Extend Elements::Label to add support for human_attribute_name as a fallback
|
133
|
-
module Elements
|
134
|
-
class Label
|
135
|
-
def retrieve_text(option_text, hidden)
|
136
|
-
text = option_text.presence ||
|
137
|
-
localised_text(:label).presence ||
|
138
|
-
human_attribute_name.presence ||
|
139
|
-
@attribute_name.to_s.humanize.capitalize.presence
|
140
|
-
|
141
|
-
if hidden
|
142
|
-
tag.span(text, class: %(#{brand}-visually-hidden))
|
143
|
-
else
|
144
|
-
text
|
145
|
-
end
|
146
|
-
end
|
147
|
-
|
148
|
-
def human_attribute_name
|
149
|
-
return unless @object_name.present? && @attribute_name.present?
|
150
|
-
return unless @builder.object&.class.respond_to?(:human_attribute_name)
|
151
|
-
|
152
|
-
@builder.object.class.human_attribute_name(@attribute_name)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
class Legend
|
157
|
-
def retrieve_text(supplied_text)
|
158
|
-
supplied_text.presence ||
|
159
|
-
localised_text(:legend).presence ||
|
160
|
-
human_attribute_name.presence ||
|
161
|
-
@attribute_name.to_s.humanize.capitalize.presence
|
162
|
-
end
|
163
|
-
|
164
|
-
def human_attribute_name
|
165
|
-
return unless @object_name.present? && @attribute_name.present?
|
166
|
-
return unless @builder.object&.class.respond_to?(:human_attribute_name)
|
167
|
-
|
168
|
-
@builder.object.class.human_attribute_name(@attribute_name)
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
172
|
-
|
173
|
-
module Containers
|
174
|
-
class Fieldset
|
175
|
-
include Katalyst::GOVUK::Formbuilder::Extensions::Fieldset
|
176
|
-
end
|
177
|
-
|
178
|
-
class CheckBoxesFieldset
|
179
|
-
include Katalyst::GOVUK::Formbuilder::Extensions::Fieldset
|
180
|
-
end
|
181
|
-
|
182
|
-
class RadioButtonsFieldset
|
183
|
-
include Katalyst::GOVUK::Formbuilder::Extensions::Fieldset
|
184
|
-
end
|
185
|
-
end
|
186
23
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "govuk_design_system_formbuilder"
|
4
|
+
|
5
|
+
module Katalyst
|
6
|
+
module GOVUK
|
7
|
+
module Formbuilder
|
8
|
+
module Traits
|
9
|
+
# Extend GovukDesignSystemFormBuilder::Traits::Label set the default size to small for non-nested labels.
|
10
|
+
module Label
|
11
|
+
extend ActiveSupport::Concern
|
12
|
+
|
13
|
+
included do
|
14
|
+
private
|
15
|
+
|
16
|
+
def label_content
|
17
|
+
default = @builder.fieldset_context.count.positive? ? {} : { size: "s" }
|
18
|
+
|
19
|
+
case @label
|
20
|
+
when Hash
|
21
|
+
default.merge(@label)
|
22
|
+
when Proc
|
23
|
+
default.merge(content: @label)
|
24
|
+
else
|
25
|
+
fail(ArgumentError, %(label must be a Proc or Hash))
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,16 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "govuk_design_system_formbuilder"
|
4
|
-
require "govuk_design_system_formbuilder/elements/rich_text_area"
|
5
|
-
require "govuk_design_system_formbuilder/elements/check_box_field"
|
6
|
-
|
7
|
-
require "katalyst/govuk/formbuilder/engine"
|
8
|
-
require "katalyst/govuk/formbuilder/extensions"
|
9
|
-
require "katalyst/govuk/formbuilder/frontend"
|
10
|
-
|
11
3
|
module Katalyst
|
12
4
|
module GOVUK
|
13
5
|
module Formbuilder
|
14
6
|
end
|
15
7
|
end
|
16
8
|
end
|
9
|
+
|
10
|
+
require "katalyst/govuk/formbuilder/engine"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: katalyst-govuk-formbuilder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katalyst Interactive
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-07-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: govuk_design_system_formbuilder
|
@@ -41,12 +41,16 @@ files:
|
|
41
41
|
- app/assets/stylesheets/katalyst/govuk/components/richtextarea/_richtextarea.scss
|
42
42
|
- app/assets/stylesheets/katalyst/govuk/formbuilder.scss
|
43
43
|
- config/importmap.rb
|
44
|
-
- lib/govuk_design_system_formbuilder/elements/check_box_field.rb
|
45
|
-
- lib/govuk_design_system_formbuilder/elements/rich_text_area.rb
|
46
44
|
- lib/katalyst/govuk/formbuilder.rb
|
45
|
+
- lib/katalyst/govuk/formbuilder/builder.rb
|
46
|
+
- lib/katalyst/govuk/formbuilder/containers/fieldset_context.rb
|
47
|
+
- lib/katalyst/govuk/formbuilder/elements/label.rb
|
48
|
+
- lib/katalyst/govuk/formbuilder/elements/legend.rb
|
49
|
+
- lib/katalyst/govuk/formbuilder/elements/rich_text_area.rb
|
47
50
|
- lib/katalyst/govuk/formbuilder/engine.rb
|
48
51
|
- lib/katalyst/govuk/formbuilder/extensions.rb
|
49
52
|
- lib/katalyst/govuk/formbuilder/frontend.rb
|
53
|
+
- lib/katalyst/govuk/formbuilder/traits/label.rb
|
50
54
|
- node_modules/govuk-frontend/dist/govuk/_base.scss
|
51
55
|
- node_modules/govuk-frontend/dist/govuk/all.scss
|
52
56
|
- node_modules/govuk-frontend/dist/govuk/components/_all.scss
|
@@ -198,7 +202,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
198
202
|
requirements:
|
199
203
|
- - ">="
|
200
204
|
- !ruby/object:Gem::Version
|
201
|
-
version: '
|
205
|
+
version: '3.3'
|
202
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
203
207
|
requirements:
|
204
208
|
- - ">="
|
@@ -1,48 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "govuk_design_system_formbuilder"
|
4
|
-
|
5
|
-
module GOVUKDesignSystemFormBuilder
|
6
|
-
module Builder
|
7
|
-
# Generates a check box within a fieldset to be used as a boolean toggle for a single attribute.
|
8
|
-
# The values are 1 (toggled on), and 0 (toggled off).
|
9
|
-
#
|
10
|
-
# @param attribute_name [Symbol] The name of the attribute
|
11
|
-
# @param small [Boolean] controls whether small check boxes are used instead of regular-sized ones
|
12
|
-
# @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+. When a +Proc+ is
|
13
|
-
# supplied the hint will be wrapped in a +div+ instead of a +span+
|
14
|
-
# @option hint text [String] the hint text
|
15
|
-
# @option hint kwargs [Hash] additional arguments are applied as attributes to the hint
|
16
|
-
# @param link_errors [Boolean] controls whether this checkbox should be linked to from {#govuk_error_summary}
|
17
|
-
# @option label text [String] the label text
|
18
|
-
# @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
|
19
|
-
# @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
|
20
|
-
# @option label hidden [Boolean] control the visibility of the label. Hidden labels will be read by screenreaders
|
21
|
-
# @option label kwargs [Hash] additional arguments are applied as attributes on the +label+ element
|
22
|
-
# @option kwargs [Hash] kwargs additional arguments are applied as attributes to the +input+ element
|
23
|
-
# @param block [Block] any HTML passed in will form the contents of the fieldset
|
24
|
-
# @return [ActiveSupport::SafeBuffer] HTML output
|
25
|
-
#
|
26
|
-
# @example A single check box for terms and conditions
|
27
|
-
# = f.govuk_check_box_field :terms_agreed,
|
28
|
-
# link_errors: true,
|
29
|
-
# label: { text: 'Do you agree with our terms and conditions?' },
|
30
|
-
# hint: { text: 'You will not be able to proceed unless you do' }
|
31
|
-
#
|
32
|
-
def govuk_check_box_field(attribute_name, value = 1, unchecked_value = 0,
|
33
|
-
small: true, hint: {}, label: {}, link_errors: false, **kwargs, &block)
|
34
|
-
govuk_check_boxes_fieldset(attribute_name, legend: nil, multiple: false, small:) do
|
35
|
-
fieldset_context.pop # undo push from fieldset extension, labels should be bold unless already nested
|
36
|
-
checkbox = govuk_check_box(attribute_name, value, unchecked_value,
|
37
|
-
hint:,
|
38
|
-
label:,
|
39
|
-
link_errors:,
|
40
|
-
multiple: false,
|
41
|
-
exclusive: false,
|
42
|
-
**kwargs, &block)
|
43
|
-
fieldset_context.push attribute_name # restore push from fieldset
|
44
|
-
checkbox
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
@@ -1,107 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "govuk_design_system_formbuilder"
|
4
|
-
|
5
|
-
module GOVUKDesignSystemFormBuilder
|
6
|
-
module Elements
|
7
|
-
class RichTextArea < Base
|
8
|
-
using PrefixableArray
|
9
|
-
|
10
|
-
include Traits::Error
|
11
|
-
include Traits::Hint
|
12
|
-
include Traits::Label
|
13
|
-
include Traits::Supplemental
|
14
|
-
include Traits::HTMLAttributes
|
15
|
-
include Traits::HTMLClasses
|
16
|
-
|
17
|
-
def initialize(builder, object_name, attribute_name, hint:, label:, caption:, form_group:, **kwargs, &block)
|
18
|
-
super(builder, object_name, attribute_name, &block)
|
19
|
-
|
20
|
-
@label = label
|
21
|
-
@caption = caption
|
22
|
-
@hint = hint
|
23
|
-
@form_group = form_group
|
24
|
-
@html_attributes = kwargs
|
25
|
-
end
|
26
|
-
|
27
|
-
def html
|
28
|
-
Containers::FormGroup.new(*bound, **@form_group).html do
|
29
|
-
safe_join([label_element, supplemental_content, hint_element, error_element, rich_text_area])
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
34
|
-
|
35
|
-
def rich_text_area
|
36
|
-
@builder.rich_text_area(@attribute_name, **attributes(@html_attributes))
|
37
|
-
end
|
38
|
-
|
39
|
-
def classes
|
40
|
-
build_classes(%(richtextarea), %(richtextarea--error) => has_errors?).prefix(brand)
|
41
|
-
end
|
42
|
-
|
43
|
-
def options
|
44
|
-
{
|
45
|
-
id: field_id(link_errors: true),
|
46
|
-
class: classes,
|
47
|
-
aria: { describedby: combine_references(hint_id, error_id, supplemental_id) },
|
48
|
-
}
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
module GOVUKDesignSystemFormBuilder
|
55
|
-
module Builder
|
56
|
-
# Generates a pair of +trix-toolbar+ and +trix-editor+ elements with a label, optional hint. Requires action-text to
|
57
|
-
# be correctly setup in the application
|
58
|
-
#
|
59
|
-
# @param attribute_name [Symbol] The name of the attribute
|
60
|
-
# @param hint [Hash,Proc] The content of the hint. No hint will be added if 'text' is left +nil+. When a +Proc+ is
|
61
|
-
# supplied the hint will be wrapped in a +div+ instead of a +span+
|
62
|
-
# @option hint text [String] the hint text
|
63
|
-
# @option hint kwargs [Hash] additional arguments are applied as attributes to the hint
|
64
|
-
# @param label [Hash,Proc] configures or sets the associated label content
|
65
|
-
# @option label text [String] the label text
|
66
|
-
# @option label size [String] the size of the label font, can be +xl+, +l+, +m+, +s+ or nil
|
67
|
-
# @option label tag [Symbol,String] the label's wrapper tag, intended to allow labels to act as page headings
|
68
|
-
# @option label hidden [Boolean] control the visibility of the label. Hidden labels will still be read by screen
|
69
|
-
# readers
|
70
|
-
# @option label kwargs [Hash] additional arguments are applied as attributes on the +label+ element
|
71
|
-
# @param caption [Hash] configures or sets the caption content which is inserted above the label
|
72
|
-
# @option caption text [String] the caption text
|
73
|
-
# @option caption size [String] the size of the caption, can be +xl+, +l+ or +m+. Defaults to +m+
|
74
|
-
# @option caption kwargs [Hash] additional arguments are applied as attributes on the caption +span+ element
|
75
|
-
# @option kwargs [Hash] kwargs additional arguments are applied as attributes to the +trix-editor+ element. This is
|
76
|
-
# picked up and handled by the action-text gem
|
77
|
-
# @param form_group [Hash] configures the form group
|
78
|
-
# @option form_group classes [Array,String] sets the form group's classes
|
79
|
-
# @option form_group kwargs [Hash] additional attributes added to the form group
|
80
|
-
# @param block [Block] arbitrary HTML that will be rendered between the hint and the input
|
81
|
-
# @return [ActiveSupport::SafeBuffer] HTML output
|
82
|
-
#
|
83
|
-
# @example A rich text area with injected content
|
84
|
-
# = f.govuk_rich_text_area :description,
|
85
|
-
# label: { text: 'Where did the incident take place?' } do
|
86
|
-
#
|
87
|
-
# p.govuk-inset-text
|
88
|
-
# | If you don't know exactly leave this section blank
|
89
|
-
#
|
90
|
-
# @example A rich text area with the label supplied as a proc
|
91
|
-
# = f.govuk_rich_text_area :instructions,
|
92
|
-
# label: -> { tag.h3("How do you set it up?") }
|
93
|
-
#
|
94
|
-
# @example A rich text area with a custom direct upload url and a custom stimulus controller
|
95
|
-
# = f.govuk_rich_text_area :description,
|
96
|
-
# data: {
|
97
|
-
# direct_upload_url: direct_uploads_url,
|
98
|
-
# controller: "content--editor--trix",
|
99
|
-
# action: "trix-initialize->content--editor--trix#trixInitialize",
|
100
|
-
# }
|
101
|
-
#
|
102
|
-
def govuk_rich_text_area(attribute_name, hint: {}, label: {}, caption: {}, form_group: {}, **kwargs, &block)
|
103
|
-
Elements::RichTextArea.new(self, object_name, attribute_name,
|
104
|
-
hint:, label:, caption:, form_group:, **kwargs, &block).html
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|