Controlled
Choose one
<.radio_group
name="patterns-rg"
class="radio-group"
items={[
%{value: "lorem", label: "Lorem ipsum dolor sit amet"},
%{value: "duis", label: "Duis dictum gravida odio ac pharetra?"},
%{value: "donec", label: "Donec condimentum ex mi"}
]}
value={@value}
controlled
on_value_change="patterns_radio_value"
>
<:label>Choose one</:label>
<:item_control><.heroicon name="hero-check" class="data-checked" /></:item_control>
</.radio_group>
def mount(_params, _session, socket) do
{:ok, assign(socket, :value, "lorem")}
end
def handle_event("patterns_radio_value", %{"value" => v}, socket) do
{:noreply, assign(socket, :value, v)}
end
Dynamic items
Choose one
<div class="flex flex-col gap-space w-full max-w-xl">
<div class="flex flex-wrap gap-space-sm">
<.action phx-click="add_item" class="button ui-size-sm ui-accent">
<.heroicon name="hero-plus" /> Add item
</.action>
<.action phx-click="reset" class="button ui-size-sm ui-alert">
Reset
</.action>
</div>
<.radio_group
id={"patterns-dynamic-#{@items_version}"}
name="dynamic-rg"
class="radio-group"
items={@items}
value={@value}
controlled
on_value_change="patterns_dynamic_value"
>
<:label>Choose one</:label>
<:item_control><.heroicon name="hero-check" class="data-checked" /></:item_control>
</.radio_group>
</div>
defmodule MyAppWeb.RadioGroupDynamicDemoLive do
use MyAppWeb, :live_view
@impl true
def mount(_params, _session, socket) do
initial = [
%{value: "lorem", label: "Lorem ipsum dolor sit amet"},
%{value: "duis", label: "Duis dictum gravida odio ac pharetra?"},
%{value: "donec", label: "Donec condimentum ex mi"}
]
{:ok,
socket
|> assign(:items, initial)
|> assign(:value, "lorem")
|> assign(:next_id, 1)
|> assign(:items_version, 0)}
end
@impl true
def handle_event("add_item", _params, socket) do
id = "item-#{socket.assigns.next_id}"
item = %{value: id, label: "Item #{socket.assigns.next_id}"}
{:noreply,
socket
|> assign(:items, socket.assigns.items ++ [item])
|> assign(:next_id, socket.assigns.next_id + 1)
|> update(:items_version, &(&1 + 1))}
end
@impl true
def handle_event("reset", _params, socket) do
initial = [
%{value: "lorem", label: "Lorem ipsum dolor sit amet"},
%{value: "duis", label: "Duis dictum gravida odio ac pharetra?"},
%{value: "donec", label: "Donec condimentum ex mi"}
]
{:noreply,
socket
|> assign(:items, initial)
|> assign(:value, "lorem")
|> assign(:next_id, 1)
|> update(:items_version, &(&1 + 1))}
end
@impl true
def handle_event("patterns_dynamic_value", %{"value" => v}, socket) do
{:noreply, assign(socket, :value, v)}
end
@impl true
def render(assigns) do
~H"""
<div class="flex flex-col gap-space w-full max-w-xl">
<div class="flex flex-wrap gap-space-sm">
<.action phx-click="add_item" class="button ui-size-sm ui-accent">
<.heroicon name="hero-plus" /> Add item
</.action>
<.action phx-click="reset" class="button ui-size-sm ui-alert">
Reset
</.action>
</div>
<.radio_group
id={"patterns-dynamic-#{@items_version}"}
name="dynamic-rg"
class="radio-group"
items={@items}
value={@value}
controlled
on_value_change="patterns_dynamic_value"
>
<:label>Choose one</:label>
<:item_control><.heroicon name="hero-check" class="data-checked" /></:item_control>
</.radio_group>
</div>
"""
end
end