Class: IronAdmin::Form::BelongsToAutocompleteComponent

Inherits:
ViewComponent::Base
  • Object
show all
Includes:
Concerns::FormInputBehavior
Defined in:
app/components/iron_admin/form/belongs_to_autocomplete_component.rb

Overview

Renders an autocomplete input for belongs_to associations with many records.

Used automatically when association has more than 100 records, or can be forced via autocomplete: true option.

Examples:

Autocomplete for large association

render IronAdmin::Form::BelongsToAutocompleteComponent.new(
  name: "record[customer_id]",
  resource_name: "customers",
  selected_id: @record.customer_id,
  selected_label: @record.customer&.name
)

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Concerns::FormInputBehavior

#effectively_disabled?, #field_readonly?, #theme

Constructor Details

#initialize(name:, resource_name:, selected_id: nil, selected_label: nil, placeholder: nil, disabled: false, has_error: false, field: nil, current_user: nil) ⇒ BelongsToAutocompleteComponent

Returns a new instance of BelongsToAutocompleteComponent.

Parameters:

  • name (String)

    Input name

  • resource_name (String)

    Resource for autocomplete

  • selected_id (Integer, nil) (defaults to: nil)

    Selected ID

  • selected_label (String, nil) (defaults to: nil)

    Selected label

  • placeholder (String, nil) (defaults to: nil)

    Placeholder

  • disabled (Boolean) (defaults to: false)

    Disabled state

  • has_error (Boolean) (defaults to: false)

    Error state

  • field (IronAdmin::Field, nil) (defaults to: nil)

    Field config

  • current_user (Object, nil) (defaults to: nil)

    Current user



50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 50

def initialize(name:, resource_name:, selected_id: nil, selected_label: nil,
               placeholder: nil, disabled: false, has_error: false,
               field: nil, current_user: nil)
  @name = name
  @resource_name = resource_name
  @selected_id = selected_id
  @selected_label = selected_label
  @placeholder = placeholder || "Search..."
  @disabled = disabled
  @has_error = has_error
  @field = field
  @current_user = current_user
end

Instance Attribute Details

#autocomplete_urlString

Returns Autocomplete endpoint URL.

Returns:

  • (String)

    Autocomplete endpoint URL



39
40
41
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 39

def autocomplete_url
  @autocomplete_url
end

#has_errorBoolean (readonly)

Returns Whether input has error state.

Returns:

  • (Boolean)

    Whether input has error state



36
37
38
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 36

def has_error
  @has_error
end

#nameString (readonly)

Returns Input name attribute.

Returns:

  • (String)

    Input name attribute



21
22
23
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 21

def name
  @name
end

#placeholderString (readonly)

Returns Placeholder text.

Returns:

  • (String)

    Placeholder text



33
34
35
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 33

def placeholder
  @placeholder
end

#resource_nameString (readonly)

Returns Resource name for autocomplete URL.

Returns:

  • (String)

    Resource name for autocomplete URL



24
25
26
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 24

def resource_name
  @resource_name
end

#selected_idInteger? (readonly)

Returns Currently selected ID.

Returns:

  • (Integer, nil)

    Currently selected ID



27
28
29
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 27

def selected_id
  @selected_id
end

#selected_labelString? (readonly)

Returns Display label for selected record.

Returns:

  • (String, nil)

    Display label for selected record



30
31
32
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 30

def selected_label
  @selected_label
end

Instance Method Details

#before_rendervoid

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Sets the autocomplete URL before rendering.



67
68
69
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 67

def before_render
  self.autocomplete_url = helpers.iron_admin.autocomplete_path(resource_name)
end

#component_idString

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns Unique component DOM ID.

Returns:

  • (String)

    Unique component DOM ID



96
97
98
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 96

def component_id
  @component_id ||= "autocomplete-#{SecureRandom.hex(4)}"
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns CSS classes for autocomplete dropdown panel.

Returns:

  • (String)

    CSS classes for autocomplete dropdown panel



83
84
85
86
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 83

def dropdown_classes
  "absolute z-50 mt-1 w-full max-h-60 overflow-auto #{theme.border_radius} " \
    "#{theme.card_bg} border #{theme.input_border} shadow-lg"
end

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns CSS classes for dropdown list items.

Returns:

  • (String)

    CSS classes for dropdown list items



90
91
92
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 90

def dropdown_item_classes
  "px-3 py-2 text-sm cursor-pointer hover:bg-gray-100 #{theme.body_text}"
end

#input_classesString

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns CSS classes for text input field.

Returns:

  • (String)

    CSS classes for text input field



73
74
75
76
77
78
79
# File 'app/components/iron_admin/form/belongs_to_autocomplete_component.rb', line 73

def input_classes
  base = "block w-full border px-3 py-2 text-sm shadow-sm outline-none transition duration-150 ease-in-out " \
         "#{theme.border_radius} #{theme.input_border} #{theme.card_bg} #{theme.body_text} #{theme.input_focus}"
  base += " !border-red-400 !focus:border-red-500 !focus:ring-red-500/20" if has_error
  base += " bg-gray-50 cursor-not-allowed" if effectively_disabled?
  base
end