openfoodfoundation/openfoodnetwork

View on GitHub
app/components/searchable_dropdown_component.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

class SearchableDropdownComponent < ViewComponent::Base
  REMOVED_SEARCH_PLUGIN = { 'tom-select-options-value': '{ "plugins": [] }' }.freeze
  MINIMUM_OPTIONS_FOR_SEARCH_FIELD = 11 # at least 11 options are required for the search field

  def initialize(
    form:,
    name:,
    options:,
    selected_option:,
    placeholder_value:,
    include_blank: false,
    aria_label: ''
  )
    @f = form
    @name = name
    @options = options
    @selected_option = selected_option
    @placeholder_value = placeholder_value
    @include_blank = include_blank
    @aria_label = aria_label
  end

  private

  attr_reader :f, :name, :options, :selected_option, :placeholder_value, :include_blank, :aria_label

  def classes
    "fullwidth #{remove_search_plugin? ? 'no-input' : ''}"
  end

  def data
    {
      controller: "tom-select",
      'tom-select-placeholder-value': placeholder_value
    }.merge(remove_search_plugin? ? REMOVED_SEARCH_PLUGIN : {})
  end

  def remove_search_plugin?
    @remove_search_plugin ||= options.count < MINIMUM_OPTIONS_FOR_SEARCH_FIELD
  end
end