Class: Hatemile::Implementation::AccessibleFormImplementation

Inherits:
AccessibleForm
  • Object
show all
Defined in:
lib/hatemile/implementation/accessible_form_implementation.rb

Overview

The AccessibleFormImplementation class is official implementation of AccessibleForm interface.

Constant Summary collapse

ID_SCRIPT_LIST_VALIDATION_FIELDS =

The ID of script element that contains the list of IDs of fields with validation.

'hatemile-scriptlist-validation-fields'.freeze
ID_SCRIPT_EXECUTE_VALIDATION =

The ID of script element that execute validations on fields.

'hatemile-validation-script'.freeze
REQUIRED_FIELDS_LIST =

The client-site required fields list.

'required_fields'.freeze
PATTERN_FIELDS_LIST =

The client-site pattern fields list.

'pattern_fields'.freeze
LIMITED_FIELDS_LIST =

The client-site fields with length list.

'fields_with_length'.freeze
RANGE_FIELDS_LIST =

The client-site range fields list.

'range_fields'.freeze
WEEK_FIELDS_LIST =

The client-site week fields list.

'week_fields'.freeze
MONTH_FIELDS_LIST =

The client-site month fields list.

'month_fields'.freeze
DATETIME_FIELDS_LIST =

The client-site datetime fields list.

'datetime_fields'.freeze
TIME_FIELDS_LIST =

The client-site time fields list.

'time_fields'.freeze
DATE_FIELDS_LIST =

The client-site date fields list.

'date_fields'.freeze
EMAIL_FIELDS_LIST =

The client-site email fields list.

'email_fields'.freeze
URL_FIELDS_LIST =

The client-site URL fields list.

'url_fields'.freeze

Instance Method Summary collapse

Constructor Details

#initialize(parser) ⇒ AccessibleFormImplementation

Initializes a new object that manipulate the accessibility of the forms of parser.

Parameters:



239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 239

def initialize(parser)
  Hatemile::Helper.require_not_nil(parser)
  Hatemile::Helper.require_valid_type(
    parser,
    Hatemile::Util::Html::HTMLDOMParser
  )

  @parser = parser
  @id_generator = Hatemile::Util::IDGenerator.new('form')
  @scripts_added = false
  @script_list_fields_with_validation = nil
end

Instance Method Details

#mark_all_autocomplete_fieldsObject



312
313
314
315
316
317
318
319
320
321
322
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 312

def mark_all_autocomplete_fields
  elements = @parser.find(
    'input[autocomplete],textarea[autocomplete],form[autocomplete] ' \
    'input,form[autocomplete] textarea,[list],[form]'
  ).list_results
  elements.each do |element|
    if Hatemile::Util::CommonFunctions.is_valid_element?(element)
      mark_autocomplete_field(element)
    end
  end
end

#mark_all_invalid_fieldsObject



368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 368

def mark_all_invalid_fields
  fields = @parser.find(
    '[required],input[pattern],input[minlength],input[maxlength],' \
    'textarea[minlength],textarea[maxlength],input[type=week],' \
    'input[type=month],input[type=datetime-local],' \
    'input[type=datetime],input[type=time],input[type=date],' \
    'input[type=number],input[type=range],input[type=email],' \
    'input[type=url],[aria-required=true],input[aria-valuemin],' \
    'input[aria-valuemax]'
  ).list_results
  fields.each do |field|
    if Hatemile::Util::CommonFunctions.is_valid_element?(field)
      mark_invalid_field(field)
    end
  end
end

#mark_all_range_fieldsObject



291
292
293
294
295
296
297
298
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 291

def mark_all_range_fields
  range_fields = @parser.find('[min],[max]').list_results
  range_fields.each do |range_field|
    if Hatemile::Util::CommonFunctions.is_valid_element?(range_field)
      mark_range_field(range_field)
    end
  end
end

#mark_all_required_fieldsObject



262
263
264
265
266
267
268
269
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 262

def mark_all_required_fields
  required_fields = @parser.find('[required]').list_results
  required_fields.each do |required_field|
    if Hatemile::Util::CommonFunctions.is_valid_element?(required_field)
      mark_required_field(required_field)
    end
  end
end

#mark_autocomplete_field(autocomplete_field) ⇒ Object



302
303
304
305
306
307
308
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 302

def mark_autocomplete_field(autocomplete_field)
  aria_autocomplete = get_aria_autocomplete(autocomplete_field)

  return if aria_autocomplete.nil?

  autocomplete_field.set_attribute('aria-autocomplete', aria_autocomplete)
end

#mark_invalid_field(field) ⇒ Object



326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 326

def mark_invalid_field(field)
  if field.has_attribute?('required') ||
     (
       field.has_attribute?('aria-required') &&
       field.get_attribute('aria-required').casecmp('true').zero?
     )
    validate(field, REQUIRED_FIELDS_LIST)
  end
  validate(field, PATTERN_FIELDS_LIST) if field.has_attribute?('pattern')
  if field.has_attribute?('minlength') ||
     field.has_attribute?('maxlength')
    validate(field, LIMITED_FIELDS_LIST)
  end
  if field.has_attribute?('aria-valuemin') ||
     field.has_attribute?('aria-valuemax')
    validate(field, RANGE_FIELDS_LIST)
  end

  return unless field.has_attribute?('type')

  type_field = field.get_attribute('type').downcase
  if type_field == 'week'
    validate(field, WEEK_FIELDS_LIST)
  elsif type_field == 'month'
    validate(field, MONTH_FIELDS_LIST)
  elsif %w[datetime-local datetime].include?(type_field)
    validate(field, DATETIME_FIELDS_LIST)
  elsif type_field == 'time'
    validate(field, TIME_FIELDS_LIST)
  elsif type_field == 'date'
    validate(field, DATE_FIELDS_LIST)
  elsif %w[number range].include?(type_field)
    validate(field, RANGE_FIELDS_LIST)
  elsif type_field == 'email'
    validate(field, EMAIL_FIELDS_LIST)
  elsif type_field == 'url'
    validate(field, AccessibleFormImplementation.URL_FIELDS_LIST)
  end
end

#mark_range_field(range_field) ⇒ Object



273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 273

def mark_range_field(range_field)
  if range_field.has_attribute?('min')
    range_field.set_attribute(
      'aria-valuemin',
      range_field.get_attribute('min')
    )
  end

  return unless range_field.has_attribute?('max')

  range_field.set_attribute(
    'aria-valuemax',
    range_field.get_attribute('max')
  )
end

#mark_required_field(required_field) ⇒ Object



254
255
256
257
258
# File 'lib/hatemile/implementation/accessible_form_implementation.rb', line 254

def mark_required_field(required_field)
  return unless required_field.has_attribute?('required')

  required_field.set_attribute('aria-required', 'true')
end