Class: TristateRadioInput

Inherits:
Formtastic::Inputs::RadioInput
  • Object
show all
Defined in:
app/inputs/tristate_radio_input.rb

Overview

It may also be appropriate to put this file in app/inputs

Constant Summary collapse

UNSET_KEY =

Now equals :null. Should equal one of ActiveModel::Type::Boolean::NULL_VALUES

Mind ActiveAdmin status resolving logic: in status tag builder the value is lowercased before casting into Boolean, and the keyword for nil is "unset". So if we have lowercase "unset", translations from ru.formtastic.unset will be overriden by ru.active_admin.status_tag.unset.

FormtasticTristateRadio.config.unset_key

Instance Method Summary collapse

Instance Method Details

#choice_html_options(choice) ⇒ Hash

Adds { selected: true } to the original options Hash if the choice value equals attribute value (to ultimately set for checked="checked")

Returns:

  • (Hash)

    HTML options for the <input type="radio" /> tag

See Also:



22
23
24
# File 'app/inputs/tristate_radio_input.rb', line 22

def choice_html_options(choice)
  super.merge({ checked: selected?(choice) })
end

#collection_for_booleanArray<[String, (Boolean|String|Symbol)]>

Returns an array of “choices”, each presented as an array with 2 items: HTML label text and HTML input value.

Examples:

Original method

def collection_for_boolean
  true_text  = options[:true]  || Formtastic::I18n.t(:yes)
  false_text = options[:false] || Formtastic::I18n.t(:no)
  [ [true_text, true], [false_text, false] ]
end

collection_for_boolean #=> [["Да", true], ["Нет", false]]

This patched method

collection_for_boolean #=> [["Да", true], ["Нет", false], ["Неизвестно", :null]]

Returns:

  • (Array<[String, (Boolean|String|Symbol)]>)

    an array of “choices”, each presented as an array with 2 items: HTML label text and HTML input value

See Also:



43
44
45
# File 'app/inputs/tristate_radio_input.rb', line 43

def collection_for_boolean
  super + [[label_text_for_unset, UNSET_KEY]]
end

#label_text_for_unsetString

Checks translation passed as option, then checks in locale

Examples:

label_text_for_unset #=> "Неизвестно"

Returns:

  • (String)

    Label of the radio that stands for the unknown choice

Raises:



57
58
59
# File 'app/inputs/tristate_radio_input.rb', line 57

def label_text_for_unset
  options.fetch(:null, Formtastic::I18n.t(UNSET_KEY)).presence or fail FormtasticTristateRadio::I18n::Error.new(I18n.locale, UNSET_KEY)
end

#selected?(choice) ⇒ Boolean

Note:

For this to work, ActiveModel::Type::Boolean must be patched to resolve UNSET_KEY as nil.

Returns answer to the question “Is the passed option selected?”.

Examples:

For each item of collection it runs:

selected?(["Да", true]) #=> false
selected?(["Нет", false]) #=> false
selected?(["Неизвестно", :null]) #=> true

Parameters:

  • choice (Array<[String, (Boolean|String|Symbol)]>)

Returns:

  • (Boolean)

    answer to the question “Is the passed option selected?”



73
74
75
# File 'app/inputs/tristate_radio_input.rb', line 73

def selected?(choice)
  ActiveModel::Type::Boolean.new.cast(choice_value(choice)) == object.public_send(method)
end