defmodule Moon.Components.TextInput do @moduledoc false use Moon.StatelessComponent alias Moon.Components.InputGroup alias Moon.Components.TextInput.TextInputBasic alias Moon.Components.TextInput.TextInputInnerLabel alias Moon.Components.TextInput.TextInputPassword alias Moon.Components.TextInput.HintText alias Surface.Components.Context prop(id, :string) prop(field, :atom, from_context: {Surface.Components.Form.Field, :field}) prop(size, :string, values: ["md", "lg", "xl"], default: "md") prop(type, :string, values: [ "date", "month", "datetime-local", "email", "number", "password", "search", "tel", "text", "time", "url" ], default: "text" ) prop(placeholder, :string, default: " ") prop(is_error, :boolean) prop(background_color, :string, values: Moon.colors(), default: "bg-goku") prop(is_first, :boolean) prop(disabled, :boolean) prop(label, :string) prop(required, :boolean) prop(step, :string, default: "1") prop(class, :css_class) prop(min, :string) prop(max, :string) prop(readonly, :boolean) prop(value, :string) prop(focus, :event) prop(keydown, :event) prop(keyup, :event) prop(blur, :event) prop(show_password_text, :string, default: "Show") prop(use_error_tag, :boolean) slot(left_icon_slot) slot(right_icon_slot) slot(hint_text_slot) data(form, :form, from_context: {Surface.Components.Form, :form}) data(is_in_input_group, :boolean, from_context: {InputGroup, :is_in_input_group}) data(group_class_plain, :css_class, from_context: {InputGroup, :group_class_plain}) def render(assigns) do assigns = put_everything_to_context(assigns) internal_render = ~F""" <#slot {@hint_text_slot} /> """ ~F""" {#if @type == "password"} <:left_icon_slot> <#slot {@left_icon_slot} /> <:right_icon_slot> <#slot {@right_icon_slot} /> {internal_render} {#elseif @size == "xl"} <:left_icon_slot> <#slot {@left_icon_slot} /> <:right_icon_slot> <#slot {@right_icon_slot} /> {internal_render} {#else} <:left_icon_slot> <#slot {@left_icon_slot} /> <:right_icon_slot> <#slot {@right_icon_slot} /> {internal_render} {/if} """ end defp put_everything_to_context(assigns) do assigns |> Context.put( __MODULE__, assigns |> Map.delete(:left_icon_slot) |> Map.delete(:right_icon_slot) |> Map.delete(:hint_text_slot) ) |> Context.put(__MODULE__, is_error: has_error(assigns[:is_error], assigns[:form], assigns[:field]), has_left_icon: slot_assigned?(:left_icon_slot), has_right_icon: slot_assigned?(:right_icon_slot) ) end defp get_combined_class(is_in_input_group, field, group_class_plain) do if is_in_input_group && !field do group_class_plain end end defp has_error(is_error, form, field) do is_error || (field && form && Keyword.has_key?(form.errors, field)) end end