Class: HakumiComponents::Cascader::Component

Inherits:
BaseComponent
  • Object
show all
Extended by:
T::Sig
Includes:
HakumiComponents::Concerns::SelectionControl
Defined in:
app/components/hakumi_components/cascader/component.rb

Constant Summary collapse

TRIGGERS =
T.let([ :click, :hover ].freeze, T::Array[Symbol])

Constants inherited from BaseComponent

BaseComponent::ControllerOptions, BaseComponent::DateInput, BaseComponent::DateLikeValue, BaseComponent::DimensionInput, BaseComponent::HtmlPayloadInput, BaseComponent::I18nOptionValue, BaseComponent::PresenceArray, BaseComponent::PresenceScalar, BaseComponent::PresenceValue, BaseComponent::RawHtmlInput, BaseComponent::SIZES, BaseComponent::SizeValue, BaseComponent::SymbolInput

Instance Method Summary collapse

Methods included from HakumiComponents::Concerns::SelectionControl

#selection_control_allow_clear, #selection_control_contract, #selection_control_disabled, #selection_control_has_value?, #selection_control_placeholder, #selection_control_size, #selection_control_value

Methods included from HakumiComponents::Concerns::SelectionControlInterface

#selection_control_allow_clear, #selection_control_contract, #selection_control_disabled, #selection_control_has_value?, #selection_control_placeholder, #selection_control_size, #selection_control_value

Methods included from HakumiComponents::Concerns::FormField

#describedby_ids, #error?, #error_message, #form_field_caption, #form_field_contract, #form_field_errors, #form_field_html_options, #form_field_label, #form_field_name, #form_field_required, #form_field_rules, #form_field_standalone, #form_item_attributes, #form_item_classes, #input_id, #render_caption, #render_error, #render_explain, #render_label, #standalone?

Methods included from HakumiComponents::Concerns::FormFieldInterface

#form_field_contract

Methods inherited from BaseComponent

#append_data_token, boolean_html_param, #build_inline_style, cast_boolean, #cast_boolean, #class_names, #component_classes, #data_attributes_from, #dimension_to_css, #ensure_dom_id!, float_html_param, #generate_id, #html_classes, html_param, html_primitive_param, #html_style, #i18n_scope, integer_html_param, #merge_attributes, #render_value, #size_to_pixels, #stimulus_attrs, string_html_param, string_or_symbol_array_html_param, symbol_html_param, #t_default, #translate_with_default, #validate_inclusion!, #validate_required!, #value_present?

Constructor Details

#initialize(name: nil, options: [], label: nil, caption: nil, value: [], placeholder: nil, size: :default, disabled: false, required: false, allow_clear: true, show_search: false, change_on_select: false, expand_trigger: :click, display_render: nil, standalone: true, rules: nil, errors: [], **html_options) ⇒ Component

Returns a new instance of Component.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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
# File 'app/components/hakumi_components/cascader/component.rb', line 35

def initialize(
  name: nil,
  options: [],
  label: nil,
  caption: nil,
  value: [],
  placeholder: nil,
  size: :default,
  disabled: false,
  required: false,
  allow_clear: true,
  show_search: false,
  change_on_select: false,
  expand_trigger: :click,
  display_render: nil,
  standalone: true,
  rules: nil,
  errors: [],
  **html_options
)
  @name = T.let(name || generate_id("cascader"), Types::FormFieldName)
  @options = T.let(
    HakumiComponents::SelectionControl::Coercion.tree_nodes(Array(options)),
    T::Array[HakumiComponents::SelectionControl::TreeNode]
  )
  @label = label
  @caption = caption
  @value = T.let(value || [], Types::FormFieldValue)
  @placeholder = T.let(placeholder || t_default(:placeholder, default: "Select"), T.nilable(String))
  @size = size
  @disabled = disabled
  @required = required
  @allow_clear = allow_clear
  @show_search = show_search
  @change_on_select = change_on_select
  @expand_trigger = expand_trigger
  @display_render = T.let(display_render, T.nilable(T.proc.params(labels: T::Array[String]).returns(String)))
  @standalone = standalone
  @rules = T.let(rules, T.nilable(T::Array[Types::ValidationRule]))
  @errors = T.let(errors, Types::FormFieldErrors)
  @html_options = T.let(html_options, Types::HtmlAttributes)
  initialize_selection_control_contract!(
    name: @name,
    label: @label,
    caption: @caption,
    value: @value,
    placeholder: @placeholder,
    size: @size,
    disabled: @disabled,
    allow_clear: @allow_clear,
    required: @required,
    standalone: @standalone,
    errors: @errors,
    html_options: @html_options,
    rules: @rules
  )

  validate_props!
end

Instance Method Details

#selected_labelObject



132
133
134
135
136
137
138
139
# File 'app/components/hakumi_components/cascader/component.rb', line 132

def selected_label
  labels = labels_for_path(Array(selection_control_value))
  return nil if labels.empty?

  return @display_render.call(labels) if @display_render

  labels.join(" / ")
end

#validate_props!Object



96
97
98
99
# File 'app/components/hakumi_components/cascader/component.rb', line 96

def validate_props!
  validate_inclusion!(:size, SIZES)
  validate_inclusion!(:expand_trigger, TRIGGERS)
end

#wrapper_attributesObject



116
117
118
119
120
121
122
123
124
125
126
127
128
129
# File 'app/components/hakumi_components/cascader/component.rb', line 116

def wrapper_attributes
  base_attrs = {
    class: wrapper_classes,
    data: {
      controller: "hakumi--cascader",
      hakumi__cascader_options_value: normalized_options.map(&:to_cascader_option).to_json,
      hakumi__cascader_value_value: Array(selection_control_value).to_json,
      hakumi__cascader_trigger_value: @expand_trigger,
      hakumi__cascader_change_on_select_value: @change_on_select,
      hakumi__cascader_disabled_value: selection_control_disabled
    }
  }
  merge_attributes(base_attrs, selection_control_html_options_without_class)
end

#wrapper_classesObject



102
103
104
105
106
107
108
109
110
111
112
113
# File 'app/components/hakumi_components/cascader/component.rb', line 102

def wrapper_classes
  class_names(
    "cascader",
    {
      lg: selection_control_size == :large,
      sm: selection_control_size == :small,
      disabled: selection_control_disabled,
      "allow-clear": selection_control_allow_clear
    },
    [ selection_control_html_class_name ]
  )
end