defmodule RiverConnectWeb.Components.UI.RadioGroup do
@moduledoc """
Implementation of radio group component from https://ui.shadcn.com/docs/components/radio-group
## Examples:
<.radio_group name="subscription" default="monthly" on_value_changed={JS.push("plan_changed")}>
"""
use RiverConnectWeb.Components.UI, :component
@doc """
Radio group component that allows selection of one option from a set.
"""
attr :id, :string, default: nil
attr :name, :string, default: nil
attr :value, :any, default: nil, doc: "The current value of the radio group"
attr :"default-value", :any, default: nil, doc: "The default value of the radio group"
attr :"on-value-changed", :any, default: nil, doc: "Handler for value changed event"
attr :field, Phoenix.HTML.FormField,
doc: "a form field struct retrieved from the form, for example: @form[:email]"
attr :class, :string, default: nil
attr :rest, :global
slot :inner_block, required: true
def radio_group(assigns) do
assigns = prepare_assign(assigns)
assigns = assign_new(assigns, :id, fn -> "radio-group-#{System.unique_integer()}" end)
# Collect event mappings
event_map =
add_event_mapping(%{}, assigns, "value-changed", :"on-value-changed")
assigns =
assigns
|> assign(:event_map, Jason.encode!(event_map))
|> assign(
:options,
Jason.encode!(%{
initialValue: assigns.value
})
)
~H"""
{render_slot(@inner_block)}
"""
end
@doc """
Individual radio button in a radio group.
"""
attr :id, :string, required: true
attr :value, :string, required: true
attr :disabled, :boolean, default: false
attr :class, :string, default: nil
attr :rest, :global
def radio_group_item(assigns) do
~H"""