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")}>
<.radio_group_item value="monthly" id="monthly"/> <.label for="monthly">Monthly
<.radio_group_item value="yearly" id="yearly"/> <.label for="yearly">Yearly
""" 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"""
""" end end