Packages
moon
2.76.5
2.90.5
retired
2.90.4
2.90.3
2.90.2
2.90.1
2.90.0
2.89.4
2.89.1
2.89.0
2.88.0
2.87.11
2.87.10
2.87.9
2.87.8
2.87.7
2.87.6
2.87.5
2.87.4
2.87.3
2.87.2
2.87.1
2.87.0
2.86.1
2.86.0
2.85.1
2.85.0
2.84.0
2.83.0
2.82.0
2.81.4
2.81.3
2.81.2
2.81.1
2.81.0
2.80.2
2.80.1
2.80.0
2.79.13
2.79.12
2.79.11
2.79.10
2.79.9
2.79.8
2.79.7
2.79.6
2.79.5
2.79.4
2.79.3
2.79.2
2.79.1
2.79.0
2.78.4
2.78.3
2.78.2
2.78.1
2.78.0
2.77.0
2.76.5
2.76.4
2.76.3
2.76.2
2.76.1
2.76.0
2.75.0
2.74.1
2.74.0
2.73.8
2.73.7
2.73.6
2.73.5
2.73.4
2.73.3
2.73.2
2.73.1
2.73.0
2.72.5
2.72.4
2.72.3
2.72.2
2.72.1
2.72.0
2.71.1
2.71.0
2.70.0
2.69.2
2.69.1
2.69.0
2.68.11
2.68.10
Components-based design system written in elixir
Current section
Files
Jump to
Current section
Files
lib/moon_web/examples/design/form/combobox_example/default.ex
defmodule MoonWeb.Examples.Design.Form.ComboboxExample.Default do
@moduledoc false
use Moon.StatefulComponent
use MoonWeb, :example
alias Moon.Design.Form
alias MoonWeb.Schema.User
import Moon.Helpers.Form, only: [filter_options: 2]
prop(titles, :list,
default:
[
"Wade Cooper",
"Arlene Mccoy",
"Devon Webb",
"Tom Cook",
"Tanya Fox",
"Hellen Schmidt"
]
|> Enum.map(&%{key: &1, value: String.downcase(&1)})
)
prop(changeset, :any, default: User.changeset(%User{name: nil}))
prop(filter, :string, default: "")
def handle_event("change_filter", %{"value" => filter}, socket) do
{:noreply, assign(socket, filter: filter)}
end
def handle_event("changed", params, socket) do
user = Map.get(params, "user", %{})
{:noreply,
assign(socket,
changeset: User.changeset(%User{}, user),
filter: Map.get(user, "name", "")
)}
end
def render(assigns) do
~F"""
<div class="w-full">
<div class="w-full flex flex-col lg:flex-row gap-2 justify-between">
<Form
id={"user_combo_#{size}"}
:for={size <- ~w(sm md lg)}
class="w-full"
for={@changeset}
change="changed"
submit="changed"
>
<Form.Field field={:name} label={"Size #{size}"} hint="Some hint here" {=size}>
<Form.Combobox
{=size}
filter={@filter}
options={filter_options(@titles, @filter)}
on_keyup="change_filter"
/>
</Form.Field>
</Form>
</div>
</div>
"""
end
def code() do
"""
alias Moon.Design.Form
alias MoonWeb.Schema.User
import Moon.Helpers.Form, only: [filter_options: 2]
prop(titles, :list,
default:
[
"Wade Cooper",
"Arlene Mccoy",
"Devon Webb",
"Tom Cook",
"Tanya Fox",
"Hellen Schmidt"
]
|> Enum.map(&%{key: &1, value: String.downcase(&1)})
)
prop(changeset, :any, default: User.changeset(%User{name: nil}))
prop(filter, :string, default: "")
def handle_event("change_filter", _params = %{"value" => filter}, socket) do
{:noreply, assign(socket, filter: filter)}
end
def handle_event("changed", params, socket) do
user = Map.get(params, "user", %{})
{:noreply,
assign(socket,
changeset: User.changeset(%User{}, user),
filter: Map.get(user, "name", "")
)}
end
def render(assigns) do
~F\"""
<div class="w-full">
<div class="w-full flex flex-col lg:flex-row gap-2 justify-between">
<Form
id={"user_combo_\#{size}"}
:for={size <- ~w(sm md lg)}
class="w-full"
for={@changeset}
change="changed"
>
<Form.Field field={:name} label={"Size \#{size}"} hint="Some hint here">
<Form.Combobox
{=size}
filter={@filter}
options={filter_options(@titles, @filter)}
on_keyup="change_filter"
/>
</Form.Field>
</Form>
</div>
</div>
\"""
end
"""
end
end