Sha256: 96e0db2b6137f0714d64685d577f86da5f816a55f2c96863771206c80396dd52

Contents?: true

Size: 1.22 KB

Versions: 2

Compression:

Stored size: 1.22 KB

Contents

module HotwireCombobox::Component::Customizable
  CUSTOMIZABLE_ELEMENTS = %i[
    fieldset
    label
    hidden_field
    main_wrapper
    input
    handle
    listbox
    dialog
    dialog_wrapper
    dialog_label
    dialog_input
    dialog_listbox
  ].freeze

  PROTECTED_ATTRS = %i[
    id
    name
    value
    open
    role
    hidden
    for
  ].freeze

  CUSTOMIZABLE_ELEMENTS.each do |element|
    define_method "customize_#{element}" do |**attrs|
      customize element, **attrs
    end
  end

  private
    def custom_attrs
      @custom_attrs ||= Hash.new { |h, k| h[k] = {} }
    end

    def customize(element, **attrs)
      element = element.to_sym.presence_in(CUSTOMIZABLE_ELEMENTS)
      sanitized_attrs = attrs.deep_symbolize_keys.except(*PROTECTED_ATTRS)

      custom_attrs.store element, sanitized_attrs
    end

    def apply_customizations_to(element, base: {})
      custom = custom_attrs[element]

      coalesce = ->(key, value) do
        if custom.has_key?(key) && (value.is_a?(String) || value.is_a?(Array))
          view.token_list(value, custom.delete(key))
        else
          value
        end
      end

      default = base.map { |k, v| [ k, coalesce.(k, v) ] }.to_h

      custom.deep_merge default
    end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
hotwire_combobox-0.3.2 app/presenters/hotwire_combobox/component/customizable.rb
hotwire_combobox-0.3.1 app/presenters/hotwire_combobox/component/customizable.rb