Current section

Files

Jump to
moon lib moon design form switch.ex
Raw

lib/moon/design/form/switch.ex

defmodule Moon.Design.Form.Switch do
@moduledoc false
use Moon.StatelessComponent
alias Moon.Design.Switch
alias Phoenix.LiveView.JS
import Phoenix.HTML.Form, only: [input_id: 2]
import Moon.Helpers.Form, only: [value_is_true: 2]
prop(field, :atom, from_context: {Surface.Components.Form.Field, :field})
prop(form, :form, from_context: {Surface.Components.Form, :form})
prop(label, :string)
prop(disabled, :boolean, default: false)
prop(readonly, :boolean, default: false)
prop(size, :string, values: ["2xs", "xs", "sm"], default: "sm")
prop(on_bg_color, :css_class, default: "bg-piccolo")
prop(off_bg_color, :css_class, default: "bg-beerus")
prop(class, :css_class)
prop(testid, :string)
prop(id, :string)
slot(on_icon)
slot(off_icon)
def render(assigns) do
~F"""
<div>
<Surface.Components.Form.Checkbox
{=@field}
{=@form}
class="hidden"
opts={disabled: @disabled, readonly: @readonly}
/>
<Switch
{=@size}
{=@on_bg_color}
{=@off_bg_color}
disabled={@disabled || @readonly}
{=@class}
{=@testid}
{=@id}
on_change={on_click(@form, @field)}
checked={value_is_true(@form, @field)}
>
<:on_icon>
<#slot {@on_icon} />
</:on_icon>
<:off_icon>
<#slot {@off_icon} />
</:off_icon>
</Switch>
{@label}
</div>
"""
end
defp on_click(form, field) do
JS.dispatch("moon2:update-switch",
detail: %{checked: !value_is_true(form, field)},
to: "##{input_id(form, field)}"
)
end
end