Sha256: 6be49e4bb542fae0df0c51dd1496e992907445ed9ed757c7ea9f5a2a79a4709c

Contents?: true

Size: 1.23 KB

Versions: 1

Compression:

Stored size: 1.23 KB

Contents

require "securerandom"

class HotwireCombobox::Listbox::Option
  def initialize(option)
    @option = option.is_a?(Hash) ? Data.new(**option) : option
  end

  def render_in(view)
    view.tag.li content, **options
  end

  def value
    option.try(:value) || option.id
  end

  def autocompletable_as
    option.try(:autocompletable_as) || option.try(:display)
  end

  def content
    option.try(:content) || option.try(:display)
  end

  private
    Data = Struct.new :id, :value, :display, :content, :blank, :filterable_as, :autocompletable_as, keyword_init: true

    attr_reader :option

    def options
      {
        id: id,
        role: :option,
        class: [ "hw-combobox__option", { "hw-combobox__option--blank": blank? } ],
        data: data,
        aria: aria
      }
    end

    def id
      @id ||= option.try(:id) || SecureRandom.uuid
    end

    def data
      {
        action: "click->hw-combobox#selectOnClick",
        filterable_as: filterable_as,
        autocompletable_as: autocompletable_as,
        value: value
      }
    end

    def aria
      { selected: false }
    end

    def filterable_as
      option.try(:filterable_as) || option.try(:display)
    end

    def blank?
      option.try(:blank).present?
    end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
hotwire_combobox-0.2.0 app/presenters/hotwire_combobox/listbox/option.rb