defmodule Moon.Design.Form.Radio do @moduledoc "Radio(group) component. For using both inside and outside the form" use Moon.StatelessComponent alias Moon.Design.Form.Field alias Surface.Components.Dynamic.Component import Moon.Helpers.MakeList @doc "Id to be given to the label tag" prop(id, :string) @doc "Data-testid attribute value" prop(testid, :string) @doc "Additional CSS classes for the label" prop(class, :css_class) @doc "Field name, surface-style" prop(field, :atom) @doc "Well, disabled" prop(disabled, :boolean) @doc "Value of the selected option, use it outside the form" prop(value, :any) @doc "On-change event, will be propagated to underlying options" prop(on_change, :event) @doc "List of options to be rendered when no option slot is given" prop(options, :keyword, default: []) @doc "Module for rendering options" prop(option_module, :atom, default: __MODULE__.Button) @doc "See Moon.Design.Field documentation" prop(hide_errors, :boolean) @doc "See Moon.Design.Field documentation" prop(hint, :string) @doc "List of options for Radiogroup " slot(option) @doc "Additional slot, here you able to add anything" slot(default) def render(assigns) do ~F""" {#if slot_assigned?(:option)} {#for option <- make_list(@option)} <#slot {option} context_put={ value: option.value, is_selected: "#{@value}" == "#{option.value}", on_click: @on_change, disabled: @disabled } /> {/for} {#else} {/if} <#slot /> """ end end