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, AutoCompleteInput, 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
Instance Attribute Summary collapse
Instance Method Summary
collapse
#class_names
Constructor Details
#initialize(builder:, form:, **system_arguments) ⇒ Input
Returns a new instance of Input.
54
55
56
57
58
59
60
61
62
63
64
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
|
# File 'lib/primer/forms/dsl/input.rb', line 54
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[:for] = id if id.present?
@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)
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.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def base_id
@base_id
end
|
#builder ⇒ Object
Returns the value of attribute builder.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def builder
@builder
end
|
#caption ⇒ Object
Returns the value of attribute caption.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def caption
@caption
end
|
Returns the value of attribute form.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def form
@form
end
|
Returns the value of attribute form_control.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def form_control
@form_control
end
|
#ids ⇒ Object
Returns the value of attribute ids.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def ids
@ids
end
|
Returns the value of attribute input_arguments.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def input_arguments
@input_arguments
end
|
#label_arguments ⇒ Object
Returns the value of attribute label_arguments.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def label_arguments
@label_arguments
end
|
#validation_message ⇒ Object
Returns the value of attribute validation_message.
50
51
52
|
# File 'lib/primer/forms/dsl/input.rb', line 50
def validation_message
@validation_message
end
|
Instance Method Details
138
139
140
141
142
143
144
145
146
|
# File 'lib/primer/forms/dsl/input.rb', line 138
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
|
126
127
128
129
130
|
# File 'lib/primer/forms/dsl/input.rb', line 126
def add_input_classes(*class_names)
input_arguments[:class] = class_names(
input_arguments[:class], *class_names
)
end
|
148
149
150
|
# File 'lib/primer/forms/dsl/input.rb', line 148
def add_input_data(key, value)
input_data[key] = value
end
|
#add_label_classes(*class_names) ⇒ Object
132
133
134
135
136
|
# File 'lib/primer/forms/dsl/input.rb', line 132
def add_label_classes(*class_names)
label_arguments[:class] = class_names(
label_arguments[:class], *class_names
)
end
|
#autofocus! ⇒ Object
241
242
243
|
# File 'lib/primer/forms/dsl/input.rb', line 241
def autofocus!
input_arguments[:autofocus] = true
end
|
#caption? ⇒ Boolean
185
186
187
|
# File 'lib/primer/forms/dsl/input.rb', line 185
def caption?
caption.present?
end
|
#caption_id ⇒ Object
181
182
183
|
# File 'lib/primer/forms/dsl/input.rb', line 181
def caption_id
ids[:caption]
end
|
#caption_template? ⇒ Boolean
189
190
191
192
193
|
# File 'lib/primer/forms/dsl/input.rb', line 189
def caption_template?
return false unless form
form.caption_template?(caption_template_name)
end
|
#disabled? ⇒ Boolean
218
219
220
|
# File 'lib/primer/forms/dsl/input.rb', line 218
def disabled?
!!input_arguments[:disabled]
end
|
#focusable? ⇒ Boolean
267
268
269
|
# File 'lib/primer/forms/dsl/input.rb', line 267
def focusable?
false
end
|
#full_width? ⇒ Boolean
222
223
224
|
# File 'lib/primer/forms/dsl/input.rb', line 222
def full_width?
@full_width
end
|
#hidden? ⇒ Boolean
207
208
209
|
# File 'lib/primer/forms/dsl/input.rb', line 207
def hidden?
!!input_arguments[:hidden]
end
|
#id ⇒ Object
245
246
247
|
# File 'lib/primer/forms/dsl/input.rb', line 245
def id
@input_arguments[:id]
end
|
271
272
273
|
# File 'lib/primer/forms/dsl/input.rb', line 271
def input?
true
end
|
#invalid? ⇒ Boolean
203
204
205
|
# File 'lib/primer/forms/dsl/input.rb', line 203
def invalid?
supports_validation? && !valid?
end
|
#label ⇒ Object
254
255
256
|
# File 'lib/primer/forms/dsl/input.rb', line 254
def label
raise_for_abstract_method!(__method__)
end
|
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/primer/forms/dsl/input.rb', line 158
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
250
251
252
|
# File 'lib/primer/forms/dsl/input.rb', line 250
def name
raise_for_abstract_method!(__method__)
end
|
153
154
155
|
# File 'lib/primer/forms/dsl/input.rb', line 153
def remove_input_data(key)
input_data.delete(key)
end
|
#render_caption_template ⇒ Object
195
196
197
|
# File 'lib/primer/forms/dsl/input.rb', line 195
def render_caption_template
form.render_caption_template(caption_template_name)
end
|
#required? ⇒ Boolean
211
212
213
214
215
216
|
# File 'lib/primer/forms/dsl/input.rb', line 211
def required?
input_arguments[:required] ||
input_arguments[:aria_required] ||
input_arguments[:"aria-required"] ||
input_arguments.dig(:aria, :required)
end
|
#size ⇒ Object
226
227
228
|
# File 'lib/primer/forms/dsl/input.rb', line 226
def size
@size ||= SIZE_MAPPINGS.include?(@size) ? @size : DEFAULT_SIZE
end
|
#supports_validation? ⇒ Boolean
275
276
277
|
# File 'lib/primer/forms/dsl/input.rb', line 275
def supports_validation?
true
end
|
#to_component ⇒ Object
262
263
264
|
# File 'lib/primer/forms/dsl/input.rb', line 262
def to_component
raise_for_abstract_method!(__method__)
end
|
#type ⇒ Object
258
259
260
|
# File 'lib/primer/forms/dsl/input.rb', line 258
def type
raise_for_abstract_method!(__method__)
end
|
#valid? ⇒ Boolean
199
200
201
|
# File 'lib/primer/forms/dsl/input.rb', line 199
def valid?
supports_validation? && validation_messages.empty? && !@invalid
end
|
#validation_arguments ⇒ Object
279
280
281
282
283
284
285
|
# File 'lib/primer/forms/dsl/input.rb', line 279
def validation_arguments
{
class: "FormControl-inlineValidation",
id: validation_id,
hidden: valid? || validation_messages.empty?
}
end
|
#validation_error_icon_target ⇒ Object
295
296
297
|
# File 'lib/primer/forms/dsl/input.rb', line 295
def validation_error_icon_target
""
end
|
#validation_id ⇒ Object
177
178
179
|
# File 'lib/primer/forms/dsl/input.rb', line 177
def validation_id
ids[:validation]
end
|
#validation_message_arguments ⇒ Object
287
288
289
|
# File 'lib/primer/forms/dsl/input.rb', line 287
def validation_message_arguments
{}
end
|
#validation_messages ⇒ Object
230
231
232
233
234
235
236
237
238
239
|
# File 'lib/primer/forms/dsl/input.rb', line 230
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
291
292
293
|
# File 'lib/primer/forms/dsl/input.rb', line 291
def validation_success_icon_target
""
end
|