Combobox · Form
Phoenix Form
<.form
for={@form}
action={~p"/combobox/form"}
method="post"
>
<.combobox field={@form[:country]} class="combobox" placeholder="Country" items={Corex.List.new([
%{label: "France", value: "fra"},
%{label: "Belgium", value: "bel"},
%{label: "Germany", value: "deu"},
%{label: "Netherlands", value: "nld"},
%{label: "Switzerland", value: "che"},
%{label: "Austria", value: "aut"}
])}>
<:label>Country</:label>
<:empty>No results</:empty>
<:trigger><.heroicon name="hero-chevron-down" /></:trigger>
<:error :let={msg}>
<.heroicon name="hero-exclamation-circle" class="icon" />
{msg}
</:error>
</.combobox>
<.action type="submit" class="button button--accent">Submit</.action>
</.form>
def combobox_form_page(conn, _params) do
phoenix_form =
Phoenix.Component.to_form(%{"country" => ""}, as: :combobox_phoenix, id: "combobox-form-phoenix")
render(conn, :combobox_form_page, phoenix_form: phoenix_form)
end
def combobox_form_submit(conn, params) do
if is_map(params["combobox_phoenix"]) do
country = params["combobox_phoenix"]["country"] || ""
conn
|> put_flash(:info, "Submitted: country=#{inspect(country)}")
|> redirect(to: ~p"/combobox/form#combobox-form-phoenix")
end
end
Phoenix Form + Ecto
<.form
for={@form}
action={~p"/combobox/form"}
method="post"
>
<.combobox field={@form[:country]} class="combobox" placeholder="Country" items={Corex.List.new([
%{label: "France", value: "fra"},
%{label: "Belgium", value: "bel"},
%{label: "Germany", value: "deu"},
%{label: "Netherlands", value: "nld"},
%{label: "Switzerland", value: "che"},
%{label: "Austria", value: "aut"}
])}>
<:label>Country</:label>
<:empty>No results</:empty>
<:trigger><.heroicon name="hero-chevron-down" /></:trigger>
<:error :let={msg}>
<.heroicon name="hero-exclamation-circle" class="icon" />
{msg}
</:error>
</.combobox>
<.action type="submit" class="button button--accent">Submit</.action>
</.form>
def combobox_form_page(conn, _params) do
changeset = MyApp.Forms.Travel.changeset_validate(%MyApp.Forms.Travel{}, %{})
validate_form =
Phoenix.Component.to_form(changeset,
as: :combobox_validate,
id: "combobox-validate-form"
)
render(conn, :combobox_form_page, validate_form: validate_form)
end
defmodule MyApp.Forms.Travel do
use Ecto.Schema
import Ecto.Changeset
embedded_schema do
field :country, :string
end
def changeset(form, attrs \\ %{}) do
form
|> cast(attrs, [:country])
|> validate_required([:country])
end
def changeset_validate(form, attrs \\ %{}) do
form
|> cast(attrs, [:country])
|> validate_required([:country], message: "can't be blank")
end
end
Native HTML Form
<form action={~p"/combobox/form"} method="post">
<input type="hidden" name="_csrf_token" value={Plug.CSRFProtection.get_csrf_token()} />
<.combobox
name="combobox_native[country]"
class="combobox"
translation={%Corex.Combobox.Translation{placeholder: "Country", empty: "No results"}}
items={Corex.List.new([
%{label: "France", value: "fra"},
%{label: "Belgium", value: "bel"},
%{label: "Germany", value: "deu"}
])}
>
<:label>Country</:label>
<:empty>No results</:empty>
<:trigger><.heroicon name="hero-chevron-down" class="icon" /></:trigger>
</.combobox>
<.action type="submit" class="button button--accent">Submit</.action>
</form>
def combobox_form_submit(conn, %{"combobox_native" => %{"country" => country}}) do
conn
|> put_flash(:info, "Submitted: country=#{inspect(country)}")
|> redirect(to: ~p"/combobox/form#combobox-form-native")
end