defmodule ClaperWeb.Component.Input do
@moduledoc """
Input component for forms
"""
use ClaperWeb, :view_component
use Gettext, backend: ClaperWeb.Gettext
def text(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:readonly, fn -> false end)
|> assign_new(:label, fn
%{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/
%{name: name} -> name
end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
|> assign_new(:minlength, fn -> nil end)
|> assign_new(:maxlength, fn -> nil end)
~H"""
{label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
{text_input(@form, @key,
required: @required,
readonly: @readonly,
autofocus: @autofocus,
placeholder: @placeholder,
autocomplete: @key,
value: @value,
minlength: @minlength,
maxlength: @maxlength,
class:
"#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
def textarea(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:readonly, fn -> false end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
~H"""
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
{text_input(@form, @key,
required: @required,
readonly: @readonly,
autofocus: @autofocus,
placeholder: @placeholder,
autocomplete: @key,
value: @value,
class:
"#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 focus:ring-2 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
def select(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
~H"""
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
{select(@form, @key, @array,
required: @required,
autofocus: @autofocus,
placeholder: @placeholder,
autocomplete: @key,
class:
"#{@fieldClass} outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
attr :form, Phoenix.HTML.Form, required: true
attr :key, :atom, required: true
attr :label, :string, default: nil
attr :labelClass, :string, default: nil
def toggle(assigns) do
~H"""
{@label &&
PhoenixHTMLHelpers.Form.label(@form, @key, @label,
class: ["block text-sm font-medium", @labelClass || "text-gray-700"]
)}
{PhoenixHTMLHelpers.Form.checkbox(@form, @key, class: "toggle")}
"""
end
def check(assigns) do
assigns =
assigns
|> assign_new(:disabled, fn -> false end)
|> assign_new(:shortcut, fn -> nil end)
~H"""
"""
end
def check_button(assigns) do
assigns =
assigns
|> assign_new(:disabled, fn -> false end)
|> assign_new(:shortcut, fn -> nil end)
|> assign_new(:checked, fn -> false end)
~H"""
"""
end
def checked(is_checked, key, js \\ %JS{})
def checked(false, key, js) do
js
|> JS.push("checked", value: %{key: key, value: true})
end
def checked(true, key, js) do
js
|> JS.remove_class("translate-x-6",
to: "#check-#{key} > span"
)
|> JS.add_class("translate-x-0",
to: "#check-#{key} > span"
)
|> JS.remove_class("opacity-0 ease-out duration-100",
to: "#check-#{key} > span > span"
)
|> JS.add_class("opacity-100 ease-in duration-200",
to: "#check-#{key} > span > span"
)
|> JS.remove_class("opacity-100 ease-in duration-200",
to: "#check-#{key} > span > span:nth-child(2)"
)
|> JS.add_class("opacity-0 ease-out duration-100",
to: "#check-#{key} > span > span:nth-child(2)"
)
|> JS.push("checked", value: %{key: key, value: false})
end
def code(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:readonly, fn -> false end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
~H"""
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}

{text_input(@form, @key,
required: @required,
readonly: @readonly,
placeholder: @placeholder,
autofocus: @autofocus,
autocomplete: @key,
minlength: 5,
maxlength: 10,
class:
"#{@fieldClass} read-only:opacity-50 outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 pr-3 pl-9 uppercase"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
def date(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:readonly, fn -> false end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
~H"""
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
{hidden_input(@form, @key)}
{text_input(@form, :local_date,
autofocus: @autofocus,
placeholder: @placeholder,
autocomplete: false,
class:
"#{@fieldClass} outline-hidden shadow-base focus:ring-primary-500 focus:border-primary-500 block w-full text-lg border-gray-300 rounded-md py-2 px-3 read-only:opacity-50"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
def email(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:readonly, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:label, fn
%{required: false, name: name} -> ~s/#{name} #{gettext("(optional)")}/
%{name: name} -> name
end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
|> assign_new(:value, fn -> input_value(assigns.form, assigns.key) end)
~H"""
{label(@form, @key, @label, class: "block text-sm font-medium #{@labelClass}")}
{email_input(@form, @key,
required: @required,
autofocus: @autofocus,
placeholder: @placeholder,
readonly: @readonly,
autocomplete: @key,
value: @value,
class:
"#{@fieldClass} read-only:opacity-50 shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-hidden rounded-md py-2 px-3",
"x-model": "input",
"x-ref": "input"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
def password(assigns) do
assigns =
assigns
|> assign_new(:required, fn -> false end)
|> assign_new(:autofocus, fn -> false end)
|> assign_new(:placeholder, fn -> false end)
|> assign_new(:labelClass, fn -> "text-gray-700" end)
|> assign_new(:fieldClass, fn -> "bg-white" end)
|> assign_new(:value, fn -> Map.get(assigns.form.data, assigns.key, "") end)
~H"""
{label(@form, @key, @name, class: "block text-sm font-medium #{@labelClass}")}
{password_input(@form, @key,
required: @required,
autofocus: @autofocus,
placeholder: @placeholder,
class:
"#{@fieldClass} shadow-base block w-full text-lg focus:ring-primary-500 focus:ring-2 outline-hidden rounded-md py-2 px-3",
"x-model": "input",
"x-ref": "input"
)}
<%= if Keyword.has_key?(@form.errors, @key) do %>
{error_tag(@form, @key)}
<% end %>
"""
end
end