defmodule MishkaChelekom.Components.Combobox do
@moduledoc """
Stub module for MishkaChelekom Combobox component.
Generate the real component in your host application using:
mix mishka.ui.gen.component combobox
These stubs render plain (but functional) HTML so forms still work
end-to-end when the upstream component library is not installed.
"""
use Phoenix.Component
attr(:field, Phoenix.HTML.FormField, default: nil)
attr(:name, :string, default: nil)
attr(:label, :string, default: nil)
attr(:value, :any, default: nil)
attr(:options, :list, default: [])
attr(:required, :boolean, default: false)
attr(:errors, :list, default: [])
attr(:multiple, :boolean, default: false)
attr(:color, :string, default: nil)
attr(:variant, :string, default: nil)
attr(:rest, :global)
slot(:trigger)
slot(:inner_block)
def combobox(assigns) do
name =
cond do
assigns.name -> assigns.name
assigns.field && assigns.multiple -> assigns.field.name <> "[]"
assigns.field -> assigns.field.name
true -> nil
end
selected =
cond do
not is_nil(assigns.value) -> List.wrap(assigns.value)
assigns.field -> List.wrap(assigns.field.value)
true -> []
end
selected_strs = Enum.map(selected, &to_string/1)
assigns = assign(assigns, name: name, selected: selected, selected_strs: selected_strs)
~H"""
{msg}
{render_slot(@trigger, @selected)}
{render_slot(@inner_block)}
"""
end
defp normalize_combobox_options(options) do
Enum.map(options, fn
{label, value} -> {label, value}
value when is_atom(value) -> {Phoenix.Naming.humanize(value), value}
value -> {to_string(value), value}
end)
end
attr(:field, Phoenix.HTML.FormField, default: nil)
attr(:placeholder, :string, default: nil)
attr(:rest, :global)
def combobox_input(assigns) do
~H"""
"""
end
slot(:inner_block)
slot(:create_action)
def combobox_options(assigns) do
~H"""
{render_slot(@inner_block)}
{render_slot(@create_action)}
"""
end
attr(:value, :any, default: nil)
attr(:selected, :boolean, default: false)
attr(:rest, :global)
slot(:inner_block)
def combobox_option(assigns) do
~H"""
{render_slot(@inner_block)}
"""
end
end
defmodule MishkaChelekom.Components.TextField do
@moduledoc """
Functional fallback for MishkaChelekom TextField. Renders a real
`