Class: Primer::Forms::Dsl::Input
- Inherits:
-
Object
- Object
- Primer::Forms::Dsl::Input
show all
- Includes:
- ClassNameHelper
- Defined in:
- lib/primer/forms/dsl/input.rb
Overview
Direct Known Subclasses
ActionMenuInput, ButtonInput, CheckBoxGroupInput, CheckBoxInput, FormReferenceInput, HiddenInput, MultiInput, RadioButtonGroupInput, RadioButtonInput, SelectInput, SubmitButtonInput, TextAreaInput, TextFieldInput, ToggleSwitchInput
Constant Summary
collapse
- SPACE_DELIMITED_ARIA_ATTRIBUTES =
%i[describedby].freeze
- DEFAULT_SIZE =
:medium
- SIZE_MAPPINGS =
{
:small => "FormControl-small",
DEFAULT_SIZE => "FormControl-medium",
:large => "FormControl-large"
}.freeze
- SIZE_OPTIONS =
SIZE_MAPPINGS.keys
- DEFAULT_INPUT_WIDTH =
:auto
- INPUT_WIDTH_MAPPINGS =
{
DEFAULT_INPUT_WIDTH => "FormControl-input-width--auto",
:small => "FormControl-input-width--small",
:medium => "FormControl-input-width--medium",
:large => "FormControl-input-width--large",
:xlarge => "FormControl-input-width--xlarge",
:xxlarge => "FormControl-input-width--xxlarge"
}.freeze
- INPUT_WIDTH_OPTIONS =
INPUT_WIDTH_MAPPINGS.keys
Instance Attribute Summary collapse
Instance Method Summary
collapse
#class_names
Constructor Details
#initialize(builder:, form:, **system_arguments) ⇒ Input
Returns a new instance of Input.
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
# File 'lib/primer/forms/dsl/input.rb', line 65
def initialize(builder:, form:, **system_arguments)
@builder = builder
@form = form
@input_arguments = system_arguments
@label_arguments = @input_arguments.delete(:label_arguments) || {}
@label_arguments[:class] = class_names(
@label_arguments[:class],
@input_arguments.fetch(:visually_hide_label, false) ? "sr-only" : nil
)
@input_arguments.delete(:visually_hide_label)
@input_arguments.delete(:class) if @input_arguments[:class].blank?
@label_arguments.delete(:class) if @label_arguments[:class].blank?
@caption = @input_arguments.delete(:caption)
@validation_message = @input_arguments.delete(:validation_message)
@invalid = @input_arguments.delete(:invalid)
@full_width = @input_arguments.delete(:full_width)
@size = @input_arguments.delete(:size)
@input_width = @input_arguments.delete(:input_width)
unless @input_arguments.delete(:scope_name_to_model) { true }
@input_arguments[:name] = name
end
unless @input_arguments.delete(:scope_id_to_model) { true }
@input_arguments[:id] = @input_arguments.delete(:id) { name }
end
@form_control = @input_arguments.delete(:form_control) { true }
@input_arguments[:invalid] = "true" if invalid?
@base_id = SecureRandom.uuid
@ids = {}.tap do |id_map|
id_map[:validation] = "validation-#{@base_id}" if supports_validation?
id_map[:caption] = "caption-#{@base_id}" if caption? || caption_template?
end
add_input_aria(:required, true) if required?
add_input_aria(:invalid, true) if invalid?
add_input_aria(:describedby, ids.values) if ids.any?
input_arguments.delete(:required)
end
|
Instance Attribute Details
#base_id ⇒ Object
Returns the value of attribute base_id.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def base_id
@base_id
end
|
#builder ⇒ Object
Returns the value of attribute builder.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def builder
@builder
end
|
#caption ⇒ Object
Returns the value of attribute caption.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def caption
@caption
end
|
Returns the value of attribute form.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def form
@form
end
|
Returns the value of attribute form_control.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def form_control
@form_control
end
|
#ids ⇒ Object
Returns the value of attribute ids.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def ids
@ids
end
|
Returns the value of attribute input_arguments.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def input_arguments
@input_arguments
end
|
#label_arguments ⇒ Object
Returns the value of attribute label_arguments.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def label_arguments
@label_arguments
end
|
#validation_message ⇒ Object
Returns the value of attribute validation_message.
61
62
63
|
# File 'lib/primer/forms/dsl/input.rb', line 61
def validation_message
@validation_message
end
|
Instance Method Details
148
149
150
151
152
153
154
155
156
|
# File 'lib/primer/forms/dsl/input.rb', line 148
def add_input_aria(key, value)
@input_arguments[:aria] ||= {}
@input_arguments[:aria][key] = if space_delimited_aria_attribute?(key)
aria_join(@input_arguments[:aria][key], *Array(value))
else
value
end
end
|
136
137
138
139
140
|
# File 'lib/primer/forms/dsl/input.rb', line 136
def add_input_classes(*class_names)
input_arguments[:class] = class_names(
input_arguments[:class], *class_names
)
end
|
158
159
160
|
# File 'lib/primer/forms/dsl/input.rb', line 158
def add_input_data(key, value)
input_data[key] = value
end
|
#add_label_classes(*class_names) ⇒ Object
142
143
144
145
146
|
# File 'lib/primer/forms/dsl/input.rb', line 142
def add_label_classes(*class_names)
label_arguments[:class] = class_names(
label_arguments[:class], *class_names
)
end
|
#autofocus! ⇒ Object
256
257
258
|
# File 'lib/primer/forms/dsl/input.rb', line 256
def autofocus!
input_arguments[:autofocus] = true
end
|
#caption? ⇒ Boolean
196
197
198
|
# File 'lib/primer/forms/dsl/input.rb', line 196
def caption?
caption.present?
end
|
#caption_id ⇒ Object
192
193
194
|
# File 'lib/primer/forms/dsl/input.rb', line 192
def caption_id
ids[:caption]
end
|
#caption_template? ⇒ Boolean
200
201
202
203
204
|
# File 'lib/primer/forms/dsl/input.rb', line 200
def caption_template?
return false unless form
form.caption_template?(caption_template_name)
end
|
#disabled? ⇒ Boolean
229
230
231
|
# File 'lib/primer/forms/dsl/input.rb', line 229
def disabled?
!!input_arguments[:disabled]
end
|
#focusable? ⇒ Boolean
279
280
281
|
# File 'lib/primer/forms/dsl/input.rb', line 279
def focusable?
false
end
|
#full_width? ⇒ Boolean
233
234
235
|
# File 'lib/primer/forms/dsl/input.rb', line 233
def full_width?
@full_width
end
|
#hidden? ⇒ Boolean
218
219
220
|
# File 'lib/primer/forms/dsl/input.rb', line 218
def hidden?
!!input_arguments[:hidden]
end
|
283
284
285
|
# File 'lib/primer/forms/dsl/input.rb', line 283
def input?
true
end
|
#invalid? ⇒ Boolean
214
215
216
|
# File 'lib/primer/forms/dsl/input.rb', line 214
def invalid?
supports_validation? && !valid?
end
|
#label ⇒ Object
265
266
267
|
# File 'lib/primer/forms/dsl/input.rb', line 265
def label
raise_for_abstract_method!(__method__)
end
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
# File 'lib/primer/forms/dsl/input.rb', line 169
def merge_input_arguments!(arguments)
arguments.each do |k, v|
case k
when :class, :classes, "class", "classes"
add_input_classes(v)
when :aria, "aria"
v.each do |aria_k, aria_v|
add_input_aria(aria_k, aria_v)
end
when :data, "data"
v.each do |data_k, data_v|
add_input_data(data_k, data_v)
end
else
@input_arguments[k] = v
end
end
end
|
#name ⇒ Object
261
262
263
|
# File 'lib/primer/forms/dsl/input.rb', line 261
def name
raise_for_abstract_method!(__method__)
end
|
163
164
165
|
# File 'lib/primer/forms/dsl/input.rb', line 163
def remove_input_data(key)
input_data.delete(key)
end
|
#render_caption_template ⇒ Object
206
207
208
|
# File 'lib/primer/forms/dsl/input.rb', line 206
def render_caption_template
form.render_caption_template(caption_template_name)
end
|
#required? ⇒ Boolean
222
223
224
225
226
227
|
# File 'lib/primer/forms/dsl/input.rb', line 222
def required?
input_arguments[:required] ||
input_arguments[:aria_required] ||
input_arguments[:"aria-required"] ||
input_arguments.dig(:aria, :required)
end
|
#size ⇒ Object
237
238
239
|
# File 'lib/primer/forms/dsl/input.rb', line 237
def size
@size ||= SIZE_MAPPINGS.include?(@size) ? @size : DEFAULT_SIZE
end
|
#supports_validation? ⇒ Boolean
287
288
289
|
# File 'lib/primer/forms/dsl/input.rb', line 287
def supports_validation?
true
end
|
#to_component ⇒ Object
273
274
275
|
# File 'lib/primer/forms/dsl/input.rb', line 273
def to_component
raise_for_abstract_method!(__method__)
end
|
#type ⇒ Object
269
270
271
|
# File 'lib/primer/forms/dsl/input.rb', line 269
def type
raise_for_abstract_method!(__method__)
end
|
#valid? ⇒ Boolean
210
211
212
|
# File 'lib/primer/forms/dsl/input.rb', line 210
def valid?
supports_validation? && validation_messages.empty? && !@invalid
end
|
#validation_arguments ⇒ Object
291
292
293
294
295
296
297
|
# File 'lib/primer/forms/dsl/input.rb', line 291
def validation_arguments
{
class: "FormControl-inlineValidation",
id: validation_id,
hidden: valid? || validation_messages.empty?
}
end
|
#validation_error_icon_target ⇒ Object
307
308
309
|
# File 'lib/primer/forms/dsl/input.rb', line 307
def validation_error_icon_target
""
end
|
#validation_id ⇒ Object
188
189
190
|
# File 'lib/primer/forms/dsl/input.rb', line 188
def validation_id
ids[:validation]
end
|
#validation_message_arguments ⇒ Object
299
300
301
|
# File 'lib/primer/forms/dsl/input.rb', line 299
def validation_message_arguments
{}
end
|
#validation_messages ⇒ Object
245
246
247
248
249
250
251
252
253
254
|
# File 'lib/primer/forms/dsl/input.rb', line 245
def validation_messages
@validation_messages ||=
if validation_message
[validation_message]
elsif builder.object.respond_to?(:errors)
name ? builder.object.errors.full_messages_for(name) : []
else
[]
end
end
|
#validation_success_icon_target ⇒ Object
303
304
305
|
# File 'lib/primer/forms/dsl/input.rb', line 303
def validation_success_icon_target
""
end
|