Class: Primer::Forms::Dsl::Input
- Inherits:
-
Object
- Object
- Primer::Forms::Dsl::Input
show all
- Includes:
- ClassNameHelper
- Defined in:
- app/lib/primer/forms/dsl/input.rb
Overview
Direct Known Subclasses
ActionMenuInput, AutoCompleteInput, ButtonInput, CheckBoxGroupInput, CheckBoxInput, FieldsetGroupInput, 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",
:xsmall => "FormControl-input-width--xsmall",
: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.
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
# File 'app/lib/primer/forms/dsl/input.rb', line 72
def initialize(builder:, form:, **system_arguments)
@builder = builder
@form = form
@input_arguments = system_arguments
@input_arguments.delete(:id) unless @input_arguments[:id].present?
@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) { true }
@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
@label_arguments[:for] = @input_arguments[:id] if @input_arguments[:id].present?
@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[:character_limit_caption] = "character_limit-#{@base_id}" if character_limit?
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.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def base_id
@base_id
end
|
#builder ⇒ Object
Returns the value of attribute builder.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def builder
@builder
end
|
#caption ⇒ Object
Returns the value of attribute caption.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def caption
@caption
end
|
Returns the value of attribute form.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def form
@form
end
|
Returns the value of attribute form_control.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def form_control
@form_control
end
|
#ids ⇒ Object
Returns the value of attribute ids.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def ids
@ids
end
|
Returns the value of attribute input_arguments.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def input_arguments
@input_arguments
end
|
#label_arguments ⇒ Object
Returns the value of attribute label_arguments.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def label_arguments
@label_arguments
end
|
#validation_message ⇒ Object
Returns the value of attribute validation_message.
68
69
70
|
# File 'app/lib/primer/forms/dsl/input.rb', line 68
def validation_message
@validation_message
end
|
Instance Method Details
162
163
164
165
166
167
168
169
170
|
# File 'app/lib/primer/forms/dsl/input.rb', line 162
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
|
150
151
152
153
154
|
# File 'app/lib/primer/forms/dsl/input.rb', line 150
def add_input_classes(*class_names)
input_arguments[:class] = class_names(
input_arguments[:class], *class_names
)
end
|
172
173
174
|
# File 'app/lib/primer/forms/dsl/input.rb', line 172
def add_input_data(key, value)
input_data[key] = value
end
|
#add_label_classes(*class_names) ⇒ Object
156
157
158
159
160
|
# File 'app/lib/primer/forms/dsl/input.rb', line 156
def add_label_classes(*class_names)
label_arguments[:class] = class_names(
label_arguments[:class], *class_names
)
end
|
#autofocus! ⇒ Object
289
290
291
|
# File 'app/lib/primer/forms/dsl/input.rb', line 289
def autofocus!
input_arguments[:autofocus] = true
end
|
#caption? ⇒ Boolean
210
211
212
|
# File 'app/lib/primer/forms/dsl/input.rb', line 210
def caption?
caption.present?
end
|
#caption_id ⇒ Object
206
207
208
|
# File 'app/lib/primer/forms/dsl/input.rb', line 206
def caption_id
ids[:caption]
end
|
#caption_template? ⇒ Boolean
214
215
216
217
218
|
# File 'app/lib/primer/forms/dsl/input.rb', line 214
def caption_template?
return false unless form
form.caption_template?(caption_template_name)
end
|
#character_limit? ⇒ Boolean
224
225
226
|
# File 'app/lib/primer/forms/dsl/input.rb', line 224
def character_limit?
false
end
|
#character_limit_id ⇒ Object
228
229
230
|
# File 'app/lib/primer/forms/dsl/input.rb', line 228
def character_limit_id
ids[:character_limit_caption]
end
|
#character_limit_target_prefix ⇒ Object
232
233
234
235
236
237
238
239
240
241
|
# File 'app/lib/primer/forms/dsl/input.rb', line 232
def character_limit_target_prefix
case type
when :text_field
"primer-text-field"
when :text_area
"primer-text-area"
else
""
end
end
|
#disabled? ⇒ Boolean
262
263
264
|
# File 'app/lib/primer/forms/dsl/input.rb', line 262
def disabled?
!!input_arguments[:disabled]
end
|
#focusable? ⇒ Boolean
320
321
322
|
# File 'app/lib/primer/forms/dsl/input.rb', line 320
def focusable?
false
end
|
#full_width? ⇒ Boolean
266
267
268
|
# File 'app/lib/primer/forms/dsl/input.rb', line 266
def full_width?
@full_width
end
|
#hidden? ⇒ Boolean
251
252
253
|
# File 'app/lib/primer/forms/dsl/input.rb', line 251
def hidden?
!!input_arguments[:hidden]
end
|
#id ⇒ Object
293
294
295
|
# File 'app/lib/primer/forms/dsl/input.rb', line 293
def id
@input_arguments[:id]
end
|
324
325
326
|
# File 'app/lib/primer/forms/dsl/input.rb', line 324
def input?
true
end
|
#invalid? ⇒ Boolean
247
248
249
|
# File 'app/lib/primer/forms/dsl/input.rb', line 247
def invalid?
supports_validation? && !valid?
end
|
#label ⇒ Object
306
307
308
|
# File 'app/lib/primer/forms/dsl/input.rb', line 306
def label
raise_for_abstract_method!(__method__)
end
|
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
|
# File 'app/lib/primer/forms/dsl/input.rb', line 183
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
302
303
304
|
# File 'app/lib/primer/forms/dsl/input.rb', line 302
def name
raise_for_abstract_method!(__method__)
end
|
177
178
179
|
# File 'app/lib/primer/forms/dsl/input.rb', line 177
def remove_input_data(key)
input_data.delete(key)
end
|
#render_caption_template ⇒ Object
220
221
222
|
# File 'app/lib/primer/forms/dsl/input.rb', line 220
def render_caption_template
form.render_caption_template(caption_template_name)
end
|
#required? ⇒ Boolean
255
256
257
258
259
260
|
# File 'app/lib/primer/forms/dsl/input.rb', line 255
def required?
input_arguments[:required] ||
input_arguments[:aria_required] ||
input_arguments[:"aria-required"] ||
input_arguments.dig(:aria, :required)
end
|
#size ⇒ Object
270
271
272
|
# File 'app/lib/primer/forms/dsl/input.rb', line 270
def size
@size ||= SIZE_MAPPINGS.include?(@size) ? @size : DEFAULT_SIZE
end
|
#supports_validation? ⇒ Boolean
328
329
330
|
# File 'app/lib/primer/forms/dsl/input.rb', line 328
def supports_validation?
true
end
|
#to_component ⇒ Object
314
315
316
|
# File 'app/lib/primer/forms/dsl/input.rb', line 314
def to_component
raise_for_abstract_method!(__method__)
end
|
#type ⇒ Object
310
311
312
|
# File 'app/lib/primer/forms/dsl/input.rb', line 310
def type
raise_for_abstract_method!(__method__)
end
|
#valid? ⇒ Boolean
243
244
245
|
# File 'app/lib/primer/forms/dsl/input.rb', line 243
def valid?
supports_validation? && validation_messages.empty? && !@invalid
end
|
#validation_arguments ⇒ Object
332
333
334
335
336
337
338
|
# File 'app/lib/primer/forms/dsl/input.rb', line 332
def validation_arguments
{
class: "FormControl-inlineValidation",
id: validation_id,
hidden: valid? || validation_messages.empty?
}
end
|
#validation_error_icon_target ⇒ Object
348
349
350
|
# File 'app/lib/primer/forms/dsl/input.rb', line 348
def validation_error_icon_target
""
end
|
#validation_id ⇒ Object
202
203
204
|
# File 'app/lib/primer/forms/dsl/input.rb', line 202
def validation_id
ids[:validation]
end
|
#validation_message_arguments ⇒ Object
340
341
342
|
# File 'app/lib/primer/forms/dsl/input.rb', line 340
def validation_message_arguments
{}
end
|
#validation_messages ⇒ Object
278
279
280
281
282
283
284
285
286
287
|
# File 'app/lib/primer/forms/dsl/input.rb', line 278
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
344
345
346
|
# File 'app/lib/primer/forms/dsl/input.rb', line 344
def validation_success_icon_target
""
end
|
#value ⇒ Object
297
298
299
|
# File 'app/lib/primer/forms/dsl/input.rb', line 297
def value
@input_arguments[:value]
end
|
#values_disambiguate_template_names? ⇒ Boolean
Whether or not the value: argument should be used to determine the caption template
for a given field. This is useful in especially radio button groups where each option
has the same name but a different value. Check box groups where the values are submitted
as an array also use this feature, since each check box also has the same name.
356
357
358
|
# File 'app/lib/primer/forms/dsl/input.rb', line 356
def values_disambiguate_template_names?
false
end
|